1 /*
   2  * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package sun.awt;
  26 
  27 import java.util.Collections;
  28 import java.util.HashMap;
  29 import java.util.HashSet;
  30 import java.awt.event.KeyEvent;
  31 
  32 public class ExtendedKeyCodes {
  33     /**
  34      * ATTN: These are the readonly hashes with load factor == 1;
  35      * adding a value, please set the inital capacity to exact number of items
  36      * or higher.
  37      */
  38      // Keycodes declared in KeyEvent.java with corresponding Unicode values.
  39      private static final HashMap<Integer, Integer>  regularKeyCodesMap =
  40                                           new HashMap<Integer,Integer>(98, 1.0f);
  41 
  42      // Keycodes derived from Unicode values. Here should be collected codes
  43      // for characters appearing on the primary layer of at least one
  44      // known keyboard layout. For instance, sterling sign is on the primary layer
  45      // of the Mac Italian layout.
  46      private static final HashSet<Integer> extendedKeyCodesSet =
  47                                                   new HashSet<Integer>(501, 1.0f);
  48      public static final int getExtendedKeyCodeForChar( int c ) {
  49          int uc = Character.toUpperCase( c );
  50          int lc = Character.toLowerCase( c );
  51          if (regularKeyCodesMap.containsKey( c )) {
  52              if(regularKeyCodesMap.containsKey(uc)) {
  53                  return regularKeyCodesMap.get( uc );
  54              }
  55              return regularKeyCodesMap.get( c );
  56          }
  57          uc += 0x01000000;
  58          lc += 0x01000000;
  59          if (extendedKeyCodesSet.contains( uc )) {
  60              return uc;
  61          }else if (extendedKeyCodesSet.contains( lc )) {
  62              return lc;
  63          }
  64          return KeyEvent.VK_UNDEFINED;
  65      }
  66      static {
  67          regularKeyCodesMap.put(0x08, KeyEvent.VK_BACK_SPACE);
  68          regularKeyCodesMap.put(0x09, KeyEvent.VK_TAB);
  69          regularKeyCodesMap.put(0x0a, KeyEvent.VK_ENTER);
  70          regularKeyCodesMap.put(0x1B, KeyEvent.VK_ESCAPE);
  71          regularKeyCodesMap.put(0x20AC, KeyEvent.VK_EURO_SIGN);
  72          regularKeyCodesMap.put(0x20, KeyEvent.VK_SPACE);
  73          regularKeyCodesMap.put(0x21, KeyEvent.VK_EXCLAMATION_MARK);
  74          regularKeyCodesMap.put(0x22, KeyEvent.VK_QUOTEDBL);
  75          regularKeyCodesMap.put(0x23, KeyEvent.VK_NUMBER_SIGN);
  76          regularKeyCodesMap.put(0x24, KeyEvent.VK_DOLLAR);
  77          regularKeyCodesMap.put(0x26, KeyEvent.VK_AMPERSAND);
  78          regularKeyCodesMap.put(0x27, KeyEvent.VK_QUOTE);
  79          regularKeyCodesMap.put(0x28, KeyEvent.VK_LEFT_PARENTHESIS);
  80          regularKeyCodesMap.put(0x29, KeyEvent.VK_RIGHT_PARENTHESIS);
  81          regularKeyCodesMap.put(0x2A, KeyEvent.VK_ASTERISK);
  82          regularKeyCodesMap.put(0x2B, KeyEvent.VK_PLUS);
  83          regularKeyCodesMap.put(0x2C, KeyEvent.VK_COMMA);
  84          regularKeyCodesMap.put(0x2D, KeyEvent.VK_MINUS);
  85          regularKeyCodesMap.put(0x2E, KeyEvent.VK_PERIOD);
  86          regularKeyCodesMap.put(0x2F, KeyEvent.VK_SLASH);
  87          regularKeyCodesMap.put(0x30, KeyEvent.VK_0);
  88          regularKeyCodesMap.put(0x31, KeyEvent.VK_1);
  89          regularKeyCodesMap.put(0x32, KeyEvent.VK_2);
  90          regularKeyCodesMap.put(0x33, KeyEvent.VK_3);
  91          regularKeyCodesMap.put(0x34, KeyEvent.VK_4);
  92          regularKeyCodesMap.put(0x35, KeyEvent.VK_5);
  93          regularKeyCodesMap.put(0x36, KeyEvent.VK_6);
  94          regularKeyCodesMap.put(0x37, KeyEvent.VK_7);
  95          regularKeyCodesMap.put(0x38, KeyEvent.VK_8);
  96          regularKeyCodesMap.put(0x39, KeyEvent.VK_9);
  97          regularKeyCodesMap.put(0x3A, KeyEvent.VK_COLON);
  98          regularKeyCodesMap.put(0x3B, KeyEvent.VK_SEMICOLON);
  99          regularKeyCodesMap.put(0x3C, KeyEvent.VK_LESS);
 100          regularKeyCodesMap.put(0x3D, KeyEvent.VK_EQUALS);
 101          regularKeyCodesMap.put(0x3E, KeyEvent.VK_GREATER);
 102          regularKeyCodesMap.put(0x40, KeyEvent.VK_AT);
 103          regularKeyCodesMap.put(0x41, KeyEvent.VK_A);
 104          regularKeyCodesMap.put(0x42, KeyEvent.VK_B);
 105          regularKeyCodesMap.put(0x43, KeyEvent.VK_C);
 106          regularKeyCodesMap.put(0x44, KeyEvent.VK_D);
 107          regularKeyCodesMap.put(0x45, KeyEvent.VK_E);
 108          regularKeyCodesMap.put(0x46, KeyEvent.VK_F);
 109          regularKeyCodesMap.put(0x47, KeyEvent.VK_G);
 110          regularKeyCodesMap.put(0x48, KeyEvent.VK_H);
 111          regularKeyCodesMap.put(0x49, KeyEvent.VK_I);
 112          regularKeyCodesMap.put(0x4A, KeyEvent.VK_J);
 113          regularKeyCodesMap.put(0x4B, KeyEvent.VK_K);
 114          regularKeyCodesMap.put(0x4C, KeyEvent.VK_L);
 115          regularKeyCodesMap.put(0x4D, KeyEvent.VK_M);
 116          regularKeyCodesMap.put(0x4E, KeyEvent.VK_N);
 117          regularKeyCodesMap.put(0x4F, KeyEvent.VK_O);
 118          regularKeyCodesMap.put(0x50, KeyEvent.VK_P);
 119          regularKeyCodesMap.put(0x51, KeyEvent.VK_Q);
 120          regularKeyCodesMap.put(0x52, KeyEvent.VK_R);
 121          regularKeyCodesMap.put(0x53, KeyEvent.VK_S);
 122          regularKeyCodesMap.put(0x54, KeyEvent.VK_T);
 123          regularKeyCodesMap.put(0x55, KeyEvent.VK_U);
 124          regularKeyCodesMap.put(0x56, KeyEvent.VK_V);
 125          regularKeyCodesMap.put(0x57, KeyEvent.VK_W);
 126          regularKeyCodesMap.put(0x58, KeyEvent.VK_X);
 127          regularKeyCodesMap.put(0x59, KeyEvent.VK_Y);
 128          regularKeyCodesMap.put(0x5A, KeyEvent.VK_Z);
 129          regularKeyCodesMap.put(0x5B, KeyEvent.VK_OPEN_BRACKET);
 130          regularKeyCodesMap.put(0x5C, KeyEvent.VK_BACK_SLASH);
 131          regularKeyCodesMap.put(0x5D, KeyEvent.VK_CLOSE_BRACKET);
 132          regularKeyCodesMap.put(0x5E, KeyEvent.VK_CIRCUMFLEX);
 133          regularKeyCodesMap.put(0x5F, KeyEvent.VK_UNDERSCORE);
 134          regularKeyCodesMap.put(0x60, KeyEvent.VK_BACK_QUOTE);
 135          regularKeyCodesMap.put(0x61, KeyEvent.VK_A);
 136          regularKeyCodesMap.put(0x62, KeyEvent.VK_B);
 137          regularKeyCodesMap.put(0x63, KeyEvent.VK_C);
 138          regularKeyCodesMap.put(0x64, KeyEvent.VK_D);
 139          regularKeyCodesMap.put(0x65, KeyEvent.VK_E);
 140          regularKeyCodesMap.put(0x66, KeyEvent.VK_F);
 141          regularKeyCodesMap.put(0x67, KeyEvent.VK_G);
 142          regularKeyCodesMap.put(0x68, KeyEvent.VK_H);
 143          regularKeyCodesMap.put(0x69, KeyEvent.VK_I);
 144          regularKeyCodesMap.put(0x6A, KeyEvent.VK_J);
 145          regularKeyCodesMap.put(0x6B, KeyEvent.VK_K);
 146          regularKeyCodesMap.put(0x6C, KeyEvent.VK_L);
 147          regularKeyCodesMap.put(0x6D, KeyEvent.VK_M);
 148          regularKeyCodesMap.put(0x6E, KeyEvent.VK_N);
 149          regularKeyCodesMap.put(0x6F, KeyEvent.VK_O);
 150          regularKeyCodesMap.put(0x70, KeyEvent.VK_P);
 151          regularKeyCodesMap.put(0x71, KeyEvent.VK_Q);
 152          regularKeyCodesMap.put(0x72, KeyEvent.VK_R);
 153          regularKeyCodesMap.put(0x73, KeyEvent.VK_S);
 154          regularKeyCodesMap.put(0x74, KeyEvent.VK_T);
 155          regularKeyCodesMap.put(0x75, KeyEvent.VK_U);
 156          regularKeyCodesMap.put(0x76, KeyEvent.VK_V);
 157          regularKeyCodesMap.put(0x77, KeyEvent.VK_W);
 158          regularKeyCodesMap.put(0x78, KeyEvent.VK_X);
 159          regularKeyCodesMap.put(0x79, KeyEvent.VK_Y);
 160          regularKeyCodesMap.put(0x7A, KeyEvent.VK_Z);
 161          regularKeyCodesMap.put(0x7B, KeyEvent.VK_BRACELEFT);
 162          regularKeyCodesMap.put(0x7D, KeyEvent.VK_BRACERIGHT);
 163          regularKeyCodesMap.put(0x7F, KeyEvent.VK_DELETE);
 164          regularKeyCodesMap.put(0xA1, KeyEvent.VK_INVERTED_EXCLAMATION_MARK);
 165 
 166          extendedKeyCodesSet.add(0x01000000+0x0060);
 167          extendedKeyCodesSet.add(0x01000000+0x007C);
 168          extendedKeyCodesSet.add(0x01000000+0x007E);
 169          extendedKeyCodesSet.add(0x01000000+0x00A2);
 170          extendedKeyCodesSet.add(0x01000000+0x00A3);
 171          extendedKeyCodesSet.add(0x01000000+0x00A5);
 172          extendedKeyCodesSet.add(0x01000000+0x00A7);
 173          extendedKeyCodesSet.add(0x01000000+0x00A8);
 174          extendedKeyCodesSet.add(0x01000000+0x00AB);
 175          extendedKeyCodesSet.add(0x01000000+0x00B0);
 176          extendedKeyCodesSet.add(0x01000000+0x00B1);
 177          extendedKeyCodesSet.add(0x01000000+0x00B2);
 178          extendedKeyCodesSet.add(0x01000000+0x00B3);
 179          extendedKeyCodesSet.add(0x01000000+0x00B4);
 180          extendedKeyCodesSet.add(0x01000000+0x00B5);
 181          extendedKeyCodesSet.add(0x01000000+0x00B6);
 182          extendedKeyCodesSet.add(0x01000000+0x00B7);
 183          extendedKeyCodesSet.add(0x01000000+0x00B9);
 184          extendedKeyCodesSet.add(0x01000000+0x00BA);
 185          extendedKeyCodesSet.add(0x01000000+0x00BB);
 186          extendedKeyCodesSet.add(0x01000000+0x00BC);
 187          extendedKeyCodesSet.add(0x01000000+0x00BD);
 188          extendedKeyCodesSet.add(0x01000000+0x00BE);
 189          extendedKeyCodesSet.add(0x01000000+0x00BF);
 190          extendedKeyCodesSet.add(0x01000000+0x00C4);
 191          extendedKeyCodesSet.add(0x01000000+0x00C5);
 192          extendedKeyCodesSet.add(0x01000000+0x00C6);
 193          extendedKeyCodesSet.add(0x01000000+0x00C7);
 194          extendedKeyCodesSet.add(0x01000000+0x00D1);
 195          extendedKeyCodesSet.add(0x01000000+0x00D6);
 196          extendedKeyCodesSet.add(0x01000000+0x00D7);
 197          extendedKeyCodesSet.add(0x01000000+0x00D8);
 198          extendedKeyCodesSet.add(0x01000000+0x00DF);
 199          extendedKeyCodesSet.add(0x01000000+0x00E0);
 200          extendedKeyCodesSet.add(0x01000000+0x00E1);
 201          extendedKeyCodesSet.add(0x01000000+0x00E2);
 202          extendedKeyCodesSet.add(0x01000000+0x00E4);
 203          extendedKeyCodesSet.add(0x01000000+0x00E5);
 204          extendedKeyCodesSet.add(0x01000000+0x00E6);
 205          extendedKeyCodesSet.add(0x01000000+0x00E7);
 206          extendedKeyCodesSet.add(0x01000000+0x00E8);
 207          extendedKeyCodesSet.add(0x01000000+0x00E9);
 208          extendedKeyCodesSet.add(0x01000000+0x00EA);
 209          extendedKeyCodesSet.add(0x01000000+0x00EB);
 210          extendedKeyCodesSet.add(0x01000000+0x00EC);
 211          extendedKeyCodesSet.add(0x01000000+0x00ED);
 212          extendedKeyCodesSet.add(0x01000000+0x00EE);
 213          extendedKeyCodesSet.add(0x01000000+0x00F0);
 214          extendedKeyCodesSet.add(0x01000000+0x00F1);
 215          extendedKeyCodesSet.add(0x01000000+0x00F2);
 216          extendedKeyCodesSet.add(0x01000000+0x00F3);
 217          extendedKeyCodesSet.add(0x01000000+0x00F4);
 218          extendedKeyCodesSet.add(0x01000000+0x00F5);
 219          extendedKeyCodesSet.add(0x01000000+0x00F6);
 220          extendedKeyCodesSet.add(0x01000000+0x00F7);
 221          extendedKeyCodesSet.add(0x01000000+0x00F8);
 222          extendedKeyCodesSet.add(0x01000000+0x00F9);
 223          extendedKeyCodesSet.add(0x01000000+0x00FA);
 224          extendedKeyCodesSet.add(0x01000000+0x00FB);
 225          extendedKeyCodesSet.add(0x01000000+0x00FC);
 226          extendedKeyCodesSet.add(0x01000000+0x00FD);
 227          extendedKeyCodesSet.add(0x01000000+0x00FE);
 228          extendedKeyCodesSet.add(0x01000000+0x0105);
 229          extendedKeyCodesSet.add(0x01000000+0x02DB);
 230          extendedKeyCodesSet.add(0x01000000+0x0142);
 231          extendedKeyCodesSet.add(0x01000000+0x013E);
 232          extendedKeyCodesSet.add(0x01000000+0x015B);
 233          extendedKeyCodesSet.add(0x01000000+0x0161);
 234          extendedKeyCodesSet.add(0x01000000+0x015F);
 235          extendedKeyCodesSet.add(0x01000000+0x0165);
 236          extendedKeyCodesSet.add(0x01000000+0x017E);
 237          extendedKeyCodesSet.add(0x01000000+0x017C);
 238          extendedKeyCodesSet.add(0x01000000+0x0103);
 239          extendedKeyCodesSet.add(0x01000000+0x0107);
 240          extendedKeyCodesSet.add(0x01000000+0x010D);
 241          extendedKeyCodesSet.add(0x01000000+0x0119);
 242          extendedKeyCodesSet.add(0x01000000+0x011B);
 243          extendedKeyCodesSet.add(0x01000000+0x0111);
 244          extendedKeyCodesSet.add(0x01000000+0x0148);
 245          extendedKeyCodesSet.add(0x01000000+0x0151);
 246          extendedKeyCodesSet.add(0x01000000+0x0171);
 247          extendedKeyCodesSet.add(0x01000000+0x0159);
 248          extendedKeyCodesSet.add(0x01000000+0x016F);
 249          extendedKeyCodesSet.add(0x01000000+0x0163);
 250          extendedKeyCodesSet.add(0x01000000+0x02D9);
 251          extendedKeyCodesSet.add(0x01000000+0x0130);
 252          extendedKeyCodesSet.add(0x01000000+0x0127);
 253          extendedKeyCodesSet.add(0x01000000+0x0125);
 254          extendedKeyCodesSet.add(0x01000000+0x0131);
 255          extendedKeyCodesSet.add(0x01000000+0x011F);
 256          extendedKeyCodesSet.add(0x01000000+0x0135);
 257          extendedKeyCodesSet.add(0x01000000+0x010B);
 258          extendedKeyCodesSet.add(0x01000000+0x0109);
 259          extendedKeyCodesSet.add(0x01000000+0x0121);
 260          extendedKeyCodesSet.add(0x01000000+0x011D);
 261          extendedKeyCodesSet.add(0x01000000+0x016D);
 262          extendedKeyCodesSet.add(0x01000000+0x015D);
 263          extendedKeyCodesSet.add(0x01000000+0x0138);
 264          extendedKeyCodesSet.add(0x01000000+0x0157);
 265          extendedKeyCodesSet.add(0x01000000+0x013C);
 266          extendedKeyCodesSet.add(0x01000000+0x0113);
 267          extendedKeyCodesSet.add(0x01000000+0x0123);
 268          extendedKeyCodesSet.add(0x01000000+0x0167);
 269          extendedKeyCodesSet.add(0x01000000+0x014B);
 270          extendedKeyCodesSet.add(0x01000000+0x0101);
 271          extendedKeyCodesSet.add(0x01000000+0x012F);
 272          extendedKeyCodesSet.add(0x01000000+0x0117);
 273          extendedKeyCodesSet.add(0x01000000+0x012B);
 274          extendedKeyCodesSet.add(0x01000000+0x0146);
 275          extendedKeyCodesSet.add(0x01000000+0x014D);
 276          extendedKeyCodesSet.add(0x01000000+0x0137);
 277          extendedKeyCodesSet.add(0x01000000+0x0173);
 278          extendedKeyCodesSet.add(0x01000000+0x016B);
 279          extendedKeyCodesSet.add(0x01000000+0x0153);
 280          extendedKeyCodesSet.add(0x01000000+0x30FC);
 281          extendedKeyCodesSet.add(0x01000000+0x30A2);
 282          extendedKeyCodesSet.add(0x01000000+0x30A4);
 283          extendedKeyCodesSet.add(0x01000000+0x30A6);
 284          extendedKeyCodesSet.add(0x01000000+0x30A8);
 285          extendedKeyCodesSet.add(0x01000000+0x30AA);
 286          extendedKeyCodesSet.add(0x01000000+0x30AB);
 287          extendedKeyCodesSet.add(0x01000000+0x30AD);
 288          extendedKeyCodesSet.add(0x01000000+0x30AF);
 289          extendedKeyCodesSet.add(0x01000000+0x30B1);
 290          extendedKeyCodesSet.add(0x01000000+0x30B3);
 291          extendedKeyCodesSet.add(0x01000000+0x30B5);
 292          extendedKeyCodesSet.add(0x01000000+0x30B7);
 293          extendedKeyCodesSet.add(0x01000000+0x30B9);
 294          extendedKeyCodesSet.add(0x01000000+0x30BB);
 295          extendedKeyCodesSet.add(0x01000000+0x30BD);
 296          extendedKeyCodesSet.add(0x01000000+0x30BF);
 297          extendedKeyCodesSet.add(0x01000000+0x30C1);
 298          extendedKeyCodesSet.add(0x01000000+0x30C4);
 299          extendedKeyCodesSet.add(0x01000000+0x30C6);
 300          extendedKeyCodesSet.add(0x01000000+0x30C8);
 301          extendedKeyCodesSet.add(0x01000000+0x30CA);
 302          extendedKeyCodesSet.add(0x01000000+0x30CB);
 303          extendedKeyCodesSet.add(0x01000000+0x30CC);
 304          extendedKeyCodesSet.add(0x01000000+0x30CD);
 305          extendedKeyCodesSet.add(0x01000000+0x30CE);
 306          extendedKeyCodesSet.add(0x01000000+0x30CF);
 307          extendedKeyCodesSet.add(0x01000000+0x30D2);
 308          extendedKeyCodesSet.add(0x01000000+0x30D5);
 309          extendedKeyCodesSet.add(0x01000000+0x30D8);
 310          extendedKeyCodesSet.add(0x01000000+0x30DB);
 311          extendedKeyCodesSet.add(0x01000000+0x30DE);
 312          extendedKeyCodesSet.add(0x01000000+0x30DF);
 313          extendedKeyCodesSet.add(0x01000000+0x30E0);
 314          extendedKeyCodesSet.add(0x01000000+0x30E1);
 315          extendedKeyCodesSet.add(0x01000000+0x30E2);
 316          extendedKeyCodesSet.add(0x01000000+0x30E4);
 317          extendedKeyCodesSet.add(0x01000000+0x30E6);
 318          extendedKeyCodesSet.add(0x01000000+0x30E8);
 319          extendedKeyCodesSet.add(0x01000000+0x30E9);
 320          extendedKeyCodesSet.add(0x01000000+0x30EA);
 321          extendedKeyCodesSet.add(0x01000000+0x30EB);
 322          extendedKeyCodesSet.add(0x01000000+0x30EC);
 323          extendedKeyCodesSet.add(0x01000000+0x30ED);
 324          extendedKeyCodesSet.add(0x01000000+0x30EF);
 325          extendedKeyCodesSet.add(0x01000000+0x30F3);
 326          extendedKeyCodesSet.add(0x01000000+0x309B);
 327          extendedKeyCodesSet.add(0x01000000+0x309C);
 328          extendedKeyCodesSet.add(0x01000000+0x06F0);
 329          extendedKeyCodesSet.add(0x01000000+0x06F1);
 330          extendedKeyCodesSet.add(0x01000000+0x06F2);
 331          extendedKeyCodesSet.add(0x01000000+0x06F3);
 332          extendedKeyCodesSet.add(0x01000000+0x06F4);
 333          extendedKeyCodesSet.add(0x01000000+0x06F5);
 334          extendedKeyCodesSet.add(0x01000000+0x06F6);
 335          extendedKeyCodesSet.add(0x01000000+0x06F7);
 336          extendedKeyCodesSet.add(0x01000000+0x06F8);
 337          extendedKeyCodesSet.add(0x01000000+0x06F9);
 338          extendedKeyCodesSet.add(0x01000000+0x0670);
 339          extendedKeyCodesSet.add(0x01000000+0x067E);
 340          extendedKeyCodesSet.add(0x01000000+0x0686);
 341          extendedKeyCodesSet.add(0x01000000+0x060C);
 342          extendedKeyCodesSet.add(0x01000000+0x06D4);
 343          extendedKeyCodesSet.add(0x01000000+0x0660);
 344          extendedKeyCodesSet.add(0x01000000+0x0661);
 345          extendedKeyCodesSet.add(0x01000000+0x0662);
 346          extendedKeyCodesSet.add(0x01000000+0x0663);
 347          extendedKeyCodesSet.add(0x01000000+0x0664);
 348          extendedKeyCodesSet.add(0x01000000+0x0665);
 349          extendedKeyCodesSet.add(0x01000000+0x0666);
 350          extendedKeyCodesSet.add(0x01000000+0x0667);
 351          extendedKeyCodesSet.add(0x01000000+0x0668);
 352          extendedKeyCodesSet.add(0x01000000+0x0669);
 353          extendedKeyCodesSet.add(0x01000000+0x061B);
 354          extendedKeyCodesSet.add(0x01000000+0x0621);
 355          extendedKeyCodesSet.add(0x01000000+0x0624);
 356          extendedKeyCodesSet.add(0x01000000+0x0626);
 357          extendedKeyCodesSet.add(0x01000000+0x0627);
 358          extendedKeyCodesSet.add(0x01000000+0x0628);
 359          extendedKeyCodesSet.add(0x01000000+0x0629);
 360          extendedKeyCodesSet.add(0x01000000+0x062A);
 361          extendedKeyCodesSet.add(0x01000000+0x062B);
 362          extendedKeyCodesSet.add(0x01000000+0x062C);
 363          extendedKeyCodesSet.add(0x01000000+0x062D);
 364          extendedKeyCodesSet.add(0x01000000+0x062E);
 365          extendedKeyCodesSet.add(0x01000000+0x062F);
 366          extendedKeyCodesSet.add(0x01000000+0x0630);
 367          extendedKeyCodesSet.add(0x01000000+0x0631);
 368          extendedKeyCodesSet.add(0x01000000+0x0632);
 369          extendedKeyCodesSet.add(0x01000000+0x0633);
 370          extendedKeyCodesSet.add(0x01000000+0x0634);
 371          extendedKeyCodesSet.add(0x01000000+0x0635);
 372          extendedKeyCodesSet.add(0x01000000+0x0636);
 373          extendedKeyCodesSet.add(0x01000000+0x0637);
 374          extendedKeyCodesSet.add(0x01000000+0x0638);
 375          extendedKeyCodesSet.add(0x01000000+0x0639);
 376          extendedKeyCodesSet.add(0x01000000+0x063A);
 377          extendedKeyCodesSet.add(0x01000000+0x0641);
 378          extendedKeyCodesSet.add(0x01000000+0x0642);
 379          extendedKeyCodesSet.add(0x01000000+0x0643);
 380          extendedKeyCodesSet.add(0x01000000+0x0644);
 381          extendedKeyCodesSet.add(0x01000000+0x0645);
 382          extendedKeyCodesSet.add(0x01000000+0x0646);
 383          extendedKeyCodesSet.add(0x01000000+0x0647);
 384          extendedKeyCodesSet.add(0x01000000+0x0648);
 385          extendedKeyCodesSet.add(0x01000000+0x0649);
 386          extendedKeyCodesSet.add(0x01000000+0x064A);
 387          extendedKeyCodesSet.add(0x01000000+0x064E);
 388          extendedKeyCodesSet.add(0x01000000+0x064F);
 389          extendedKeyCodesSet.add(0x01000000+0x0650);
 390          extendedKeyCodesSet.add(0x01000000+0x0652);
 391          extendedKeyCodesSet.add(0x01000000+0x0698);
 392          extendedKeyCodesSet.add(0x01000000+0x06A4);
 393          extendedKeyCodesSet.add(0x01000000+0x06A9);
 394          extendedKeyCodesSet.add(0x01000000+0x06AF);
 395          extendedKeyCodesSet.add(0x01000000+0x06BE);
 396          extendedKeyCodesSet.add(0x01000000+0x06CC);
 397          extendedKeyCodesSet.add(0x01000000+0x06CC);
 398          extendedKeyCodesSet.add(0x01000000+0x06D2);
 399          extendedKeyCodesSet.add(0x01000000+0x0493);
 400          extendedKeyCodesSet.add(0x01000000+0x0497);
 401          extendedKeyCodesSet.add(0x01000000+0x049B);
 402          extendedKeyCodesSet.add(0x01000000+0x049D);
 403          extendedKeyCodesSet.add(0x01000000+0x04A3);
 404          extendedKeyCodesSet.add(0x01000000+0x04AF);
 405          extendedKeyCodesSet.add(0x01000000+0x04B1);
 406          extendedKeyCodesSet.add(0x01000000+0x04B3);
 407          extendedKeyCodesSet.add(0x01000000+0x04B9);
 408          extendedKeyCodesSet.add(0x01000000+0x04BB);
 409          extendedKeyCodesSet.add(0x01000000+0x04D9);
 410          extendedKeyCodesSet.add(0x01000000+0x04E9);
 411          extendedKeyCodesSet.add(0x01000000+0x0452);
 412          extendedKeyCodesSet.add(0x01000000+0x0453);
 413          extendedKeyCodesSet.add(0x01000000+0x0451);
 414          extendedKeyCodesSet.add(0x01000000+0x0454);
 415          extendedKeyCodesSet.add(0x01000000+0x0455);
 416          extendedKeyCodesSet.add(0x01000000+0x0456);
 417          extendedKeyCodesSet.add(0x01000000+0x0457);
 418          extendedKeyCodesSet.add(0x01000000+0x0458);
 419          extendedKeyCodesSet.add(0x01000000+0x0459);
 420          extendedKeyCodesSet.add(0x01000000+0x045A);
 421          extendedKeyCodesSet.add(0x01000000+0x045B);
 422          extendedKeyCodesSet.add(0x01000000+0x045C);
 423          extendedKeyCodesSet.add(0x01000000+0x0491);
 424          extendedKeyCodesSet.add(0x01000000+0x045E);
 425          extendedKeyCodesSet.add(0x01000000+0x045F);
 426          extendedKeyCodesSet.add(0x01000000+0x2116);
 427          extendedKeyCodesSet.add(0x01000000+0x044E);
 428          extendedKeyCodesSet.add(0x01000000+0x0430);
 429          extendedKeyCodesSet.add(0x01000000+0x0431);
 430          extendedKeyCodesSet.add(0x01000000+0x0446);
 431          extendedKeyCodesSet.add(0x01000000+0x0434);
 432          extendedKeyCodesSet.add(0x01000000+0x0435);
 433          extendedKeyCodesSet.add(0x01000000+0x0444);
 434          extendedKeyCodesSet.add(0x01000000+0x0433);
 435          extendedKeyCodesSet.add(0x01000000+0x0445);
 436          extendedKeyCodesSet.add(0x01000000+0x0438);
 437          extendedKeyCodesSet.add(0x01000000+0x0439);
 438          extendedKeyCodesSet.add(0x01000000+0x043A);
 439          extendedKeyCodesSet.add(0x01000000+0x043B);
 440          extendedKeyCodesSet.add(0x01000000+0x043C);
 441          extendedKeyCodesSet.add(0x01000000+0x043D);
 442          extendedKeyCodesSet.add(0x01000000+0x043E);
 443          extendedKeyCodesSet.add(0x01000000+0x043F);
 444          extendedKeyCodesSet.add(0x01000000+0x044F);
 445          extendedKeyCodesSet.add(0x01000000+0x0440);
 446          extendedKeyCodesSet.add(0x01000000+0x0441);
 447          extendedKeyCodesSet.add(0x01000000+0x0442);
 448          extendedKeyCodesSet.add(0x01000000+0x0443);
 449          extendedKeyCodesSet.add(0x01000000+0x0436);
 450          extendedKeyCodesSet.add(0x01000000+0x0432);
 451          extendedKeyCodesSet.add(0x01000000+0x044C);
 452          extendedKeyCodesSet.add(0x01000000+0x044B);
 453          extendedKeyCodesSet.add(0x01000000+0x0437);
 454          extendedKeyCodesSet.add(0x01000000+0x0448);
 455          extendedKeyCodesSet.add(0x01000000+0x044D);
 456          extendedKeyCodesSet.add(0x01000000+0x0449);
 457          extendedKeyCodesSet.add(0x01000000+0x0447);
 458          extendedKeyCodesSet.add(0x01000000+0x044A);
 459          extendedKeyCodesSet.add(0x01000000+0x2015);
 460          extendedKeyCodesSet.add(0x01000000+0x03B1);
 461          extendedKeyCodesSet.add(0x01000000+0x03B2);
 462          extendedKeyCodesSet.add(0x01000000+0x03B3);
 463          extendedKeyCodesSet.add(0x01000000+0x03B4);
 464          extendedKeyCodesSet.add(0x01000000+0x03B5);
 465          extendedKeyCodesSet.add(0x01000000+0x03B6);
 466          extendedKeyCodesSet.add(0x01000000+0x03B7);
 467          extendedKeyCodesSet.add(0x01000000+0x03B8);
 468          extendedKeyCodesSet.add(0x01000000+0x03B9);
 469          extendedKeyCodesSet.add(0x01000000+0x03BA);
 470          extendedKeyCodesSet.add(0x01000000+0x03BB);
 471          extendedKeyCodesSet.add(0x01000000+0x03BC);
 472          extendedKeyCodesSet.add(0x01000000+0x03BD);
 473          extendedKeyCodesSet.add(0x01000000+0x03BE);
 474          extendedKeyCodesSet.add(0x01000000+0x03BF);
 475          extendedKeyCodesSet.add(0x01000000+0x03C0);
 476          extendedKeyCodesSet.add(0x01000000+0x03C1);
 477          extendedKeyCodesSet.add(0x01000000+0x03C3);
 478          extendedKeyCodesSet.add(0x01000000+0x03C2);
 479          extendedKeyCodesSet.add(0x01000000+0x03C4);
 480          extendedKeyCodesSet.add(0x01000000+0x03C5);
 481          extendedKeyCodesSet.add(0x01000000+0x03C6);
 482          extendedKeyCodesSet.add(0x01000000+0x03C7);
 483          extendedKeyCodesSet.add(0x01000000+0x03C8);
 484          extendedKeyCodesSet.add(0x01000000+0x03C9);
 485          extendedKeyCodesSet.add(0x01000000+0x2190);
 486          extendedKeyCodesSet.add(0x01000000+0x2192);
 487          extendedKeyCodesSet.add(0x01000000+0x2193);
 488          extendedKeyCodesSet.add(0x01000000+0x2013);
 489          extendedKeyCodesSet.add(0x01000000+0x201C);
 490          extendedKeyCodesSet.add(0x01000000+0x201D);
 491          extendedKeyCodesSet.add(0x01000000+0x201E);
 492          extendedKeyCodesSet.add(0x01000000+0x05D0);
 493          extendedKeyCodesSet.add(0x01000000+0x05D1);
 494          extendedKeyCodesSet.add(0x01000000+0x05D2);
 495          extendedKeyCodesSet.add(0x01000000+0x05D3);
 496          extendedKeyCodesSet.add(0x01000000+0x05D4);
 497          extendedKeyCodesSet.add(0x01000000+0x05D5);
 498          extendedKeyCodesSet.add(0x01000000+0x05D6);
 499          extendedKeyCodesSet.add(0x01000000+0x05D7);
 500          extendedKeyCodesSet.add(0x01000000+0x05D8);
 501          extendedKeyCodesSet.add(0x01000000+0x05D9);
 502          extendedKeyCodesSet.add(0x01000000+0x05DA);
 503          extendedKeyCodesSet.add(0x01000000+0x05DB);
 504          extendedKeyCodesSet.add(0x01000000+0x05DC);
 505          extendedKeyCodesSet.add(0x01000000+0x05DD);
 506          extendedKeyCodesSet.add(0x01000000+0x05DE);
 507          extendedKeyCodesSet.add(0x01000000+0x05DF);
 508          extendedKeyCodesSet.add(0x01000000+0x05E0);
 509          extendedKeyCodesSet.add(0x01000000+0x05E1);
 510          extendedKeyCodesSet.add(0x01000000+0x05E2);
 511          extendedKeyCodesSet.add(0x01000000+0x05E3);
 512          extendedKeyCodesSet.add(0x01000000+0x05E4);
 513          extendedKeyCodesSet.add(0x01000000+0x05E5);
 514          extendedKeyCodesSet.add(0x01000000+0x05E6);
 515          extendedKeyCodesSet.add(0x01000000+0x05E7);
 516          extendedKeyCodesSet.add(0x01000000+0x05E8);
 517          extendedKeyCodesSet.add(0x01000000+0x05E9);
 518          extendedKeyCodesSet.add(0x01000000+0x05EA);
 519          extendedKeyCodesSet.add(0x01000000+0x0E01);
 520          extendedKeyCodesSet.add(0x01000000+0x0E02);
 521          extendedKeyCodesSet.add(0x01000000+0x0E03);
 522          extendedKeyCodesSet.add(0x01000000+0x0E04);
 523          extendedKeyCodesSet.add(0x01000000+0x0E05);
 524          extendedKeyCodesSet.add(0x01000000+0x0E07);
 525          extendedKeyCodesSet.add(0x01000000+0x0E08);
 526          extendedKeyCodesSet.add(0x01000000+0x0E0A);
 527          extendedKeyCodesSet.add(0x01000000+0x0E0C);
 528          extendedKeyCodesSet.add(0x01000000+0x0E14);
 529          extendedKeyCodesSet.add(0x01000000+0x0E15);
 530          extendedKeyCodesSet.add(0x01000000+0x0E16);
 531          extendedKeyCodesSet.add(0x01000000+0x0E17);
 532          extendedKeyCodesSet.add(0x01000000+0x0E19);
 533          extendedKeyCodesSet.add(0x01000000+0x0E1A);
 534          extendedKeyCodesSet.add(0x01000000+0x0E1B);
 535          extendedKeyCodesSet.add(0x01000000+0x0E1C);
 536          extendedKeyCodesSet.add(0x01000000+0x0E1D);
 537          extendedKeyCodesSet.add(0x01000000+0x0E1E);
 538          extendedKeyCodesSet.add(0x01000000+0x0E1F);
 539          extendedKeyCodesSet.add(0x01000000+0x0E20);
 540          extendedKeyCodesSet.add(0x01000000+0x0E21);
 541          extendedKeyCodesSet.add(0x01000000+0x0E22);
 542          extendedKeyCodesSet.add(0x01000000+0x0E23);
 543          extendedKeyCodesSet.add(0x01000000+0x0E25);
 544          extendedKeyCodesSet.add(0x01000000+0x0E27);
 545          extendedKeyCodesSet.add(0x01000000+0x0E2A);
 546          extendedKeyCodesSet.add(0x01000000+0x0E2B);
 547          extendedKeyCodesSet.add(0x01000000+0x0E2D);
 548          extendedKeyCodesSet.add(0x01000000+0x0E30);
 549          extendedKeyCodesSet.add(0x01000000+0x0E31);
 550          extendedKeyCodesSet.add(0x01000000+0x0E32);
 551          extendedKeyCodesSet.add(0x01000000+0x0E33);
 552          extendedKeyCodesSet.add(0x01000000+0x0E34);
 553          extendedKeyCodesSet.add(0x01000000+0x0E35);
 554          extendedKeyCodesSet.add(0x01000000+0x0E36);
 555          extendedKeyCodesSet.add(0x01000000+0x0E37);
 556          extendedKeyCodesSet.add(0x01000000+0x0E38);
 557          extendedKeyCodesSet.add(0x01000000+0x0E39);
 558          extendedKeyCodesSet.add(0x01000000+0x0E3F);
 559          extendedKeyCodesSet.add(0x01000000+0x0E40);
 560          extendedKeyCodesSet.add(0x01000000+0x0E41);
 561          extendedKeyCodesSet.add(0x01000000+0x0E43);
 562          extendedKeyCodesSet.add(0x01000000+0x0E44);
 563          extendedKeyCodesSet.add(0x01000000+0x0E45);
 564          extendedKeyCodesSet.add(0x01000000+0x0E46);
 565          extendedKeyCodesSet.add(0x01000000+0x0E47);
 566          extendedKeyCodesSet.add(0x01000000+0x0E48);
 567          extendedKeyCodesSet.add(0x01000000+0x0E49);
 568          extendedKeyCodesSet.add(0x01000000+0x0E50);
 569          extendedKeyCodesSet.add(0x01000000+0x0E51);
 570          extendedKeyCodesSet.add(0x01000000+0x0E52);
 571          extendedKeyCodesSet.add(0x01000000+0x0E53);
 572          extendedKeyCodesSet.add(0x01000000+0x0E54);
 573          extendedKeyCodesSet.add(0x01000000+0x0E55);
 574          extendedKeyCodesSet.add(0x01000000+0x0E56);
 575          extendedKeyCodesSet.add(0x01000000+0x0E57);
 576          extendedKeyCodesSet.add(0x01000000+0x0E58);
 577          extendedKeyCodesSet.add(0x01000000+0x0E59);
 578          extendedKeyCodesSet.add(0x01000000+0x0587);
 579          extendedKeyCodesSet.add(0x01000000+0x0589);
 580          extendedKeyCodesSet.add(0x01000000+0x0589);
 581          extendedKeyCodesSet.add(0x01000000+0x055D);
 582          extendedKeyCodesSet.add(0x01000000+0x055D);
 583          extendedKeyCodesSet.add(0x01000000+0x055B);
 584          extendedKeyCodesSet.add(0x01000000+0x055B);
 585          extendedKeyCodesSet.add(0x01000000+0x055E);
 586          extendedKeyCodesSet.add(0x01000000+0x055E);
 587          extendedKeyCodesSet.add(0x01000000+0x0561);
 588          extendedKeyCodesSet.add(0x01000000+0x0562);
 589          extendedKeyCodesSet.add(0x01000000+0x0563);
 590          extendedKeyCodesSet.add(0x01000000+0x0564);
 591          extendedKeyCodesSet.add(0x01000000+0x0565);
 592          extendedKeyCodesSet.add(0x01000000+0x0566);
 593          extendedKeyCodesSet.add(0x01000000+0x0567);
 594          extendedKeyCodesSet.add(0x01000000+0x0568);
 595          extendedKeyCodesSet.add(0x01000000+0x0569);
 596          extendedKeyCodesSet.add(0x01000000+0x056A);
 597          extendedKeyCodesSet.add(0x01000000+0x056B);
 598          extendedKeyCodesSet.add(0x01000000+0x056C);
 599          extendedKeyCodesSet.add(0x01000000+0x056D);
 600          extendedKeyCodesSet.add(0x01000000+0x056E);
 601          extendedKeyCodesSet.add(0x01000000+0x056F);
 602          extendedKeyCodesSet.add(0x01000000+0x0570);
 603          extendedKeyCodesSet.add(0x01000000+0x0571);
 604          extendedKeyCodesSet.add(0x01000000+0x0572);
 605          extendedKeyCodesSet.add(0x01000000+0x0573);
 606          extendedKeyCodesSet.add(0x01000000+0x0574);
 607          extendedKeyCodesSet.add(0x01000000+0x0575);
 608          extendedKeyCodesSet.add(0x01000000+0x0576);
 609          extendedKeyCodesSet.add(0x01000000+0x0577);
 610          extendedKeyCodesSet.add(0x01000000+0x0578);
 611          extendedKeyCodesSet.add(0x01000000+0x0579);
 612          extendedKeyCodesSet.add(0x01000000+0x057A);
 613          extendedKeyCodesSet.add(0x01000000+0x057B);
 614          extendedKeyCodesSet.add(0x01000000+0x057C);
 615          extendedKeyCodesSet.add(0x01000000+0x057D);
 616          extendedKeyCodesSet.add(0x01000000+0x057E);
 617          extendedKeyCodesSet.add(0x01000000+0x057F);
 618          extendedKeyCodesSet.add(0x01000000+0x0580);
 619          extendedKeyCodesSet.add(0x01000000+0x0581);
 620          extendedKeyCodesSet.add(0x01000000+0x0582);
 621          extendedKeyCodesSet.add(0x01000000+0x0583);
 622          extendedKeyCodesSet.add(0x01000000+0x0584);
 623          extendedKeyCodesSet.add(0x01000000+0x0585);
 624          extendedKeyCodesSet.add(0x01000000+0x0586);
 625          extendedKeyCodesSet.add(0x01000000+0x10D0);
 626          extendedKeyCodesSet.add(0x01000000+0x10D1);
 627          extendedKeyCodesSet.add(0x01000000+0x10D2);
 628          extendedKeyCodesSet.add(0x01000000+0x10D3);
 629          extendedKeyCodesSet.add(0x01000000+0x10D4);
 630          extendedKeyCodesSet.add(0x01000000+0x10D5);
 631          extendedKeyCodesSet.add(0x01000000+0x10D6);
 632          extendedKeyCodesSet.add(0x01000000+0x10D7);
 633          extendedKeyCodesSet.add(0x01000000+0x10D8);
 634          extendedKeyCodesSet.add(0x01000000+0x10D9);
 635          extendedKeyCodesSet.add(0x01000000+0x10DA);
 636          extendedKeyCodesSet.add(0x01000000+0x10DB);
 637          extendedKeyCodesSet.add(0x01000000+0x10DC);
 638          extendedKeyCodesSet.add(0x01000000+0x10DD);
 639          extendedKeyCodesSet.add(0x01000000+0x10DE);
 640          extendedKeyCodesSet.add(0x01000000+0x10DF);
 641          extendedKeyCodesSet.add(0x01000000+0x10E0);
 642          extendedKeyCodesSet.add(0x01000000+0x10E1);
 643          extendedKeyCodesSet.add(0x01000000+0x10E2);
 644          extendedKeyCodesSet.add(0x01000000+0x10E3);
 645          extendedKeyCodesSet.add(0x01000000+0x10E4);
 646          extendedKeyCodesSet.add(0x01000000+0x10E5);
 647          extendedKeyCodesSet.add(0x01000000+0x10E6);
 648          extendedKeyCodesSet.add(0x01000000+0x10E7);
 649          extendedKeyCodesSet.add(0x01000000+0x10E8);
 650          extendedKeyCodesSet.add(0x01000000+0x10E9);
 651          extendedKeyCodesSet.add(0x01000000+0x10EA);
 652          extendedKeyCodesSet.add(0x01000000+0x10EB);
 653          extendedKeyCodesSet.add(0x01000000+0x10EC);
 654          extendedKeyCodesSet.add(0x01000000+0x10ED);
 655          extendedKeyCodesSet.add(0x01000000+0x10EE);
 656          extendedKeyCodesSet.add(0x01000000+0x10EF);
 657          extendedKeyCodesSet.add(0x01000000+0x10F0);
 658          extendedKeyCodesSet.add(0x01000000+0x01E7);
 659          extendedKeyCodesSet.add(0x01000000+0x0259);
 660          extendedKeyCodesSet.add(0x01000000+0x1EB9);
 661          extendedKeyCodesSet.add(0x01000000+0x1ECB);
 662          extendedKeyCodesSet.add(0x01000000+0x1ECD);
 663          extendedKeyCodesSet.add(0x01000000+0x1EE5);
 664          extendedKeyCodesSet.add(0x01000000+0x01A1);
 665          extendedKeyCodesSet.add(0x01000000+0x01B0);
 666          extendedKeyCodesSet.add(0x01000000+0x20AB);
 667      }
 668 }