/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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
<<<<<<< Updated upstream
 *
 *     https://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
=======
 * 
 *     https://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 
>>>>>>> Stashed changes
 * limitations under the License.
 */

package org.apache.jdo.tck.pc.fieldtypes;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.Hashtable;

public class HashtableStringValueCollections {
  public int identifier;
  public Hashtable<Object, String> HashtableOfObject_String0;
  public Hashtable<Object, String> HashtableOfObject_String1;
  public Hashtable<Object, String> HashtableOfObject_String2;
  public Hashtable<Object, String> HashtableOfObject_String3;
  public Hashtable<Object, String> HashtableOfObject_String4;
  public Hashtable<Object, String> HashtableOfObject_String6;
  public Hashtable<Object, String> HashtableOfObject_String8;
  public Hashtable<SimpleClass, String> HashtableOfSimpleClass_String9;
  public Hashtable<SimpleClass, String> HashtableOfSimpleClass_String10;
  public Hashtable<SimpleClass, String> HashtableOfSimpleClass_String11;
  public Hashtable<SimpleClass, String> HashtableOfSimpleClass_String12;
  public Hashtable<SimpleClass, String> HashtableOfSimpleClass_String13;
  public Hashtable<SimpleClass, String> HashtableOfSimpleClass_String15;
  public Hashtable<SimpleClass, String> HashtableOfSimpleClass_String17;
  public Hashtable<SimpleInterface, String> HashtableOfSimpleInterface_String18;
  public Hashtable<SimpleInterface, String> HashtableOfSimpleInterface_String19;
  public Hashtable<SimpleInterface, String> HashtableOfSimpleInterface_String20;
  public Hashtable<SimpleInterface, String> HashtableOfSimpleInterface_String21;
  public Hashtable<SimpleInterface, String> HashtableOfSimpleInterface_String22;
  public Hashtable<SimpleInterface, String> HashtableOfSimpleInterface_String24;
  public Hashtable<SimpleInterface, String> HashtableOfSimpleInterface_String26;
  public Hashtable<String, String> HashtableOfString_String27;
  public Hashtable<String, String> HashtableOfString_String28;
  public Hashtable<String, String> HashtableOfString_String29;
  public Hashtable<String, String> HashtableOfString_String30;
  public Hashtable<String, String> HashtableOfString_String31;
  public Hashtable<String, String> HashtableOfString_String33;
  public Hashtable<String, String> HashtableOfString_String35;
  public Hashtable<Date, String> HashtableOfDate_String36;
  public Hashtable<Date, String> HashtableOfDate_String37;
  public Hashtable<Date, String> HashtableOfDate_String38;
  public Hashtable<Date, String> HashtableOfDate_String39;
  public Hashtable<Date, String> HashtableOfDate_String40;
  public Hashtable<Date, String> HashtableOfDate_String42;
  public Hashtable<Date, String> HashtableOfDate_String44;
  public Hashtable<BigDecimal, String> HashtableOfBigDecimal_String45;
  public Hashtable<BigDecimal, String> HashtableOfBigDecimal_String46;
  public Hashtable<BigDecimal, String> HashtableOfBigDecimal_String47;
  public Hashtable<BigDecimal, String> HashtableOfBigDecimal_String48;
  public Hashtable<BigDecimal, String> HashtableOfBigDecimal_String49;
  public Hashtable<BigDecimal, String> HashtableOfBigDecimal_String51;
  public Hashtable<BigDecimal, String> HashtableOfBigDecimal_String53;
  public Hashtable<BigInteger, String> HashtableOfBigInteger_String54;
  public Hashtable<BigInteger, String> HashtableOfBigInteger_String55;
  public Hashtable<BigInteger, String> HashtableOfBigInteger_String56;
  public Hashtable<BigInteger, String> HashtableOfBigInteger_String57;
  public Hashtable<BigInteger, String> HashtableOfBigInteger_String58;
  public Hashtable<BigInteger, String> HashtableOfBigInteger_String60;
  public Hashtable<BigInteger, String> HashtableOfBigInteger_String62;
  public Hashtable<Byte, String> HashtableOfByte_String63;
  public Hashtable<Byte, String> HashtableOfByte_String64;
  public Hashtable<Byte, String> HashtableOfByte_String65;
  public Hashtable<Byte, String> HashtableOfByte_String66;
  public Hashtable<Byte, String> HashtableOfByte_String67;
  public Hashtable<Byte, String> HashtableOfByte_String69;
  public Hashtable<Byte, String> HashtableOfByte_String71;
  public Hashtable<Double, String> HashtableOfDouble_String72;
  public Hashtable<Double, String> HashtableOfDouble_String73;
  public Hashtable<Double, String> HashtableOfDouble_String74;
  public Hashtable<Double, String> HashtableOfDouble_String75;
  public Hashtable<Double, String> HashtableOfDouble_String76;
  public Hashtable<Double, String> HashtableOfDouble_String78;
  public Hashtable<Double, String> HashtableOfDouble_String80;
  public Hashtable<Float, String> HashtableOfFloat_String81;
  public Hashtable<Float, String> HashtableOfFloat_String82;
  public Hashtable<Float, String> HashtableOfFloat_String83;
  public Hashtable<Float, String> HashtableOfFloat_String84;
  public Hashtable<Float, String> HashtableOfFloat_String85;
  public Hashtable<Float, String> HashtableOfFloat_String87;
  public Hashtable<Float, String> HashtableOfFloat_String89;
  public Hashtable<Integer, String> HashtableOfInteger_String90;
  public Hashtable<Integer, String> HashtableOfInteger_String91;
  public Hashtable<Integer, String> HashtableOfInteger_String92;
  public Hashtable<Integer, String> HashtableOfInteger_String93;
  public Hashtable<Integer, String> HashtableOfInteger_String94;
  public Hashtable<Integer, String> HashtableOfInteger_String96;
  public Hashtable<Integer, String> HashtableOfInteger_String98;
  public Hashtable<Long, String> HashtableOfLong_String99;
  public Hashtable<Long, String> HashtableOfLong_String100;
  public Hashtable<Long, String> HashtableOfLong_String101;
  public Hashtable<Long, String> HashtableOfLong_String102;
  public Hashtable<Long, String> HashtableOfLong_String103;
  public Hashtable<Long, String> HashtableOfLong_String105;
  public Hashtable<Long, String> HashtableOfLong_String107;
  public Hashtable<Short, String> HashtableOfShort_String108;
  public Hashtable<Short, String> HashtableOfShort_String109;
  public Hashtable<Short, String> HashtableOfShort_String110;
  public Hashtable<Short, String> HashtableOfShort_String111;
  public Hashtable<Short, String> HashtableOfShort_String112;
  public Hashtable<Short, String> HashtableOfShort_String114;
  public Hashtable<Short, String> HashtableOfShort_String116;

  public static final String[] fieldSpecs = {
    "public Hashtable HashtableOfObject_String0",
    "embedded-value=true public Hashtable HashtableOfObject_String1",
    "embedded-value=false public Hashtable HashtableOfObject_String2",
    "embedded-key=true  public Hashtable HashtableOfObject_String3",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfObject_String4",
    "embedded-key=false  public Hashtable HashtableOfObject_String6",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfObject_String8",
    "public Hashtable HashtableOfSimpleClass_String9",
    "embedded-value=true public Hashtable HashtableOfSimpleClass_String10",
    "embedded-value=false public Hashtable HashtableOfSimpleClass_String11",
    "embedded-key=true  public Hashtable HashtableOfSimpleClass_String12",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfSimpleClass_String13",
    "embedded-key=false  public Hashtable HashtableOfSimpleClass_String15",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfSimpleClass_String17",
    "public Hashtable HashtableOfSimpleInterface_String18",
    "embedded-value=true public Hashtable HashtableOfSimpleInterface_String19",
    "embedded-value=false public Hashtable HashtableOfSimpleInterface_String20",
    "embedded-key=true  public Hashtable HashtableOfSimpleInterface_String21",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfSimpleInterface_String22",
    "embedded-key=false  public Hashtable HashtableOfSimpleInterface_String24",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfSimpleInterface_String26",
    "public Hashtable HashtableOfString_String27",
    "embedded-value=true public Hashtable HashtableOfString_String28",
    "embedded-value=false public Hashtable HashtableOfString_String29",
    "embedded-key=true  public Hashtable HashtableOfString_String30",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfString_String31",
    "embedded-key=false  public Hashtable HashtableOfString_String33",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfString_String35",
    "public Hashtable HashtableOfDate_String36",
    "embedded-value=true public Hashtable HashtableOfDate_String37",
    "embedded-value=false public Hashtable HashtableOfDate_String38",
    "embedded-key=true  public Hashtable HashtableOfDate_String39",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfDate_String40",
    "embedded-key=false  public Hashtable HashtableOfDate_String42",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfDate_String44",
    "public Hashtable HashtableOfBigDecimal_String45",
    "embedded-value=true public Hashtable HashtableOfBigDecimal_String46",
    "embedded-value=false public Hashtable HashtableOfBigDecimal_String47",
    "embedded-key=true  public Hashtable HashtableOfBigDecimal_String48",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfBigDecimal_String49",
    "embedded-key=false  public Hashtable HashtableOfBigDecimal_String51",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfBigDecimal_String53",
    "public Hashtable HashtableOfBigInteger_String54",
    "embedded-value=true public Hashtable HashtableOfBigInteger_String55",
    "embedded-value=false public Hashtable HashtableOfBigInteger_String56",
    "embedded-key=true  public Hashtable HashtableOfBigInteger_String57",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfBigInteger_String58",
    "embedded-key=false  public Hashtable HashtableOfBigInteger_String60",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfBigInteger_String62",
    "public Hashtable HashtableOfByte_String63",
    "embedded-value=true public Hashtable HashtableOfByte_String64",
    "embedded-value=false public Hashtable HashtableOfByte_String65",
    "embedded-key=true  public Hashtable HashtableOfByte_String66",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfByte_String67",
    "embedded-key=false  public Hashtable HashtableOfByte_String69",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfByte_String71",
    "public Hashtable HashtableOfDouble_String72",
    "embedded-value=true public Hashtable HashtableOfDouble_String73",
    "embedded-value=false public Hashtable HashtableOfDouble_String74",
    "embedded-key=true  public Hashtable HashtableOfDouble_String75",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfDouble_String76",
    "embedded-key=false  public Hashtable HashtableOfDouble_String78",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfDouble_String80",
    "public Hashtable HashtableOfFloat_String81",
    "embedded-value=true public Hashtable HashtableOfFloat_String82",
    "embedded-value=false public Hashtable HashtableOfFloat_String83",
    "embedded-key=true  public Hashtable HashtableOfFloat_String84",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfFloat_String85",
    "embedded-key=false  public Hashtable HashtableOfFloat_String87",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfFloat_String89",
    "public Hashtable HashtableOfInteger_String90",
    "embedded-value=true public Hashtable HashtableOfInteger_String91",
    "embedded-value=false public Hashtable HashtableOfInteger_String92",
    "embedded-key=true  public Hashtable HashtableOfInteger_String93",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfInteger_String94",
    "embedded-key=false  public Hashtable HashtableOfInteger_String96",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfInteger_String98",
    "public Hashtable HashtableOfLong_String99",
    "embedded-value=true public Hashtable HashtableOfLong_String100",
    "embedded-value=false public Hashtable HashtableOfLong_String101",
    "embedded-key=true  public Hashtable HashtableOfLong_String102",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfLong_String103",
    "embedded-key=false  public Hashtable HashtableOfLong_String105",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfLong_String107",
    "public Hashtable HashtableOfShort_String108",
    "embedded-value=true public Hashtable HashtableOfShort_String109",
    "embedded-value=false public Hashtable HashtableOfShort_String110",
    "embedded-key=true  public Hashtable HashtableOfShort_String111",
    "embedded-key=true embedded-value=true public Hashtable HashtableOfShort_String112",
    "embedded-key=false  public Hashtable HashtableOfShort_String114",
    "embedded-key=false embedded-value=false public Hashtable HashtableOfShort_String116"
  };

  public int getLength() {
    return fieldSpecs.length;
  }

  public Hashtable<?, ?> get(int index) {
    switch (index) {
      case (0):
        return HashtableOfObject_String0;
      case (1):
        return HashtableOfObject_String1;
      case (2):
        return HashtableOfObject_String2;
      case (3):
        return HashtableOfObject_String3;
      case (4):
        return HashtableOfObject_String4;
      case (5):
        return HashtableOfObject_String6;
      case (6):
        return HashtableOfObject_String8;
      case (7):
        return HashtableOfSimpleClass_String9;
      case (8):
        return HashtableOfSimpleClass_String10;
      case (9):
        return HashtableOfSimpleClass_String11;
      case (10):
        return HashtableOfSimpleClass_String12;
      case (11):
        return HashtableOfSimpleClass_String13;
      case (12):
        return HashtableOfSimpleClass_String15;
      case (13):
        return HashtableOfSimpleClass_String17;
      case (14):
        return HashtableOfSimpleInterface_String18;
      case (15):
        return HashtableOfSimpleInterface_String19;
      case (16):
        return HashtableOfSimpleInterface_String20;
      case (17):
        return HashtableOfSimpleInterface_String21;
      case (18):
        return HashtableOfSimpleInterface_String22;
      case (19):
        return HashtableOfSimpleInterface_String24;
      case (20):
        return HashtableOfSimpleInterface_String26;
      case (21):
        return HashtableOfString_String27;
      case (22):
        return HashtableOfString_String28;
      case (23):
        return HashtableOfString_String29;
      case (24):
        return HashtableOfString_String30;
      case (25):
        return HashtableOfString_String31;
      case (26):
        return HashtableOfString_String33;
      case (27):
        return HashtableOfString_String35;
      case (28):
        return HashtableOfDate_String36;
      case (29):
        return HashtableOfDate_String37;
      case (30):
        return HashtableOfDate_String38;
      case (31):
        return HashtableOfDate_String39;
      case (32):
        return HashtableOfDate_String40;
      case (33):
        return HashtableOfDate_String42;
      case (34):
        return HashtableOfDate_String44;
      case (35):
        return HashtableOfBigDecimal_String45;
      case (36):
        return HashtableOfBigDecimal_String46;
      case (37):
        return HashtableOfBigDecimal_String47;
      case (38):
        return HashtableOfBigDecimal_String48;
      case (39):
        return HashtableOfBigDecimal_String49;
      case (40):
        return HashtableOfBigDecimal_String51;
      case (41):
        return HashtableOfBigDecimal_String53;
      case (42):
        return HashtableOfBigInteger_String54;
      case (43):
        return HashtableOfBigInteger_String55;
      case (44):
        return HashtableOfBigInteger_String56;
      case (45):
        return HashtableOfBigInteger_String57;
      case (46):
        return HashtableOfBigInteger_String58;
      case (47):
        return HashtableOfBigInteger_String60;
      case (48):
        return HashtableOfBigInteger_String62;
      case (49):
        return HashtableOfByte_String63;
      case (50):
        return HashtableOfByte_String64;
      case (51):
        return HashtableOfByte_String65;
      case (52):
        return HashtableOfByte_String66;
      case (53):
        return HashtableOfByte_String67;
      case (54):
        return HashtableOfByte_String69;
      case (55):
        return HashtableOfByte_String71;
      case (56):
        return HashtableOfDouble_String72;
      case (57):
        return HashtableOfDouble_String73;
      case (58):
        return HashtableOfDouble_String74;
      case (59):
        return HashtableOfDouble_String75;
      case (60):
        return HashtableOfDouble_String76;
      case (61):
        return HashtableOfDouble_String78;
      case (62):
        return HashtableOfDouble_String80;
      case (63):
        return HashtableOfFloat_String81;
      case (64):
        return HashtableOfFloat_String82;
      case (65):
        return HashtableOfFloat_String83;
      case (66):
        return HashtableOfFloat_String84;
      case (67):
        return HashtableOfFloat_String85;
      case (68):
        return HashtableOfFloat_String87;
      case (69):
        return HashtableOfFloat_String89;
      case (70):
        return HashtableOfInteger_String90;
      case (71):
        return HashtableOfInteger_String91;
      case (72):
        return HashtableOfInteger_String92;
      case (73):
        return HashtableOfInteger_String93;
      case (74):
        return HashtableOfInteger_String94;
      case (75):
        return HashtableOfInteger_String96;
      case (76):
        return HashtableOfInteger_String98;
      case (77):
        return HashtableOfLong_String99;
      case (78):
        return HashtableOfLong_String100;
      case (79):
        return HashtableOfLong_String101;
      case (80):
        return HashtableOfLong_String102;
      case (81):
        return HashtableOfLong_String103;
      case (82):
        return HashtableOfLong_String105;
      case (83):
        return HashtableOfLong_String107;
      case (84):
        return HashtableOfShort_String108;
      case (85):
        return HashtableOfShort_String109;
      case (86):
        return HashtableOfShort_String110;
      case (87):
        return HashtableOfShort_String111;
      case (88):
        return HashtableOfShort_String112;
      case (89):
        return HashtableOfShort_String114;
      case (90):
        return HashtableOfShort_String116;
      default:
        throw new IndexOutOfBoundsException("Bad index " + index);
    }
  }

  @SuppressWarnings("unchecked")
  public boolean set(int index, @SuppressWarnings("rawtypes") Hashtable value) {
    if (fieldSpecs[index].indexOf("final") != -1) return false;
    switch (index) {
      case (0):
        HashtableOfObject_String0 = value;
        break;
      case (1):
        HashtableOfObject_String1 = value;
        break;
      case (2):
        HashtableOfObject_String2 = value;
        break;
      case (3):
        HashtableOfObject_String3 = value;
        break;
      case (4):
        HashtableOfObject_String4 = value;
        break;
      case (5):
        HashtableOfObject_String6 = value;
        break;
      case (6):
        HashtableOfObject_String8 = value;
        break;
      case (7):
        HashtableOfSimpleClass_String9 = value;
        break;
      case (8):
        HashtableOfSimpleClass_String10 = value;
        break;
      case (9):
        HashtableOfSimpleClass_String11 = value;
        break;
      case (10):
        HashtableOfSimpleClass_String12 = value;
        break;
      case (11):
        HashtableOfSimpleClass_String13 = value;
        break;
      case (12):
        HashtableOfSimpleClass_String15 = value;
        break;
      case (13):
        HashtableOfSimpleClass_String17 = value;
        break;
      case (14):
        HashtableOfSimpleInterface_String18 = value;
        break;
      case (15):
        HashtableOfSimpleInterface_String19 = value;
        break;
      case (16):
        HashtableOfSimpleInterface_String20 = value;
        break;
      case (17):
        HashtableOfSimpleInterface_String21 = value;
        break;
      case (18):
        HashtableOfSimpleInterface_String22 = value;
        break;
      case (19):
        HashtableOfSimpleInterface_String24 = value;
        break;
      case (20):
        HashtableOfSimpleInterface_String26 = value;
        break;
      case (21):
        HashtableOfString_String27 = value;
        break;
      case (22):
        HashtableOfString_String28 = value;
        break;
      case (23):
        HashtableOfString_String29 = value;
        break;
      case (24):
        HashtableOfString_String30 = value;
        break;
      case (25):
        HashtableOfString_String31 = value;
        break;
      case (26):
        HashtableOfString_String33 = value;
        break;
      case (27):
        HashtableOfString_String35 = value;
        break;
      case (28):
        HashtableOfDate_String36 = value;
        break;
      case (29):
        HashtableOfDate_String37 = value;
        break;
      case (30):
        HashtableOfDate_String38 = value;
        break;
      case (31):
        HashtableOfDate_String39 = value;
        break;
      case (32):
        HashtableOfDate_String40 = value;
        break;
      case (33):
        HashtableOfDate_String42 = value;
        break;
      case (34):
        HashtableOfDate_String44 = value;
        break;
      case (35):
        HashtableOfBigDecimal_String45 = value;
        break;
      case (36):
        HashtableOfBigDecimal_String46 = value;
        break;
      case (37):
        HashtableOfBigDecimal_String47 = value;
        break;
      case (38):
        HashtableOfBigDecimal_String48 = value;
        break;
      case (39):
        HashtableOfBigDecimal_String49 = value;
        break;
      case (40):
        HashtableOfBigDecimal_String51 = value;
        break;
      case (41):
        HashtableOfBigDecimal_String53 = value;
        break;
      case (42):
        HashtableOfBigInteger_String54 = value;
        break;
      case (43):
        HashtableOfBigInteger_String55 = value;
        break;
      case (44):
        HashtableOfBigInteger_String56 = value;
        break;
      case (45):
        HashtableOfBigInteger_String57 = value;
        break;
      case (46):
        HashtableOfBigInteger_String58 = value;
        break;
      case (47):
        HashtableOfBigInteger_String60 = value;
        break;
      case (48):
        HashtableOfBigInteger_String62 = value;
        break;
      case (49):
        HashtableOfByte_String63 = value;
        break;
      case (50):
        HashtableOfByte_String64 = value;
        break;
      case (51):
        HashtableOfByte_String65 = value;
        break;
      case (52):
        HashtableOfByte_String66 = value;
        break;
      case (53):
        HashtableOfByte_String67 = value;
        break;
      case (54):
        HashtableOfByte_String69 = value;
        break;
      case (55):
        HashtableOfByte_String71 = value;
        break;
      case (56):
        HashtableOfDouble_String72 = value;
        break;
      case (57):
        HashtableOfDouble_String73 = value;
        break;
      case (58):
        HashtableOfDouble_String74 = value;
        break;
      case (59):
        HashtableOfDouble_String75 = value;
        break;
      case (60):
        HashtableOfDouble_String76 = value;
        break;
      case (61):
        HashtableOfDouble_String78 = value;
        break;
      case (62):
        HashtableOfDouble_String80 = value;
        break;
      case (63):
        HashtableOfFloat_String81 = value;
        break;
      case (64):
        HashtableOfFloat_String82 = value;
        break;
      case (65):
        HashtableOfFloat_String83 = value;
        break;
      case (66):
        HashtableOfFloat_String84 = value;
        break;
      case (67):
        HashtableOfFloat_String85 = value;
        break;
      case (68):
        HashtableOfFloat_String87 = value;
        break;
      case (69):
        HashtableOfFloat_String89 = value;
        break;
      case (70):
        HashtableOfInteger_String90 = value;
        break;
      case (71):
        HashtableOfInteger_String91 = value;
        break;
      case (72):
        HashtableOfInteger_String92 = value;
        break;
      case (73):
        HashtableOfInteger_String93 = value;
        break;
      case (74):
        HashtableOfInteger_String94 = value;
        break;
      case (75):
        HashtableOfInteger_String96 = value;
        break;
      case (76):
        HashtableOfInteger_String98 = value;
        break;
      case (77):
        HashtableOfLong_String99 = value;
        break;
      case (78):
        HashtableOfLong_String100 = value;
        break;
      case (79):
        HashtableOfLong_String101 = value;
        break;
      case (80):
        HashtableOfLong_String102 = value;
        break;
      case (81):
        HashtableOfLong_String103 = value;
        break;
      case (82):
        HashtableOfLong_String105 = value;
        break;
      case (83):
        HashtableOfLong_String107 = value;
        break;
      case (84):
        HashtableOfShort_String108 = value;
        break;
      case (85):
        HashtableOfShort_String109 = value;
        break;
      case (86):
        HashtableOfShort_String110 = value;
        break;
      case (87):
        HashtableOfShort_String111 = value;
        break;
      case (88):
        HashtableOfShort_String112 = value;
        break;
      case (89):
        HashtableOfShort_String114 = value;
        break;
      case (90):
        HashtableOfShort_String116 = value;
        break;
      default:
        throw new IndexOutOfBoundsException("Bad index " + index);
    }
    return true;
  }

  public static class Oid implements Serializable {

    private static final long serialVersionUID = 1L;

    public int identifier;

    public Oid() {}

    public Oid(String s) {
      identifier = Integer.parseInt(justTheId(s));
    }

    public String toString() {
      return this.getClass().getName() + ": " + identifier;
    }

    public int hashCode() {
      return identifier;
    }

    public boolean equals(Object other) {
      if (other != null && (other instanceof Oid)) {
        Oid k = (Oid) other;
        return k.identifier == this.identifier;
      }
      return false;
    }

    protected static String justTheId(String str) {
      return str.substring(str.indexOf(':') + 1);
    }
  }
}
