// Copyright (C) 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html

/** Copyright (C) 2007-2016, International Business Machines Corporation and Others. All Rights Reserved. **/

/* NOTE: this file is AUTOMATICALLY GENERATED by gentest.
 * See: {ICU4C}/source/data/icu4j-readme.txt for more information. 
 **/

package com.ibm.icu.dev.test.util;

public class DebugUtilitiesData extends Object {
    public static final String ICU4C_VERSION="69.1";
    public static final int UDebugEnumType = 0;
    public static final int UCalendarDateFields = 1;
    public static final int UCalendarMonths = 2;
    public static final int UDateFormatStyle = 3;
    public static final int UAcceptResult = 4;
    public static final int UColAttributeValue = 5;
    public static final String [] TYPES = { 
        "UDebugEnumType", /* 0 */
        "UCalendarDateFields", /* 1 */
        "UCalendarMonths", /* 2 */
        "UDateFormatStyle", /* 3 */
        "UAcceptResult", /* 4 */
        "UColAttributeValue", /* 5 */
    };

    public static final String [][] NAMES = { 
        /* UDebugEnumType, 0 */
        { 
           "UDebugEnumType", /* 0 */ 
           "UCalendarDateFields", /* 1 */ 
           "UCalendarMonths", /* 2 */ 
           "UDateFormatStyle", /* 3 */ 
           "UAcceptResult", /* 4 */ 
           "UColAttributeValue", /* 5 */ 
        },
        /* UCalendarDateFields, 1 */
        { 
           "ERA", /* 0 */ 
           "YEAR", /* 1 */ 
           "MONTH", /* 2 */ 
           "WEEK_OF_YEAR", /* 3 */ 
           "WEEK_OF_MONTH", /* 4 */ 
           "DATE", /* 5 */ 
           "DAY_OF_YEAR", /* 6 */ 
           "DAY_OF_WEEK", /* 7 */ 
           "DAY_OF_WEEK_IN_MONTH", /* 8 */ 
           "AM_PM", /* 9 */ 
           "HOUR", /* 10 */ 
           "HOUR_OF_DAY", /* 11 */ 
           "MINUTE", /* 12 */ 
           "SECOND", /* 13 */ 
           "MILLISECOND", /* 14 */ 
           "ZONE_OFFSET", /* 15 */ 
           "DST_OFFSET", /* 16 */ 
           "YEAR_WOY", /* 17 */ 
           "DOW_LOCAL", /* 18 */ 
           "EXTENDED_YEAR", /* 19 */ 
           "JULIAN_DAY", /* 20 */ 
           "MILLISECONDS_IN_DAY", /* 21 */ 
           "IS_LEAP_MONTH", /* 22 */ 
        },
        /* UCalendarMonths, 2 */
        { 
           "JANUARY", /* 0 */ 
           "FEBRUARY", /* 1 */ 
           "MARCH", /* 2 */ 
           "APRIL", /* 3 */ 
           "MAY", /* 4 */ 
           "JUNE", /* 5 */ 
           "JULY", /* 6 */ 
           "AUGUST", /* 7 */ 
           "SEPTEMBER", /* 8 */ 
           "OCTOBER", /* 9 */ 
           "NOVEMBER", /* 10 */ 
           "DECEMBER", /* 11 */ 
           "UNDECIMBER", /* 12 */ 
        },
        /* UDateFormatStyle, 3 */
        { 
           "FULL", /* 0 */ 
           "LONG", /* 1 */ 
           "MEDIUM", /* 2 */ 
           "SHORT", /* 3 */ 
        },
        /* UAcceptResult, 4 */
        { 
           "FAILED", /* 0 */ 
           "VALID", /* 1 */ 
           "FALLBACK", /* 2 */ 
        },
        /* UColAttributeValue, 5 */
        { 
           "PRIMARY", /* 0 */ 
           "SECONDARY", /* 1 */ 
           "TERTIARY", /* 2 */ 
           "QUATERNARY", /* 3 */ 
           "IDENTICAL", /* 4 */ 
           "OFF", /* 5 */ 
           "ON", /* 6 */ 
           "SHIFTED", /* 7 */ 
           "NON_IGNORABLE", /* 8 */ 
           "LOWER_FIRST", /* 9 */ 
           "UPPER_FIRST", /* 10 */ 
        },
    };

    public static final int [][] VALUES = { 
        /* UDebugEnumType, 0 */
        { 
           0, /* UDebugEnumType */
           1, /* UCalendarDateFields */
           2, /* UCalendarMonths */
           3, /* UDateFormatStyle */
           4, /* UAcceptResult */
           5, /* UColAttributeValue */
        },
        /* UCalendarDateFields, 1 */
        { 
           com.ibm.icu.util.Calendar.ERA, /* 0 */
           com.ibm.icu.util.Calendar.YEAR, /* 1 */
           com.ibm.icu.util.Calendar.MONTH, /* 2 */
           com.ibm.icu.util.Calendar.WEEK_OF_YEAR, /* 3 */
           com.ibm.icu.util.Calendar.WEEK_OF_MONTH, /* 4 */
           com.ibm.icu.util.Calendar.DATE, /* 5 */
           com.ibm.icu.util.Calendar.DAY_OF_YEAR, /* 6 */
           com.ibm.icu.util.Calendar.DAY_OF_WEEK, /* 7 */
           com.ibm.icu.util.Calendar.DAY_OF_WEEK_IN_MONTH, /* 8 */
           com.ibm.icu.util.Calendar.AM_PM, /* 9 */
           com.ibm.icu.util.Calendar.HOUR, /* 10 */
           com.ibm.icu.util.Calendar.HOUR_OF_DAY, /* 11 */
           com.ibm.icu.util.Calendar.MINUTE, /* 12 */
           com.ibm.icu.util.Calendar.SECOND, /* 13 */
           com.ibm.icu.util.Calendar.MILLISECOND, /* 14 */
           com.ibm.icu.util.Calendar.ZONE_OFFSET, /* 15 */
           com.ibm.icu.util.Calendar.DST_OFFSET, /* 16 */
           com.ibm.icu.util.Calendar.YEAR_WOY, /* 17 */
           com.ibm.icu.util.Calendar.DOW_LOCAL, /* 18 */
           com.ibm.icu.util.Calendar.EXTENDED_YEAR, /* 19 */
           com.ibm.icu.util.Calendar.JULIAN_DAY, /* 20 */
           com.ibm.icu.util.Calendar.MILLISECONDS_IN_DAY, /* 21 */
           com.ibm.icu.util.ChineseCalendar.IS_LEAP_MONTH, /* 22 */
        },
        /* UCalendarMonths, 2 */
        { 
           com.ibm.icu.util.Calendar.JANUARY, /* 0 */
           com.ibm.icu.util.Calendar.FEBRUARY, /* 1 */
           com.ibm.icu.util.Calendar.MARCH, /* 2 */
           com.ibm.icu.util.Calendar.APRIL, /* 3 */
           com.ibm.icu.util.Calendar.MAY, /* 4 */
           com.ibm.icu.util.Calendar.JUNE, /* 5 */
           com.ibm.icu.util.Calendar.JULY, /* 6 */
           com.ibm.icu.util.Calendar.AUGUST, /* 7 */
           com.ibm.icu.util.Calendar.SEPTEMBER, /* 8 */
           com.ibm.icu.util.Calendar.OCTOBER, /* 9 */
           com.ibm.icu.util.Calendar.NOVEMBER, /* 10 */
           com.ibm.icu.util.Calendar.DECEMBER, /* 11 */
           com.ibm.icu.util.Calendar.UNDECIMBER, /* 12 */
        },
        /* UDateFormatStyle, 3 */
        { 
           0, /* FULL */
           1, /* LONG */
           2, /* MEDIUM */
           3, /* SHORT */
        },
        /* UAcceptResult, 4 */
        { 
           0, /* FAILED */
           1, /* VALID */
           2, /* FALLBACK */
        },
        /* UColAttributeValue, 5 */
        { 
           0, /* PRIMARY */
           1, /* SECONDARY */
           2, /* TERTIARY */
           3, /* QUATERNARY */
           4, /* IDENTICAL */
           5, /* OFF */
           6, /* ON */
           7, /* SHIFTED */
           8, /* NON_IGNORABLE */
           9, /* LOWER_FIRST */
           10, /* UPPER_FIRST */
        },
    };

}
