/*
 * Copyright 2012 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;

import com.google.gwt.core.client.JavaScriptObject;

// DO NOT EDIT - GENERATED FROM CLDR DATA

/**
 * Localized names for the "sr_Latn_XK" locale.
 */
public class LocalizedNamesImpl_sr_Latn_XK extends LocalizedNamesImpl_sr_Latn {

  @Override
  public String[] loadSortedRegionCodes() {
    return new String[] {
        "AL",
        "DZ",
        "VI",
        "AS",
        "AD",
        "AO",
        "AI",
        "AQ",
        "AG",
        "AR",
        "AW",
        "AU",
        "AT",
        "AF",
        "AZ",
        "BS",
        "BH",
        "BD",
        "BB",
        "BE",
        "BZ",
        "BY",
        "BJ",
        "BM",
        "BW",
        "BO",
        "BA",
        "CX",
        "BR",
        "VG",
        "IO",
        "BN",
        "BG",
        "BF",
        "BI",
        "BT",
        "TD",
        "CF",
        "CZ",
        "CL",
        "ME",
        "DK",
        "DG",
        "DM",
        "DO",
        "JE",
        "DJ",
        "EG",
        "EC",
        "GQ",
        "ER",
        "EE",
        "ET",
        "EU",
        "EZ",
        "FO",
        "FJ",
        "PH",
        "FI",
        "FK",
        "FR",
        "GF",
        "PF",
        "TF",
        "GA",
        "GM",
        "GH",
        "GG",
        "GI",
        "GR",
        "GD",
        "GL",
        "GE",
        "GU",
        "GP",
        "GY",
        "GT",
        "GN",
        "GW",
        "HT",
        "NL",
        "HN",
        "HR",
        "IN",
        "ID",
        "IQ",
        "IR",
        "IE",
        "IS",
        "IT",
        "IL",
        "JM",
        "JP",
        "YE",
        "AM",
        "JO",
        "GS",
        "KR",
        "SS",
        "ZA",
        "CV",
        "KY",
        "KH",
        "CM",
        "CA",
        "IC",
        "BQ",
        "QA",
        "KZ",
        "KE",
        "CN",
        "CY",
        "KG",
        "KI",
        "CC",
        "CO",
        "KM",
        "CG",
        "CD",
        "XK",
        "CR",
        "CU",
        "CK",
        "CW",
        "KW",
        "LA",
        "LS",
        "LV",
        "LB",
        "LR",
        "LY",
        "LI",
        "LT",
        "LU",
        "MG",
        "YT",
        "MK",
        "MW",
        "MV",
        "MY",
        "ML",
        "MT",
        "UM",
        "MA",
        "MH",
        "MQ",
        "MU",
        "MR",
        "HU",
        "MX",
        "MM",
        "FM",
        "MD",
        "MC",
        "MN",
        "MS",
        "MZ",
        "NA",
        "NR",
        "DE",
        "NP",
        "NE",
        "NG",
        "NI",
        "NU",
        "NO",
        "NC",
        "NZ",
        "CI",
        "QO",
        "AX",
        "OM",
        "TC",
        "AC",
        "BV",
        "HM",
        "CP",
        "IM",
        "NF",
        "PK",
        "PW",
        "PS",
        "PA",
        "PG",
        "PY",
        "PE",
        "PN",
        "PL",
        "PR",
        "PT",
        "RE",
        "RW",
        "RO",
        "RU",
        "SV",
        "WS",
        "SM",
        "ST",
        "HK",
        "MO",
        "SA",
        "SC",
        "SN",
        "EA",
        "KP",
        "MP",
        "SL",
        "SG",
        "SY",
        "US",
        "SK",
        "SI",
        "SB",
        "SO",
        "ES",
        "RS",
        "LK",
        "SD",
        "SR",
        "CH",
        "SJ",
        "SZ",
        "SE",
        "SH",
        "LC",
        "BL",
        "KN",
        "MF",
        "SX",
        "PM",
        "VC",
        "TJ",
        "TH",
        "TW",
        "TZ",
        "TL",
        "TG",
        "TK",
        "TO",
        "TT",
        "TA",
        "TN",
        "TM",
        "TR",
        "TV",
        "UG",
        "UN",
        "AE",
        "GB",
        "UA",
        "UY",
        "UZ",
        "WF",
        "VU",
        "VA",
        "VE",
        "VN",
        "XA",
        "XB",
        "ZM",
        "EH",
        "ZW",
    };
  }

  @Override
  protected void loadNameMapJava() {
    super.loadNameMapJava();
    namesMap.put("CG", "Kongo");
    namesMap.put("CV", "Kabo Verde");
    namesMap.put("CZ", "Češka Republika");
    namesMap.put("HK", "SAR Hongkong");
    namesMap.put("KN", "Sveti Kits i Nevis");
    namesMap.put("MO", "SAR Makao");
    namesMap.put("PM", "Sveti Pjer i Mikelon");
    namesMap.put("RE", "Reunion");
    namesMap.put("UM", "Manja udaljena ostrva SAD");
    namesMap.put("VC", "Sveti Vinsent i Grenadini");
  }

  @Override
  protected JavaScriptObject loadNameMapNative() {
    return overrideMap(super.loadNameMapNative(), loadMyNameMap());
  }

  private native JavaScriptObject loadMyNameMap() /*-{
    return {
        "CG": "Kongo",
        "CV": "Kabo Verde",
        "CZ": "Češka Republika",
        "HK": "SAR Hongkong",
        "KN": "Sveti Kits i Nevis",
        "MO": "SAR Makao",
        "PM": "Sveti Pjer i Mikelon",
        "RE": "Reunion",
        "UM": "Manja udaljena ostrva SAD",
        "VC": "Sveti Vinsent i Grenadini"
    };
  }-*/;
}
