mirror of
https://github.com/Julow/Unexpected-Keyboard.git
synced 2025-08-18 00:19:56 +02:00
Compare commits
3 Commits
1.29.1
...
anticircle
Author | SHA1 | Date | |
---|---|---|---|
|
c5a6b8a3b2 | ||
|
0fadb4b9e6 | ||
|
04caf4309a |
@@ -190,12 +190,6 @@ As translations need to be updated regularly, you can subscribe to this issue
|
||||
to receive a notification when an update is needed:
|
||||
https://github.com/Julow/Unexpected-Keyboard/issues/373
|
||||
|
||||
### Adding Compose key sequences
|
||||
|
||||
New Compose sequences can be added into `srcs/compose/compose/extra.json`.
|
||||
If a entirely new family of sequences were to be added, a new `.json` file can
|
||||
be created in the same directory to host them.
|
||||
|
||||
### Adding key combinations
|
||||
|
||||
Key combinations are defined in `srcs/juloo.keyboard2/KeyModifier.java`.
|
||||
|
Binary file not shown.
10
build.gradle
10
build.gradle
@@ -4,14 +4,14 @@ plugins {
|
||||
|
||||
android {
|
||||
namespace 'juloo.keyboard2'
|
||||
compileSdk 34
|
||||
compileSdk 33
|
||||
|
||||
defaultConfig {
|
||||
applicationId "juloo.keyboard2"
|
||||
minSdk 11
|
||||
targetSdkVersion 34
|
||||
versionCode 42
|
||||
versionName "1.29.1"
|
||||
targetSdkVersion 33
|
||||
versionCode 39
|
||||
versionName "1.27.0"
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
@@ -151,7 +151,7 @@ tasks.register('compileComposeSequences') {
|
||||
println "\nGenerating ${out}"
|
||||
exec {
|
||||
def sequences = new File(projectDir, "srcs/compose").listFiles().findAll {
|
||||
!it.name.endsWith(".py") && !it.name.endsWith(".md")
|
||||
it.name.endsWith(".pre") || it.name.endsWith(".json")
|
||||
}
|
||||
workingDir = projectDir
|
||||
commandLine("python", "srcs/compose/compile.py", *sequences)
|
||||
|
@@ -1,9 +1,10 @@
|
||||
# arab_alt
|
||||
Layout includes some ASCII punctuation but not all, missing: !, ", ', +, -, /, :, ;, <, =, >, ?, [, \, ], _, |, ~
|
||||
1 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# arab_hamvaj_tly
|
||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], _, `, {, |, }
|
||||
Layout doesn't define some important keys, missing: loc esc
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# arab_pc
|
||||
Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
|
||||
@@ -18,19 +19,20 @@ Layout includes some ASCII punctuation but not all, missing: !, ', +, ;, ?, \, |
|
||||
Layout includes some ASCII punctuation but not all, missing: ", %, ', ,, /, ;, <, =, >, ?, [, \, ], `, {, |, }
|
||||
1 warnings
|
||||
# armenian_ph_am
|
||||
0 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# beng_national
|
||||
Layout includes some ASCII punctuation but not all, missing: $
|
||||
1 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# beng_provat
|
||||
Layout includes some ASCII punctuation but not all, missing: $, &, *, ., /, <, >, [, \, ], `, {, |, }
|
||||
1 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# cyrl_jcuken_ru
|
||||
0 warnings
|
||||
# cyrl_jcuken_uk
|
||||
0 warnings
|
||||
# cyrl_lynyertz_sr
|
||||
0 warnings
|
||||
# cyrl_ueishsht
|
||||
0 warnings
|
||||
# cyrl_yaverti
|
||||
@@ -38,20 +40,22 @@ Layout includes some ASCII punctuation but not all, missing: ~
|
||||
1 warnings
|
||||
# deva_alt
|
||||
Layout includes some ASCII punctuation but not all, missing: #, $, %, &, ', (, ), +, ., /, :, <, =, >, [, \, ], ^, _, `, {, |, }, ~
|
||||
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, tab
|
||||
2 warnings
|
||||
# deva_inscript
|
||||
Duplicate keys: ।
|
||||
Layout includes some ASCII punctuation but not all, missing: ", $, ', ^, _, `, |
|
||||
2 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
3 warnings
|
||||
# grek_qwerty
|
||||
Duplicate keys: ;
|
||||
1 warnings
|
||||
# guj_phonetic_in
|
||||
Duplicate keys: ટ, ડ
|
||||
1 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# hang_dubeolsik_kr
|
||||
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, tab
|
||||
1 warnings
|
||||
# hebr_1_il
|
||||
Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {, }
|
||||
@@ -62,10 +66,11 @@ Layout includes some ASCII punctuation but not all, missing: (, ), <, >, [, ], {
|
||||
# latn_azerty_fr
|
||||
0 warnings
|
||||
# latn_bepo_fr
|
||||
0 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# latn_bone
|
||||
Layout includes some ASCII punctuation but not all, missing: $
|
||||
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc compose, loc end, loc home, loc page_down, loc page_up, loc switch_clipboard, loc switch_greekmath, loc voice_typing, switch_backward
|
||||
Layout redefines the bottom row but some important keys are missing, missing: cursor_left, cursor_right, loc compose, loc end, loc home, loc page_down, loc page_up, loc switch_greekmath, loc voice_typing, switch_backward
|
||||
2 warnings
|
||||
# latn_colemak
|
||||
Some keys contain whitespaces, unexpected: ́
|
||||
@@ -73,12 +78,12 @@ Some keys contain whitespaces, unexpected: ́
|
||||
# latn_dvorak
|
||||
0 warnings
|
||||
# latn_neo2
|
||||
Layout redefines the bottom row but some important keys are missing, missing: loc switch_clipboard
|
||||
1 warnings
|
||||
0 warnings
|
||||
# latn_qwerty_br
|
||||
0 warnings
|
||||
# latn_qwerty_cz
|
||||
0 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# latn_qwerty_da
|
||||
0 warnings
|
||||
# latn_qwerty_es
|
||||
@@ -99,15 +104,15 @@ Layout redefines the bottom row but some important keys are missing, missing: lo
|
||||
Duplicate keys: !, ', ,, -, ., ?
|
||||
1 warnings
|
||||
# latn_qwerty_sk
|
||||
0 warnings
|
||||
# latn_qwerty_sr
|
||||
0 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# latn_qwerty_tly
|
||||
Duplicate keys: a, c, j, q
|
||||
Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||
Layout doesn't define some important keys, missing: esc, f11_placeholder, f12_placeholder, tab
|
||||
2 warnings
|
||||
# latn_qwerty_tr
|
||||
0 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# latn_qwerty_us
|
||||
0 warnings
|
||||
# latn_qwerty_vi
|
||||
@@ -115,10 +120,12 @@ Layout doesn't define some important keys, missing: loc esc, loc tab
|
||||
# latn_qwertz
|
||||
0 warnings
|
||||
# latn_qwertz_cz
|
||||
0 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
1 warnings
|
||||
# latn_qwertz_cz_multifunctional
|
||||
Layout includes some ASCII punctuation but not all, missing: `
|
||||
1 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# latn_qwertz_de
|
||||
0 warnings
|
||||
# latn_qwertz_fr_ch
|
||||
@@ -127,11 +134,13 @@ Layout includes some ASCII punctuation but not all, missing: `
|
||||
0 warnings
|
||||
# latn_qwertz_sk
|
||||
Layout includes some ASCII punctuation but not all, missing: `
|
||||
1 warnings
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
2 warnings
|
||||
# shaw_imperial_en
|
||||
0 warnings
|
||||
# urdu_phonetic_ur
|
||||
Duplicate keys:
|
||||
Layout includes some ASCII punctuation but not all, missing: <, >, ?, `, |, ~
|
||||
Layout doesn't define some important keys, missing: f11_placeholder, f12_placeholder
|
||||
Some keys contain whitespaces, unexpected:
|
||||
3 warnings
|
||||
4 warnings
|
||||
|
@@ -6,14 +6,7 @@ warning_count = 0
|
||||
KNOWN_NOT_LAYOUT = set([
|
||||
"number_row", "numpad", "pin",
|
||||
"bottom_row", "settings", "method",
|
||||
"greekmath", "numeric", "emoji_bottom_row",
|
||||
"clipboard_bottom_row" ])
|
||||
|
||||
KEY_ATTRIBUTES = set([
|
||||
"key0",
|
||||
"key1", "key2", "key3", "key4", "key5", "key6", "key7", "key8",
|
||||
"nw", "ne", "sw", "se", "w", "e", "n", "s"
|
||||
])
|
||||
"greekmath", "numeric", "emoji_bottom_row" ])
|
||||
|
||||
def warn(msg):
|
||||
global warning_count
|
||||
@@ -45,7 +38,7 @@ def unexpected_keys(keys, symbols, msg):
|
||||
def parse_row_from_et(row, keys, dup):
|
||||
for key in row:
|
||||
for attr in key.keys():
|
||||
if attr in KEY_ATTRIBUTES:
|
||||
if attr.startswith("key"):
|
||||
k = key.get(attr).removeprefix("\\")
|
||||
if k in keys: dup.add(k)
|
||||
keys.add(k)
|
||||
@@ -75,7 +68,8 @@ def check_layout(layout):
|
||||
missing_some_of(keys, "~!@#$%^&*(){}`[]=\\-_;:/.,?<>'\"+|", "ASCII punctuation")
|
||||
missing_some_of(keys, "0123456789", "digits")
|
||||
missing_required(keys,
|
||||
["loc esc", "loc tab", "backspace", "delete"],
|
||||
["esc", "tab", "backspace", "delete",
|
||||
"f11_placeholder", "f12_placeholder"],
|
||||
"Layout doesn't define some important keys")
|
||||
unexpected_keys(keys,
|
||||
["copy", "paste", "cut", "selectAll", "shareText",
|
||||
@@ -88,7 +82,6 @@ def check_layout(layout):
|
||||
unexpected_keys(keys, [""], "Layout contains empty strings")
|
||||
unexpected_keys(keys, ["loc"], "Special keyword cannot be a symbol")
|
||||
unexpected_keys(keys, filter(lambda k: k.strip()!=k, keys), "Some keys contain whitespaces")
|
||||
unexpected_keys(keys, ["f11_placeholder", "f12_placeholder"], "These keys are now added automatically")
|
||||
|
||||
_, bottom_row_keys, _ = parse_row("res/xml/bottom_row.xml")
|
||||
|
||||
|
@@ -1,140 +1,113 @@
|
||||
# Custom layouts
|
||||
You select a key layout for Unexpected Keyboard by calling up the Settings page (swipe the gear icon) and, at the top of the page, either tapping an existing layout or tapping _Add an alternate layout_. This displays a menu of available layouts. You can define your own layout by choosing _Custom layout_ at the bottom of this menu. Unexpected Keyboard now displays code in the XML format. You make changes by replacing this with different code and tapping OK.
|
||||
|
||||
We recommend you keep your work in a file outside Unexpected Keyboard (named something like `MyChanges.xml`). If you installed a new version of Unexpected from a different website (with a different signature), then the work you did solely by editing the XML inside Unexpected would be lost.
|
||||
Unexpected Keyboard allows custom layouts to be defined, loaded, and used in the app. These layouts are defined in XML.
|
||||
|
||||
Put initial contents into your file in one of these ways:
|
||||
* Copypaste the code Unexpected displays for _Custom layout_.
|
||||
* Make a copy of one of the built-in layouts found in [`/srcs/layouts`](https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts).
|
||||
* Use the [web-based editor](https://unexpected-keyboard-layout-editor.lixquid.com/). Interact with this web page to define keys and swipes and move keys to desired positions, and it will write the XML code for you. You can make the web page put the XML in a text file or copy it to the clipboard.
|
||||
## Existing keyboard layouts
|
||||
|
||||
When you have prepared suitable XML code in one of these ways, copy it to the clipboard and paste it into Unexpected Keyboard.
|
||||
The XML data files for the keyboard layouts that come with the app can be seen [in `/srcs/layouts`](https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts).
|
||||
|
||||
## XML language overview
|
||||
A layout XML file comprises tags that start with `<` and end with `>`.
|
||||
* Every layout file starts with this declaration:
|
||||
`<?xml version="1.0" encoding="utf-8"?>`
|
||||
* Certain tags come in pairs—an opening tag and a closing tag—and apply to everything between them.
|
||||
* The `<keyboard>`...`</keyboard>` pair says that the material between them is the definition of your keyboard. There can be only one of these.
|
||||
* The `<row>`...`</row>` pair encloses the definition of a single row.
|
||||
* An optional `<modmap>`...`</modmap>` pair contains instructions if you want to change the behavior of a modifier key such as Shift.
|
||||
* Stand-alone tags include `<key`...`/>`, which defines a single key.
|
||||
## Structure
|
||||
|
||||
A tag can have properties, defined using an equals sign and a pair of ASCII double quotes. For example, `<key key0="a" />` defines the "a" key. The `key0` property of the `key` tag says which key you are defining, and the tag's location inside `<row>`...`</row>` specifies where it will go in the row.
|
||||
|
||||
### Example
|
||||
Here is a complete keyboard file with a single row containing an "a" key on the left and a "b" key on the right:
|
||||
A complete keyboard file with a single row containing a single Turkish "i" key is provided below:
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Simple example" script="latin">
|
||||
<keyboard name="Keyboard Name" script="latin">
|
||||
<modmap>
|
||||
<shift a="i" b="İ" />
|
||||
</modmap>
|
||||
<row>
|
||||
<key key0="a" />
|
||||
<key key0="b" />
|
||||
<key key0="i" />
|
||||
</row>
|
||||
</keyboard>
|
||||
|
||||
## Keyboard metadata
|
||||
The `<keyboard>`...`</keyboard>` pair follows the declaration tag and encloses the whole keyboard. The following properties may be used (The first two appear in the example above):
|
||||
* `name`: The name of the keyboard. The name you specify will appear in the Settings menu. If not present, the layout will just appear as “Custom layout”.
|
||||
* `script`: The (main) writing system that the keyboard supports. The possible values are `arabic`, `armenian`, `bengali`, `cyrillic`, `devanagari`, `gujarati`, `hangul`, `hebrew`, `latin`, `persian`, `shavian`, and `urdu`. It defaults to `latin`.
|
||||
* `numpad_script`: The script to use for the numpad. This is useful for scripts where a different, non-ASCII set of numerals is used, like Devanagari and Arabic. It defaults to the same as `script`.
|
||||
* `bottom_row`: Whether or not to show the common bottom row. It accepts `true` or `false`, and defaults to `true`. If your custom layout defines the bottom row, then specify `bottom_row="false"` to disable the built-in bottom row.
|
||||
* `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`.
|
||||
Shift assignments can be changed on a per-character basis.
|
||||
|
||||
## Row
|
||||
The `<row>`...`</row>` pair encloses one row on the keyboard. It has only one optional property:
|
||||
* `height`: The height of the row: a positive floating-point value.
|
||||
### Crash course to XML
|
||||
|
||||
A row's default height is 1.0 (one quarter of the keyboard height specified on the Settings menu). The `height` property makes the row taller or shorter than this. For example, if you define a 5-row keyboard but one row has `height="0.7"`, then the keyboard's total height is 4.7 units. If the total is different from 4.0, the keyboard will be taller or shorter than that specified in Settings.
|
||||
An XML document is made out of tags.
|
||||
|
||||
## Key
|
||||
The `<key />` tag defines a key on the keyboard. Its position in the sequence of keys inside `<row>`...`</row>` indicates its position in the row from left to right. What the key does is defined by optional properties.
|
||||
Paired tags start with `<` and end with `>`, and must be closed by another tag that starts with `</`. They can have other tags as children. Paired tags used in Unexpected Keyboard include `<row>`...`</row>` and `<keyboard>`...`</keyboard>`.
|
||||
|
||||
### Taps
|
||||
What the key does when tapped is defined by the optional `key0` property. For example, `<key key0="a" />` defines the "a" key. Unexpected Keyboard provides a legend in the middle of the key.
|
||||
Auto-terminating tags start with `<` and end with `/>`, and can't have any children. Auto-terminating tags used in Unexpected Keyboard include `<key />` and `<shift />`.
|
||||
|
||||
When the Shift modifier is tapped, the "a" key becomes the "A" key and the legend temporarily changes. The Fn modifier makes a different change. You can override this behavior with a modmap (see below).
|
||||
An XML tag can have attributes, defined using an equals sign and a pair of ASCII double quotes.
|
||||
|
||||
### Swipes
|
||||
The following optional properties define the effects of swipes:
|
||||
* `n`, `ne`, `e`, `se`, `s`, `sw`, `w`, `nw`: What the key should do when it is swiped in the direction of that compass point. ("North" means upward and "East" is to the right.)
|
||||
<TABLE ALIGN=CENTER>
|
||||
<TR>
|
||||
<TD STYLE="width: 6em;">nw</TD><TD>n</TD><TD>ne</TD>
|
||||
</TR>
|
||||
<TR ALIGN=CENTER>
|
||||
<TD>w</TD><TD> </TD><TD>e</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>sw</TD><TD>s</TD><TD>se</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
If you do not like XML, you can also use [this third-party GUI editor](https://unexpected-keyboard-layout-editor.lixquid.com/) to create or edit a keyboard layout.
|
||||
|
||||
* `key1` through `key8` is an older way to achieve the same effects. The directions are ordered as follows:
|
||||
<TABLE ALIGN=CENTER>
|
||||
<TR>
|
||||
<TD>key1</TD><TD>key7</TD><TD>key2</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>key5</TD><TD> </TD><TD>key6</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>key3</TD><TD>key8</TD><TD>key4</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
### XML declaration
|
||||
|
||||
You can define a swipe only once with either compass-point or numeric notation. Unexpected Keyboard automatically puts a small legend in that direction from the center of the key.
|
||||
Every keyboard XML starts with `<?xml version="1.0" encoding="utf-8"?>`.
|
||||
|
||||
* `slider`: If `slider="true"`, and the key also has `w` and `e` properties, then the key tracks horizontal finger motion precisely and sends the `w` and `e` keystrokes repeatedly. In built-in layouts, this makes the space bar send left and right characters as the user slides on the space bar.
|
||||
* `anticircle`: The key value to send when doing an anti-clockwise gesture on the key.
|
||||
### Keyboard metadata
|
||||
|
||||
### Layout
|
||||
A key may have the following properties to control the row's layout:
|
||||
* `width`: The width of the key, a positive floating-point value. It defaults to 1.0
|
||||
* `shift`: How much empty space to add to the left of this key, a non-negative floating-point value. It defaults to 0.0
|
||||
The `<keyboard>` tag encloses the whole keyboard. The following properties may be used:
|
||||
|
||||
Normally, a key's width is 1.0 unit. Unexpected Keyboard occupies the full width of the screen, and the row defining the highest number of units (in widths plus shifts) is as wide as the screen. A row whose width is a smaller number of units has empty space on the right.
|
||||
* `name`: The name of the keyboard as it appears in the settings menu. If not present, it will just be called “Custom layout”.
|
||||
* `bottom_row`: Whether or not to show the common bottom row. Accepts `true` or `false`, and defaults to `true`.
|
||||
* `script`: The (main) writing system that it supports. Possible values are `arabic`, `armenian`, `bengali`, `cyrillic`, `devanagari`, `gujarati`, `hangul`, `hebrew`, `latin`, `persian`, `shavian`, and `urdu`. Defaults to `latin`.
|
||||
* `numpad_script`: The script to use for the numpad. This is useful for scripts where a different, non-ASCII set of numerals is used, like Devanagari and Arabic. Defaults to the same as `script`.
|
||||
|
||||
### Extra legend
|
||||
* `indication`: An optional extra legend to show under the main label. For example, `<key key0="2" indication="ABC" />` displays ABC at the bottom of the 2 key, as on a pinpad or some telephones. If the key also defines a downward swipe with `s` or `key8`, the legends overlap.
|
||||
### Modmap
|
||||
|
||||
### Possible key values
|
||||
Built-in strings that assign a special function to a key are described in [this page](Possible-key-values.md). For example, `se="copy"` means a southeasterly swipe produces the Copy key. If a key value does not match any of the built-in strings, it outputs that text _verbatim_. For example, `key0="a"` simply outputs the letter a.
|
||||
The `<modmap>` tag encloses custom mappings for the Shift and Fn key’s behavior.
|
||||
|
||||
In a layout, a key value can also start with the `loc` prefix. These are place-holders; the tap or swipe does nothing unless enabled through the "Add keys to keyboard" option in the Settings menu, or implicitly enabled by the language the device is set to use. For example, `ne="loc accent_aigu"` says that a northeast swipe produces the acute accent combinatorial key—if enabled.
|
||||
Each entry contains two mandatory properties: `a` for the base character before the modifier is applied, and `b` for the modified character.
|
||||
|
||||
## Modmap
|
||||
The `<modmap>`...`</modmap>` pair encloses custom mappings for modifier keys. The modmap is placed inside the `<keyboard>`...`</keyboard>` pair, but outside any row. A layout can have at most one modmap.
|
||||
|
||||
A `<modmap>` can contain any number of elements of the form:
|
||||
```xml
|
||||
<shift a="before" b="after" />
|
||||
```
|
||||
This means that when the Shift modifier is on, the key `before` is changed into `after`.
|
||||
Valid values for `before` and `after` are listed in [Possible key values](Possible-key-values.md).
|
||||
|
||||
The supported modmaps are: `<shift />`, `<fn />` and `<ctrl />`.
|
||||
|
||||
The `<ctrl />` modmap is special in that the built-in Ctrl modifier will then be applied to `after`.
|
||||
For example, this will map Ctrl+в to Ctrl+V (not to v):
|
||||
|
||||
```xml
|
||||
<ctrl a="в" b="v"/>
|
||||
```
|
||||
|
||||
The clockwise circle and the round-trip gestures are affected by both `<shift />` and `<fn />` modmaps. The Shift mappings are used first and if that did not modify the key, the Fn mappings are used instead.
|
||||
|
||||
### Example
|
||||
Turkish keyboards use the Latin alphabet, but when "i" is shifted, it should produce "İ". This is achieved with the following modmap:
|
||||
For example, to make the `I` key behave as in Turkish:
|
||||
|
||||
<modmap>
|
||||
<shift a="i" b="İ" />
|
||||
</modmap>
|
||||
|
||||
## Portrait vs. landscape
|
||||
Unexpected Keyboard remembers *separately* which layout has last been used in portrait and landscape orientation. So you may have one custom layout for portrait orientation, but another custom layout for landscape orientation, and Unexpected Keyboard will switch between them without your intervention.
|
||||
There can be as many of these tags inside `<modmap>` as needed.
|
||||
|
||||
## Contributing your layout
|
||||
The Unexpected Keyboard project enthusiastically accepts user contributions, including custom layouts. (See the guidance for layouts at [CONTRIBUTING.md](https://github.com/Julow/Unexpected-Keyboard/blob/master/CONTRIBUTING.md#Adding-a-layout)).
|
||||
* Submit a layout that has innovations of possible interest to other users at [Unexpected-Keyboard-layouts](https://github.com/Julow/Unexpected-Keyboard-layouts).
|
||||
* Propose that your layout be included in the set of built-in layouts by making a Pull Request for an addition to [srcs/layouts](https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts). Please show that such a layout is standard in your locale or has a substantial number of users.
|
||||
Shift and Fn modmaps also affect the clockwise circle and the roundtrip gestures.
|
||||
|
||||
### Row
|
||||
|
||||
The `<row>` tag encloses one row on the keyboard. It requires no properties, and supports the following:
|
||||
|
||||
* `height`: The height of the row. Defaults to 1, and accepts a positive floating point value.
|
||||
|
||||
The total height of the keyboard is defined in Settings as a percentage of the total height of the screen, which can be different between portrait and landscape. The height of a row is relative to the other ones, and are scaled to keep the height of the keyboard constant.
|
||||
|
||||
### Key
|
||||
|
||||
The `<key />` tag defines a key on the keyboard. It requires at least one of the following properties:
|
||||
|
||||
* `key0`: What the key should do when it is tapped.
|
||||
* `nw`, `ne`, `sw`, `se`, `w`, `e`, `n`, `s`: What the key should do when it is swiped. They are based on cardinal directions, and uses the convention that North is up. These are the new set of keywords, and should not be used with the other set of keywords.
|
||||
|
||||
nw | n | ne
|
||||
:-: | :--: | :-:
|
||||
w | key0 | e
|
||||
sw | s | se
|
||||
|
||||
* `key1` through `key8`: The older set of keywords for what the key should do when it is swiped. The directions are ordered as follows:
|
||||
|
||||
key1 | key7 | key2
|
||||
:--: | :--: | :--:
|
||||
key5 | key0 | key6
|
||||
key3 | key8 | key4
|
||||
|
||||
The following properties are optionally supported:
|
||||
|
||||
* `width`: The width of the key relative to the normal width. Defaults to `1` and accepts a positive floating point value.
|
||||
* `shift`: How much empty space to add to the left of this key. Defaults to `0` and accepts a non-negative floating point value.
|
||||
* `indication`: An extra label to show under the main label, intended to be used as a legend for 2A typing (e.g. `<key key0="2" indication="ABC" />`). Caution: if you have `key8` defined, it overlaps!
|
||||
* `slider`: If set to `true`, the keys `w` and `e` are sent repeatedly when the key is being slid on. Intended to be used on the space bar, and in fact used on the default space bar.
|
||||
* `anticircle`: The key value to send when doing an anti-clockwise circle gesture on the key. The clockwise circle and round-trip gestures are not configurable that way.
|
||||
|
||||
## Possible key values
|
||||
|
||||
`key0` and `nw` through `se` (`key1` through `key8`) take arbitrary strings of characters, and if they don't match any of the special values, it is printed verbatim. (This is intended behavior.)
|
||||
|
||||
Special values for the keys are documented in [this page](Possible-key-values).
|
||||
|
||||
### `loc ` prefix
|
||||
|
||||
Keys prefixed with `loc ` do not appear by default, and are only visible when they are enabled through the "Add keys to keyboard" option in the settings menu, or the language installed on the device is detected to require it.
|
||||
|
||||
## Portrait vs. landscape
|
||||
|
||||
Unexpected Keyboard remembers *separately* which layout has last been used in portrait and landscape orientation. That is to say, you may have one custom layout for portrait orientation, but another custom layout for landscape orientation, and Unexpected Keyboard will switch between them without your intervention.
|
||||
|
@@ -1,9 +1,6 @@
|
||||
# Key values
|
||||
|
||||
This is an exhaustive list of special values accepted for the `key0` through `key8` or `nw` through `se` attributes on a key.
|
||||
|
||||
Any string that does not exactly match these will be printed verbatim.
|
||||
A key can output multiple characters, but cannot combine multiple built-in key values.
|
||||
This is an exhaustive list of special values accepted for the `key0` through `key8` or `nw` through `se` attributes on a key. Any string that does not exactly match these will be printed verbatim.
|
||||
|
||||
## Escape codes
|
||||
Value | Escape code for
|
||||
@@ -38,7 +35,7 @@ Value | Meaning
|
||||
`capslock` | Actives and locks Shift
|
||||
|
||||
## Special keys
|
||||
These keys are sent to apps, which are free to ignore them. The keyboard does not perform editing in response to these keys.
|
||||
These keys are sent to apps, which are free to ignore them. The keyboard do not perform editing in response to these keys.
|
||||
|
||||
`esc`, `enter`,
|
||||
`up`, `right`,
|
||||
@@ -56,8 +53,7 @@ These keys are sent to apps, which are free to ignore them. The keyboard does no
|
||||
Value | Meaning
|
||||
:------ | :------
|
||||
`space` | Space bar.
|
||||
`nbsp` | Non-breaking space.
|
||||
`nnbsp` | Narrow non-breaking space.
|
||||
`nbsp` | No-break space. Note: To input the narrow no-break space recommended for French, use `\u202F`.
|
||||
`zwj` | Zero-width joiner.
|
||||
`zwnj` | Zero-width non-joiner.
|
||||
|
||||
@@ -86,7 +82,7 @@ Value | Meaning
|
||||
`accent_slash` | Slash through. `ø`
|
||||
`accent_arrow_right` | Right arrow above, used to denote a vector. `a⃗`
|
||||
`accent_breve` | Breve. `ă`
|
||||
`accent_bar` | Bar/strikethrough. `ɨ`
|
||||
`accent_bar` | Bar/strikethrough. `ᵢ`
|
||||
`accent_dot_below` | Dot below. `ạ`
|
||||
`accent_horn` | Horn accent. `ơ`
|
||||
`accent_hook_above` | Hook accent. `ả`
|
||||
|
@@ -1,11 +0,0 @@
|
||||
MessagEase and Thumb-Key inspired gestures with the anti-clockwise circle being
|
||||
completely configurable.
|
||||
|
||||
Updated emojis.
|
||||
Improved Hangul (Korean) support.
|
||||
Added Danish support.
|
||||
Improved spacebar slider.
|
||||
Updated translations.
|
||||
Various improvements and fixes to the app and layouts.
|
||||
|
||||
Many thanks to the contributors: @alotbsol555 @bkmgit @Cheesebaron @CloneWith @eandersons @JapanYoshi @Julow @la-ninpre @m15a @marciozomb13 @polyctena @solokot @Spike-from-NH @tmqCypher @Validbit
|
@@ -1,8 +0,0 @@
|
||||
Clipboard pane
|
||||
|
||||
New Monet theme
|
||||
Improvements to custom layouts
|
||||
Options to disable key repeat and the circle gesture
|
||||
Options to disable the Tab and Esc keys
|
||||
|
||||
Many thanks to the contributors: @alotbsol555 @ChasmSolacer @eandersons @polyctena @Sestowner @solokot @Spike-from-NH @TadaCZE @V6lhost @Validbit
|
@@ -1,6 +0,0 @@
|
||||
Fix crash on Android 6.
|
||||
Fix scaling issues for layouts with few columns.
|
||||
Added Serbian layouts.
|
||||
Layout and compose key tweaks. Improvements to custom layouts. Added Menu key.
|
||||
|
||||
Many thanks to the contributors: @adrian4096 @asivery @bokidori @dingodoppelt @RZHSSNZDH
|
@@ -1 +0,0 @@
|
||||
<!-- drawable/file_send.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M14,2H6C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M12.54,19.37V17.37H8.54V15.38H12.54V13.38L15.54,16.38L12.54,19.37M13,9V3.5L18.5,9H13Z" /></vector>
|
@@ -1 +0,0 @@
|
||||
<!-- drawable/bookmark_plus.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M17,3A2,2 0 0,1 19,5V21L12,18L5,21V5C5,3.89 5.9,3 7,3H17M11,7V9H9V11H11V13H13V11H15V9H13V7H11Z" /></vector>
|
@@ -1 +0,0 @@
|
||||
<!-- drawable/delete.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z" /></vector>
|
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
|
||||
<TextView android:id="@+id/clipboard_entry_text" style="@style/clipboardEntry"/>
|
||||
<LinearLayout style="@style/clipboardEntryButtons">
|
||||
<View android:id="@+id/clipboard_entry_paste" style="@style/clipboardEntryButton" android:background="@drawable/ic_clipboard_paste"/>
|
||||
<View android:id="@+id/clipboard_entry_addpin" style="@style/clipboardEntryButton" android:background="@drawable/ic_clipboard_save"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="?attr/colorKeyboard" android:hardwareAccelerated="false">
|
||||
<ScrollView android:layout_width="fill_parent" android:layout_height="@dimen/clipboard_view_height">
|
||||
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content">
|
||||
<juloo.keyboard2.ClipboardHistoryCheckBox android:text="@string/clipboard_history_heading" style="@style/clipboardHeading" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
|
||||
<juloo.keyboard2.ClipboardHistoryView android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="?attr/clipboard_divider_color" android:dividerHeight="?attr/clipboard_divider_height"/>
|
||||
<TextView android:text="@string/clipboard_pin_heading" style="@style/clipboardHeading" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
|
||||
<juloo.keyboard2.ClipboardPinView android:id="@+id/clipboard_pin_view" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:divider="?attr/clipboard_divider_color" android:dividerHeight="?attr/clipboard_divider_height"/>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
<juloo.keyboard2.Keyboard2View layout="@xml/clipboard_bottom_row" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?attr/colorKeyboard"/>
|
||||
</LinearLayout>
|
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
|
||||
<TextView android:id="@+id/clipboard_pin_text" style="@style/clipboardEntry" android:maxLines="3"/>
|
||||
<LinearLayout style="@style/clipboardEntryButtons">
|
||||
<View android:id="@+id/clipboard_pin_paste" style="@style/clipboardEntryButton" android:background="@drawable/ic_clipboard_paste"/>
|
||||
<View android:id="@+id/clipboard_pin_remove" style="@style/clipboardEntryButton" android:background="@drawable/ic_delete"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
@@ -2,5 +2,7 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:hardwareAccelerated="false">
|
||||
<juloo.keyboard2.EmojiGroupButtonsBar android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
|
||||
<juloo.keyboard2.EmojiGridView android:id="@+id/emoji_grid" android:layout_width="fill_parent" android:layout_height="@dimen/emoji_grid_height" android:orientation="vertical" android:numColumns="auto_fit" android:columnWidth="45sp" android:background="?attr/colorKeyboard"/>
|
||||
<juloo.keyboard2.Keyboard2View layout="@xml/emoji_bottom_row" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?attr/emoji_key_bg"/>
|
||||
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
|
||||
<juloo.keyboard2.Keyboard2View layout="@xml/emoji_bottom_row" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="?attr/emoji_key_bg"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
@@ -38,9 +38,8 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
|
||||
<string name="pref_category_typing">Psaní</string>
|
||||
<string name="pref_swipe_dist_title">Vzdálenost posunutí prstem</string>
|
||||
<string name="pref_swipe_dist_summary">Jak daleko je třeba posunout prst pro zadání znaku/znaménka v rohu klávey (%s)</string>
|
||||
<string name="pref_long_timeout_title">Doba pro aktivaci dlouhého podržení</string>
|
||||
<string name="pref_long_timeout_title">Časová prodleva opakování znaků</string>
|
||||
<string name="pref_long_interval_title">Interval opakování znaků</string>
|
||||
<string name="pref_keyrepeat_enabled">Opakování kláves při držení</string>
|
||||
<string name="pref_lock_double_tap_title">Dvojklik pro aktivaci Capslock(u)</string>
|
||||
<string name="pref_lock_double_tap_summary">Umožňuje zamknout Shift dvojklikem, namísto podržení</string>
|
||||
<string name="pref_category_behavior">Chování</string>
|
||||
@@ -68,9 +67,6 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
|
||||
<string name="pref_theme_e_epaper">ePapír</string>
|
||||
<string name="pref_theme_e_desert">Poušťě</string>
|
||||
<string name="pref_theme_e_jungle">Džungle</string>
|
||||
<string name="pref_theme_e_monet">Monet (dle systému)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Světlý)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Tmavý)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Velmi krátká</string>
|
||||
<string name="pref_swipe_dist_e_short">Krátká</string>
|
||||
<string name="pref_swipe_dist_e_default">Běžná</string>
|
||||
@@ -81,11 +77,6 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
|
||||
<string name="pref_border_config_title">Přizpůsobit okraje</string>
|
||||
<string name="pref_border_width_title">Šířka okraje</string>
|
||||
<string name="pref_corners_radius_title">Poloměr okraje</string>
|
||||
<string name="pref_circle_sensitivity_title">Citlivost kruhového gesta</string>
|
||||
<string name="pref_circle_sensitivity_e_high">Vysoká</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Střední</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Nízká</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Deaktivováno</string>
|
||||
<string name="key_action_next">Další</string>
|
||||
<string name="key_action_done">Dokončit</string>
|
||||
<string name="key_action_go">Spustit</string>
|
||||
@@ -119,9 +110,4 @@ Tato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Správce schránky</string>
|
||||
<string name="clipboard_history_heading">Nedávno kopírovaný text</string>
|
||||
<string name="clipboard_pin_heading">Připnout</string>
|
||||
<string name="clipboard_remove_confirm">Odebrat ze schránky?</string>
|
||||
<string name="clipboard_remove_confirmed">Ano</string>
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
|
||||
<string name="pref_category_typing">Tippen</string>
|
||||
<string name="pref_swipe_dist_title">Länge der Wischgeste</string>
|
||||
<string name="pref_swipe_dist_summary">Abstand der Zeichen in den Ecken der Tasten (%s)</string>
|
||||
<string name="pref_long_timeout_title">Zeitüberschreitung durch langes Drücken</string>
|
||||
<string name="pref_long_timeout_title">Zeitüberschreitung bei Tastenwiederholung</string>
|
||||
<string name="pref_long_interval_title">Intervall der Tastenwiederholung</string>
|
||||
<string name="pref_keyrepeat_enabled">Tastenwiederholung bei langem Drücken</string>
|
||||
<string name="pref_lock_double_tap_title">Umschalttaste mit Doppeltippen einrasten</string>
|
||||
<string name="pref_lock_double_tap_summary">Anstatt Taste längere Zeit gedrückt zu halten</string>
|
||||
<string name="pref_category_behavior">Verhalten</string>
|
||||
@@ -68,9 +67,6 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Wüste</string>
|
||||
<string name="pref_theme_e_jungle">Dschungel</string>
|
||||
<string name="pref_theme_e_monet">Monet (System)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Hell)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Dunkel)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Sehr kurz</string>
|
||||
<string name="pref_swipe_dist_e_short">Kurz</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -81,11 +77,6 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
|
||||
<string name="pref_border_config_title">Ränder anpassen</string>
|
||||
<string name="pref_border_width_title">Randbreite</string>
|
||||
<string name="pref_corners_radius_title">Radius der Ecken</string>
|
||||
<string name="pref_circle_sensitivity_title">Empfindlichkeit der Kreisgeste</string>
|
||||
<string name="pref_circle_sensitivity_e_high">Hoch</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Mittel</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Niedrig</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Aus</string>
|
||||
<string name="key_action_next">Nächstes</string>
|
||||
<string name="key_action_done">Fertig</string>
|
||||
<string name="key_action_go">Los</string>
|
||||
@@ -119,9 +110,4 @@ Diese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quell
|
||||
<string name="key_descr_page_down">Bild ab</string>
|
||||
<string name="key_descr_home">Pos1</string>
|
||||
<string name="key_descr_end">Ende</string>
|
||||
<string name="key_descr_clipboard">Clipboard-Manager</string>
|
||||
<string name="clipboard_history_heading">Zuletzt kopierter Text</string>
|
||||
<string name="clipboard_pin_heading">Angeheftet</string>
|
||||
<string name="clipboard_remove_confirm">Aus der Zwischenablage entfernen?</string>
|
||||
<string name="clipboard_remove_confirmed">Ja</string>
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
|
||||
<string name="pref_category_typing">Escritura</string>
|
||||
<string name="pref_swipe_dist_title">Distancia de deslizamiento</string>
|
||||
<string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las teclas (%s)</string>
|
||||
<string name="pref_long_timeout_title">Duración para toque largo</string>
|
||||
<string name="pref_long_timeout_title">Tiempo de espera para repetir tecla</string>
|
||||
<string name="pref_long_interval_title">Intervalo de repetición de tecla</string>
|
||||
<string name="pref_keyrepeat_enabled">Permitir repetición de toque largo</string>
|
||||
<string name="pref_lock_double_tap_title">Doble toque en Mayús para bloquear las mayúsculas</string>
|
||||
<string name="pref_lock_double_tap_summary">Se puede bloquear cualquier modificador manteniéndolo presionado</string>
|
||||
<string name="pref_category_behavior">Comportamiento</string>
|
||||
@@ -68,9 +67,6 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Desierto</string>
|
||||
<string name="pref_theme_e_jungle">Selva</string>
|
||||
<string name="pref_theme_e_monet">Monet (de sistema)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (claro)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (oscuro)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Muy corta</string>
|
||||
<string name="pref_swipe_dist_e_short">Corta</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -81,11 +77,6 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
|
||||
<string name="pref_border_config_title">Bordes personalizados</string>
|
||||
<string name="pref_border_width_title">Ancho de bordes</string>
|
||||
<string name="pref_corners_radius_title">Radio de rincones</string>
|
||||
<string name="pref_circle_sensitivity_title">Sensibilidad a gestos circulares</string>
|
||||
<string name="pref_circle_sensitivity_e_high">Alta</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Mediana</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Baja</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Apagada</string>
|
||||
<string name="key_action_next">Siguiente</string>
|
||||
<string name="key_action_done">Hecho</string>
|
||||
<string name="key_action_go">Ir</string>
|
||||
@@ -119,9 +110,4 @@ La misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y
|
||||
<string name="key_descr_page_down">Re Pág</string>
|
||||
<string name="key_descr_home">Inicio</string>
|
||||
<string name="key_descr_end">Fin</string>
|
||||
<string name="key_descr_clipboard">Arreglar portapapeles</string>
|
||||
<string name="clipboard_history_heading">Textos recién copiados</string>
|
||||
<string name="clipboard_pin_heading">Pegado</string>
|
||||
<string name="clipboard_remove_confirm">¿Sacar este portapapeles?</string>
|
||||
<string name="clipboard_remove_confirmed">Sí</string>
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_category_typing">درحال نوشتن</string>
|
||||
<string name="pref_swipe_dist_title">فاصله کشیدن</string>
|
||||
<string name="pref_swipe_dist_summary">فاصله حروف از گوشههای کلیدها )(%s)</string>
|
||||
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
|
||||
<string name="pref_long_timeout_title">درنگ تکرار کلید</string>
|
||||
<string name="pref_long_interval_title">فاصله تکرار کلید</string>
|
||||
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
|
||||
<string name="pref_lock_double_tap_title">دوبار ضربه روی دگرساز برای فعال شدن کپس لاک</string>
|
||||
<string name="pref_lock_double_tap_summary">شما میتوانید قفل کنید هر میانبری را با نگه داشتن آن</string>
|
||||
<string name="pref_category_behavior">ٰرفتار</string>
|
||||
@@ -68,9 +67,6 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_theme_e_epaper">ای-پیپر</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">بسیار کوتاه</string>
|
||||
<string name="pref_swipe_dist_e_short">کوتاه</string>
|
||||
<string name="pref_swipe_dist_e_default">عادی</string>
|
||||
@@ -81,11 +77,6 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="pref_border_config_title">Customize borders</string> -->
|
||||
<!-- <string name="pref_border_width_title">Border Width</string> -->
|
||||
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
|
||||
<string name="key_action_next">بعدی</string>
|
||||
<string name="key_action_done">اتمام</string>
|
||||
<string name="key_action_go">برو</string>
|
||||
@@ -119,9 +110,4 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
||||
<string name="pref_category_typing">Saisie</string>
|
||||
<string name="pref_swipe_dist_title">Distance de swipe</string>
|
||||
<string name="pref_swipe_dist_summary">La distance des caractères dans les coins (%s)</string>
|
||||
<string name="pref_long_timeout_title">Delai de l\'appui long</string>
|
||||
<string name="pref_long_timeout_title">Délai avant répétition</string>
|
||||
<string name="pref_long_interval_title">Écart entre les répétitions</string>
|
||||
<string name="pref_keyrepeat_enabled">Répétition par appui long</string>
|
||||
<string name="pref_lock_double_tap_title">Appuyer deux fois pour bloquer la majuscule</string>
|
||||
<string name="pref_lock_double_tap_summary">Un appui long bloque la majuscule</string>
|
||||
<string name="pref_category_behavior">Comportement</string>
|
||||
@@ -48,8 +47,8 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
||||
<string name="pref_autocapitalisation_summary">Activer Shift au début des phrases</string>
|
||||
<string name="pref_switch_input_immediate_title">Changer vers le clavier utilisé en dernier</string>
|
||||
<string name="pref_switch_input_immediate_summary">Comportement de la touche de changement de clavier</string>
|
||||
<string name="pref_vibrate_custom">Vibrations personnalisées</string>
|
||||
<string name="pref_vibrate_duration_title">Intensité des vibrations</string>
|
||||
<!-- <string name="pref_vibrate_custom">Custom vibration</string> -->
|
||||
<!-- <string name="pref_vibrate_duration_title">Vibration intensity</string> -->
|
||||
<string name="pref_pin_entry_enabled_title">Clavier PIN</string>
|
||||
<string name="pref_pin_entry_enabled_summary">Lors de la saisie de nombres, de dates et de numéros de téléphone</string>
|
||||
<string name="pref_category_style">Style</string>
|
||||
@@ -68,9 +67,6 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Desert</string>
|
||||
<string name="pref_theme_e_jungle">Jungle</string>
|
||||
<string name="pref_theme_e_monet">Monet (Système)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Clair)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Sombre)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Très courte</string>
|
||||
<string name="pref_swipe_dist_e_short">Courte</string>
|
||||
<string name="pref_swipe_dist_e_default">Normale</string>
|
||||
@@ -78,14 +74,9 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
||||
<string name="pref_swipe_dist_e_very_far">Très longue</string>
|
||||
<string name="pref_key_horizontal_space">Espacement horizontal entre les touches</string>
|
||||
<string name="pref_key_vertical_space">Espacement vertical entre les touches</string>
|
||||
<string name="pref_border_config_title">Bordures personnalisées</string>
|
||||
<string name="pref_border_width_title">Largeur des bordures</string>
|
||||
<string name="pref_corners_radius_title">Rayon des coins</string>
|
||||
<string name="pref_circle_sensitivity_title">Sensibilité du mouvement en cercle</string>
|
||||
<string name="pref_circle_sensitivity_e_high">Haute</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Moyenne</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Basse</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Désactivée</string>
|
||||
<!-- <string name="pref_border_config_title">Customize borders</string> -->
|
||||
<!-- <string name="pref_border_width_title">Border Width</string> -->
|
||||
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
|
||||
<string name="key_action_next">Suiv.</string>
|
||||
<string name="key_action_done">Fin</string>
|
||||
<string name="key_action_go">Aller</string>
|
||||
@@ -97,11 +88,11 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
||||
<string name="launcher_description">Cette application est un clavier virtuel. Activez-le dans les paramètres système en cliquant sur le bouton ci-dessous.</string>
|
||||
<string name="launcher_sourcecode">Cette application est libre et open-source. Lisez le source code et reportez des problèmes sur Github.</string>
|
||||
<string name="launcher_tryhere">Après l\'avoir activé, vous pouvez l\'essayer ici:</string>
|
||||
<string name="launcher_tryhere_hint">Essayer ici</string>
|
||||
<!-- <string name="launcher_tryhere_hint">Try here</string> -->
|
||||
<string name="key_descr_capslock">Verrouillage majuscules</string>
|
||||
<string name="key_descr_compose">Compose</string>
|
||||
<!-- <string name="key_descr_compose">Compose</string> -->
|
||||
<string name="key_descr_switch_greekmath">Symboles mathématiques</string>
|
||||
<string name="key_descr_change_method">Changer de clavier</string>
|
||||
<!-- <string name="key_descr_change_method">Switch keyboard</string> -->
|
||||
<string name="key_descr_voice_typing">Saisie vocale</string>
|
||||
<string name="key_descr_copy">Copier</string>
|
||||
<string name="key_descr_paste">Coller</string>
|
||||
@@ -119,9 +110,4 @@ Cette application ne contient pas de publicité, n'accède pas au réseau et est
|
||||
<string name="key_descr_page_down">Page suivante</string>
|
||||
<string name="key_descr_home">Début</string>
|
||||
<string name="key_descr_end">Fin</string>
|
||||
<string name="key_descr_clipboard">Presse-papiers</string>
|
||||
<string name="clipboard_history_heading">Texte récemment copié</string>
|
||||
<string name="clipboard_pin_heading">Épinglé</string>
|
||||
<string name="clipboard_remove_confirm">Supprimer ce presse-papiers ?</string>
|
||||
<string name="clipboard_remove_confirmed">Oui</string>
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_category_typing">Digitando</string>
|
||||
<string name="pref_swipe_dist_title">Distanza swipe</string>
|
||||
<string name="pref_swipe_dist_summary">Distanza dei caratteri negli angoli dei tasti (%s)</string>
|
||||
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
|
||||
<string name="pref_long_timeout_title">Timeout ripetizione tasto</string>
|
||||
<string name="pref_long_interval_title">Intervallo ripetizione tasto</string>
|
||||
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
|
||||
<string name="pref_lock_double_tap_title">Doppio tocco su Shift per attivare CapsLock</string>
|
||||
<string name="pref_lock_double_tap_summary">Invece di premere i modificatori a lungo</string>
|
||||
<!-- <string name="pref_category_behavior">Behavior</string> -->
|
||||
@@ -68,9 +67,6 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="pref_theme_e_epaper">ePaper</string> -->
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Veramente breve</string>
|
||||
<string name="pref_swipe_dist_e_short">Breve</string>
|
||||
<string name="pref_swipe_dist_e_default">Normale</string>
|
||||
@@ -81,11 +77,6 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="pref_border_config_title">Customize borders</string> -->
|
||||
<!-- <string name="pref_border_width_title">Border Width</string> -->
|
||||
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
|
||||
<string name="key_action_next">Prossimo</string>
|
||||
<string name="key_action_done">Fatto</string>
|
||||
<string name="key_action_go">Vai</string>
|
||||
@@ -119,9 +110,4 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_category_typing">타자</string>
|
||||
<string name="pref_swipe_dist_title">스와이프 범위</string>
|
||||
<string name="pref_swipe_dist_summary">키 모서리 문자의 입력 범위 (%s)</string>
|
||||
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
|
||||
<string name="pref_long_timeout_title">키 길게 누르기 지연</string>
|
||||
<string name="pref_long_interval_title">키 반복 간격</string>
|
||||
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
|
||||
<!-- <string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string> -->
|
||||
<!-- <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string> -->
|
||||
<!-- <string name="pref_category_behavior">Behavior</string> -->
|
||||
@@ -68,9 +67,6 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="pref_theme_e_epaper">ePaper</string> -->
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">매우 짧음</string>
|
||||
<string name="pref_swipe_dist_e_short">짧음</string>
|
||||
<string name="pref_swipe_dist_e_default">보통</string>
|
||||
@@ -81,11 +77,6 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="pref_border_config_title">Customize borders</string> -->
|
||||
<!-- <string name="pref_border_width_title">Border Width</string> -->
|
||||
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
|
||||
<string name="key_action_next">다음</string>
|
||||
<string name="key_action_done">확인</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -119,9 +110,4 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ Tagad lieliski piemērota izmantošanai ikdienā.
|
||||
<string name="pref_category_typing">Rakstīšana</string>
|
||||
<string name="pref_swipe_dist_title">Pavilkšanas attālums</string>
|
||||
<string name="pref_swipe_dist_summary">Taustiņu stūros esošo rakstzīmju attālums (%s)</string>
|
||||
<string name="pref_long_timeout_title">Ilgas piepiešanas noildze</string>
|
||||
<string name="pref_long_timeout_title">Taustiņa atkārtošanās ātrums</string>
|
||||
<string name="pref_long_interval_title">Taustiņa atkārtošanās aizture</string>
|
||||
<string name="pref_keyrepeat_enabled">Taustiņa atkārtošanās ar ilgu piespiešanu</string>
|
||||
<string name="pref_lock_double_tap_title">Divkāršs piesitiens burtslēgam</string>
|
||||
<string name="pref_lock_double_tap_summary">Tā vietā, lai ilstoši piespiestu pārveidotāju</string>
|
||||
<string name="pref_category_behavior">Uzvedība</string>
|
||||
@@ -68,9 +67,6 @@ Tagad lieliski piemērota izmantošanai ikdienā.
|
||||
<string name="pref_theme_e_epaper">ePapīrs</string>
|
||||
<string name="pref_theme_e_desert">Tuksnesis</string>
|
||||
<string name="pref_theme_e_jungle">Džungļi</string>
|
||||
<string name="pref_theme_e_monet">Monē (sistēmas)</string>
|
||||
<string name="pref_theme_e_monetlight">Monē (gaišs)</string>
|
||||
<string name="pref_theme_e_monetdark">Monē (tumšs)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string>
|
||||
<string name="pref_swipe_dist_e_short">Tuvs</string>
|
||||
<string name="pref_swipe_dist_e_default">Vidējs</string>
|
||||
@@ -81,11 +77,6 @@ Tagad lieliski piemērota izmantošanai ikdienā.
|
||||
<string name="pref_border_config_title">Pielāgot apmales</string>
|
||||
<string name="pref_border_width_title">Apmales platums</string>
|
||||
<string name="pref_corners_radius_title">Stūru rādiuss</string>
|
||||
<string name="pref_circle_sensitivity_title">Apļveida kustības jutīgums</string>
|
||||
<string name="pref_circle_sensitivity_e_high">Augsts</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Vidējs</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Zems</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Atspējots</string>
|
||||
<string name="key_action_next">Nākamais</string>
|
||||
<string name="key_action_done">Darīts</string>
|
||||
<string name="key_action_go">Aiziet</string>
|
||||
@@ -121,9 +112,4 @@ Tagad lieliski piemērota izmantošanai ikdienā.
|
||||
<string name="key_descr_page_down">Lejupšķirt</string>
|
||||
<string name="key_descr_home">Sākums</string>
|
||||
<string name="key_descr_end">Beigas</string>
|
||||
<string name="key_descr_clipboard">Starpliktuves pārvaldnieks</string>
|
||||
<string name="clipboard_history_heading">Nesen starpliktuvē ievietots teksts</string>
|
||||
<string name="clipboard_pin_heading">Piesprausts</string>
|
||||
<string name="clipboard_remove_confirm">Noņemt šo starpliktuves vienumu?</string>
|
||||
<string name="clipboard_remove_confirmed">Jā</string>
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
|
||||
<string name="pref_category_typing">Pisanie</string>
|
||||
<string name="pref_swipe_dist_title">Odległość przesuwania</string>
|
||||
<string name="pref_swipe_dist_summary">Odległość znaków od rogów klawiszy (%s)</string>
|
||||
<string name="pref_long_timeout_title">Opóźnienie przytrzymania klawisza</string>
|
||||
<string name="pref_long_interval_title">Czas pomiędzy powtórzeniem klawisza</string>
|
||||
<string name="pref_keyrepeat_enabled">Powtarzanie klawisza po przytrzymaniu</string>
|
||||
<string name="pref_long_timeout_title">Opóźnienie powtarzania naciśnięć klawisza</string>
|
||||
<string name="pref_long_interval_title">Czas pomiędzy powtórzeniami</string>
|
||||
<string name="pref_lock_double_tap_title">Naciśnij Shift podwójnie, aby włączyć caps lock</string>
|
||||
<string name="pref_lock_double_tap_summary">Możesz zablokować modyfikator poprzez jego długie naciśnięcie</string>
|
||||
<string name="pref_category_behavior">Zachowanie</string>
|
||||
@@ -68,9 +67,6 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
|
||||
<string name="pref_theme_e_epaper">e-paper</string>
|
||||
<string name="pref_theme_e_desert">Pustynny</string>
|
||||
<string name="pref_theme_e_jungle">Dżunglowy</string>
|
||||
<string name="pref_theme_e_monet">Monet (Systemowy)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Jasny)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Ciemny)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Bardzo mała</string>
|
||||
<string name="pref_swipe_dist_e_short">Mała</string>
|
||||
<string name="pref_swipe_dist_e_default">Normalna</string>
|
||||
@@ -81,11 +77,6 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
|
||||
<string name="pref_border_config_title">Dostosuj krawędzie</string>
|
||||
<string name="pref_border_width_title">Grubość krawedzi</string>
|
||||
<string name="pref_corners_radius_title">Promień rogów</string>
|
||||
<string name="pref_circle_sensitivity_title">Czułość gestu koła</string>
|
||||
<string name="pref_circle_sensitivity_e_high">Wysoka</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Średnia</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Mała</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Wyłączona</string>
|
||||
<string name="key_action_next">Dalej</string>
|
||||
<string name="key_action_done">OK</string>
|
||||
<string name="key_action_go">Przejdź</string>
|
||||
@@ -119,9 +110,4 @@ Aplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źród
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Zarządzanie schowkiem</string>
|
||||
<string name="clipboard_history_heading">Ostatnio skopiowane elementy</string>
|
||||
<string name="clipboard_pin_heading">Przypięte</string>
|
||||
<string name="clipboard_remove_confirm">Usunąć ten element ze schowka?</string>
|
||||
<string name="clipboard_remove_confirmed">Tak</string>
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
|
||||
<string name="pref_category_typing">Digitação</string>
|
||||
<string name="pref_swipe_dist_title">Distância a deslizar</string>
|
||||
<string name="pref_swipe_dist_summary">Distância até acionar os cantos das teclas (%s)</string>
|
||||
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
|
||||
<string name="pref_long_timeout_title">Tempo até repetir tecla</string>
|
||||
<string name="pref_long_interval_title">Intervalo de repetição de tecla</string>
|
||||
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
|
||||
<string name="pref_lock_double_tap_title">Tecle duas vezes no shift para travá-lo acionado</string>
|
||||
<string name="pref_lock_double_tap_summary">Ao invés de apertar e segurar por um tempo</string>
|
||||
<string name="pref_category_behavior">Comportamento</string>
|
||||
@@ -68,9 +67,6 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
|
||||
<string name="pref_theme_e_epaper">Papel Eletrônico</string>
|
||||
<string name="pref_theme_e_desert">Deserto</string>
|
||||
<string name="pref_theme_e_jungle">Selva</string>
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Bem curto</string>
|
||||
<string name="pref_swipe_dist_e_short">Curto</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -81,11 +77,6 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
|
||||
<string name="pref_border_config_title">Personalizar bordas</string>
|
||||
<string name="pref_border_width_title">Largura de borda</string>
|
||||
<string name="pref_corners_radius_title">Arredondamento de canto</string>
|
||||
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
|
||||
<string name="key_action_next">Próximo</string>
|
||||
<string name="key_action_done">Pronto</string>
|
||||
<string name="key_action_go">Ir</string>
|
||||
@@ -119,9 +110,4 @@ Este aplicativo não contém anúncios, não faz nenhuma solicitação de rede e
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
|
||||
<string name="pref_category_typing">Tipărire</string>
|
||||
<string name="pref_swipe_dist_title">Distanța de glisare</string>
|
||||
<string name="pref_swipe_dist_summary">Distanța dintre caracterele din colțurile tastelor (%s)</string>
|
||||
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
|
||||
<string name="pref_long_timeout_title">Timeout pentru repetarea tastelor</string>
|
||||
<string name="pref_long_interval_title">Intervalul de repetare a tastelor</string>
|
||||
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
|
||||
<string name="pref_lock_double_tap_title">Apăsare dublă pe Shift activează Caps Lock</string>
|
||||
<string name="pref_lock_double_tap_summary">Puteți activa orice modificator, ținându-l apăsat</string>
|
||||
<string name="pref_category_behavior">Comportament</string>
|
||||
@@ -68,9 +67,6 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Foarte apropiată</string>
|
||||
<string name="pref_swipe_dist_e_short">Apropiată</string>
|
||||
<string name="pref_swipe_dist_e_default">Normală</string>
|
||||
@@ -81,11 +77,6 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
|
||||
<!-- <string name="pref_border_config_title">Customize borders</string> -->
|
||||
<!-- <string name="pref_border_width_title">Border Width</string> -->
|
||||
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
|
||||
<string name="key_action_next">Următor</string>
|
||||
<string name="key_action_done">Gata</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -119,9 +110,4 @@ Această aplicație nu conține publicitate, nu folosește rețeaua deloc și e
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||
</resources>
|
||||
|
@@ -38,10 +38,9 @@
|
||||
<string name="pref_category_typing">Набор текста</string>
|
||||
<string name="pref_swipe_dist_title">Длина жеста</string>
|
||||
<string name="pref_swipe_dist_summary">Расстояние между символами в углах клавиш (%s)</string>
|
||||
<string name="pref_long_timeout_title">Задержка долгого нажатия</string>
|
||||
<string name="pref_long_timeout_title">Задержка повтора клавиш</string>
|
||||
<string name="pref_long_interval_title">Интервал повтора клавиш</string>
|
||||
<string name="pref_keyrepeat_enabled">Повтор клавиши при долгом нажатии</string>
|
||||
<string name="pref_lock_double_tap_title">CapsLock двойным нажатием Shift</string>
|
||||
<string name="pref_lock_double_tap_title">Двойное нажатие Shift включает CapsLock</string>
|
||||
<string name="pref_lock_double_tap_summary">Также можно активировать модификатор долгим нажатием</string>
|
||||
<string name="pref_category_behavior">Поведение</string>
|
||||
<string name="pref_autocapitalisation_title">Автоматическая смена регистра</string>
|
||||
@@ -68,9 +67,6 @@
|
||||
<string name="pref_theme_e_epaper">Электронная бумага</string>
|
||||
<string name="pref_theme_e_desert">Пустыня</string>
|
||||
<string name="pref_theme_e_jungle">Джунгли</string>
|
||||
<string name="pref_theme_e_monet">Моне (системная)</string>
|
||||
<string name="pref_theme_e_monetlight">Моне (светлая)</string>
|
||||
<string name="pref_theme_e_monetdark">Моне (темная)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Очень короткая</string>
|
||||
<string name="pref_swipe_dist_e_short">Короткая</string>
|
||||
<string name="pref_swipe_dist_e_default">Обычная</string>
|
||||
@@ -81,11 +77,6 @@
|
||||
<string name="pref_border_config_title">Настройка рамки</string>
|
||||
<string name="pref_border_width_title">Ширина рамки</string>
|
||||
<string name="pref_corners_radius_title">Радиус скругления</string>
|
||||
<string name="pref_circle_sensitivity_title">Чувствительность круговых жестов</string>
|
||||
<string name="pref_circle_sensitivity_e_high">Высокая</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Средняя</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Низкая</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Отключено</string>
|
||||
<string name="key_action_next">Вперед</string>
|
||||
<string name="key_action_done">Ввод</string>
|
||||
<string name="key_action_go">Перейти</string>
|
||||
@@ -119,9 +110,4 @@
|
||||
<string name="key_descr_page_down">Страница вниз</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Менеджер буфера обмена</string>
|
||||
<string name="clipboard_history_heading">Недавно скопированный текст</string>
|
||||
<string name="clipboard_pin_heading">Закреплено</string>
|
||||
<string name="clipboard_remove_confirm">Удалить этот буфер обмена?</string>
|
||||
<string name="clipboard_remove_confirmed">Да</string>
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
|
||||
<string name="pref_category_typing">Yazma</string>
|
||||
<string name="pref_swipe_dist_title">Kaydırma mesafesi</string>
|
||||
<string name="pref_swipe_dist_summary">Tuşların köşelerinden kaydırma mesafesi (%s)</string>
|
||||
<string name="pref_long_timeout_title">Uzun basma süresi</string>
|
||||
<string name="pref_long_timeout_title">Tuşların tekrarlaması için geçmesi gereken süre</string>
|
||||
<string name="pref_long_interval_title">Tuşların tekrarlama sıklığı</string>
|
||||
<string name="pref_keyrepeat_enabled">Uzun basınca tuş tekrarlamaları</string>
|
||||
<string name="pref_lock_double_tap_title">CapsLock için Shift tuşuna çift bas</string>
|
||||
<string name="pref_lock_double_tap_summary">Uzun basarak CapsLock açılabilir</string>
|
||||
<string name="pref_category_behavior">Klavye davranışı</string>
|
||||
@@ -68,9 +67,6 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
|
||||
<string name="pref_theme_e_epaper">E-Kağıt</string>
|
||||
<string name="pref_theme_e_desert">Çöl</string>
|
||||
<string name="pref_theme_e_jungle">Orman</string>
|
||||
<string name="pref_theme_e_monet">Monet (Sisteme uyarla)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Açık)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Koyu)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Çok kısa</string>
|
||||
<string name="pref_swipe_dist_e_short">Kısa</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -78,14 +74,9 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
|
||||
<string name="pref_swipe_dist_e_very_far">Çok uzun</string>
|
||||
<string name="pref_key_horizontal_space">Tuşlar arasındaki yatay boşluk</string>
|
||||
<string name="pref_key_vertical_space">Tuşlar arasındaki dikey boşluk</string>
|
||||
<string name="pref_border_config_title">Çerçeveyi özelleştir</string>
|
||||
<string name="pref_border_width_title">Çerçeve kalınlığı</string>
|
||||
<string name="pref_corners_radius_title">Kenar yumuşaklığı</string>
|
||||
<string name="pref_circle_sensitivity_title">Dairesel hareket hassasiyeti</string>
|
||||
<string name="pref_circle_sensitivity_e_high">Yüksek</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Orta</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Düşük</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Devre dışı</string>
|
||||
<!-- <string name="pref_border_config_title">Customize borders</string> -->
|
||||
<!-- <string name="pref_border_width_title">Border Width</string> -->
|
||||
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
|
||||
<string name="key_action_next">Sonraki</string>
|
||||
<string name="key_action_done">Tamam</string>
|
||||
<string name="key_action_go">ileri</string>
|
||||
@@ -97,9 +88,9 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
|
||||
<string name="launcher_description">Bu uygulama bir sanal klavye uygulamasıdır. Aşağıdaki butona basarak sistem ayarlarında etkinleştiriniz.</string>
|
||||
<string name="launcher_sourcecode">Bu uygulama ücretsiz ve açık kaynaklıdır. Kaynak koduna erişmek veya bir hata raporlamak için GitHub</string>
|
||||
<string name="launcher_tryhere">Ayarlardan aktif ettikten sonra klavyeyi burada test edebilirsin:</string>
|
||||
<string name="launcher_tryhere_hint">Burada dene</string>
|
||||
<!-- <string name="launcher_tryhere_hint">Try here</string> -->
|
||||
<string name="key_descr_capslock">CapsLock</string>
|
||||
<string name="key_descr_compose">Oluştur</string>
|
||||
<!-- <string name="key_descr_compose">Compose</string> -->
|
||||
<string name="key_descr_switch_greekmath">Greek & math sembolleri</string>
|
||||
<string name="key_descr_change_method">Klavye değiştir</string>
|
||||
<string name="key_descr_voice_typing">Sesle yazma</string>
|
||||
@@ -119,9 +110,4 @@ Bu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz."</str
|
||||
<string name="key_descr_page_down">Aşağı</string>
|
||||
<string name="key_descr_home">BAŞ(Sol yön tuşu)</string>
|
||||
<string name="key_descr_end">SON(Sağ yön tuşu)</string>
|
||||
<string name="key_descr_clipboard">Pano</string>
|
||||
<string name="clipboard_history_heading">Son kopyalanan metin</string>
|
||||
<string name="clipboard_pin_heading">Sabitlendi</string>
|
||||
<string name="clipboard_remove_confirm">Bu sabitlemeyi sil</string>
|
||||
<string name="clipboard_remove_confirmed">Evet</string>
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@
|
||||
<string name="pref_category_typing">Введення</string>
|
||||
<string name="pref_swipe_dist_title">Відстань проведення</string>
|
||||
<string name="pref_swipe_dist_summary">Відстань між символами в кутах клавіш (%s)</string>
|
||||
<string name="pref_long_timeout_title">Час очікування тривалого натискання</string>
|
||||
<string name="pref_long_timeout_title">Час очікування повтору клавіші</string>
|
||||
<string name="pref_long_interval_title">Інтервал повторення клавіш</string>
|
||||
<string name="pref_keyrepeat_enabled">Повторення клавіші при тривалому натисканні</string>
|
||||
<string name="pref_lock_double_tap_title">Двічі торкніться Shift для Caps Lock</string>
|
||||
<string name="pref_lock_double_tap_summary">Ви можете заблокувати будь-який модифікатор, утримуючи його</string>
|
||||
<string name="pref_category_behavior">Поведінка</string>
|
||||
@@ -68,9 +67,6 @@
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Пустеля</string>
|
||||
<string name="pref_theme_e_jungle">Джунглі</string>
|
||||
<string name="pref_theme_e_monet">Моне (Системна)</string>
|
||||
<string name="pref_theme_e_monetlight">Моне (Світла)</string>
|
||||
<string name="pref_theme_e_monetdark">Моне (Темна)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Дуже коротка</string>
|
||||
<string name="pref_swipe_dist_e_short">Коротка</string>
|
||||
<string name="pref_swipe_dist_e_default">Звичайна</string>
|
||||
@@ -81,11 +77,6 @@
|
||||
<string name="pref_border_config_title">Налаштувати межі</string>
|
||||
<string name="pref_border_width_title">Ширина межі</string>
|
||||
<string name="pref_corners_radius_title">Радіус кута</string>
|
||||
<string name="pref_circle_sensitivity_title">Чутливість до колових жестів</string>
|
||||
<string name="pref_circle_sensitivity_e_high">Висока</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Середня</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Низька</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Вимкнено</string>
|
||||
<string name="key_action_next">Далі</string>
|
||||
<string name="key_action_done">Готово</string>
|
||||
<string name="key_action_go">Іти</string>
|
||||
@@ -119,9 +110,4 @@
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Менеджер буфера обміну</string>
|
||||
<string name="clipboard_history_heading">Нещодавно скопійований текст</string>
|
||||
<string name="clipboard_pin_heading">Закріплено</string>
|
||||
<string name="clipboard_remove_confirm">Видалити цей буфер обміну?</string>
|
||||
<string name="clipboard_remove_confirmed">Так</string>
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
|
||||
<string name="pref_category_typing">Gõ</string>
|
||||
<string name="pref_swipe_dist_title">Khoảng cách vuốt</string>
|
||||
<string name="pref_swipe_dist_summary">Khoảng cách giữa các ký tự ở góc phím (%s)</string>
|
||||
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
|
||||
<string name="pref_long_timeout_title">Thời hạn lặp phím</string>
|
||||
<string name="pref_long_interval_title">Khoảng thời gian lặp phím</string>
|
||||
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
|
||||
<string name="pref_lock_double_tap_title">Nhấn hai lần Shift để bật Caps Lock</string>
|
||||
<string name="pref_lock_double_tap_summary">Bạn có thể khóa phím hỗ trợ bằng cách giữ vào nó</string>
|
||||
<!-- <string name="pref_category_behavior">Behavior</string> -->
|
||||
@@ -68,9 +67,6 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<!-- <string name="pref_theme_e_desert">Desert</string> -->
|
||||
<!-- <string name="pref_theme_e_jungle">Jungle</string> -->
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Rất gần</string>
|
||||
<string name="pref_swipe_dist_e_short">Gần</string>
|
||||
<string name="pref_swipe_dist_e_default">Trungbình</string>
|
||||
@@ -81,11 +77,6 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
|
||||
<!-- <string name="pref_border_config_title">Customize borders</string> -->
|
||||
<!-- <string name="pref_border_width_title">Border Width</string> -->
|
||||
<!-- <string name="pref_corners_radius_title">Corner radius</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
|
||||
<string name="key_action_next">Tiếp</string>
|
||||
<string name="key_action_done">Xong</string>
|
||||
<string name="key_action_go">Đi</string>
|
||||
@@ -119,9 +110,4 @@ Bây giờ đã hoàn hảo cho việc sử dụng hàng ngày.
|
||||
<!-- <string name="key_descr_page_down">Page Down</string> -->
|
||||
<!-- <string name="key_descr_home">Home</string> -->
|
||||
<!-- <string name="key_descr_end">End</string> -->
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||
</resources>
|
||||
|
@@ -38,9 +38,8 @@
|
||||
<string name="pref_category_typing">输入</string>
|
||||
<string name="pref_swipe_dist_title">滑动触发距离</string>
|
||||
<string name="pref_swipe_dist_summary">输入按键四角的符号需要滑动的距离 (%s)</string>
|
||||
<!-- <string name="pref_long_timeout_title">Long press timeout</string> -->
|
||||
<string name="pref_long_timeout_title">长按到开始重复输入的时间</string>
|
||||
<string name="pref_long_interval_title">长按后每次重复输入的时间间隔</string>
|
||||
<!-- <string name="pref_keyrepeat_enabled">Key repeat on long press</string> -->
|
||||
<string name="pref_lock_double_tap_title">双击 Shift 键锁定大写</string>
|
||||
<string name="pref_lock_double_tap_summary">任何时候长按修饰键均可将其锁定</string>
|
||||
<string name="pref_category_behavior">行为</string>
|
||||
@@ -68,9 +67,6 @@
|
||||
<string name="pref_theme_e_epaper">白色带边框</string>
|
||||
<string name="pref_theme_e_desert">沙漠</string>
|
||||
<string name="pref_theme_e_jungle">雨林</string>
|
||||
<!-- <string name="pref_theme_e_monet">Monet (System)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetlight">Monet (Light)</string> -->
|
||||
<!-- <string name="pref_theme_e_monetdark">Monet (Dark)</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">非常短</string>
|
||||
<string name="pref_swipe_dist_e_short">短</string>
|
||||
<string name="pref_swipe_dist_e_default">中(默认)</string>
|
||||
@@ -81,11 +77,6 @@
|
||||
<string name="pref_border_config_title">自定义边界</string>
|
||||
<string name="pref_border_width_title">边界宽度</string>
|
||||
<string name="pref_corners_radius_title">圆角半径</string>
|
||||
<!-- <string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_high">High</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_medium">Medium</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_low">Low</string> -->
|
||||
<!-- <string name="pref_circle_sensitivity_e_disabled">Disabled</string> -->
|
||||
<string name="key_action_next">下一项</string>
|
||||
<string name="key_action_done">完成</string>
|
||||
<string name="key_action_go">前往</string>
|
||||
@@ -119,9 +110,4 @@
|
||||
<string name="key_descr_page_down">下一页</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<!-- <string name="key_descr_clipboard">Clipboard manager</string> -->
|
||||
<!-- <string name="clipboard_history_heading">Recently copied text</string> -->
|
||||
<!-- <string name="clipboard_pin_heading">Pinned</string> -->
|
||||
<!-- <string name="clipboard_remove_confirm">Remove this clipboard?</string> -->
|
||||
<!-- <string name="clipboard_remove_confirmed">Yes</string> -->
|
||||
</resources>
|
||||
|
@@ -28,9 +28,6 @@
|
||||
<item>@string/pref_theme_e_epaper</item>
|
||||
<item>@string/pref_theme_e_desert</item>
|
||||
<item>@string/pref_theme_e_jungle</item>
|
||||
<item>@string/pref_theme_e_monet</item>
|
||||
<item>@string/pref_theme_e_monetlight</item>
|
||||
<item>@string/pref_theme_e_monetdark</item>
|
||||
</string-array>
|
||||
<string-array name="pref_theme_values">
|
||||
<item>system</item>
|
||||
@@ -42,9 +39,6 @@
|
||||
<item>epaper</item>
|
||||
<item>desert</item>
|
||||
<item>jungle</item>
|
||||
<item>monet</item>
|
||||
<item>monetlight</item>
|
||||
<item>monetdark</item>
|
||||
</string-array>
|
||||
<string-array name="pref_swipe_dist_entries">
|
||||
<item>@string/pref_swipe_dist_e_very_short</item>
|
||||
@@ -60,16 +54,4 @@
|
||||
<item>25</item>
|
||||
<item>35</item>
|
||||
</string-array>
|
||||
<string-array name="pref_circle_sensitivity_entries">
|
||||
<item>@string/pref_circle_sensitivity_e_high</item>
|
||||
<item>@string/pref_circle_sensitivity_e_medium</item>
|
||||
<item>@string/pref_circle_sensitivity_e_low</item>
|
||||
<item>@string/pref_circle_sensitivity_e_disabled</item>
|
||||
</string-array>
|
||||
<string-array name="pref_circle_sensitivity_values">
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
<item>12</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
@@ -17,7 +17,6 @@
|
||||
<item>beng_provat</item>
|
||||
<item>cyrl_jcuken_ru</item>
|
||||
<item>cyrl_jcuken_uk</item>
|
||||
<item>cyrl_lynyertz_sr</item>
|
||||
<item>cyrl_ueishsht</item>
|
||||
<item>cyrl_yaverti</item>
|
||||
<item>deva_alt</item>
|
||||
@@ -43,7 +42,6 @@
|
||||
<item>latn_qwerty_ro</item>
|
||||
<item>latn_qwerty_se</item>
|
||||
<item>latn_qwerty_sk</item>
|
||||
<item>latn_qwerty_sr</item>
|
||||
<item>latn_qwerty_tly</item>
|
||||
<item>latn_qwerty_tr</item>
|
||||
<item>latn_qwerty_vi</item>
|
||||
@@ -74,7 +72,6 @@
|
||||
<item>বাংলা (প্রভাত)</item>
|
||||
<item>ЙЦУКЕН (Русский)</item>
|
||||
<item>ЙЦУКЕН (Українська)</item>
|
||||
<item>ЉЊЕРТЗ (Српски)</item>
|
||||
<item>УЕИШЩ (Български, БДС)</item>
|
||||
<item>ЯВЕРТЪ</item>
|
||||
<item>देवनागरी (हिंदी)-2</item>
|
||||
@@ -100,7 +97,6 @@
|
||||
<item>QWERTY (Română)</item>
|
||||
<item>QWERTY (Swedish)</item>
|
||||
<item>QWERTY (Slovak)</item>
|
||||
<item>QWERTY (Srpski, latinica)</item>
|
||||
<item>QWERTY (Talysh New Latin)</item>
|
||||
<item>QWERTY (Türkçe)</item>
|
||||
<item>QWERTY (Vietnamese)</item>
|
||||
@@ -131,7 +127,6 @@
|
||||
<item>@xml/beng_provat</item>
|
||||
<item>@xml/cyrl_jcuken_ru</item>
|
||||
<item>@xml/cyrl_jcuken_uk</item>
|
||||
<item>@xml/cyrl_lynyertz_sr</item>
|
||||
<item>@xml/cyrl_ueishsht</item>
|
||||
<item>@xml/cyrl_yaverti</item>
|
||||
<item>@xml/deva_alt</item>
|
||||
@@ -157,7 +152,6 @@
|
||||
<item>@xml/latn_qwerty_ro</item>
|
||||
<item>@xml/latn_qwerty_se</item>
|
||||
<item>@xml/latn_qwerty_sk</item>
|
||||
<item>@xml/latn_qwerty_sr</item>
|
||||
<item>@xml/latn_qwerty_tly</item>
|
||||
<item>@xml/latn_qwerty_tr</item>
|
||||
<item>@xml/latn_qwerty_vi</item>
|
||||
|
@@ -38,9 +38,8 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_category_typing">Typing</string>
|
||||
<string name="pref_swipe_dist_title">Swiping distance</string>
|
||||
<string name="pref_swipe_dist_summary">Distance of characters in the corners of the keys (%s)</string>
|
||||
<string name="pref_long_timeout_title">Long press timeout</string>
|
||||
<string name="pref_long_timeout_title">Key repeat timeout</string>
|
||||
<string name="pref_long_interval_title">Key repeat interval</string>
|
||||
<string name="pref_keyrepeat_enabled">Key repeat on long press</string>
|
||||
<string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string>
|
||||
<string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string>
|
||||
<string name="pref_category_behavior">Behavior</string>
|
||||
@@ -68,9 +67,6 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_theme_e_epaper">ePaper</string>
|
||||
<string name="pref_theme_e_desert">Desert</string>
|
||||
<string name="pref_theme_e_jungle">Jungle</string>
|
||||
<string name="pref_theme_e_monet">Monet (System)</string>
|
||||
<string name="pref_theme_e_monetlight">Monet (Light)</string>
|
||||
<string name="pref_theme_e_monetdark">Monet (Dark)</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Very short</string>
|
||||
<string name="pref_swipe_dist_e_short">Short</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@@ -81,11 +77,6 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="pref_border_config_title">Customize borders</string>
|
||||
<string name="pref_border_width_title">Border Width</string>
|
||||
<string name="pref_corners_radius_title">Corner radius</string>
|
||||
<string name="pref_circle_sensitivity_title">Circle gesture sensitivity</string>
|
||||
<string name="pref_circle_sensitivity_e_high">High</string>
|
||||
<string name="pref_circle_sensitivity_e_medium">Medium</string>
|
||||
<string name="pref_circle_sensitivity_e_low">Low</string>
|
||||
<string name="pref_circle_sensitivity_e_disabled">Disabled</string>
|
||||
<string name="key_action_next">Next</string>
|
||||
<string name="key_action_done">Done</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
@@ -119,9 +110,4 @@ This application contains no ads, doesn't make any network requests and is Open
|
||||
<string name="key_descr_page_down">Page Down</string>
|
||||
<string name="key_descr_home">Home</string>
|
||||
<string name="key_descr_end">End</string>
|
||||
<string name="key_descr_clipboard">Clipboard manager</string>
|
||||
<string name="clipboard_history_heading">Recently copied text</string>
|
||||
<string name="clipboard_pin_heading">Pinned</string>
|
||||
<string name="clipboard_remove_confirm">Remove this clipboard?</string>
|
||||
<string name="clipboard_remove_confirmed">Yes</string>
|
||||
</resources>
|
||||
|
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Emoji pane -->
|
||||
<style name="emojiTypeButton">
|
||||
<item name="android:padding">1px</item>
|
||||
<item name="android:gravity">center</item>
|
||||
@@ -16,39 +15,6 @@
|
||||
<item name="android:textSize">@dimen/emoji_text_size</item>
|
||||
<item name="android:textColor">?attr/emoji_color</item>
|
||||
</style>
|
||||
<!-- Clipboard pane -->
|
||||
<style name="clipboardEntry">
|
||||
<item name="android:layout_weight">1</item>
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_marginHorizontal">14dp</item>
|
||||
<item name="android:layout_marginVertical">14dp</item>
|
||||
<item name="android:textSize">16dp</item>
|
||||
<item name="android:textColor">?attr/colorLabel</item>
|
||||
</style>
|
||||
<style name="clipboardHeading">
|
||||
<item name="android:layout_marginHorizontal">6dp</item>
|
||||
<item name="android:layout_marginTop">14dp</item>
|
||||
<item name="android:layout_marginBottom">0dp</item>
|
||||
<item name="android:textSize">14dp</item>
|
||||
<item name="android:fontWeight">700</item>
|
||||
<item name="android:textColor">?attr/colorSubLabel</item>
|
||||
</style>
|
||||
<style name="clipboardEntryButtons">
|
||||
<item name="android:orientation">horizontal</item>
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_gravity">center_vertical</item>
|
||||
<item name="android:layout_marginRight">12dp</item>
|
||||
</style>
|
||||
<style name="clipboardEntryButton">
|
||||
<item name="android:layout_width">24dp</item>
|
||||
<item name="android:layout_height">24dp</item>
|
||||
<item name="android:layout_marginHorizontal">2dp</item>
|
||||
<item name="android:backgroundTint">?attr/colorLabel</item>
|
||||
<item name="android:backgroundTintMode">src_in</item>
|
||||
</style>
|
||||
<!-- Launcher activity -->
|
||||
<style name="paragraph">
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
|
@@ -23,14 +23,11 @@
|
||||
<attr name="keyBorderColorTop" format="color"/>
|
||||
<attr name="keyBorderColorRight" format="color"/>
|
||||
<attr name="keyBorderColorBottom" format="color"/>
|
||||
<!-- Emoji pane -->
|
||||
<!-- Emoji panel -->
|
||||
<attr name="emoji_button_bg" type="color" format="color"/>
|
||||
<attr name="emoji_color" type="color" format="color"/>
|
||||
<attr name="emoji_key_bg" type="color" format="color"/>
|
||||
<attr name="emoji_key_text" type="color" format="color"/>
|
||||
<!-- Clipboard pane -->
|
||||
<attr name="clipboard_divider_color" type="color" format="color"/>
|
||||
<attr name="clipboard_divider_height" format="dimension"/>
|
||||
<!-- System integration -->
|
||||
<attr name="navigationBarColor" format="color"/>
|
||||
<attr name="windowLightNavigationBar" format="boolean"/>
|
||||
@@ -46,8 +43,6 @@
|
||||
<item name="greyedDimming">0.5</item>
|
||||
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
|
||||
<item name="emoji_key_text" type="color">?attr/colorLabel</item>
|
||||
<item name="clipboard_divider_color" type="color">?attr/colorKey</item>
|
||||
<item name="clipboard_divider_height">1px</item>
|
||||
</style>
|
||||
<style name="Dark" parent="BaseTheme">
|
||||
<item name="android:isLightTheme">false</item>
|
||||
@@ -121,7 +116,6 @@
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="emoji_button_bg">#ffffff</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
<item name="clipboard_divider_color" type="color">#eeeeee</item>
|
||||
</style>
|
||||
<style name="ePaper" parent="BaseTheme">
|
||||
<item name="android:isLightTheme">true</item>
|
||||
@@ -140,8 +134,6 @@
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="emoji_button_bg">#ffffff</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
<item name="clipboard_divider_color" type="color">#000000</item>
|
||||
<item name="clipboard_divider_height">2dp</item>
|
||||
</style>
|
||||
<style name="Desert" parent="@style/BaseTheme">
|
||||
<item name="android:isLightTheme">true</item>
|
||||
@@ -179,28 +171,4 @@
|
||||
<item name="emoji_button_bg">?colorKeyActivated</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
<style name="MonetLight" parent="@style/BaseTheme">
|
||||
<item name="android:isLightTheme">true</item>
|
||||
<item name="colorKeyboard">@android:color/system_accent1_100</item>
|
||||
<item name="colorKey">@android:color/system_accent1_0</item>
|
||||
<item name="colorKeyActivated">@android:color/system_accent1_300</item>
|
||||
<item name="colorLabel">@android:color/system_accent1_1000</item>
|
||||
<item name="colorLabelActivated">@android:color/system_accent1_1000</item>
|
||||
<item name="colorLabelLocked">@android:color/system_accent1_500</item>
|
||||
<item name="colorSubLabel">@android:color/system_accent1_900</item>
|
||||
<item name="emoji_button_bg">?colorKeyActivated</item>
|
||||
<item name="emoji_color">@android:color/system_accent1_1000</item>
|
||||
</style>
|
||||
<style name="MonetDark" parent="@style/BaseTheme">
|
||||
<item name="android:isLightTheme">false</item>
|
||||
<item name="colorKeyboard">@android:color/system_accent1_900</item>
|
||||
<item name="colorKey">@android:color/system_accent1_800</item>
|
||||
<item name="colorKeyActivated">@android:color/system_accent1_600</item>
|
||||
<item name="colorLabel">@android:color/system_neutral1_0</item>
|
||||
<item name="colorLabelActivated">@android:color/system_accent2_300</item>
|
||||
<item name="colorLabelLocked">@android:color/system_accent2_100</item>
|
||||
<item name="colorSubLabel">@android:color/system_neutral1_300</item>
|
||||
<item name="emoji_button_bg">?colorKeyActivated</item>
|
||||
<item name="emoji_color">@android:color/system_accent1_900</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
@@ -4,7 +4,6 @@
|
||||
<dimen name="key_padding">2dp</dimen>
|
||||
<dimen name="emoji_grid_height">250dp</dimen>
|
||||
<dimen name="emoji_text_size">28dp</dimen>
|
||||
<dimen name="clipboard_view_height">300dp</dimen>
|
||||
<dimen name="pref_button_size">28dp</dimen>
|
||||
<bool name="debug_logs">false</bool> <!-- Will be overwritten automatically by Gradle for the debug build variant -->
|
||||
</resources>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<row height="0.95">
|
||||
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key3="loc switch_clipboard" key4="switch_numeric"/>
|
||||
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
|
||||
<key width="1.1" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key width="1.1" key0="loc compose" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/>
|
||||
|
@@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- The bottom row used in the clipboard history pane. -->
|
||||
<keyboard bottom_row="false">
|
||||
<row height="0.95">
|
||||
<key key0="switch_back_clipboard"/>
|
||||
<key width="3" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key key0="backspace" key2="delete"/>
|
||||
<key key0="enter" key2="action"/>
|
||||
</row>
|
||||
</keyboard>
|
@@ -3,8 +3,8 @@
|
||||
<keyboard bottom_row="false">
|
||||
<row height="0.95">
|
||||
<key key0="switch_back_emoji"/>
|
||||
<key width="3" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key key0="backspace" key2="delete"/>
|
||||
<key key0="enter" key2="action"/>
|
||||
<key width="4" key0="space" key5="cursor_left" key6="cursor_right" slider="true"/>
|
||||
<key key0="backspace"/>
|
||||
<key key0="enter"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
@@ -9,8 +9,8 @@
|
||||
<key key0="ψ" key1="∥" key3="≪" key4="7"/>
|
||||
<key key0="υ" key1="⌀" key2="⟨" key3="≡" key4="8"/>
|
||||
<key key0="ι" key1="∞" key2="⟩" key3="≫" key4="9"/>
|
||||
<key key0="ο" key1="∝" key3="□"/>
|
||||
<key key0="π" key1="∅" key3="∘"/>
|
||||
<key key0="ο" key1="∝" key3="□" key4="f11_placeholder"/>
|
||||
<key key0="π" key1="∅" key3="∘" key4="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="α" key4="ℂ"/>
|
||||
@@ -36,8 +36,8 @@
|
||||
<key width="1.5" key0="backspace" key3="delete"/>
|
||||
</row>
|
||||
<row height="0.95">
|
||||
<key width="1.2" key0="switch_text" key2="loc esc"/>
|
||||
<key width="1.2" key0="switch_numeric" key2="loc tab"/>
|
||||
<key width="1.2" key0="switch_text" key2="esc"/>
|
||||
<key width="1.2" key0="switch_numeric" key2="tab"/>
|
||||
<key width="1.2" key0="fn"/>
|
||||
<key width="2.8" key0="space" key1="superscript" key3="subscript"/>
|
||||
<key width="1.2" key0="0" key2="."/>
|
||||
|
@@ -6,39 +6,39 @@
|
||||
<subtype android:label="%s" android:languageTag="be" android:imeSubtypeLocale="be_BY" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_jcuken_ru,extra_keys=ґ|є|і|ї|ў"/>
|
||||
<subtype android:label="%s" android:languageTag="bg" android:imeSubtypeLocale="bg_BG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_ueishsht,extra_keys=€"/>
|
||||
<subtype android:label="%s" android:languageTag="bn" android:imeSubtypeLocale="bn_BD" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=৳"/>
|
||||
<subtype android:label="%s" android:languageTag="cs" android:imeSubtypeLocale="cs_CZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_cz,extra_keys=accent_aigu:á:é:í:ó:ú:ý@d|accent_ring:ů@s|accent_caron:č:ě:ň:ř:š:ž:ď:ť@f"/>
|
||||
<subtype android:label="%s" android:languageTag="cs" android:imeSubtypeLocale="cs_CZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_cz,extra_keys=accent_aigu:á:é:í:ó:ú:ý|accent_ring:ů|accent_caron:č:ě:ň:ř:š:ž:ď:ť"/>
|
||||
<subtype android:label="%s" android:languageTag="da" android:imeSubtypeLocale="da_DK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_da,extra_keys=€|æ|å|ø"/>
|
||||
<subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_de,extra_keys=accent_trema:ä:ö:ü@u|ß|€"/>
|
||||
<subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=grek_qwerty,extra_keys=£@l|€"/>
|
||||
<subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_de,extra_keys=accent_trema:ä:ö:ü|ß|€"/>
|
||||
<subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=grek_qwerty,extra_keys=£|€"/>
|
||||
<subtype android:label="%s" android:languageTag="en-CA" android:imeSubtypeLocale="en_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
|
||||
<subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_gb,extra_keys=£@l"/>
|
||||
<subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_gb,extra_keys=£"/>
|
||||
<subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us"/>
|
||||
<subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_es,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_tilde:ñ@n|accent_grave@f|accent_trema@u|€"/>
|
||||
<subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_es,extra_keys=accent_aigu:á:é:í:ó:ú|accent_tilde:ñ|accent_grave|accent_trema|€"/>
|
||||
<subtype android:label="%s" android:languageTag="fa" android:imeSubtypeLocale="fa_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_pc_ir"/>
|
||||
<subtype android:label="%s" android:languageTag="fr-CA" android:imeSubtypeLocale="fr_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è:ù@f|accent_aigu:é@d|accent_circonflexe:â:ê:ô@f|accent_cedille:ç@c|accent_trema:ë:ï:ü:ÿ@u"/>
|
||||
<subtype android:label="%s" android:languageTag="fr-CH" android:imeSubtypeLocale="fr_CH" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_fr_ch,extra_keys=accent_grave:à:è:ù@f|accent_aigu:é@d|accent_circonflexe:â:ê:ô@o|accent_cedille:ç@c|accent_trema:ë:ï:ü:ÿ@u|€"/>
|
||||
<subtype android:label="%s" android:languageTag="fr-FR" android:imeSubtypeLocale="fr_FR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è@d|accent_aigu:é@d|accent_circonflexe:â:ê:ô@o|accent_cedille:ç@c|accent_trema:ë:ï:ü@l|€"/>
|
||||
<subtype android:label="%s" android:languageTag="he" android:imeSubtypeLocale="he_IL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hebrew,default_layout=hebr_1_il,extra_keys=₪@r|€"/>
|
||||
<subtype android:label="%s" android:languageTag="fr-CA" android:imeSubtypeLocale="fr_CA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è:ù|accent_aigu:é|accent_circonflexe:â:ê:ô|accent_cedille:ç|accent_trema:ë:ï:ü:ÿ"/>
|
||||
<subtype android:label="%s" android:languageTag="fr-CH" android:imeSubtypeLocale="fr_CH" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_fr_ch,extra_keys=accent_grave:à:è:ù|accent_aigu:é|accent_circonflexe:â:ê:ô|accent_cedille:ç|accent_trema:ë:ï:ü:ÿ|€"/>
|
||||
<subtype android:label="%s" android:languageTag="fr-FR" android:imeSubtypeLocale="fr_FR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:à:è@a|accent_aigu:é@e|accent_circonflexe:â:ê:ô@e|accent_cedille:ç@c|accent_trema:ë:ï:ü@l|€"/>
|
||||
<subtype android:label="%s" android:languageTag="he" android:imeSubtypeLocale="he_IL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hebrew,default_layout=hebr_1_il,extra_keys=₪|€"/>
|
||||
<subtype android:label="%s" android:languageTag="hi" android:imeSubtypeLocale="hi_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/>
|
||||
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_hu,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_trema:ö:ü@u|accent_ogonek@s|accent_double_aigu:ő:ű@k|€"/>
|
||||
<subtype android:label="%s" android:languageTag="is" android:imeSubtypeLocale="is_IS" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=ð|þ|æ|accent_trema:ö@o|accent_aigu:á:é:í:ó:ú:ý@d"/>
|
||||
<subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_grave:à:è:ì:ò:ù@f|accent_aigu:é:ó@d|accent_circonflexe:î@f|€|ə"/>
|
||||
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_hu,extra_keys=accent_aigu:á:é:í:ó:ú|accent_trema:ö:ü|accent_ogonek|accent_double_aigu:ő:ű|€"/>
|
||||
<subtype android:label="%s" android:languageTag="is" android:imeSubtypeLocale="is_IS" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=ð|þ|æ|accent_trema:ö|accent_aigu:á:é:í:ó:ú:ý"/>
|
||||
<subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_grave:à:è:ì:ò:ù|accent_aigu:é:ó|accent_circonflexe:î|€|ə"/>
|
||||
<subtype android:label="%s" android:languageTag="ko" android:imeSubtypeLocale="ko_KR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hangul,default_layout=latn_qwerty_us"/>
|
||||
<subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_ogonek:ą:ę:į:ų@s|accent_caron:č:š:ž@f|accent_dot_above:ė@s|accent_macron:ū@o|€"/>
|
||||
<subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lv,extra_keys=accent_macron:ā:ē:ī:ū@o|accent_caron:č:š:ž@f|accent_ogonek:ķ:ļ:ņ@s|accent_cedille:ģ@c|€"/>
|
||||
<subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_ogonek:ą:ę:į:ų|accent_caron:č:š:ž|accent_dot_above:ė|accent_macron:ū|€"/>
|
||||
<subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_lv,extra_keys=accent_macron:ā:ē:ī:ū|accent_caron:č:š:ž|accent_ogonek:ķ:ļ:ņ|accent_cedille:ģ|€"/>
|
||||
<subtype android:label="%s" android:languageTag="mr" android:imeSubtypeLocale="mr_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/>
|
||||
<subtype android:label="%s" android:languageTag="ne" android:imeSubtypeLocale="ne_NE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/>
|
||||
<subtype android:label="%s" android:languageTag="nl-BE" android:imeSubtypeLocale="nl_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:è@f|accent_aigu:á:é:í:ó:ú:ý:j́@d|accent_circonflexe:ê@f|accent_cedille:ç@c|accent_trema@u|€"/>
|
||||
<subtype android:label="%s" android:languageTag="no" android:imeSubtypeLocale="no_NO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=€|æ@a|å@a|ø@o|accent_aigu:é:ó@d|accent_grave:è:ò:ù@f|accent_circonflexe:ê:ô@f"/>
|
||||
<subtype android:label="%s" android:languageTag="nl-BE" android:imeSubtypeLocale="nl_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_azerty_fr,extra_keys=accent_grave:è|accent_aigu:á:é:í:ó:ú:ý:j́|accent_circonflexe:ê|accent_cedille:ç|accent_trema|€"/>
|
||||
<subtype android:label="%s" android:languageTag="no" android:imeSubtypeLocale="no_NO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_no,extra_keys=€|æ|å|ø|accent_aigu:é:ó|accent_grave:è:ò:ù|accent_circonflexe:ê:ô"/>
|
||||
<subtype android:label="%s" android:languageTag="pl" android:imeSubtypeLocale="pl_PL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_pl"/>
|
||||
<subtype android:label="%s" android:languageTag="pt" android:imeSubtypeLocale="pt_BR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_pt,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_cedille:ç@c|accent_circonflexe:â:ê:ô@f|accent_grave:à:ò@f|accent_tilde:ã:õ@n|€|ª|º"/>
|
||||
<subtype android:label="%s" android:languageTag="pt" android:imeSubtypeLocale="pt_BR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_pt,extra_keys=accent_aigu:á:é:í:ó:ú|accent_cedille:ç|accent_circonflexe:â:ê:ô|accent_grave:à:ò|accent_tilde:ã:õ|€|ª|º"/>
|
||||
<subtype android:label="%s" android:languageTag="ro" android:imeSubtypeLocale="ro_RO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_ro,extra_keys=ă|â|î|ș|ț|€|$"/>
|
||||
<subtype android:label="%s" android:languageTag="ru" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_jcuken_ru"/>
|
||||
<subtype android:label="%s" android:languageTag="sk" android:imeSubtypeLocale="sk_SK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_sk,extra_keys=accent_caron:ě:ř:ž:š:č:ň:ď:ľ:ť@f|accent_ring:ů@s|accent_circonflexe:ô@f|accent_trema:ä:ü:ö@u|accent_aigu:á:é:í:ó:ú:ŕ:ś:ĺ:ý@d"/>
|
||||
<subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_se,extra_keys=accent_aigu:á@d|accent_trema:ä:ö@o|accent_ring:å@s|€"/>
|
||||
<subtype android:label="%s" android:languageTag="sk" android:imeSubtypeLocale="sk_SK" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_sk,extra_keys=accent_caron:ě:ř:ž:š:č:ň:ď:ľ:ť|accent_ring:ů|accent_circonflexe:ô|accent_trema:ä:ü:ö|accent_aigu:á:é:í:ó:ú:ŕ:ś:ĺ:ý"/>
|
||||
<subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_se,extra_keys=accent_aigu:á|accent_trema:ä:ö|accent_ring:å|€"/>
|
||||
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_AZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_tly,extra_keys=á|ú|â|ê|ı|š|ž"/>
|
||||
<subtype android:label="%s" android:languageTag="tly" android:imeSubtypeLocale="tly_IR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=arab_hamvaj_tly"/>
|
||||
<subtype android:label="%s" android:languageTag="tr" android:imeSubtypeLocale="tr_TR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_tr,extra_keys=accent_cedille:ç:ş@c|accent_trema:ö:ü@u|accent_circonflexe:â:î:û@f|₺|ı|ğ"/>
|
||||
<subtype android:label="%s" android:languageTag="tr" android:imeSubtypeLocale="tr_TR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_tr,extra_keys=accent_cedille:ç:ş|accent_trema:ö:ü|accent_circonflexe:â:î:û|₺|ı|ğ"/>
|
||||
<subtype android:label="%s" android:languageTag="uk" android:imeSubtypeLocale="uk_UA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=cyrillic,default_layout=cyrl_jcuken_uk,extra_keys=ґ|є|і|ї|₴"/>
|
||||
<subtype android:label="%s" android:languageTag="vi" android:imeSubtypeLocale="vi_VN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_vi"/>
|
||||
</input-method>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard bottom_row="false">
|
||||
<row>
|
||||
<key width="0.75" key0="loc esc" key2="~" key4="!"/>
|
||||
<key width="0.75" key0="esc" key2="~" key4="!"/>
|
||||
<key width="0.75" key0="(" key2="[" key4="{"/>
|
||||
<key key0="7" key1="<" key2=">"/>
|
||||
<key key0="8" key2="∞"/>
|
||||
@@ -10,7 +10,7 @@
|
||||
<key width="0.75" key0="/" key1="%" key3="÷"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="0.75" key0="loc tab" key2="|" key4="\\"/>
|
||||
<key width="0.75" key0="tab" key2="|" key4="\\"/>
|
||||
<key width="0.75" key0=")" key2="]" key4="}"/>
|
||||
<key key0="4" key1="box" key3="arrows"/>
|
||||
<key key0="5" key7="up" key6="right" key5="left" key8="down"/>
|
||||
@@ -28,7 +28,7 @@
|
||||
</row>
|
||||
<row height="0.95">
|
||||
<key width="1.5" key0="switch_text" key2="ctrl"/>
|
||||
<key width="1.5" key0="0"/>
|
||||
<key width="1.5" key0="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key width="0.75" key0="." key1=":" key2="," key3=";"/>
|
||||
<key width="0.75" key0="space" key1=""" key2="'" key3="loc compose" key4="_"/>
|
||||
<key width="1.5" key0="enter" key1="±" key2="action" key3="="/>
|
||||
|
@@ -14,10 +14,8 @@
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/pref_category_typing">
|
||||
<ListPreference android:key="swipe_dist" android:title="@string/pref_swipe_dist_title" android:summary="@string/pref_swipe_dist_summary" android:defaultValue="15" android:entries="@array/pref_swipe_dist_entries" android:entryValues="@array/pref_swipe_dist_values"/>
|
||||
<ListPreference android:key="circle_sensitivity" android:title="@string/pref_circle_sensitivity_title" android:summary="%s" android:defaultValue="2" android:entries="@array/pref_circle_sensitivity_entries" android:entryValues="@array/pref_circle_sensitivity_values"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="longpress_timeout" android:title="@string/pref_long_timeout_title" android:summary="%sms" android:defaultValue="600" min="50" max="2000"/>
|
||||
<CheckBoxPreference android:key="keyrepeat_enabled" android:title="@string/pref_keyrepeat_enabled" android:defaultValue="true"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="longpress_interval" android:dependency="keyrepeat_enabled" android:title="@string/pref_long_interval_title" android:summary="%sms" android:defaultValue="25" min="5" max="100"/>
|
||||
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="longpress_interval" android:title="@string/pref_long_interval_title" android:summary="%sms" android:defaultValue="25" min="5" max="100"/>
|
||||
<CheckBoxPreference android:key="lock_double_tap" android:title="@string/pref_lock_double_tap_title" android:summary="@string/pref_lock_double_tap_summary" android:defaultValue="false"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/pref_category_behavior">
|
||||
|
@@ -9,7 +9,7 @@ let
|
||||
|
||||
android = pkgs.androidenv.composeAndroidPackages {
|
||||
buildToolsVersions = [ build_tools_version ];
|
||||
platformVersions = [ "34" ];
|
||||
platformVersions = [ "33" ];
|
||||
abiVersions = [ "armeabi-v7a" ];
|
||||
};
|
||||
|
||||
|
@@ -3,8 +3,6 @@
|
||||
The `compose.py` program parses the compose sequences found in this directory
|
||||
and generates `srcs/juloo.keyboard2/ComposeKeyData.java`.
|
||||
|
||||
## `compose/en_US_UTF_8_Compose.pre`
|
||||
## `en_US_UTF_8_Compose.pre`
|
||||
|
||||
This file is copied from the `xorg` project. Copyright applies.
|
||||
|
||||
## `compose/extra.json`
|
||||
|
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"a": "á",
|
||||
"c": "ć",
|
||||
"e": "é",
|
||||
"i": "í",
|
||||
"l": "ĺ",
|
||||
"ń": "ń",
|
||||
"o": "ó",
|
||||
"r": "ŕ",
|
||||
"s": "ś",
|
||||
"u": "ú",
|
||||
"y": "ý",
|
||||
"z": "ź",
|
||||
"ü": "ǘ",
|
||||
"j": "j\u0301",
|
||||
"у": "у\u0301",
|
||||
"е": "е\u0301",
|
||||
"а": "а\u0301",
|
||||
"о": "о\u0301",
|
||||
"и": "и\u0301",
|
||||
"ы": "ы\u0301",
|
||||
"э": "э\u0301",
|
||||
"ю": "ю\u0301",
|
||||
"я": "я\u0301"
|
||||
}
|
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"0": "↔",
|
||||
"1": "↙",
|
||||
"2": "↓",
|
||||
"3": "↘",
|
||||
"4": "←",
|
||||
"5": "↕",
|
||||
"6": "→",
|
||||
"7": "↖",
|
||||
"8": "↑",
|
||||
"9": "↗",
|
||||
".": "↵"
|
||||
}
|
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"b": "ƀ",
|
||||
"c": "ꞓ",
|
||||
"d": "đ",
|
||||
"g": "ǥ",
|
||||
"i": "ɨ",
|
||||
"j": "ɉ",
|
||||
"k": "ꝁ",
|
||||
"l": "ƚ",
|
||||
"o": "ɵ",
|
||||
"p": "ᵽ",
|
||||
"q": "ꝗ",
|
||||
"r": "ɍ",
|
||||
"t": "ŧ",
|
||||
"u": "ʉ",
|
||||
"y": "ɏ",
|
||||
"z": "ƶ"
|
||||
}
|
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"1": "└",
|
||||
"2": "┴",
|
||||
"3": "┘",
|
||||
"4": "├",
|
||||
"5": "┼",
|
||||
"6": "┤",
|
||||
"7": "┌",
|
||||
"8": "┬",
|
||||
"9": "┐",
|
||||
"0": "─",
|
||||
".": "│"
|
||||
}
|
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"a": "ǎ",
|
||||
"c": "č",
|
||||
"d": "ď",
|
||||
"e": "ě",
|
||||
"i": "ǐ",
|
||||
"l": "ľ",
|
||||
"n": "ň",
|
||||
"o": "ǒ",
|
||||
"r": "ř",
|
||||
"s": "š",
|
||||
"t": "ť",
|
||||
"u": "ǔ",
|
||||
"z": "ž",
|
||||
"ü": "ǚ"
|
||||
}
|
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"c": "ç",
|
||||
"d": "ḑ",
|
||||
"e": "ȩ",
|
||||
"g": "ģ",
|
||||
"h": "ḩ",
|
||||
"k": "ķ",
|
||||
"l": "ļ",
|
||||
"n": "ņ",
|
||||
"r": "ŗ",
|
||||
"s": "ş",
|
||||
"t": "ţ"
|
||||
}
|
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"a": "â",
|
||||
"c": "ĉ",
|
||||
"e": "ê",
|
||||
"g": "ĝ",
|
||||
"h": "ĥ",
|
||||
"i": "î",
|
||||
"j": "ĵ",
|
||||
"o": "ô",
|
||||
"ŝ": "ŝ",
|
||||
"u": "û",
|
||||
"z": "ẑ",
|
||||
"а": "а\u0302",
|
||||
"е": "е\u0302",
|
||||
"и": "и\u0302",
|
||||
"о": "о\u0302",
|
||||
"у": "у\u0302"
|
||||
}
|
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"a": "ȧ",
|
||||
"b": "ḃ",
|
||||
"c": "ċ",
|
||||
"d": "ḋ",
|
||||
"e": "ė",
|
||||
"f": "ḟ",
|
||||
"g": "ġ",
|
||||
"h": "ḣ",
|
||||
"m": "ṁ",
|
||||
"n": "ṅ",
|
||||
"o": "ȯ",
|
||||
"p": "ṗ",
|
||||
"r": "ṙ",
|
||||
"s": "ṡ",
|
||||
"t": "ṫ",
|
||||
"w": "ẇ",
|
||||
"x": "ẋ",
|
||||
"y": "ẏ",
|
||||
"z": "ż"
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"a": "ạ",
|
||||
"ă": "ặ",
|
||||
"â": "ậ",
|
||||
"e": "ẹ",
|
||||
"ê": "ệ",
|
||||
"i": "ị",
|
||||
"o": "ọ",
|
||||
"ô": "ộ",
|
||||
"ơ": "ợ",
|
||||
"u": "ụ",
|
||||
"ư": "ự",
|
||||
"y": "ỵ"
|
||||
}
|
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"o": "ő",
|
||||
"u": "ű",
|
||||
" ": "˝",
|
||||
"a": "a\u030b",
|
||||
"e": "e\u030b",
|
||||
"i": "i\u030b",
|
||||
"m": "m\u030b",
|
||||
"y": "y\u030b"
|
||||
}
|
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"a": "à",
|
||||
"e": "è",
|
||||
"i": "ì",
|
||||
"o": "ò",
|
||||
"u": "ù",
|
||||
"ü": "ǜ"
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"a": "ả",
|
||||
"ă": "ẳ",
|
||||
"â": "ẩ",
|
||||
"e": "ẻ",
|
||||
"ê": "ể",
|
||||
"i": "ỉ",
|
||||
"o": "ỏ",
|
||||
"ô": "ổ",
|
||||
"ơ": "ở",
|
||||
"u": "ủ",
|
||||
"ư": "ử",
|
||||
"y": "ỷ"
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"o": "ơ",
|
||||
"ó": "ớ",
|
||||
"ò": "ờ",
|
||||
"ỏ": "ở",
|
||||
"õ": "ỡ",
|
||||
"ọ": "ợ",
|
||||
"u": "ư",
|
||||
"ú": "ứ",
|
||||
"ù": "ừ",
|
||||
"ủ": "ử",
|
||||
"ũ": "ữ",
|
||||
"ụ": "ự"
|
||||
}
|
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"a": "ā",
|
||||
"e": "ē",
|
||||
"i": "ī",
|
||||
"o": "ō",
|
||||
"u": "ū",
|
||||
"ü": "ǖ"
|
||||
}
|
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"a": "ą",
|
||||
"e": "ę",
|
||||
"i": "į",
|
||||
"k": "ķ",
|
||||
"l": "ļ",
|
||||
"n": "ņ",
|
||||
"o": "ǫ",
|
||||
"u": "ų"
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"a": "ª",
|
||||
"o": "º",
|
||||
"1": "ª",
|
||||
"2": "º",
|
||||
"3": "ⁿ",
|
||||
"4": "ᵈ",
|
||||
"5": "ᵉ",
|
||||
"6": "ʳ",
|
||||
"7": "ˢ",
|
||||
"8": "ᵗ",
|
||||
"9": "ʰ",
|
||||
"*": "°"
|
||||
}
|
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"a": "å",
|
||||
"u": "ů"
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"a": "ⱥ",
|
||||
"b": "␢",
|
||||
"c": "ȼ",
|
||||
"e": "ɇ",
|
||||
"g": "ꞡ",
|
||||
"k": "ꝃ",
|
||||
"l": "ł",
|
||||
"n": "ꞥ",
|
||||
"o": "ø",
|
||||
"r": "ꞧ",
|
||||
"s": "ꞩ",
|
||||
"t": "ⱦ"
|
||||
}
|
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"1": "₁",
|
||||
"2": "₂",
|
||||
"3": "₃",
|
||||
"4": "₄",
|
||||
"5": "₅",
|
||||
"6": "₆",
|
||||
"7": "₇",
|
||||
"8": "₈",
|
||||
"9": "₉",
|
||||
"0": "₀",
|
||||
"+": "₊",
|
||||
"-": "₋",
|
||||
"=": "₌",
|
||||
"(": "₍",
|
||||
")": "₎",
|
||||
"a": "ₐ",
|
||||
"e": "ₑ",
|
||||
"h": "ₕ",
|
||||
"i": "ᵢ",
|
||||
"j": "ⱼ",
|
||||
"k": "ₖ",
|
||||
"l": "ₗ",
|
||||
"m": "ₘ",
|
||||
"n": "ₙ",
|
||||
"o": "ₒ",
|
||||
"p": "ₚ",
|
||||
"r": "ᵣ",
|
||||
"s": "ₛ",
|
||||
"t": "ₜ",
|
||||
"u": "ᵤ",
|
||||
"v": "ᵥ",
|
||||
"x": "ₓ"
|
||||
}
|
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"1": "¹",
|
||||
"2": "²",
|
||||
"3": "³",
|
||||
"4": "⁴",
|
||||
"5": "⁵",
|
||||
"6": "⁶",
|
||||
"7": "⁷",
|
||||
"8": "⁸",
|
||||
"9": "⁹",
|
||||
"0": "⁰",
|
||||
"+": "⁺",
|
||||
"-": "⁻",
|
||||
"=": "⁼",
|
||||
"(": "⁽",
|
||||
")": "⁾",
|
||||
"a": "ᵃ",
|
||||
"b": "ᵇ",
|
||||
"c": "ᶜ",
|
||||
"d": "ᵈ",
|
||||
"e": "ᵉ",
|
||||
"f": "ᶠ",
|
||||
"g": "ᵍ",
|
||||
"h": "ʰ",
|
||||
"i": "ⁱ",
|
||||
"j": "ʲ",
|
||||
"k": "ᵏ",
|
||||
"l": "ˡ",
|
||||
"m": "ᵐ",
|
||||
"n": "ⁿ",
|
||||
"o": "ᵒ",
|
||||
"p": "ᵖ",
|
||||
"r": "ʳ",
|
||||
"s": "ˢ",
|
||||
"t": "ᵗ",
|
||||
"u": "ᵘ",
|
||||
"v": "ᵛ",
|
||||
"w": "ʷ",
|
||||
"x": "ˣ",
|
||||
"y": "ʸ",
|
||||
"z": "ᶻ"
|
||||
}
|
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"a": "ã",
|
||||
"e": "ẽ",
|
||||
"i": "ĩ",
|
||||
"n": "ñ",
|
||||
"o": "õ",
|
||||
"u": "ũ",
|
||||
"ă": "ẵ",
|
||||
"â": "ẫ",
|
||||
"ê": "ễ",
|
||||
"ơ": "ỡ",
|
||||
"ư": "ữ"
|
||||
}
|
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"a": "ä",
|
||||
"e": "ë",
|
||||
"i": "ï",
|
||||
"o": "ö",
|
||||
"u": "ü",
|
||||
"y": "ÿ"
|
||||
}
|
@@ -1,29 +1,28 @@
|
||||
import textwrap, sys, re, string, json, os
|
||||
from array import array
|
||||
import textwrap, sys, re, string, json
|
||||
|
||||
# Compile compose sequences from Xorg's format or from JSON files into an
|
||||
# efficient state machine.
|
||||
# See [ComposeKey.java] for the interpreter.
|
||||
#
|
||||
# Takes input files as arguments and generate a Java file.
|
||||
# The initial state for each input is generated as a constant named after the
|
||||
# input file.
|
||||
|
||||
# Parse symbol names from keysymdef.h. Many compose sequences in
|
||||
# en_US_UTF_8_Compose.pre reference theses. For example, all the sequences on
|
||||
# the Greek, Cyrillic and Hebrew scripts need these symbols.
|
||||
def parse_keysymdef_h(fname):
|
||||
with open(fname, "r") as inp:
|
||||
keysym_re = re.compile(r'^#define XK_(\S+)\s+\S+\s*/\*.U\+([0-9a-fA-F]+)\s')
|
||||
for line in inp:
|
||||
m = re.match(keysym_re, line)
|
||||
if m != None:
|
||||
yield (m.group(1), chr(int(m.group(2), 16)))
|
||||
# Names not defined in Compose.pre
|
||||
xkb_char_extra_names = {
|
||||
"space": " ",
|
||||
"minus": "-",
|
||||
"asterisk": "*",
|
||||
"colon": ":",
|
||||
"equal": "=",
|
||||
"exclam": "!",
|
||||
"grave": "`",
|
||||
"parenleft": "(",
|
||||
"parenright": ")",
|
||||
"percent": "%",
|
||||
"period": ".",
|
||||
"plus": "+",
|
||||
"question": "?",
|
||||
"semicolon": ";",
|
||||
"underscore": "_",
|
||||
}
|
||||
|
||||
dropped_sequences = 0
|
||||
|
||||
# Parse XKB's Compose.pre files
|
||||
def parse_sequences_file_xkb(fname, xkb_char_extra_names):
|
||||
def parse_sequences_file_xkb(fname):
|
||||
# Parse a line of the form:
|
||||
# <Multi_key> <minus> <space> : "~" asciitilde # TILDE
|
||||
# Sequences not starting with <Multi_key> are ignored.
|
||||
@@ -48,21 +47,16 @@ def parse_sequences_file_xkb(fname, xkb_char_extra_names):
|
||||
return def_, result
|
||||
char_names = { **xkb_char_extra_names }
|
||||
# Interpret character names of the form "U0000" or using [char_names].
|
||||
def parse_seq_char(sc):
|
||||
uchar, named_char = sc
|
||||
def parse_seq_char(c):
|
||||
uchar, named_char = c
|
||||
if uchar != "":
|
||||
c = chr(int(uchar, 16))
|
||||
elif len(named_char) == 1:
|
||||
c = named_char
|
||||
else:
|
||||
if not named_char in char_names:
|
||||
raise Exception("Unknown char: " + named_char)
|
||||
c = char_names[named_char]
|
||||
# The state machine can't represent sequence characters that do not fit
|
||||
# in a 16-bit char.
|
||||
if len(c) > 1 or ord(c[0]) > 65535:
|
||||
raise Exception("Char out of range: " + r)
|
||||
return c
|
||||
return chr(int(uchar, 16))
|
||||
# else is a named char
|
||||
if len(named_char) == 1:
|
||||
return named_char
|
||||
if not named_char in char_names:
|
||||
raise Exception("Unknown char: " + named_char)
|
||||
return char_names[named_char]
|
||||
# Interpret the left hand side of a sequence.
|
||||
def parse_seq_chars(def_):
|
||||
return list(map(parse_seq_char, re.findall(char_re, def_)))
|
||||
@@ -70,6 +64,11 @@ def parse_sequences_file_xkb(fname, xkb_char_extra_names):
|
||||
def parse_seq_result(r):
|
||||
if len(r) == 2 and r[0] == '\\':
|
||||
return r[1]
|
||||
# The state machine can't represent characters that do not fit in a
|
||||
# 16-bit char. This breaks some sequences that output letters with
|
||||
# combined diacritics or emojis.
|
||||
if len(r) > 1 or ord(r[0]) > 65535:
|
||||
raise Exception("Char out of range: " + r)
|
||||
return r
|
||||
# Populate [char_names] with the information present in the file.
|
||||
with open(fname, "r") as inp:
|
||||
@@ -97,30 +96,13 @@ def parse_sequences_file_json(fname):
|
||||
return list(seqs.items())
|
||||
|
||||
# Format of the sequences file is determined by its extension
|
||||
def parse_sequences_file(fname, xkb_char_extra_names={}):
|
||||
def parse_sequences_file(fname):
|
||||
if fname.endswith(".pre"):
|
||||
return parse_sequences_file_xkb(fname, xkb_char_extra_names)
|
||||
return parse_sequences_file_xkb(fname)
|
||||
if fname.endswith(".json"):
|
||||
return parse_sequences_file_json(fname)
|
||||
raise Exception(fname + ": Unsupported format")
|
||||
|
||||
# A sequence directory can contain several sequence files as well as
|
||||
# 'keysymdef.h'.
|
||||
def parse_sequences_dir(dname):
|
||||
compose_files = []
|
||||
xkb_char_extra_names = {}
|
||||
# Parse keysymdef.h first if present
|
||||
for fbasename in os.listdir(dname):
|
||||
fname = os.path.join(dname, fbasename)
|
||||
if fbasename == "keysymdef.h":
|
||||
xkb_char_extra_names = dict(parse_keysymdef_h(fname))
|
||||
else:
|
||||
compose_files.append(fname)
|
||||
sequences = []
|
||||
for fname in compose_files:
|
||||
sequences.extend(parse_sequences_file(fname, xkb_char_extra_names))
|
||||
return sequences
|
||||
|
||||
# Turn a list of sequences into a trie.
|
||||
def add_sequences_to_trie(seqs, trie):
|
||||
def add_seq_to_trie(t_, seq, result):
|
||||
@@ -145,7 +127,7 @@ def add_sequences_to_trie(seqs, trie):
|
||||
add_seq_to_trie(trie, seq, result)
|
||||
|
||||
# Compile the trie into a state machine.
|
||||
def make_automata(tries):
|
||||
def make_automata(tree_root):
|
||||
states = []
|
||||
def add_tree(t):
|
||||
# Index and size of the new node
|
||||
@@ -164,34 +146,14 @@ def make_automata(tries):
|
||||
states[i] = (c, node_i)
|
||||
i += 1
|
||||
def add_leaf(c):
|
||||
# There are two encoding for leafs: character final state for 15-bit
|
||||
# characters and string final state for the rest.
|
||||
if len(c) > 1 or ord(c[0]) > 32767: # String final state
|
||||
javachars = array('H', c.encode("UTF-16-LE"))
|
||||
states.append((-1, len(javachars) + 1))
|
||||
for c in javachars:
|
||||
states.append((c, 0))
|
||||
else: # Character final state
|
||||
states.append((c, 1))
|
||||
states.append((c, 1))
|
||||
def add_node(n):
|
||||
if type(n) == str:
|
||||
add_leaf(n)
|
||||
else:
|
||||
add_tree(n)
|
||||
states.append((1, 1)) # Add an empty state at the beginning.
|
||||
entry_states = {}
|
||||
for tname, tree_root in tries.items():
|
||||
entry_states[tname] = len(states)
|
||||
add_tree(tree_root)
|
||||
return entry_states, states
|
||||
|
||||
# Debug
|
||||
def print_automata(automata):
|
||||
i = 0
|
||||
for (s, e) in automata:
|
||||
s = "%#06x" % s if isinstance(s, int) else '"%s"' % str(s)
|
||||
print("%3d %8s %d" % (i, s, e), file=sys.stderr)
|
||||
i += 1
|
||||
add_tree(tree_root)
|
||||
return states
|
||||
|
||||
def batched(ar, n):
|
||||
i = 0
|
||||
@@ -203,11 +165,10 @@ def batched(ar, n):
|
||||
|
||||
# Print the state machine compiled by make_automata into java code that can be
|
||||
# used by [ComposeKeyData.java].
|
||||
def gen_java(entry_states, machine):
|
||||
def gen_java(machine):
|
||||
chars_map = {
|
||||
# These characters cannot be used in unicode form as Java's parser
|
||||
# unescape unicode sequences before parsing.
|
||||
-1: "\\uFFFF",
|
||||
"\"": "\\\"",
|
||||
"\\": "\\\\",
|
||||
"\n": "\\n",
|
||||
@@ -228,9 +189,6 @@ def gen_java(entry_states, machine):
|
||||
def gen_array(array):
|
||||
chars = list(map(char_repr, array))
|
||||
return "\" +\n \"".join(map(lambda b: "".join(b), batched(chars, 72)))
|
||||
def gen_entry_state(s):
|
||||
name, state = s
|
||||
return " public static final int %s = %d;" % (name, state)
|
||||
print("""package juloo.keyboard2;
|
||||
|
||||
/** This file is generated, see [srcs/compose/compile.py]. */
|
||||
@@ -242,26 +200,18 @@ public final class ComposeKeyData
|
||||
|
||||
public static final char[] edges =
|
||||
("%s").toCharArray();
|
||||
|
||||
%s
|
||||
}""" % (
|
||||
# Break the edges array every few characters using string concatenation.
|
||||
gen_array(map(lambda s: s[0], machine)),
|
||||
gen_array(map(lambda s: s[1], machine)),
|
||||
"\n".join(map(gen_entry_state, entry_states.items())),
|
||||
))
|
||||
|
||||
total_sequences = 0
|
||||
tries = {} # Orderred dict
|
||||
for fname in sorted(sys.argv[1:]):
|
||||
tname, _ = os.path.splitext(os.path.basename(fname))
|
||||
if os.path.isdir(fname):
|
||||
sequences = parse_sequences_dir(fname)
|
||||
else:
|
||||
sequences = parse_sequences_file(fname)
|
||||
add_sequences_to_trie(sequences, tries.setdefault(tname, {}))
|
||||
trie = {}
|
||||
for fname in sys.argv[1:]:
|
||||
sequences = parse_sequences_file(fname)
|
||||
add_sequences_to_trie(sequences, trie)
|
||||
total_sequences += len(sequences)
|
||||
entry_states, automata = make_automata(tries)
|
||||
gen_java(entry_states, automata)
|
||||
automata = make_automata(trie)
|
||||
gen_java(automata)
|
||||
print("Compiled %d sequences into %d states. Dropped %d sequences." % (total_sequences, len(automata), dropped_sequences), file=sys.stderr)
|
||||
# print_automata(automata)
|
||||
|
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"V": {
|
||||
"s": "Š",
|
||||
"c": "Č",
|
||||
"z": "Ž"
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@@ -1,22 +0,0 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
|
||||
final class ClipboardHistoryCheckBox extends CheckBox
|
||||
implements CompoundButton.OnCheckedChangeListener
|
||||
{
|
||||
public ClipboardHistoryCheckBox(Context ctx, AttributeSet attrs)
|
||||
{
|
||||
super(ctx, attrs);
|
||||
setOnCheckedChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton _v, boolean isChecked)
|
||||
{
|
||||
ClipboardHistoryService.set_history_enabled(isChecked);
|
||||
}
|
||||
}
|
@@ -1,180 +0,0 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.os.Build.VERSION;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
public final class ClipboardHistoryService
|
||||
{
|
||||
/** Start the service on startup and start listening to clipboard changes. */
|
||||
public static void on_startup(Context ctx, ClipboardPasteCallback cb)
|
||||
{
|
||||
get_service(ctx);
|
||||
_paste_callback = cb;
|
||||
}
|
||||
|
||||
/** Start the service if it hasn't been started before. Returns [null] if the
|
||||
feature is unsupported. */
|
||||
public static ClipboardHistoryService get_service(Context ctx)
|
||||
{
|
||||
if (VERSION.SDK_INT <= 11)
|
||||
return null;
|
||||
if (_service == null)
|
||||
_service = new ClipboardHistoryService(ctx);
|
||||
return _service;
|
||||
}
|
||||
|
||||
public static void set_history_enabled(boolean e)
|
||||
{
|
||||
if (_service == null)
|
||||
return;
|
||||
Config.globalPrefs().edit()
|
||||
.putBoolean("clipboard_history_enabled", e)
|
||||
.commit();
|
||||
if (e)
|
||||
_service.add_current_clip();
|
||||
else
|
||||
_service.clear_history();
|
||||
}
|
||||
|
||||
/** Send the given string to the editor. */
|
||||
public static void paste(String clip)
|
||||
{
|
||||
if (_paste_callback != null)
|
||||
_paste_callback.paste_from_clipboard_pane(clip);
|
||||
}
|
||||
|
||||
/** The maximum size limits the amount of user data stored in memory but also
|
||||
gives a sense to the user that the history is not persisted and can be
|
||||
forgotten as soon as the app stops. */
|
||||
public static final int MAX_HISTORY_SIZE = 3;
|
||||
/** Time in ms until history entries expire. */
|
||||
public static final long HISTORY_TTL_MS = 5 * 60 * 1000;
|
||||
|
||||
static ClipboardHistoryService _service = null;
|
||||
static ClipboardPasteCallback _paste_callback = null;
|
||||
|
||||
ClipboardManager _cm;
|
||||
List<HistoryEntry> _history;
|
||||
OnClipboardHistoryChange _listener = null;
|
||||
|
||||
ClipboardHistoryService(Context ctx)
|
||||
{
|
||||
_history = new ArrayList<HistoryEntry>();
|
||||
_cm = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
_cm.addPrimaryClipChangedListener(this.new SystemListener());
|
||||
}
|
||||
|
||||
public List<String> clear_expired_and_get_history()
|
||||
{
|
||||
long now_ms = System.currentTimeMillis();
|
||||
List<String> dst = new ArrayList<String>();
|
||||
Iterator<HistoryEntry> it = _history.iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
HistoryEntry ent = it.next();
|
||||
if (ent.expiry_timestamp <= now_ms)
|
||||
it.remove();
|
||||
else
|
||||
dst.add(ent.content);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
/** This will call [on_clipboard_history_change]. */
|
||||
public void remove_history_entry(String clip)
|
||||
{
|
||||
int last_pos = _history.size() - 1;
|
||||
for (int pos = last_pos; pos >= 0; pos--)
|
||||
{
|
||||
if (!_history.get(pos).content.equals(clip))
|
||||
continue;
|
||||
// Removing the current clipboard, clear the system clipboard.
|
||||
if (pos == last_pos)
|
||||
{
|
||||
if (VERSION.SDK_INT >= 28)
|
||||
_cm.clearPrimaryClip();
|
||||
else
|
||||
_cm.setText("");
|
||||
}
|
||||
_history.remove(pos);
|
||||
if (_listener != null)
|
||||
_listener.on_clipboard_history_change();
|
||||
}
|
||||
}
|
||||
|
||||
/** Add clipboard entries to the history, skipping consecutive duplicates and
|
||||
empty strings. */
|
||||
public void add_clip(String clip)
|
||||
{
|
||||
if (!Config.globalConfig().clipboard_history_enabled)
|
||||
return;
|
||||
int size = _history.size();
|
||||
if (clip.equals("") || (size > 0 && _history.get(size - 1).content.equals(clip)))
|
||||
return;
|
||||
if (size >= MAX_HISTORY_SIZE)
|
||||
_history.remove(0);
|
||||
_history.add(new HistoryEntry(clip));
|
||||
if (_listener != null)
|
||||
_listener.on_clipboard_history_change();
|
||||
}
|
||||
|
||||
public void clear_history()
|
||||
{
|
||||
_history.clear();
|
||||
if (_listener != null)
|
||||
_listener.on_clipboard_history_change();
|
||||
}
|
||||
|
||||
public void set_on_clipboard_history_change(OnClipboardHistoryChange l) { _listener = l; }
|
||||
|
||||
public static interface OnClipboardHistoryChange
|
||||
{
|
||||
public void on_clipboard_history_change();
|
||||
}
|
||||
|
||||
/** Add what is currently in the system clipboard into the history. */
|
||||
void add_current_clip()
|
||||
{
|
||||
ClipData clip = _cm.getPrimaryClip();
|
||||
if (clip == null)
|
||||
return;
|
||||
int count = clip.getItemCount();
|
||||
for (int i = 0; i < count; i++)
|
||||
add_clip(clip.getItemAt(i).getText().toString());
|
||||
}
|
||||
|
||||
final class SystemListener implements ClipboardManager.OnPrimaryClipChangedListener
|
||||
{
|
||||
public SystemListener() {}
|
||||
|
||||
@Override
|
||||
public void onPrimaryClipChanged()
|
||||
{
|
||||
add_current_clip();
|
||||
}
|
||||
}
|
||||
|
||||
static final class HistoryEntry
|
||||
{
|
||||
public final String content;
|
||||
|
||||
/** Time at which the entry expires. */
|
||||
public final long expiry_timestamp;
|
||||
|
||||
public HistoryEntry(String c)
|
||||
{
|
||||
content = c;
|
||||
expiry_timestamp = System.currentTimeMillis() + HISTORY_TTL_MS;
|
||||
}
|
||||
}
|
||||
|
||||
public interface ClipboardPasteCallback
|
||||
{
|
||||
public void paste_from_clipboard_pane(String content);
|
||||
}
|
||||
}
|
@@ -1,125 +0,0 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.TextView;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public final class ClipboardHistoryView extends NonScrollListView
|
||||
implements ClipboardHistoryService.OnClipboardHistoryChange
|
||||
{
|
||||
List<String> _history;
|
||||
ClipboardHistoryService _service;
|
||||
ClipboardEntriesAdapter _adapter;
|
||||
|
||||
public ClipboardHistoryView(Context ctx, AttributeSet attrs)
|
||||
{
|
||||
super(ctx, attrs);
|
||||
_history = Collections.EMPTY_LIST;
|
||||
_adapter = this.new ClipboardEntriesAdapter();
|
||||
_service = ClipboardHistoryService.get_service(ctx);
|
||||
if (_service != null)
|
||||
{
|
||||
_service.set_on_clipboard_history_change(this);
|
||||
_history = _service.clear_expired_and_get_history();
|
||||
}
|
||||
setAdapter(_adapter);
|
||||
}
|
||||
|
||||
/** The history entry at index [pos] is removed from the history and added to
|
||||
the list of pinned clipboards. */
|
||||
public void pin_entry(int pos)
|
||||
{
|
||||
ClipboardPinView v = (ClipboardPinView)((ViewGroup)getParent().getParent()).findViewById(R.id.clipboard_pin_view);
|
||||
String clip = _history.get(pos);
|
||||
v.add_entry(clip);
|
||||
_service.remove_history_entry(clip);
|
||||
}
|
||||
|
||||
/** Send the specified entry to the editor. */
|
||||
public void paste_entry(int pos)
|
||||
{
|
||||
ClipboardHistoryService.paste(_history.get(pos));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void on_clipboard_history_change()
|
||||
{
|
||||
update_data();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onWindowVisibilityChanged(int visibility)
|
||||
{
|
||||
if (visibility == View.VISIBLE)
|
||||
update_data();
|
||||
}
|
||||
|
||||
void update_data()
|
||||
{
|
||||
_history = _service.clear_expired_and_get_history();
|
||||
_adapter.notifyDataSetChanged();
|
||||
invalidate();
|
||||
}
|
||||
|
||||
class ClipboardEntriesAdapter extends BaseAdapter
|
||||
{
|
||||
public ClipboardEntriesAdapter() {}
|
||||
|
||||
@Override
|
||||
public int getCount() { return _history.size(); }
|
||||
@Override
|
||||
public Object getItem(int pos) { return _history.get(pos); }
|
||||
@Override
|
||||
public long getItemId(int pos) { return _history.get(pos).hashCode(); }
|
||||
|
||||
@Override
|
||||
public View getView(final int pos, View v, ViewGroup _parent)
|
||||
{
|
||||
if (v == null)
|
||||
v = View.inflate(getContext(), R.layout.clipboard_history_entry, null);
|
||||
((TextView)v.findViewById(R.id.clipboard_entry_text))
|
||||
.setText(_history.get(pos));
|
||||
v.findViewById(R.id.clipboard_entry_addpin).setOnClickListener(
|
||||
new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v) { pin_entry(pos); }
|
||||
});
|
||||
v.findViewById(R.id.clipboard_entry_paste).setOnClickListener(
|
||||
new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v) { paste_entry(pos); }
|
||||
});
|
||||
// v.findViewById(R.id.clipboard_entry_removehist).setOnClickListener(
|
||||
// new View.OnClickListener()
|
||||
// {
|
||||
// @Override
|
||||
// public void onClick(View v)
|
||||
// {
|
||||
// AlertDialog d = new AlertDialog.Builder(getContext())
|
||||
// .setTitle(R.string.clipboard_remove_confirm)
|
||||
// .setPositiveButton(R.string.clipboard_remove_confirmed,
|
||||
// new DialogInterface.OnClickListener(){
|
||||
// public void onClick(DialogInterface _dialog, int _which)
|
||||
// {
|
||||
// _service.remove_history_entry(_history.get(pos));
|
||||
// }
|
||||
// })
|
||||
// .setNegativeButton(android.R.string.cancel, null)
|
||||
// .create();
|
||||
// Utils.show_dialog_on_ime(d, v.getWindowToken());
|
||||
// }
|
||||
// });
|
||||
return v;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,139 +0,0 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.TextView;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
|
||||
public final class ClipboardPinView extends NonScrollListView
|
||||
{
|
||||
/** Preference file name that store pinned clipboards. */
|
||||
static final String PERSIST_FILE_NAME = "clipboards";
|
||||
/** Preference name for pinned clipboards. */
|
||||
static final String PERSIST_PREF = "pinned";
|
||||
|
||||
List<String> _entries;
|
||||
ClipboardPinEntriesAdapter _adapter;
|
||||
SharedPreferences _persist_store;
|
||||
|
||||
public ClipboardPinView(Context ctx, AttributeSet attrs)
|
||||
{
|
||||
super(ctx, attrs);
|
||||
_entries = new ArrayList<String>();
|
||||
_persist_store =
|
||||
ctx.getSharedPreferences("pinned_clipboards", Context.MODE_PRIVATE);
|
||||
load_from_prefs(_persist_store, _entries);
|
||||
_adapter = this.new ClipboardPinEntriesAdapter();
|
||||
setAdapter(_adapter);
|
||||
}
|
||||
|
||||
/** Pin a clipboard and persist the change. */
|
||||
public void add_entry(String text)
|
||||
{
|
||||
_entries.add(text);
|
||||
_adapter.notifyDataSetChanged();
|
||||
persist();
|
||||
invalidate();
|
||||
}
|
||||
|
||||
/** Remove the entry at index [pos] and persist the change. */
|
||||
public void remove_entry(int pos)
|
||||
{
|
||||
if (pos < 0 || pos >= _entries.size())
|
||||
return;
|
||||
_entries.remove(pos);
|
||||
_adapter.notifyDataSetChanged();
|
||||
persist();
|
||||
invalidate();
|
||||
}
|
||||
|
||||
/** Send the specified entry to the editor. */
|
||||
public void paste_entry(int pos)
|
||||
{
|
||||
ClipboardHistoryService.paste(_entries.get(pos));
|
||||
}
|
||||
|
||||
void persist() { save_to_prefs(_persist_store, _entries); }
|
||||
|
||||
static void load_from_prefs(SharedPreferences store, List<String> dst)
|
||||
{
|
||||
String arr_s = store.getString(PERSIST_PREF, null);
|
||||
if (arr_s == null)
|
||||
return;
|
||||
try
|
||||
{
|
||||
JSONArray arr = new JSONArray(arr_s);
|
||||
for (int i = 0; i < arr.length(); i++)
|
||||
dst.add(arr.getString(i));
|
||||
}
|
||||
catch (JSONException _e) {}
|
||||
}
|
||||
|
||||
static void save_to_prefs(SharedPreferences store, List<String> entries)
|
||||
{
|
||||
JSONArray arr = new JSONArray();
|
||||
for (int i = 0; i < entries.size(); i++)
|
||||
arr.put(entries.get(i));
|
||||
store.edit()
|
||||
.putString(PERSIST_PREF, arr.toString())
|
||||
.commit();
|
||||
}
|
||||
|
||||
class ClipboardPinEntriesAdapter extends BaseAdapter
|
||||
{
|
||||
public ClipboardPinEntriesAdapter() {}
|
||||
|
||||
@Override
|
||||
public int getCount() { return _entries.size(); }
|
||||
@Override
|
||||
public Object getItem(int pos) { return _entries.get(pos); }
|
||||
@Override
|
||||
public long getItemId(int pos) { return _entries.get(pos).hashCode(); }
|
||||
|
||||
@Override
|
||||
public View getView(final int pos, View v, ViewGroup _parent)
|
||||
{
|
||||
if (v == null)
|
||||
v = View.inflate(getContext(), R.layout.clipboard_pin_entry, null);
|
||||
((TextView)v.findViewById(R.id.clipboard_pin_text))
|
||||
.setText(_entries.get(pos));
|
||||
v.findViewById(R.id.clipboard_pin_paste).setOnClickListener(
|
||||
new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v) { paste_entry(pos); }
|
||||
});
|
||||
v.findViewById(R.id.clipboard_pin_remove).setOnClickListener(
|
||||
new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
AlertDialog d = new AlertDialog.Builder(getContext())
|
||||
.setTitle(R.string.clipboard_remove_confirm)
|
||||
.setPositiveButton(R.string.clipboard_remove_confirmed,
|
||||
new DialogInterface.OnClickListener(){
|
||||
public void onClick(DialogInterface _dialog, int _which)
|
||||
{
|
||||
remove_entry(pos);
|
||||
}
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.create();
|
||||
Utils.show_dialog_on_ime(d, v.getWindowToken());
|
||||
}
|
||||
});
|
||||
return v;
|
||||
}
|
||||
}
|
||||
}
|
@@ -27,48 +27,31 @@ public final class ComposeKey
|
||||
}
|
||||
|
||||
/** Apply the pending compose sequence to char [c]. */
|
||||
static KeyValue apply(int prev, char c)
|
||||
static KeyValue apply(int state, char c)
|
||||
{
|
||||
char[] states = ComposeKeyData.states;
|
||||
char[] edges = ComposeKeyData.edges;
|
||||
int prev_length = edges[prev];
|
||||
int next = Arrays.binarySearch(states, prev + 1, prev + prev_length, c);
|
||||
int length = edges[state];
|
||||
int next = Arrays.binarySearch(states, state + 1, state + length, c);
|
||||
if (next < 0)
|
||||
return null;
|
||||
next = edges[next];
|
||||
int next_header = states[next];
|
||||
if (next_header == 0) // Enter a new intermediate state.
|
||||
return KeyValue.makeComposePending(String.valueOf(c), next, 0);
|
||||
else if (next_header == 0xFFFF) // String final state
|
||||
{
|
||||
int next_length = edges[next];
|
||||
return KeyValue.makeStringKey(
|
||||
new String(states, next + 1, next_length - 1));
|
||||
}
|
||||
else // Character final state.
|
||||
return KeyValue.makeCharKey((char)next_header);
|
||||
// The next state is the end of a sequence, show the result.
|
||||
if (edges[next] == 1)
|
||||
return KeyValue.makeCharKey(states[next]);
|
||||
return KeyValue.makeComposePending(String.valueOf(c), next, 0);
|
||||
}
|
||||
|
||||
/** The state machine is comprised of two arrays.
|
||||
|
||||
The [states] array represents the different states and the associated
|
||||
transitions:
|
||||
- The first cell is the header cell, [states[s]].
|
||||
- If the header is equal to [0],
|
||||
The remaining cells are the transitions characters, sorted
|
||||
alphabetically.
|
||||
- If the header is positive,
|
||||
This is a final state, [states[s]] is the result of the sequence.
|
||||
In this case, [edges[s]] must be equal to [1].
|
||||
- If the header is equal to [-1],
|
||||
This is a final state, the remaining cells represent the result string
|
||||
which starts at index [s + 1] and has a length of [edges[s] - 1].
|
||||
/** The [states] array represents the different states and their transition.
|
||||
A state occupies one or several cells of the array:
|
||||
- The first cell is the result of the compose sequence if the state is of
|
||||
size 1, unspecified otherwise.
|
||||
- The remaining cells are the transitions, sorted alphabetically.
|
||||
|
||||
The [edges] array represents the transition state corresponding to each
|
||||
accepted inputs.
|
||||
- If [states[s]] is a header cell, [edges[s]] is the number of cells
|
||||
occupied by the state [s], including the header cell.
|
||||
- If [states[s]] is a transition, [edges[s]] is the index of the state to
|
||||
jump into.
|
||||
- If [states[s]] is a part of a final state, [edges[s]] is not used. */
|
||||
Id [states[i]] is the first cell of a state, [edges[i]] is the number of
|
||||
cells occupied by the state [i].
|
||||
If [states[i]] is a transition, [edges[i]] is the index of the state to
|
||||
jump into. */
|
||||
}
|
||||
|
@@ -5,236 +5,146 @@ package juloo.keyboard2;
|
||||
public final class ComposeKeyData
|
||||
{
|
||||
public static final char[] states =
|
||||
("\u0001\u0000aceijlorsuyz\u00fc\u0144\u0430\u0435\u0438\u043e\u0443\u044b\u044d\u044e\u044f\u00e1\u0107\u00e9\u00ed\uFFFF\u006a\u0301\u013a\u00f3\u0155\u015b\u00fa\u00fd\u017a\u01d8\u0144\uFFFF\u0430\u0301\uFFFF\u0435\u0301\uFFFF\u0438\u0301\uFFFF\u043e\u0301\uFFFF\u0443\u0301\uFFFF\u044b\u0301\uFFFF\u044d\u0301\uFFFF\u044e\u0301\uFFFF\u044f\u0301\u0000.01" +
|
||||
"23456789\u21b5\u2194\u2199\u2193\u2198\u2190\u2195\u2192\u2196\u2191\u2197\u0000bcdgijklopqrtuyz\u0180\uFFFF\ua793\u0111\u01e5\u0268\u0249\uFFFF\ua741\u019a\u0275\u1d7d\uFFFF\ua757\u024d\u0167\u0289\u024f\u01b6\u0000.0123456789\u2502\u2500\u2514\u2534\u2518" +
|
||||
"\u251c\u253c\u2524\u250c\u252c\u2510\u0000acdeilnorstuz\u00fc\u01ce\u010d\u010f\u011b\u01d0\u013e\u0148\u01d2\u0159\u0161\u0165\u01d4\u017e\u01da\u0000cdeghklnrst\u00e7\u1e11\u0229\u0123\u1e29\u0137\u013c\u0146\u0157\u015f\u0163\u0000aceghijouz\u015d\u0430\u0435" +
|
||||
"\u0438\u043e\u0443\u00e2\u0109\u00ea\u011d\u0125\u00ee\u0135\u00f4\u00fb\u1e91\u015d\uFFFF\u0430\u0302\uFFFF\u0435\u0302\uFFFF\u0438\u0302\uFFFF\u043e\u0302\uFFFF\u0443\u0302\u0000abcdefghmnoprstwxyz\u0227\u1e03\u010b\u1e0b\u0117\u1e1f\u0121\u1e23\u1e41\u1e45\u022f\u1e57\u1e59\u1e61\u1e6b\u1e87\u1e8b\u1e8f\u017c\u0000aei" +
|
||||
"ouy\u00e2\u00ea\u00f4\u0103\u01a1\u01b0\u1ea1\u1eb9\u1ecb\u1ecd\u1ee5\u1ef5\u1ead\u1ec7\u1ed9\u1eb7\u1ee3\u1ef1\u0000 aeimouy\u02dd\uFFFF\u0061\u030b\uFFFF\u0065\u030b\uFFFF\u0069\u030b\uFFFF\u006d\u030b\u0151\u0171\uFFFF\u0079\u030b\u0000aeiou\u00fc\u00e0\u00e8\u00ec\u00f2\u00f9\u01dc\u0000aeiouy\u00e2\u00ea\u00f4\u0103" +
|
||||
"\u01a1\u01b0\u1ea3\u1ebb\u1ec9\u1ecf\u1ee7\u1ef7\u1ea9\u1ec3\u1ed5\u1eb3\u1edf\u1eed\u0000ou\u00f2\u00f3\u00f5\u00f9\u00fa\u0169\u1ecd\u1ecf\u1ee5\u1ee7\u01a1\u01b0\u1edd\u1edb\u1ee1\u1eeb\u1ee9\u1eef\u1ee3\u1edf\u1ef1\u1eed\u0000aeiou\u00fc\u0101\u0113\u012b\u014d\u016b\u01d6\u0000aeiklnou\u0105\u0119\u012f\u0137\u013c\u0146\u01eb\u0173\u0000*1" +
|
||||
"23456789ao\u00b0\u00aa\u00ba\u207f\u1d48\u1d49\u02b3\u02e2\u1d57\u02b0\u00aa\u00ba\u0000au\u00e5\u016f\u0000abcegklnorst\u2c65\u2422\u023c\u0247\uFFFF\ua7a1\uFFFF\ua743\u0142\uFFFF\ua7a5\u00f8\uFFFF\ua7a7\uFFFF\ua7a9\u2c66\u0000()+-0123456789" +
|
||||
"=aehijklmnoprstuvx\u208d\u208e\u208a\u208b\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u208c\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u0000()+-0123456789=abcdef" +
|
||||
"ghijklmnoprstuvwxyz\u207d\u207e\u207a\u207b\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207c\u1d43\u1d47\u1d9c\u1d48\u1d49\u1da0\u1d4d\u02b0\u2071\u02b2\u1d4f\u02e1\u1d50\u207f\u1d52\u1d56\u02b3\u02e2\u1d57\u1d58\u1d5b\u02b7\u02e3\u02b8\u1dbb\u0000aeinou\u00e2\u00ea\u0103\u01a1\u01b0\u00e3" +
|
||||
"\u1ebd\u0129\u00f1\u00f5\u0169\u1eab\u1ec5\u1eb5\u1ee1\u1eef\u0000aeiouy\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u0000 !\"#%'()*+,-./01234578:;<=>?ABCDEFGHIJKLMNOPQRST" +
|
||||
"UVWXYZ[\\]^_`abcdefghijklmnoprstuvwxyz{|~\u00a8\u00af\u00b4\u00b8\u00f7\u02d8\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0415\u0417\u041d\u0421\u0437\u043f\u05b4\u05b7\u05b8\u05b9\u05bc\u05bf" +
|
||||
"\u05c1\u05c2\u0653\u0654\u0655\u093c\u09bc\u09c7\u0a3c\u0b3c\u0b47\u0bc6\u0bc7\u0bd7\u0c46\u0cbf\u0cc6\u0cca\u0d46\u0d47\u0dd9\u0ddc\u0f71\u0f90\u0f92\u0f9c\u0fa1\u0fa6\u0fab\u0fb2\u0fb3\u0fb5\u0fb7\u102e\u1100\u1102\u1103\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110e\u1111\u1112\u1121\u1132\u113c\u113e\u114e\u1150\u1161\u1163\u1165\u1167\u1169\u116a\u116d\u116e\u116f\u1172\u1173\u1174\u1175\u119e\u11a8\u11aa\u11ab\u11ae" +
|
||||
"\u11af\u11b0\u11b1\u11b2\u11b3\u11b7\u11b8\u11ba\u11bc\u11c1\u11c2\u11ce\u11dd\u11ec\u11f0\u2190\u2191\u2192\u2193\u2203\u2206\u2207\u2208\u220a\u220b\u2218\u2223\u2225\u2227\u2228\u2229\u222a\u223c\u2243\u2248\u224d\u2260\u2261\u2264\u2265\u2272\u2273\u2276\u2277\u227a\u227b\u227c\u227d\u2282\u2283\u2286\u2287\u2291\u2292\u22a3\u22a4\u22a5\u22a8\u22a9\u22ab\u22b2\u22b3\u22b4\u22b5\u22c4\u2373\u2375\u237a\u2395\u25cb\u2add\u0000" +
|
||||
" (,-.<>_\u00a0\u02d8\u00b8~\u2008\u02c7^\u00af\u0000!+?ABDEHIKLMNORSTUVWYZ^abdehiklmnorstuvwyz\u01a0\u01a1\u01af\u01b0\u00a1\u0000OUou\u1ee2\u1ef0\u1ee3" +
|
||||
"\u1ef1\u203d\u1ea0\u1e04\u1e0c\u1eb8\u1e24\u1eca\u1e32\u1e36\u1e42\u1e46\u1ecc\u1e5a\u1e62\u1e6c\u1ee4\u1e7e\u1e88\u1ef4\u1e92\u00a6\u1ea1\u1e05\u1e0d\u1eb9\u1e25\u1ecb\u1e33\u1e37\u1e43\u1e47\u1ecd\u1e5b\u1e63\u1e6d\u1ee5\u1e7f\u1e89\u1ef5\u1e93\u1ee2\u1ee3\u1ef0\u1ef1\u0000 \"',<>AEHIOUWXY_aehiotuwxy" +
|
||||
"~\u00af\u00b4\u00d5\u00f5\u016a\u016b\u0399\u03a5\u03b9\u03c5\u03d2\u0406\u0410\u0415\u0416\u0417\u0418\u041e\u0423\u0427\u042b\u042d\u0430\u0435\u0436\u0437\u0438\u043e\u0443\u0447\u044b\u044d\u0456\u04d8\u04d9\u04e8\u04e9\u00a8\u00a8\u0344\u201e\u201c\u201d\u00c4\u00cb\u1e26\u00cf\u00d6\u00dc\u1e84\u1e8c\u0178\u0000Uu\u1e7a\u1e7b\u00e4\u00eb\u1e27\u00ef\u00f6\u1e97\u00fc\u1e85\u1e8d\u00ff\u0000Oo\u1e4e" +
|
||||
"\u1e4f\u0000Uu\u1e7a\u1e7b\u0344\u1e4e\u1e4f\u1e7a\u1e7b\u03aa\u03ab\u03ca\u03cb\u03d4\u0407\u04d2\u0401\u04dc\u04de\u04e4\u04e6\u04f0\u04f4\u04f8\u04ec\u04d3\u0451\u04dd\u04df\u04e5\u04e7\u04f1\u04f5\u04f9\u04ed\u0457\u04da\u04db\u04ea\u04eb\u0000#ESbefq\u266f\u266b\u266c\u266d\u266a\u266e\u2669\u0000o\u2030\u0000\"'()+,/<>AC" +
|
||||
"EGIJKLMNOPRSUWYZ^_abcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0" +
|
||||
"\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u2395\u0000 IUiu\u03b9\u03c5\u0385\u1e2e\u01d7\u1e2f\u01d8\u0390\u03b0\u00b4\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0d\u1f1d" +
|
||||
"\u1f2d\u1f3d\u1f4d\u1f5d\u1f6d\u1f05\u1f15\u1f25\u1f35\u1f45\u1f55\u1f65\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0c\u1f1c\u1f2c\u1f3c\u1f4c\u1f6c\u1f04\u1f14\u1f24\u1f34\u1f44\u1f54\u1f64\u0000OUou\u1eda\u1ee8\u1edb\u1ee9\u201a\u0000Oo\u01fe\u01ff\u2018\u2019\u00c1\u0106\u00c9\u01f4\u00cd\uFFFF\u004a\u0301\u1e30\u0139\u1e3e\u0143\u00d3\u1e54\u0154\u015a" +
|
||||
"\u00da\u1e82\u00dd\u0179\u0000AEOaeo\u1ea4\u1ebe\u1ed0\u1ea5\u1ebf\u1ed1\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u00e1\u0000Aa\u1eae\u1eaf\u0107\u00e9\u01f5\u00ed\uFFFF\u006a\u0301\u1e31\u013a\u1e3f\u0144\u00f3\u1e55\u0155\u015b\u00fa\u1e83\u00fd\u017a\u0000OUou\u1e4c\u1e78\u1e4d\u1e79\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u0000Cc" +
|
||||
"\u1e08\u1e09\u1ea4\u01fa\u01fc\u1e08\u1ebe\u1e2e\u1ed0\u1e4c\u01fe\u01d7\u1ea5\u01fb\u01fd\u1e09\u1ebf\u1e2f\u1ed1\u1e4d\u01ff\u01d8\u1eae\u1eaf\u1e16\u1e17\u1e52\u1e53\u1e78\u1e79\u1eda\u1edb\u1ee8\u1ee9\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u03ac\u03ad\u03ae\u03af\u03cc\u03cd\u03ce\uFFFF\u0410\u0301\u0403\uFFFF\u0415\u0301\uFFFF\u0418\u0301\u040c\uFFFF\u041e\u0301\uFFFF\u0420\u0301\uFFFF\u0423\u0301\uFFFF\u042b\u0301\uFFFF" +
|
||||
"\u042d\u0301\uFFFF\u042e\u0301\uFFFF\u042f\u0301\uFFFF\u0430\u0301\u0453\uFFFF\u0435\u0301\uFFFF\u0438\u0301\u045c\uFFFF\u043e\u0301\uFFFF\u0440\u0301\uFFFF\u0443\u0301\uFFFF\u044b\u0301\uFFFF\u044d\u0301\uFFFF\u044e\u0301\uFFFF\u044f\u0301\u235e\u0000 ()-0123456789ABCDEFGHIJKLMNOP" +
|
||||
"QRSTUVWXYZabcdefghijklmnopqrstuvwxyz\u0391\u0395\u0397\u0399\u039f\u03a1\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u30a2\u30a4\u30a6\u30a8\u30aa\u30ab" +
|
||||
"\u30ad\u30af\u30b1\u30b3\u30b5\u30b7\u30b9\u30bb\u30bd\u30bf\u30c1\u30c4\u30c6\u30c8\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d2\u30d5\u30d8\u30db\u30de\u30df\u30e0\u30e1\u30e2\u30e4\u30e6\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ef\u30f0\u30f1\u30f2\u4e00\u4e03\u4e09\u4e0a\u4e0b\u4e2d\u4e5d\u4e8c\u4e94\u4f01\u4f11\u512a\u516b\u516d\u5199\u52b4\u533b\u5341\u5354\u5370\u53f3\u540d\u56db\u571f\u591c\u5973\u5b66\u5b97\u5de6\u65e5\u6708" +
|
||||
"\u6709\u6728\u682a\u6b63\u6c34\u6ce8\u706b\u7279\u7537\u76e3\u793e\u795d\u79d8\u8ca1\u8cc7\u9069\u91d1\u9805\u02d8[\u0000)\uFFFF\ud83c\udd2f{\u0000)\u24ea\u0000)0123456789\u2460\u0000)\u2469\u0000)\u246a\u0000)\u246b\u0000)\u246c\u0000)\u246d\u0000)\u246e\u0000)\u246f\u0000)\u2470\u0000)\u2471\u0000)\u2472" +
|
||||
"\u0000)0123456789\u2461\u0000)\u2473\u0000)\u3251\u0000)\u3252\u0000)\u3253\u0000)\u3254\u0000)\u3255\u0000)\u3256\u0000)\u3257\u0000)\u3258\u0000)\u3259\u0000)0123456789\u2462\u0000)\u325a\u0000)\u325b\u0000)\u325c\u0000)\u325d\u0000)\u325e\u0000" +
|
||||
")\u325f\u0000)\u32b1\u0000)\u32b2\u0000)\u32b3\u0000)\u32b4\u0000)0123456789\u2463\u0000)\u32b5\u0000)\u32b6\u0000)\u32b7\u0000)\u32b8\u0000)\u32b9\u0000)\u32ba\u0000)\u32bb\u0000)\u32bc\u0000)\u32bd\u0000)\u32be\u0000)0\u2464\u0000)\u32bf\u0000)\u2465\u0000)\u2466\u0000)" +
|
||||
"\u2467\u0000)\u2468\u0000)\u24b6\u0000)\u24b7\u0000)\u24b8\u0000)\u24b9\u0000)\u24ba\u0000)\u24bb\u0000)\u24bc\u0000)\u24bd\u0000)\u24be\u0000)\u24bf\u0000)\u24c0\u0000)\u24c1\u0000)\u24c2\u0000)\u24c3\u0000)\u24c4\u0000)\u24c5\u0000)\u24c6\u0000)\u24c7\u0000)\u24c8\u0000)\u24c9\u0000)\u24ca\u0000)\u24cb\u0000)" +
|
||||
"\u24cc\u0000)\u24cd\u0000)\u24ce\u0000)\u24cf\u0000)\u24d0\u0000)\u24d1\u0000)\u24d2\u0000)\u24d3\u0000)\u24d4\u0000)\u24d5\u0000)\u24d6\u0000)\u24d7\u0000)\u24d8\u0000)\u24d9\u0000)\u24da\u0000)\u24db\u0000)\u24dc\u0000)\u24dd\u0000)\u24de\u0000)\u24df\u0000)\u24e0\u0000)\u24e1\u0000)\u24e2\u0000)\u24e3\u0000)" +
|
||||
"\u24e4\u0000)\u24e5\u0000)\u24e6\u0000)\u24e7\u0000)\u24e8\u0000)\u24e9\u1f09\u1f19\u1f29\u1f39\u1f49\u1fec\u1f59\u1f69\u1f01\u1f11\u1f21\u1f31\u1f41\u1fe5\u1f51\u1f61\u0000)\u1161\u3260\u0000)\u326e\u0000)\u1161\u3261\u0000)\u326f\u0000)\u1161\u3262\u0000)\u3270\u0000)\u1161\u3263\u0000)\u3271\u0000)\u1161\u3264\u0000)\u3272\u0000)\u1161\u3265\u0000" +
|
||||
")\u3273\u0000)\u1161\u3266\u0000)\u3274\u0000)\u1161\u3267\u0000)\u3275\u0000)\u1161\u3268\u0000)\u3276\u0000)\u1161\u3269\u0000)\u3277\u0000)\u1161\u326a\u0000)\u3278\u0000)\u1161\u326b\u0000)\u3279\u0000)\u1161\u326c\u0000)\u327a\u0000)\u1161\u326d\u0000)\u327b\u0000)\u32d0\u0000)\u32d1\u0000)\u32d2\u0000)\u32d3\u0000)" +
|
||||
"\u32d4\u0000)\u32d5\u0000)\u32d6\u0000)\u32d7\u0000)\u32d8\u0000)\u32d9\u0000)\u32da\u0000)\u32db\u0000)\u32dc\u0000)\u32dd\u0000)\u32de\u0000)\u32df\u0000)\u32e0\u0000)\u32e1\u0000)\u32e2\u0000)\u32e3\u0000)\u32e4\u0000)\u32e5\u0000)\u32e6\u0000)\u32e7\u0000)\u32e8\u0000)\u32e9\u0000)\u32ea\u0000)\u32eb\u0000)" +
|
||||
"\u32ec\u0000)\u32ed\u0000)\u32ee\u0000)\u32ef\u0000)\u32f0\u0000)\u32f1\u0000)\u32f2\u0000)\u32f3\u0000)\u32f4\u0000)\u32f5\u0000)\u32f6\u0000)\u32f7\u0000)\u32f8\u0000)\u32f9\u0000)\u32fa\u0000)\u32fb\u0000)\u32fc\u0000)\u32fd\u0000)\u32fe\u0000)\u3280\u0000)\u3286\u0000)\u3282\u0000)\u32a4\u0000)\u32a6\u0000)" +
|
||||
"\u32a5\u0000)\u3288\u0000)\u3281\u0000)\u3284\u0000)\u32ad\u0000)\u32a1\u0000)\u329d\u0000)\u3287\u0000)\u3285\u0000)\u32a2\u0000)\u3298\u0000)\u32a9\u0000)\u3289\u0000)\u32af\u0000)\u329e\u0000)\u32a8\u0000)\u3294\u0000)\u3283\u0000)\u328f\u0000)\u32b0\u0000)\u329b\u0000)\u32ab\u0000)\u32aa\u0000)\u32a7\u0000)" +
|
||||
"\u3290\u0000)\u328a\u0000)\u3292\u0000)\u328d\u0000)\u3291\u0000)\u32a3\u0000)\u328c\u0000)\u329f\u0000)\u328b\u0000)\u3295\u0000)\u329a\u0000)\u32ac\u0000)\u3293\u0000)\u3297\u0000)\u3299\u0000)\u3296\u0000)\u32ae\u0000)\u329c\u0000)\u328e\u0000)\u32a0\u0000)-\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf" +
|
||||
"\u03c1\u03c5\u03c9]}\u1f08\u1f18\u1f28\u1f38\u1f48\u1f68\u1f00\u1f10\u1f20\u1f30\u1f40\u1fe4\u1f50\u1f60\u0000'0AUau\u00a8\u25cb\u0000Aa\u01fa\u01fb\u00b0\u00c5\u016e\u00e5\u016f\u2363\u235f\u0000+-OUou#\u00b1\u01a0\u01af\u01a1\u01b0\u0000 \"',-ACDEGHIKLNORS" +
|
||||
"TUacdeghiklnorstu\u00b8\u201e\u201a\u00b8\u00ac\u0104\u00c7\u1e10\u0118\u0122\u1e28\u012e\u0136\u013b\u0145\u01ea\u0156\u015e\u0162\u0172\u0105\u00e7\u1e11\u0119\u0123\u1e29\u012f\u0137\u013c\u0146\u01eb\u0157\u015f\u0163\u0173\u0000 ()+,-./:>ADEIKLOU\\" +
|
||||
"^_adeilou\u2191\u2193\u25cb~{}\u00b1\u00ac\u0000 -.\u00ad\u2014\u2013\u0000Ee\uFFFF\u0116\u0304\uFFFF\u0117\u0304\u233f\u00f7\u2192\u0100\u0110\u0112\u012a\u20ad\u00a3\u014c\u016a\u2340\u00af\u2212\u0101\u0111\u0113\u012b\u00a3\u014d\u016b\u234f\u2356\u2296\u0000 !'-.:<=>ABCDE" +
|
||||
"FGHIMNOPRSTWXYZ^abcdefghimnoprstwxyz\u00b4\u015a\u015b\u0160\u0161\u017f\u1e62\u1e63\u25cb\u02d9\u0000Ss\u1e68\u1e69\u0000Ss\u1e64\u1e65\u00b7\u2026\u2235\u2039\u2022\u203a\u0226\u1e02\u010a\u1e0a\u0116\u1e1e\u0120\u1e22\u0130\u1e40" +
|
||||
"\u1e44\u022e\u1e56\u1e58\u1e60\u1e6a\u1e86\u1e8a\u1e8e\u017b\u00b7\u0227\u1e03\u010b\u1e0b\u0117\u1e1f\u0121\u1e23\u0131\u1e41\u1e45\u022f\u1e57\u1e59\u1e61\u1e6b\u1e87\u1e8b\u1e8f\u017c\u0000Ss\u1e64\u1e65\u1e64\u1e65\u1e66\u1e67\u1e9b\u1e68\u1e69\u2299\u0000-/<=BCDGHILOTZ^bcdghilmotuv" +
|
||||
"z\u0294\u0413\u041a\u0433\u043a\u04ae\u04af\u2190\u2192\u2194\u2395\u233f\\\\\u2260\u0243\u20a1\u0110\u01e4\u0126\u0197\u0141\u00d8\u0166\u01b5|\u0180\u00a2\u0111\u01e5\u0127\u0268\u0142\u20a5\u00f8\u0167\u00b5\u221a\u01b6\u02a1\u0492\u049e\u0493\u049f\u04b0\u04b1\u219a\u219b\u21ae\u2341\u0000*3~\u00b0\u2189\u236c\u0000123456789^\u00000\u2152" +
|
||||
"\u00bd\u2153\u00bc\u2155\u2159\u2150\u215b\u2151\u00b9\u000035^\u2154\u2156\u00b2\u0000458^\u00be\u2157\u215c\u00b3\u00005\u2158\u000068\u215a\u215d\u00008\u215e\u00008\u221e\u0000()-.\u2395\u2639\u263a\u00f7\u2234\u2360\u0000 AEIOSTU_aeiostu\u02db\u0104\u0118\u012e\u01ea" +
|
||||
"\u0218\u021a\u0172\u236e\u0105\u0119\u012f\u01eb\u0219\u021b\u0173\u0000 \"'-/3<=>CDELNRSTZ_cdelnrstz\u2395\u02c7\u201c\u2018\u2190\u226e\u2665\u00ab\u2264\u22c4\u010c\u010e\u011a\u013d\u0147\u0158\u0160\u0164\u017d\u2264\u010d\u010f\u011b\u013e\u0148\u0159\u0161\u0165\u017e\u2343\u0000/" +
|
||||
"<>CELNOPRTUWY^_cdeopruvy\u0415\u0417\u0421\u0423\u0437\u0443\u2395\u2260\u21d0\u21d2\u20ac\u20ac\u20a4\u20a6\u0150\u20bd\u20b9\u20ae\u0170\u20a9\u00a5\u21d1\u2261\u20ac\u20ab\u20ac\u0151\u20bd\u20b9\u0171\u21d3\u00a5\u20ac\u20bd\u20ac\u04f2\u20bd\u04f3\u2338\u0000 \"'/<=>A" +
|
||||
"EIOU_aeiou\u00a8\u2395^\u201d\u2019\u226f\u22c4\u2265\u00bb\u00c2\u00ca\u00ce\u00d4\u00db\u2265\u00e2\u00ea\u00ee\u00f4\u00fb\u2369\u2344\u0000!+?AEIOUY\\^abeiouy\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0\u2395\u2e18\u0000OUou\u1ede\u1eec" +
|
||||
"\u1edf\u1eed\u00bf\u1ea2\u1eba\u1ec8\u1ece\u1ee6\u1ef6\u262d\u0000AEOaeo\u1ea8\u1ec2\u1ed4\u1ea9\u1ec3\u1ed5\u1ea3\u0000Aa\u1eb2\u1eb3\u1ebb\u1ec9\u1ecf\u1ee7\u1ef7\u1ea8\u1ec2\u1ed4\u1ea9\u1ec3\u1ed5\u1eb2\u1eb3\u1ede\u1edf\u1eec\u1eed\u2370\u0000\"'(*,-;>AET^_`~\u00a8\u00b4\u00c4\u00c1\u0102\u00c5\u0104\u0100\u0104" +
|
||||
"\u00c2\u00c5\u00c6@\u00c2\u0100\u00c0\u00c3\u00c4\u00c1\u0000.|\u1e02\u0e3f\u0000',./<=CEOr|\u0106\u00c7\u010a\u20a1\u010c\u20ac\u2102\u20a0\u00a9\u20a2\u20b5\u0000,-.<H\u1e10\u0110\u1e0a\u010e\u00d0\u0000\"',-.;<=>E^_`\u00a8\u00b4\u00cb\u00c9\u0118\u0112\u0116\u0118\u011a" +
|
||||
"\u20ac\u00ca\u018f\u00ca\u0112\u00c8\u00cb\u00c9\u0000.Uilr\u1e1e\uFFFF\ud83d\udd95\uFFFF\ufb03\uFFFF\ufb04\u20a3\u0000(,.TU|\u02d8\u011e\u0122\u0120>\u011e\u20b2\u011e\u0000,\u1e28\u0000\"',-.;>J^_`j~\u00a8\u00b4\u00cf\u00cd\u012e\u012a\u0130\u012e\u00ce\u0132\u00ce\u012a\u00cc\u0132\u0128\u00cf\u00cd" +
|
||||
"\u0000'\u00b4\uFFFF\u004a\u0301\uFFFF\u004a\u0301\u0000,-\u0136\u20ad\u0000',-/<=LTV\u0139\u013b\u00a3\u0141\u013d\u20a4\u0000A\u0000P\uFFFF\ud83d\udd96<|\u0000.\u1e40\u0000',<=GNOo~\u0143\u0145\u0147\u20a6\u014a\u2115\u2116\u2116\u00d1\u0000\"',-/;>ACE" +
|
||||
"RSXY^_`~\u00a8\u00b4\u00d6\u00d3\u01ea\u014c\u00d8\u01ea\u00d4\u24b6\u00a9\u0152\u00ae\u00a7\u00a4\u262e\u00d4\u014c\u00d2\u00d5\u00d6\u00d3\u0000!.=Pt\u00b6\u1e56\u20bd\u00b6\u20a7\u0000Q\u211a\u0000',<=ORs\u0154\u0156\u0158\u20b9\u00ae\u211d\u20a8\u0000!',.;<MOS|\u00a7\u015a" +
|
||||
"\u015e\u1e60\u0218\u0160\u2120\u00a7\u1e9e$\u0000,-./;<=HM\u0162\u0166\u1e6a\u0166\u021a\u0164\u20ae\u00de\u2122\u0000 !\"'*,-;>AEGIOU^_`aegiou~\u00a8\u00b4\u00b8\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443" +
|
||||
"\u0000,\u0000Ee\u1e1c\u1e1d\u0000Aa\u1eb6\u1eb7\u00dc\u00da\u016e\u0172\u016a\u0172\u00db\u0102\u0114\u011e\u012c\u014e\u016c\u00db\u016a\u00d9\u0103\u0115\u011f\u012d\u014f\u016d\u0168\u00dc\u00da\u0000Ee\u1e1c\u1e1d\u1fb8\u1fd8\u1fe8\u1fb0\u1fd0\u1fe0\u04d0\u04d6\u04c1\u0419\u040e\u04d1\u04d7\u04c2\u0439\u045e\u0000Lcsz|\u010c\u0160\u017d\u0000=^\u20a9\u0174" +
|
||||
"\u0000O\u00a4\u0000\"'=^\u00a8\u00b4\u0178\u00dd\u00a5\u0176\u0178\u00dd\u0000'.<Z\u0179\u017b\u017d\u2124\u0000]\u2337\u0000-?o\u2395\u25cb\u2340\u262d\u0000/\uFFFF\ud83d\ude4c\u2342\u2349\u0000[\u2337\u0000!()+-./0123456789=ACEGHIJ" +
|
||||
"OSUWYZ_aceghijosuwyz|\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1eb8\u1eb9\u1ecc\u1ecd\u2212\u4e00\u4e01\u4e09\u4e0a\u4e0b\u4e19\u4e2d\u4e59\u4e8c\u4eba\u56db\u5730\u5929\u7532\u0000AEOaeo\u1eac\u1ec6\u1ed8\u1ead\u1ec7\u1ed9\u207d\u207e\u207a\u207b\u00b7|\u2070" +
|
||||
"\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207c\u00c2\u0108\u00ca\u011c\u0124\u00ce\u0134\u00d4\u015c\u00db\u0174\u0176\u1e90\u0000ahijlnorswxy\u0263\u0266\u0279\u027b\u0281\u0295\u00aa\u02b0\u2071\u02b2\u02e1\u207f\u00ba\u02b3\u02e2\u02b7\u02e3\u02b8\u02e0\u02b1\u02b4\u02b5\u02b6\u02e4\u00e2\u0109\u00ea\u011d\u0125\u00ee\u0135\u00f4\u015d\u00fb\u0175\u0177" +
|
||||
"\u1e91\u2191\uFFFF\u0410\u0302\uFFFF\u0415\u0302\uFFFF\u0418\u0302\uFFFF\u041e\u0302\uFFFF\u0420\u0302\uFFFF\u0423\u0302\uFFFF\u0430\u0302\uFFFF\u0435\u0302\uFFFF\u0438\u0302\uFFFF\u043e\u0302\uFFFF\u0440\u0302\uFFFF\u0443\u0302\u1ec6\u1ec7\u1ed8\u1ed9\u207b\u3192\u319c\u3194\u3196\u3198\u319b\u3197\u319a\u3193\u319f\u3195\u319e\u319d\u3199\u0000 !\"'()+-.01234" +
|
||||
"56789;<=>AEGIOUY^_aegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u2206\u220a\u2212\u2218\u2260\u2282\u2283\u22a5\u22c4\u2373\u2375\u237a" +
|
||||
"\u25cb\u00af\u0000LRlr\u1e38\u1e5c\u1e39\u1e5d\u0000AOUaou\u01de\u022a\u01d5\u01df\u022b\u01d6\u2358\u208d\u208e\u208a\u208b\u0000AEOaeo\u01e0\uFFFF\u0116\u0304\u0230\u01e1\uFFFF\u0117\u0304\u0231\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u0000Oo\u01ec\u01ed\u2264\u208c\u2265\u0100\u0112\u1e20\u012a\u014c\u016a\u0232\u00af" +
|
||||
"\u00af\u0101\u0113\u1e21\u012b\u014d\u016b\u0233\u0000Oo\u022c\u022d\u01de\u01e2\u022c\u022a\u01d5\u01df\u01e3\u022d\u022b\u01d6\u01e0\u01e1\u1fb9\u1fd9\u1fe9\u1fb1\u1fd1\u1fe1\uFFFF\u0410\u0304\uFFFF\u0415\u0304\u04e2\uFFFF\u041e\u0304\uFFFF\u0420\u0304\u04ee\uFFFF\u0430\u0304\uFFFF\u0435\u0304\u04e3\uFFFF\u043e\u0304\uFFFF\u0440\u0304\u04ef\u1e38\u1e39\u1e5c\u1e5d\u2359\u2377\u208b\u235b\u2262\u2286\u2287\u234a\u235a" +
|
||||
"\u2378\u2379\u2376\u235c\u0000\"()+AEINOUWY^_`abeinouwy\u00af\u00c2\u00ca\u00d4\u00dc\u00e2\u00ea\u00f4\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e" +
|
||||
"\u0440\u0443\u0000Uu\u03b9\u03c5\u01db\u01dc\u1fd2\u1fe2\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0b\u1f1b\u1f2b\u1f3b\u1f4b\u1f5b\u1f6b\u1f03\u1f13\u1f23\u1f33\u1f43\u1f53\u1f63\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0a\u1f1a\u1f2a\u1f3a\u1f4a\u1f6a\u1f02\u1f12\u1f22\u1f32\u1f42\u1f52\u1f62\u0000OUou" +
|
||||
"\u1edc\u1eea\u1edd\u1eeb\u00c0\u00c8\u00cc\u01f8\u00d2\u00d9\u1e80\u1ef2\u0000AEOaeo\u1ea6\u1ec0\u1ed2\u1ea7\u1ec1\u1ed3\u0000EOeo\u1e14\u1e50\u1e15\u1e51\u0000\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\uFFFF\u0410\u030f\uFFFF\u0415\u030f\uFFFF\u0418\u030f\uFFFF\u041e\u030f\uFFFF\u0420\u030f\uFFFF\u0423\u030f\uFFFF\u0430\u030f\uFFFF\u0435\u030f\uFFFF" +
|
||||
"\u0438\u030f\uFFFF\u043e\u030f\uFFFF\u0440\u030f\uFFFF\u0443\u030f\u00e0\u0000Aa\u1eb0\u1eb1\u00e8\u00ec\u01f9\u00f2\u00f9\u1e81\u1ef3\u0000EOeo\u1e14\u1e50\u1e15\u1e51\u1ea6\u1ec0\u1ed2\u01db\u1ea7\u1ec1\u1ed3\u01dc\u1eb0\u1eb1\u1e14\u1e15\u1e50\u1e51\u1edc\u1edd\u1eea\u1eeb\u1fba\u1fc8\u1fca\u1fda\u1ff8\u1fea\u1ffa\u1f70\u1f72\u1f74\u1f76\u1f78\u1f7a\u1f7c\uFFFF\u0410\u0300\u0400\u040d\uFFFF\u041e" +
|
||||
"\u0300\uFFFF\u0420\u0300\uFFFF\u0423\u0300\uFFFF\u0430\u0300\u0450\u045d\uFFFF\u043e\u0300\uFFFF\u0440\u0300\uFFFF\u0443\u0300\u0000\"'(*,-;>^_`ae~\u00a8\u00b4\u00e4\u00e1\u0103\u00e5\u0105\u0101\u0105\u00e2\u00e2\u0101\u00e0\u00e5\u00e6\u00e3\u00e4\u00e1\u0000!,.AEGIOUaegiou\u00b8\u0391" +
|
||||
"\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000Aa\u1eb6\u1eb7\u0000Ee\u1e1c\u1e1d\u1e03\u0102\u0114\u011e\u012c\u014e\u016c\u0103\u0115\u011f\u012d\u014f\u016d\u0000Ee\u1e1c\u1e1d\u1fb8\u1fd8\u1fe8\u1fb0\u1fd0\u1fe0\u04d0\u04d6\u04c1\u0419\u040e\u04d1\u04d7\u04c2\u0439\u045e\u0000\"',./<=ACDEG" +
|
||||
"HIKLNORSTUZacdeghijklnorstuz|\u00dc\u00fc\u0000Uu\u01d9\u01da\u0107\u00e7\u010b\u00a2\u010d\u20ac\u01cd\u010c\u010e\u011a\u01e6\u021e\u01cf\u01e8\u013d\u0147\u01d1\u0158\u0160\u0164\u01d3\u017d\u01ce\u010d\u010f\u011b\u01e7\u021f\u01d0\u01f0\u01e9\u013e\u0148\u01d2\u0159\u0161" +
|
||||
"\u0165\u01d4\u017e\u00a2\u01d9\u01da\u0000,-.<=hi\u1e11\u0111\u1e0b\u010f\u20ab\u00f0\u2300\u0000\"',-.;<=>^_`e\u00a8\u00b4\u00eb\u00e9\u0119\u0113\u0117\u0119\u011b\u20ac\u00ea\u00ea\u0113\u00e8\u0259\u00eb\u00e9\u0000.Sfils\u1e1f\u017f\uFFFF\ufb00\uFFFF\ufb01\uFFFF\ufb02\u017f\u0000(,." +
|
||||
"Ut\u02d8\u011f\u0123\u0121\u011f>\u011f\u0000,\u1e29\u0000\"',-.;>^_`j~\u00a8\u00b4\u00ef\u00ed\u012f\u012b\u0131\u012f\u00ee\u00ee\u012b\u00ec\u0133\u0129\u00ef\u00ed\u0000'\u00b4\uFFFF\u006a\u0301\uFFFF\u006a\u0301\u0000,k\u0137\u0138\u0000',-/<tv\u013a\u013c\u00a3\u0142\u013e<|\u0000." +
|
||||
"/u\u1e41\u20a5\u00b5\u0000',<g~\u0144\u0146\u0148\u014b\u00f1\u0000\"',-/;>AU^_`aceorsuwxy~\u00a8\u00b4\u00f6\u00f3\u01eb\u014d\u00f8\u01eb\u00f4\u00c5\u016e\u00f4\u014d\u00f2\u00e5\u00a9\u0153\u00b0\u00ae\u00a7\u016f\u1e98\u00a4\u1e99\u00f5\u00f6\u00f3\u0000!.=o" +
|
||||
"\u00b6\u1e57\u20bd\u0000o\uFFFF\ud83d\udca9\u0000',<=\u0155\u0157\u0159\u20b9\u0000!',.;<mos\u00b8\u00a7\u015b\u015f\u1e61\u0219\u0161\u2120\u00a7\u00df\u015f\u0000,-./;<hm\u0163\u0167\u1e6b\u0167\u021b\u0165\u00fe\u2122\u0000\"'*,-/;>AEGIOU^_" +
|
||||
"`aegiou~\u00a8\u00b4\u00fc\u00fa\u016f\u0173\u016b\u00b5\u0173\u00fb\u0102\u0114\u011e\u012c\u014e\u016c\u00fb\u016b\u00f9\u0103\u0115\u011f\u012d\u014f\u016d\u0169\u00fc\u00fa\u0000/ACDEGHIKNORSTUZacdeghijklnorstuz|\u221a" +
|
||||
"\u01cd\u010c\u010e\u011a\u01e6\u021e\u01cf\u01e8\u0147\u01d1\u0158\u0160\u0164\u01d3\u017d\u01ce\u010d\u010f\u011b\u01e7\u021f\u01d0\u01f0\u01e9|\u0148\u01d2\u0159\u0161\u0165\u01d4\u017e\u2193\u0000^\u0175\u0000ox\u00a4\u00d7\u0000\"'=^\u00a8\u00b4\u00ff\u00fd\u00a5\u0177\u00ff\u00fd\u0000'.<\u017a\u017c\u017e\u0000}\u2205\u0000-=BCGS^" +
|
||||
"cv~\u2190\u2192\u2206\u2207\u222a\u2282\u25cb\u2020\u2021\u0e3f\u20b5\u20b2$\u2191\u00a2\u2193\u236d\u2345\u2346\u234b\u2352\u2366\u2367\u233d\u0000\"()+0AEINOUVY^abeinouvy|~\u00a8\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0\u03b1\u03b7\u03b9\u03c5\u03c9\u2207" +
|
||||
"\u2227\u2228\u0000\u03b9\u03c5\u1fd7\u1fe7\u0000\u0391\u0397\u0399\u03a5\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0f\u1f2f\u1f3f\u1f5f\u1f6f\u1f07\u1f27\u1f37\u1f57\u1f67\u0000\u0391\u0397\u0399\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0e\u1f2e\u1f3e\u1f6e\u1f06\u1f26\u1f36\u1f56\u1f66\u0000OUou\u1ee0\u1eee\u1ee1\u1eef\u236c\u00c3\u1ebc\u0128\u00d1\u00d5\u0168\u1e7c\u1ef8\u0000AEOaeo" +
|
||||
"\u1eaa\u1ec4\u1ed6\u1eab\u1ec5\u1ed7\u00e3\u0000Aa\u1eb4\u1eb5\u1ebd\u0129\u00f1\u00f5\u0169\u1e7d\u1ef9\u236d\u2248\u2368\u1eaa\u1ec4\u1ed6\u1eab\u1ec5\u1ed7\u1eb4\u1eb5\u1ee0\u1ee1\u1eee\u1eef\u1fb6\u1fc6\u1fd6\u1fe6\u1ff6\u236b\u2372\u2371\u0000'*>AEIOUY`aeiouy~\u00b4\u2207\u2218\u22a4\u25cb\u0385\u2363\u2369\u00c4\u00cb\u00cf\u00d6" +
|
||||
"\u00dc\u0178\u1fed\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u1fc1\u0385\u2362\u2364\u2361\u2365\u0000!\".;AEGIOUYaegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u22a4\u0000L" +
|
||||
"Rlr\u1e38\u1e5c\u1e39\u1e5d\u0000AOUaou\u01de\u022a\u01d5\u01df\u022b\u01d6\u0000AOao\u01e0\u0230\u01e1\u0231\u0000Oo\u01ec\u01ed\u0100\u0112\u1e20\u012a\u014c\u016a\u0232\u0101\u0113\u1e21\u012b\u014d\u016b\u0233\u0000Oo\u022c\u022d\u01de\u01e2\u022c\u022a\u01d5\u01df\u01e3\u022d\u022b\u01d6\u01e0\u01e1\u1fb9\u1fd9\u1fe9\u1fb1\u1fd1\u1fe1\uFFFF" +
|
||||
"\u0410\u0304\uFFFF\u0415\u0304\u04e2\uFFFF\u041e\u0304\uFFFF\u0420\u0304\u04ee\uFFFF\u0430\u0304\uFFFF\u0435\u0304\u04e3\uFFFF\u043e\u0304\uFFFF\u0440\u0304\u04ef\u1e38\u1e39\u1e5c\u1e5d\u2351\u0000\"()+,/ACEGIJKLMNOPRSUWYZ^_abcegijklmnop" +
|
||||
"rsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a" +
|
||||
"\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u0000IUiu\u03b9\u03c5\u1e2e\u01d7\u1e2f\u01d8\u0390\u03b0\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0d\u1f1d\u1f2d\u1f3d\u1f4d\u1f5d\u1f6d\u1f05\u1f15\u1f25\u1f35\u1f45\u1f55\u1f65\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0c\u1f1c\u1f2c\u1f3c\u1f4c\u1f6c\u1f04\u1f14\u1f24" +
|
||||
"\u1f34\u1f44\u1f54\u1f64\u0000OUou\u1eda\u1ee8\u1edb\u1ee9\u0000Cc\u1e08\u1e09\u0000Oo\u01fe\u01ff\u00c1\u0106\u00c9\u01f4\u00cd\uFFFF\u004a\u0301\u1e30\u0139\u1e3e\u0143\u00d3\u1e54\u0154\u015a\u00da\u1e82\u00dd\u0179\u0000AEOaeo\u1ea4\u1ebe\u1ed0\u1ea5\u1ebf\u1ed1\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u00e1\u0000Aa\u1eae\u1eaf\u0107" +
|
||||
"\u00e9\u01f5\u00ed\uFFFF\u006a\u0301\u1e31\u013a\u1e3f\u0144\u00f3\u1e55\u0155\u015b\u00fa\u1e83\u00fd\u017a\u0000OUou\u1e4c\u1e78\u1e4d\u1e79\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u0000Cc\u1e08\u1e09\u1ea4\u01fa\u01fc\u1e08\u1ebe\u1e2e\u1ed0\u1e4c\u01fe\u01d7\u1ea5\u01fb\u01fd\u1e09\u1ebf\u1e2f\u1ed1\u1e4d\u01ff\u01d8\u1eae\u1eaf\u1e16\u1e17\u1e52\u1e53\u1e78\u1e79\u1eda\u1edb\u1ee8" +
|
||||
"\u1ee9\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u03ac\u03ad\u03ae\u03af\u03cc\u03cd\u03ce\uFFFF\u0410\u0301\u0403\uFFFF\u0415\u0301\uFFFF\u0418\u0301\u040c\uFFFF\u041e\u0301\uFFFF\u0420\u0301\uFFFF\u0423\u0301\uFFFF\u042b\u0301\uFFFF\u042d\u0301\uFFFF\u042e\u0301\uFFFF\u042f\u0301\uFFFF\u0430\u0301\u0453\uFFFF\u0435\u0301\uFFFF\u0438\u0301\u045c\uFFFF\u043e\u0301\uFFFF\u0440\u0301\uFFFF\u0443\u0301\uFFFF\u044b\u0301\uFFFF\u044d" +
|
||||
"\u0301\uFFFF\u044e\u0301\uFFFF\u044f\u0301\u0000CDEGHKLNRSTcdeghklnrst\u00c7\u1e10\u0228\u0122\u1e28\u0136\u013b\u0145\u0156\u015e\u0162\u00e7\u1e11\u0229\u0123\u1e29\u0137\u013c\u0146\u0157\u015f\u0163\u0000\u2395\u2339\u0000Gg\u011e\u011f\u0000'\u0386\u0000'\u0388\u0000'\u0389\u0000\"'" +
|
||||
"\u03aa\u038a\u0000'\u038c\u0000\"'\u03ab\u038e\u0000'\u038f\u0000'\u03ac\u0000'\u03ad\u0000'\u03ae\u0000\"'()`~\u00b4\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u03ca\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8d\u1f9d\u1fad\u1f85\u1f95\u1fa5\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8c\u1f9c\u1fac\u1f84\u1f94\u1fa4\u1fb4\u1fc4\u1ff4" +
|
||||
"\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f89\u1f99\u1fa9\u1f81\u1f91\u1fa1\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f88\u1f98\u1fa8\u1f80\u1f90\u1fa0\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8b\u1f9b\u1fab\u1f83\u1f93\u1fa3\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8a\u1f9a\u1faa\u1f82\u1f92\u1fa2\u1fb2\u1fc2\u1ff2\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1" +
|
||||
"\u03b7\u03c9\u1f8f\u1f9f\u1faf\u1f87\u1f97\u1fa7\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8e\u1f9e\u1fae\u1f86\u1f96\u1fa6\u1fb7\u1fc7\u1ff7\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8d\u1f9d\u1fad\u1f85\u1f95\u1fa5\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8c\u1f9c\u1fac\u1f84\u1f94\u1fa4\u1fb4\u1fc4\u1ff4\u1fbc\u1fcc\u1ffc\u1fb3\u1fc3\u1ff3\u0000'\u03cc\u0000\"'\u03cb" +
|
||||
"\u03cd\u0000'\u03ce\u0000=\u20ac\u0000=\u20bd\u0000\u041e\u043e\u2116\u2116\u0000=\u20ac\u0000=\u20bd\u0000\u0430\u00a7\u0000\u05d9\uFFFF\ufb1d\u0000\u05d0\u05f2\uFFFF\ufb2e\uFFFF\ufb1f\u0000\u05d0\uFFFF\ufb2f\u0000\u05d5\uFFFF\ufb4b\u0000\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d8\u05d9\u05da\u05db\u05dc\u05de\u05e0\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u05ea\uFFFF\ufb30\uFFFF\ufb31\uFFFF\ufb32" +
|
||||
"\uFFFF\ufb33\uFFFF\ufb34\uFFFF\ufb35\uFFFF\ufb36\uFFFF\ufb38\uFFFF\ufb39\uFFFF\ufb3a\uFFFF\ufb3b\uFFFF\ufb3c\uFFFF\ufb3e\uFFFF\ufb40\uFFFF\ufb41\uFFFF\ufb43\uFFFF\ufb44\uFFFF\ufb46\uFFFF\ufb47\uFFFF\ufb48\uFFFF\ufb49\uFFFF\ufb4a\u0000\u05d1\u05db\u05e4\uFFFF\ufb4c\uFFFF\ufb4d\uFFFF\ufb4e\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2c\uFFFF\ufb2a\uFFFF\ufb2c\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2d\uFFFF\ufb2b\uFFFF\ufb2d" +
|
||||
"\u0000\u0627\u0622\u0000\u0627\u0648\u064a\u06c1\u06d2\u06d5\u0623\u0624\u0626\u06c2\u06d3\u06c0\u0000\u0627\u0625\u0000\u0915\u0916\u0917\u091c\u0921\u0922\u0928\u092b\u092f\u0930\u0933\u0958\u0959\u095a\u095b\u095c\u095d\u0929\u095e\u095f\u0931\u0934\u0000\u09a1\u09a2\u09af\u09dc\u09dd\u09df\u0000\u09be\u09d7\u09cb\u09cc\u0000\u0a16\u0a17\u0a1c\u0a2b\u0a32\u0a38\u0a59\u0a5a\u0a5b\u0a5e\u0a33\u0a36\u0000\u0b21\u0b22\u0b5c\u0b5d" +
|
||||
"\u0000\u0b3e\u0b56\u0b57\u0b4b\u0b48\u0b4c\u0000\u0bbe\u0bd7\u0bca\u0bcc\u0000\u0bbe\u0bcb\u0000\u0b92\u0b94\u0000\u0c56\u0c48\u0000\u0cd5\u0cc0\u0000\u0cc2\u0cd5\u0cd6\u0cca\u0cc7\u0cc8\u0000\u0cd5\u0ccb\u0000\u0d3e\u0d57\u0d4a\u0d4c\u0000\u0d3e\u0d4b\u0000\u0dca\u0dcf\u0ddf\u0dda\u0ddc\u0dde\u0000\u0dca\u0ddd\u0000\u0f72\u0f74\u0f80\u0f73\u0f75\u0f81\u0000\u0fb5\u0fb9\u0000\u0fb7\u0f93\u0000\u0fb7\u0f9d\u0000\u0fb7\u0fa2\u0000" +
|
||||
"\u0fb7\u0fa7\u0000\u0fb7\u0fac\u0000\u0f80\u0f76\u0000\u0f80\u0f78\u0000\u0f40\u0f69\u0000\u0f42\u0f4c\u0f51\u0f56\u0f5b\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0000\u1025\u1026\u0000\u1100\u1101\u0000\u1100\u1102\u1103\u1107\u1113\u1114\u1115\u1116\u0000\u1100\u1103\u1117\u1104\u0000\u1102\u1105\u110b\u1112\u1118\u1119\u111b\u111a\u0000\u1107\u110b\u111c\u111d\u0000\u1100\u1102\u1103\u1107\u1109\u110a\u110b\u110c\u110e\u1110\u1111\u112b" +
|
||||
"\u112d\u112f\u1132\u1136\u111e\u111f\u1120\u1108\u1121\u1125\u112b\u1127\u1128\u1129\u112a\u112c\u1122\u1123\u1124\u1126\u0000\u110b\u112c\u0000\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110a\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u111e\u112d\u112e\u112f\u1130\u1131\u1132\u110a\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u1133\u0000\u1109\u1134\u0000\u1100\u1103\u1106\u1107\u1109\u110b\u110c\u110e\u1110\u1111\u1140\u1141" +
|
||||
"\u1142\u1143\u1144\u1145\u1147\u1148\u1149\u114a\u114b\u1146\u0000\u110b\u110c\u114d\u110d\u0000\u110f\u1112\u1152\u1153\u0000\u1107\u110b\u1156\u1157\u0000\u1112\u1158\u0000\u1100\u1103\u1107\u1109\u110c\u1122\u1123\u1124\u1125\u1126\u0000\u1100\u1133\u0000\u113c\u113d\u0000\u113e\u113f\u0000\u114e\u114f\u0000\u1150\u1151\u0000\u1169\u116e\u1175\u1176\u1177\u1162\u0000\u1169\u116d\u1175\u1178\u1179\u1164\u0000\u1169\u116e\u1173" +
|
||||
"\u1175\u117a\u117b\u117c\u1166\u0000\u1169\u116e\u1175\u117d\u117e\u1168\u0000\u1161\u1162\u1165\u1166\u1168\u1169\u116e\u1175\u116a\u116b\u117f\u1180\u1181\u1182\u1183\u116c\u0000\u1175\u116b\u0000\u1163\u1164\u1167\u1169\u1175\u1184\u1185\u1186\u1187\u1188\u0000\u1161\u1162\u1165\u1166\u1168\u116e\u1175\u117c\u1189\u118a\u116f\u1170\u118c\u118d\u1171\u118b\u0000\u1173\u1175\u118b\u1170\u0000\u1161\u1165\u1166\u1167\u1168\u116e" +
|
||||
"\u1175\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u0000\u116e\u1173\u1175\u1195\u1196\u1174\u0000\u116e\u1197\u0000\u1161\u1163\u1169\u116e\u1173\u119e\u1198\u1199\u119a\u119b\u119c\u119d\u0000\u1165\u116e\u1175\u119e\u119f\u11a0\u11a1\u11a2\u0000\u11a8\u11af\u11ba\u11e7\u11a9\u11c3\u11aa\u11c4\u0000\u11a8\u11c4\u0000\u11a8\u11ae\u11ba\u11bd\u11c0\u11c2\u11eb\u11c5\u11c6\u11c7\u11ac\u11c9\u11ad\u11c8\u0000\u11a8\u11af\u11ca\u11cb" +
|
||||
"\u0000\u11a8\u11aa\u11ab\u11ae\u11af\u11b7\u11b8\u11b9\u11ba\u11bb\u11bf\u11c0\u11c1\u11c2\u11da\u11dd\u11e5\u11e6\u11eb\u11f9\u11b0\u11cc\u11cd\u11ce\u11d0\u11b1\u11b2\u11d3\u11b3\u11d6\u11d8\u11b4\u11b5\u11b6\u11d1\u11d2\u11d4\u11d5\u11d7\u11d9\u0000\u11ba\u11cc\u0000\u11a8\u11ba\u11d1\u11d2\u0000\u11ba\u11bc\u11c2\u11d3\u11d5\u11d4\u0000\u11ba\u11d6\u0000\u11a8\u11af\u11b8\u11ba\u11bb\u11bc\u11be\u11c2\u11eb\u11da\u11db\u11dc" +
|
||||
"\u11dd\u11de\u11e2\u11e0\u11e1\u11df\u0000\u11af\u11ba\u11bc\u11c1\u11c2\u11e3\u11b9\u11e6\u11e4\u11e5\u0000\u11a8\u11ae\u11af\u11b8\u11ba\u11e7\u11e8\u11e9\u11ea\u11bb\u0000\u11a8\u11a9\u11bc\u11bf\u11ec\u11ed\u11ee\u11ef\u0000\u11b8\u11bc\u11f3\u11f4\u0000\u11ab\u11af\u11b7\u11b8\u11f5\u11f6\u11f7\u11f8\u0000\u11c2\u11cf\u0000\u11ba\u11de\u0000\u11a8\u11ed\u0000\u11ba\u11eb\u11f1\u11f2\u0000|\u2395\u2345\u2347\u0000-" +
|
||||
"\u2395\u234f\u2350\u0000|\u2395\u2346\u2348\u0000-\u2395\u2356\u2357\u0000/\u2204\u0000_|\u2395\u2359\u234b\u234d\u0000|~\u00a8\u2395\u2352\u236b\u2362\u2354\u0000/\u2209\u0000_\u2377\u0000/\u220c\u0000_\u00a8\u2229\u22a4\u22a5\u2395\u25cb\u235b\u2364\u235d\u2355\u234e\u233b\u233e\u0000/\u2224\u0000/\u2226\u0000~\u2228\u2395\u2372\u22c4\u2353\u0000~\u2227" +
|
||||
"\u2395\u2371\u22c4\u234c\u0000\u2218\u235d\u0000|\u2366\u0000/\u2247\u0000/\u2244\u0000/\u2249\u0000/\u226d\u0000_\u2395\u2262\u236f\u0000/\u2262\u0000/\u2270\u0000/\u2271\u0000/\u2274\u0000/\u2275\u0000/\u2278\u0000/\u2279\u0000/\u2280\u0000/\u2281\u0000/\u22e0\u0000/\u22e1\u0000/_|\u2284\u2286\u2367\u0000/_\u2285\u2287" +
|
||||
"\u0000/\u2288\u0000/\u2289\u0000/\u22e2\u0000/\u22e3\u0000/\u22ac\u0000\u00a8\u00af\u2218\u22a5\u2361\u2351\u2355\u2336\u0000_\u2218\u22a4\u234a\u234e\u2336\u0000/\u22ad\u0000/\u22ae\u0000/\u22af\u0000/\u22ea\u0000/\u22eb\u0000/\u22ec\u0000/\u22ed\u0000_\u2395\u235a\u233a\u0000_\u2378\u0000_\u2379\u0000_\u2376\u0000'/:<=" +
|
||||
">?\\\u00f7\u2190\u2191\u2192\u2193\u2206\u2207\u2218\u2227\u2228\u2260\u22c4\u25cb\u235e\u2341\u2360\u2343\u2338\u2344\u2370\u2342\u2339\u2347\u2350\u2348\u2357\u234d\u2354\u233b\u2353\u234c\u236f\u233a\u233c\u0000*-.\\_|\u00a8\u2218\u2395\u235f\u2296\u2299\u2349\u235c\u233d\u2365\u233e\u233c\u0000/\u2adc").toCharArray();
|
||||
("\u0000 !\"#%'()*+,-./01234578:;<=>?ABCDEFGHIKLMNOPQRSTUVWXYZ[\\]^_`abcdefghiklm" +
|
||||
"noprstuvwxyz{|~\u00a8\u00af\u00b4\u00b8\u00f7\u02d8\u05b7\u05c1\u05c2\u0654\u093c\u09bc\u09c7\u0a3c\u0b3c\u0b47\u0bc6\u0bc7\u0bd7\u0c46\u0cbf\u0cc6\u0cca\u0d46\u0d47\u0dd9\u0ddc\u0f71\u0f90\u0f92\u0f9c\u0fa1\u0fa6\u0fab\u0fb2\u0fb3\u0fb5\u0fb7\u102e\u1100\u1102\u1103\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110e\u1111\u1112\u1121\u1132\u113c\u113e" +
|
||||
"\u114e\u1150\u1161\u1163\u1165\u1167\u1169\u116a\u116d\u116e\u116f\u1172\u1173\u1174\u1175\u119e\u11a8\u11aa\u11ab\u11ae\u11af\u11b0\u11b1\u11b2\u11b3\u11b7\u11b8\u11ba\u11bc\u11c1\u11c2\u11ce\u11dd\u11ec\u11f0\u2190\u2191\u2192\u2193\u2203\u2206\u2207\u2208\u220a\u220b\u2218\u2223\u2225\u2227\u2228\u2229\u222a\u223c\u2243\u2248\u224d\u2260\u2272\u2273\u2276\u2277\u227a\u227b\u227c\u227d\u2282\u2283\u2286\u2287\u2291\u2292\u22a4" +
|
||||
"\u22a5\u22a8\u22a9\u22ab\u22b2\u22b3\u22b4\u22b5\u22c4\u2373\u2375\u237a\u2395\u25cb\u2add\u0000 (,-.<>_\u00a0\u02d8\u00b8~\u2008\u02c7^\u00af\u0000!+?ABDEHIKLMNORSTUVWYZ^abdehiklmnorstuv" +
|
||||
"wyz\u00a1\u0000OUou\u1ee2\u1ef0\u1ee3\u1ef1\u203d\u1ea0\u1e04\u1e0c\u1eb8\u1e24\u1eca\u1e32\u1e36\u1e42\u1e46\u1ecc\u1e5a\u1e62\u1e6c\u1ee4\u1e7e\u1e88\u1ef4\u1e92\u00a6\u1ea1\u1e05\u1e0d\u1eb9\u1e25\u1ecb\u1e33\u1e37\u1e43\u1e47\u1ecd\u1e5b\u1e63\u1e6d\u1ee5\u1e7f\u1e89\u1ef5\u1e93\u0000 \"',<>AEHIOUWXY_ae" +
|
||||
"hiotuwxy~\u00af\u00b4\u00d5\u00f5\u03d2\u04d8\u04d9\u04e8\u04e9\u00a8\u00a8\u0344\u201e\u201c\u201d\u00c4\u00cb\u1e26\u00cf\u00d6\u00dc\u1e84\u1e8c\u0178\u0000Uu\u1e7a\u1e7b\u00e4\u00eb\u1e27\u00ef\u00f6\u1e97\u00fc\u1e85\u1e8d\u00ff\u0000Oo\u1e4e\u1e4f\u0000Uu\u1e7a\u1e7b\u0344\u1e4e\u1e4f\u03d4\u04da\u04db\u04ea\u04eb\u0000#ESbe" +
|
||||
"fq\u266f\u266b\u266c\u266d\u266a\u266e\u2669\u0000o\u2030\u0000\"'+,/<>ACEGIKLMNOPRSUWYZ^_abcegiklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00dc\u00e2\u00e5\u00e6" +
|
||||
"\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u2395\u0000 IUiu\u0385\u1e2e\u01d7\u1e2f\u01d8\u00b4\u0000OUou\u1eda\u1ee8\u1edb\u1ee9\u201a\u0000Oo\u01fe\u01ff\u2018\u2019\u00c1\u0106\u00c9\u01f4\u00cd\u1e30\u0139\u1e3e\u0143\u00d3\u1e54\u0154\u015a\u00da\u1e82\u00dd\u0179\u0000AEOaeo\u1ea4\u1ebe\u1ed0\u1ea5\u1ebf\u1ed1\u0000EOeo" +
|
||||
"\u1e16\u1e52\u1e17\u1e53\u00e1\u0000Aa\u1eae\u1eaf\u0107\u00e9\u01f5\u00ed\u1e31\u013a\u1e3f\u0144\u00f3\u1e55\u0155\u015b\u00fa\u1e83\u00fd\u017a\u0000OUou\u1e4c\u1e78\u1e4d\u1e79\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u0000Cc\u1e08\u1e09\u1ea4\u01fa\u01fc\u1e08\u1ebe\u1e2e\u1ed0\u1e4c\u01d7\u1ea5\u01fb\u01fd\u1e09\u1ebf\u1e2f\u1ed1\u1e4d\u01ff\u01d8\u235e\u0000 (" +
|
||||
"-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110b\u110c" +
|
||||
"\u110e\u110f\u1110\u1111\u1112\u30f0\u30f1\u4e00\u4e03\u4e09\u4e0a\u4e0b\u4e2d\u4e5d\u4e8c\u4e94\u4f01\u4f11\u512a\u516b\u516d\u5199\u52b4\u533b\u5341\u5354\u5370\u53f3\u540d\u56db\u571f\u591c\u5973\u5b66\u5b97\u5de6\u65e5\u6708\u6709\u6728\u682a\u6b63\u6c34\u6ce8\u706b\u7279\u7537\u76e3\u793e\u795d\u79d8\u8ca1\u8cc7\u9069\u91d1\u9805\u02d8[{\u0000)\u24ea\u0000)01234567" +
|
||||
"89\u2460\u0000)\u2469\u0000)\u246a\u0000)\u246b\u0000)\u246c\u0000)\u246d\u0000)\u246e\u0000)\u246f\u0000)\u2470\u0000)\u2471\u0000)\u2472\u0000)0123456789\u2461\u0000)\u2473\u0000)\u3251\u0000)\u3252\u0000)\u3253\u0000)\u3254\u0000)\u3255\u0000)\u3256\u0000)\u3257\u0000)" +
|
||||
"\u3258\u0000)\u3259\u0000)0123456789\u2462\u0000)\u325a\u0000)\u325b\u0000)\u325c\u0000)\u325d\u0000)\u325e\u0000)\u325f\u0000)\u32b1\u0000)\u32b2\u0000)\u32b3\u0000)\u32b4\u0000)0123456789\u2463\u0000)\u32b5\u0000)\u32b6\u0000)\u32b7\u0000)\u32b8" +
|
||||
"\u0000)\u32b9\u0000)\u32ba\u0000)\u32bb\u0000)\u32bc\u0000)\u32bd\u0000)\u32be\u0000)0\u2464\u0000)\u32bf\u0000)\u2465\u0000)\u2466\u0000)\u2467\u0000)\u2468\u0000)\u24b6\u0000)\u24b7\u0000)\u24b8\u0000)\u24b9\u0000)\u24ba\u0000)\u24bb\u0000)\u24bc\u0000)\u24bd\u0000)\u24be\u0000)\u24bf\u0000)\u24c0\u0000)" +
|
||||
"\u24c1\u0000)\u24c2\u0000)\u24c3\u0000)\u24c4\u0000)\u24c5\u0000)\u24c6\u0000)\u24c7\u0000)\u24c8\u0000)\u24c9\u0000)\u24ca\u0000)\u24cb\u0000)\u24cc\u0000)\u24cd\u0000)\u24ce\u0000)\u24cf\u0000)\u24d0\u0000)\u24d1\u0000)\u24d2\u0000)\u24d3\u0000)\u24d4\u0000)\u24d5\u0000)\u24d6\u0000)\u24d7\u0000)\u24d8\u0000)" +
|
||||
"\u24d9\u0000)\u24da\u0000)\u24db\u0000)\u24dc\u0000)\u24dd\u0000)\u24de\u0000)\u24df\u0000)\u24e0\u0000)\u24e1\u0000)\u24e2\u0000)\u24e3\u0000)\u24e4\u0000)\u24e5\u0000)\u24e6\u0000)\u24e7\u0000)\u24e8\u0000)\u24e9\u0000)\u1161\u3260\u0000)\u326e\u0000)\u1161\u3261\u0000)\u326f\u0000)\u1161\u3262\u0000)\u3270\u0000)" +
|
||||
"\u1161\u3263\u0000)\u3271\u0000)\u1161\u3264\u0000)\u3272\u0000)\u1161\u3265\u0000)\u3273\u0000)\u1161\u3266\u0000)\u3274\u0000)\u1161\u3267\u0000)\u3275\u0000)\u1161\u3268\u0000)\u3276\u0000)\u1161\u3269\u0000)\u3277\u0000)\u1161\u326a\u0000)\u3278\u0000)\u1161\u326b\u0000)\u3279\u0000)\u1161\u326c\u0000)\u327a\u0000)\u1161\u326d" +
|
||||
"\u0000)\u327b\u0000)\u32fc\u0000)\u32fd\u0000)\u3280\u0000)\u3286\u0000)\u3282\u0000)\u32a4\u0000)\u32a6\u0000)\u32a5\u0000)\u3288\u0000)\u3281\u0000)\u3284\u0000)\u32ad\u0000)\u32a1\u0000)\u329d\u0000)\u3287\u0000)\u3285\u0000)\u32a2\u0000)\u3298\u0000)\u32a9\u0000)\u3289\u0000)\u32af\u0000)\u329e\u0000)\u32a8" +
|
||||
"\u0000)\u3294\u0000)\u3283\u0000)\u328f\u0000)\u32b0\u0000)\u329b\u0000)\u32ab\u0000)\u32aa\u0000)\u32a7\u0000)\u3290\u0000)\u328a\u0000)\u3292\u0000)\u328d\u0000)\u3291\u0000)\u32a3\u0000)\u328c\u0000)\u329f\u0000)\u328b\u0000)\u3295\u0000)\u329a\u0000)\u32ac\u0000)\u3293\u0000)\u3297\u0000)\u3299\u0000)\u3296" +
|
||||
"\u0000)\u32ae\u0000)\u329c\u0000)\u328e\u0000)\u32a0\u0000)-]}\u0000'0AUau\u00a8\u25cb\u0000Aa\u01fa\u01fb\u00b0\u00c5\u016e\u00e5\u016f\u2363\u235f\u0000+-OUou#\u00b1\u01a0\u01af\u01a1\u01b0\u0000 \"',-ACDEGHIKLNORSTU" +
|
||||
"acdeghiklnorstu\u00b8\u201e\u201a\u00b8\u00ac\u0104\u00c7\u1e10\u0118\u0122\u1e28\u012e\u0136\u013b\u0145\u01ea\u0156\u015e\u0162\u0172\u0105\u00e7\u1e11\u0119\u0123\u1e29\u012f\u0137\u013c\u0146\u01eb\u0157\u015f\u0163\u0173\u0000 ()+,-/:>ADEIKLOU\\^_a" +
|
||||
"deilou\u2191\u2193\u25cb~{}\u00b1\u00ac\u0000 -.\u00ad\u2014\u2013\u233f\u00f7\u2192\u0100\u0110\u0112\u012a\u20ad\u00a3\u014c\u016a\u2340\u00af\u2212\u0101\u0111\u0113\u012b\u00a3\u014d\u016b\u234f\u2356\u2296\u0000 !'-.:<=>ABCDEFGHIMNOPRSTW" +
|
||||
"XYZ^abcdefghimnoprstwxyz\u00b4\u017f\u1e62\u1e63\u25cb\u02d9\u0000Ss\u1e68\u1e69\u0000Ss\u1e64\u1e65\u00b7\u2026\u2235\u2039\u2022\u203a\u0226\u1e02\u010a\u1e0a\u0116\u1e1e\u0120\u1e22\u0130\u1e40\u1e44\u022e\u1e56\u1e58\u1e60\u1e6a\u1e86\u1e8a\u1e8e\u017b\u00b7\u0227\u1e03\u010b\u1e0b\u0117" +
|
||||
"\u1e1f\u0121\u1e23\u0131\u1e41\u1e45\u022f\u1e57\u1e59\u1e61\u1e6b\u1e87\u1e8b\u1e8f\u017c\u0000Ss\u1e64\u1e65\u1e9b\u1e68\u1e69\u2299\u0000-/<=BCDGHILOTZ^bcdghilmotuvz\u0294\u04ae\u04af\u2194\u2395\u233f\\\\\u2260\u0243\u20a1\u0110\u01e4\u0126\u0197\u0141\u00d8\u0166\u01b5" +
|
||||
"|\u0180\u00a2\u0111\u01e5\u0127\u0268\u0142\u20a5\u00f8\u0167\u00b5\u221a\u01b6\u02a1\u04b0\u04b1\u21ae\u2341\u0000*3~\u00b0\u2189\u236c\u0000123456789^\u00000\u2152\u00bd\u2153\u00bc\u2155\u2159\u2150\u215b\u2151\u00b9\u000035^\u2154\u2156\u00b2\u0000458^\u00be\u2157\u215c\u00b3\u00005\u2158\u000068\u215a" +
|
||||
"\u215d\u00008\u215e\u00008\u221e\u0000()-.\u2395\u2639\u263a\u00f7\u2234\u2360\u0000 AEIOSTU_aeiostu\u02db\u0104\u0118\u012e\u01ea\u0218\u021a\u0172\u236e\u0105\u0119\u012f\u01eb\u0219\u021b\u0173\u0000 \"'-/3<=>CDELNRSTZ_c" +
|
||||
"delnrstz\u2395\u02c7\u201c\u2018\u2190\u226e\u2665\u00ab\u2264\u22c4\u010c\u010e\u011a\u013d\u0147\u0158\u0160\u0164\u017d\u2264\u010d\u010f\u011b\u013e\u0148\u0159\u0161\u0165\u017e\u2343\u0000/<>CELNOPRTUWY^_cdeopruvy\u2395\u2260\u21d0\u21d2\u20ac\u20ac\u20a4\u20a6" +
|
||||
"\u0150\u20bd\u20b9\u20ae\u0170\u20a9\u00a5\u21d1\u2261\u20ac\u20ab\u20ac\u0151\u20bd\u20b9\u0171\u21d3\u00a5\u2338\u0000 \"'/<=>AEIOU_aeiou\u00a8\u2395^\u201d\u2019\u226f\u22c4\u2265\u00bb\u00c2\u00ca\u00ce\u00d4\u00db\u2265\u00e2\u00ea\u00ee\u00f4\u00fb\u2369\u2344\u0000!+?AEIOUY\\^" +
|
||||
"abeiouy\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u2395\u2e18\u0000OUou\u1ede\u1eec\u1edf\u1eed\u00bf\u1ea2\u1eba\u1ec8\u1ece\u1ee6\u1ef6\u262d\u0000AEOaeo\u1ea8\u1ec2\u1ed4\u1ea9\u1ec3\u1ed5\u1ea3\u0000Aa\u1eb2\u1eb3\u1ebb\u1ec9\u1ecf\u1ee7\u1ef7\u1ea8\u1ec2\u1ed4\u1ea9\u1ec3\u1ed5\u2370\u0000\"'(*,-;>" +
|
||||
"AET^_`~\u00a8\u00b4\u00c4\u00c1\u0102\u00c5\u0104\u0100\u0104\u00c2\u00c5\u00c6@\u00c2\u0100\u00c0\u00c3\u00c4\u00c1\u0000.|\u1e02\u0e3f\u0000',./<=CEOr|\u0106\u00c7\u010a\u20a1\u010c\u20ac\u2102\u20a0\u00a9\u20a2\u20b5\u0000,-.<H\u1e10\u0110\u1e0a\u010e\u00d0\u0000\"',-.;" +
|
||||
"<=>E^_`\u00a8\u00b4\u00cb\u00c9\u0118\u0112\u0116\u0118\u011a\u20ac\u00ca\u018f\u00ca\u0112\u00c8\u00cb\u00c9\u0000.ilr\u1e1e\ufb03\ufb04\u20a3\u0000(,.TU|\u02d8\u011e\u0122\u0120>\u011e\u20b2\u011e\u0000,\u1e28\u0000\"',-.;>J^_`j~\u00a8\u00b4\u00cf\u00cd\u012e\u012a\u0130" +
|
||||
"\u012e\u00ce\u0132\u00ce\u012a\u00cc\u0132\u0128\u00cf\u00cd\u0000,-\u0136\u20ad\u0000',-/<=TV\u0139\u013b\u00a3\u0141\u013d\u20a4<|\u0000.\u1e40\u0000',<=GNOo~\u0143\u0145\u0147\u20a6\u014a\u2115\u2116\u2116\u00d1\u0000\"',-/;>ACERSXY^_`" +
|
||||
"~\u00a8\u00b4\u00d6\u00d3\u01ea\u014c\u00d8\u01ea\u00d4\u24b6\u00a9\u0152\u00ae\u00a7\u00a4\u262e\u00d4\u014c\u00d2\u00d5\u00d6\u00d3\u0000!.=Pt\u00b6\u1e56\u20bd\u00b6\u20a7\u0000Q\u211a\u0000',<=ORs\u0154\u0156\u0158\u20b9\u00ae\u211d\u20a8\u0000!',.;<MOS|\u00a7\u015a\u015e\u1e60\u0218\u0160\u2120\u00a7\u1e9e" +
|
||||
"$\u0000,-./;<=HM\u0162\u0166\u1e6a\u0166\u021a\u0164\u20ae\u00de\u2122\u0000 !\"'*,-;>AEGIOU^_`aegiou~\u00a8\u00b4\u00b8\u0000,\u0000Ee\u1e1c\u1e1d\u0000Aa\u1eb6\u1eb7\u00dc\u00da\u016e\u0172\u016a\u0172\u00db\u0102\u0114\u011e\u012c" +
|
||||
"\u014e\u016c\u00db\u016a\u00d9\u0103\u0115\u011f\u012d\u014f\u016d\u0168\u00dc\u00da\u0000Ee\u1e1c\u1e1d\u0000L|\u0000=^\u20a9\u0174\u0000O\u00a4\u0000\"'=^\u00a8\u00b4\u0178\u00dd\u00a5\u0176\u0178\u00dd\u0000'.<Z\u0179\u017b\u017d\u2124\u0000]\u2337\u0000-?\u2395\u25cb\u2340\u262d\u2342\u2349\u0000[\u2337\u0000!()+" +
|
||||
"-./0123456789=ACEGHIJOSUWYZ_aceghijosuwyz|\u1eb8\u1eb9\u1ecc\u1ecd\u2212\u4e00\u4e01\u4e09\u4e0a\u4e0b\u4e19\u4e2d\u4e59\u4e8c\u4eba\u56db\u5730\u5929\u7532\u0000AEOaeo\u1eac\u1ec6\u1ed8\u1ead" +
|
||||
"\u1ec7\u1ed9\u207d\u207e\u207a\u207b\u00b7|\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207c\u00c2\u0108\u00ca\u011c\u0124\u00ce\u0134\u00d4\u015c\u00db\u0174\u0176\u1e90\u0000ahijlnorswxy\u0263\u0266\u0279\u027b\u0281\u0295\u00aa\u02b0\u2071\u02b2\u02e1\u207f\u00ba\u02b3\u02e2\u02b7\u02e3\u02b8\u02e0\u02b1\u02b4\u02b5\u02b6\u02e4\u00e2\u0109\u00ea" +
|
||||
"\u011d\u0125\u00ee\u0135\u00f4\u015d\u00fb\u0175\u0177\u1e91\u2191\u1ec6\u1ec7\u1ed8\u1ed9\u207b\u3192\u319c\u3194\u3196\u3198\u319b\u3197\u319a\u3193\u319f\u3195\u319e\u319d\u3199\u0000 !\"'()+-.0123456789;<=>AEGIOUY^_aegiouy~\u00c4" +
|
||||
"\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u1e36\u1e37\u1e5a\u1e5b\u2206\u220a\u2212\u2218\u2260\u2282\u2283\u22a5\u22c4\u2373\u2375\u237a\u25cb\u00af\u0000LRlr\u1e38\u1e5c\u1e39\u1e5d\u0000AOUaou\u01de\u022a\u01d5\u01df\u022b\u01d6\u2358\u208d\u208e\u208a\u208b\u0000AOao\u01e0\u0230\u01e1\u0231\u2080\u2081\u2082\u2083\u2084\u2085\u2086" +
|
||||
"\u2087\u2088\u2089\u0000Oo\u01ec\u01ed\u2264\u208c\u2265\u0100\u0112\u1e20\u012a\u014c\u016a\u0232\u00af\u00af\u0101\u0113\u1e21\u012b\u014d\u016b\u0233\u0000Oo\u022c\u022d\u01de\u01e2\u022c\u022a\u01d5\u01df\u01e3\u022d\u022b\u01d6\u01e0\u01e1\u1e38\u1e39\u1e5c\u1e5d\u2359\u2377\u208b\u235b\u2262\u2286\u2287\u234a\u235a\u2378\u2379\u2376\u235c\u0000\"+AEINOUWY" +
|
||||
"^_abeinouwy\u00af\u00c2\u00ca\u00d4\u00dc\u00e2\u00ea\u00f4\u00fc\u0000Uu\u01db\u01dc\u0000OUou\u1edc\u1eea\u1edd\u1eeb\u00c0\u00c8\u00cc\u01f8\u00d2\u00d9\u1e80\u1ef2\u0000AEOaeo\u1ea6\u1ec0\u1ed2\u1ea7\u1ec1\u1ed3\u0000EOeo\u1e14\u1e50\u1e15\u1e51\u00e0\u0000Aa\u1eb0\u1eb1\u00e8\u00ec" +
|
||||
"\u01f9\u00f2\u00f9\u1e81\u1ef3\u0000EOeo\u1e14\u1e50\u1e15\u1e51\u1ea6\u1ec0\u1ed2\u01db\u1ea7\u1ec1\u1ed3\u01dc\u0000\"'(*,-;>^_`ae~\u00a8\u00b4\u00e4\u00e1\u0103\u00e5\u0105\u0101\u0105\u00e2\u00e2\u0101\u00e0\u00e5\u00e6\u00e3\u00e4\u00e1\u0000!,.AEGIOUaegiou\u00b8" +
|
||||
"\u0000Aa\u1eb6\u1eb7\u0000Ee\u1e1c\u1e1d\u1e03\u0102\u0114\u011e\u012c\u014e\u016c\u0103\u0115\u011f\u012d\u014f\u016d\u0000Ee\u1e1c\u1e1d\u0000\"',./<=ACDEGHIKLNORSTUZacdeghijklnorstuz|\u00dc\u00fc" +
|
||||
"\u0000Uu\u01d9\u01da\u0107\u00e7\u010b\u00a2\u010d\u20ac\u01cd\u010c\u010e\u011a\u01e6\u021e\u01cf\u01e8\u013d\u0147\u01d1\u0158\u0160\u0164\u01d3\u017d\u01ce\u010d\u010f\u011b\u01e7\u021f\u01d0\u01f0\u01e9\u013e\u0148\u01d2\u0159\u0161\u0165\u01d4\u017e\u00a2\u01d9\u01da\u0000,-.<=hi\u1e11\u0111\u1e0b\u010f\u20ab\u00f0\u2300\u0000\"',-.;<=>" +
|
||||
"^_`e\u00a8\u00b4\u00eb\u00e9\u0119\u0113\u0117\u0119\u011b\u20ac\u00ea\u00ea\u0113\u00e8\u0259\u00eb\u00e9\u0000.Sfils\u1e1f\u017f\ufb00\ufb01\ufb02\u017f\u0000(,.Ut\u02d8\u011f\u0123\u0121\u011f>\u011f\u0000,\u1e29\u0000\"',-.;>^_`j~\u00a8\u00b4\u00ef\u00ed\u012f\u012b\u0131\u012f\u00ee" +
|
||||
"\u00ee\u012b\u00ec\u0133\u0129\u00ef\u00ed\u0000,k\u0137\u0138\u0000',-/<tv\u013a\u013c\u00a3\u0142\u013e<|\u0000./u\u1e41\u20a5\u00b5\u0000',<g~\u0144\u0146\u0148\u014b\u00f1\u0000\"',-/;>AU^_`aceorsuwxy~\u00a8\u00b4\u00f6" +
|
||||
"\u00f3\u01eb\u014d\u00f8\u01eb\u00f4\u00c5\u016e\u00f4\u014d\u00f2\u00e5\u00a9\u0153\u00b0\u00ae\u00a7\u016f\u1e98\u00a4\u1e99\u00f5\u00f6\u00f3\u0000!.=\u00b6\u1e57\u20bd\u0000',<=\u0155\u0157\u0159\u20b9\u0000!',.;<mos\u00b8\u00a7\u015b\u015f\u1e61\u0219\u0161\u2120\u00a7\u00df\u015f\u0000,-./;<hm\u0163\u0167" +
|
||||
"\u1e6b\u0167\u021b\u0165\u00fe\u2122\u0000\"'*,-/;>AEGIOU^_`aegiou~\u00a8\u00b4\u00fc\u00fa\u016f\u0173\u016b\u00b5\u0173\u00fb\u0102\u0114\u011e\u012c\u014e\u016c\u00fb\u016b\u00f9\u0103\u0115\u011f\u012d\u014f\u016d\u0169\u00fc\u00fa\u0000/ACDEGHIKNOR" +
|
||||
"STUZacdeghijklnorstuz|\u221a\u01cd\u010c\u010e\u011a\u01e6\u021e\u01cf\u01e8\u0147\u01d1\u0158\u0160\u0164\u01d3\u017d\u01ce\u010d\u010f\u011b\u01e7\u021f\u01d0\u01f0\u01e9|\u0148\u01d2\u0159\u0161\u0165\u01d4\u017e\u2193\u0000^\u0175\u0000ox\u00a4\u00d7\u0000\"'=^\u00a8\u00b4\u00ff" +
|
||||
"\u00fd\u00a5\u0177\u00ff\u00fd\u0000'.<\u017a\u017c\u017e\u0000}\u2205\u0000-=BCGS^cv~\u2190\u2192\u2206\u2207\u222a\u2282\u25cb\u2020\u2021\u0e3f\u20b5\u20b2$\u2191\u00a2\u2193\u236d\u2345\u2346\u234b\u2352\u2366\u2367\u233d\u0000+0AEINOUVY^abeinouvy|" +
|
||||
"~\u00a8\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u2207\u2227\u2228\u0000OUou\u1ee0\u1eee\u1ee1\u1eef\u236c\u00c3\u1ebc\u0128\u00d1\u00d5\u0168\u1e7c\u1ef8\u0000AEOaeo\u1eaa\u1ec4\u1ed6\u1eab\u1ec5\u1ed7\u00e3\u0000Aa\u1eb4\u1eb5\u1ebd\u0129\u00f1\u00f5\u0169\u1e7d\u1ef9\u236d\u2248\u2368\u1eaa\u1ec4\u1ed6\u1eab\u1ec5\u1ed7\u236b\u2372\u2371\u0000'*>A" +
|
||||
"EIOUY`aeiouy~\u00b4\u2207\u2218\u22a4\u25cb\u0385\u2363\u2369\u00c4\u00cb\u00cf\u00d6\u00dc\u0178\u1fed\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u1fc1\u0385\u2362\u2364\u2361\u2365\u0000!\".;AEGIOUYaegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227" +
|
||||
"\u1e36\u1e37\u1e5a\u1e5b\u22a4\u0000LRlr\u1e38\u1e5c\u1e39\u1e5d\u0000AOUaou\u01de\u022a\u01d5\u01df\u022b\u01d6\u0000AOao\u01e0\u0230\u01e1\u0231\u0000Oo\u01ec\u01ed\u0100\u0112\u1e20\u012a\u014c\u016a\u0232\u0101\u0113\u1e21\u012b\u014d\u016b\u0233\u0000Oo\u022c\u022d\u01de\u01e2\u022c\u022a\u01d5\u01df\u01e3\u022d\u022b\u01d6\u01e0\u01e1" +
|
||||
"\u1e38\u1e39\u1e5c\u1e5d\u2351\u0000\"+,/ACEGIKLMNOPRSUWYZ^_abcegiklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0000IU" +
|
||||
"iu\u1e2e\u01d7\u1e2f\u01d8\u0000OUou\u1eda\u1ee8\u1edb\u1ee9\u0000Cc\u1e08\u1e09\u0000Oo\u01fe\u01ff\u00c1\u0106\u00c9\u01f4\u00cd\u1e30\u0139\u1e3e\u0143\u00d3\u1e54\u0154\u015a\u00da\u1e82\u00dd\u0179\u0000AEOaeo\u1ea4\u1ebe\u1ed0\u1ea5\u1ebf\u1ed1\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u00e1\u0000Aa\u1eae\u1eaf\u0107\u00e9" +
|
||||
"\u01f5\u00ed\u1e31\u013a\u1e3f\u0144\u00f3\u1e55\u0155\u015b\u00fa\u1e83\u00fd\u017a\u0000OUou\u1e4c\u1e78\u1e4d\u1e79\u0000EOeo\u1e16\u1e52\u1e17\u1e53\u0000Cc\u1e08\u1e09\u1ea4\u01fa\u01fc\u1e08\u1ebe\u1e2e\u1ed0\u1e4c\u01d7\u1ea5\u01fb\u01fd\u1e09\u1ebf\u1e2f\u1ed1\u1e4d\u01ff\u01d8\u0000CDEGHKLNRSTcdeg" +
|
||||
"hklnrst\u00c7\u1e10\u0228\u0122\u1e28\u0136\u013b\u0145\u0156\u015e\u0162\u00e7\u1e11\u0229\u0123\u1e29\u0137\u013c\u0146\u0157\u015f\u0163\u0000\u2395\u2339\u0000Gg\u011e\u011f\u0000\u05f2\ufb1f\u0000\ufb49\ufb2c\u0000\ufb49\ufb2d\u0000\u06c1\u06d2\u06d5\u06c2\u06d3\u06c0\u0000\u0915\u0916\u0917\u091c\u0921\u0922\u0928\u092b\u092f\u0930\u0933\u0958\u0959\u095a\u095b\u095c\u095d\u0929" +
|
||||
"\u095e\u095f\u0931\u0934\u0000\u09a1\u09a2\u09af\u09dc\u09dd\u09df\u0000\u09be\u09d7\u09cb\u09cc\u0000\u0a16\u0a17\u0a1c\u0a2b\u0a32\u0a38\u0a59\u0a5a\u0a5b\u0a5e\u0a33\u0a36\u0000\u0b21\u0b22\u0b5c\u0b5d\u0000\u0b3e\u0b56\u0b57\u0b4b\u0b48\u0b4c\u0000\u0bbe\u0bd7\u0bca\u0bcc\u0000\u0bbe\u0bcb\u0000\u0b92\u0b94\u0000\u0c56\u0c48\u0000\u0cd5\u0cc0\u0000\u0cc2\u0cd5\u0cd6\u0cca\u0cc7\u0cc8\u0000\u0cd5\u0ccb\u0000\u0d3e\u0d57\u0d4a" +
|
||||
"\u0d4c\u0000\u0d3e\u0d4b\u0000\u0dca\u0dcf\u0ddf\u0dda\u0ddc\u0dde\u0000\u0dca\u0ddd\u0000\u0f72\u0f74\u0f80\u0f73\u0f75\u0f81\u0000\u0fb5\u0fb9\u0000\u0fb7\u0f93\u0000\u0fb7\u0f9d\u0000\u0fb7\u0fa2\u0000\u0fb7\u0fa7\u0000\u0fb7\u0fac\u0000\u0f80\u0f76\u0000\u0f80\u0f78\u0000\u0f40\u0f69\u0000\u0f42\u0f4c\u0f51\u0f56\u0f5b\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0000\u1025\u1026\u0000\u1100\u1101\u0000\u1100\u1102\u1103\u1107\u1113\u1114" +
|
||||
"\u1115\u1116\u0000\u1100\u1103\u1117\u1104\u0000\u1102\u1105\u110b\u1112\u1118\u1119\u111b\u111a\u0000\u1107\u110b\u111c\u111d\u0000\u1100\u1102\u1103\u1107\u1109\u110a\u110b\u110c\u110e\u1110\u1111\u112b\u112d\u112f\u1132\u1136\u111e\u111f\u1120\u1108\u1121\u1125\u112b\u1127\u1128\u1129\u112a\u112c\u1122\u1123\u1124\u1126\u0000\u110b\u112c\u0000\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110a\u110b\u110c\u110e\u110f\u1110\u1111" +
|
||||
"\u1112\u111e\u112d\u112e\u112f\u1130\u1131\u1132\u110a\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u1133\u0000\u1109\u1134\u0000\u1100\u1103\u1106\u1107\u1109\u110b\u110c\u110e\u1110\u1111\u1140\u1141\u1142\u1143\u1144\u1145\u1147\u1148\u1149\u114a\u114b\u1146\u0000\u110b\u110c\u114d\u110d\u0000\u110f\u1112\u1152\u1153\u0000\u1107\u110b\u1156\u1157\u0000\u1112\u1158\u0000\u1100\u1103\u1107\u1109\u110c\u1122\u1123\u1124\u1125" +
|
||||
"\u1126\u0000\u1100\u1133\u0000\u113c\u113d\u0000\u113e\u113f\u0000\u114e\u114f\u0000\u1150\u1151\u0000\u1169\u116e\u1175\u1176\u1177\u1162\u0000\u1169\u116d\u1175\u1178\u1179\u1164\u0000\u1169\u116e\u1173\u1175\u117a\u117b\u117c\u1166\u0000\u1169\u116e\u1175\u117d\u117e\u1168\u0000\u1161\u1162\u1165\u1166\u1168\u1169\u116e\u1175\u116a\u116b\u117f\u1180\u1181\u1182\u1183\u116c\u0000\u1175\u116b\u0000\u1163\u1164\u1167\u1169\u1175" +
|
||||
"\u1184\u1185\u1186\u1187\u1188\u0000\u1161\u1162\u1165\u1166\u1168\u116e\u1175\u117c\u1189\u118a\u116f\u1170\u118c\u118d\u1171\u118b\u0000\u1173\u1175\u118b\u1170\u0000\u1161\u1165\u1166\u1167\u1168\u116e\u1175\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u0000\u116e\u1173\u1175\u1195\u1196\u1174\u0000\u116e\u1197\u0000\u1161\u1163\u1169\u116e\u1173\u119e\u1198\u1199\u119a\u119b\u119c\u119d\u0000\u1165\u116e\u1175\u119e\u119f\u11a0" +
|
||||
"\u11a1\u11a2\u0000\u11a8\u11af\u11ba\u11e7\u11a9\u11c3\u11aa\u11c4\u0000\u11a8\u11c4\u0000\u11a8\u11ae\u11ba\u11bd\u11c0\u11c2\u11eb\u11c5\u11c6\u11c7\u11ac\u11c9\u11ad\u11c8\u0000\u11a8\u11af\u11ca\u11cb\u0000\u11a8\u11aa\u11ab\u11ae\u11af\u11b7\u11b8\u11b9\u11ba\u11bb\u11bf\u11c0\u11c1\u11c2\u11da\u11dd\u11e5\u11e6\u11eb\u11f9\u11b0\u11cc\u11cd\u11ce\u11d0\u11b1\u11b2\u11d3\u11b3\u11d6\u11d8\u11b4\u11b5\u11b6\u11d1\u11d2\u11d4" +
|
||||
"\u11d5\u11d7\u11d9\u0000\u11ba\u11cc\u0000\u11a8\u11ba\u11d1\u11d2\u0000\u11ba\u11bc\u11c2\u11d3\u11d5\u11d4\u0000\u11ba\u11d6\u0000\u11a8\u11af\u11b8\u11ba\u11bb\u11bc\u11be\u11c2\u11eb\u11da\u11db\u11dc\u11dd\u11de\u11e2\u11e0\u11e1\u11df\u0000\u11af\u11ba\u11bc\u11c1\u11c2\u11e3\u11b9\u11e6\u11e4\u11e5\u0000\u11a8\u11ae\u11af\u11b8\u11ba\u11e7\u11e8\u11e9\u11ea\u11bb\u0000\u11a8\u11a9\u11bc\u11bf\u11ec\u11ed\u11ee\u11ef\u0000" +
|
||||
"\u11b8\u11bc\u11f3\u11f4\u0000\u11ab\u11af\u11b7\u11b8\u11f5\u11f6\u11f7\u11f8\u0000\u11c2\u11cf\u0000\u11ba\u11de\u0000\u11a8\u11ed\u0000\u11ba\u11eb\u11f1\u11f2\u0000|\u2395\u2345\u2347\u0000-\u2395\u234f\u2350\u0000|\u2395\u2346\u2348\u0000-\u2395\u2356\u2357\u0000/\u2204\u0000_|\u2395\u2359\u234b\u234d\u0000|~\u00a8\u2395\u2352\u236b\u2362\u2354\u0000/\u2209\u0000_\u2377" +
|
||||
"\u0000/\u220c\u0000_\u00a8\u2229\u22a4\u22a5\u2395\u25cb\u235b\u2364\u235d\u2355\u234e\u233b\u233e\u0000/\u2224\u0000/\u2226\u0000~\u2228\u2395\u2372\u22c4\u2353\u0000~\u2227\u2395\u2371\u22c4\u234c\u0000\u2218\u235d\u0000|\u2366\u0000/\u2241\u0000/\u2244\u0000/\u2249\u0000/\u226d\u0000_\u2395\u2262\u236f\u0000/\u2274\u0000/\u2275\u0000/\u2278\u0000/" +
|
||||
"\u2279\u0000/\u2280\u0000/\u2281\u0000/\u22e0\u0000/\u22e1\u0000_|\u2286\u2367\u0000_\u2287\u0000/\u2288\u0000/\u2289\u0000/\u22e2\u0000/\u22e3\u0000\u00a8\u00af\u2218\u22a5\u2361\u2351\u2355\u2336\u0000_\u2218\u22a4\u234a\u234e\u2336\u0000/\u22ad\u0000/\u22ae\u0000/\u22af\u0000/\u22ea\u0000/\u22eb\u0000/\u22ec\u0000/\u22ed\u0000_" +
|
||||
"\u2395\u235a\u233a\u0000_\u2378\u0000_\u2379\u0000_\u2376\u0000'/:<=>?\\\u00f7\u2190\u2191\u2192\u2193\u2206\u2207\u2218\u2227\u2228\u2260\u22c4\u25cb\u235e\u2341\u2360\u2343\u2338\u2344\u2370\u2342\u2339\u2347\u2350\u2348\u2357\u234d\u2354\u233b\u2353\u234c\u236f\u233a\u233c\u0000*-.\\_|\u00a8\u2218\u2395\u235f\u2296\u2299\u2349\u235c\u233d\u2365" +
|
||||
"\u233e\u233c\u0000/\u2adc").toCharArray();
|
||||
|
||||
public static final char[] edges =
|
||||
("\u0001\u0018\u0019\u001a\u001b\u001c\u001d\u0020\u0021\"\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002c\u002f\u0032\u0035\u0038\u003b\u003e\u0041\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u000c\u0050\u0051\u0052" +
|
||||
"\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0011\u006c\u006d\u006f\u0070\u0071\u0072\u0073\u0075\u0076\u0077\u0078\u007a\u007b\u007c\u007d\u007e\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u000c\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u000f\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000c\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0011\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e9" +
|
||||
"\u00ec\u00ef\u00f2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0014\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\r\u0129\u012a\u012b" +
|
||||
"\u012c\u012d\u012e\u012f\u0130\u0131\u0132\u0133\u0134\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u013e\u013f\u0142\u0145\u0148\u014b\u014c\u014d\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0003\u0000\u0000\u0007\u0157\u0158\u0159\u015a\u015b\u015c\u0001\u0001\u0001\u0001\u0001\u0001\r\u016a\u016b\u016c\u016d\u016e\u016f\u0170\u0171\u0172\u0173" +
|
||||
"\u0174\u0175\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\r\u0183\u0184\u0185\u0186\u0187\u0188\u0189\u018a\u018b\u018c\u018d\u018e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0196\u0197\u0198\u0199\u019a\u019b\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u01a5\u01a6\u01a7\u01a8\u01a9\u01aa\u01ab\u01ac\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\r\u01ba\u01bb" +
|
||||
"\u01bc\u01bd\u01be\u01bf\u01c0\u01c1\u01c2\u01c3\u01c4\u01c5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u01c9\u01ca\u0001\u0001\r\u01d8\u01d9\u01da\u01db\u01dc\u01de\u01e0\u01e1\u01e3\u01e4\u01e6\u01e8\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u0000\u0002\u0000\u0001\u0021\u020a\u020b\u020c\u020d\u020e\u020f\u0210\u0211\u0212\u0213\u0214\u0215\u0216\u0217" +
|
||||
"\u0218\u0219\u021a\u021b\u021c\u021d\u021e\u021f\u0220\u0221\u0222\u0223\u0224\u0225\u0226\u0227\u0228\u0229\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0029\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267" +
|
||||
"\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000c\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0299\u029a\u029b\u029c\u029d\u029e\u0001\u0001\u0001\u0001\u0001\u0001\u0108\u03a7\u03b8\u041d\u04aa\u04b9\u04bc\u0659\u0a12\u0a33\u0a48\u0a55\u0a9c\u0ae9\u0b6c\u0bbb\u0bc2\u0bd9\u0be0\u0be9\u0bec\u0bf1\u0bf4\u0bf7\u0c02\u0c23\u0c5e\u0c9f\u0cc8\u0d1f\u0d42\u0d47\u0d5e\u0d69\u0d88\u0d97\u0da6\u0da9\u0dc8\u0dd1\u0dd6\u0def\u0df2\u0e05\u0e2e\u0e39\u0e3c\u0e4b\u0e60" +
|
||||
"\u0e73\u0eda\u0ee3\u0ee8\u0eeb\u0ef8\u0f01\u0f04\u0f13\u0f16\u0ff9\u10e4\u1215\u1236\u1283\u12de\u12ed\u130c\u131c\u1329\u132c\u1349\u1352\u1357\u1366\u136d\u1378\u13ab\u13b8\u13c1\u13d6\u13e7\u141c\u1461\u1464\u1469\u1476\u147d\u1480\u14a3\u1542\u156f\u1610\u17a7\u17d4\u17d7\u17dc\u17df\u17e2\u17e5\u17ea\u17ed\u17f2\u17f5\u17f8\u17fb\u17fe\u18b9\u18bc\u18c1\u18c4\u18c7\u18ca\u18cf\u18d2\u18d5\u18d8\u18dc\u18e3\u18e7\u18eb\u192e" +
|
||||
"\u1938\u1944\u1950\u1953\u1960\u1963\u197a\u1981\u1986\u1993\u1998\u199f\u19a4\u19a7\u19aa\u19ad\u19b0\u19b7\u19ba\u19bf\u19c2\u19c9\u19cc\u19d3\u19d6\u19d9\u19dc\u19df\u19e2\u19e5\u19e8\u19eb\u19ee\u19f9\u19fc\u19ff\u1a08\u1a0d\u1a16\u1a1b\u1a3c\u1a3f\u1a60\u1a63\u1a7a\u1a7f\u1a84\u1a89\u1a8c\u1a97\u1a9a\u1a9d\u1aa0\u1aa3\u1aa6\u1aad\u1ab4\u1abd\u1ac4\u1ad5\u1ad8\u1ae3\u1af4\u1af9\u1b08\u1b0f\u1b12\u1b1f\u1b28\u1b31\u1b34\u1b43" +
|
||||
"\u1b48\u1b71\u1b74\u1b79\u1b80\u1b83\u1b96\u1ba1\u1bac\u1bb5\u1bba\u1bc3\u1bc6\u1bc9\u1bcc\u1bd1\u1bd6\u1bdb\u1be0\u1be5\u1be8\u1bef\u1bf8\u1bfb\u1bfe\u1c01\u1c10\u1c13\u1c16\u1c1d\u1c24\u1c27\u1c2a\u1c2d\u1c30\u1c33\u1c36\u1c3b\u1c3e\u1c41\u1c44\u1c47\u1c4a\u1c4d\u1c50\u1c53\u1c56\u1c59\u1c5c\u1c63\u1c68\u1c6b\u1c6e\u1c71\u1c74\u1c77\u1c80\u1c87\u1c8a\u1c8d\u1c90\u1c93\u1c96\u1c99\u1c9c\u1ca1\u1ca4\u1ca7\u1caa\u1cd5\u1ce8\u0009" +
|
||||
"\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u03e7\u03e8\u03f1\u03f2\u03f3\u03f4\u03f5\u03f6\u03f7\u03f8\u03f9\u03fa\u03fb\u03fc\u03fd\u03fe\u03ff\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u0001\u0005\u03ed\u03ee\u03ef\u03f0\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0041\u045e\u045f\u0460\u0461\u0462\u0463\u0464\u0465\u0466\u0467\u0468\u0469\u046a\u046b\u046c\u046d\u0472\u0473\u0474\u0475\u0476\u0477\u0478\u0479\u047a\u047b" +
|
||||
"\u047c\u0481\u0486\u0487\u0488\u0489\u048a\u048b\u048c\u048d\u048e\u048f\u0490\u0491\u0492\u0493\u0494\u0495\u0496\u0497\u0498\u0499\u049a\u049b\u049c\u049d\u049e\u049f\u04a0\u04a1\u04a2\u04a3\u04a4\u04a5\u04a6\u04a7\u04a8\u04a9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0470\u0471\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u047f\u0480\u0001" +
|
||||
"\u0001\u0003\u0484\u0485\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u04b2\u04b3\u04b4\u04b5\u04b6\u04b7\u04b8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u04bb\u0001\u007b\u0537\u0546\u0547\u0564\u057f\u0588\u0589\u058e\u058f\u0590\u0591" +
|
||||
"\u0592\u0593\u0594\u0595\u0598\u0599\u059a\u059b\u059c\u059d\u059e\u059f\u05a0\u05a1\u05a2\u05a3\u05a4\u05b1\u05ba\u05bb\u05c0\u05c1\u05c2\u05c3\u05c4\u05c7\u05c8\u05c9\u05ca\u05cb\u05cc\u05cd\u05ce\u05cf\u05d0\u05d1\u05d2\u05d3\u05dc\u05e5\u05ea\u05eb\u05ec\u05ed\u05ee\u05ef\u05f0\u05f1\u05f2\u05f3\u05f4\u05f5\u05f6\u05f7\u05f8\u05f9\u05fa\u05fb\u05fc\u05fd\u05fe\u05ff\u0600\u0601\u0602\u0603\u0604\u0605\u0606\u0607\u0608\u0609" +
|
||||
"\u060a\u060b\u060c\u060d\u060e\u060f\u0610\u0611\u0612\u0613\u0614\u0615\u0616\u0617\u0618\u061b\u061c\u061f\u0622\u0623\u0626\u0629\u062c\u062f\u0632\u0635\u0638\u063b\u063c\u063f\u0642\u0643\u0646\u0649\u064c\u064f\u0652\u0655\u0658\u0008\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000f\u0556\u0557\u0558\u0559\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0561\u0562\u0563\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0584\u0585\u0586\u0587\u0001\u0001\u0001\u0001\u0001\u0003\u058c\u058d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0007\u05ab\u05ac\u05ad\u05ae\u05af\u05b0\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u05b6\u05b7\u05b8\u05b9\u0001\u0001\u0001\u0001\u0001\u0003\u05be\u05bf\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u05d8\u05d9\u05da\u05db\u0001\u0001\u0001\u0001\u0005\u05e1\u05e2\u05e3\u05e4\u0001\u0001\u0001\u0001\u0003\u05e8\u05e9" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003" +
|
||||
"\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u00c1\u071a\u071b\u071c\u0721\u0722\u0725\u0750\u077b\u07a6\u07d1\u07d8\u07db\u07de\u07e1\u07e4\u07e7\u07ea\u07ed\u07f0\u07f3\u07f6\u07f9\u07fc\u07ff\u0802\u0805\u0808\u080b\u080e\u0811" +
|
||||
"\u0814\u0817\u081a\u081d\u0820\u0823\u0826\u0829\u082c\u082f\u0832\u0835\u0838\u083b\u083e\u0841\u0844\u0847\u084a\u084d\u0850\u0853\u0856\u0859\u085c\u085f\u0862\u0865\u0868\u086b\u086e\u0871\u0874\u0877\u087a\u087d\u0880\u0881\u0882\u0883\u0884\u0885\u0886\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0890\u0897\u089e\u08a5\u08ac\u08b3\u08ba\u08c1\u08c8\u08cf\u08d6\u08dd\u08e4\u08eb\u08f2\u08f5\u08f8\u08fb\u08fe\u0901" +
|
||||
"\u0904\u0907\u090a\u090d\u0910\u0913\u0916\u0919\u091c\u091f\u0922\u0925\u0928\u092b\u092e\u0931\u0934\u0937\u093a\u093d\u0940\u0943\u0946\u0949\u094c\u094f\u0952\u0955\u0958\u095b\u095e\u0961\u0964\u0967\u096a\u096d\u0970\u0973\u0976\u0979\u097c\u097f\u0982\u0985\u0988\u098b\u098e\u0991\u0994\u0997\u099a\u099d\u09a0\u09a3\u09a6\u09a9\u09ac\u09af\u09b2\u09b5\u09b8\u09bb\u09be\u09c1\u09c4\u09c7\u09ca\u09cd\u09d0\u09d3\u09d6\u09d9" +
|
||||
"\u09dc\u09df\u09e2\u09e5\u09e8\u09eb\u09ee\u09f1\u09f4\u09f7\u09fa\u09fd\u0a00\u0a03\u0a06\u0a09\u0a0c\u0a0f\u0001\u0001\u0002\u071e\u0003\u0000\u0000\u0001\u0002\u0724\u0001\u000c\u0731\u0732\u0735\u0738\u073b\u073e\u0741\u0744\u0747\u074a\u074d\u0001\u0002\u0734\u0001\u0002\u0737\u0001\u0002\u073a\u0001\u0002\u073d\u0001\u0002\u0740\u0001\u0002\u0743\u0001\u0002\u0746\u0001\u0002\u0749\u0001\u0002\u074c\u0001\u0002\u074f\u0001" +
|
||||
"\u000c\u075c\u075d\u0760\u0763\u0766\u0769\u076c\u076f\u0772\u0775\u0778\u0001\u0002\u075f\u0001\u0002\u0762\u0001\u0002\u0765\u0001\u0002\u0768\u0001\u0002\u076b\u0001\u0002\u076e\u0001\u0002\u0771\u0001\u0002\u0774\u0001\u0002\u0777\u0001\u0002\u077a\u0001\u000c\u0787\u0788\u078b\u078e\u0791\u0794\u0797\u079a\u079d\u07a0\u07a3\u0001\u0002\u078a\u0001\u0002\u078d\u0001\u0002\u0790\u0001\u0002\u0793\u0001\u0002\u0796\u0001\u0002" +
|
||||
"\u0799\u0001\u0002\u079c\u0001\u0002\u079f\u0001\u0002\u07a2\u0001\u0002\u07a5\u0001\u000c\u07b2\u07b3\u07b6\u07b9\u07bc\u07bf\u07c2\u07c5\u07c8\u07cb\u07ce\u0001\u0002\u07b5\u0001\u0002\u07b8\u0001\u0002\u07bb\u0001\u0002\u07be\u0001\u0002\u07c1\u0001\u0002\u07c4\u0001\u0002\u07c7\u0001\u0002\u07ca\u0001\u0002\u07cd\u0001\u0002\u07d0\u0001\u0003\u07d4\u07d5\u0001\u0002\u07d7\u0001\u0002\u07da\u0001\u0002\u07dd\u0001\u0002\u07e0" +
|
||||
"\u0001\u0002\u07e3\u0001\u0002\u07e6\u0001\u0002\u07e9\u0001\u0002\u07ec\u0001\u0002\u07ef\u0001\u0002\u07f2\u0001\u0002\u07f5\u0001\u0002\u07f8\u0001\u0002\u07fb\u0001\u0002\u07fe\u0001\u0002\u0801\u0001\u0002\u0804\u0001\u0002\u0807\u0001\u0002\u080a\u0001\u0002\u080d\u0001\u0002\u0810\u0001\u0002\u0813\u0001\u0002\u0816\u0001\u0002\u0819\u0001\u0002\u081c\u0001\u0002\u081f\u0001\u0002\u0822\u0001\u0002\u0825\u0001\u0002\u0828" +
|
||||
"\u0001\u0002\u082b\u0001\u0002\u082e\u0001\u0002\u0831\u0001\u0002\u0834\u0001\u0002\u0837\u0001\u0002\u083a\u0001\u0002\u083d\u0001\u0002\u0840\u0001\u0002\u0843\u0001\u0002\u0846\u0001\u0002\u0849\u0001\u0002\u084c\u0001\u0002\u084f\u0001\u0002\u0852\u0001\u0002\u0855\u0001\u0002\u0858\u0001\u0002\u085b\u0001\u0002\u085e\u0001\u0002\u0861\u0001\u0002\u0864\u0001\u0002\u0867\u0001\u0002\u086a\u0001\u0002\u086d\u0001\u0002\u0870" +
|
||||
"\u0001\u0002\u0873\u0001\u0002\u0876\u0001\u0002\u0879\u0001\u0002\u087c\u0001\u0002\u087f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0893\u0894\u0001\u0002\u0896\u0001\u0003\u089a\u089b\u0001\u0002\u089d\u0001\u0003\u08a1\u08a2\u0001\u0002\u08a4\u0001\u0003\u08a8\u08a9\u0001\u0002\u08ab\u0001\u0003\u08af\u08b0\u0001\u0002\u08b2\u0001\u0003\u08b6\u08b7\u0001\u0002" +
|
||||
"\u08b9\u0001\u0003\u08bd\u08be\u0001\u0002\u08c0\u0001\u0003\u08c4\u08c5\u0001\u0002\u08c7\u0001\u0003\u08cb\u08cc\u0001\u0002\u08ce\u0001\u0003\u08d2\u08d3\u0001\u0002\u08d5\u0001\u0003\u08d9\u08da\u0001\u0002\u08dc\u0001\u0003\u08e0\u08e1\u0001\u0002\u08e3\u0001\u0003\u08e7\u08e8\u0001\u0002\u08ea\u0001\u0003\u08ee\u08ef\u0001\u0002\u08f1\u0001\u0002\u08f4\u0001\u0002\u08f7\u0001\u0002\u08fa\u0001\u0002\u08fd\u0001\u0002\u0900" +
|
||||
"\u0001\u0002\u0903\u0001\u0002\u0906\u0001\u0002\u0909\u0001\u0002\u090c\u0001\u0002\u090f\u0001\u0002\u0912\u0001\u0002\u0915\u0001\u0002\u0918\u0001\u0002\u091b\u0001\u0002\u091e\u0001\u0002\u0921\u0001\u0002\u0924\u0001\u0002\u0927\u0001\u0002\u092a\u0001\u0002\u092d\u0001\u0002\u0930\u0001\u0002\u0933\u0001\u0002\u0936\u0001\u0002\u0939\u0001\u0002\u093c\u0001\u0002\u093f\u0001\u0002\u0942\u0001\u0002\u0945\u0001\u0002\u0948" +
|
||||
"\u0001\u0002\u094b\u0001\u0002\u094e\u0001\u0002\u0951\u0001\u0002\u0954\u0001\u0002\u0957\u0001\u0002\u095a\u0001\u0002\u095d\u0001\u0002\u0960\u0001\u0002\u0963\u0001\u0002\u0966\u0001\u0002\u0969\u0001\u0002\u096c\u0001\u0002\u096f\u0001\u0002\u0972\u0001\u0002\u0975\u0001\u0002\u0978\u0001\u0002\u097b\u0001\u0002\u097e\u0001\u0002\u0981\u0001\u0002\u0984\u0001\u0002\u0987\u0001\u0002\u098a\u0001\u0002\u098d\u0001\u0002\u0990" +
|
||||
"\u0001\u0002\u0993\u0001\u0002\u0996\u0001\u0002\u0999\u0001\u0002\u099c\u0001\u0002\u099f\u0001\u0002\u09a2\u0001\u0002\u09a5\u0001\u0002\u09a8\u0001\u0002\u09ab\u0001\u0002\u09ae\u0001\u0002\u09b1\u0001\u0002\u09b4\u0001\u0002\u09b7\u0001\u0002\u09ba\u0001\u0002\u09bd\u0001\u0002\u09c0\u0001\u0002\u09c3\u0001\u0002\u09c6\u0001\u0002\u09c9\u0001\u0002\u09cc\u0001\u0002\u09cf\u0001\u0002\u09d2\u0001\u0002\u09d5\u0001\u0002\u09d8" +
|
||||
"\u0001\u0002\u09db\u0001\u0002\u09de\u0001\u0002\u09e1\u0001\u0002\u09e4\u0001\u0002\u09e7\u0001\u0002\u09ea\u0001\u0002\u09ed\u0001\u0002\u09f0\u0001\u0002\u09f3\u0001\u0002\u09f6\u0001\u0002\u09f9\u0001\u0002\u09fc\u0001\u0002\u09ff\u0001\u0002\u0a02\u0001\u0002\u0a05\u0001\u0002\u0a08\u0001\u0002\u0a0b\u0001\u0002\u0a0e\u0001\u0002\u0a11\u0001\u0011\u0a23\u0a24\u0a25\u0a26\u0a27\u0a28\u0a29\u0a2a\u0a2b\u0a2c\u0a2d\u0a2e\u0a2f" +
|
||||
"\u0a30\u0a31\u0a32\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u0a3c\u0a41\u0a42\u0a43\u0a44\u0a45\u0a46\u0a47\u0003\u0a3f\u0a40\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0a4f\u0a50\u0a51\u0a52\u0a53\u0a54\u0001\u0001\u0001\u0001\u0001\u0001\u0024\u0a79\u0a7a\u0a7b\u0a7c\u0a7d\u0a7e\u0a7f\u0a80\u0a81\u0a82\u0a83\u0a84\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a" +
|
||||
"\u0a8b\u0a8c\u0a8d\u0a8e\u0a8f\u0a90\u0a91\u0a92\u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\u0a9b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u0abc\u0abd\u0abe\u0abf\u0ac0\u0ac1\u0ac8\u0ad1\u0ad2\u0ad3\u0ad4\u0ad5\u0ad6\u0ad7\u0ad8\u0ad9\u0ada\u0adb\u0adc" +
|
||||
"\u0add\u0ade\u0adf\u0ae0\u0ae1\u0ae2\u0ae3\u0ae4\u0ae5\u0ae6\u0ae7\u0ae8\u0001\u0001\u0001\u0001\u0001\u0004\u0ac5\u0ac6\u0ac7\u0001\u0001\u0001\u0003\u0acb\u0ace\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u003c\u0b25\u0b26\u0b2b\u0b30\u0b31\u0b32\u0b33\u0b34\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3a" +
|
||||
"\u0b3b\u0b3c\u0b3d\u0b3e\u0b3f\u0b40\u0b41\u0b42\u0b43\u0b44\u0b45\u0b46\u0b47\u0b48\u0b49\u0b4a\u0b4b\u0b4c\u0b4d\u0b4e\u0b4f\u0b50\u0b51\u0b52\u0b53\u0b54\u0b55\u0b56\u0b57\u0b58\u0b59\u0b5a\u0b5b\u0b5c\u0b5d\u0b5e\u0b5f\u0b64\u0b65\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0001\u0003\u0b29\u0b2a\u0001\u0001\u0003\u0b2e\u0b2f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0b62\u0b63\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0028\u0b94\u0b95\u0b96\u0b97\u0b98\u0b99\u0b9a\u0b9b\u0b9c\u0b9d\u0b9e\u0b9f\u0ba0\u0ba1\u0ba2\u0ba3\u0ba4\u0ba5\u0ba6\u0ba7\u0ba8\u0ba9\u0baa\u0bab\u0bac\u0bad\u0bae" +
|
||||
"\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0bba\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0bbf\u0bc0\u0bc1\u0001\u0001\u0001\u000b\u0bcd\u0bd0\u0bd1\u0bd2\u0bd3\u0bd4\u0bd5\u0bd6\u0bd7\u0bd8\u0002\u0bcf\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0bdd\u0bde\u0bdf\u0001\u0001\u0001\u0005\u0be5\u0be6\u0be7\u0be8\u0001\u0001\u0001\u0001\u0002\u0beb\u0001\u0003\u0bef\u0bf0\u0001\u0001\u0002\u0bf3\u0001\u0002\u0bf6\u0001\u0006\u0bfd\u0bfe\u0bff\u0c00\u0c01\u0001\u0001\u0001\u0001\u0001\u0011\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001e\u0c41\u0c42\u0c43\u0c44\u0c45\u0c46\u0c47\u0c48\u0c49\u0c4a\u0c4b\u0c4c\u0c4d\u0c4e\u0c4f\u0c50\u0c51\u0c52\u0c53\u0c54\u0c55\u0c56\u0c57\u0c58\u0c59\u0c5a\u0c5b\u0c5c\u0c5d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0021\u0c7f" +
|
||||
"\u0c80\u0c81\u0c82\u0c83\u0c84\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8d\u0c8e\u0c8f\u0c90\u0c91\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0015\u0cb4\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cba\u0cbb" +
|
||||
"\u0cbc\u0cbd\u0cbe\u0cbf\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0cc5\u0cc6\u0cc7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u0ce8\u0ce9\u0cf2\u0cf3\u0cf4\u0cf5\u0cf6\u0cf7\u0cf8\u0cf9\u0cfa\u0d07\u0d08\u0d0d\u0d0e\u0d0f\u0d10\u0d11\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0001\u0005\u0cee\u0cef\u0cf0\u0cf1\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0d01\u0d02\u0d03\u0d04\u0d05\u0d06\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0d0b\u0d0c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0012\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d3a\u0d3b\u0d3c\u0d3d\u0d3e\u0d3f\u0d40\u0d41\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0d45\u0d46\u0001\u0001\u000c\u0d53\u0d54\u0d55\u0d56\u0d57\u0d58\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u0d64\u0d65\u0d66\u0d67\u0d68\u0001\u0001\u0001\u0001\u0001\u0010\u0d79\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d80\u0d81\u0d82\u0d83\u0d84\u0d85\u0d86\u0d87\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u0d8e\u0d8f\u0d92\u0d94\u0d96\u0001\u0003\u0000\u0000\u0002\u0000\u0002\u0000\u0001\u0008\u0d9f\u0da0\u0da1\u0da2\u0da3\u0da4\u0da5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0da8\u0001\u0010\u0db9\u0dba\u0dbb\u0dbc\u0dbd\u0dbe\u0dbf\u0dc0\u0dc1\u0dc2\u0dc3\u0dc4\u0dc5\u0dc6\u0dc7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0003\u0dcb\u0dce\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0dd4\u0dd5\u0001\u0001\n\u0de0\u0de1\u0de2\u0de3\u0de4\u0de5\u0de6\u0ded\u0dee\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0de8\u0002\u0dea\u0003\u0000\u0000\u0001\u0001\u0002\u0df1\u0001\n\u0dfc\u0dfd\u0dfe\u0dff\u0e00\u0e01\u0e02\u0e03\u0e04\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0015\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23" +
|
||||
"\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u0e34\u0e35\u0e36\u0e37\u0e38\u0001\u0001\u0001\u0001\u0001\u0002\u0e3b\u0001\u0008\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\u0e5c\u0e5d\u0e5e\u0e5f\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u0e6a\u0e6b\u0e6c\u0e6d\u0e6e\u0e6f\u0e70\u0e71\u0e72\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002d\u0ea0\u0ea7\u0eac\u0ead\u0eae\u0eaf\u0eb0\u0eb1\u0eb2\u0eb3\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0eba\u0ebb\u0ebc\u0ebd\u0ebe\u0ebf\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0ec5\u0eca\u0ecb\u0ecc\u0ecd\u0ece\u0ecf\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9" +
|
||||
"\u0002\u0ea2\u0003\u0ea5\u0ea6\u0001\u0001\u0003\u0eaa\u0eab\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0ec8\u0ec9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0edf\u0ee0\u0ee1\u0ee2\u0001\u0001\u0001\u0001\u0003\u0ee6\u0ee7\u0001\u0001" +
|
||||
"\u0002\u0eea\u0001\u0007\u0ef2\u0ef3\u0ef4\u0ef5\u0ef6\u0ef7\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0efd\u0efe\u0eff\u0f00\u0001\u0001\u0001\u0001\u0002\u0f03\u0001\u0006\u0f0a\u0f0b\u0f0c\u0f11\u0f12\u0001\u0001\u0002\u0f0e\u0003\u0000\u0000\u0001\u0001\u0002\u0f15\u0001\u004e\u0f64\u0f71\u0f72\u0f73\u0f74\u0f75\u0f76\u0f77\u0f78\u0f79\u0f7a\u0f7b\u0f7c\u0f7d\u0f7e\u0f7f\u0f80\u0f81\u0f82\u0f83\u0f84\u0f85\u0f86\u0f87\u0f88" +
|
||||
"\u0f89\u0f8a\u0f8b\u0f8c\u0f8d\u0f8e\u0f8f\u0fb4\u0fb5\u0fb6\u0fb7\u0fb8\u0fb9\u0fba\u0fbb\u0fbc\u0fbd\u0fbe\u0fbf\u0fc0\u0fc1\u0fc2\u0fc5\u0fc8\u0fcb\u0fce\u0fd1\u0fd4\u0fd7\u0fda\u0fdd\u0fe0\u0fe3\u0fe6\u0fe7\u0fe8\u0fe9\u0fea\u0feb\u0fec\u0fed\u0fee\u0fef\u0ff0\u0ff1\u0ff2\u0ff3\u0ff4\u0ff5\u0ff6\u0ff7\u0ff8\u0007\u0f6b\u0f6c\u0f6d\u0f6e\u0f6f\u0f70\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0013\u0fa2\u0fa3\u0fa4\u0fa5\u0fa6\u0fa7\u0fa8\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u0fb1\u0fb2\u0fb3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0058\u1051\u1052\u105b\u1068\u1069\u106a\u106b\u106c\u106d\u107e\u107f\u1080\u1081\u1082" +
|
||||
"\u1083\u1084\u1085\u1086\u1087\u1088\u108d\u108e\u108f\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u109a\u109b\u109c\u109d\u109e\u109f\u10a0\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10ba\u10bd\u10be\u10c1\u10c4\u10c5\u10c8\u10cb\u10cc\u10cf\u10d2\u10d3\u10d4\u10d5\u10d6\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2" +
|
||||
"\u10e3\u0001\u0005\u1057\u1058\u1059\u105a\u0001\u0001\u0001\u0001\u0007\u1062\u1063\u1064\u1065\u1066\u1067\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1074\u1075\u1078\u1079\u107a\u107d\u0001\u0003\u0000\u0000\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u108b\u108c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u10a3\u10a4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0046\u112a\u1133\u1150\u116b\u1174\u1175\u1176\u1177\u1178\u1179\u117a\u117b\u117c\u1189\u1192\u11c3\u11c4\u11c9\u11ca\u11cb\u11cc\u11cd\u11ce\u11cf\u11d0\u11d9\u11da\u11db\u11dc\u11dd\u11de\u11df\u11e0\u11e1\u11e2\u11e3\u11e4\u11e5\u11e6\u11e7\u11e8\u11e9\u11ea\u11eb\u11ec\u11ed\u11ee\u11ef\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u11fc\u11fd\u11fe\u1201\u1204\u1207\u120a\u120b\u120c" +
|
||||
"\u120f\u1212\u0005\u112f\u1130\u1131\u1132\u0001\u0001\u0001\u0001\u000f\u1142\u1143\u1144\u1145\u1146\u1147\u1148\u1149\u114a\u114b\u114c\u114d\u114e\u114f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u115e\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u1169\u116a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1170\u1171\u1172\u1173" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1183\u1184\u1185\u1186\u1187\u1188\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u118e\u118f\u1190\u1191\u0001\u0001\u0001\u0001\r\u119f\u11a2\u11a5\u11a8\u11ab\u11ae\u11b1\u11b4\u11b7\u11ba\u11bd\u11c0\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003" +
|
||||
"\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u11c7\u11c8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u11d5\u11d6\u11d7\u11d8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0003\u0000" +
|
||||
"\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0011\u1226\u1227\u1228\u1229\u122a\u122b\u122c\u122d\u122e\u122f\u1230\u1231\u1232\u1233\u1234\u1235\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0021\u1257\u125c\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1268\u1269\u126a\u126b\u126c\u126d\u126e\u1273" +
|
||||
"\u1274\u1275\u1276\u1277\u1278\u1279\u127a\u127b\u127c\u127d\u127e\u127f\u1280\u1281\u1282\u0003\u125a\u125b\u0001\u0001\u0003\u125f\u1260\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1271\u1272\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002c\u12af\u12b4\u12b5\u12b6\u12b7\u12b8\u12b9\u12ba\u12bb\u12bc\u12bd\u12be" +
|
||||
"\u12bf\u12c0\u12c1\u12c2\u12c3\u12c4\u12c5\u12c6\u12c7\u12c8\u12c9\u12ca\u12cb\u12cc\u12cd\u12ce\u12cf\u12d0\u12d1\u12d2\u12d3\u12d4\u12d5\u12d6\u12d7\u12d8\u12d9\u12da\u12db\u12dc\u12dd\u0003\u12b2\u12b3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u12e6\u12e7\u12e8\u12e9\u12ea\u12eb\u12ec\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0010\u12fd\u12fe\u12ff\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130a\u130b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1313\u1314\u1315\u1317\u1319\u131b\u0001\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0001\u0007\u1323\u1324\u1325" +
|
||||
"\u1326\u1327\u1328\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u132b\u0001\u000f\u133b\u133c\u133d\u133e\u133f\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u134c\u134f\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u1355\u1356\u0001\u0001\u0008\u135f\u1360\u1361\u1362\u1363\u1364\u1365\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u136a" +
|
||||
"\u136b\u136c\u0001\u0001\u0001\u0006\u1373\u1374\u1375\u1376\u1377\u0001\u0001\u0001\u0001\u0001\u001a\u1392\u1393\u1394\u1395\u1396\u1397\u1398\u1399\u139a\u139b\u139c\u139d\u139e\u139f\u13a0\u13a1\u13a2\u13a3\u13a4\u13a5\u13a6\u13a7\u13a8\u13a9\u13aa\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u13b0\u13b1\u13b2\u13b3" +
|
||||
"\u0001\u0001\u0001\u0002\u13b5\u0003\u0000\u0000\u0005\u13bd\u13be\u13bf\u13c0\u0001\u0001\u0001\u0001\u000b\u13cc\u13cd\u13ce\u13cf\u13d0\u13d1\u13d2\u13d3\u13d4\u13d5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u13df\u13e0\u13e1\u13e2\u13e3\u13e4\u13e5\u13e6\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001b\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140a\u140b\u140c\u140d\u140e\u140f\u1410\u1411" +
|
||||
"\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141a\u141b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0023\u143f\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144a\u144b\u144c\u144d\u144e\u144f\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145a\u145b\u145c\u145d\u145e\u145f\u1460\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1463\u0001\u0003\u1467\u1468\u0001\u0001\u0007\u1470\u1471\u1472\u1473\u1474\u1475\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u147a\u147b\u147c\u0001\u0001\u0001\u0002\u147f\u0001\u0012\u1492\u1493\u1494\u1495\u1496\u1497\u1498" +
|
||||
"\u1499\u149a\u149b\u149c\u149d\u149e\u149f\u14a0\u14a1\u14a2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u14d2\u14d7\u14ec\u14ff\u1508\u1509\u150a\u150b\u150c\u150d\u150e\u150f\u1510\u1511\u151e\u151f\u1524\u1525\u1526\u1527\u1528\u1529\u152a\u152b\u152c\u152d\u152e\u152f\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153a\u153b\u153c\u153d\u153e\u153f" +
|
||||
"\u1540\u1541\u0003\u14d5\u14d6\u0001\u0001\u000b\u14e2\u14e3\u14e4\u14e5\u14e6\u14e7\u14e8\u14e9\u14ea\u14eb\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u14f6\u14f7\u14f8\u14f9\u14fa\u14fb\u14fc\u14fd\u14fe\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1504\u1505\u1506\u1507\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1518\u1519\u151a\u151b\u151c\u151d" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1522\u1523\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u1559\u155a\u155b\u155c\u155d\u155e\u155f\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156a\u156b\u156c\u156d\u156e\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0037\u15a6\u15af\u15bc\u15c5\u15ca\u15cb\u15cc\u15cd\u15ce\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u15d5\u15d6\u15d7\u15d8\u15dd\u15de\u15df\u15e0\u15e1\u15e2\u15e3\u15e4\u15e5\u15e6\u15e7\u15e8\u15e9\u15ea\u15eb\u15ec\u15ed\u15ee\u15ef\u15f2\u15f5\u15f6\u15f9\u15fc\u15fd\u1600\u1603\u1604\u1607\u160a\u160b\u160c\u160d\u160e\u160f\u0005\u15ab" +
|
||||
"\u15ac\u15ad\u15ae\u0001\u0001\u0001\u0001\u0007\u15b6\u15b7\u15b8\u15b9\u15ba\u15bb\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u15c1\u15c2\u15c3\u15c4\u0001\u0001\u0001\u0001\u0003\u15c8\u15c9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u15db\u15dc\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003" +
|
||||
"\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0077\u1687\u1694\u16b1\u16cc\u16d5\u16da\u16df\u16e0\u16e1\u16e2\u16e3\u16e4\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u16ed\u16ee\u16ef\u16f0\u16f1\u16f2\u16f3\u1700\u1709\u170a\u170f\u1710\u1711\u1712\u1713\u1716\u1717\u1718\u1719\u171a\u171b" +
|
||||
"\u171c\u171d\u171e\u171f\u1720\u1721\u1722\u172b\u1734\u1739\u173a\u173b\u173c\u173d\u173e\u173f\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174a\u174b\u174c\u174d\u174e\u174f\u1750\u1751\u1752\u1753\u1754\u1755\u1756\u1757\u1758\u1759\u175a\u175b\u175c\u175d\u175e\u175f\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u176a\u176b\u176e\u1771\u1772\u1775\u1778\u177b\u177e\u1781\u1784\u1787\u178a\u178b\u178e\u1791" +
|
||||
"\u1792\u1795\u1798\u179b\u179e\u17a1\u17a4\u0007\u168e\u168f\u1690\u1691\u1692\u1693\u0001\u0001\u0001\u0001\u0001\u0001\u000f\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af\u16b0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u16bf\u16c0\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0005\u16d1\u16d2\u16d3\u16d4\u0001\u0001\u0001\u0001\u0003\u16d8\u16d9\u0001\u0001\u0003\u16dd\u16de\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u16fa\u16fb\u16fc\u16fd\u16fe\u16ff\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1705\u1706\u1707\u1708\u0001\u0001\u0001\u0001\u0001\u0003\u170d\u170e\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1727\u1728\u1729\u172a\u0001\u0001\u0001\u0001\u0005\u1730\u1731\u1732\u1733\u0001\u0001\u0001\u0001\u0003\u1737\u1738\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000" +
|
||||
"\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0017\u17be\u17bf\u17c0\u17c1\u17c2\u17c3\u17c4\u17c5\u17c6\u17c7\u17c8\u17c9\u17ca\u17cb\u17cc\u17cd\u17ce\u17cf\u17d0\u17d1\u17d2\u17d3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u17d6\u0001\u0003\u17da\u17db\u0001\u0001\u0002\u17de\u0001\u0002\u17e1\u0001\u0002\u17e4\u0001\u0003\u17e8\u17e9" +
|
||||
"\u0001\u0001\u0002\u17ec\u0001\u0003\u17f0\u17f1\u0001\u0001\u0002\u17f4\u0001\u0002\u17f7\u0001\u0002\u17fa\u0001\u0002\u17fd\u0001\u000e\u180c\u180d\u1830\u183d\u184a\u186d\u1890\u18b3\u18b4\u18b5\u18b6\u18b7\u18b8\u0001\u0006\u1813\u1820\u182d\u182e\u182f\u0007\u181a\u181b\u181c\u181d\u181e\u181f\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1827\u1828\u1829\u182a\u182b\u182c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0007\u1837\u1838\u1839\u183a\u183b\u183c\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1844\u1845\u1846\u1847\u1848\u1849\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1850\u185d\u186a\u186b\u186c\u0007\u1857\u1858\u1859\u185a\u185b\u185c\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1864\u1865\u1866\u1867\u1868\u1869\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1873\u1880\u188d\u188e\u188f\u0007\u187a\u187b\u187c\u187d" +
|
||||
"\u187e\u187f\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1887\u1888\u1889\u188a\u188b\u188c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1896\u18a3\u18b0\u18b1\u18b2\u0007\u189d\u189e\u189f\u18a0\u18a1\u18a2\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u18aa\u18ab\u18ac\u18ad\u18ae\u18af\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u18bb\u0001\u0003\u18bf\u18c0\u0001" +
|
||||
"\u0001\u0002\u18c3\u0001\u0002\u18c6\u0001\u0002\u18c9\u0001\u0003\u18cd\u18ce\u0001\u0001\u0002\u18d1\u0001\u0002\u18d4\u0001\u0002\u18d7\u0001\u0002\u18da\u0002\u0000\u0003\u18df\u18e1\u0002\u0000\u0002\u0000\u0002\u18e5\u0002\u0000\u0002\u18e9\u0002\u0000\u0017\u1902\u1904\u1906\u1908\u190a\u190c\u190e\u1910\u1912\u1914\u1916\u1918\u191a\u191c\u191e\u1920\u1922\u1924\u1926\u1928\u192a\u192c\u0002\u0000\u0002\u0000\u0002\u0000" +
|
||||
"\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u1932\u1934\u1936\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u193c\u1940\u1942\u0002\u193e\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u1948\u194c\u194e\u0002\u194a\u0002\u0000\u0002\u0000\u0002\u0000" +
|
||||
"\u0002\u1952\u0001\u0007\u195a\u195b\u195c\u195d\u195e\u195f\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1962\u0001\u000c\u196f\u1970\u1971\u1972\u1973\u1974\u1975\u1976\u1977\u1978\u1979\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u197e\u197f\u1980\u0001\u0001\u0001\u0003\u1984\u1985\u0001\u0001\u0007\u198d\u198e\u198f\u1990\u1991\u1992\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1996\u1997\u0001\u0001" +
|
||||
"\u0004\u199c\u199d\u199e\u0001\u0001\u0001\u0003\u19a2\u19a3\u0001\u0001\u0002\u19a6\u0001\u0002\u19a9\u0001\u0002\u19ac\u0001\u0002\u19af\u0001\u0004\u19b4\u19b5\u19b6\u0001\u0001\u0001\u0002\u19b9\u0001\u0003\u19bd\u19be\u0001\u0001\u0002\u19c1\u0001\u0004\u19c6\u19c7\u19c8\u0001\u0001\u0001\u0002\u19cb\u0001\u0004\u19d0\u19d1\u19d2\u0001\u0001\u0001\u0002\u19d5\u0001\u0002\u19d8\u0001\u0002\u19db\u0001\u0002\u19de\u0001\u0002" +
|
||||
"\u19e1\u0001\u0002\u19e4\u0001\u0002\u19e7\u0001\u0002\u19ea\u0001\u0002\u19ed\u0001\u0006\u19f4\u19f5\u19f6\u19f7\u19f8\u0001\u0001\u0001\u0001\u0001\u0002\u19fb\u0001\u0002\u19fe\u0001\u0005\u1a04\u1a05\u1a06\u1a07\u0001\u0001\u0001\u0001\u0003\u1a0b\u1a0c\u0001\u0001\u0005\u1a12\u1a13\u1a14\u1a15\u0001\u0001\u0001\u0001\u0003\u1a19\u1a1a\u0001\u0001\u0011\u1a2c\u1a2d\u1a2e\u1a2f\u1a30\u1a31\u1a32\u1a33\u1a34\u1a35\u1a36\u1a37" +
|
||||
"\u1a38\u1a39\u1a3a\u1a3b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1a3e\u0001\u0011\u1a50\u1a51\u1a52\u1a53\u1a54\u1a55\u1a56\u1a57\u1a58\u1a59\u1a5a\u1a5b\u1a5c\u1a5d\u1a5e\u1a5f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1a62\u0001\u000c\u1a6f\u1a70\u1a71\u1a72\u1a73\u1a74\u1a75\u1a76\u1a77\u1a78\u1a79\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1a7d\u1a7e\u0001\u0001\u0003\u1a82\u1a83\u0001\u0001\u0003\u1a87\u1a88\u0001\u0001\u0002\u1a8b\u0001\u0006\u1a92\u1a93\u1a94\u1a95\u1a96\u0001\u0001\u0001\u0001\u0001\u0002\u1a99\u0001\u0002\u1a9c\u0001\u0002\u1a9f\u0001\u0002\u1aa2\u0001\u0002\u1aa5\u0001\u0004\u1aaa\u1aab\u1aac\u0001\u0001\u0001\u0004\u1ab1\u1ab2\u1ab3\u0001\u0001\u0001\u0005\u1ab9\u1aba\u1abb" +
|
||||
"\u1abc\u0001\u0001\u0001\u0001\u0004\u1ac1\u1ac2\u1ac3\u0001\u0001\u0001\u0009\u1acd\u1ace\u1acf\u1ad0\u1ad1\u1ad2\u1ad3\u1ad4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1ad7\u0001\u0006\u1ade\u1adf\u1ae0\u1ae1\u1ae2\u0001\u0001\u0001\u0001\u0001\u0009\u1aec\u1aed\u1aee\u1aef\u1af0\u1af1\u1af2\u1af3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1af7\u1af8\u0001\u0001\u0008\u1b01\u1b02\u1b03\u1b04\u1b05\u1b06" +
|
||||
"\u1b07\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u1b0c\u1b0d\u1b0e\u0001\u0001\u0001\u0002\u1b11\u0001\u0007\u1b19\u1b1a\u1b1b\u1b1c\u1b1d\u1b1e\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1b24\u1b25\u1b26\u1b27\u0001\u0001\u0001\u0001\u0005\u1b2d\u1b2e\u1b2f\u1b30\u0001\u0001\u0001\u0001\u0002\u1b33\u0001\u0008\u1b3c\u1b3d\u1b3e\u1b3f\u1b40\u1b41\u1b42\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1b46\u1b47\u0001\u0001" +
|
||||
"\u0015\u1b5d\u1b5e\u1b5f\u1b60\u1b61\u1b62\u1b63\u1b64\u1b65\u1b66\u1b67\u1b68\u1b69\u1b6a\u1b6b\u1b6c\u1b6d\u1b6e\u1b6f\u1b70\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1b73\u0001\u0003\u1b77\u1b78\u0001\u0001\u0004\u1b7d\u1b7e\u1b7f\u0001\u0001\u0001\u0002\u1b82\u0001\n\u1b8d\u1b8e\u1b8f\u1b90\u1b91\u1b92\u1b93\u1b94\u1b95\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1b9c\u1b9d\u1b9e\u1b9f\u1ba0\u0001\u0001\u0001\u0001\u0001\u0006\u1ba7\u1ba8\u1ba9\u1baa\u1bab\u0001\u0001\u0001\u0001\u0001\u0005\u1bb1\u1bb2\u1bb3\u1bb4\u0001\u0001\u0001\u0001\u0003\u1bb8\u1bb9\u0001\u0001\u0005\u1bbf\u1bc0\u1bc1\u1bc2\u0001\u0001\u0001\u0001\u0002\u1bc5\u0001\u0002\u1bc8\u0001\u0002\u1bcb\u0001\u0003\u1bcf\u1bd0\u0001\u0001\u0003\u1bd4\u1bd5\u0001\u0001\u0003\u1bd9" +
|
||||
"\u1bda\u0001\u0001\u0003\u1bde\u1bdf\u0001\u0001\u0003\u1be3\u1be4\u0001\u0001\u0002\u1be7\u0001\u0004\u1bec\u1bed\u1bee\u0001\u0001\u0001\u0005\u1bf4\u1bf5\u1bf6\u1bf7\u0001\u0001\u0001\u0001\u0002\u1bfa\u0001\u0002\u1bfd\u0001\u0002\u1c00\u0001\u0008\u1c09\u1c0a\u1c0b\u1c0c\u1c0d\u1c0e\u1c0f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1c12\u0001\u0002\u1c15\u0001\u0004\u1c1a\u1c1b\u1c1c\u0001\u0001\u0001\u0004\u1c21\u1c22" +
|
||||
"\u1c23\u0001\u0001\u0001\u0002\u1c26\u0001\u0002\u1c29\u0001\u0002\u1c2c\u0001\u0002\u1c2f\u0001\u0002\u1c32\u0001\u0002\u1c35\u0001\u0003\u1c39\u1c3a\u0001\u0001\u0002\u1c3d\u0001\u0002\u1c40\u0001\u0002\u1c43\u0001\u0002\u1c46\u0001\u0002\u1c49\u0001\u0002\u1c4c\u0001\u0002\u1c4f\u0001\u0002\u1c52\u0001\u0002\u1c55\u0001\u0002\u1c58\u0001\u0002\u1c5b\u0001\u0004\u1c60\u1c61\u1c62\u0001\u0001\u0001\u0003\u1c66\u1c67\u0001\u0001" +
|
||||
"\u0002\u1c6a\u0001\u0002\u1c6d\u0001\u0002\u1c70\u0001\u0002\u1c73\u0001\u0002\u1c76\u0001\u0005\u1c7c\u1c7d\u1c7e\u1c7f\u0001\u0001\u0001\u0001\u0004\u1c84\u1c85\u1c86\u0001\u0001\u0001\u0002\u1c89\u0001\u0002\u1c8c\u0001\u0002\u1c8f\u0001\u0002\u1c92\u0001\u0002\u1c95\u0001\u0002\u1c98\u0001\u0002\u1c9b\u0001\u0003\u1c9f\u1ca0\u0001\u0001\u0002\u1ca3\u0001\u0002\u1ca6\u0001\u0002\u1ca9\u0001\u0016\u1cc0\u1cc1\u1cc2\u1cc3\u1cc4" +
|
||||
"\u1cc5\u1cc6\u1cc7\u1cc8\u1cc9\u1cca\u1ccb\u1ccc\u1ccd\u1cce\u1ccf\u1cd0\u1cd1\u1cd2\u1cd3\u1cd4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u1cdf\u1ce0\u1ce1\u1ce2\u1ce3\u1ce4\u1ce5\u1ce6\u1ce7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1cea\u0001").toCharArray();
|
||||
|
||||
public static final int accent_aigu = 1;
|
||||
public static final int accent_arrows = 68;
|
||||
public static final int accent_bar = 91;
|
||||
public static final int accent_box = 127;
|
||||
public static final int accent_caron = 150;
|
||||
public static final int accent_cedille = 179;
|
||||
public static final int accent_circonflexe = 202;
|
||||
public static final int accent_dot_above = 245;
|
||||
public static final int accent_dot_below = 284;
|
||||
public static final int accent_double_aigu = 309;
|
||||
public static final int accent_grave = 336;
|
||||
public static final int accent_hook_above = 349;
|
||||
public static final int accent_horn = 374;
|
||||
public static final int accent_macron = 399;
|
||||
public static final int accent_ogonek = 412;
|
||||
public static final int accent_ordinal = 429;
|
||||
public static final int accent_ring = 454;
|
||||
public static final int accent_slash = 459;
|
||||
public static final int accent_subscript = 489;
|
||||
public static final int accent_superscript = 554;
|
||||
public static final int accent_tilde = 635;
|
||||
public static final int accent_trema = 658;
|
||||
public static final int compose = 671;
|
||||
("\u00e7\u00e7\u00f8\u0155\u01aa\u01b9\u01bc\u0285\u0564\u0569\u057e\u058b\u05d2\u0615\u0690\u06d3\u06da\u06f1\u06f8\u0701\u0704\u0709\u070c\u070f\u071a\u073b\u0776\u07ab\u07d4\u081f\u0842\u0847\u085e\u0869\u0888\u0891\u08a0\u08a3\u08c2\u08c7\u08d8\u08db\u08ee\u0917\u0922\u0925\u0934\u0949\u095c\u09a3\u09a6\u09ab\u09ae\u09bb\u09c4\u09c7\u09d0\u09d3\u0a86\u0b35\u0b9e\u0bbf\u0bec\u0c47\u0c56\u0c75\u0c82\u0c8f\u0c92\u0caf\u0cb4\u0cc3" +
|
||||
"\u0cca\u0cd5\u0d08\u0d0f\u0d18\u0d2d\u0d3e\u0d73\u0db8\u0dbb\u0dc0\u0dcd\u0dd4\u0dd7\u0dfa\u0e53\u0e80\u0eed\u0fb0\u0fdd\u0fe0\u0fe5\u0fe8\u0feb\u0fee\u0ff5\u100c\u1013\u1018\u1025\u102a\u1031\u1036\u1039\u103c\u103f\u1042\u1049\u104c\u1051\u1054\u105b\u105e\u1065\u1068\u106b\u106e\u1071\u1074\u1077\u107a\u107d\u1080\u108b\u108e\u1091\u109a\u109f\u10a8\u10ad\u10ce\u10d1\u10f2\u10f5\u110c\u1111\u1116\u111b\u111e\u1129\u112c\u112f" +
|
||||
"\u1132\u1135\u1138\u113f\u1146\u114f\u1156\u1167\u116a\u1175\u1186\u118b\u119a\u11a1\u11a4\u11b1\u11ba\u11c3\u11c6\u11d5\u11da\u1203\u1206\u120b\u1212\u1215\u1228\u1233\u123e\u1247\u124c\u1255\u1258\u125b\u125e\u1263\u1268\u126d\u1272\u1277\u127a\u1281\u128a\u128d\u1290\u1293\u12a2\u12a5\u12a8\u12af\u12b6\u12b9\u12bc\u12bf\u12c2\u12c5\u12c8\u12cd\u12d0\u12d3\u12d6\u12d9\u12dc\u12df\u12e2\u12e5\u12ea\u12ed\u12f0\u12f3\u12f6\u12f9" +
|
||||
"\u1302\u1309\u130c\u130f\u1312\u1315\u1318\u131b\u131e\u1323\u1326\u1329\u132c\u1357\u136a\u0009\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002b\u0123\u0124\u012d\u012e\u012f\u0130\u0131\u0132\u0133\u0134\u0135\u0136\u0137\u0138\u0139\u013a\u013b\u013c\u013d\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u0149\u014a\u014b\u014c\u014d\u014e\u014f\u0150\u0151" +
|
||||
"\u0152\u0153\u0154\u0001\u0005\u0129\u012a\u012b\u012c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0025\u017a\u017b\u017c\u017d\u017e\u017f\u0180\u0181\u0182\u0183\u0184\u0185\u0186\u0187\u0188\u0189\u018e\u018f" +
|
||||
"\u0190\u0191\u0192\u0193\u0194\u0195\u0196\u0197\u0198\u019d\u01a2\u01a3\u01a4\u01a5\u01a6\u01a7\u01a8\u01a9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u018c\u018d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u019b\u019c\u0001\u0001\u0003\u01a0\u01a1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u01b2\u01b3\u01b4\u01b5\u01b6" +
|
||||
"\u01b7\u01b8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u01bb\u0001\u0044\u0200\u020b\u020c\u0215\u0216\u021b\u021c\u021d\u021e\u021f\u0220\u0221\u0222\u0223\u0224\u0225\u0226\u0227\u0228\u0229\u022a\u022b\u022c\u022d\u022e\u023b\u0244\u0245\u024a\u024b\u024c\u024d\u024e\u024f\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u0263\u026c\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c" +
|
||||
"\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0006\u0206\u0207\u0208\u0209\u020a\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0211\u0212\u0213\u0214\u0001\u0001\u0001\u0001\u0001\u0003\u0219\u021a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0235\u0236\u0237\u0238\u0239\u023a\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0240\u0241\u0242\u0243" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0003\u0248\u0249\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u025f\u0260\u0261\u0262\u0001\u0001\u0001\u0001\u0005\u0268\u0269\u026a\u026b\u0001\u0001\u0001\u0001\u0003\u026f\u0270\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0083\u0308\u0309" +
|
||||
"\u030a\u030b\u030e\u0339\u0364\u038f\u03ba\u03c1\u03c4\u03c7\u03ca\u03cd\u03d0\u03d3\u03d6\u03d9\u03dc\u03df\u03e2\u03e5\u03e8\u03eb\u03ee\u03f1\u03f4\u03f7\u03fa\u03fd\u0400\u0403\u0406\u0409\u040c\u040f\u0412\u0415\u0418\u041b\u041e\u0421\u0424\u0427\u042a\u042d\u0430\u0433\u0436\u0439\u043c\u043f\u0442\u0445\u0448\u044b\u044e\u0451\u0454\u0457\u045a\u045d\u0460\u0463\u0466\u0469\u0470\u0477\u047e\u0485\u048c\u0493\u049a\u04a1" +
|
||||
"\u04a8\u04af\u04b6\u04bd\u04c4\u04cb\u04ce\u04d1\u04d4\u04d7\u04da\u04dd\u04e0\u04e3\u04e6\u04e9\u04ec\u04ef\u04f2\u04f5\u04f8\u04fb\u04fe\u0501\u0504\u0507\u050a\u050d\u0510\u0513\u0516\u0519\u051c\u051f\u0522\u0525\u0528\u052b\u052e\u0531\u0534\u0537\u053a\u053d\u0540\u0543\u0546\u0549\u054c\u054f\u0552\u0555\u0558\u055b\u055e\u0561\u0001\u0001\u0001\u0002\u030d\u0001\u000c\u031a\u031b\u031e\u0321\u0324\u0327\u032a\u032d\u0330" +
|
||||
"\u0333\u0336\u0001\u0002\u031d\u0001\u0002\u0320\u0001\u0002\u0323\u0001\u0002\u0326\u0001\u0002\u0329\u0001\u0002\u032c\u0001\u0002\u032f\u0001\u0002\u0332\u0001\u0002\u0335\u0001\u0002\u0338\u0001\u000c\u0345\u0346\u0349\u034c\u034f\u0352\u0355\u0358\u035b\u035e\u0361\u0001\u0002\u0348\u0001\u0002\u034b\u0001\u0002\u034e\u0001\u0002\u0351\u0001\u0002\u0354\u0001\u0002\u0357\u0001\u0002\u035a\u0001\u0002\u035d\u0001\u0002\u0360" +
|
||||
"\u0001\u0002\u0363\u0001\u000c\u0370\u0371\u0374\u0377\u037a\u037d\u0380\u0383\u0386\u0389\u038c\u0001\u0002\u0373\u0001\u0002\u0376\u0001\u0002\u0379\u0001\u0002\u037c\u0001\u0002\u037f\u0001\u0002\u0382\u0001\u0002\u0385\u0001\u0002\u0388\u0001\u0002\u038b\u0001\u0002\u038e\u0001\u000c\u039b\u039c\u039f\u03a2\u03a5\u03a8\u03ab\u03ae\u03b1\u03b4\u03b7\u0001\u0002\u039e\u0001\u0002\u03a1\u0001\u0002\u03a4\u0001\u0002\u03a7\u0001" +
|
||||
"\u0002\u03aa\u0001\u0002\u03ad\u0001\u0002\u03b0\u0001\u0002\u03b3\u0001\u0002\u03b6\u0001\u0002\u03b9\u0001\u0003\u03bd\u03be\u0001\u0002\u03c0\u0001\u0002\u03c3\u0001\u0002\u03c6\u0001\u0002\u03c9\u0001\u0002\u03cc\u0001\u0002\u03cf\u0001\u0002\u03d2\u0001\u0002\u03d5\u0001\u0002\u03d8\u0001\u0002\u03db\u0001\u0002\u03de\u0001\u0002\u03e1\u0001\u0002\u03e4\u0001\u0002\u03e7\u0001\u0002\u03ea\u0001\u0002\u03ed\u0001\u0002\u03f0" +
|
||||
"\u0001\u0002\u03f3\u0001\u0002\u03f6\u0001\u0002\u03f9\u0001\u0002\u03fc\u0001\u0002\u03ff\u0001\u0002\u0402\u0001\u0002\u0405\u0001\u0002\u0408\u0001\u0002\u040b\u0001\u0002\u040e\u0001\u0002\u0411\u0001\u0002\u0414\u0001\u0002\u0417\u0001\u0002\u041a\u0001\u0002\u041d\u0001\u0002\u0420\u0001\u0002\u0423\u0001\u0002\u0426\u0001\u0002\u0429\u0001\u0002\u042c\u0001\u0002\u042f\u0001\u0002\u0432\u0001\u0002\u0435\u0001\u0002\u0438" +
|
||||
"\u0001\u0002\u043b\u0001\u0002\u043e\u0001\u0002\u0441\u0001\u0002\u0444\u0001\u0002\u0447\u0001\u0002\u044a\u0001\u0002\u044d\u0001\u0002\u0450\u0001\u0002\u0453\u0001\u0002\u0456\u0001\u0002\u0459\u0001\u0002\u045c\u0001\u0002\u045f\u0001\u0002\u0462\u0001\u0002\u0465\u0001\u0002\u0468\u0001\u0003\u046c\u046d\u0001\u0002\u046f\u0001\u0003\u0473\u0474\u0001\u0002\u0476\u0001\u0003\u047a\u047b\u0001\u0002\u047d\u0001\u0003\u0481" +
|
||||
"\u0482\u0001\u0002\u0484\u0001\u0003\u0488\u0489\u0001\u0002\u048b\u0001\u0003\u048f\u0490\u0001\u0002\u0492\u0001\u0003\u0496\u0497\u0001\u0002\u0499\u0001\u0003\u049d\u049e\u0001\u0002\u04a0\u0001\u0003\u04a4\u04a5\u0001\u0002\u04a7\u0001\u0003\u04ab\u04ac\u0001\u0002\u04ae\u0001\u0003\u04b2\u04b3\u0001\u0002\u04b5\u0001\u0003\u04b9\u04ba\u0001\u0002\u04bc\u0001\u0003\u04c0\u04c1\u0001\u0002\u04c3\u0001\u0003\u04c7\u04c8\u0001" +
|
||||
"\u0002\u04ca\u0001\u0002\u04cd\u0001\u0002\u04d0\u0001\u0002\u04d3\u0001\u0002\u04d6\u0001\u0002\u04d9\u0001\u0002\u04dc\u0001\u0002\u04df\u0001\u0002\u04e2\u0001\u0002\u04e5\u0001\u0002\u04e8\u0001\u0002\u04eb\u0001\u0002\u04ee\u0001\u0002\u04f1\u0001\u0002\u04f4\u0001\u0002\u04f7\u0001\u0002\u04fa\u0001\u0002\u04fd\u0001\u0002\u0500\u0001\u0002\u0503\u0001\u0002\u0506\u0001\u0002\u0509\u0001\u0002\u050c\u0001\u0002\u050f\u0001" +
|
||||
"\u0002\u0512\u0001\u0002\u0515\u0001\u0002\u0518\u0001\u0002\u051b\u0001\u0002\u051e\u0001\u0002\u0521\u0001\u0002\u0524\u0001\u0002\u0527\u0001\u0002\u052a\u0001\u0002\u052d\u0001\u0002\u0530\u0001\u0002\u0533\u0001\u0002\u0536\u0001\u0002\u0539\u0001\u0002\u053c\u0001\u0002\u053f\u0001\u0002\u0542\u0001\u0002\u0545\u0001\u0002\u0548\u0001\u0002\u054b\u0001\u0002\u054e\u0001\u0002\u0551\u0001\u0002\u0554\u0001\u0002\u0557\u0001" +
|
||||
"\u0002\u055a\u0001\u0002\u055d\u0001\u0002\u0560\u0001\u0002\u0563\u0001\u0003\u0567\u0568\u0001\u0001\u0009\u0572\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u0003\u0575\u0576\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0585\u0586\u0587\u0588\u0589\u058a\u0001\u0001\u0001\u0001\u0001\u0001\u0024\u05af\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\u05ba\u05bb\u05bc\u05bd\u05be\u05bf\u05c0\u05c1\u05c2" +
|
||||
"\u05c3\u05c4\u05c5\u05c6\u05c7\u05c8\u05c9\u05ca\u05cb\u05cc\u05cd\u05ce\u05cf\u05d0\u05d1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001f\u05f1\u05f2\u05f3\u05f4\u05f5\u05f6\u05fd\u05fe\u05ff\u0600\u0601\u0602\u0603\u0604\u0605\u0606\u0607\u0608\u0609\u060a\u060b" +
|
||||
"\u060c\u060d\u060e\u060f\u0610\u0611\u0612\u0613\u0614\u0001\u0001\u0001\u0001\u0001\u0004\u05fa\u05fb\u05fc\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0038\u064d\u064e\u0653\u0658\u0659\u065a\u065b\u065c\u065d\u065e\u065f\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u066a\u066b\u066c\u066d\u066e" +
|
||||
"\u066f\u0670\u0671\u0672\u0673\u0674\u0675\u0676\u0677\u0678\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u068c\u068d\u068e\u068f\u0001\u0003\u0651\u0652\u0001\u0001\u0003\u0656\u0657\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u068a\u068b\u0001\u0001\u0001\u0001\u0001\u0001\"\u06b2\u06b3\u06b4\u06b5\u06b6\u06b7\u06b8\u06b9\u06ba\u06bb\u06bc\u06bd\u06be\u06bf\u06c0\u06c1\u06c2\u06c3\u06c4\u06c5\u06c6\u06c7\u06c8\u06c9\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u06d7\u06d8\u06d9\u0001\u0001\u0001\u000b\u06e5\u06e8\u06e9\u06ea\u06eb\u06ec\u06ed\u06ee\u06ef\u06f0\u0002\u06e7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u06f5\u06f6\u06f7\u0001\u0001\u0001\u0005\u06fd\u06fe\u06ff\u0700\u0001\u0001\u0001\u0001\u0002\u0703\u0001\u0003\u0707\u0708\u0001" +
|
||||
"\u0001\u0002\u070b\u0001\u0002\u070e\u0001\u0006\u0715\u0716\u0717\u0718\u0719\u0001\u0001\u0001\u0001\u0001\u0011\u072b\u072c\u072d\u072e\u072f\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001e\u0759\u075a\u075b\u075c\u075d\u075e\u075f\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076a\u076b\u076c" +
|
||||
"\u076d\u076e\u076f\u0770\u0771\u0772\u0773\u0774\u0775\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001b\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07a6\u07a7\u07a8\u07a9\u07aa\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0015\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001a\u07ee\u07ef\u07f8\u07f9\u07fa\u07fb\u07fc\u07fd\u07fe\u07ff\u0800" +
|
||||
"\u080d\u080e\u0813\u0814\u0815\u0816\u0817\u0818\u0819\u081a\u081b\u081c\u081d\u081e\u0001\u0005\u07f4\u07f5\u07f6\u07f7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0807\u0808\u0809\u080a\u080b\u080c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0811\u0812\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0012\u0831\u0832\u0833\u0834\u0835\u0836\u0837\u0838" +
|
||||
"\u0839\u083a\u083b\u083c\u083d\u083e\u083f\u0840\u0841\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0845\u0846\u0001\u0001\u000c\u0853\u0854\u0855\u0856\u0857\u0858\u0859\u085a\u085b\u085c\u085d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u0864\u0865\u0866\u0867\u0868\u0001\u0001\u0001\u0001\u0001\u0010\u0879\u087a\u087b\u087c\u087d\u087e" +
|
||||
"\u087f\u0880\u0881\u0882\u0883\u0884\u0885\u0886\u0887\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u088d\u088e\u088f\u0890\u0001\u0001\u0001\u0001\u0008\u0899\u089a\u089b\u089c\u089d\u089e\u089f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u08a2\u0001\u0010\u08b3\u08b4\u08b5\u08b6\u08b7\u08b8\u08b9\u08ba\u08bb\u08bc\u08bd\u08be\u08bf\u08c0\u08c1\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u08c5\u08c6\u0001\u0001\u0009\u08d0\u08d1\u08d2\u08d3\u08d4\u08d5\u08d6\u08d7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u08da\u0001\n\u08e5\u08e6\u08e7\u08e8\u08e9\u08ea\u08eb\u08ec\u08ed\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0015\u0903\u0904\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913" +
|
||||
"\u0914\u0915\u0916\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u091d\u091e\u091f\u0920\u0921\u0001\u0001\u0001\u0001\u0001\u0002\u0924\u0001\u0008\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u093f\u0940\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\n\u0953\u0954\u0955\u0956\u0957\u0958\u0959\u095a\u095b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001d\u0979\u0980\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098c\u098d\u098e\u098f\u0990\u0991\u0992\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u0002\u097b\u0003\u097e\u097f\u0001\u0001\u0003\u0983\u0984\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u09a1\u09a2\u0001\u0001\u0002\u09a5\u0001\u0003\u09a9\u09aa\u0001\u0001\u0002\u09ad\u0001\u0007\u09b5\u09b6\u09b7\u09b8\u09b9\u09ba\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u09c0\u09c1\u09c2\u09c3\u0001\u0001\u0001\u0001\u0002\u09c6\u0001\u0005\u09cc\u09cd\u09ce\u09cf\u0001\u0001\u0001\u0001\u0002\u09d2\u0001\u0042\u0a15\u0a22\u0a23\u0a24" +
|
||||
"\u0a25\u0a26\u0a27\u0a28\u0a29\u0a2a\u0a2b\u0a2c\u0a2d\u0a2e\u0a2f\u0a30\u0a31\u0a32\u0a33\u0a34\u0a35\u0a36\u0a37\u0a38\u0a39\u0a3a\u0a3b\u0a3c\u0a3d\u0a3e\u0a3f\u0a40\u0a65\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a70\u0a71\u0a72\u0a73\u0a74\u0a75\u0a76\u0a77\u0a78\u0a79\u0a7a\u0a7b\u0a7c\u0a7d\u0a7e\u0a7f\u0a80\u0a81\u0a82\u0a83\u0a84\u0a85\u0007\u0a1c\u0a1d\u0a1e\u0a1f\u0a20\u0a21\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0013\u0a53\u0a54\u0a55\u0a56\u0a57\u0a58\u0a59\u0a5a\u0a5b\u0a5c\u0a5d\u0a5e\u0a5f\u0a60\u0a61\u0a62\u0a63\u0a64\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0046\u0acc\u0acd\u0ad6\u0ae3\u0ae4\u0ae5\u0ae6\u0ae7\u0ae8\u0af1\u0af2\u0af3\u0af4\u0af5\u0af6\u0af7\u0af8\u0af9\u0afa\u0afb\u0b00\u0b01\u0b02\u0b03\u0b04\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c\u0b0d\u0b0e\u0b0f\u0b10\u0b11\u0b12\u0b13\u0b18" +
|
||||
"\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b29\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b31\u0b32\u0b33\u0b34\u0001\u0005\u0ad2\u0ad3\u0ad4\u0ad5\u0001\u0001\u0001\u0001\u0007\u0add\u0ade\u0adf\u0ae0\u0ae1\u0ae2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0aed\u0aee\u0aef\u0af0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0003\u0afe\u0aff\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0b16\u0b17\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u001f\u0b54\u0b59\u0b62\u0b63\u0b64\u0b65\u0b66\u0b67\u0b68\u0b69" +
|
||||
"\u0b6a\u0b77\u0b80\u0b81\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8b\u0b8c\u0b8d\u0b96\u0b97\u0b98\u0b99\u0b9a\u0b9b\u0b9c\u0b9d\u0003\u0b57\u0b58\u0001\u0001\u0005\u0b5e\u0b5f\u0b60\u0b61\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0b71\u0b72\u0b73\u0b74\u0b75\u0b76\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0b7c\u0b7d\u0b7e\u0b7f\u0001\u0001\u0001\u0001\u0001\u0003\u0b84\u0b85\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0005\u0b92\u0b93\u0b94\u0b95\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0011\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0bba\u0bbb\u0bbc\u0bbd\u0bbe\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0011\u0bd0\u0bd5\u0bda\u0bdb\u0bdc\u0bdd\u0bde\u0bdf\u0be0\u0be1\u0be2\u0be3\u0be4\u0be5\u0be6\u0be7" +
|
||||
"\u0003\u0bd3\u0bd4\u0001\u0001\u0003\u0bd8\u0bd9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0bea\u0beb\u0001\u0001\u002c\u0c18\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c29\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0c34\u0c35\u0c36\u0c37\u0c38\u0c39\u0c3a\u0c3b\u0c3c\u0c3d\u0c3e\u0c3f\u0c40\u0c41\u0c42\u0c43\u0c44\u0c45\u0c46" +
|
||||
"\u0003\u0c1b\u0c1c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u0c4f\u0c50\u0c51\u0c52\u0c53\u0c54\u0c55\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0010\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e" +
|
||||
"\u0c6f\u0c70\u0c71\u0c72\u0c73\u0c74\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0c7c\u0c7d\u0c7e\u0c7f\u0c80\u0c81\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0c89\u0c8a\u0c8b\u0c8c\u0c8d\u0c8e\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0c91\u0001\u000f\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0ca9\u0caa\u0cab\u0cac\u0cad\u0cae\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0cb2\u0cb3\u0001\u0001\u0008\u0cbc\u0cbd\u0cbe\u0cbf\u0cc0\u0cc1\u0cc2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0cc7\u0cc8\u0cc9\u0001\u0001\u0001\u0006\u0cd0\u0cd1\u0cd2\u0cd3\u0cd4\u0001\u0001\u0001\u0001\u0001\u001a\u0cef\u0cf0\u0cf1\u0cf2\u0cf3\u0cf4\u0cf5\u0cf6\u0cf7\u0cf8\u0cf9\u0cfa\u0cfb\u0cfc\u0cfd\u0cfe\u0cff\u0d00\u0d01\u0d02\u0d03\u0d04\u0d05\u0d06\u0d07\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0d0c\u0d0d\u0d0e\u0001\u0001\u0001\u0005\u0d14\u0d15\u0d16\u0d17\u0001\u0001\u0001\u0001\u000b\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28\u0d29\u0d2a\u0d2b\u0d2c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u0d36\u0d37\u0d38\u0d39\u0d3a\u0d3b\u0d3c\u0d3d\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u001b\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0d5e\u0d5f\u0d60\u0d61\u0d62\u0d63\u0d64\u0d65\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0d70\u0d71\u0d72\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0023\u0d96\u0d97\u0d98\u0d99\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1" +
|
||||
"\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db2\u0db3\u0db4\u0db5\u0db6\u0db7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0dba\u0001\u0003\u0dbe\u0dbf\u0001\u0001\u0007\u0dc7\u0dc8\u0dc9\u0dca\u0dcb\u0dcc\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0004\u0dd1\u0dd2\u0dd3\u0001\u0001\u0001\u0002\u0dd6\u0001\u0012\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df0\u0df1\u0df2\u0df3\u0df4\u0df5\u0df6\u0df7\u0df8\u0df9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0021\u0e1b\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e3a\u0e3b\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47" +
|
||||
"\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0005\u0e20\u0e21\u0e22\u0e23\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0e3e\u0e3f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u0e6a\u0e6b\u0e6c\u0e6d" +
|
||||
"\u0e6e\u0e6f\u0e70\u0e71\u0e72\u0e73\u0e74\u0e75\u0e76\u0e77\u0e78\u0e79\u0e7a\u0e7b\u0e7c\u0e7d\u0e7e\u0e7f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0025\u0ea5\u0eae\u0ebb\u0ec4\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0ece\u0ecf\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0edc\u0edd\u0ede\u0edf\u0ee0\u0ee1\u0ee2\u0ee3\u0ee4\u0ee5\u0ee6\u0ee7" +
|
||||
"\u0ee8\u0ee9\u0eea\u0eeb\u0eec\u0005\u0eaa\u0eab\u0eac\u0ead\u0001\u0001\u0001\u0001\u0007\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0eba\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0ec0\u0ec1\u0ec2\u0ec3\u0001\u0001\u0001\u0001\u0003\u0ec7\u0ec8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0eda\u0edb\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0040\u0f2d\u0f36\u0f3f\u0f44\u0f49\u0f4a\u0f4b\u0f4c\u0f4d\u0f4e\u0f4f\u0f50\u0f51\u0f52\u0f53\u0f54\u0f55\u0f56\u0f57\u0f58\u0f59\u0f5a\u0f67\u0f70\u0f71\u0f76\u0f77\u0f78\u0f79\u0f7a\u0f7b\u0f7c\u0f7d\u0f7e\u0f7f\u0f80\u0f81\u0f82\u0f83\u0f84\u0f85\u0f86\u0f8f\u0f98\u0f9d\u0f9e\u0f9f\u0fa0\u0fa1\u0fa2\u0fa3\u0fa4\u0fa5\u0fa6\u0fa7\u0fa8\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0005\u0f32\u0f33" +
|
||||
"\u0f34\u0f35\u0001\u0001\u0001\u0001\u0005\u0f3b\u0f3c\u0f3d\u0f3e\u0001\u0001\u0001\u0001\u0003\u0f42\u0f43\u0001\u0001\u0003\u0f47\u0f48\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0f61\u0f62\u0f63\u0f64\u0f65\u0f66\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0f6c\u0f6d\u0f6e\u0f6f\u0001\u0001\u0001\u0001\u0001\u0003\u0f74\u0f75\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0f8b\u0f8c\u0f8d\u0f8e\u0001\u0001\u0001\u0001\u0005\u0f94\u0f95\u0f96\u0f97\u0001\u0001\u0001\u0001\u0003\u0f9b\u0f9c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u0fc7\u0fc8\u0fc9\u0fca\u0fcb\u0fcc\u0fcd\u0fce\u0fcf\u0fd0\u0fd1\u0fd2\u0fd3\u0fd4\u0fd5" +
|
||||
"\u0fd6\u0fd7\u0fd8\u0fd9\u0fda\u0fdb\u0fdc\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0fdf\u0001\u0003\u0fe3\u0fe4\u0001\u0001\u0002\u0fe7\u0001\u0002\u0fea\u0001\u0002\u0fed\u0001\u0004\u0ff2\u0ff3\u0ff4\u0001\u0001\u0001\u000c\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100a\u100b\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0001\u0004\u1010\u1011\u1012\u0001\u0001\u0001\u0003\u1016\u1017\u0001\u0001\u0007\u101f\u1020\u1021\u1022\u1023\u1024\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1028\u1029\u0001\u0001\u0004\u102e\u102f\u1030\u0001\u0001\u0001\u0003\u1034\u1035\u0001\u0001\u0002\u1038\u0001\u0002\u103b\u0001\u0002\u103e\u0001\u0002\u1041\u0001\u0004\u1046\u1047\u1048\u0001\u0001\u0001\u0002\u104b\u0001\u0003\u104f\u1050\u0001" +
|
||||
"\u0001\u0002\u1053\u0001\u0004\u1058\u1059\u105a\u0001\u0001\u0001\u0002\u105d\u0001\u0004\u1062\u1063\u1064\u0001\u0001\u0001\u0002\u1067\u0001\u0002\u106a\u0001\u0002\u106d\u0001\u0002\u1070\u0001\u0002\u1073\u0001\u0002\u1076\u0001\u0002\u1079\u0001\u0002\u107c\u0001\u0002\u107f\u0001\u0006\u1086\u1087\u1088\u1089\u108a\u0001\u0001\u0001\u0001\u0001\u0002\u108d\u0001\u0002\u1090\u0001\u0005\u1096\u1097\u1098\u1099\u0001\u0001" +
|
||||
"\u0001\u0001\u0003\u109d\u109e\u0001\u0001\u0005\u10a4\u10a5\u10a6\u10a7\u0001\u0001\u0001\u0001\u0003\u10ab\u10ac\u0001\u0001\u0011\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c6\u10c7\u10c8\u10c9\u10ca\u10cb\u10cc\u10cd\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u10d0\u0001\u0011\u10e2\u10e3\u10e4\u10e5\u10e6\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef" +
|
||||
"\u10f0\u10f1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u10f4\u0001\u000c\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u110f\u1110\u0001\u0001\u0003\u1114\u1115\u0001\u0001\u0003\u1119\u111a\u0001\u0001\u0002\u111d\u0001\u0006\u1124\u1125\u1126\u1127\u1128\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0002\u112b\u0001\u0002\u112e\u0001\u0002\u1131\u0001\u0002\u1134\u0001\u0002\u1137\u0001\u0004\u113c\u113d\u113e\u0001\u0001\u0001\u0004\u1143\u1144\u1145\u0001\u0001\u0001\u0005\u114b\u114c\u114d\u114e\u0001\u0001\u0001\u0001\u0004\u1153\u1154\u1155\u0001\u0001\u0001\u0009\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1169\u0001\u0006\u1170\u1171\u1172\u1173\u1174" +
|
||||
"\u0001\u0001\u0001\u0001\u0001\u0009\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u1185\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1189\u118a\u0001\u0001\u0008\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u119e\u119f\u11a0\u0001\u0001\u0001\u0002\u11a3\u0001\u0007\u11ab\u11ac\u11ad\u11ae\u11af\u11b0\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u11b6\u11b7\u11b8\u11b9\u0001\u0001" +
|
||||
"\u0001\u0001\u0005\u11bf\u11c0\u11c1\u11c2\u0001\u0001\u0001\u0001\u0002\u11c5\u0001\u0008\u11ce\u11cf\u11d0\u11d1\u11d2\u11d3\u11d4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u11d8\u11d9\u0001\u0001\u0015\u11ef\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u11fa\u11fb\u11fc\u11fd\u11fe\u11ff\u1200\u1201\u1202\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0001\u0002\u1205\u0001\u0003\u1209\u120a\u0001\u0001\u0004\u120f\u1210\u1211\u0001\u0001\u0001\u0002\u1214\u0001\n\u121f\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u122e\u122f\u1230\u1231\u1232\u0001\u0001\u0001\u0001\u0001\u0006\u1239\u123a\u123b\u123c\u123d\u0001\u0001\u0001\u0001\u0001\u0005\u1243\u1244\u1245\u1246\u0001\u0001\u0001\u0001\u0003" +
|
||||
"\u124a\u124b\u0001\u0001\u0005\u1251\u1252\u1253\u1254\u0001\u0001\u0001\u0001\u0002\u1257\u0001\u0002\u125a\u0001\u0002\u125d\u0001\u0003\u1261\u1262\u0001\u0001\u0003\u1266\u1267\u0001\u0001\u0003\u126b\u126c\u0001\u0001\u0003\u1270\u1271\u0001\u0001\u0003\u1275\u1276\u0001\u0001\u0002\u1279\u0001\u0004\u127e\u127f\u1280\u0001\u0001\u0001\u0005\u1286\u1287\u1288\u1289\u0001\u0001\u0001\u0001\u0002\u128c\u0001\u0002\u128f\u0001" +
|
||||
"\u0002\u1292\u0001\u0008\u129b\u129c\u129d\u129e\u129f\u12a0\u12a1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u12a4\u0001\u0002\u12a7\u0001\u0004\u12ac\u12ad\u12ae\u0001\u0001\u0001\u0004\u12b3\u12b4\u12b5\u0001\u0001\u0001\u0002\u12b8\u0001\u0002\u12bb\u0001\u0002\u12be\u0001\u0002\u12c1\u0001\u0002\u12c4\u0001\u0002\u12c7\u0001\u0003\u12cb\u12cc\u0001\u0001\u0002\u12cf\u0001\u0002\u12d2\u0001\u0002\u12d5\u0001\u0002\u12d8" +
|
||||
"\u0001\u0002\u12db\u0001\u0002\u12de\u0001\u0002\u12e1\u0001\u0002\u12e4\u0001\u0003\u12e8\u12e9\u0001\u0001\u0002\u12ec\u0001\u0002\u12ef\u0001\u0002\u12f2\u0001\u0002\u12f5\u0001\u0002\u12f8\u0001\u0005\u12fe\u12ff\u1300\u1301\u0001\u0001\u0001\u0001\u0004\u1306\u1307\u1308\u0001\u0001\u0001\u0002\u130b\u0001\u0002\u130e\u0001\u0002\u1311\u0001\u0002\u1314\u0001\u0002\u1317\u0001\u0002\u131a\u0001\u0002\u131d\u0001\u0003\u1321" +
|
||||
"\u1322\u0001\u0001\u0002\u1325\u0001\u0002\u1328\u0001\u0002\u132b\u0001\u0016\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134a\u134b\u134c\u134d\u134e\u134f\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u1361\u1362\u1363\u1364\u1365\u1366\u1367\u1368\u1369\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
|
||||
"\u0001\u0001\u0002\u136c\u0001").toCharArray();
|
||||
}
|
||||
|
@@ -28,17 +28,13 @@ public final class Config
|
||||
public final float labelTextSize;
|
||||
public final float sublabelTextSize;
|
||||
|
||||
public final KeyboardData.Row bottom_row;
|
||||
public final KeyboardData.Row number_row;
|
||||
public final KeyboardData num_pad;
|
||||
|
||||
// From preferences
|
||||
/** [null] represent the [system] layout. */
|
||||
public List<KeyboardData> layouts;
|
||||
public boolean show_numpad = false;
|
||||
// From the 'numpad_layout' option, also apply to the numeric pane.
|
||||
public boolean inverse_numpad = false;
|
||||
public boolean add_number_row;
|
||||
public boolean number_row;
|
||||
public float swipe_dist_px;
|
||||
public float slide_step_px;
|
||||
// Let the system handle vibration when false.
|
||||
@@ -47,7 +43,6 @@ public final class Config
|
||||
public long vibrate_duration;
|
||||
public long longPressTimeout;
|
||||
public long longPressInterval;
|
||||
public boolean keyrepeat_enabled;
|
||||
public float margin_bottom;
|
||||
public float keyHeight;
|
||||
public float horizontal_margin;
|
||||
@@ -66,8 +61,6 @@ public final class Config
|
||||
public boolean switch_input_immediate;
|
||||
public boolean pin_entry_enabled;
|
||||
public boolean borderConfig;
|
||||
public int circle_sensitivity;
|
||||
public boolean clipboard_history_enabled;
|
||||
|
||||
// Dynamically set
|
||||
public boolean shouldOfferVoiceTyping;
|
||||
@@ -93,16 +86,6 @@ public final class Config
|
||||
keyPadding = res.getDimension(R.dimen.key_padding);
|
||||
labelTextSize = 0.33f;
|
||||
sublabelTextSize = 0.22f;
|
||||
try
|
||||
{
|
||||
number_row = KeyboardData.load_number_row(res);
|
||||
bottom_row = KeyboardData.load_bottom_row(res);
|
||||
num_pad = KeyboardData.load_num_pad(res);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new RuntimeException(e.getMessage()); // Not recoverable
|
||||
}
|
||||
// from prefs
|
||||
refresh(res);
|
||||
// initialized later
|
||||
@@ -140,7 +123,7 @@ public final class Config
|
||||
}
|
||||
layouts = LayoutsPreference.load_from_preferences(res, _prefs);
|
||||
inverse_numpad = _prefs.getString("numpad_layout", "default").equals("low_first");
|
||||
add_number_row = _prefs.getBoolean("number_row", false);
|
||||
number_row = _prefs.getBoolean("number_row", false);
|
||||
// The baseline for the swipe distance correspond to approximately the
|
||||
// width of a key in portrait mode, as most layouts have 10 columns.
|
||||
// Multipled by the DPI ratio because most swipes are made in the diagonals.
|
||||
@@ -154,7 +137,6 @@ public final class Config
|
||||
vibrate_duration = _prefs.getInt("vibrate_duration", 20);
|
||||
longPressTimeout = _prefs.getInt("longpress_timeout", 600);
|
||||
longPressInterval = _prefs.getInt("longpress_interval", 65);
|
||||
keyrepeat_enabled = _prefs.getBoolean("keyrepeat_enabled", true);
|
||||
margin_bottom = get_dip_pref_oriented(dm, "margin_bottom", 7, 3);
|
||||
key_vertical_margin = get_dip_pref(dm, "key_vertical_margin", 1.5f) / 100;
|
||||
key_horizontal_margin = get_dip_pref(dm, "key_horizontal_margin", 2) / 100;
|
||||
@@ -185,8 +167,6 @@ public final class Config
|
||||
pin_entry_enabled = _prefs.getBoolean("pin_entry_enabled", true);
|
||||
current_layout_portrait = _prefs.getInt("current_layout_portrait", 0);
|
||||
current_layout_landscape = _prefs.getInt("current_layout_landscape", 0);
|
||||
circle_sensitivity = Integer.valueOf(_prefs.getString("circle_sensitivity", "2"));
|
||||
clipboard_history_enabled = _prefs.getBoolean("clipboard_history_enabled", false);
|
||||
}
|
||||
|
||||
public int get_current_layout()
|
||||
@@ -234,7 +214,7 @@ public final class Config
|
||||
extra_keys.put(KeyValue.getKeyByName("config"), KeyboardData.PreferredPos.ANYWHERE);
|
||||
extra_keys.putAll(extra_keys_param);
|
||||
extra_keys.putAll(extra_keys_custom);
|
||||
if (extra_keys_subtype != null && kw.locale_extra_keys)
|
||||
if (extra_keys_subtype != null)
|
||||
{
|
||||
Set<KeyValue> present = new HashSet<KeyValue>();
|
||||
present.addAll(kw.getKeys().keySet());
|
||||
@@ -243,13 +223,11 @@ public final class Config
|
||||
extra_keys_subtype.compute(extra_keys,
|
||||
new ExtraKeys.Query(kw.script, present));
|
||||
}
|
||||
KeyboardData.Row added_number_row = null;
|
||||
if (add_number_row && !show_numpad)
|
||||
added_number_row = modify_number_row(number_row, kw);
|
||||
if (added_number_row != null)
|
||||
remove_keys.addAll(added_number_row.getKeys(0).keySet());
|
||||
if (kw.bottom_row)
|
||||
kw = kw.insert_row(bottom_row, kw.rows.size());
|
||||
KeyboardData.Row number_row = null;
|
||||
if (this.number_row && !show_numpad)
|
||||
number_row = modify_number_row(KeyboardData.number_row, kw);
|
||||
if (number_row != null)
|
||||
remove_keys.addAll(number_row.getKeys(0).keySet());
|
||||
kw = kw.mapKeys(new KeyboardData.MapKeyValues() {
|
||||
public KeyValue apply(KeyValue key, boolean localized)
|
||||
{
|
||||
@@ -301,9 +279,9 @@ public final class Config
|
||||
}
|
||||
});
|
||||
if (show_numpad)
|
||||
kw = kw.addNumPad(modify_numpad(num_pad, kw));
|
||||
if (added_number_row != null)
|
||||
kw = kw.insert_row(added_number_row, 0);
|
||||
kw = kw.addNumPad(modify_numpad(KeyboardData.num_pad, kw));
|
||||
if (number_row != null)
|
||||
kw = kw.addTopRow(number_row);
|
||||
if (extra_keys.size() > 0)
|
||||
kw = kw.addExtraKeys(extra_keys.entrySet().iterator());
|
||||
return kw;
|
||||
@@ -405,7 +383,6 @@ public final class Config
|
||||
|
||||
private int getThemeId(Resources res, String theme_name)
|
||||
{
|
||||
int night_mode = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||
switch (theme_name)
|
||||
{
|
||||
case "light": return R.style.Light;
|
||||
@@ -416,14 +393,9 @@ public final class Config
|
||||
case "epaper": return R.style.ePaper;
|
||||
case "desert": return R.style.Desert;
|
||||
case "jungle": return R.style.Jungle;
|
||||
case "monetlight": return R.style.MonetLight;
|
||||
case "monetdark": return R.style.MonetDark;
|
||||
case "monet":
|
||||
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
|
||||
return R.style.MonetLight;
|
||||
return R.style.MonetDark;
|
||||
default:
|
||||
case "system":
|
||||
int night_mode = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||
if ((night_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
|
||||
return R.style.Light;
|
||||
return R.style.Dark;
|
||||
|
@@ -86,7 +86,7 @@ public final class Gesture
|
||||
switch (state)
|
||||
{
|
||||
case Swiped:
|
||||
if (Math.abs(d) < Config.globalConfig().circle_sensitivity)
|
||||
if (Math.abs(d) < ROTATION_THRESHOLD)
|
||||
return false;
|
||||
// Start a rotation
|
||||
state = (clockwise) ?
|
||||
|
@@ -10,9 +10,7 @@ import android.view.inputmethod.ExtractedTextRequest;
|
||||
import android.view.inputmethod.InputConnection;
|
||||
import java.util.Iterator;
|
||||
|
||||
public final class KeyEventHandler
|
||||
implements Config.IKeyEventHandler,
|
||||
ClipboardHistoryService.ClipboardPasteCallback
|
||||
public final class KeyEventHandler implements Config.IKeyEventHandler
|
||||
{
|
||||
IReceiver _recv;
|
||||
Autocapitalisation _autocap;
|
||||
@@ -107,12 +105,6 @@ public final class KeyEventHandler
|
||||
update_meta_state(mods);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paste_from_clipboard_pane(String content)
|
||||
{
|
||||
send_text(content);
|
||||
}
|
||||
|
||||
/** Update [_mods] to be consistent with the [mods], sending key events if
|
||||
needed. */
|
||||
void update_meta_state(Pointers.Modifiers mods)
|
||||
|
@@ -6,11 +6,19 @@ import java.util.HashMap;
|
||||
|
||||
public final class KeyModifier
|
||||
{
|
||||
/** Cache key is KeyValue's name */
|
||||
private static HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>> _cache =
|
||||
new HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>>();
|
||||
|
||||
/** The optional modmap takes priority over modifiers usual behaviors. Set to
|
||||
[null] to disable. */
|
||||
private static KeyboardData.Modmap _modmap = null;
|
||||
public static void set_modmap(KeyboardData.Modmap mm)
|
||||
{
|
||||
// Clear the cache when switching to or from a layout that contain a modmap
|
||||
// as the cache would otherwise override the modmap.
|
||||
if (_modmap != null || mm != null)
|
||||
_cache.clear();
|
||||
_modmap = mm;
|
||||
}
|
||||
|
||||
@@ -20,9 +28,15 @@ public final class KeyModifier
|
||||
if (k == null)
|
||||
return null;
|
||||
int n_mods = mods.size();
|
||||
KeyValue r = k;
|
||||
for (int i = 0; i < n_mods; i++)
|
||||
r = modify(r, mods.get(i));
|
||||
HashMap<Pointers.Modifiers, KeyValue> ks = cacheEntry(k);
|
||||
KeyValue r = ks.get(mods);
|
||||
if (r == null)
|
||||
{
|
||||
r = k;
|
||||
for (int i = 0; i < n_mods; i++)
|
||||
r = modify(r, mods.get(i));
|
||||
ks.put(mods, r);
|
||||
}
|
||||
/* Keys with an empty string are placeholder keys. */
|
||||
if (r.getString().length() == 0)
|
||||
return null;
|
||||
@@ -51,36 +65,36 @@ public final class KeyModifier
|
||||
{
|
||||
switch (mod)
|
||||
{
|
||||
case CTRL: return apply_ctrl(k);
|
||||
case CTRL:
|
||||
case ALT:
|
||||
case META: return turn_into_keyevent(k);
|
||||
case FN: return apply_fn(k);
|
||||
case GESTURE: return apply_gesture(k);
|
||||
case SHIFT: return apply_shift(k);
|
||||
case GRAVE: return apply_compose_or_dead_char(k, ComposeKeyData.accent_grave, '\u02CB');
|
||||
case AIGU: return apply_compose_or_dead_char(k, ComposeKeyData.accent_aigu, '\u00B4');
|
||||
case CIRCONFLEXE: return apply_compose_or_dead_char(k, ComposeKeyData.accent_circonflexe, '\u02C6');
|
||||
case TILDE: return apply_compose_or_dead_char(k, ComposeKeyData.accent_tilde, '\u02DC');
|
||||
case CEDILLE: return apply_compose_or_dead_char(k, ComposeKeyData.accent_cedille, '\u00B8');
|
||||
case TREMA: return apply_compose_or_dead_char(k, ComposeKeyData.accent_trema, '\u00A8');
|
||||
case CARON: return apply_compose_or_dead_char(k, ComposeKeyData.accent_caron, '\u02C7');
|
||||
case RING: return apply_compose_or_dead_char(k, ComposeKeyData.accent_ring, '\u02DA');
|
||||
case MACRON: return apply_compose_or_dead_char(k, ComposeKeyData.accent_macron, '\u00AF');
|
||||
case OGONEK: return apply_compose_or_dead_char(k, ComposeKeyData.accent_ogonek, '\u02DB');
|
||||
case DOT_ABOVE: return apply_compose_or_dead_char(k, ComposeKeyData.accent_dot_above, '\u02D9');
|
||||
case BREVE: return apply_dead_char(k, '\u02D8');
|
||||
case DOUBLE_AIGU: return apply_compose(k, ComposeKeyData.accent_double_aigu);
|
||||
case ORDINAL: return apply_compose(k, ComposeKeyData.accent_ordinal);
|
||||
case SUPERSCRIPT: return apply_compose(k, ComposeKeyData.accent_superscript);
|
||||
case SUBSCRIPT: return apply_compose(k, ComposeKeyData.accent_subscript);
|
||||
case ARROWS: return apply_compose(k, ComposeKeyData.accent_arrows);
|
||||
case BOX: return apply_compose(k, ComposeKeyData.accent_box);
|
||||
case SLASH: return apply_compose(k, ComposeKeyData.accent_slash);
|
||||
case BAR: return apply_compose(k, ComposeKeyData.accent_bar);
|
||||
case DOT_BELOW: return apply_compose(k, ComposeKeyData.accent_dot_below);
|
||||
case HORN: return apply_compose(k, ComposeKeyData.accent_horn);
|
||||
case HOOK_ABOVE: return apply_compose(k, ComposeKeyData.accent_hook_above);
|
||||
case GRAVE: return apply_map_char(k, map_char_grave);
|
||||
case AIGU: return apply_map_char(k, map_char_aigu);
|
||||
case CIRCONFLEXE: return apply_map_char(k, map_char_circonflexe);
|
||||
case TILDE: return apply_map_char(k, map_char_tilde);
|
||||
case CEDILLE: return apply_map_char(k, map_char_cedille);
|
||||
case TREMA: return apply_map_char(k, map_char_trema);
|
||||
case CARON: return apply_map_char(k, map_char_caron);
|
||||
case RING: return apply_map_char(k, map_char_ring);
|
||||
case MACRON: return apply_map_char(k, map_char_macron);
|
||||
case OGONEK: return apply_map_char(k, map_char_ogonek);
|
||||
case DOT_ABOVE: return apply_map_char(k, map_char_dot_above);
|
||||
case BREVE: return apply_map_char(k, map_char_breve);
|
||||
case DOUBLE_AIGU: return apply_map_char(k, map_char_double_aigu);
|
||||
case ORDINAL: return apply_map_char(k, map_char_ordinal);
|
||||
case SUPERSCRIPT: return apply_map_char(k, map_char_superscript);
|
||||
case SUBSCRIPT: return apply_map_char(k, map_char_subscript);
|
||||
case ARROWS: return apply_map_char(k, map_char_arrows);
|
||||
case BOX: return apply_map_char(k, map_char_box);
|
||||
case SLASH: return apply_map_char(k, map_char_slash);
|
||||
case BAR: return apply_map_char(k, map_char_bar);
|
||||
case ARROW_RIGHT: return apply_map_char(k, map_char_arrow_right);
|
||||
case DOT_BELOW: return apply_map_char(k, map_char_dot_below);
|
||||
case HORN: return apply_map_char(k, map_char_horn);
|
||||
case HOOK_ABOVE: return apply_map_char(k, map_char_hook_above);
|
||||
default: return k;
|
||||
}
|
||||
}
|
||||
@@ -131,45 +145,6 @@ public final class KeyModifier
|
||||
return k;
|
||||
}
|
||||
|
||||
/** Apply the given compose state or fallback to the dead_char. */
|
||||
private static KeyValue apply_compose_or_dead_char(KeyValue k, int state, char dead_char)
|
||||
{
|
||||
switch (k.getKind())
|
||||
{
|
||||
case Char:
|
||||
char c = k.getChar();
|
||||
KeyValue r = ComposeKey.apply(state, c);
|
||||
if (r != null)
|
||||
return r;
|
||||
}
|
||||
return apply_dead_char(k, dead_char);
|
||||
}
|
||||
|
||||
private static KeyValue apply_compose(KeyValue k, int state)
|
||||
{
|
||||
switch (k.getKind())
|
||||
{
|
||||
case Char:
|
||||
KeyValue r = ComposeKey.apply(state, k.getChar());
|
||||
if (r != null)
|
||||
return r;
|
||||
}
|
||||
return k;
|
||||
}
|
||||
|
||||
private static KeyValue apply_dead_char(KeyValue k, char dead_char)
|
||||
{
|
||||
switch (k.getKind())
|
||||
{
|
||||
case Char:
|
||||
char c = k.getChar();
|
||||
char modified = (char)KeyCharacterMap.getDeadChar(dead_char, c);
|
||||
if (modified != 0 && modified != c)
|
||||
return KeyValue.makeStringKey(String.valueOf(modified));
|
||||
}
|
||||
return k;
|
||||
}
|
||||
|
||||
private static KeyValue apply_shift(KeyValue k)
|
||||
{
|
||||
if (_modmap != null)
|
||||
@@ -440,19 +415,6 @@ public final class KeyModifier
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyValue apply_ctrl(KeyValue k)
|
||||
{
|
||||
if (_modmap != null)
|
||||
{
|
||||
KeyValue mapped = _modmap.ctrl.get(k);
|
||||
// Do not return the modified character right away, first turn it into a
|
||||
// key event.
|
||||
if (mapped != null)
|
||||
k = mapped;
|
||||
}
|
||||
return turn_into_keyevent(k);
|
||||
}
|
||||
|
||||
private static KeyValue turn_into_keyevent(KeyValue k)
|
||||
{
|
||||
if (k.getKind() != KeyValue.Kind.Char)
|
||||
@@ -528,6 +490,18 @@ public final class KeyModifier
|
||||
return shifted;
|
||||
}
|
||||
|
||||
/* Lookup the cache entry for a key. Create it needed. */
|
||||
private static HashMap<Pointers.Modifiers, KeyValue> cacheEntry(KeyValue k)
|
||||
{
|
||||
HashMap<Pointers.Modifiers, KeyValue> ks = _cache.get(k);
|
||||
if (ks == null)
|
||||
{
|
||||
ks = new HashMap<Pointers.Modifiers, KeyValue>();
|
||||
_cache.put(k, ks);
|
||||
}
|
||||
return ks;
|
||||
}
|
||||
|
||||
public static abstract class Map_char
|
||||
{
|
||||
/** Modify a char or return [null] if the modifier do not apply. Return a
|
||||
@@ -598,6 +572,424 @@ public final class KeyModifier
|
||||
}
|
||||
}
|
||||
|
||||
/** Return [null] if the dead char do not apply. */
|
||||
private static String map_dead_char(char c, char dead_char)
|
||||
{
|
||||
char modified = (char)KeyCharacterMap.getDeadChar(dead_char, c);
|
||||
return (modified == 0 || modified == c) ? null : String.valueOf(modified);
|
||||
}
|
||||
|
||||
private static final Map_char map_char_aigu =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "á";
|
||||
case 'c': return "ć";
|
||||
case 'e': return "é";
|
||||
case 'i': return "í";
|
||||
case 'l': return "ĺ";
|
||||
case 'ń': return "ń";
|
||||
case 'o': return "ó";
|
||||
case 'r': return "ŕ";
|
||||
case 's': return "ś";
|
||||
case 'u': return "ú";
|
||||
case 'y': return "ý";
|
||||
case 'z': return "ź";
|
||||
// used in Pinyin
|
||||
case 'ü': return "ǘ";
|
||||
// Combining diacritic
|
||||
case 'j':
|
||||
// Russian vowels
|
||||
case 'у': case 'е': case 'а': case 'о': case 'и':
|
||||
case 'ы': case 'э': case 'ю': case 'я':
|
||||
return c + "\u0301";
|
||||
default: return map_dead_char(c, '\u00B4');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_caron =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ǎ";
|
||||
case 'c': return "č";
|
||||
case 'd': return "ď";
|
||||
case 'e': return "ě";
|
||||
case 'i': return "ǐ";
|
||||
case 'l': return "ľ";
|
||||
case 'n': return "ň";
|
||||
case 'o': return "ǒ";
|
||||
case 'r': return "ř";
|
||||
case 's': return "š";
|
||||
case 't': return "ť";
|
||||
case 'u': return "ǔ";
|
||||
case 'z': return "ž";
|
||||
// used in Pinyin
|
||||
case 'ü': return "ǚ";
|
||||
default: return map_dead_char(c, '\u02C7');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_cedille =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'c': return "ç";
|
||||
case 'd': return "ḑ";
|
||||
case 'e': return "ȩ";
|
||||
case 'g': return "ģ";
|
||||
case 'h': return "ḩ";
|
||||
case 'k': return "ķ";
|
||||
case 'l': return "ļ";
|
||||
case 'n': return "ņ";
|
||||
case 'r': return "ŗ";
|
||||
case 's': return "ş";
|
||||
case 't': return "ţ";
|
||||
default: return map_dead_char(c, '\u00B8');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_circonflexe =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "â";
|
||||
case 'c': return "ĉ";
|
||||
case 'e': return "ê";
|
||||
case 'g': return "ĝ";
|
||||
case 'h': return "ĥ";
|
||||
case 'i': return "î";
|
||||
case 'j': return "ĵ";
|
||||
case 'o': return "ô";
|
||||
case 'ŝ': return "ŝ";
|
||||
case 'u': return "û";
|
||||
case 'z': return "ẑ";
|
||||
default: return map_dead_char(c, '\u02C6');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_dot_above =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ȧ";
|
||||
case 'b': return "ḃ";
|
||||
case 'c': return "ċ";
|
||||
case 'd': return "ḋ";
|
||||
case 'e': return "ė";
|
||||
case 'f': return "ḟ";
|
||||
case 'g': return "ġ";
|
||||
case 'h': return "ḣ";
|
||||
// Turkish ı / İ is handled elsewhere
|
||||
case 'm': return "ṁ";
|
||||
case 'n': return "ṅ";
|
||||
case 'o': return "ȯ";
|
||||
case 'p': return "ṗ";
|
||||
case 'r': return "ṙ";
|
||||
case 's': return "ṡ";
|
||||
case 't': return "ṫ";
|
||||
case 'w': return "ẇ";
|
||||
case 'x': return "ẋ";
|
||||
case 'y': return "ẏ";
|
||||
case 'z': return "ż";
|
||||
default: return map_dead_char(c, '\u02D9');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_grave =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "à";
|
||||
case 'e': return "è";
|
||||
case 'i': return "ì";
|
||||
case 'o': return "ò";
|
||||
case 'u': return "ù";
|
||||
// used in Pinyin
|
||||
case 'ü': return "ǜ";
|
||||
default: return map_dead_char(c, '\u02CB');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_macron =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ā";
|
||||
case 'e': return "ē";
|
||||
case 'i': return "ī";
|
||||
case 'o': return "ō";
|
||||
case 'u': return "ū";
|
||||
// used in Pinyin
|
||||
case 'ü': return "ǖ";
|
||||
default: return map_dead_char(c, '\u00AF');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_ogonek =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ą";
|
||||
case 'e': return "ę";
|
||||
case 'i': return "į";
|
||||
case 'k': return "ķ";
|
||||
case 'l': return "ļ";
|
||||
case 'n': return "ņ";
|
||||
case 'o': return "ǫ";
|
||||
case 'u': return "ų";
|
||||
default: return map_dead_char(c, '\u02DB');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_ring =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "å";
|
||||
case 'u': return "ů";
|
||||
default: return map_dead_char(c, '\u02DA');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_tilde =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ã";
|
||||
case 'e': return "ẽ";
|
||||
case 'i': return "ĩ";
|
||||
case 'n': return "ñ";
|
||||
case 'o': return "õ";
|
||||
case 'u': return "ũ";
|
||||
// Vietnamese
|
||||
case 'ă': return "ẵ";
|
||||
case 'â': return "ẫ";
|
||||
case 'ê': return "ễ";
|
||||
case 'ơ': return "ỡ";
|
||||
case 'ư': return "ữ";
|
||||
default: return map_dead_char(c, '\u02DC');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_trema =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ä";
|
||||
case 'e': return "ë";
|
||||
case 'i': return "ï";
|
||||
case 'o': return "ö";
|
||||
case 'u': return "ü";
|
||||
case 'y': return "ÿ";
|
||||
default: return map_dead_char(c, '\u00A8');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_breve =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
default: return map_dead_char(c, '\u02D8');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_double_aigu =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'o': return "ő";
|
||||
case 'u': return "ű";
|
||||
case ' ': return "˝";
|
||||
// Combining diacritic
|
||||
case 'a':
|
||||
case 'e':
|
||||
case 'i':
|
||||
case 'm':
|
||||
case 'y':
|
||||
return c + "\u030b";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_ordinal =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ª";
|
||||
case 'o': return "º";
|
||||
case '1': return "ª";
|
||||
case '2': return "º";
|
||||
case '3': return "ⁿ";
|
||||
case '4': return "ᵈ";
|
||||
case '5': return "ᵉ";
|
||||
case '6': return "ʳ";
|
||||
case '7': return "ˢ";
|
||||
case '8': return "ᵗ";
|
||||
case '9': return "ʰ";
|
||||
case '*': return "°";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_superscript =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return "¹";
|
||||
case '2': return "²";
|
||||
case '3': return "³";
|
||||
case '4': return "⁴";
|
||||
case '5': return "⁵";
|
||||
case '6': return "⁶";
|
||||
case '7': return "⁷";
|
||||
case '8': return "⁸";
|
||||
case '9': return "⁹";
|
||||
case '0': return "⁰";
|
||||
case '+': return "⁺";
|
||||
case '-': return "⁻";
|
||||
case '=': return "⁼";
|
||||
case '(': return "⁽";
|
||||
case ')': return "⁾";
|
||||
case 'a': return "ᵃ";
|
||||
case 'b': return "ᵇ";
|
||||
case 'c': return "ᶜ";
|
||||
case 'd': return "ᵈ";
|
||||
case 'e': return "ᵉ";
|
||||
case 'f': return "ᶠ";
|
||||
case 'g': return "ᵍ";
|
||||
case 'h': return "ʰ";
|
||||
case 'i': return "ⁱ";
|
||||
case 'j': return "ʲ";
|
||||
case 'k': return "ᵏ";
|
||||
case 'l': return "ˡ";
|
||||
case 'm': return "ᵐ";
|
||||
case 'n': return "ⁿ";
|
||||
case 'o': return "ᵒ";
|
||||
case 'p': return "ᵖ";
|
||||
case 'r': return "ʳ";
|
||||
case 's': return "ˢ";
|
||||
case 't': return "ᵗ";
|
||||
case 'u': return "ᵘ";
|
||||
case 'v': return "ᵛ";
|
||||
case 'w': return "ʷ";
|
||||
case 'x': return "ˣ";
|
||||
case 'y': return "ʸ";
|
||||
case 'z': return "ᶻ";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_subscript =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return "₁";
|
||||
case '2': return "₂";
|
||||
case '3': return "₃";
|
||||
case '4': return "₄";
|
||||
case '5': return "₅";
|
||||
case '6': return "₆";
|
||||
case '7': return "₇";
|
||||
case '8': return "₈";
|
||||
case '9': return "₉";
|
||||
case '0': return "₀";
|
||||
case '+': return "₊";
|
||||
case '-': return "₋";
|
||||
case '=': return "₌";
|
||||
case '(': return "₍";
|
||||
case ')': return "₎";
|
||||
case 'a': return "ₐ";
|
||||
case 'e': return "ₑ";
|
||||
case 'h': return "ₕ";
|
||||
case 'i': return "ᵢ";
|
||||
case 'j': return "ⱼ";
|
||||
case 'k': return "ₖ";
|
||||
case 'l': return "ₗ";
|
||||
case 'm': return "ₘ";
|
||||
case 'n': return "ₙ";
|
||||
case 'o': return "ₒ";
|
||||
case 'p': return "ₚ";
|
||||
case 'r': return "ᵣ";
|
||||
case 's': return "ₛ";
|
||||
case 't': return "ₜ";
|
||||
case 'u': return "ᵤ";
|
||||
case 'v': return "ᵥ";
|
||||
case 'x': return "ₓ";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_arrows =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '0': return "↔";
|
||||
case '1': return "↙";
|
||||
case '2': return "↓";
|
||||
case '3': return "↘";
|
||||
case '4': return "←";
|
||||
case '5': return "↕";
|
||||
case '6': return "→";
|
||||
case '7': return "↖";
|
||||
case '8': return "↑";
|
||||
case '9': return "↗";
|
||||
case '.': return "↵";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_arrow_right =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
@@ -609,6 +1001,147 @@ public final class KeyModifier
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_box =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return "└";
|
||||
case '2': return "┴";
|
||||
case '3': return "┘";
|
||||
case '4': return "├";
|
||||
case '5': return "┼";
|
||||
case '6': return "┤";
|
||||
case '7': return "┌";
|
||||
case '8': return "┬";
|
||||
case '9': return "┐";
|
||||
case '0': return "─";
|
||||
case '.': return "│";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_slash =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ⱥ";
|
||||
case 'b': return "␢";
|
||||
case 'c': return "ȼ";
|
||||
case 'e': return "ɇ";
|
||||
case 'g': return "ꞡ";
|
||||
case 'k': return "ꝃ";
|
||||
case 'l': return "ł";
|
||||
case 'n': return "ꞥ";
|
||||
case 'o': return "ø";
|
||||
case 'r': return "ꞧ";
|
||||
case 's': return "ꞩ";
|
||||
case 't': return "ⱦ";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_bar =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'b': return "ƀ";
|
||||
case 'c': return "ꞓ";
|
||||
case 'd': return "đ";
|
||||
case 'g': return "ǥ";
|
||||
case 'i': return "ɨ";
|
||||
case 'j': return "ɉ";
|
||||
case 'k': return "ꝁ";
|
||||
case 'l': return "ƚ";
|
||||
case 'o': return "ɵ";
|
||||
case 'p': return "ᵽ";
|
||||
case 'q': return "ꝗ";
|
||||
case 'r': return "ɍ";
|
||||
case 't': return "ŧ";
|
||||
case 'u': return "ʉ";
|
||||
case 'y': return "ɏ";
|
||||
case 'z': return "ƶ";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_dot_below =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ạ";
|
||||
case 'ă': return "ặ";
|
||||
case 'â': return "ậ";
|
||||
case 'e': return "ẹ";
|
||||
case 'ê': return "ệ";
|
||||
case 'i': return "ị";
|
||||
case 'o': return "ọ";
|
||||
case 'ô': return "ộ";
|
||||
case 'ơ': return "ợ";
|
||||
case 'u': return "ụ";
|
||||
case 'ư': return "ự";
|
||||
case 'y': return "ỵ";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_horn =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'o': return "ơ";
|
||||
case 'ó': return "ớ";
|
||||
case 'ò': return "ờ";
|
||||
case 'ỏ': return "ở";
|
||||
case 'õ': return "ỡ";
|
||||
case 'ọ': return "ợ";
|
||||
case 'u': return "ư";
|
||||
case 'ú': return "ứ";
|
||||
case 'ù': return "ừ";
|
||||
case 'ủ': return "ử";
|
||||
case 'ũ': return "ữ";
|
||||
case 'ụ': return "ự";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_hook_above =
|
||||
new Map_char() {
|
||||
public String apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return "ả";
|
||||
case 'ă': return "ẳ";
|
||||
case 'â': return "ẩ";
|
||||
case 'e': return "ẻ";
|
||||
case 'ê': return "ể";
|
||||
case 'i': return "ỉ";
|
||||
case 'o': return "ỏ";
|
||||
case 'ô': return "ổ";
|
||||
case 'ơ': return "ở";
|
||||
case 'u': return "ủ";
|
||||
case 'ư': return "ử";
|
||||
case 'y': return "ỷ";
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Used with Arabic despite the name; called "Hindi numerals" in Arabic
|
||||
// map_char_numpad_devanagari is used in Hindi
|
||||
private static final Map_char map_char_numpad_hindu =
|
||||
|
@@ -12,8 +12,6 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
SWITCH_NUMERIC,
|
||||
SWITCH_EMOJI,
|
||||
SWITCH_BACK_EMOJI,
|
||||
SWITCH_CLIPBOARD,
|
||||
SWITCH_BACK_CLIPBOARD,
|
||||
CHANGE_METHOD_PICKER,
|
||||
CHANGE_METHOD_AUTO,
|
||||
ACTION,
|
||||
@@ -462,8 +460,6 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
case "switch_numeric": return eventKey("123+", Event.SWITCH_NUMERIC, FLAG_SMALLER_FONT);
|
||||
case "switch_emoji": return eventKey(0xE001, Event.SWITCH_EMOJI, FLAG_SMALLER_FONT);
|
||||
case "switch_back_emoji": return eventKey("ABC", Event.SWITCH_BACK_EMOJI, 0);
|
||||
case "switch_clipboard": return eventKey(0xE017, Event.SWITCH_CLIPBOARD, 0);
|
||||
case "switch_back_clipboard": return eventKey("ABC", Event.SWITCH_BACK_CLIPBOARD, 0);
|
||||
case "switch_forward": return eventKey(0xE013, Event.SWITCH_FORWARD, FLAG_SMALLER_FONT);
|
||||
case "switch_backward": return eventKey(0xE014, Event.SWITCH_BACKWARD, FLAG_SMALLER_FONT);
|
||||
case "switch_greekmath": return eventKey("πλ∇¬", Event.SWITCH_GREEKMATH, FLAG_SMALLER_FONT);
|
||||
@@ -501,14 +497,12 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
case "f11": return keyeventKey("F11", KeyEvent.KEYCODE_F11, FLAG_SMALLER_FONT);
|
||||
case "f12": return keyeventKey("F12", KeyEvent.KEYCODE_F12, FLAG_SMALLER_FONT);
|
||||
case "tab": return keyeventKey(0xE00F, KeyEvent.KEYCODE_TAB, FLAG_SMALLER_FONT);
|
||||
case "menu": return keyeventKey("Menu", KeyEvent.KEYCODE_MENU, FLAG_SMALLER_FONT);
|
||||
|
||||
/* Spaces */
|
||||
case "\\t": return charKey("\\t", '\t', 0); // Send the tab character
|
||||
case "\\n": return charKey("\\n", '\n', 0); // Send the newline character
|
||||
case "space": return charKey(0xE00D, ' ', FLAG_KEY_FONT | FLAG_SMALLER_FONT | FLAG_GREYED);
|
||||
case "nbsp": return charKey("\u237d", '\u00a0', FLAG_SMALLER_FONT);
|
||||
case "nnbsp": return charKey("\u2423", '\u202F', FLAG_SMALLER_FONT);
|
||||
|
||||
/* bidi */
|
||||
case "lrm": return charKey("↱", '\u200e', 0); // Send left-to-right mark
|
||||
@@ -551,8 +545,7 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
case "meteg_placeholder": return placeholderKey(Placeholder.METEG);
|
||||
/* intending/preventing ligature - supported by many scripts*/
|
||||
case "zwj": return charKey("zwj", '\u200D', 0); // zero-width joiner (provides ligature)
|
||||
case "zwnj":
|
||||
case "halfspace": return charKey("⸽", '\u200C', 0); // zero-width non joiner
|
||||
case "zwnj": return charKey("zwnj", '\u200C', 0); // zero-width non joiner (prevents unintended ligature)
|
||||
|
||||
/* Editing keys */
|
||||
case "copy": return editingKey(0xE030, Editing.COPY);
|
||||
@@ -571,7 +564,7 @@ public final class KeyValue implements Comparable<KeyValue>
|
||||
case "autofill": return editingKey("auto", Editing.AUTOFILL);
|
||||
|
||||
/* The compose key */
|
||||
case "compose": return makeComposePending(0xE016, ComposeKeyData.compose, FLAG_SECONDARY | FLAG_SMALLER_FONT | FLAG_SPECIAL);
|
||||
case "compose": return makeComposePending(0xE016, 0, FLAG_SECONDARY | FLAG_SMALLER_FONT | FLAG_SPECIAL);
|
||||
|
||||
/* Placeholder keys */
|
||||
case "removed": return placeholderKey(Placeholder.REMOVED);
|
||||
|
@@ -36,7 +36,6 @@ public class Keyboard2 extends InputMethodService
|
||||
/** Layout associated with the currently selected locale. Not 'null'. */
|
||||
private KeyboardData _localeTextLayout;
|
||||
private ViewGroup _emojiPane = null;
|
||||
private ViewGroup _clipboard_pane = null;
|
||||
public int actionId; // Action performed by the Action key.
|
||||
|
||||
private Config _config;
|
||||
@@ -106,6 +105,7 @@ public class Keyboard2 extends InputMethodService
|
||||
public void onCreate()
|
||||
{
|
||||
super.onCreate();
|
||||
KeyboardData.init(getResources());
|
||||
SharedPreferences prefs = DirectBootAwarePreferences.get_shared_preferences(this);
|
||||
_keyeventhandler = new KeyEventHandler(getMainLooper(), this.new Receiver());
|
||||
Config.initGlobalConfig(prefs, getResources(), _keyeventhandler);
|
||||
@@ -114,7 +114,6 @@ public class Keyboard2 extends InputMethodService
|
||||
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
|
||||
_keyboardView.reset();
|
||||
Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs));
|
||||
ClipboardHistoryService.on_startup(this, _keyeventhandler);
|
||||
}
|
||||
|
||||
private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm)
|
||||
@@ -136,9 +135,13 @@ public class Keyboard2 extends InputMethodService
|
||||
return ExtraKeys.EMPTY;
|
||||
}
|
||||
|
||||
private void refreshAccentsOption(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes)
|
||||
@TargetApi(12)
|
||||
private void refreshAccentsOption(InputMethodManager imm, InputMethodSubtype subtype)
|
||||
{
|
||||
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
|
||||
List<ExtraKeys> extra_keys = new ArrayList<ExtraKeys>();
|
||||
// Gather extra keys from all enabled subtypes
|
||||
extra_keys.add(extra_keys_of_subtype(subtype));
|
||||
for (InputMethodSubtype s : enabled_subtypes)
|
||||
extra_keys.add(extra_keys_of_subtype(s));
|
||||
_config.extra_keys_subtype = ExtraKeys.merge(extra_keys);
|
||||
@@ -149,20 +152,6 @@ public class Keyboard2 extends InputMethodService
|
||||
return (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
|
||||
}
|
||||
|
||||
@TargetApi(12)
|
||||
private InputMethodSubtype defaultSubtypes(InputMethodManager imm, List<InputMethodSubtype> enabled_subtypes)
|
||||
{
|
||||
if (VERSION.SDK_INT < 24)
|
||||
return imm.getCurrentInputMethodSubtype();
|
||||
// Android might return a random subtype, for example, the first in the
|
||||
// list alphabetically.
|
||||
InputMethodSubtype current_subtype = imm.getCurrentInputMethodSubtype();
|
||||
for (InputMethodSubtype s : enabled_subtypes)
|
||||
if (s.getLanguageTag().equals(current_subtype.getLanguageTag()))
|
||||
return s;
|
||||
return null;
|
||||
}
|
||||
|
||||
private void refreshSubtypeImm()
|
||||
{
|
||||
InputMethodManager imm = get_imm();
|
||||
@@ -171,14 +160,13 @@ public class Keyboard2 extends InputMethodService
|
||||
_config.extra_keys_subtype = null;
|
||||
if (VERSION.SDK_INT >= 12)
|
||||
{
|
||||
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
|
||||
InputMethodSubtype subtype = defaultSubtypes(imm, enabled_subtypes);
|
||||
InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype();
|
||||
if (subtype != null)
|
||||
{
|
||||
String s = subtype.getExtraValueOf("default_layout");
|
||||
if (s != null)
|
||||
default_layout = LayoutsPreference.layout_of_string(getResources(), s);
|
||||
refreshAccentsOption(imm, enabled_subtypes);
|
||||
refreshAccentsOption(imm, subtype);
|
||||
}
|
||||
}
|
||||
if (default_layout == null)
|
||||
@@ -236,8 +224,6 @@ public class Keyboard2 extends InputMethodService
|
||||
{
|
||||
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
|
||||
_emojiPane = null;
|
||||
_clipboard_pane = null;
|
||||
setInputView(_keyboardView);
|
||||
}
|
||||
_keyboardView.reset();
|
||||
}
|
||||
@@ -360,6 +346,7 @@ public class Keyboard2 extends InputMethodService
|
||||
public void onSharedPreferenceChanged(SharedPreferences _prefs, String _key)
|
||||
{
|
||||
refresh_config();
|
||||
setInputView(_keyboardView);
|
||||
_keyboardView.setKeyboard(current_layout());
|
||||
}
|
||||
|
||||
@@ -398,14 +385,7 @@ public class Keyboard2 extends InputMethodService
|
||||
setInputView(_emojiPane);
|
||||
break;
|
||||
|
||||
case SWITCH_CLIPBOARD:
|
||||
if (_clipboard_pane == null)
|
||||
_clipboard_pane = (ViewGroup)inflate_view(R.layout.clipboard_pane);
|
||||
setInputView(_clipboard_pane);
|
||||
break;
|
||||
|
||||
case SWITCH_BACK_EMOJI:
|
||||
case SWITCH_BACK_CLIPBOARD:
|
||||
setInputView(_keyboardView);
|
||||
break;
|
||||
|
||||
|
@@ -3,7 +3,6 @@ package juloo.keyboard2;
|
||||
import android.content.Context;
|
||||
import android.content.ContextWrapper;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Insets;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
@@ -14,9 +13,6 @@ import android.util.DisplayMetrics;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowInsets;
|
||||
import android.view.WindowManager;
|
||||
import android.view.WindowMetrics;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class Keyboard2View extends View
|
||||
@@ -260,17 +256,6 @@ public class Keyboard2View extends View
|
||||
int height =
|
||||
(int)(_config.keyHeight * _keyboard.keysHeight
|
||||
+ _config.marginTop + _config.margin_bottom);
|
||||
// Compatibility with display cutouts and navigation on the right
|
||||
if (VERSION.SDK_INT >= 30)
|
||||
{
|
||||
WindowMetrics metrics =
|
||||
((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE))
|
||||
.getCurrentWindowMetrics();
|
||||
Insets insets = metrics.getWindowInsets().getInsetsIgnoringVisibility(
|
||||
WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()
|
||||
| WindowInsets.Type.displayCutout());
|
||||
width = metrics.getBounds().width() - insets.right - insets.left;
|
||||
}
|
||||
setMeasuredDimension(width, height);
|
||||
_keyWidth = (width - (_config.horizontal_margin * 2)) / _keyboard.keysWidth;
|
||||
}
|
||||
@@ -460,19 +445,15 @@ public class Keyboard2View extends View
|
||||
{
|
||||
boolean special_font = false;
|
||||
String indic;
|
||||
int indic_length;
|
||||
float text_size;
|
||||
if (k.indication != null)
|
||||
{
|
||||
indic = k.indication;
|
||||
indic_length = indic.length();
|
||||
text_size = keyH * _config.sublabelTextSize * _config.characterSize;
|
||||
}
|
||||
else if (k.anticircle != null)
|
||||
{
|
||||
indic = k.anticircle.getString();
|
||||
// 3 character limit like regular labels
|
||||
indic_length = Math.min(indic.length(), 3);
|
||||
special_font = k.anticircle.hasFlagsAny(KeyValue.FLAG_KEY_FONT);
|
||||
text_size = scaleTextSize(k.anticircle, _config.sublabelTextSize, keyH);
|
||||
}
|
||||
@@ -483,7 +464,8 @@ public class Keyboard2View extends View
|
||||
Paint p = _theme.indicationPaint(special_font);
|
||||
p.setColor(_theme.subLabelColor);
|
||||
p.setTextSize(text_size);
|
||||
canvas.drawText(indic, 0, indic_length,
|
||||
// Limit indication length to 3 characters
|
||||
canvas.drawText(indic, 0, Math.min(indic.length(), 3),
|
||||
x + keyW / 2f, (keyH - p.ascent() - p.descent()) * 4/5 + y, p);
|
||||
}
|
||||
|
||||
|
@@ -29,10 +29,6 @@ public final class KeyboardData
|
||||
public final String numpad_script;
|
||||
/** The [name] attribute. Might be null. */
|
||||
public final String name;
|
||||
/** Whether the bottom row should be added. */
|
||||
public final boolean bottom_row;
|
||||
/** Whether extra keys from [method.xml] should be added to this layout. */
|
||||
public final boolean locale_extra_keys;
|
||||
/** Position of every keys on the layout, see [getKeys()]. */
|
||||
private Map<KeyValue, KeyPos> _key_pos = null;
|
||||
|
||||
@@ -69,17 +65,9 @@ public final class KeyboardData
|
||||
if (pos.next_to != null)
|
||||
{
|
||||
KeyPos next_to_pos = getKeys().get(pos.next_to);
|
||||
// Use preferred direction if some preferred pos match
|
||||
if (next_to_pos != null)
|
||||
{
|
||||
for (KeyPos p : pos.positions)
|
||||
if ((p.row == -1 || p.row == next_to_pos.row)
|
||||
&& (p.col == -1 || p.col == next_to_pos.col)
|
||||
&& add_key_to_pos(rows, kv, next_to_pos.with_dir(p.dir)))
|
||||
return true;
|
||||
if (add_key_to_pos(rows, kv, next_to_pos.with_dir(-1)))
|
||||
return true;
|
||||
}
|
||||
if (next_to_pos != null
|
||||
&& add_key_to_pos(rows, kv, next_to_pos.with_dir(-1)))
|
||||
return true;
|
||||
}
|
||||
for (KeyPos p : pos.positions)
|
||||
if (add_key_to_pos(rows, kv, p))
|
||||
@@ -94,13 +82,13 @@ public final class KeyboardData
|
||||
boolean add_key_to_pos(List<Row> rows, KeyValue kv, KeyPos p)
|
||||
{
|
||||
int i_row = p.row;
|
||||
int i_row_end = Math.min(p.row, rows.size() - 1);
|
||||
int i_row_end = Math.min(p.row, rows.size());
|
||||
if (p.row == -1) { i_row = 0; i_row_end = rows.size() - 1; }
|
||||
for (; i_row <= i_row_end; i_row++)
|
||||
{
|
||||
Row row = rows.get(i_row);
|
||||
int i_col = p.col;
|
||||
int i_col_end = Math.min(p.col, row.keys.size() - 1);
|
||||
int i_col_end = p.col;
|
||||
if (p.col == -1) { i_col = 0; i_col_end = row.keys.size() - 1; }
|
||||
for (; i_col <= i_col_end; i_col++)
|
||||
{
|
||||
@@ -144,12 +132,10 @@ public final class KeyboardData
|
||||
return new KeyboardData(this, extendedRows);
|
||||
}
|
||||
|
||||
/** Insert the given row at the given indice. The row is scaled so that the
|
||||
keys already on the keyboard don't change width. */
|
||||
public KeyboardData insert_row(Row row, int i)
|
||||
public KeyboardData addTopRow(Row row)
|
||||
{
|
||||
ArrayList<Row> rows_ = new ArrayList<Row>(this.rows);
|
||||
rows_.add(i, row.updateWidth(keysWidth));
|
||||
rows_.add(0, row.updateWidth(keysWidth));
|
||||
return new KeyboardData(this, rows_);
|
||||
}
|
||||
|
||||
@@ -173,21 +159,23 @@ public final class KeyboardData
|
||||
return _key_pos;
|
||||
}
|
||||
|
||||
public static Row bottom_row;
|
||||
public static Row number_row;
|
||||
public static KeyboardData num_pad;
|
||||
private static Map<Integer, KeyboardData> _layoutCache = new HashMap<Integer, KeyboardData>();
|
||||
|
||||
public static Row load_bottom_row(Resources res) throws Exception
|
||||
public static void init(Resources res)
|
||||
{
|
||||
return parse_row(res.getXml(R.xml.bottom_row));
|
||||
}
|
||||
|
||||
public static Row load_number_row(Resources res) throws Exception
|
||||
{
|
||||
return parse_row(res.getXml(R.xml.number_row));
|
||||
}
|
||||
|
||||
public static KeyboardData load_num_pad(Resources res) throws Exception
|
||||
{
|
||||
return parse_keyboard(res.getXml(R.xml.numpad));
|
||||
try
|
||||
{
|
||||
bottom_row = parse_row(res.getXml(R.xml.bottom_row));
|
||||
number_row = parse_row(res.getXml(R.xml.number_row));
|
||||
num_pad = parse_keyboard(res.getXml(R.xml.numpad));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/** Load a layout from a resource ID. Returns [null] on error. */
|
||||
@@ -237,17 +225,12 @@ public final class KeyboardData
|
||||
{
|
||||
if (!expect_tag(parser, "keyboard"))
|
||||
throw error(parser, "Expected tag <keyboard>");
|
||||
boolean bottom_row = attribute_bool(parser, "bottom_row", true);
|
||||
boolean locale_extra_keys = attribute_bool(parser, "locale_extra_keys", true);
|
||||
boolean add_bottom_row = attribute_bool(parser, "bottom_row", true);
|
||||
float specified_kw = attribute_float(parser, "width", 0f);
|
||||
String script = parser.getAttributeValue(null, "script");
|
||||
if (script != null && script.equals(""))
|
||||
throw error(parser, "'script' attribute cannot be empty");
|
||||
String numpad_script = parser.getAttributeValue(null, "numpad_script");
|
||||
if (numpad_script == null)
|
||||
numpad_script = script;
|
||||
else if (numpad_script.equals(""))
|
||||
throw error(parser, "'numpad_script' attribute cannot be empty");
|
||||
String name = parser.getAttributeValue(null, "name");
|
||||
ArrayList<Row> rows = new ArrayList<Row>();
|
||||
Modmap modmap = null;
|
||||
@@ -259,8 +242,6 @@ public final class KeyboardData
|
||||
rows.add(Row.parse(parser));
|
||||
break;
|
||||
case "modmap":
|
||||
if (modmap != null)
|
||||
throw error(parser, "Multiple '<modmap>' are not allowed");
|
||||
modmap = Modmap.parse(parser);
|
||||
break;
|
||||
default:
|
||||
@@ -268,7 +249,9 @@ public final class KeyboardData
|
||||
}
|
||||
}
|
||||
float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows);
|
||||
return new KeyboardData(rows, kw, modmap, script, numpad_script, name, bottom_row, locale_extra_keys);
|
||||
if (add_bottom_row)
|
||||
rows.add(bottom_row.updateWidth(kw));
|
||||
return new KeyboardData(rows, kw, modmap, script, numpad_script, name);
|
||||
}
|
||||
|
||||
private static float compute_max_width(List<Row> rows)
|
||||
@@ -287,7 +270,7 @@ public final class KeyboardData
|
||||
}
|
||||
|
||||
protected KeyboardData(List<Row> rows_, float kw, Modmap mm, String sc,
|
||||
String npsc, String name_, boolean bottom_row_, boolean locale_extra_keys_)
|
||||
String npsc, String name_)
|
||||
{
|
||||
float kh = 0.f;
|
||||
for (Row r : rows_)
|
||||
@@ -297,17 +280,15 @@ public final class KeyboardData
|
||||
script = sc;
|
||||
numpad_script = npsc;
|
||||
name = name_;
|
||||
keysWidth = Math.max(kw, 1f);
|
||||
keysWidth = kw;
|
||||
keysHeight = kh;
|
||||
bottom_row = bottom_row_;
|
||||
locale_extra_keys = locale_extra_keys_;
|
||||
}
|
||||
|
||||
/** Copies the fields of a keyboard, with rows changed. */
|
||||
/** Copies the fields of an other keyboard, with rows changed. */
|
||||
protected KeyboardData(KeyboardData src, List<Row> rows)
|
||||
{
|
||||
this(rows, compute_max_width(rows), src.modmap, src.script,
|
||||
src.numpad_script, src.name, src.bottom_row, src.locale_extra_keys);
|
||||
src.numpad_script, src.name);
|
||||
}
|
||||
|
||||
public static class Row
|
||||
@@ -325,8 +306,8 @@ public final class KeyboardData
|
||||
float kw = 0.f;
|
||||
for (Key k : keys_) kw += k.width + k.shift;
|
||||
keys = keys_;
|
||||
height = Math.max(h, 0.5f);
|
||||
shift = Math.max(s, 0f);
|
||||
height = h;
|
||||
shift = s;
|
||||
keysWidth = kw;
|
||||
}
|
||||
|
||||
@@ -415,8 +396,8 @@ public final class KeyboardData
|
||||
keys = ks;
|
||||
anticircle = antic;
|
||||
keysflags = f;
|
||||
width = Math.max(w, 0f);
|
||||
shift = Math.max(s, 0f);
|
||||
width = w;
|
||||
shift = s;
|
||||
slider = sl;
|
||||
indication = i;
|
||||
}
|
||||
@@ -563,20 +544,18 @@ public final class KeyboardData
|
||||
{
|
||||
public final Map<KeyValue, KeyValue> shift;
|
||||
public final Map<KeyValue, KeyValue> fn;
|
||||
public final Map<KeyValue, KeyValue> ctrl;
|
||||
|
||||
public Modmap(Map<KeyValue, KeyValue> s, Map<KeyValue, KeyValue> f, Map<KeyValue, KeyValue> c)
|
||||
public Modmap(Map<KeyValue, KeyValue> s, Map<KeyValue, KeyValue> f)
|
||||
{
|
||||
shift = s;
|
||||
fn = f;
|
||||
ctrl = c;
|
||||
}
|
||||
|
||||
public static Modmap parse(XmlPullParser parser) throws Exception
|
||||
{
|
||||
HashMap<KeyValue, KeyValue> shift = new HashMap<KeyValue, KeyValue>();
|
||||
HashMap<KeyValue, KeyValue> fn = new HashMap<KeyValue, KeyValue>();
|
||||
HashMap<KeyValue, KeyValue> ctrl = new HashMap<KeyValue, KeyValue>();
|
||||
|
||||
while (next_tag(parser))
|
||||
{
|
||||
switch (parser.getName())
|
||||
@@ -587,15 +566,12 @@ public final class KeyboardData
|
||||
case "fn":
|
||||
parse_mapping(parser, fn);
|
||||
break;
|
||||
case "ctrl":
|
||||
parse_mapping(parser, ctrl);
|
||||
break;
|
||||
default:
|
||||
throw error(parser, "Expecting tag <shift> or <fn>, got <" + parser.getName() + ">");
|
||||
}
|
||||
}
|
||||
|
||||
return new Modmap(shift, fn, ctrl);
|
||||
return new Modmap(shift, fn);
|
||||
}
|
||||
|
||||
private static void parse_mapping(XmlPullParser parser, Map<KeyValue, KeyValue> dst) throws Exception
|
||||
@@ -631,7 +607,6 @@ public final class KeyboardData
|
||||
/** See [addExtraKeys()]. */
|
||||
public final static class PreferredPos
|
||||
{
|
||||
/** Default position for extra keys. */
|
||||
public static final PreferredPos DEFAULT;
|
||||
public static final PreferredPos ANYWHERE;
|
||||
|
||||
@@ -646,9 +621,6 @@ public final class KeyboardData
|
||||
public KeyPos[] positions = ANYWHERE_POSITIONS;
|
||||
|
||||
public PreferredPos() {}
|
||||
public PreferredPos(KeyValue next_to_) { next_to = next_to_; }
|
||||
public PreferredPos(KeyPos[] pos) { positions = pos; }
|
||||
public PreferredPos(KeyValue next_to_, KeyPos[] pos) { next_to = next_to_; positions = pos; }
|
||||
|
||||
public PreferredPos(PreferredPos src)
|
||||
{
|
||||
@@ -661,12 +633,13 @@ public final class KeyboardData
|
||||
|
||||
static
|
||||
{
|
||||
DEFAULT = new PreferredPos(new KeyPos[]{
|
||||
new KeyPos(1, -1, 4),
|
||||
new KeyPos(1, -1, 3),
|
||||
new KeyPos(2, -1, 2),
|
||||
new KeyPos(2, -1, 1)
|
||||
});
|
||||
DEFAULT = new PreferredPos();
|
||||
DEFAULT.positions = new KeyPos[]{
|
||||
new KeyPos(1, -1, 4),
|
||||
new KeyPos(1, -1, 3),
|
||||
new KeyPos(2, -1, 2),
|
||||
new KeyPos(2, -1, 1)
|
||||
};
|
||||
ANYWHERE = new PreferredPos();
|
||||
}
|
||||
}
|
||||
|
@@ -28,6 +28,7 @@ public class LauncherActivity extends Activity
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.launcher_activity);
|
||||
_intro_video = (VideoView)findViewById(R.id.launcher_intro_video);
|
||||
@@ -38,26 +39,21 @@ public class LauncherActivity extends Activity
|
||||
this.new Tryhere_OnUnhandledKeyEventListener());
|
||||
setup_intro_video(_intro_video);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean onCreateOptionsMenu(Menu menu)
|
||||
{
|
||||
public final boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.launcher_menu, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean onOptionsItemSelected(MenuItem item)
|
||||
{
|
||||
if (item.getItemId() == R.id.btnLaunchSettingsActivity)
|
||||
{
|
||||
public final boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == R.id.btnLaunchSettingsActivity) {
|
||||
Intent intent = new Intent(LauncherActivity.this, SettingsActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
public void launch_imesettings(View _btn)
|
||||
{
|
||||
startActivity(new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS));
|
||||
@@ -117,7 +113,7 @@ public class LauncherActivity extends Activity
|
||||
String kc = KeyEvent.keyCodeToString(ev.getKeyCode());
|
||||
s.append(kc.replaceFirst("^KEYCODE_", ""));
|
||||
_tryhere_text.setText(s.toString());
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,38 +0,0 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View.MeasureSpec;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ListView;
|
||||
|
||||
/** A non-scrollable list view that can be embedded in a bigger ScrollView.
|
||||
Credits to Dedaniya HirenKumar in
|
||||
https://stackoverflow.com/questions/18813296/non-scrollable-listview-inside-scrollview */
|
||||
public class NonScrollListView extends ListView
|
||||
{
|
||||
public NonScrollListView(Context context)
|
||||
{
|
||||
super(context);
|
||||
}
|
||||
|
||||
public NonScrollListView(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public NonScrollListView(Context context, AttributeSet attrs, int defStyle)
|
||||
{
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
|
||||
{
|
||||
int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
|
||||
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
|
||||
ViewGroup.LayoutParams params = getLayoutParams();
|
||||
params.height = getMeasuredHeight();
|
||||
}
|
||||
}
|
@@ -24,14 +24,14 @@ public final class Pointers implements Handler.Callback
|
||||
/** Can't be locked, even when long pressing. */
|
||||
public static final int FLAG_P_CANT_LOCK = (1 << 7);
|
||||
|
||||
private Handler _longpress_handler;
|
||||
private Handler _keyrepeat_handler;
|
||||
private ArrayList<Pointer> _ptrs = new ArrayList<Pointer>();
|
||||
private IPointerEventHandler _handler;
|
||||
private Config _config;
|
||||
|
||||
public Pointers(IPointerEventHandler h, Config c)
|
||||
{
|
||||
_longpress_handler = new Handler(this);
|
||||
_keyrepeat_handler = new Handler(this);
|
||||
_handler = h;
|
||||
_config = c;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ public final class Pointers implements Handler.Callback
|
||||
public void clear()
|
||||
{
|
||||
for (Pointer p : _ptrs)
|
||||
stopLongPress(p);
|
||||
stopKeyRepeat(p);
|
||||
_ptrs.clear();
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ public final class Pointers implements Handler.Callback
|
||||
ptr.sliding.onTouchUp(ptr);
|
||||
return;
|
||||
}
|
||||
stopLongPress(ptr);
|
||||
stopKeyRepeat(ptr);
|
||||
KeyValue ptr_value = ptr.value;
|
||||
if (ptr.gesture != null && ptr.gesture.is_in_progress())
|
||||
{
|
||||
@@ -206,7 +206,7 @@ public final class Pointers implements Handler.Callback
|
||||
KeyValue value = _handler.modifyKey(key.keys[0], mods);
|
||||
Pointer ptr = new Pointer(pointerId, key, value, x, y, mods);
|
||||
_ptrs.add(ptr);
|
||||
startLongPress(ptr);
|
||||
startKeyRepeat(ptr);
|
||||
_handler.onPointerDown(value, false);
|
||||
}
|
||||
|
||||
@@ -308,12 +308,13 @@ public final class Pointers implements Handler.Callback
|
||||
{ // Gesture changed state
|
||||
if (!ptr.gesture.is_in_progress())
|
||||
{ // Gesture ended
|
||||
stopKeyRepeat(ptr);
|
||||
_handler.onPointerFlagsChanged(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ptr.value = apply_gesture(ptr, ptr.gesture.get_gesture());
|
||||
restartLongPress(ptr);
|
||||
restartKeyRepeat(ptr);
|
||||
ptr.flags = 0; // Special behaviors are ignored during a gesture.
|
||||
}
|
||||
}
|
||||
@@ -382,7 +383,7 @@ public final class Pointers implements Handler.Callback
|
||||
|
||||
// Key repeat
|
||||
|
||||
/** Message from [_longpress_handler]. */
|
||||
/** Message from [_keyrepeat_handler]. */
|
||||
@Override
|
||||
public boolean handleMessage(Message msg)
|
||||
{
|
||||
@@ -390,7 +391,11 @@ public final class Pointers implements Handler.Callback
|
||||
{
|
||||
if (ptr.timeoutWhat == msg.what)
|
||||
{
|
||||
handleLongPress(ptr);
|
||||
if (handleKeyRepeat(ptr))
|
||||
_keyrepeat_handler.sendEmptyMessageDelayed(msg.what,
|
||||
_config.longPressInterval);
|
||||
else
|
||||
ptr.timeoutWhat = -1;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -399,62 +404,60 @@ public final class Pointers implements Handler.Callback
|
||||
|
||||
private static int uniqueTimeoutWhat = 0;
|
||||
|
||||
private void startLongPress(Pointer ptr)
|
||||
private void startKeyRepeat(Pointer ptr)
|
||||
{
|
||||
int what = (uniqueTimeoutWhat++);
|
||||
ptr.timeoutWhat = what;
|
||||
_longpress_handler.sendEmptyMessageDelayed(what, _config.longPressTimeout);
|
||||
_keyrepeat_handler.sendEmptyMessageDelayed(what, _config.longPressTimeout);
|
||||
}
|
||||
|
||||
private void stopLongPress(Pointer ptr)
|
||||
private void stopKeyRepeat(Pointer ptr)
|
||||
{
|
||||
_longpress_handler.removeMessages(ptr.timeoutWhat);
|
||||
if (ptr.timeoutWhat != -1)
|
||||
{
|
||||
_keyrepeat_handler.removeMessages(ptr.timeoutWhat);
|
||||
ptr.timeoutWhat = -1;
|
||||
}
|
||||
}
|
||||
|
||||
private void restartLongPress(Pointer ptr)
|
||||
private void restartKeyRepeat(Pointer ptr)
|
||||
{
|
||||
stopLongPress(ptr);
|
||||
startLongPress(ptr);
|
||||
stopKeyRepeat(ptr);
|
||||
startKeyRepeat(ptr);
|
||||
}
|
||||
|
||||
/** A pointer is long pressing. */
|
||||
private void handleLongPress(Pointer ptr)
|
||||
/** A pointer is repeating. Returns [true] if repeat should continue. */
|
||||
private boolean handleKeyRepeat(Pointer ptr)
|
||||
{
|
||||
// Long press toggle lock on modifiers
|
||||
if ((ptr.flags & FLAG_P_LATCHABLE) != 0)
|
||||
{
|
||||
if (!ptr.hasFlagsAny(FLAG_P_CANT_LOCK))
|
||||
lockPointer(ptr, true);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
// Latched key, no key
|
||||
// Stop repeating: Latched key, no key
|
||||
if (ptr.hasFlagsAny(FLAG_P_LATCHED) || ptr.value == null)
|
||||
return;
|
||||
// Key is long-pressable
|
||||
return false;
|
||||
KeyValue kv = KeyModifier.modify_long_press(ptr.value);
|
||||
if (!kv.equals(ptr.value))
|
||||
{
|
||||
ptr.value = kv;
|
||||
_handler.onPointerDown(kv, true);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
// Special keys
|
||||
// Stop repeating: Special keys
|
||||
if (kv.hasFlagsAny(KeyValue.FLAG_SPECIAL))
|
||||
return;
|
||||
// For every other keys, key-repeat
|
||||
if (_config.keyrepeat_enabled)
|
||||
{
|
||||
_handler.onPointerHold(kv, ptr.modifiers);
|
||||
_longpress_handler.sendEmptyMessageDelayed(ptr.timeoutWhat,
|
||||
_config.longPressInterval);
|
||||
}
|
||||
return false;
|
||||
_handler.onPointerHold(kv, ptr.modifiers);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Sliding
|
||||
|
||||
void startSliding(Pointer ptr, float x)
|
||||
{
|
||||
stopLongPress(ptr);
|
||||
stopKeyRepeat(ptr);
|
||||
ptr.flags |= FLAG_P_SLIDING;
|
||||
ptr.sliding = new Sliding(x);
|
||||
}
|
||||
|
@@ -24,7 +24,6 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
"meta",
|
||||
"compose",
|
||||
"voice_typing",
|
||||
"switch_clipboard",
|
||||
"accent_aigu",
|
||||
"accent_grave",
|
||||
"accent_double_aigu",
|
||||
@@ -50,8 +49,6 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
"†",
|
||||
"ª",
|
||||
"º",
|
||||
"tab",
|
||||
"esc",
|
||||
"page_up",
|
||||
"page_down",
|
||||
"home",
|
||||
@@ -69,9 +66,6 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
"redo",
|
||||
"superscript",
|
||||
"subscript",
|
||||
"f11_placeholder",
|
||||
"f12_placeholder",
|
||||
"menu",
|
||||
};
|
||||
|
||||
/** Whether an extra key is enabled by default. */
|
||||
@@ -81,12 +75,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
{
|
||||
case "voice_typing":
|
||||
case "change_method":
|
||||
case "switch_clipboard":
|
||||
case "compose":
|
||||
case "tab":
|
||||
case "esc":
|
||||
case "f11_placeholder":
|
||||
case "f12_placeholder":
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@@ -120,47 +109,12 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
case "voice_typing": id = R.string.key_descr_voice_typing; break;
|
||||
case "ª": id = R.string.key_descr_ª; break;
|
||||
case "º": id = R.string.key_descr_º; break;
|
||||
case "switch_clipboard": id = R.string.key_descr_clipboard; break;
|
||||
}
|
||||
if (id == 0)
|
||||
return null;
|
||||
return res.getString(id);
|
||||
}
|
||||
|
||||
static String key_title(String key_name, KeyValue kv)
|
||||
{
|
||||
switch (key_name)
|
||||
{
|
||||
case "f11_placeholder": return "F11";
|
||||
case "f12_placeholder": return "F12";
|
||||
}
|
||||
return kv.getString();
|
||||
}
|
||||
|
||||
static KeyboardData.PreferredPos key_preferred_pos(String key_name)
|
||||
{
|
||||
switch (key_name)
|
||||
{
|
||||
case "f11_placeholder":
|
||||
return new KeyboardData.PreferredPos(KeyValue.getKeyByName("9"),
|
||||
new KeyboardData.KeyPos[]{
|
||||
new KeyboardData.KeyPos(0, 8, 3),
|
||||
new KeyboardData.KeyPos(0, 8, 4),
|
||||
new KeyboardData.KeyPos(0, -1, 3),
|
||||
new KeyboardData.KeyPos(0, -1, 4),
|
||||
});
|
||||
case "f12_placeholder":
|
||||
return new KeyboardData.PreferredPos(KeyValue.getKeyByName("0"),
|
||||
new KeyboardData.KeyPos[]{
|
||||
new KeyboardData.KeyPos(0, 9, 3),
|
||||
new KeyboardData.KeyPos(0, 9, 4),
|
||||
new KeyboardData.KeyPos(0, -1, 3),
|
||||
new KeyboardData.KeyPos(0, -1, 4),
|
||||
});
|
||||
}
|
||||
return KeyboardData.PreferredPos.DEFAULT;
|
||||
}
|
||||
|
||||
/** Get the set of enabled extra keys. */
|
||||
public static Map<KeyValue, KeyboardData.PreferredPos> get_extra_keys(SharedPreferences prefs)
|
||||
{
|
||||
@@ -170,7 +124,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
{
|
||||
if (prefs.getBoolean(pref_key_of_key_name(key_name),
|
||||
default_checked(key_name)))
|
||||
ks.put(KeyValue.getKeyByName(key_name), key_preferred_pos(key_name));
|
||||
ks.put(KeyValue.getKeyByName(key_name), KeyboardData.PreferredPos.DEFAULT);
|
||||
}
|
||||
return ks;
|
||||
}
|
||||
@@ -208,7 +162,7 @@ public class ExtraKeysPreference extends PreferenceCategory
|
||||
{
|
||||
super(ctx);
|
||||
KeyValue kv = KeyValue.getKeyByName(key_name);
|
||||
String title = key_title(key_name, kv);
|
||||
String title = kv.getString();
|
||||
String descr = key_description(ctx.getResources(), key_name);
|
||||
if (descr != null)
|
||||
title += " (" + descr + ")";
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Arabic Alt" script="arabic" numpad_script="hindu-arabic">
|
||||
<row>
|
||||
<key key0="ض" key2="١" key3="`" key4="loc esc"/>
|
||||
<key key0="ض" key2="١" key3="`" key4="esc"/>
|
||||
<key key0="ص" key2="٢" key3="\@"/>
|
||||
<key key0="ث" key2="٣" key3="\#"/>
|
||||
<key key0="ق" key2="٤" key3="$"/>
|
||||
@@ -14,7 +14,7 @@
|
||||
<key key0="ج"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ش" key4="loc tab"/>
|
||||
<key key0="ش" key4="tab"/>
|
||||
<key key0="س"/>
|
||||
<key key0="ي"/>
|
||||
<key key0="ب"/>
|
||||
|
@@ -14,7 +14,7 @@
|
||||
<key key0="ج"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ش" key1="َ" key2="loc tab"/>
|
||||
<key key0="ش" key1="َ" key2="tab"/>
|
||||
<key key0="س" key1="ُ"/>
|
||||
<key key0="ی" key4="ئ"/>
|
||||
<key key0="ب" key1="ّ"/>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Arabic PC" script="arabic">
|
||||
<row>
|
||||
<key key0="ض" key1="َ" key2="1" key3="`" key4="loc esc"/>
|
||||
<key key0="ض" key1="َ" key2="1" key3="`" key4="esc"/>
|
||||
<key key0="ص" key1="ً" key2="2" key3="\@"/>
|
||||
<key key0="ث" key1="ُ" key2="3" key3="\#" key4="loc €"/>
|
||||
<key key0="ق" key1="ٌ" key2="4" key3="$" key4="loc £"/>
|
||||
@@ -11,12 +11,12 @@
|
||||
<key key0="ه" key1="÷" key2="8" key3="*"/>
|
||||
<key key0="خ" key1="×" key2="9" key3="("/>
|
||||
<key key0="ح" key1="؛" key2="0" key3=")"/>
|
||||
<key key0="ج" key1=">" key2="-" key3="_"/>
|
||||
<key key0="د" key1="<" key2="=" key3="ذ"/>
|
||||
<key key0="ج" key1=">" key2="-" key3="_" key4="f11_placeholder"/>
|
||||
<key key0="د" key1="<" key2="=" key3="ذ" key4="f12_placeholder"/>
|
||||
<!-- <key key0="ذ" key1="ّ" key3="\\" key4="|"/> -->
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ش" key1="ِ" key4="loc tab"/>
|
||||
<key shift="0.5" key0="ش" key1="ِ" key4="tab"/>
|
||||
<key key0="س" key1="ٍ"/>
|
||||
<key key0="ي" key1="["/>
|
||||
<key key0="ب" key1="]"/>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Kurdish (کوردی)" script="arabic" numpad_script="hindu-arabic">
|
||||
<row>
|
||||
<key key0="ق" key1="ٯ" key2="١" key3="loc esc"/>
|
||||
<key key0="ق" key1="ٯ" key2="١" key3="esc"/>
|
||||
<key key0="و" key1="وو" key2="٢" key3="\@"/>
|
||||
<key key0="ە" key1="ة" key2="٣" key3="\#" />
|
||||
<key key0="ر" key1="ڕ" key2="٤" key3="$"/>
|
||||
@@ -13,7 +13,7 @@
|
||||
<key key0="پ" key1="ث" key2="٠"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ا" key1="أ" key2="loc tab"/>
|
||||
<key key0="ا" key1="أ" key2="tab"/>
|
||||
<key key0="س" key1="ص"/>
|
||||
<key key0="ش" key1="ض"/>
|
||||
<key key0="د" key1="ذ" key2="ۮ"/>
|
||||
@@ -34,6 +34,6 @@
|
||||
<key key0="ب"/>
|
||||
<key key0="ن" key2="،" key3="؛"/>
|
||||
<key key0="م"/>
|
||||
<key key0="backspace" key2="delete"/>
|
||||
<key key0="backspace" key2="delete" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Arabic PC (Hindu numerals)" script="arabic" numpad_script="hindu-arabic">
|
||||
<row>
|
||||
<key key0="ض" key1="َ" key2="١" key3="`" key4="loc esc"/>
|
||||
<key key0="ض" key1="َ" key2="١" key3="`" key4="esc"/>
|
||||
<key key0="ص" key1="ً" key2="٢" key3="\@"/>
|
||||
<key key0="ث" key1="ُ" key2="٣" key3="\#" key4="loc €"/>
|
||||
<key key0="ق" key1="ٌ" key2="٤" key3="$" key4="loc £"/>
|
||||
@@ -11,12 +11,12 @@
|
||||
<key key0="ه" key1="÷" key2="٨" key3="*"/>
|
||||
<key key0="خ" key1="×" key2="٩" key3="("/>
|
||||
<key key0="ح" key1="؛" key2="٠" key3=")"/>
|
||||
<key key0="ج" key1=">" key2="-" key3="_"/>
|
||||
<key key0="د" key1="<" key2="=" key3="ذ"/>
|
||||
<key key0="ج" key1=">" key2="-" key3="_" key4="f11_placeholder"/>
|
||||
<key key0="د" key1="<" key2="=" key3="ذ" key4="f12_placeholder"/>
|
||||
<!-- <key key0="ذ" key1="ّ" key3="\\" key4="|"/> -->
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ش" key1="ِ" key4="loc tab"/>
|
||||
<key shift="0.5" key0="ش" key1="ِ" key4="tab"/>
|
||||
<key key0="س" key1="ٍ"/>
|
||||
<key key0="ي" key1="["/>
|
||||
<key key0="ب" key1="]"/>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="Persian PC" script="persian">
|
||||
<row>
|
||||
<key key0="ض" key2="۱" key4="loc esc"/>
|
||||
<key key0="ض" key2="۱" key4="esc"/>
|
||||
<key key0="ص" key2="۲" key1="~" key3="\@"/>
|
||||
<key key0="ث" key2="۳" key1="!" key3="\#"/>
|
||||
<key key0="ق" key2="۴" key1="﷼" key3="$"/>
|
||||
@@ -11,23 +11,23 @@
|
||||
<key key0="ه" key2="۸" key3="*"/>
|
||||
<key key0="خ" key2="۹" key3="(" key4=")"/>
|
||||
<key key0="ح" key2="۰"/>
|
||||
<key key0="ج" key2="چ"/>
|
||||
<key key0="ج" key1="f11_placeholder" key3="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ش" key2="loc tab"/>
|
||||
<key key0="ش" key2="tab"/>
|
||||
<key key0="س"/>
|
||||
<key key0="ی" key2="ئ"/>
|
||||
<key key0="ب"/>
|
||||
<key key0="ل"/>
|
||||
<key key0="ا" key1="آ" key4="ء" key2="-" key3="_"/>
|
||||
<key key0="ت" key1="halfspace" key2="+"/>
|
||||
<key key0="ت" key1="‌" key2="+"/>
|
||||
<key key0="ن"/>
|
||||
<key key0="م"/>
|
||||
<key key0="ک"/>
|
||||
<key key0="گ"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ظ"/>
|
||||
<key key0="ظ"/>
|
||||
<key key0="ط"/>
|
||||
<key key0="ز" key2="«"/>
|
||||
<key key0="ر" key2="»"/>
|
||||
@@ -36,6 +36,7 @@
|
||||
<key key0="د" key2="؛"/>
|
||||
<key key0="پ" key2="؟"/>
|
||||
<key key0="و"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
<key key0="چ"/>
|
||||
<key width="1.0" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
@@ -13,7 +13,7 @@
|
||||
<key key0="ծ" key2="0"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ք" key4="loc esc"/>
|
||||
<key key0="ք" key4="esc"/>
|
||||
<key key0="ո"/>
|
||||
<key key0="ե" key1="և"/>
|
||||
<key key0="ռ"/>
|
||||
@@ -25,7 +25,7 @@
|
||||
<key key0="պ"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="ա" key1="loc tab" key2="`"/>
|
||||
<key key0="ա" key1="tab" key2="`"/>
|
||||
<key key0="ս"/>
|
||||
<key key0="դ"/>
|
||||
<key key0="ֆ"/>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard name="বাংলা (জাতীয়)" script="bengali">
|
||||
<row>
|
||||
<key key0="ঙ" key2="ং" key3="loc esc" key4="১"/>
|
||||
<key key0="ঙ" key2="ং" key3="esc" key4="১"/>
|
||||
<key key0="য" key2="য়" key3="¶" key4="২"/>
|
||||
<key key0="ড" key2="ঢ" key3="π" key4="৩"/>
|
||||
<key key0="প" key2="ফ" key3="√" key4="৪"/>
|
||||
@@ -13,7 +13,7 @@
|
||||
<key key0="ড়" key2="ঢ়" key3="-" key4="০"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ৃ" key1="ৠ" key2="ঋ" key3="loc tab" key4="র্"/>
|
||||
<key shift="0.5" key0="ৃ" key1="ৠ" key2="ঋ" key3="tab" key4="র্"/>
|
||||
<key key0="ু" key1="ঊ" key2="উ" key3="~" key4="ূ"/>
|
||||
<key key0="ি" key1="ঈ" key2="ই" key3="•" key4="ী"/>
|
||||
<key key0="া" key1="ৄ" key2="আ" key3="°" key4="অ"/>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user