CasperSecurity

Current Path : /var/lib/dpkg/info/
Upload File :
Current File : /var/lib/dpkg/info/keyboard-configuration.config

#!/bin/sh

#     Copyright © 2005 Anton Zinoviev <anton@lml.bas.bg>

#     This program is free software; you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation; either version 2 of the License, or
#     (at your option) any later version.

#     This program is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.

#     If you have not received a copy of the GNU General Public License
#     along with this program, write to the Free Software Foundation, Inc.,
#     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

#                        ----------
#                         CONTENTS
#                        ----------
#
# 1. Define the auxiliary functions db_default, regex_excape,
#    regex_pattern_escape and regex_unescape.
#
# 2. Define the function all_kbdnames listing all supported keyboard
#    models, layouts and variants and a function keyboard_present
#    testing whether the computer has at least one keyboard
#
# 3. Function ask_debconf.  Ask the user to choose amongst the options
#    listed in $kbdnames.
#
# 4. Function guess_arch - detect the architecture and subarchitecture
#
# 5. Function keyboard_present - test if the computer has at least one keyboard
#
# 6. Set $locale.  Extract the strings for the chosen language in $kbdnames.
#
# 7. Compute default values for $XKBMODEL, $XKBLAYOUT, $XKBVARIANT
#    based on the architecture and the locale.
#
# 8. Overwrite (some of) the computed default values by:
#    - preseeded values (for the udeb);
#    - the value of debian-installer/keymap
#    - the contents of /etc/X11/xorg.conf
#    - the settings in the configuration files (/etc/default/...).
#    - correct some bugs of previous versions of console-setup
#
# 9. If the computer doesn't have keyboard then do not ask questions,
#    simply store the default values in the configuration file.  This
#    is in order to support headless installs in d-i.  The regular
#    packages (console-setup and console-setup-mini) should not be
#    installed on such sistems.
#
# 10. Compute default values for the Debconf questions.  For example
#     from XKBLAYOUT=us,el we obtain debconf_layout=el and from
#     XKBOPTIONS=lv3:ralt_switch we obtain debconf_altgr='Right Alt (AltGr)'
#
# 11. Ask the Debconf questions starting from STATE=1.

set -e

. /usr/share/debconf/confmodule

db_capb backup

CONFIGFILE=/etc/default/keyboard
OLDCONFIGFILE=/etc/default/console-setup

debconf_toggle=''
debconf_switch=''
debconf_altgr=''
debconf_compose=''
debconf_layout=''
debconf_variant=''
XKBMODEL=''
XKBLAYOUT=''
XKBVARIANT=''
XKBOPTIONS=''

CAPB="$RET"
detect_keyboard=false
case $CAPB in
    *plugin-detect-keyboard*)
	detect_keyboard=:
	;;
esac

if [ -f /usr/share/console-setup/keyboard-configuration.config ]; then
    is_debian_installer=yes
    is_not_debian_installer=''
else
    is_debian_installer=''
    is_not_debian_installer=yes
fi

######################################################################
#   Define auxiliary the functions db_default, regex_excape,
#   regex_pattern_escape, regex_unescape, and read_config.
######################################################################

read_config() {
    [ -r $1 ] || return 0
    . $1 || true
    # Treat missing XKBOPTIONS as empty, other vars have sane defaults:
    for var in XKBOPTIONS; do
        if ! grep "^ *${var}=" $1 >/dev/null; then
            eval ${var}=""
        fi
    done
}

which () {
    local IFS
    IFS=:
    for i in $PATH; do
	if [ -f "$i/$1" -a -x "$i/$1" ]; then
	    echo "$i/$1"
	    return 0
	fi
    done
    return 1
}

# Store default value into debconf db.  Workaround #352697.
db_default () {
    db_get keyboard-configuration/store_defaults_in_debconf_db
    if [ "$RET" = true ]; then
	db_set $1 "$2"
    fi
}

regex_escape () {
    sed \
	-e 's/[.]/%period%/g' \
	-e 's/\[/%lbracket%/g' \
	-e 's/\]/%rbracket%/g' \
	-e 's/\^/%caret%/g' \
	-e 's/\$/%dollar%/g' \
	-e 's/\\/%bslash%/g' \
	-e 's/[/]/%slash%/g' \
	-e 's/[?]/%question%/g' \
	-e 's/[+]/%plus%/g'
}

regex_pattern_escape () {
    sed \
	-e 's/[.]/%period%/g' \
	-e 's/\[/%lbracket%/g' \
	-e 's/\]/%rbracket%/g' \
	-e 's/\^/%caret%/g' \
	-e 's/\$/%dollar%/g' \
	-e 's/\\/%bslash%/g' \
	-e 's/[/]/%slash%/g' \
	-e 's/[?]/%question%/g' \
	-e 's/[+]/%plus%/g' \
	-e 's/[*]/\\*/g'
}

regex_unescape () {
    sed \
	-e 's/%period%/./g' \
	-e 's/%lbracket%/[/g' \
	-e 's/%rbracket%/]/g' \
	-e 's/%caret%/^/g' \
	-e 's/%dollar%/$/g' \
	-e 's/%bslash%/\\/g' \
	-e 's/%slash%/\//g' \
	-e 's/%question%/?/g' \
	-e 's/%plus%/+/g'
}

######################################################################
#   Define the function all_kbdnames listing all supported keyboard
#   models, layouts and variants and a function keyboard_present
#   testing whether the computer has at least one keyboard
######################################################################

all_kbdnames () {
 cat <<'EOF'
C*model*a4techKB21*A4Tech KB-21
C*model*a4techKBS8*A4Tech KBS-8
C*model*a4_rfkb23*A4Tech Wireless Desktop RFKB-23
C*model*airkey*Acer AirKey V
C*model*acer_c300*Acer C300
C*model*acer_ferrari4k*Acer Ferrari 4000
C*model*acer_laptop*Acer laptop
C*model*scorpius*Advance Scorpius KI
C*model*amiga*Amiga
C*model*apple*Apple
C*model*applealu_ansi*Apple Aluminium (ANSI)
C*model*applealu_iso*Apple Aluminium (ISO)
C*model*applealu_jis*Apple Aluminium (JIS)
C*model*apple_laptop*Apple laptop
C*model*asus_laptop*Asus laptop
C*model*ataritt*Atari TT
C*model*azonaRF2300*Azona RF2300 Wireless Internet
C*model*btc5090*BTC 5090
C*model*btc5113rf*BTC 5113RF Multimedia
C*model*btc5126t*BTC 5126T
C*model*btc6301urf*BTC 6301URF
C*model*btc9000*BTC 9000
C*model*btc9000a*BTC 9000A
C*model*btc9001ah*BTC 9001AH
C*model*btc9019u*BTC 9019U
C*model*btc9116u*BTC 9116U Mini Wireless Internet and Gaming
C*model*benqx*BenQ X-Touch
C*model*benqx730*BenQ X-Touch 730
C*model*benqx800*BenQ X-Touch 800
C*model*brother*Brother Internet
C*model*cherrybunlim*Cherry B.UNLIMITED
C*model*cherryblue*Cherry Blue Line CyBo@rd
C*model*cherrybluea*Cherry Blue Line CyBo@rd (alt.)
C*model*cherrycyboard*Cherry CyBo@rd USB-Hub
C*model*cherrycmexpert*Cherry CyMotion Expert
C*model*cymotionlinux*Cherry CyMotion Master Linux
C*model*cherryblueb*Cherry CyMotion Master XPress
C*model*chicony*Chicony Internet
C*model*chicony9885*Chicony KB-9885
C*model*chicony0108*Chicony KU-0108
C*model*chicony0420*Chicony KU-0420
C*model*chromebook*Chromebook
C*model*classmate*Classmate PC
C*model*armada*Compaq Armada laptop
C*model*compaqeak8*Compaq Easy Access
C*model*compaqik13*Compaq Internet (13 keys)
C*model*compaqik18*Compaq Internet (18 keys)
C*model*compaqik7*Compaq Internet (7 keys)
C*model*presario*Compaq Presario laptop
C*model*ipaq*Compaq iPaq
C*model*creativedw7000*Creative Desktop Wireless 7000
C*model*dtk2000*DTK2000
C*model*dell*Dell
C*model*dell101*Dell 101-key PC
C*model*inspiron*Dell Inspiron 6000/8000 laptop
C*model*latitude*Dell Latitude laptop
C*model*precision_m*Dell Precision M laptop
C*model*dellm65*Dell Precision M65 laptop
C*model*dellsk8125*Dell SK-8125
C*model*dellsk8135*Dell SK-8135
C*model*dellusbmm*Dell USB Multimedia
C*model*dexxa*Dexxa Wireless Desktop
C*model*diamond*Diamond 9801/9802
C*model*SKIP*Do not configure keyboard; keep kernel keymap
C*model*ennyah_dkb1008*Ennyah DKB-1008
C*model*everex*Everex STEPnote
C*model*compalfl90*FL90
C*model*fscaa1667g*Fujitsu-Siemens Amilo laptop
C*model*pc101*Generic 101-key PC
C*model*pc102*Generic 102-key PC
C*model*pc104*Generic 104-key PC
C*model*pc104alt*Generic 104-key PC with L-shaped Enter key
C*model*pc105*Generic 105-key PC
C*model*pc86*Generic 86-key PC
C*model*geniuscomfy*Genius Comfy KB-12e
C*model*genius*Genius Comfy KB-16M/Multimedia KWD-910
C*model*geniuscomfy2*Genius Comfy KB-21e-Scroll
C*model*geniuskb19e*Genius KB-19e NB
C*model*geniuskkb2050hs*Genius KKB-2050HS
C*model*gyration*Gyration
C*model*hhk*Happy Hacking
C*model*macintosh_hhk*Happy Hacking for Mac
C*model*hpi6*Hewlett-Packard Internet
C*model*hpmini110*Hewlett-Packard Mini 110 laptop
C*model*hp250x*Hewlett-Packard NEC SK-2500 Multimedia
C*model*hp5xx*Hewlett-Packard Omnibook 500
C*model*hp500fa*Hewlett-Packard Omnibook 500 FA
C*model*hp6000*Hewlett-Packard Omnibook 6000/6100
C*model*hpxe3gc*Hewlett-Packard Omnibook XE3 GC
C*model*hpxe3gf*Hewlett-Packard Omnibook XE3 GF
C*model*hpxt1000*Hewlett-Packard Omnibook XT1000
C*model*hpzt11xx*Hewlett-Packard Pavilion ZT1100
C*model*hpdv5*Hewlett-Packard Pavilion dv5
C*model*hpnx9020*Hewlett-Packard nx9020
C*model*honeywell_euroboard*Honeywell Euroboard
C*model*rapidaccess*IBM Rapid Access
C*model*rapidaccess2*IBM Rapid Access II
C*model*ibm_spacesaver*IBM Space Saver
C*model*thinkpad*IBM ThinkPad 560Z/600/600E/A22E
C*model*thinkpad60*IBM ThinkPad R60/T60/R61/T61
C*model*thinkpadz60*IBM ThinkPad Z60m/Z60t/Z61m/Z61t
C*model*flexpro*Keytronic FlexPro
C*model*kinesis*Kinesis
C*model*logitech_base*Logitech
C*model*logiaccess*Logitech Access
C*model*logicd*Logitech Cordless Desktop
C*model*logicda*Logitech Cordless Desktop (alt.)
C*model*logiex110*Logitech Cordless Desktop EX110
C*model*logiclx300*Logitech Cordless Desktop LX-300
C*model*logicdn*Logitech Cordless Desktop Navigator
C*model*logicd_opt*Logitech Cordless Desktop Optical
C*model*logicdpa2*Logitech Cordless Desktop Pro (2nd alt.)
C*model*logicd_it*Logitech Cordless Desktop iTouch
C*model*logicfn*Logitech Cordless Freedom/Desktop Navigator
C*model*logitech_g15*Logitech G15 extra keys via G15daemon
C*model*logiik*Logitech Internet
C*model*logimel*Logitech Internet 350
C*model*logicink*Logitech Internet Navigator
C*model*logiultrax*Logitech Ultra-X
C*model*logiultraxc*Logitech Ultra-X Cordless Media Desktop
C*model*logidinovo*Logitech diNovo
C*model*logidinovoedge*Logitech diNovo Edge
C*model*itouch*Logitech iTouch
C*model*logiitc*Logitech iTouch Cordless Y-RB6
C*model*logiinkse*Logitech iTouch Internet Navigator SE
C*model*logiinkseusb*Logitech iTouch Internet Navigator SE USB
C*model*macbook78*MacBook/MacBook Pro
C*model*macbook79*MacBook/MacBook Pro (intl.)
C*model*macintosh*Macintosh
C*model*macintosh_old*Macintosh Old
C*model*mx1998*Memorex MX1998
C*model*mx2500*Memorex MX2500 EZ-Access
C*model*mx2750*Memorex MX2750
C*model*microsoftccurve2k*Microsoft Comfort Curve 2000
C*model*microsoftinet*Microsoft Internet
C*model*microsoftprose*Microsoft Internet Pro (Swedish)
C*model*microsoft*Microsoft Natural
C*model*microsoftelite*Microsoft Natural Elite
C*model*microsoft4000*Microsoft Natural Ergonomic 4000
C*model*microsoftprooem*Microsoft Natural Pro OEM
C*model*microsoftprousb*Microsoft Natural Pro USB/Internet Pro
C*model*microsoftpro*Microsoft Natural Pro/Internet Pro
C*model*microsoft7000*Microsoft Natural Wireless Ergonomic 7000
C*model*microsoftoffice*Microsoft Office Keyboard
C*model*microsoftsurface*Microsoft Surface
C*model*microsoftmult*Microsoft Wireless Multimedia 1.0A
C*model*sk1300*NEC SK-1300
C*model*sk2500*NEC SK-2500
C*model*sk6200*NEC SK-6200
C*model*sk7100*NEC SK-7100
C*model*omnikey101*Northgate OmniKey 101
C*model*olpc*OLPC
C*model*oretec*Ortek Multimedia/Internet MCK-800
C*model*pc98*PC-98
C*model*propeller*Propeller Voyager KTEZ-1000
C*model*qtronix*QTronix Scorpius 98N+
C*model*sven*SVEN Ergonomic 2500
C*model*sven303*SVEN Slim 303
C*model*samsung4500*Samsung SDM 4500P
C*model*samsung4510*Samsung SDM 4510P
C*model*sanwaskbkg3*Sanwa Supply SKB-KG3
C*model*silvercrest*Silvercrest Multimedia Wireless
C*model*apex300*SteelSeries Apex 300 (Apex RAW)
C*model*sun4*Sun Type 4
C*model*sun5*Sun Type 5
C*model*sun_type6_jp*Sun Type 6 (Japanese)
C*model*sun_type6_jp_usb*Sun Type 6 USB (Japanese)
C*model*sun_type6_unix_usb*Sun Type 6 USB (Unix)
C*model*sun_type6_usb*Sun Type 6/7 USB
C*model*sun_type6_euro_usb*Sun Type 6/7 USB (European)
C*model*sun_type7_usb*Sun Type 7 USB
C*model*sun_type7_euro_usb*Sun Type 7 USB (European)
C*model*sun_type7_jp_usb*Sun Type 7 USB (Japanese)/Japanese 106-key
C*model*sun_type7_unix_usb*Sun Type 7 USB (Unix)
C*model*sp_inet*Super Power Multimedia
C*model*symplon*Symplon PaceBook tablet
C*model*targa_v811*Targa Visionary 811
C*model*toshiba_s3000*Toshiba Satellite S3000
C*model*teck227*Truly Ergonomic 227
C*model*teck229*Truly Ergonomic 229
C*model*trustda*Trust Direct Access
C*model*trust_slimline*Trust Slimline
C*model*trust*Trust Wireless Classic
C*model*tm2020*TypeMatrix EZ-Reach 2020
C*model*tm2030PS2*TypeMatrix EZ-Reach 2030 PS2
C*model*tm2030USB*TypeMatrix EZ-Reach 2030 USB
C*model*tm2030USB-102*TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)
C*model*tm2030USB-106*TypeMatrix EZ-Reach 2030 USB (106:JP mode)
C*model*unitekkb1925*Unitek KB-1925
C*model*vsonku306*ViewSonic KU-306 Internet
C*model*winbook*Winbook Model XP5
C*model*yahoo*Yahoo! Internet
C*model*emachines*eMachines m6800 laptop
C*layout*custom*A user-defined custom Layout
C*variant*custom**A user-defined custom Layout
C*layout*af*Afghani
C*variant*af**Afghani
C*variant*af*ps*Afghani - Pashto
C*variant*af*olpc-ps*Afghani - Pashto (Afghanistan, OLPC)
C*variant*af*fa-olpc*Afghani - Persian (Afghanistan, Dari OLPC)
C*variant*af*uz*Afghani - Uzbek (Afghanistan)
C*variant*af*uz-olpc*Afghani - Uzbek (Afghanistan, OLPC)
C*layout*al*Albanian
C*variant*al**Albanian
C*variant*al*plisi*Albanian - Albanian (Plisi)
C*variant*al*veqilharxhi*Albanian - Albanian (Veqilharxhi)
C*layout*et*Amharic
C*variant*et**Amharic
C*layout*ara*Arabic
C*variant*ara**Arabic
C*variant*ara*azerty*Arabic - Arabic (AZERTY)
C*variant*ara*azerty_digits*Arabic - Arabic (AZERTY, Eastern Arabic numerals)
C*variant*ara*buckwalter*Arabic - Arabic (Buckwalter)
C*variant*ara*digits*Arabic - Arabic (Eastern Arabic numerals)
C*variant*ara*mac*Arabic - Arabic (Macintosh)
C*variant*ara*olpc*Arabic - Arabic (OLPC)
C*variant*ara*qwerty*Arabic - Arabic (QWERTY)
C*variant*ara*qwerty_digits*Arabic - Arabic (QWERTY, Eastern Arabic numerals)
C*layout*ma*Arabic (Morocco)
C*variant*ma**Arabic (Morocco)
C*variant*ma*tifinagh-alt*Arabic (Morocco) - Berber (Morocco, Tifinagh alt.)
C*variant*ma*tifinagh-extended-phonetic*Arabic (Morocco) - Berber (Morocco, Tifinagh extended phonetic)
C*variant*ma*tifinagh-extended*Arabic (Morocco) - Berber (Morocco, Tifinagh extended)
C*variant*ma*tifinagh-phonetic*Arabic (Morocco) - Berber (Morocco, Tifinagh phonetic)
C*variant*ma*tifinagh-alt-phonetic*Arabic (Morocco) - Berber (Morocco, Tifinagh phonetic, alt.)
C*variant*ma*tifinagh*Arabic (Morocco) - Berber (Morocco, Tifinagh)
C*variant*ma*french*Arabic (Morocco) - French (Morocco)
C*layout*sy*Arabic (Syria)
C*variant*sy**Arabic (Syria)
C*variant*sy*ku_f*Arabic (Syria) - Kurdish (Syria, F)
C*variant*sy*ku_alt*Arabic (Syria) - Kurdish (Syria, Latin Alt-Q)
C*variant*sy*ku*Arabic (Syria) - Kurdish (Syria, Latin Q)
C*variant*sy*syc*Arabic (Syria) - Syriac
C*variant*sy*syc_phonetic*Arabic (Syria) - Syriac (phonetic)
C*layout*am*Armenian
C*variant*am**Armenian
C*variant*am*eastern-alt*Armenian - Armenian (alt. eastern)
C*variant*am*phonetic-alt*Armenian - Armenian (alt. phonetic)
C*variant*am*eastern*Armenian - Armenian (eastern)
C*variant*am*phonetic*Armenian - Armenian (phonetic)
C*variant*am*western*Armenian - Armenian (western)
C*layout*az*Azerbaijani
C*variant*az**Azerbaijani
C*variant*az*cyrillic*Azerbaijani - Azerbaijani (Cyrillic)
C*layout*ml*Bambara
C*variant*ml**Bambara
C*variant*ml*us-mac*Bambara - English (Mali, US, Macintosh)
C*variant*ml*us-intl*Bambara - English (Mali, US, intl.)
C*variant*ml*fr-oss*Bambara - French (Mali, alt.)
C*layout*bd*Bangla
C*variant*bd**Bangla
C*variant*bd*probhat*Bangla - Bangla (Probhat)
C*layout*by*Belarusian
C*variant*by**Belarusian
C*variant*by*latin*Belarusian - Belarusian (Latin)
C*variant*by*intl*Belarusian - Belarusian (intl.)
C*variant*by*legacy*Belarusian - Belarusian (legacy)
C*variant*by*ru*Belarusian - Russian (Belarus)
C*layout*be*Belgian
C*variant*be**Belgian
C*variant*be*iso-alternate*Belgian - Belgian (ISO, alt.)
C*variant*be*oss_latin9*Belgian - Belgian (Latin-9 only, alt.)
C*variant*be*wang*Belgian - Belgian (Wang 724 AZERTY)
C*variant*be*oss*Belgian - Belgian (alt.)
C*variant*be*nodeadkeys*Belgian - Belgian (no dead keys)
C*layout*dz*Berber (Algeria, Latin)
C*variant*dz**Berber (Algeria, Latin)
C*variant*dz*ar*Berber (Algeria, Latin) - Arabic (Algeria)
C*variant*dz*ber*Berber (Algeria, Latin) - Berber (Algeria, Tifinagh)
C*variant*dz*azerty-deadkeys*Berber (Algeria, Latin) - Kabyle (AZERTY, with dead keys)
C*variant*dz*qwerty-gb-deadkeys*Berber (Algeria, Latin) - Kabyle (QWERTY, UK, with dead keys)
C*variant*dz*qwerty-us-deadkeys*Berber (Algeria, Latin) - Kabyle (QWERTY, US, with dead keys)
C*layout*ba*Bosnian
C*variant*ba**Bosnian
C*variant*ba*us*Bosnian - Bosnian (US)
C*variant*ba*unicodeus*Bosnian - Bosnian (US, with Bosnian digraphs)
C*variant*ba*unicode*Bosnian - Bosnian (with Bosnian digraphs)
C*variant*ba*alternatequotes*Bosnian - Bosnian (with guillemets)
C*layout*brai*Braille
C*variant*brai**Braille
C*variant*brai*left_hand_invert*Braille - Braille (left-handed inverted thumb)
C*variant*brai*left_hand*Braille - Braille (left-handed)
C*variant*brai*right_hand_invert*Braille - Braille (right-handed inverted thumb)
C*variant*brai*right_hand*Braille - Braille (right-handed)
C*layout*bg*Bulgarian
C*variant*bg**Bulgarian
C*variant*bg*bekl*Bulgarian - Bulgarian (enhanced)
C*variant*bg*bas_phonetic*Bulgarian - Bulgarian (new phonetic)
C*variant*bg*phonetic*Bulgarian - Bulgarian (traditional phonetic)
C*layout*mm*Burmese
C*variant*mm**Burmese
C*variant*mm*zawgyi*Burmese - Burmese Zawgyi
C*layout*cn*Chinese
C*variant*cn**Chinese
C*variant*cn*altgr-pinyin*Chinese - Hanyu Pinyin (with AltGr dead keys)
C*variant*cn*mon_trad*Chinese - Mongolian (Bichig)
C*variant*cn*mon_trad_galik*Chinese - Mongolian (Galik)
C*variant*cn*mon_manchu_galik*Chinese - Mongolian (Manchu Galik)
C*variant*cn*mon_trad_manchu*Chinese - Mongolian (Manchu)
C*variant*cn*mon_todo_galik*Chinese - Mongolian (Todo Galik)
C*variant*cn*mon_trad_todo*Chinese - Mongolian (Todo)
C*variant*cn*mon_trad_xibe*Chinese - Mongolian (Xibe)
C*variant*cn*tib*Chinese - Tibetan
C*variant*cn*tib_asciinum*Chinese - Tibetan (with ASCII numerals)
C*variant*cn*ug*Chinese - Uyghur
C*layout*hr*Croatian
C*variant*hr**Croatian
C*variant*hr*us*Croatian - Croatian (US)
C*variant*hr*unicodeus*Croatian - Croatian (US, with Croatian digraphs)
C*variant*hr*unicode*Croatian - Croatian (with Croatian digraphs)
C*variant*hr*alternatequotes*Croatian - Croatian (with guillemets)
C*layout*cz*Czech
C*variant*cz**Czech
C*variant*cz*qwerty*Czech - Czech (QWERTY)
C*variant*cz*qwerty-mac*Czech - Czech (QWERTY, Macintosh)
C*variant*cz*qwerty_bksl*Czech - Czech (QWERTY, extended backslash)
C*variant*cz*ucw*Czech - Czech (UCW, only accented letters)
C*variant*cz*dvorak-ucw*Czech - Czech (US, Dvorak, UCW support)
C*variant*cz*bksl*Czech - Czech (with <\|> key)
C*variant*cz*rus*Czech - Russian (Czech, phonetic)
C*layout*dk*Danish
C*variant*dk**Danish
C*variant*dk*dvorak*Danish - Danish (Dvorak)
C*variant*dk*mac*Danish - Danish (Macintosh)
C*variant*dk*mac_nodeadkeys*Danish - Danish (Macintosh, no dead keys)
C*variant*dk*winkeys*Danish - Danish (Windows)
C*variant*dk*nodeadkeys*Danish - Danish (no dead keys)
C*layout*mv*Dhivehi
C*variant*mv**Dhivehi
C*layout*nl*Dutch
C*variant*nl**Dutch
C*variant*nl*mac*Dutch - Dutch (Macintosh)
C*variant*nl*us*Dutch - Dutch (US)
C*variant*nl*std*Dutch - Dutch (standard)
C*layout*bt*Dzongkha
C*variant*bt**Dzongkha
C*layout*au*English (Australian)
C*variant*au**English (Australian)
C*layout*cm*English (Cameroon)
C*variant*cm**English (Cameroon)
C*variant*cm*azerty*English (Cameroon) - Cameroon (AZERTY, intl.)
C*variant*cm*dvorak*English (Cameroon) - Cameroon (Dvorak, intl.)
C*variant*cm*qwerty*English (Cameroon) - Cameroon Multilingual (QWERTY, intl.)
C*variant*cm*french*English (Cameroon) - French (Cameroon)
C*variant*cm*mmuock*English (Cameroon) - Mmuock
C*layout*gh*English (Ghana)
C*variant*gh**English (Ghana)
C*variant*gh*akan*English (Ghana) - Akan
C*variant*gh*avn*English (Ghana) - Avatime
C*variant*gh*gillbt*English (Ghana) - English (Ghana, GILLBT)
C*variant*gh*generic*English (Ghana) - English (Ghana, multilingual)
C*variant*gh*ewe*English (Ghana) - Ewe
C*variant*gh*fula*English (Ghana) - Fula
C*variant*gh*ga*English (Ghana) - Ga
C*variant*gh*hausa*English (Ghana) - Hausa (Ghana)
C*layout*ng*English (Nigeria)
C*variant*ng**English (Nigeria)
C*variant*ng*hausa*English (Nigeria) - Hausa (Nigeria)
C*variant*ng*igbo*English (Nigeria) - Igbo
C*variant*ng*yoruba*English (Nigeria) - Yoruba
C*layout*za*English (South Africa)
C*variant*za**English (South Africa)
C*layout*gb*English (UK)
C*variant*gb**English (UK)
C*variant*gb*colemak*English (UK) - English (UK, Colemak)
C*variant*gb*colemak_dh*English (UK) - English (UK, Colemak-DH)
C*variant*gb*dvorak*English (UK) - English (UK, Dvorak)
C*variant*gb*dvorakukp*English (UK) - English (UK, Dvorak, with UK punctuation)
C*variant*gb*mac*English (UK) - English (UK, Macintosh)
C*variant*gb*mac_intl*English (UK) - English (UK, Macintosh, intl.)
C*variant*gb*extd*English (UK) - English (UK, extended, Windows)
C*variant*gb*intl*English (UK) - English (UK, intl., with dead keys)
C*variant*gb*pl*English (UK) - Polish (British keyboard)
C*layout*us*English (US)
C*variant*us**English (US)
C*variant*us*chr*English (US) - Cherokee
C*variant*us*colemak*English (US) - English (Colemak)
C*variant*us*colemak_dh_iso*English (US) - English (Colemak-DH ISO)
C*variant*us*colemak_dh*English (US) - English (Colemak-DH)
C*variant*us*dvorak*English (US) - English (Dvorak)
C*variant*us*dvorak-alt-intl*English (US) - English (Dvorak, alt. intl.)
C*variant*us*dvorak-intl*English (US) - English (Dvorak, intl., with dead keys)
C*variant*us*dvorak-l*English (US) - English (Dvorak, left-handed)
C*variant*us*dvorak-r*English (US) - English (Dvorak, right-handed)
C*variant*us*mac*English (US) - English (Macintosh)
C*variant*us*norman*English (US) - English (Norman)
C*variant*us*symbolic*English (US) - English (US, Symbolic)
C*variant*us*alt-intl*English (US) - English (US, alt. intl.)
C*variant*us*euro*English (US) - English (US, euro on 5)
C*variant*us*intl*English (US) - English (US, intl., with dead keys)
C*variant*us*workman*English (US) - English (Workman)
C*variant*us*workman-intl*English (US) - English (Workman, intl., with dead keys)
C*variant*us*dvorak-classic*English (US) - English (classic Dvorak)
C*variant*us*altgr-intl*English (US) - English (intl., with AltGr dead keys)
C*variant*us*dvp*English (US) - English (programmer Dvorak)
C*variant*us*olpc2*English (US) - English (the divide/multiply toggle the layout)
C*variant*us*haw*English (US) - Hawaiian
C*variant*us*rus*English (US) - Russian (US, phonetic)
C*variant*us*hbs*English (US) - Serbo-Croatian (US)
C*layout*epo*Esperanto
C*variant*epo**Esperanto
C*variant*epo*legacy*Esperanto - Esperanto (legacy)
C*layout*ee*Estonian
C*variant*ee**Estonian
C*variant*ee*dvorak*Estonian - Estonian (Dvorak)
C*variant*ee*us*Estonian - Estonian (US)
C*variant*ee*nodeadkeys*Estonian - Estonian (no dead keys)
C*layout*fo*Faroese
C*variant*fo**Faroese
C*variant*fo*nodeadkeys*Faroese - Faroese (no dead keys)
C*layout*ph*Filipino
C*variant*ph**Filipino
C*variant*ph*capewell-dvorak-bay*Filipino - Filipino (Capewell-Dvorak, Baybayin)
C*variant*ph*capewell-dvorak*Filipino - Filipino (Capewell-Dvorak, Latin)
C*variant*ph*capewell-qwerf2k6-bay*Filipino - Filipino (Capewell-QWERF 2006, Baybayin)
C*variant*ph*capewell-qwerf2k6*Filipino - Filipino (Capewell-QWERF 2006, Latin)
C*variant*ph*colemak-bay*Filipino - Filipino (Colemak, Baybayin)
C*variant*ph*colemak*Filipino - Filipino (Colemak, Latin)
C*variant*ph*dvorak-bay*Filipino - Filipino (Dvorak, Baybayin)
C*variant*ph*dvorak*Filipino - Filipino (Dvorak, Latin)
C*variant*ph*qwerty-bay*Filipino - Filipino (QWERTY, Baybayin)
C*layout*fi*Finnish
C*variant*fi**Finnish
C*variant*fi*mac*Finnish - Finnish (Macintosh)
C*variant*fi*winkeys*Finnish - Finnish (Windows)
C*variant*fi*classic*Finnish - Finnish (classic)
C*variant*fi*nodeadkeys*Finnish - Finnish (classic, no dead keys)
C*variant*fi*smi*Finnish - Northern Saami (Finland)
C*layout*fr*French
C*variant*fr**French
C*variant*fr*azerty*French - French (AZERTY)
C*variant*fr*afnor*French - French (AZERTY, AFNOR)
C*variant*fr*bepo*French - French (BEPO)
C*variant*fr*bepo_afnor*French - French (BEPO, AFNOR)
C*variant*fr*bepo_latin9*French - French (BEPO, Latin-9 only)
C*variant*fr*bre*French - French (Breton)
C*variant*fr*dvorak*French - French (Dvorak)
C*variant*fr*mac*French - French (Macintosh)
C*variant*fr*us*French - French (US)
C*variant*fr*oss*French - French (alt.)
C*variant*fr*oss_latin9*French - French (alt., Latin-9 only)
C*variant*fr*oss_nodeadkeys*French - French (alt., no dead keys)
C*variant*fr*latin9*French - French (legacy, alt.)
C*variant*fr*latin9_nodeadkeys*French - French (legacy, alt., no dead keys)
C*variant*fr*nodeadkeys*French - French (no dead keys)
C*variant*fr*geo*French - Georgian (France, AZERTY Tskapo)
C*variant*fr*oci*French - Occitan
C*layout*ca*French (Canada)
C*variant*ca**French (Canada)
C*variant*ca*multix*French (Canada) - Canadian (intl.)
C*variant*ca*multi*French (Canada) - Canadian (intl., 1st part)
C*variant*ca*multi-2gr*French (Canada) - Canadian (intl., 2nd part)
C*variant*ca*eng*French (Canada) - English (Canada)
C*variant*ca*fr-dvorak*French (Canada) - French (Canada, Dvorak)
C*variant*ca*fr-legacy*French (Canada) - French (Canada, legacy)
C*variant*ca*ike*French (Canada) - Inuktitut
C*layout*cd*French (Democratic Republic of the Congo)
C*variant*cd**French (Democratic Republic of the Congo)
C*layout*tg*French (Togo)
C*variant*tg**French (Togo)
C*layout*ge*Georgian
C*variant*ge**Georgian
C*variant*ge*mess*Georgian - Georgian (MESS)
C*variant*ge*ergonomic*Georgian - Georgian (ergonomic)
C*variant*ge*os*Georgian - Ossetian (Georgia)
C*variant*ge*ru*Georgian - Russian (Georgia)
C*layout*de*German
C*variant*de**German
C*variant*de*dvorak*German - German (Dvorak)
C*variant*de*e1*German - German (E1)
C*variant*de*e2*German - German (E2)
C*variant*de*mac*German - German (Macintosh)
C*variant*de*mac_nodeadkeys*German - German (Macintosh, no dead keys)
C*variant*de*neo*German - German (Neo 2)
C*variant*de*qwerty*German - German (QWERTY)
C*variant*de*T3*German - German (T3)
C*variant*de*us*German - German (US)
C*variant*de*deadacute*German - German (dead acute)
C*variant*de*deadgraveacute*German - German (dead grave acute)
C*variant*de*deadtilde*German - German (dead tilde)
C*variant*de*nodeadkeys*German - German (no dead keys)
C*variant*de*dsb*German - Lower Sorbian
C*variant*de*dsb_qwertz*German - Lower Sorbian (QWERTZ)
C*variant*de*ro*German - Romanian (Germany)
C*variant*de*ro_nodeadkeys*German - Romanian (Germany, no dead keys)
C*variant*de*ru*German - Russian (Germany, phonetic)
C*variant*de*tr*German - Turkish (Germany)
C*layout*at*German (Austria)
C*variant*at**German (Austria)
C*variant*at*mac*German (Austria) - German (Austria, Macintosh)
C*variant*at*nodeadkeys*German (Austria) - German (Austria, no dead keys)
C*layout*gr*Greek
C*variant*gr**Greek
C*variant*gr*extended*Greek - Greek (extended)
C*variant*gr*nodeadkeys*Greek - Greek (no dead keys)
C*variant*gr*polytonic*Greek - Greek (polytonic)
C*variant*gr*simple*Greek - Greek (simple)
C*layout*il*Hebrew
C*variant*il**Hebrew
C*variant*il*biblical*Hebrew - Hebrew (Biblical, Tiro)
C*variant*il*lyx*Hebrew - Hebrew (lyx)
C*variant*il*phonetic*Hebrew - Hebrew (phonetic)
C*layout*hu*Hungarian
C*variant*hu**Hungarian
C*variant*hu*qwerty*Hungarian - Hungarian (QWERTY)
C*variant*hu*101_qwerty_comma_dead*Hungarian - Hungarian (QWERTY, 101-key, comma, dead keys)
C*variant*hu*101_qwerty_comma_nodead*Hungarian - Hungarian (QWERTY, 101-key, comma, no dead keys)
C*variant*hu*101_qwerty_dot_dead*Hungarian - Hungarian (QWERTY, 101-key, dot, dead keys)
C*variant*hu*101_qwerty_dot_nodead*Hungarian - Hungarian (QWERTY, 101-key, dot, no dead keys)
C*variant*hu*102_qwerty_comma_dead*Hungarian - Hungarian (QWERTY, 102-key, comma, dead keys)
C*variant*hu*102_qwerty_comma_nodead*Hungarian - Hungarian (QWERTY, 102-key, comma, no dead keys)
C*variant*hu*102_qwerty_dot_dead*Hungarian - Hungarian (QWERTY, 102-key, dot, dead keys)
C*variant*hu*102_qwerty_dot_nodead*Hungarian - Hungarian (QWERTY, 102-key, dot, no dead keys)
C*variant*hu*101_qwertz_comma_dead*Hungarian - Hungarian (QWERTZ, 101-key, comma, dead keys)
C*variant*hu*101_qwertz_comma_nodead*Hungarian - Hungarian (QWERTZ, 101-key, comma, no dead keys)
C*variant*hu*101_qwertz_dot_dead*Hungarian - Hungarian (QWERTZ, 101-key, dot, dead keys)
C*variant*hu*101_qwertz_dot_nodead*Hungarian - Hungarian (QWERTZ, 101-key, dot, no dead keys)
C*variant*hu*102_qwertz_comma_dead*Hungarian - Hungarian (QWERTZ, 102-key, comma, dead keys)
C*variant*hu*102_qwertz_comma_nodead*Hungarian - Hungarian (QWERTZ, 102-key, comma, no dead keys)
C*variant*hu*102_qwertz_dot_dead*Hungarian - Hungarian (QWERTZ, 102-key, dot, dead keys)
C*variant*hu*102_qwertz_dot_nodead*Hungarian - Hungarian (QWERTZ, 102-key, dot, no dead keys)
C*variant*hu*nodeadkeys*Hungarian - Hungarian (no dead keys)
C*variant*hu*standard*Hungarian - Hungarian (standard)
C*layout*is*Icelandic
C*variant*is**Icelandic
C*variant*is*dvorak*Icelandic - Icelandic (Dvorak)
C*variant*is*mac*Icelandic - Icelandic (Macintosh)
C*variant*is*mac_legacy*Icelandic - Icelandic (Macintosh, legacy)
C*layout*in*Indian
C*variant*in**Indian
C*variant*in*ben*Indian - Bangla (India)
C*variant*in*ben_inscript*Indian - Bangla (India, Baishakhi InScript)
C*variant*in*ben_baishakhi*Indian - Bangla (India, Baishakhi)
C*variant*in*ben_bornona*Indian - Bangla (India, Bornona)
C*variant*in*ben_gitanjali*Indian - Bangla (India, Gitanjali)
C*variant*in*ben_probhat*Indian - Bangla (India, Probhat)
C*variant*in*eng*Indian - English (India, with rupee)
C*variant*in*guj*Indian - Gujarati
C*variant*in*bolnagri*Indian - Hindi (Bolnagri)
C*variant*in*hin-kagapa*Indian - Hindi (KaGaPa, phonetic)
C*variant*in*hin-wx*Indian - Hindi (Wx)
C*variant*in*iipa*Indian - Indic IPA
C*variant*in*kan*Indian - Kannada
C*variant*in*kan-kagapa*Indian - Kannada (KaGaPa, phonetic)
C*variant*in*mal*Indian - Malayalam
C*variant*in*mal_lalitha*Indian - Malayalam (Lalitha)
C*variant*in*mal_enhanced*Indian - Malayalam (enhanced InScript, with rupee)
C*variant*in*eeyek*Indian - Manipuri (Eeyek)
C*variant*in*mar-kagapa*Indian - Marathi (KaGaPa, phonetic)
C*variant*in*marathi*Indian - Marathi (enhanced InScript)
C*variant*in*olck*Indian - Ol Chiki
C*variant*in*ori*Indian - Oriya
C*variant*in*ori-bolnagri*Indian - Oriya (Bolnagri)
C*variant*in*ori-wx*Indian - Oriya (Wx)
C*variant*in*jhelum*Indian - Punjabi (Gurmukhi Jhelum)
C*variant*in*guru*Indian - Punjabi (Gurmukhi)
C*variant*in*san-kagapa*Indian - Sanskrit (KaGaPa, phonetic)
C*variant*in*tam*Indian - Tamil (InScript)
C*variant*in*tam_tamilnet_with_tam_nums*Indian - Tamil (TamilNet 99 with Tamil numerals)
C*variant*in*tam_tamilnet*Indian - Tamil (TamilNet 99)
C*variant*in*tam_tamilnet_TAB*Indian - Tamil (TamilNet 99, TAB encoding)
C*variant*in*tam_tamilnet_TSCII*Indian - Tamil (TamilNet 99, TSCII encoding)
C*variant*in*tel*Indian - Telugu
C*variant*in*tel-kagapa*Indian - Telugu (KaGaPa, phonetic)
C*variant*in*tel-sarala*Indian - Telugu (Sarala)
C*variant*in*urd-winkeys*Indian - Urdu (Windows)
C*variant*in*urd-phonetic3*Indian - Urdu (alt. phonetic)
C*variant*in*urd-phonetic*Indian - Urdu (phonetic)
C*layout*jv*Indonesian (Javanese)
C*variant*jv**Indonesian (Javanese)
C*layout*id*Indonesian (Latin)
C*variant*id**Indonesian (Latin)
C*variant*id*phoneticx*Indonesian (Latin) - Indonesian (Arab Pegon, extended phonetic)
C*layout*iq*Iraqi
C*variant*iq**Iraqi
C*variant*iq*ku_ara*Iraqi - Kurdish (Iraq, Arabic-Latin)
C*variant*iq*ku_f*Iraqi - Kurdish (Iraq, F)
C*variant*iq*ku_alt*Iraqi - Kurdish (Iraq, Latin Alt-Q)
C*variant*iq*ku*Iraqi - Kurdish (Iraq, Latin Q)
C*layout*ie*Irish
C*variant*ie**Irish
C*variant*ie*CloGaelach*Irish - CloGaelach
C*variant*ie*UnicodeExpert*Irish - Irish (UnicodeExpert)
C*variant*ie*ogam*Irish - Ogham
C*variant*ie*ogam_is434*Irish - Ogham (IS434)
C*layout*it*Italian
C*variant*it**Italian
C*variant*it*fur*Italian - Friulian (Italy)
C*variant*it*geo*Italian - Georgian (Italy)
C*variant*it*ibm*Italian - Italian (IBM 142)
C*variant*it*mac*Italian - Italian (Macintosh)
C*variant*it*us*Italian - Italian (US)
C*variant*it*winkeys*Italian - Italian (Windows)
C*variant*it*intl*Italian - Italian (intl., with dead keys)
C*variant*it*nodeadkeys*Italian - Italian (no dead keys)
C*variant*it*scn*Italian - Sicilian
C*layout*jp*Japanese
C*variant*jp**Japanese
C*variant*jp*dvorak*Japanese - Japanese (Dvorak)
C*variant*jp*kana86*Japanese - Japanese (Kana 86)
C*variant*jp*kana*Japanese - Japanese (Kana)
C*variant*jp*mac*Japanese - Japanese (Macintosh)
C*variant*jp*OADG109A*Japanese - Japanese (OADG 109A)
C*layout*nec_vndr/jp*Japanese (PC-98)
C*variant*nec_vndr/jp**Japanese (PC-98)
C*layout*kz*Kazakh
C*variant*kz**Kazakh
C*variant*kz*latin*Kazakh - Kazakh (Latin)
C*variant*kz*ext*Kazakh - Kazakh (extended)
C*variant*kz*kazrus*Kazakh - Kazakh (with Russian)
C*variant*kz*ruskaz*Kazakh - Russian (Kazakhstan, with Kazakh)
C*layout*kh*Khmer (Cambodia)
C*variant*kh**Khmer (Cambodia)
C*layout*kr*Korean
C*variant*kr**Korean
C*variant*kr*kr104*Korean - Korean (101/104-key compatible)
C*layout*kg*Kyrgyz
C*variant*kg**Kyrgyz
C*variant*kg*phonetic*Kyrgyz - Kyrgyz (phonetic)
C*layout*la*Lao
C*variant*la**Lao
C*variant*la*stea*Lao - Lao (STEA)
C*layout*lv*Latvian
C*variant*lv**Latvian
C*variant*lv*fkey*Latvian - Latvian (F)
C*variant*lv*adapted*Latvian - Latvian (adapted)
C*variant*lv*apostrophe*Latvian - Latvian (apostrophe)
C*variant*lv*ergonomic*Latvian - Latvian (ergonomic, ŪGJRMV)
C*variant*lv*modern*Latvian - Latvian (modern)
C*variant*lv*tilde*Latvian - Latvian (tilde)
C*layout*lt*Lithuanian
C*variant*lt**Lithuanian
C*variant*lt*ibm*Lithuanian - Lithuanian (IBM LST 1205-92)
C*variant*lt*lekp*Lithuanian - Lithuanian (LEKP)
C*variant*lt*lekpa*Lithuanian - Lithuanian (LEKPa)
C*variant*lt*ratise*Lithuanian - Lithuanian (Ratise)
C*variant*lt*us*Lithuanian - Lithuanian (US)
C*variant*lt*std*Lithuanian - Lithuanian (standard)
C*variant*lt*sgs*Lithuanian - Samogitian
C*layout*mk*Macedonian
C*variant*mk**Macedonian
C*variant*mk*nodeadkeys*Macedonian - Macedonian (no dead keys)
C*layout*my*Malay (Jawi, Arabic Keyboard)
C*variant*my**Malay (Jawi, Arabic Keyboard)
C*variant*my*phonetic*Malay (Jawi, Arabic Keyboard) - Malay (Jawi, phonetic)
C*layout*mt*Maltese
C*variant*mt**Maltese
C*variant*mt*alt-gb*Maltese - Maltese (UK, with AltGr overrides)
C*variant*mt*us*Maltese - Maltese (US)
C*variant*mt*alt-us*Maltese - Maltese (US, with AltGr overrides)
C*layout*mao*Maori
C*variant*mao**Maori
C*layout*md*Moldavian
C*variant*md**Moldavian
C*variant*md*gag*Moldavian - Moldavian (Gagauz)
C*layout*mn*Mongolian
C*variant*mn**Mongolian
C*layout*me*Montenegrin
C*variant*me**Montenegrin
C*variant*me*cyrillic*Montenegrin - Montenegrin (Cyrillic)
C*variant*me*cyrillicyz*Montenegrin - Montenegrin (Cyrillic, ZE and ZHE swapped)
C*variant*me*cyrillicalternatequotes*Montenegrin - Montenegrin (Cyrillic, with guillemets)
C*variant*me*latinyz*Montenegrin - Montenegrin (Latin, QWERTY)
C*variant*me*latinunicode*Montenegrin - Montenegrin (Latin, Unicode)
C*variant*me*latinunicodeyz*Montenegrin - Montenegrin (Latin, Unicode, QWERTY)
C*variant*me*latinalternatequotes*Montenegrin - Montenegrin (Latin, with guillemets)
C*layout*gn*NKo (AZERTY)
C*variant*gn**NKo (AZERTY)
C*layout*np*Nepali
C*variant*np**Nepali
C*layout*no*Norwegian
C*variant*no**Norwegian
C*variant*no*smi*Norwegian - Northern Saami (Norway)
C*variant*no*smi_nodeadkeys*Norwegian - Northern Saami (Norway, no dead keys)
C*variant*no*colemak*Norwegian - Norwegian (Colemak)
C*variant*no*dvorak*Norwegian - Norwegian (Dvorak)
C*variant*no*mac*Norwegian - Norwegian (Macintosh)
C*variant*no*mac_nodeadkeys*Norwegian - Norwegian (Macintosh, no dead keys)
C*variant*no*winkeys*Norwegian - Norwegian (Windows)
C*variant*no*nodeadkeys*Norwegian - Norwegian (no dead keys)
C*layout*ir*Persian
C*variant*ir**Persian
C*variant*ir*ku_ara*Persian - Kurdish (Iran, Arabic-Latin)
C*variant*ir*ku_f*Persian - Kurdish (Iran, F)
C*variant*ir*ku_alt*Persian - Kurdish (Iran, Latin Alt-Q)
C*variant*ir*ku*Persian - Kurdish (Iran, Latin Q)
C*variant*ir*pes_keypad*Persian - Persian (with Persian keypad)
C*layout*pl*Polish
C*variant*pl**Polish
C*variant*pl*csb*Polish - Kashubian
C*variant*pl*dvorak*Polish - Polish (Dvorak)
C*variant*pl*dvorak_altquotes*Polish - Polish (Dvorak, with Polish quotes on key 1)
C*variant*pl*dvorak_quotes*Polish - Polish (Dvorak, with Polish quotes on quotemark key)
C*variant*pl*qwertz*Polish - Polish (QWERTZ)
C*variant*pl*legacy*Polish - Polish (legacy)
C*variant*pl*dvp*Polish - Polish (programmer Dvorak)
C*variant*pl*ru_phonetic_dvorak*Polish - Russian (Poland, phonetic Dvorak)
C*variant*pl*szl*Polish - Silesian
C*layout*pt*Portuguese
C*variant*pt**Portuguese
C*variant*pt*nativo-epo*Portuguese - Esperanto (Portugal, Nativo)
C*variant*pt*mac*Portuguese - Portuguese (Macintosh)
C*variant*pt*mac_nodeadkeys*Portuguese - Portuguese (Macintosh, no dead keys)
C*variant*pt*nativo-us*Portuguese - Portuguese (Nativo for US keyboards)
C*variant*pt*nativo*Portuguese - Portuguese (Nativo)
C*variant*pt*nodeadkeys*Portuguese - Portuguese (no dead keys)
C*layout*br*Portuguese (Brazil)
C*variant*br**Portuguese (Brazil)
C*variant*br*nativo-epo*Portuguese (Brazil) - Esperanto (Brazil, Nativo)
C*variant*br*dvorak*Portuguese (Brazil) - Portuguese (Brazil, Dvorak)
C*variant*br*thinkpad*Portuguese (Brazil) - Portuguese (Brazil, IBM/Lenovo ThinkPad)
C*variant*br*nativo-us*Portuguese (Brazil) - Portuguese (Brazil, Nativo for US keyboards)
C*variant*br*nativo*Portuguese (Brazil) - Portuguese (Brazil, Nativo)
C*variant*br*nodeadkeys*Portuguese (Brazil) - Portuguese (Brazil, no dead keys)
C*layout*ro*Romanian
C*variant*ro**Romanian
C*variant*ro*winkeys*Romanian - Romanian (Windows)
C*variant*ro*std*Romanian - Romanian (standard)
C*layout*ru*Russian
C*variant*ru**Russian
C*variant*ru*bak*Russian - Bashkirian
C*variant*ru*cv*Russian - Chuvash
C*variant*ru*cv_latin*Russian - Chuvash (Latin)
C*variant*ru*xal*Russian - Kalmyk
C*variant*ru*kom*Russian - Komi
C*variant*ru*chm*Russian - Mari
C*variant*ru*os_winkeys*Russian - Ossetian (Windows)
C*variant*ru*os_legacy*Russian - Ossetian (legacy)
C*variant*ru*dos*Russian - Russian (DOS)
C*variant*ru*mac*Russian - Russian (Macintosh)
C*variant*ru*legacy*Russian - Russian (legacy)
C*variant*ru*phonetic*Russian - Russian (phonetic)
C*variant*ru*phonetic_azerty*Russian - Russian (phonetic, AZERTY)
C*variant*ru*phonetic_dvorak*Russian - Russian (phonetic, Dvorak)
C*variant*ru*phonetic_fr*Russian - Russian (phonetic, French)
C*variant*ru*phonetic_winkeys*Russian - Russian (phonetic, Windows)
C*variant*ru*phonetic_YAZHERTY*Russian - Russian (phonetic, YAZHERTY)
C*variant*ru*typewriter*Russian - Russian (typewriter)
C*variant*ru*typewriter-legacy*Russian - Russian (typewriter, legacy)
C*variant*ru*srp*Russian - Serbian (Russia)
C*variant*ru*tt*Russian - Tatar
C*variant*ru*udm*Russian - Udmurt
C*variant*ru*sah*Russian - Yakut
C*layout*rs*Serbian
C*variant*rs**Serbian
C*variant*rs*rue*Serbian - Pannonian Rusyn
C*variant*rs*yz*Serbian - Serbian (Cyrillic, ZE and ZHE swapped)
C*variant*rs*alternatequotes*Serbian - Serbian (Cyrillic, with guillemets)
C*variant*rs*latin*Serbian - Serbian (Latin)
C*variant*rs*latinyz*Serbian - Serbian (Latin, QWERTY)
C*variant*rs*latinunicode*Serbian - Serbian (Latin, Unicode)
C*variant*rs*latinunicodeyz*Serbian - Serbian (Latin, Unicode, QWERTY)
C*variant*rs*latinalternatequotes*Serbian - Serbian (Latin, with guillemets)
C*layout*lk*Sinhala (phonetic)
C*variant*lk**Sinhala (phonetic)
C*variant*lk*us*Sinhala (phonetic) - Sinhala (US)
C*variant*lk*tam_unicode*Sinhala (phonetic) - Tamil (Sri Lanka, TamilNet 99)
C*variant*lk*tam_TAB*Sinhala (phonetic) - Tamil (Sri Lanka, TamilNet 99, TAB encoding)
C*layout*sk*Slovak
C*variant*sk**Slovak
C*variant*sk*qwerty*Slovak - Slovak (QWERTY)
C*variant*sk*qwerty_bksl*Slovak - Slovak (QWERTY, extended backslash)
C*variant*sk*bksl*Slovak - Slovak (extended backslash)
C*layout*si*Slovenian
C*variant*si**Slovenian
C*variant*si*us*Slovenian - Slovenian (US)
C*variant*si*alternatequotes*Slovenian - Slovenian (with guillemets)
C*layout*es*Spanish
C*variant*es**Spanish
C*variant*es*ast*Spanish - Asturian (Spain, with bottom-dot H and L)
C*variant*es*cat*Spanish - Catalan (Spain, with middle-dot L)
C*variant*es*dvorak*Spanish - Spanish (Dvorak)
C*variant*es*mac*Spanish - Spanish (Macintosh)
C*variant*es*winkeys*Spanish - Spanish (Windows)
C*variant*es*deadtilde*Spanish - Spanish (dead tilde)
C*variant*es*nodeadkeys*Spanish - Spanish (no dead keys)
C*layout*latam*Spanish (Latin American)
C*variant*latam**Spanish (Latin American)
C*variant*latam*colemak-gaming*Spanish (Latin American) - Spanish (Latin American, Colemak for gaming)
C*variant*latam*colemak*Spanish (Latin American) - Spanish (Latin American, Colemak)
C*variant*latam*dvorak*Spanish (Latin American) - Spanish (Latin American, Dvorak)
C*variant*latam*deadtilde*Spanish (Latin American) - Spanish (Latin American, dead tilde)
C*variant*latam*nodeadkeys*Spanish (Latin American) - Spanish (Latin American, no dead keys)
C*layout*ke*Swahili (Kenya)
C*variant*ke**Swahili (Kenya)
C*variant*ke*kik*Swahili (Kenya) - Kikuyu
C*layout*tz*Swahili (Tanzania)
C*variant*tz**Swahili (Tanzania)
C*layout*se*Swedish
C*variant*se**Swedish
C*variant*se*smi*Swedish - Northern Saami (Sweden)
C*variant*se*rus*Swedish - Russian (Sweden, phonetic)
C*variant*se*rus_nodeadkeys*Swedish - Russian (Sweden, phonetic, no dead keys)
C*variant*se*dvorak*Swedish - Swedish (Dvorak)
C*variant*se*us_dvorak*Swedish - Swedish (Dvorak, intl.)
C*variant*se*mac*Swedish - Swedish (Macintosh)
C*variant*se*svdvorak*Swedish - Swedish (Svdvorak)
C*variant*se*us*Swedish - Swedish (US)
C*variant*se*nodeadkeys*Swedish - Swedish (no dead keys)
C*variant*se*swl*Swedish - Swedish Sign Language
C*layout*ch*Switzerland
C*variant*ch**Switzerland
C*variant*ch*fr*Switzerland - French (Switzerland)
C*variant*ch*fr_mac*Switzerland - French (Switzerland, Macintosh)
C*variant*ch*fr_nodeadkeys*Switzerland - French (Switzerland, no dead keys)
C*variant*ch*de_mac*Switzerland - German (Switzerland, Macintosh)
C*variant*ch*legacy*Switzerland - German (Switzerland, legacy)
C*variant*ch*de_nodeadkeys*Switzerland - German (Switzerland, no dead keys)
C*layout*tw*Taiwanese
C*variant*tw**Taiwanese
C*variant*tw*saisiyat*Taiwanese - Saisiyat (Taiwan)
C*variant*tw*indigenous*Taiwanese - Taiwanese (indigenous)
C*layout*tj*Tajik
C*variant*tj**Tajik
C*variant*tj*legacy*Tajik - Tajik (legacy)
C*layout*th*Thai
C*variant*th**Thai
C*variant*th*pat*Thai - Thai (Pattachote)
C*variant*th*tis*Thai - Thai (TIS-820.2538)
C*layout*bw*Tswana
C*variant*bw**Tswana
C*layout*tr*Turkish
C*variant*tr**Turkish
C*variant*tr*crh_alt*Turkish - Crimean Tatar (Turkish Alt-Q)
C*variant*tr*crh_f*Turkish - Crimean Tatar (Turkish F)
C*variant*tr*crh*Turkish - Crimean Tatar (Turkish Q)
C*variant*tr*ku_f*Turkish - Kurdish (Turkey, F)
C*variant*tr*ku_alt*Turkish - Kurdish (Turkey, Latin Alt-Q)
C*variant*tr*ku*Turkish - Kurdish (Turkey, Latin Q)
C*variant*tr*otk*Turkish - Old Turkic
C*variant*tr*ot*Turkish - Ottoman
C*variant*tr*otf*Turkish - Ottoman (F)
C*variant*tr*alt*Turkish - Turkish (Alt-Q)
C*variant*tr*f*Turkish - Turkish (F)
C*variant*tr*intl*Turkish - Turkish (intl., with dead keys)
C*layout*tm*Turkmen
C*variant*tm**Turkmen
C*variant*tm*alt*Turkmen - Turkmen (Alt-Q)
C*layout*ua*Ukrainian
C*variant*ua**Ukrainian
C*variant*ua*rstu_ru*Ukrainian - Russian (Ukraine, standard RSTU)
C*variant*ua*winkeys*Ukrainian - Ukrainian (Windows)
C*variant*ua*homophonic*Ukrainian - Ukrainian (homophonic)
C*variant*ua*legacy*Ukrainian - Ukrainian (legacy)
C*variant*ua*phonetic*Ukrainian - Ukrainian (phonetic)
C*variant*ua*rstu*Ukrainian - Ukrainian (standard RSTU)
C*variant*ua*typewriter*Ukrainian - Ukrainian (typewriter)
C*layout*pk*Urdu (Pakistan)
C*variant*pk**Urdu (Pakistan)
C*variant*pk*ara*Urdu (Pakistan) - Arabic (Pakistan)
C*variant*pk*snd*Urdu (Pakistan) - Sindhi
C*variant*pk*urd-crulp*Urdu (Pakistan) - Urdu (Pakistan, CRULP)
C*variant*pk*urd-nla*Urdu (Pakistan) - Urdu (Pakistan, NLA)
C*layout*uz*Uzbek
C*variant*uz**Uzbek
C*variant*uz*latin*Uzbek - Uzbek (Latin)
C*layout*vn*Vietnamese
C*variant*vn**Vietnamese
C*variant*vn*fr*Vietnamese - Vietnamese (French)
C*variant*vn*us*Vietnamese - Vietnamese (US)
C*layout*sn*Wolof
C*variant*sn**Wolof
EOF
}

# all_kbdnames () {
#  cat <<'EOF' 
# C*model*logidinovo*Logitech diNovo Keyboard
# C*model*amiga*Amiga
# ...
# zh_TW*layout*al*阿爾巴尼亞
# zh_TW*variant*al**阿爾巴尼亞
# EOF
# }



keyboard_present () {
    local kern kbdpattern class subclass protocol

    kern=`uname -r`
    case "$kern" in
	2.0*|2.1*|2.2*|2.3*|2.4*|2.5*)
	    # can't check keyboard presence
	    return 0; 
	    ;;
    esac

    [ -d /sys/bus/usb/devices ] || return 0
    for d in /sys/bus/usb/devices/*:*; do
	[ -d "$d" ] || continue
	class=$(cat "$d/bInterfaceClass") # 03 = Human Interface Device
	subclass=$(cat "$d/bInterfaceSubClass") # 01 = Boot Interface Subclass
	protocol=$(cat "$d/bInterfaceProtocol") # 01 = Keyboard
	case "$class:$subclass:$protocol" in
	    03:01:01)
		return 0
		;;
	esac
    done

    # For Bluetooth keyboards one has to check the class of the device
    # -- it has to be 0x000540 or 0x002540.  I don't how to make the
    # required test, so instead we test (unreliably) for a string
    # bluetooth.*keyboard in /proc/bus/input/devices.

    [ -f /proc/bus/input/devices ] || return 0
    kbdpattern="AT Set \|AT Translated Set\|AT Raw Set"
    kbdpattern="$kbdpattern\|Atari Keyboard"
    kbdpattern="$kbdpattern\|Amiga Keyboard"
    kbdpattern="$kbdpattern\|HIL keyboard"
    kbdpattern="$kbdpattern\|ADB keyboard"
    kbdpattern="$kbdpattern\|Sun Type"
    kbdpattern="$kbdpattern\|bluetooth.*keyboard"
    if grep -i "$kbdpattern" /proc/bus/input/devices >/dev/null; then
	return 0
    fi

    return 1
}

# keyboard_present () {
#     if there is a keyboard; then
# 	return 0
#     else
# 	return 1
#     fi
# }

######################################################################
#    Function ask_debconf.  Ask the user to choose amongst the options
#    listed in $kbdnames.
######################################################################

ask_debconf () {
    local template priority prefix default_code default_description choices add

    # The template to ask
    template="$1"
    # The priority for the question
    priority="$2"
    # The prefix for $kbdnames
    prefix="$(echo "$3"|regex_pattern_escape)"
    # The default choice (optional)
    default_code="$(echo "$4"|regex_pattern_escape)"
    # Additional string to append to $kbdnames
    add="$(echo "$5"|regex_escape)"
    add="
$add"

    choices1=`echo "$kbdnames" | grep "^$prefix\*" | 
        sed -e "s/^$prefix\*[^\*]*\*//" -e 's/,/\\\\,/g' | sort`
    choices2=`echo "$add" | grep "^$prefix\*" | 
        sed -e "s/^$prefix\*[^\*]*\*//" -e 's/,/\\\\,/g'`
    choices=`echo "$choices1
$choices2" | sed -e 's/$/,/'`
    choices=`echo $choices | sed 's/, *$//' | regex_unescape`

    choices=`echo $choices | sed 's/,$//'`

    if echo "$choices" | grep '[^\\\\],' >/dev/null; then
	db_subst $template CHOICES "$choices"
	default_description=`echo "$kbdnames$add" |  
            grep "^$prefix\*${default_code}\*" |
            sed -e "s/^$prefix\*${default_code}\*//" |
	    regex_unescape`
	if [ -z "$default_description" ]; then
	    # For XkbVariant the empty string is usually a sensible default
	    default_description=`echo "$kbdnames$add" |  
                grep "^$prefix\*\*" |
		sed -e "s/^$prefix\*\*//" |
		regex_unescape `
	fi
	if [ -n "$default_description" ]; then
	    db_default $template "$default_description"
	elif [ -n "$default_code" ]; then
	    # A default was requested, but we couldn't resolve it to a
	    # description, so we'd better ask.
	    priority=critical
	fi
	
        db_input $priority $template || true
	db_go || return 255
	db_get $template
    else
	# There is only one choice - no need to use debconf
	[ $STATE -gt $old_state ] || return 255
	RET=$(echo "$choices"|sed 's/ *$//')
    fi

    RET=`echo "$RET" | regex_pattern_escape`
    RET=`echo "$kbdnames$add" | grep "^$prefix\*[^\*]*\*" |
             sed 's/  */ /g' |
             grep "\*$RET\$" |
             sed -e "s/^$prefix\*\([^\*]*\)\*.*/\1/" |
	     regex_unescape`
    return 0
}

######################################################################
#    Function guess_arch - detect the architecture and subarchitecture
######################################################################

# The guess arch code is taken from "console-data.conf"
# (translated from Perl to shell)

# SUBARCH	KEYMAP SET	DETECTION
# m68k/atari	atari		"Model: Atari"
# m68k/amiga	amiga		"Model: Amiga"
# m68k/mac	mac		"Model: Macintosh"
# m68k/mvme	pc		"Model: Motorola"
# m68k/bvme	pc		"Model: BVME[46]000"
# m68k/{sun,apollo,next,q40,hp300} Not supported by Debian

# ppc/apus	amiga		"machine: Amiga"
# ppc/chrp	pc,mac		"machine: CHRP"
# ppc/pmac	mac		"machine: PowerMac|[Pp]ower[Bb]ook*|Power|iMac*|PowerMac1*"
# ppc/prep	pc		"machine: PReP"
# ppc/ps3	pc		"platform: PS3"
# ppc/cell	pc		"platform: Cell"
# ppc/{bbox,mbx,ppc64,82xx,8xx} Not yet supported by Debian

# arm/*		pc		(refered to as 'arm' only)

guess_arch () {
    local arch subarch line

    if which archdetect 2>/dev/null >/dev/null; then
	archdetect
	return 0
    fi

    arch=`dpkg --print-architecture`
    
    if [ "$arch" = 'powerpc' -o "$arch" = 'm68k' ]; then
	if [ "$arch" = powerpc ]; then
	    line=`sed -n 's/^platform.*: *//p' /proc/cpuinfo`
	    if [ "$line" = PS3 ] || [ "$line" = Cell ]; then
		subarch=`echo $line|tr A-Z a-z`
	    else
		line=`sed -n 's/^machine.*: *//p' /proc/cpuinfo`
		if [ "$line" = '' ]; then
		    echo unknown
		    return 0
		fi
		subarch=`echo $line|tr A-Z a-z`
	    fi
	elif [ "$arch" = m68k ]; then
	    line=`sed -n 's/^Model.*: *//p' /proc/hardware`
	    if [ "$line" = '' ]; then
		echo unknown
		return 0
	    fi
	    subarch=`echo $line|tr A-Z a-z`
	fi
	case "$subarch" in
	    *amiga*)
		subarch=amiga
		;;
	    *chrp*)
		subarch=chrp
		;;
	    *prep*)
		subarch=prep
		;;
	    *macintosh*|*powermac*|*powerbook*|*power*|*imac*|*powermac1*)
		subarch=mac
		;;
	    *atari*)
		subarch=atari
		;;
	    *motorola*)
		subarch=mvme
		;;
	    *bvme*)
		subarch=bvme
		;;
	    *)
		subarch=`echo $subarch|sed  's/^\s*//'`
		;;
	esac
	arch="$arch/$subarch"
    fi
    echo $arch
    return 0
}

#########################################################################
# Set $locale.  Extract the strings for the chosen language in $kbdnames
#########################################################################

if which locale 2>/dev/null >/dev/null; then
    eval `locale`
fi

if [ "$LC_CTYPE"  -a "$LC_CTYPE" != C ]; then
    locale=$LC_CTYPE
elif db_get debian-installer/locale && [ "$RET" ]; then
    locale="$RET"
else
    locale=C
fi

langcountry="$locale"
if ! type locale >/dev/null 2>&1 || [ "$OVERRIDE_USE_DEBCONF_LOCALE" ]; then
    if db_get localechooser/languagelist && [ "$RET" ]; then
	lang="$RET"
	if db_get debian-installer/country && [ "$RET" ]; then
	    langcountry="${lang}_$RET"
	fi
    fi
fi

if [ "$LC_MESSAGES"  -a "$LC_MESSAGES" != C ]; then
    messages=$LC_MESSAGES
elif db_get debian-installer/locale && [ "$RET" ]; then
    messages="$RET"
else
    messages=C
fi

messages_lang=$(echo $messages | sed 's/_.*//')
messages_country=$(echo $messages | sed 's/.*_//;s/\..*//;s/@.*//')
messages_modif=
echo $messages | grep -v -q @ || messages_modif=$(echo $messages | sed 's/.*@//')

lang_kbdnames () {
    all_kbdnames | \
	regex_escape | \
	grep "^$1[*]" | \
	sed "s/^$1[*]//"
}

kbdnames=$(lang_kbdnames ${messages_lang}_${messages_country}__${messages_modif})
[ -n "$kbdnames" ] || kbdnames=$(lang_kbdnames ${messages_lang}_${messages_country}__${messages_modif})
[ -n "$kbdnames" ] || kbdnames=$(lang_kbdnames ${messages_lang}_${messages_country})
[ -n "$kbdnames" ] || kbdnames=$(lang_kbdnames ${messages_lang})
[ -n "$kbdnames" ] || kbdnames=$(lang_kbdnames C)

if [ "$is_not_debian_installer" ]; then
    if \
        ! which iconv >/dev/null \
        || ! kbdnames="$(echo "$kbdnames" |
                iconv -f UTF-8 -t $(locale charmap)//TRANSLIT)"
    then
        kbdnames=$(lang_kbdnames C)
    fi
fi

######################################################################
#    Compute default values for $XKBMODEL, $XKBLAYOUT, $XKBVARIANT
#    based on the architecture and the locale.
######################################################################

arch=`guess_arch`
case "$arch" in
    alpha*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    amd64*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    arm*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    i386*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    hppa*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    ia64*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    m68k/amiga)
	XKBMODEL=amiga
	model_priority=medium
	;;
    m68k/atari)
	XKBMODEL=ataritt
	model_priority=medium
	;;
    m68k/mac)
	XKBMODEL=macintosh
	model_priority=medium
	;;
    m68k/sun*)
	XKBMODEL=pc105 # UNKNOWN: sun4, sun5 or pc105
	model_priority=critical
	;;
    m68k/*vme*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    mips*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    powerpc/amiga)
	XKBMODEL=amiga
	model_priority=medium
	;;
    powerpc/apus)
	XKBMODEL=amiga
	model_priority=medium
	;;
    powerpc/chrp*)
	XKBMODEL=pc105 # UNKNOWN: pc105, macintosh or maybe amiga
	model_priority=critical
	;;
    powerpc/mac)
	XKBMODEL=pc105
	model_priority=medium
	;;
    powerpc/pasemi)
	XKBMODEL=pc105
	model_priority=medium
	;;
    powerpc/powermac*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    powerpc/prep)
	XKBMODEL=pc105
	model_priority=medium
	;;
    powerpc/ps3|powerpc/cell)
	XKBMODEL=pc105
	model_priority=medium
	;;
    ppc64el/*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    sparc*)
	XKBMODEL=pc105 # sun4 or sun5 on older kernels
	model_priority=medium
	;;
    s390*)
	XKBMODEL=pc105
	model_priority=medium
	;;
    *)
	XKBMODEL=pc105 # UNKNOWN
	model_priority=critical
	;;
esac    

layout_priority=high
case "$langcountry" in
    # Keyboards for countries
    *_AL*)
	XKBLAYOUT=al  # Albania
	;;
    *_AZ*)
	XKBLAYOUT=az  # Azerbaijan
	;;
    *_BD*)
	XKBLAYOUT=us,bd  # Bangladesh
	;;
    *_BE*)
	XKBLAYOUT=be  # Belgium
	;;
    *_BG*)
	XKBLAYOUT=us,bg  # Bulgaria
	layout_priority=critical
	;;
    *_BR*)
	XKBLAYOUT=br  # Brazil
	;;
    *_BT*)
	XKBLAYOUT=us,bt  # Bhutan
	;;
    *_BY*)
	XKBLAYOUT=us,by  # Belarus
	;;
    fr_CA*)
	XKBLAYOUT=ca  # Canada
	;;
    *_CA*)
	XKBLAYOUT=us  # U.S. English
	;;
    de_CH*)
	XKBLAYOUT=ch  # Switzerland
	;;
    fr_CH*)
	XKBLAYOUT=ch  # Switzerland
	XKBVARIANT=fr # French
	;;
    *_CH*)
	XKBLAYOUT=ch  # Switzerland
	layout_priority=critical
	;;
    *_CZ*)
	XKBLAYOUT=cz  # Czechia
	layout_priority=critical
	;;
    *_DK*)
	XKBLAYOUT=dk  # Denmark
	;;
    *_EE*)
	XKBLAYOUT=ee  # Estonia
	;;
    ast_ES*)
	XKBLAYOUT=es  # Spain
	XKBVARIANT=ast # Asturian
	;;
    bo_*)
	XKBLAYOUT=us,cn  # China
	XKBVARIANT=,tib # Tibetan
	;;
    ca_ES*)
	XKBLAYOUT=es  # Spain
	XKBVARIANT=cat # Catalan
	;;
    *_ES*)
	XKBLAYOUT=es  # Spain
	;;
    *_ET*)
	XKBLAYOUT=us,et  # Ethiopia
	;;
    se_FI*)
	XKBLAYOUT=fi  # Finland
	XKBVARIANT=smi # Northern Saami
	;;
    *_FI*)
	XKBLAYOUT=fi  # Finland
	;;
    *_FR*)
	XKBLAYOUT=fr  # French
	XKBVARIANT=latin9
	;;
    *_GB*)
	XKBLAYOUT=gb  # United Kingdom
	;;
    *_GG*)
	XKBLAYOUT=gb  # United Kingdom
	;;
    *_HU*)
	XKBLAYOUT=hu  # Hungary
	;;
    *_IE*)
	XKBLAYOUT=ie  # Ireland
	;;
    *_IL*)
	XKBLAYOUT=us,il  # Israel
	layout_priority=critical
	;;
    *_IM*)
	XKBLAYOUT=gb  # United Kingdom
	;;
    *_IR*)
	XKBLAYOUT=us,ir  # Iran
	;;
    *_IS*)
	XKBLAYOUT=is  # Iceland
	;;
    *_IT*)
	XKBLAYOUT=it  # Italy
	;;
    *_JE*)
	XKBLAYOUT=gb  # United Kingdom
	;;
    *_JP*)
	XKBLAYOUT=jp  # Japan
	;;
    *_LT*)
	XKBLAYOUT=lt  # Lithuania
	layout_priority=critical
	;;
    *_LV*)
	XKBLAYOUT=lv  # Latvia
	;;
    *_KG*)
	XKBLAYOUT=us,kg  # Kyrgyzstan
	;;
    *_KH*)
	XKBLAYOUT=us,kh  # Cambodia
	;;
    *_KR*)
	XKBLAYOUT=kr      # South Korea
	XKBVARIANT=kr104  # pc104 compatible mode, safe choice
	;;
    *_KZ*)
	XKBLAYOUT=us,kz  # Kazakhstan
	;;
    *_LK*)
	XKBLAYOUT=us,lk  # Sri Lanka
	;;
    *_MA*)
	XKBLAYOUT=us,ma  # Morocco
	;;
    *_MK*)
	XKBLAYOUT=us,mk  # Macedonia
	;;
# According to https://launchpad.net/bugs/129982, Dutch users prefer the US
# intl keymap.
    *_NL*)
	XKBLAYOUT=us  # Netherlands
	XKBVARIANT=intl # International (with dead keys)
	;;
    *_MM*)
	XKBLAYOUT=us,mm  # Myanmar
	;;
    *_MN*)
	XKBLAYOUT=us,mn  # Mongolia
	;;
    *_MT*)
	XKBLAYOUT=mt  # Malta
	layout_priority=critical
	;;
    se_NO*)
	XKBLAYOUT=no  # Norway
	XKBVARIANT=smi # Northern Saami
	;;
    *_NO*)
	XKBLAYOUT=no  # Norway (se_NO is not in this case)
	;;
    *_NP*)
	XKBLAYOUT=us,np  # Nepal
	;;
    *_PH*)
	XKBLAYOUT=ph  # Philipines
	;;
    *_PL*)
	XKBLAYOUT=pl  # Poland
	;;
    *_PT*)
	XKBLAYOUT=pt  # Portugal
	;;
    *_RO*)
	XKBLAYOUT=ro  # Romania
	;;
    *_RU*)
	XKBLAYOUT=us,ru  # Russia
	layout_priority=critical
	;;
    se_SE*)
	XKBLAYOUT=se  # Sweden
	XKBVARIANT=smi # Northern Saami
	;;
    *_SK*)
	XKBLAYOUT=sk  # Slovakia
	;;
    *_SI*)
	XKBLAYOUT=si  # Slovenia
	;;
    tg_*)
	XKBLAYOUT=us,tj  # Tajik
	;;
    *_TJ*)
	XKBLAYOUT=us,tj  # Tajikistan
	;;
    *_TH*)
	XKBLAYOUT=us,th  # Thailand
	layout_priority=critical
	;;
    ku_TR*)
	XKBLAYOUT=tr  # Turkish
	XKBVARIANT=ku # Kurdish, Latin Q
	;;
    *_TR*)
	XKBLAYOUT=tr  # Turkish
	layout_priority=critical
	;;
    *_UA*)
	XKBLAYOUT=us,ua  # Ukraine
	;;
    en_US*)
	XKBLAYOUT=us  # U.S. English
	;;
# According to https://launchpad.net/bugs/191451, most keyboards in Vietnam
# are in fact US keyboards.
    *_VN*)
	XKBLAYOUT=us  # Vietnam
	;;
    *_ZA*)
	XKBLAYOUT=za  # South Africa
	;;
    # Keyboards for specific languages and international keyboards:
    # TODO: Is the following list correct?
    *_AR*|*_BO*|*_CL*|*_CO*|*_CR*|*_DO*|*_EC*|*_GT*|*_HN*|*_MX*|*_NI*|*_PA*|*_PE*|es_PR*|*_PY*|*_SV*|es_US*|*_UY*|*_VE*)
	XKBLAYOUT=latam # Latin American
	;;
    ar_*)
	XKBLAYOUT=us,ara # Arabic
	;;
    bn_*)
	XKBLAYOUT=us,in  # India
	XKBVARIANT=,ben # Bengali
	;;
    bs_*)
	XKBLAYOUT=ba  # Bosnia and Herzegovina
	;;
    de_LI*)
	XKBLAYOUT=ch  # Liechtenstein
	;;
    de_*)
	XKBLAYOUT=de  # Germany
	;;
    el_*)
	XKBLAYOUT=us,gr  # Greece
	;;
    eo|eo.*|eo_*|eo\@*)
	XKBLAYOUT=epo  # Esperanto
	layout_priority=critical
	;;
    fr_*)
	XKBLAYOUT=fr  # France
	XKBVARIANT=oss # Alternative
	layout_priority=critical
	;;
    gu_*)
	XKBLAYOUT=us,in  # India
	XKBVARIANT=,guj # Gujarati
	;;
    hi_*)
	XKBLAYOUT=us,in  # India
	;;
    hr_*)
	XKBLAYOUT=hr  # Croatia
	;;
    hy_*)
	XKBLAYOUT=us,am  # Armenia
	;;
    ka_*)
	XKBLAYOUT=us,ge  # Georgia
	layout_priority=critical
	;;
    kab_*)
	XKBLAYOUT=dz  # Algeria
	XKBVARIANT=la # Berber (Latin)
	;;
    kn_*)
	XKBLAYOUT=us,in  # India
	XKBVARIANT=,kan # Kannada
	;;
    ku_*)
	XKBLAYOUT=tr  # Turkish
	XKBVARIANT=ku # Kurdish
	layout_priority=critical
	;;
    lo_*)
	XKBLAYOUT=us,la  # Laos
	;;
    mr_*)
	XKBLAYOUT=us,in  # India
	;;
    ml_*)
	XKBLAYOUT=us,in  # India
	XKBVARIANT=,mal # Malayalam
	;;
    my_*)
	XKBLAYOUT=us,mm  # Burmese
	;;
    ne_*)
	XKBLAYOUT=us,np  # Nepali
	;;
    os_*)
	XKBLAYOUT=ru  # Russia
	XKBVARIANT=os  # Ossetian
	;;
    pa_*)
	XKBLAYOUT=us,in  # India
	XKBVARIANT=,guru # Gurmukhi
	;;
    si_*)
	XKBLAYOUT=us,si  # Sri Lanka
	XKBVARIANT=,sin_phonetic # Sinhala
	;;
    sr_*)
	XKBLAYOUT=rs,rs  # Serbia and Montenegro
	XKBVARIANT=latin,
	layout_priority=critical
	;;
    sv_*)
	XKBLAYOUT=se  # Sweden
	;;
    ta_*)
	XKBLAYOUT=us,in  # India
	XKBVARIANT=,tam # Tamil
	;;
    te_*)
	XKBLAYOUT=us,in  # India
	XKBVARIANT=,tel # Telugu
	;;
    tg_*)
	XKBLAYOUT=us,tj  # Tajikistan
	;;
    the_*)
	XKBLAYOUT=us,np  # Nepali keymap for Tharu
	;;
    tl_*)
	XKBLAYOUT=ph  # Philipines
	;;
    ug_*)
	XKBLAYOUT=us,cn  # China
	XKBVARIANT=,ug # Uyghur
	;;
    zh_*)
	XKBLAYOUT=cn  # Chinese
	;;
    # Fallback
    *)
	XKBLAYOUT=us
	;;
esac

######################################################################
#    Overwrite (some of) the computed default values by:
#    - preseeded values (for the udeb);
#    - the value of debian-installer/keymap
#    - the contents of /etc/X11/xorg.conf
#    - the settings in the configuration files (/etc/default/...).
#    - correct some bugs of previous versions of console-setup
######################################################################

# Get defaults from debconf, to allow preseeding in the udeb
if db_get keyboard-configuration/modelcode && [ "$RET" ]; then
    XKBMODEL="$RET"
fi
if db_get keyboard-configuration/layoutcode && [ "$RET" ]; then
    # Don't use the default variant if the layout is being overridden.
    if [ "$RET" != "$XKBLAYOUT" ]; then
	XKBVARIANT=''
    fi
    XKBLAYOUT="$RET"
    if db_fget keyboard-configuration/layoutcode seen && [ "$RET" = true ]; then
	layout_priority=medium
	db_set console-setup/ask_detect false
	db_fset console-setup/ask_detect seen true
    fi
fi
if db_get keyboard-configuration/variantcode && [ "$RET" ]; then
    XKBVARIANT="$RET"
fi
if db_get keyboard-configuration/optionscode && [ "$RET" ]; then
    XKBOPTIONS="$RET"
fi

# Use the value of console-data debian-installer/keymap to get better default
# layout.  This guesswork is copied from xserver-xorg.config.
# Lower the priority of the Debconf question to medium.
if db_get debian-installer/keymap && [ "$RET" ]; then
    di_keymap="${RET##mac-usb-}"
    di_keymap="${di_keymap%%-latin1}"
    
    old_xkbvariant="$XKBVARIANT"
    XKBVARIANT=''
    old_layout_priority=$layout_priority
    layout_priority=medium
    case "$di_keymap" in
	be2) XKBLAYOUT="be";;
	bg) XKBLAYOUT="us,bg";;
	br) XKBLAYOUT="us"; XKBVARIANT="intl";;
	br-abnt2) XKBLAYOUT="br"; XKBVARIANT="abnt2";;
	by) XKBLAYOUT="us,by";;
	cf) XKBLAYOUT="ca"; XKBVARIANT="fr";;
	croat) XKBLAYOUT="hr";;
	cz-lat2) XKBLAYOUT="cz";;
	de-latin1-nodeadkeys) XKBLAYOUT="de"; XKBVARIANT="nodeadkeys";;
	de) XKBLAYOUT="de";;
	dvorak) XKBLAYOUT="us"; XKBVARIANT="dvorak";;
	dk) XKBLAYOUT="dk";;
	es) XKBLAYOUT="es";;
	et) XKBLAYOUT="ee";;
	'fi') XKBLAYOUT="fi";;
	fr-latin9) XKBLAYOUT="fr"; XKBVARIANT="latin9";;
	fr_CH) XKBLAYOUT="ch"; XKBVARIANT="fr";;
	fr) XKBLAYOUT="fr";;
	hebrew) XKBLAYOUT="us,il";;
	hu) XKBLAYOUT="hu";;
	gb) XKBLAYOUT="gb";;
	is) XKBLAYOUT="is";;
	it) XKBLAYOUT="it";;
	jp106) XKBLAYOUT="jp"; XKBVARIANT="106";;
	kr|kr106) XKBLAYOUT="kr"; XKBVARIANT='';;
	kr104) XKBLAYOUT="kr"; XKBVARIANT="kr104";;
	la) XKBLAYOUT="latam";;
	lt) XKBLAYOUT="lt";; 
	lv-latin4) XKBLAYOUT="lv";;
	mac-us-std) XKBLAYOUT="us";;
	mac-de2-ext) XKBLAYOUT="de"; XKBVARIANT="nodeadkeys";;
	mac-fr2-ext) XKBLAYOUT="fr";;
	mac-fr3) XKBLAYOUT="fr";;
	mac-es) XKBLAYOUT="es";;
	ky) XKBLAYOUT="us,kg";;
	mk) XKBLAYOUT="us,mk";;
	nl) XKBLAYOUT="nl";;
	no) XKBLAYOUT="no";;
	pl) XKBLAYOUT="pl";;
	pt) XKBLAYOUT="pt";;
	ro) XKBLAYOUT="ro";;
	ru) XKBLAYOUT="us,ru";;
	se) XKBLAYOUT="se";;
	sg) XKBLAYOUT="ch"; XKBVARIANT="de";;
	sk-qwerty) XKBLAYOUT="sk"; XKBVARIANT="qwerty";;
	slovene) XKBLAYOUT="si";;
	sr-cy) XKBLAYOUT="rs,rs"; XKBVARIANT="latin," ;;
	trf|trfu) XKBLAYOUT="tr"; XKBVARIANT="f";;
	trq|trqu) XKBLAYOUT="tr";;
	ua) XKBLAYOUT="us,ua";;
	uk) XKBLAYOUT="gb";;
	us) XKBLAYOUT="us";;
	*) 
	    XKBVARIANT="$old_xkbvariant"
	    layout_priority=$old_layout_priority
	    ;;
    esac
fi

# Get default layout from xorg.conf if available
# Lower the priority of the Debconf question to medium.
if \
    [ -f /etc/X11/xorg.conf -a ! -e $CONFIGFILE ] \
    && which awk 2>/dev/null >/dev/null
then
    awk_expr='
{
    sub("#.*","")
    line = $0;
    $0 = tolower($0);
    xkb = "";
}

/^[ \t]*section[ \t]+"inputdevice"/,/^[ \t]*endsection/ {
    if ($1 == "option") {
	if ($2 == "\"xkbmodel\"") {
	    xkb = "XKBMODEL";
	} else if ($2 == "\"xkblayout\"") {
	    xkb = "XKBLAYOUT";
	    print "layout_priority=medium";
	} else if ($2 == "\"xkbvariant\"") {
	    xkb = "XKBVARIANT";
	} else if ($2 == "\"xkboptions\"") {
	    xkb = "XKBOPTIONS"; 
	}
	$0 = line;
	$1 = "";
	$2 = "";
    }
}

xkb != "" && /^[ \t]*\"[^"]+\"[ \t]*$/ {
    sub("^[ \t]*\"", "");
    sub("\".*", "");
    gsub("[ \t]", "");
    if ($1 !~ /[()]/) {
	print xkb "=\"" $0 "\"";
    } else {
	if (xkb == "XKBLAYOUT" && $1 ~ /^[^()]+\([^()]+\)$/) {
	    l=$1;                      # us(intl),cz(qwerty)
	    gsub(/\([^()]*\)/,"",l);   # us,cz
	    v=$1;                      # us(intl),cz(qwerty)     us,bg
	    gsub(/\)/,"",v);           # us(intl,cz(qwerty       us,bg
	    gsub(/^[^(,]*,/,",",v);    # us(intl,cz(qwerty       ,bg
	    gsub(/^[^(,]*$/,"",v);     # us(intl,cz(qwerty       ,bg
	    gsub(/^[^(,]*\(/,"",v);    # intl,cz(qwerty          ,bg
	    gsub(/,[^(,]*,/,",,",v);   # intl,cz(qwerty          ,bg
	    gsub(/,[^(,]*$/,",",v);    # intl,cz(qwerty          ,
	    gsub(/,[^(,]*\(/,",",v);   # intl,qwerty             ,
	    print "XKBLAYOUT=" l;
	    print "XKBVARIANT=" v;
	}
    }
}
'
    eval $(awk "$awk_expr" < /etc/X11/xorg.conf)
fi

# Load the config file, if it exists.  Overwrite the current values of
# XKBMODEL, XKBLAYOUT, XKBVARIANT, and XKBOPTIONS in the process.
read_config $OLDCONFIGFILE
read_config $CONFIGFILE

XKBMODEL=$(echo $XKBMODEL | sed 's/ *//g')
XKBLAYOUT=$(echo $XKBLAYOUT | sed 's/ *//g')
XKBVARIANT=$(echo $XKBVARIANT | sed 's/ *//g')

# Version 1.37 of console-setup would destroy the values of $XKBMODEL,
# $XKBLAYOUT and $XKBVARIANT in the configfile if sharutils was not
# installed.  Version 1.47 destroyed $XKBMODEL.
if [ -z "$XKBMODEL" ]; then
    model_priority=critical
    XKBMODEL=pc105
    db_fset keyboard-configuration/model seen false
fi
if [ -z "$XKBLAYOUT" ]; then
    layout_priority=critical
    XKBLAYOUT=us
    db_fset keyboard-configuration/layout seen false
    db_fset keyboard-configuration/variant seen false
fi

#######################################################################
#    If the computer doesn't have keyboard then do not ask questions,
#    simply store the default values in the configuration file.  This
#    is in order to support headless installs in d-i.  The regular
#    packages (console-setup and console-setup-mini) should not be
#    installed on such sistems.
#######################################################################

if ! keyboard_present; then
    # No questions, just store the defaults for postinst
    db_set keyboard-configuration/modelcode "$XKBMODEL"
    db_set keyboard-configuration/layoutcode "$XKBLAYOUT"
    db_set keyboard-configuration/variantcode "$XKBVARIANT"
    if [ -z "$XKBOPTIONS" -a ! -f $CONFIGFILE ]; then
	case "$XKBLAYOUT" in
	    *,*) XKBOPTIONS="grp_led:scroll";;
	    us) XKBOPTIONS="";;
	    *) XKBOPTIONS="lv3:ralt_switch";;
	esac
    fi
    db_set keyboard-configuration/optionscode "$XKBOPTIONS"
    exit 0
fi

#######################################################################
#    Compute default values for the Debconf questions.  For example
#    from XKBLAYOUT=us,el we obtain debconf_layout=el and from
#    XKBOPTIONS=lv3:ralt_switch we obtain debconf_altgr='Right Alt (AltGr)'
#######################################################################

# Set debconf_model.  There is no difference between debconf_model and
# XKBMODEL, but lets create a new variable for consistency.
debconf_model="$XKBMODEL"

# Compute debconf_layout, debconf_variant and unsupported_layout based
# on values of $XKBLAYOUT and $XKBVARIANT.
if [ "$XKBLAYOUT" ]; then
    case "$XKBLAYOUT" in
	lt,us)
	    debconf_layout="${XKBLAYOUT%,*}"
	    debconf_variant="${XKBVARIANT%,*}"
	    unsupported_layout=no
	    ;;
	rs,rs|us,rs|jp,jp|us,jp)
	    debconf_layout="${XKBLAYOUT#*,}"
	    debconf_variant="${XKBVARIANT#*,}"
	    unsupported_layout=no
	    ;;
	# TODO: make s.t. to not forget to update this list
	us,am|us,af|us,ara|us,ben|us,bd|us,bg|us,bt|us,by|us,cn|us,et|us,ge|us,gh|us,gr|us,guj|us,guru|us,il|us,in|us,ir|us,iku|us,iq|us,ir|us,kan|us,kh|us,kz|us,la|us,lao|us,lk|us,lt|us,kg|us,ma|us,mal|us,mk|us,mm|us,mn|us,mv|us,np|us,ori|us,pk|us,ru|us,scc|us,sy|us,syr|us,tel|us,th|us,tj|us,tam|us,tib|us,ua|us,ug|us,uz)
	    if [ "${XKBVARIANT%,*}" = '' ]; then
		debconf_layout="${XKBLAYOUT#*,}"
		debconf_variant="${XKBVARIANT#*,}"
		unsupported_layout=no
	    else
		unsupported_layout=yes
	    fi
	    ;;	    
	*,*)
	    unsupported_layout=yes
	    ;;
	*)
	    debconf_layout="$XKBLAYOUT"
	    debconf_variant="$XKBVARIANT"
            unsupported_layout=no
	    ;;
    esac
fi

# Make sure debconf_layout and debconf_variant point to existing in
# $kbdnames layout and variant.  If the requested layout and/or
# variant are not in the $kbdnames, then we prefer debconf_layout=us
# and debconf_variant=''
if \
    ! echo "$kbdnames" \
    | grep "variant[*]$debconf_layout[*]$debconf_variant[*]" >/dev/null
then
    unsupported_layout=yes
    debconf_variant=''
    if \
	! echo "$kbdnames" \
	| grep "layout[*]$debconf_layout[*]" >/dev/null
    then
	debconf_layout=us
    fi
fi

# Compute debconf_* variables based on the value of $XKBOPTIONS.  The
# values of these variables are human-friendly text.
debconf_toggle='No toggling'
debconf_switch='No temporary switch'
debconf_altgr='The default for the keyboard layout'
debconf_compose='No compose key'
debconf_ctrl_alt_bksp=false
if [ "$XKBOPTIONS" ]; then
    debconf_toggle='No toggling'
    debconf_switch='No temporary switch'
    debconf_altgr='The default for the keyboard layout'
    debconf_compose='No compose key'
    for option in `echo $XKBOPTIONS | sed 's/,/ /g'`; do
	case "$option" in
	    compose:caps)
		debconf_compose='Caps Lock';;
	    compose:lwin)
		debconf_compose='Left Logo key';;
	    compose:menu)
		debconf_compose='Menu key';;
	    compose:ralt)
		debconf_compose='Right Alt (AltGr)';;
	    compose:rctrl)
		debconf_compose='Right Control';;
	    compose:rwin)
		debconf_compose='Right Logo key';;
	    grp:alt_caps_toggle)
		debconf_toggle='Alt+Caps Lock';;
	    grp:alt_shift_toggle)
		debconf_toggle='Alt+Shift';;
	    grp:caps_toggle)
		debconf_toggle='Caps Lock';;
	    grp:ctrl_alt_toggle)
		debconf_toggle='Control+Alt';;
	    grp:ctrl_shift_toggle)
		debconf_toggle='Control+Shift';;
	    grp:lalt_toggle)
		debconf_toggle='Left Alt';;
	    grp:lctrl_lshift_toggle)
		debconf_toggle='Left Control+Left Shift';;
	    grp:lctrl_toggle)
		debconf_toggle='Left Control';;
	    grp:lshift_toggle)
		debconf_toggle='Left Shift';;
	    grp:lswitch)
		debconf_switch='Left Alt';;
	    grp:lwin_switch)
		debconf_switch='Left Logo key';;
	    grp:lwin_toggle)
		debconf_toggle='Left Logo key';;
	    grp:menu_toggle)
		debconf_toggle='Menu key';;
	    grp:rctrl_toggle)
		debconf_toggle='Right Control';;
	    grp:rshift_toggle)
		debconf_toggle='Right Shift';;
	    grp:rwin_switch)
		debconf_switch='Right Logo key';;
	    grp:rwin_toggle)
		debconf_toggle='Right Logo key';;
	    grp:sclk_toggle)
		debconf_toggle='Scroll Lock key';;
	    grp:switch)
		debconf_switch='Right Alt (AltGr)';;
	    grp:toggle)
		debconf_toggle='Right Alt (AltGr)';;
	    grp:win_switch)
		debconf_switch='Both Logo keys';;
	    lv3:ralt_alt)
		debconf_altgr='No AltGr key';;
	    lv3:alt_switch)
		debconf_altgr='Both Alt keys';;
	    lv3:enter_switch)
		debconf_altgr='Keypad Enter key';;
	    lv3:lalt_switch)
		debconf_altgr='Left Alt';;
	    lv3:lwin_switch)
		debconf_altgr='Left Logo key';;
	    lv3:menu_switch)
		debconf_altgr='Menu key';;
	    lv3:ralt_switch)
		debconf_altgr='Right Alt (AltGr)';;
	    lv3:rwin_switch)
		debconf_altgr='Right Logo key';;
	    lv3:switch)
		debconf_altgr='Right Control';;
	    lv3:win_switch)
		debconf_altgr='Both Logo keys';;
	    terminate:ctrl_alt_bksp)
		debconf_ctrl_alt_bksp=true;;
	    grp_led:scroll)
		;;
	    *)
		unsupported_options=yes
		;;
	esac
    done
fi

# Store the default values for the options into debconf db.  Notice we
# do not store the default values for the model, the layout and the
# variant since the respective questions are asked by the function
# ask_debconf and it takes care to store in debconf db the reqired text.
db_default keyboard-configuration/toggle "$debconf_toggle"
db_default keyboard-configuration/switch "$debconf_switch"
db_default keyboard-configuration/altgr "$debconf_altgr"
db_default keyboard-configuration/compose "$debconf_compose"
db_default keyboard-configuration/ctrl_alt_bksp "$debconf_ctrl_alt_bksp"

#######################################################################
#     Ask the Debconf questions starting from STATE=1.
#######################################################################

# At this point if unsupported_layout=yes, then the values of
# XKBLAYOUT and XKBVARIANT are relevant.  Otherwise the values of
# debconf_layout and debconf_variant have to be used.  Notice the
# difference between these variables - for example when
# XKBLAYOUT=us,el we have debconf_layout=el.

# Notice that the user may choose to disregard the fact that the
# configuration is unsupported (question unsupported_config_layout).
# Because of this, at this point we have to have sensible values for
# debconf_layout and debconf_variant even when unsupported_layout=yes.

STATE=1
old_state=0
while :; do
    starting_state=$STATE
    case "$STATE" in
	1)
	    if [ "$is_debian_installer" ]; then
		# do not ask model question in Debian installer
		db_set keyboard-configuration/modelcode "$debconf_model"
		db_fset keyboard-configuration/model seen true
		# skip the question without making Debconf loop
		STATE=$(( $STATE + $STATE - $old_state ))
	    else
		if \
		    ask_debconf keyboard-configuration/model $model_priority \
		        model "$debconf_model"
		then
		    debconf_model="$RET"
		    db_set keyboard-configuration/modelcode "$RET"
		    STATE=$(($STATE + 1))
		else
		    STATE=$(($STATE - 1))
		fi
	    fi
	    ;;
	2)
	    if \
		$detect_keyboard \
		&& [ "$XKBMODEL" != SKIP ] \
		&& [ -e "/usr/share/console-setup-mini/$XKBMODEL.tree" ]
	    then
		db_input high console-setup/ask_detect || true
		if db_go; then
		    STATE=$(($STATE + 1))
		else
		    STATE=$(($STATE - 1))
		fi
	    else
		STATE=$(($STATE + $STATE - $old_state))
	    fi
	    ;;
	3)
	    if \
		[ "$STATE" -ge "$old_state" ] \
		&& $detect_keyboard \
		&& [ "$XKBMODEL" != SKIP ] \
		&& [ -e "/usr/share/console-setup-mini/$XKBMODEL.tree" ] \
		&& db_get console-setup/ask_detect \
		&& [ "$RET" = true ]
	    then
		db_subst console-setup/detect FILENAME \
		    "/usr/share/console-setup-mini/$XKBMODEL.tree"
		if db_input critical console-setup/detect && db_go; then
		    db_get console-setup/detect
		    detected_keyboard="$RET"
		    # TODO: produce human-readable layout name
		    db_subst console-setup/detected LAYOUT "$detected_keyboard"
		    db_input high console-setup/detected || true
		    if db_go; then
			unsupported_layout=no
			STATE=$(($STATE + 1))
		    else
			detected_keyboard=
			STATE=$(($STATE - 1))
		    fi
		else
		    STATE=$(($STATE - 1))
		fi
	    else
		detected_keyboard=
		STATE=$(($STATE + $STATE - $old_state))
	    fi
	    ;;
	4)
	    if [ "$detected_keyboard" ] || [ "$XKBMODEL" = SKIP ]; then
		STATE=$(( $STATE + $STATE - $old_state ))
	    elif [ "$unsupported_layout" = yes ]; then
                # For the question about the keeping of the
                # unsupported configuration we use two different
                # Debconf templates depending on whether the
                # unsupported layout/variant combination has been
                # taken from existing configuration file (obviously in
                # this case the admin is responsible) or it has been
                # computed based on the system configuration such as
                # the locale or xorg.conf (in which case the user may
                # be unaware).
		if [ -f $CONFIGFILE ]; then
                    template=keyboard-configuration/unsupported_config_layout
                else
                    template=keyboard-configuration/unsupported_layout
		    case "$XKBVARIANT" in
		        ,|,,|,,,|'')
		            db_subst $template XKBLAYOUTVARIANT "$XKBLAYOUT"
			    ;;
		        *)
		            db_subst $template XKBLAYOUTVARIANT \
                                "$XKBLAYOUT/$XKBVARIANT"
			    ;;
		    esac
                fi
		db_subst $template XKBLAYOUT "$XKBLAYOUT"
		db_subst $template XKBVARIANT "$XKBVARIANT"
		db_input medium $template || true
		if db_go; then
		    STATE=$(($STATE + 1))
		else
                    # The following code is for the following
                    # situation: admin creates unsupported
                    # configuration, then asks c-s not to keep this
                    # configuration (i.e. gives answer 'no' to this
                    # question), then restores by hand the unsupported
                    # configuration.  Un upgrade the old answer to
                    # this question will be remembered by Debconf so
                    # c-s will overwrite the configuration.  See #729321.
		    db_reset $template || true
		    db_fset $template seen false
		    STATE=$(($STATE - 1))
		fi
		db_get $template
		if [ "$RET" != true ]; then
		    unsupported_layout=no
		fi
	    else
                # The following code is for the following situation:
                # first admin configures unsupported configuration,
                # then gives answer to keep the configuration.  After
                # that admin configures (by hand) a supported
                # configuration.  And after that again unsupported.
                # In this case we want the question about unsupported
                # layout to be asked again.
		db_reset keyboard-configuration/unsupported_config_layout || true
		db_fset keyboard-configuration/unsupported_config_layout seen false
		db_reset keyboard-configuration/unsupported_layout || true
		db_fset keyboard-configuration/unsupported_layout seen false
		# skip the question without making Debconf loop
		STATE=$(( $STATE + $STATE - $old_state ))
	    fi
	    ;;
	5)
	    if [ "$detected_keyboard" ]; then
		XKBLAYOUT="${detected_keyboard%%:*}"
		debconf_layout="$XKBLAYOUT"
		db_set keyboard-configuration/layoutcode "$XKBLAYOUT"
		# skip the question without making Debconf loop
		STATE=$(( $STATE + $STATE - $old_state ))
	    elif [ "$XKBMODEL" = SKIP ]; then
		STATE=$(( $STATE + $STATE - $old_state ))
	    elif [ "$unsupported_layout" = yes ]; then
		# skip the question without making Debconf loop
		STATE=$(( $STATE + $STATE - $old_state ))
	    elif \
		ask_debconf keyboard-configuration/layout "$layout_priority" \
		    layout "$debconf_layout"
	    then
		debconf_layout="$RET"
		STATE=$(($STATE + 1)) 
	    else
		# always to the next question
		STATE=$(($STATE + 1))
	    fi
	    ;;
	6)
	    adjust_layout=false
	    if [ "$detected_keyboard" ]; then
		case $detected_keyboard in
		    *:*)
			variant="${detected_keyboard#*:}"
			;;
		    *)
			variant=
			;;
		esac
		debconf_variant="$variant"
		adjust_layout=:
		# skip the question without making Debconf loop
		STATE=$(( $STATE + $STATE - $old_state ))
	    elif [ "$XKBMODEL" = SKIP ]; then
		STATE=$(( $STATE + $STATE - $old_state ))
	    elif [ "$unsupported_layout" = yes ]; then
		STATE=$(( $STATE + $STATE - $old_state ))
	    elif \
		! ask_debconf keyboard-configuration/variant \
			"$layout_priority" \
			"variant*${debconf_layout}" \
			"$debconf_variant"
	    then
		# skip the previous question
		starting_state=$(($STATE - 1))
		STATE=$(($STATE - 2))
	    else
		debconf_variant="$RET"
		variant="$RET"
		adjust_layout=:
		STATE=$(($STATE + 1))
	    fi

            # Compute $XKBLAYOUT and $XKBVARIANT and store their
            # values in debconf db.
	    if $adjust_layout; then
		case "$debconf_layout" in
		    rs)
			case "$debconf_variant" in
			    latin*)
				XKBLAYOUT=$debconf_layout
				;;
			    *)
				XKBLAYOUT=rs,rs
				;;
			esac
			;;
		    jp)
			case "$debconf_variant" in
			    106|common|OADG109A|nicola_f_bs|'')
				XKBLAYOUT=$debconf_layout
				;;
			    *)
				XKBLAYOUT=jp,jp
				;;
			esac
			;;
		    lt)
			XKBLAYOUT=lt,us
			;;
		    me)
			case "$debconf_variant" in
			    basic|latin*)
				XKBLAYOUT=$debconf_layout
				;;
			    *)
				XKBLAYOUT=me,me
				;;
			esac
			;;
		    af|am|ara|ben|bd|bg|bt|by|et|ge|gh|gr|guj|guru|il|'in'|iq|ir|iku|kan|kh|kz|la|lao|lk|kg|ma|mk|mm|mn|mv|mal|np|ori|pk|ru|scc|sy|syr|tel|th|tj|tam|tib|ua|ug|uz)
	                XKBLAYOUT=us,$debconf_layout
	                ;;
	            *)
	                XKBLAYOUT=$debconf_layout
	                ;;
	        esac
		case "$XKBLAYOUT" in
                    rs,rs)
		        case "$debconf_variant" in
		            yz)
                                XKBVARIANT="latinyz,$debconf_variant" ;;
		            alternatequotes)
                                XKBVARIANT="latinalternatequotes,$debconf_variant" ;;
		            *)
                                XKBVARIANT="latin,$debconf_variant" ;;
		        esac
                        ;;
                    lt,us)
		        case "$debconf_variant" in
		            us)
                                XKBVARIANT="us," ;;
		            *)
                                XKBVARIANT="$debconf_variant,altgr-intl" ;;
		        esac
                        ;;
		    *,*)
                        XKBVARIANT=",$debconf_variant"
                        ;;
		    *)
                        XKBVARIANT="$debconf_variant"
                        ;;
		esac
            fi
	    db_set keyboard-configuration/layoutcode "$XKBLAYOUT"
	    db_set keyboard-configuration/variantcode "$XKBVARIANT"
	    ;;
	7)
	    if \
		[ "$unsupported_options" = yes -a "$is_not_debian_installer" ]
	    then
		if [ -f $CONFIGFILE ]; then
                    template=keyboard-configuration/unsupported_config_options
                else
                    template=keyboard-configuration/unsupported_options
                fi
		db_subst $template XKBOPTIONS "$XKBOPTIONS"
		db_input medium $template || true
		if db_go; then
		    STATE=$(($STATE + 1))
		else
		    db_reset $template || true
		    db_fset $template seen false
		    STATE=$(($STATE - 1))
		fi
		db_get $template
		if [ "$RET" != true ]; then
		    unsupported_options=no
		fi
	    else
		db_reset keyboard-configuration/unsupported_config_options || true
		db_fset keyboard-configuration/unsupported_config_options seen false
		db_reset keyboard-configuration/unsupported_options || true
		db_fset keyboard-configuration/unsupported_options seen false
		# skip the question without making Debconf loop
		STATE=$(( $STATE + $STATE - $old_state ))
	    fi
	    ;;
	8)
	    if [ "$unsupported_options" = yes ]; then
		db_set keyboard-configuration/optionscode "$XKBOPTIONS"
		# skip the questions without making Debconf loop
		STATE=$(( $STATE + $STATE - $old_state ))
	    elif [ "$XKBMODEL" = SKIP ]; then
		STATE=$(( $STATE + $STATE - $old_state ))
	    else
		caps_allocated=no
		lalt_allocated=no
		lctrl_allocated=no
		lshift_allocated=no
		lwin_allocated=no
		menu_allocated=no
		ralt_allocated=no
		rctrl_allocated=no
		rshift_allocated=no
		rwin_allocated=no

		case "$XKBLAYOUT" in
		    *,*)
                        ;;
		    *)
		        db_set keyboard-configuration/toggle 'No toggling'
		        db_set keyboard-configuration/switch 'No temporary switch'
                        ;;
		esac

		db_beginblock
		case "$XKBLAYOUT" in
		    *,*)
		        db_input high keyboard-configuration/toggle || true
		        if [ "$is_not_debian_installer" ]; then
			    db_input medium keyboard-configuration/switch || true
		        fi
                        ;;
		    *)
		        ;;
		esac
		if [ "$is_not_debian_installer" ]; then
		    db_input medium keyboard-configuration/altgr || true
		    db_input medium keyboard-configuration/compose || true
		fi
		if [ -f /usr/bin/X ]; then
		    db_input medium keyboard-configuration/ctrl_alt_bksp || true
		fi
		db_endblock

		if db_go; then
		    STATE=$(($STATE + 1))
		else
		    STATE=$(($STATE - 1))
		fi

		db_get keyboard-configuration/toggle
		case "$RET" in
		    Caps\ Lock)
		        caps_allocated=yes
		        toggle=caps_toggle;;
		    Right\ Alt*)
		        ralt_allocated=yes
		        toggle=toggle;;
		    Right\ Control)
		        rctrl_allocated=yes
		        toggle=rctrl_toggle;;
		    Right\ Shift)
		        rshift_allocated=yes
		        toggle=rshift_toggle;;
		    Right\ Logo?key)
		        rwin_allocated=yes
		        toggle=rwin_toggle;;
		    Menu?key)
			menu_allocated=yes
			toggle=menu_toggle;;
		    Alt+Shift)
			toggle=alt_shift_toggle;;
		    Control+Shift)
			toggle=ctrl_shift_toggle;;
		    Left\ Control+Left\ Shift)
			toggle=lctrl_lshift_toggle;;
		    Scroll\ Lock\ key)
			toggle=sclk_toggle;;
		    Alt+Caps\ Lock)
			toggle=alt_caps_toggle;;
		    Control+Alt)
			toggle=ctrl_alt_toggle;;
		    Left\ Alt)
		        lalt_allocated=yes
		        toggle=lalt_toggle;;
		    Left\ Control)
		        lctrl_allocated=yes
		        toggle=lctrl_toggle;;
		    Left\ Shift)
		        lshift_allocated=yes
		        toggle=lshift_toggle;;
		    Left\ Logo?key)
		        lwin_allocated=yes
		        toggle=lwin_toggle;;
		    No\ toggling)
		        toggle='';;
		    *)
			echo Unknown toggle key option
			exit 1
			;;
		esac
		if [ "$toggle" ]; then
		    toggle=grp:$toggle
		fi
		
		db_get keyboard-configuration/switch
		switch=''
		case "$RET" in
		    Right\ Alt*)
		        if [ "$ralt_allocated" != yes ]; then
			    switch=switch
			    ralt_allocated=yes
		        fi;;
		    Left\ Alt)
		        if [ "$lalt_allocated" != yes ]; then
			    switch=lswitch
			    lalt_allocated=yes
		        fi;;
		    Right\ Logo?key)
		        if [ "$rwin_allocated" != yes ]; then
			    switch=rwin_switch
			    rwin_allocated=yes
		        fi;;
		    Left\ Logo?key)
		        if [ "$lwin_allocated" != yes ]; then
			    switch=lwin_switch
			    lwin_allocated=yes
		        fi;;
		    Both\ Logo?keys)
		        if \
			    [ "$rwin_allocated" != yes ] \
			    && [ "$lwin_allocated" != yes ]
			then
			    switch=win_switch
			    rwin_allocated=yes
			    lwin_allocated=yes
		        fi;;
		    No\ temporary\ switch)
		        switch='';;
		    *)
			echo Unknown switch key option
			exit 1
			;;
		esac
		if [ "$switch" ]; then
		    switch=grp:$switch
		fi
		
		db_get keyboard-configuration/altgr
		altgr=''
		case "$RET" in
		    The?default?for?the?keyboard?layout)
			altgr='';;
		    No?AltGr?key)
			if [ "$ralt_allocated" != yes ]; then
			    # no need for ralt_allocated=yes
			    altgr=ralt_alt
			fi;;
		    Right?Alt*)
			if [ "$ralt_allocated" != yes ]; then
			    altgr=ralt_switch
			    ralt_allocated=yes
			fi;;
		    Right?Control)
			if [ "$rctrl_allocated" != yes ]; then
			    altgr=switch
			    rctrl_allocated=yes
			fi;;
		    Menu?key)
			if [ "$menu_allocated" != yes ]; then
			    altgr=menu_switch
			    menu_allocated=yes
			fi;;
		    Keypad?Enter?key)
			altgr=enter_switch;;
		    Right?Logo?key)
			if [ "$rwin_allocated" != yes ]; then
			    altgr=rwin_switch
			    rwin_allocated=yes
			fi;;
		    Left?Logo?key)
			if [ "$lwin_allocated" != yes ]; then
			    altgr=lwin_switch
			    lwin_allocated=yes
			fi;;
		    Both?Logo?keys)
			if \
			    [ "$rwin_allocated" != yes ] \
			    && [ "$lwin_allocated" != yes ]
			then
			    altgr=win_switch
			    rwin_allocated=yes
			    lwin_allocated=yes
			fi;;
		    Both?Alt?keys)
			if \
			    [ "$lalt_allocated" != yes ] \
			    && [ "$ralt_allocated" != yes ]
			then
			    altgr=alt_switch
			    ralt_allocated=yes
			    lalt_allocated=yes
			fi;;
		    Left?Alt)
			if [ "$lalt_allocated" != yes ]; then
			    altgr=lalt_switch
			    lalt_allocated=yes
			fi;;
		    *)
			echo Unknown altgr key option
			exit 1
			;;
		esac
		if [ "$altgr" ]; then
		    altgr=lv3:$altgr
		fi

		db_get keyboard-configuration/compose
		compose=''
		case "$RET" in
		    No?compose?key)
			compose='';;
		    Right?Alt*)
			if [ "$ralt_allocated" != yes ]; then
			    compose=ralt
			    ralt_allocated=yes
			fi;;
		    Right?Logo?key)
			if [ "$rwin_allocated" != yes ]; then
			    compose=rwin
			    rwin_allocated=yes
			fi;;
		    Left?Logo?key)
			if [ "$lwin_allocated" != yes ]; then
			    compose=lwin 
			    lwin_allocated=yes
			fi;;
		    Right?Control)
			if [ "$rctrl_allocated" != yes ]; then
			    compose=rctrl 
			    rctrl_allocated=yes
			fi;;
		    Menu?key)
			if [ "$menu_allocated" != yes ]; then
			    compose=menu
			    menu_allocated=yes
			fi;;
		    Caps?Lock)
			if [ "$caps_allocated" != yes ]; then
			    compose=caps
			    caps_allocated=yes
			fi;;
		    *)
			echo Unknown compose key option
			exit 1
			;;
		esac
		if [ "$compose" ]; then
		    compose=compose:$compose
		fi
		
		db_get keyboard-configuration/ctrl_alt_bksp
		if [ "$RET" = true ]; then
		    terminate=terminate:ctrl_alt_bksp
		else
		    terminate=''
		fi
		
		# A fix for #566009
		if [ "$ralt_allocated" = yes -a "$altgr" = lv3:ralt_alt ]; then
		    altgr=''
		fi

		case "$XKBLAYOUT" in
		    *,*)
		        leds=grp_led:scroll;;
		    *)
			leds='';;
		esac
		
		options=$(
		    echo $toggle $switch $altgr $compose $terminate $leds \
			| sed -e 's/^ *//' -e 's/ *$//' -e 's/  */,/g'
		)
		db_set keyboard-configuration/optionscode "$options"
	    fi
	    ;;
	*)
	    break
	    ;;
    esac
    old_state=$starting_state
done

if [ $STATE -eq 0 ]; then
    exit 10
else
    db_set keyboard-configuration/store_defaults_in_debconf_db false
fi

exit 0
Hacker Blog, Shell İndir, Sql İnjection, XSS Attacks, LFI Attacks, Social Hacking, Exploit Bot, Proxy Tools, Web Shell, PHP Shell, Alfa Shell İndir, Hacking Training Set, DDoS Script, Denial Of Service, Botnet, RFI Attacks, Encryption
Telegram @BIBIL_0DAY