/*
 * Copyright 2010 Google Inc.
 * 
 * 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.
 */
package com.google.gwt.i18n.client.impl.cldr;

// DO NOT EDIT - GENERATED FROM CLDR DATA

/**
 * Implementation of DateTimeFormatInfo for locale "en_Dsrt".
 */
public class DateTimeFormatInfoImpl_en_Dsrt extends DateTimeFormatInfoImpl_en {

  @Override
  public String[] ampms() {
    return new String[] { 
        "𐐈𐐣",
        "𐐑𐐣"
    };
  }

  @Override
  public String[] erasFull() {
    return new String[] { 
        "𐐒𐐲𐑁𐐬𐑉 𐐗𐑉𐐴𐑅𐐻",
        "𐐈𐑌𐐬 𐐔𐐱𐑋𐐮𐑌𐐨"
    };
  }

  @Override
  public String[] erasShort() {
    return new String[] { 
        "𐐒𐐗",
        "𐐈𐐔"
    };
  }

  @Override
  public int firstDayOfTheWeek() {
    return 1;
  }

  @Override
  public String[] monthsFull() {
    return new String[] { 
        "𐐖𐐰𐑌𐐷𐐭𐐯𐑉𐐨",
        "𐐙𐐯𐐺𐑉𐐭𐐯𐑉𐐨",
        "𐐣𐐪𐑉𐐽",
        "𐐁𐐹𐑉𐐮𐑊",
        "𐐣𐐩",
        "𐐖𐐭𐑌",
        "𐐖𐐭𐑊𐐴",
        "𐐂𐑀𐐲𐑅𐐻",
        "𐐝𐐯𐐹𐐻𐐯𐑋𐐺𐐲𐑉",
        "𐐉𐐿𐐻𐐬𐐺𐐲𐑉",
        "𐐤𐐬𐑂𐐯𐑋𐐺𐐲𐑉",
        "𐐔𐐨𐑅𐐯𐑋𐐺𐐲𐑉"
    };
  }

  @Override
  public String[] monthsFullStandalone() {
    return monthsFull();
  }

  @Override
  public String[] monthsNarrow() {
    return new String[] { 
        "𐐖",
        "𐐙",
        "𐐣",
        "𐐁",
        "𐐣",
        "𐐖",
        "𐐖",
        "𐐂",
        "𐐝",
        "𐐉",
        "𐐤",
        "𐐔"
    };
  }

  @Override
  public String[] monthsNarrowStandalone() {
    return monthsNarrow();
  }

  @Override
  public String[] monthsShort() {
    return new String[] { 
        "𐐖𐐰𐑌",
        "𐐙𐐯𐐺",
        "𐐣𐐪𐑉",
        "𐐁𐐹𐑉",
        "𐐣𐐩",
        "𐐖𐐭𐑌",
        "𐐖𐐭𐑊",
        "𐐂𐑀",
        "𐐝𐐯𐐹",
        "𐐉𐐿𐐻",
        "𐐤𐐬𐑂",
        "𐐔𐐨𐑅"
    };
  }

  @Override
  public String[] monthsShortStandalone() {
    return monthsShort();
  }

  @Override
  public String[] quartersFull() {
    return new String[] { 
        "1𐑅𐐻 𐐿𐐶𐐪𐑉𐐻𐐲𐑉",
        "2𐑌𐐼 𐐿𐐶𐐪𐑉𐐻𐐲𐑉",
        "3𐑉𐐼 𐐿𐐶𐐪𐑉𐐻𐐲𐑉",
        "4𐑉𐑃 𐐿𐐶𐐪𐑉𐐻𐐲𐑉"
    };
  }

  @Override
  public String[] quartersShort() {
    return new String[] { 
        "𐐗1",
        "𐐗2",
        "𐐗3",
        "𐐗4"
    };
  }

  @Override
  public String[] weekdaysFull() {
    return new String[] { 
        "𐐝𐐲𐑌𐐼𐐩",
        "𐐣𐐲𐑌𐐼𐐩",
        "𐐓𐐭𐑆𐐼𐐩",
        "𐐎𐐯𐑌𐑆𐐼𐐩",
        "𐐛𐐲𐑉𐑆𐐼𐐩",
        "𐐙𐑉𐐴𐐼𐐩",
        "𐐝𐐰𐐻𐐲𐑉𐐼𐐩"
    };
  }

  @Override
  public String[] weekdaysFullStandalone() {
    return weekdaysFull();
  }

  @Override
  public String[] weekdaysNarrow() {
    return new String[] { 
        "𐐝",
        "𐐣",
        "𐐓",
        "𐐎",
        "𐐛",
        "𐐙",
        "𐐝"
    };
  }

  @Override
  public String[] weekdaysNarrowStandalone() {
    return weekdaysNarrow();
  }

  @Override
  public String[] weekdaysShort() {
    return new String[] { 
        "𐐝𐐲𐑌",
        "𐐣𐐲𐑌",
        "𐐓𐐭𐑆",
        "𐐎𐐯𐑌",
        "𐐛𐐲𐑉",
        "𐐙𐑉𐐴",
        "𐐝𐐰𐐻"
    };
  }

  @Override
  public String[] weekdaysShortStandalone() {
    return weekdaysShort();
  }
}
