zxcvbn 0.1.0 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +34 -2
- data/.travis.yml +1 -1
- data/CHANGELOG.md +5 -1
- data/Gemfile +9 -4
- data/Gemfile.lock +26 -1
- data/README.md +36 -36
- data/bin/console +5 -2
- data/lib/zxcvbn.rb +7 -9
- data/lib/zxcvbn/adjacency_graphs.rb +228 -224
- data/lib/zxcvbn/feedback.rb +68 -70
- data/lib/zxcvbn/frequency_lists.rb +9 -7
- data/lib/zxcvbn/matching.rb +244 -267
- data/lib/zxcvbn/scoring.rb +154 -168
- data/lib/zxcvbn/time_estimates.rb +18 -20
- data/lib/zxcvbn/version.rb +1 -1
- data/zxcvbn.gemspec +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50df44a0d9bdff1e7b99f5ef1fac71d95a5bc23bf1d01d302bd23a8d6e027d1e
|
4
|
+
data.tar.gz: 4f7c36d4c57b193b72b4964e002931cf665851b8bfb13ccfd7b0f7ea74773840
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7210bdcd7b53a785cdc046b6886ba99f02da09905638eacf4f8acbebbd7c3f4e57121f9bf9e49650c2aae2c1b1a782bc7736edfc378ca40d2a5082ce4682133d
|
7
|
+
data.tar.gz: 600e750ee98acd0c1fa070cdf7144324165a894eb42eeff336e5e59d57be8e8c08fe06f9bb70ef5827208077febe0039783d5ef16aecde2eb4458fffa7594eaa
|
data/.rubocop.yml
CHANGED
@@ -1,5 +1,31 @@
|
|
1
1
|
AllCops:
|
2
2
|
TargetRubyVersion: 2.5
|
3
|
+
NewCops: enable
|
4
|
+
SuggestExtensions: false
|
5
|
+
|
6
|
+
Layout/EndAlignment:
|
7
|
+
EnforcedStyleAlignWith: start_of_line
|
8
|
+
|
9
|
+
Layout/LineLength:
|
10
|
+
Max: 120
|
11
|
+
|
12
|
+
Lint/UnderscorePrefixedVariableName:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
Metrics:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Naming/VariableNumber:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Style/Documentation:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
Style/Next:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
Style/NumericPredicate:
|
28
|
+
Enabled: false
|
3
29
|
|
4
30
|
Style/StringLiterals:
|
5
31
|
Enabled: true
|
@@ -9,5 +35,11 @@ Style/StringLiteralsInInterpolation:
|
|
9
35
|
Enabled: true
|
10
36
|
EnforcedStyle: double_quotes
|
11
37
|
|
12
|
-
|
13
|
-
|
38
|
+
Style/NegatedIf:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Style/SymbolArray:
|
42
|
+
Enabled: false
|
43
|
+
|
44
|
+
Style/WordArray:
|
45
|
+
Enabled: false
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -5,8 +5,13 @@ source "https://rubygems.org"
|
|
5
5
|
# Specify your gem's dependencies in zxcvbn.gemspec
|
6
6
|
gemspec
|
7
7
|
|
8
|
-
|
8
|
+
group :development do
|
9
|
+
gem "mini_racer"
|
10
|
+
gem "rake", "~> 13.0"
|
11
|
+
gem "rspec", "~> 3.0"
|
12
|
+
gem "rubocop", "~> 1.7"
|
9
13
|
|
10
|
-
gem "
|
11
|
-
|
12
|
-
gem "
|
14
|
+
gem "pry"
|
15
|
+
gem "pry-byebug"
|
16
|
+
gem "simplecov", require: false
|
17
|
+
end
|
data/Gemfile.lock
CHANGED
@@ -1,16 +1,30 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
zxcvbn (0.1.
|
4
|
+
zxcvbn (0.1.5)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
ast (2.4.2)
|
10
|
+
byebug (11.1.3)
|
11
|
+
coderay (1.1.3)
|
10
12
|
diff-lcs (1.4.4)
|
13
|
+
docile (1.4.0)
|
14
|
+
libv8-node (15.14.0.1-x86_64-darwin-19)
|
15
|
+
libv8-node (15.14.0.1-x86_64-linux)
|
16
|
+
method_source (1.0.0)
|
17
|
+
mini_racer (0.4.0)
|
18
|
+
libv8-node (~> 15.14.0.0)
|
11
19
|
parallel (1.20.1)
|
12
20
|
parser (3.0.1.1)
|
13
21
|
ast (~> 2.4.1)
|
22
|
+
pry (0.14.1)
|
23
|
+
coderay (~> 1.1)
|
24
|
+
method_source (~> 1.0)
|
25
|
+
pry-byebug (3.8.0)
|
26
|
+
byebug (~> 11.0)
|
27
|
+
pry (~> 0.10)
|
14
28
|
rainbow (3.0.0)
|
15
29
|
rake (13.0.3)
|
16
30
|
regexp_parser (2.1.1)
|
@@ -40,15 +54,26 @@ GEM
|
|
40
54
|
rubocop-ast (1.5.0)
|
41
55
|
parser (>= 3.0.1.1)
|
42
56
|
ruby-progressbar (1.11.0)
|
57
|
+
simplecov (0.21.2)
|
58
|
+
docile (~> 1.1)
|
59
|
+
simplecov-html (~> 0.11)
|
60
|
+
simplecov_json_formatter (~> 0.1)
|
61
|
+
simplecov-html (0.12.3)
|
62
|
+
simplecov_json_formatter (0.1.3)
|
43
63
|
unicode-display_width (2.0.0)
|
44
64
|
|
45
65
|
PLATFORMS
|
46
66
|
x86_64-darwin-19
|
67
|
+
x86_64-linux
|
47
68
|
|
48
69
|
DEPENDENCIES
|
70
|
+
mini_racer
|
71
|
+
pry
|
72
|
+
pry-byebug
|
49
73
|
rake (~> 13.0)
|
50
74
|
rspec (~> 3.0)
|
51
75
|
rubocop (~> 1.7)
|
76
|
+
simplecov
|
52
77
|
zxcvbn!
|
53
78
|
|
54
79
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -24,45 +24,45 @@ Or install it yourself as:
|
|
24
24
|
```
|
25
25
|
Zxcvbn.zxcvbn("password")
|
26
26
|
=> {
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
"password" => "password",
|
28
|
+
"guesses" => 3,
|
29
|
+
"guesses_log10" => 0.47712125471966244,
|
30
|
+
"sequence" => [
|
31
31
|
{
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
32
|
+
"pattern" => "dictionary",
|
33
|
+
"i" => 0,
|
34
|
+
"j" => 7,
|
35
|
+
"token" => "password",
|
36
|
+
"matched_word" => "password",
|
37
|
+
"rank" => 2,
|
38
|
+
"dictionary_name" => "passwords",
|
39
|
+
"reversed" => false,
|
40
|
+
"l33t" => false,
|
41
|
+
"base_guesses" => 2,
|
42
|
+
"uppercase_variations" => 1,
|
43
|
+
"l33t_variations" => 1,
|
44
|
+
"guesses" => 2,
|
45
|
+
"guesses_log10" => 0.3010299956639812
|
46
46
|
}
|
47
47
|
],
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
48
|
+
"calc_time" => 1,
|
49
|
+
"crack_times_seconds" => {
|
50
|
+
"online_throttling_100_per_hour" => 108.0,
|
51
|
+
"online_no_throttling_10_per_second" => 0.3,
|
52
|
+
"offline_slow_hashing_1e4_per_second" => 0.0003,
|
53
|
+
"offline_fast_hashing_1e10_per_second" => 3.0e-10},
|
54
|
+
"crack_times_display" => {
|
55
|
+
"online_throttling_100_per_hour" => "2 minutes",
|
56
|
+
"online_no_throttling_10_per_second" => "less than a second",
|
57
|
+
"offline_slow_hashing_1e4_per_second" => "less than a second",
|
58
|
+
"offline_fast_hashing_1e10_per_second" => "less than a second"
|
54
59
|
},
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
:score => 1,
|
62
|
-
:feedback =>
|
63
|
-
{
|
64
|
-
:warning => "This is a very common password",
|
65
|
-
:suggestions => ["Add another word or two. Uncommon words are better."]
|
60
|
+
"score" => 0,
|
61
|
+
"feedback" => {
|
62
|
+
"warning" => "This is a top-10 common password",
|
63
|
+
"suggestions" => [
|
64
|
+
"Add another word or two. Uncommon words are better."
|
65
|
+
]
|
66
66
|
}
|
67
67
|
}
|
68
68
|
```
|
@@ -75,7 +75,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
75
75
|
|
76
76
|
## Contributing
|
77
77
|
|
78
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
78
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/formigarafa/zxcvbn. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/zxcvbn/blob/master/CODE_OF_CONDUCT.md).
|
79
79
|
|
80
80
|
## License
|
81
81
|
|
data/bin/console
CHANGED
data/lib/zxcvbn.rb
CHANGED
@@ -14,21 +14,19 @@ module Zxcvbn
|
|
14
14
|
def self.zxcvbn(password, user_inputs = [])
|
15
15
|
start = (Time.now.to_f * 1000).to_i
|
16
16
|
# reset the user inputs matcher on a per-request basis to keep things stateless
|
17
|
-
sanitized_inputs = []
|
17
|
+
sanitized_inputs = []
|
18
18
|
user_inputs.each do |arg|
|
19
|
-
if arg.is_a?(String) || arg.is_a?(Numeric) || arg == true || arg == false
|
20
|
-
sanitized_inputs << arg.to_s.downcase
|
21
|
-
end
|
19
|
+
sanitized_inputs << arg.to_s.downcase if arg.is_a?(String) || arg.is_a?(Numeric) || arg == true || arg == false
|
22
20
|
end
|
23
|
-
Matching.
|
21
|
+
Matching.user_input_dictionary = sanitized_inputs
|
24
22
|
matches = Matching.omnimatch(password)
|
25
23
|
result = Scoring.most_guessable_match_sequence(password, matches)
|
26
|
-
result[
|
27
|
-
attack_times = TimeEstimates.estimate_attack_times(result[
|
24
|
+
result["calc_time"] = (Time.now.to_f * 1000).to_i - start
|
25
|
+
attack_times = TimeEstimates.estimate_attack_times(result["guesses"])
|
28
26
|
attack_times.each do |prop, val|
|
29
27
|
result[prop] = val
|
30
28
|
end
|
31
|
-
result[
|
32
|
-
|
29
|
+
result["feedback"] = Feedback.get_feedback(result["score"], result["sequence"])
|
30
|
+
result
|
33
31
|
end
|
34
32
|
end
|
@@ -2,233 +2,237 @@
|
|
2
2
|
|
3
3
|
# generated by scripts/build_keyboard_adjacency_graphs.py
|
4
4
|
module Zxcvbn
|
5
|
+
# rubocop:disable Layout/SpaceInsideArrayLiteralBrackets
|
6
|
+
# rubocop:disable Layout/ExtraSpacing
|
5
7
|
ADJACENCY_GRAPHS = {
|
6
|
-
qwerty
|
7
|
-
"!"
|
8
|
-
"\""
|
9
|
-
"#"
|
10
|
-
"$"
|
11
|
-
"%"
|
12
|
-
"&"
|
13
|
-
"'"
|
14
|
-
"("
|
15
|
-
")"
|
16
|
-
"*"
|
17
|
-
"+"
|
18
|
-
","
|
19
|
-
"-"
|
20
|
-
"."
|
21
|
-
"/"
|
22
|
-
"0"
|
23
|
-
"1"
|
24
|
-
"2"
|
25
|
-
"3"
|
26
|
-
"4"
|
27
|
-
"5"
|
28
|
-
"6"
|
29
|
-
"7"
|
30
|
-
"8"
|
31
|
-
"9"
|
32
|
-
":"
|
33
|
-
";"
|
34
|
-
"<"
|
35
|
-
"="
|
36
|
-
">"
|
37
|
-
"?"
|
38
|
-
"@"
|
39
|
-
"A"
|
40
|
-
"B"
|
41
|
-
"C"
|
42
|
-
"D"
|
43
|
-
"E"
|
44
|
-
"F"
|
45
|
-
"G"
|
46
|
-
"H"
|
47
|
-
"I"
|
48
|
-
"J"
|
49
|
-
"K"
|
50
|
-
"L"
|
51
|
-
"M"
|
52
|
-
"N"
|
53
|
-
"O"
|
54
|
-
"P"
|
55
|
-
"Q"
|
56
|
-
"R"
|
57
|
-
"S"
|
58
|
-
"T"
|
59
|
-
"U"
|
60
|
-
"V"
|
61
|
-
"W"
|
62
|
-
"X"
|
63
|
-
"Y"
|
64
|
-
"Z"
|
65
|
-
"["
|
66
|
-
"\\"
|
67
|
-
"]"
|
68
|
-
"^"
|
69
|
-
"_"
|
70
|
-
"`"
|
71
|
-
"a"
|
72
|
-
"b"
|
73
|
-
"c"
|
74
|
-
"d"
|
75
|
-
"e"
|
76
|
-
"f"
|
77
|
-
"g"
|
78
|
-
"h"
|
79
|
-
"i"
|
80
|
-
"j"
|
81
|
-
"k"
|
82
|
-
"l"
|
83
|
-
"m"
|
84
|
-
"n"
|
85
|
-
"o"
|
86
|
-
"p"
|
87
|
-
"q"
|
88
|
-
"r"
|
89
|
-
"s"
|
90
|
-
"t"
|
91
|
-
"u"
|
92
|
-
"v"
|
93
|
-
"w"
|
94
|
-
"x"
|
95
|
-
"y"
|
96
|
-
"z"
|
97
|
-
"{"
|
98
|
-
"|"
|
99
|
-
"}"
|
100
|
-
"~"
|
8
|
+
"qwerty" => {
|
9
|
+
"!" => ["`~", nil, nil, "2@", "qQ", nil],
|
10
|
+
"\"" => [";:", "[{", "]}", nil, nil, "/?"],
|
11
|
+
"#" => ["2@", nil, nil, "4$", "eE", "wW"],
|
12
|
+
"$" => ["3#", nil, nil, "5%", "rR", "eE"],
|
13
|
+
"%" => ["4$", nil, nil, "6^", "tT", "rR"],
|
14
|
+
"&" => ["6^", nil, nil, "8*", "uU", "yY"],
|
15
|
+
"'" => [";:", "[{", "]}", nil, nil, "/?"],
|
16
|
+
"(" => ["8*", nil, nil, "0)", "oO", "iI"],
|
17
|
+
")" => ["9(", nil, nil, "-_", "pP", "oO"],
|
18
|
+
"*" => ["7&", nil, nil, "9(", "iI", "uU"],
|
19
|
+
"+" => ["-_", nil, nil, nil, "]}", "[{"],
|
20
|
+
"," => ["mM", "kK", "lL", ".>", nil, nil],
|
21
|
+
"-" => ["0)", nil, nil, "=+", "[{", "pP"],
|
22
|
+
"." => [",<", "lL", ";:", "/?", nil, nil],
|
23
|
+
"/" => [".>", ";:", "'\"", nil, nil, nil],
|
24
|
+
"0" => ["9(", nil, nil, "-_", "pP", "oO"],
|
25
|
+
"1" => ["`~", nil, nil, "2@", "qQ", nil],
|
26
|
+
"2" => ["1!", nil, nil, "3#", "wW", "qQ"],
|
27
|
+
"3" => ["2@", nil, nil, "4$", "eE", "wW"],
|
28
|
+
"4" => ["3#", nil, nil, "5%", "rR", "eE"],
|
29
|
+
"5" => ["4$", nil, nil, "6^", "tT", "rR"],
|
30
|
+
"6" => ["5%", nil, nil, "7&", "yY", "tT"],
|
31
|
+
"7" => ["6^", nil, nil, "8*", "uU", "yY"],
|
32
|
+
"8" => ["7&", nil, nil, "9(", "iI", "uU"],
|
33
|
+
"9" => ["8*", nil, nil, "0)", "oO", "iI"],
|
34
|
+
":" => ["lL", "pP", "[{", "'\"", "/?", ".>"],
|
35
|
+
";" => ["lL", "pP", "[{", "'\"", "/?", ".>"],
|
36
|
+
"<" => ["mM", "kK", "lL", ".>", nil, nil],
|
37
|
+
"=" => ["-_", nil, nil, nil, "]}", "[{"],
|
38
|
+
">" => [",<", "lL", ";:", "/?", nil, nil],
|
39
|
+
"?" => [".>", ";:", "'\"", nil, nil, nil],
|
40
|
+
"@" => ["1!", nil, nil, "3#", "wW", "qQ"],
|
41
|
+
"A" => [ nil, "qQ", "wW", "sS", "zZ", nil],
|
42
|
+
"B" => ["vV", "gG", "hH", "nN", nil, nil],
|
43
|
+
"C" => ["xX", "dD", "fF", "vV", nil, nil],
|
44
|
+
"D" => ["sS", "eE", "rR", "fF", "cC", "xX"],
|
45
|
+
"E" => ["wW", "3#", "4$", "rR", "dD", "sS"],
|
46
|
+
"F" => ["dD", "rR", "tT", "gG", "vV", "cC"],
|
47
|
+
"G" => ["fF", "tT", "yY", "hH", "bB", "vV"],
|
48
|
+
"H" => ["gG", "yY", "uU", "jJ", "nN", "bB"],
|
49
|
+
"I" => ["uU", "8*", "9(", "oO", "kK", "jJ"],
|
50
|
+
"J" => ["hH", "uU", "iI", "kK", "mM", "nN"],
|
51
|
+
"K" => ["jJ", "iI", "oO", "lL", ",<", "mM"],
|
52
|
+
"L" => ["kK", "oO", "pP", ";:", ".>", ",<"],
|
53
|
+
"M" => ["nN", "jJ", "kK", ",<", nil, nil],
|
54
|
+
"N" => ["bB", "hH", "jJ", "mM", nil, nil],
|
55
|
+
"O" => ["iI", "9(", "0)", "pP", "lL", "kK"],
|
56
|
+
"P" => ["oO", "0)", "-_", "[{", ";:", "lL"],
|
57
|
+
"Q" => [ nil, "1!", "2@", "wW", "aA", nil],
|
58
|
+
"R" => ["eE", "4$", "5%", "tT", "fF", "dD"],
|
59
|
+
"S" => ["aA", "wW", "eE", "dD", "xX", "zZ"],
|
60
|
+
"T" => ["rR", "5%", "6^", "yY", "gG", "fF"],
|
61
|
+
"U" => ["yY", "7&", "8*", "iI", "jJ", "hH"],
|
62
|
+
"V" => ["cC", "fF", "gG", "bB", nil, nil],
|
63
|
+
"W" => ["qQ", "2@", "3#", "eE", "sS", "aA"],
|
64
|
+
"X" => ["zZ", "sS", "dD", "cC", nil, nil],
|
65
|
+
"Y" => ["tT", "6^", "7&", "uU", "hH", "gG"],
|
66
|
+
"Z" => [ nil, "aA", "sS", "xX", nil, nil],
|
67
|
+
"[" => ["pP", "-_", "=+", "]}", "'\"", ";:"],
|
68
|
+
"\\" => ["]}", nil, nil, nil, nil, nil],
|
69
|
+
"]" => ["[{", "=+", nil, "\\|", nil, "'\""],
|
70
|
+
"^" => ["5%", nil, nil, "7&", "yY", "tT"],
|
71
|
+
"_" => ["0)", nil, nil, "=+", "[{", "pP"],
|
72
|
+
"`" => [ nil, nil, nil, "1!", nil, nil],
|
73
|
+
"a" => [ nil, "qQ", "wW", "sS", "zZ", nil],
|
74
|
+
"b" => ["vV", "gG", "hH", "nN", nil, nil],
|
75
|
+
"c" => ["xX", "dD", "fF", "vV", nil, nil],
|
76
|
+
"d" => ["sS", "eE", "rR", "fF", "cC", "xX"],
|
77
|
+
"e" => ["wW", "3#", "4$", "rR", "dD", "sS"],
|
78
|
+
"f" => ["dD", "rR", "tT", "gG", "vV", "cC"],
|
79
|
+
"g" => ["fF", "tT", "yY", "hH", "bB", "vV"],
|
80
|
+
"h" => ["gG", "yY", "uU", "jJ", "nN", "bB"],
|
81
|
+
"i" => ["uU", "8*", "9(", "oO", "kK", "jJ"],
|
82
|
+
"j" => ["hH", "uU", "iI", "kK", "mM", "nN"],
|
83
|
+
"k" => ["jJ", "iI", "oO", "lL", ",<", "mM"],
|
84
|
+
"l" => ["kK", "oO", "pP", ";:", ".>", ",<"],
|
85
|
+
"m" => ["nN", "jJ", "kK", ",<", nil, nil],
|
86
|
+
"n" => ["bB", "hH", "jJ", "mM", nil, nil],
|
87
|
+
"o" => ["iI", "9(", "0)", "pP", "lL", "kK"],
|
88
|
+
"p" => ["oO", "0)", "-_", "[{", ";:", "lL"],
|
89
|
+
"q" => [ nil, "1!", "2@", "wW", "aA", nil],
|
90
|
+
"r" => ["eE", "4$", "5%", "tT", "fF", "dD"],
|
91
|
+
"s" => ["aA", "wW", "eE", "dD", "xX", "zZ"],
|
92
|
+
"t" => ["rR", "5%", "6^", "yY", "gG", "fF"],
|
93
|
+
"u" => ["yY", "7&", "8*", "iI", "jJ", "hH"],
|
94
|
+
"v" => ["cC", "fF", "gG", "bB", nil, nil],
|
95
|
+
"w" => ["qQ", "2@", "3#", "eE", "sS", "aA"],
|
96
|
+
"x" => ["zZ", "sS", "dD", "cC", nil, nil],
|
97
|
+
"y" => ["tT", "6^", "7&", "uU", "hH", "gG"],
|
98
|
+
"z" => [ nil, "aA", "sS", "xX", nil, nil],
|
99
|
+
"{" => ["pP", "-_", "=+", "]}", "'\"", ";:"],
|
100
|
+
"|" => ["]}", nil, nil, nil, nil, nil],
|
101
|
+
"}" => ["[{", "=+", nil, "\\|", nil, "'\""],
|
102
|
+
"~" => [ nil, nil, nil, "1!", nil, nil]
|
101
103
|
},
|
102
|
-
dvorak
|
103
|
-
"!"
|
104
|
-
"\""
|
105
|
-
"#"
|
106
|
-
"$"
|
107
|
-
"%"
|
108
|
-
"&"
|
109
|
-
"'"
|
110
|
-
"("
|
111
|
-
")"
|
112
|
-
"*"
|
113
|
-
"+"
|
114
|
-
","
|
115
|
-
"-"
|
116
|
-
"."
|
117
|
-
"/"
|
118
|
-
"0"
|
119
|
-
"1"
|
120
|
-
"2"
|
121
|
-
"3"
|
122
|
-
"4"
|
123
|
-
"5"
|
124
|
-
"6"
|
125
|
-
"7"
|
126
|
-
"8"
|
127
|
-
"9"
|
128
|
-
":"
|
129
|
-
";"
|
130
|
-
"<"
|
131
|
-
"="
|
132
|
-
">"
|
133
|
-
"?"
|
134
|
-
"@"
|
135
|
-
"A"
|
136
|
-
"B"
|
137
|
-
"C"
|
138
|
-
"D"
|
139
|
-
"E"
|
140
|
-
"F"
|
141
|
-
"G"
|
142
|
-
"H"
|
143
|
-
"I"
|
144
|
-
"J"
|
145
|
-
"K"
|
146
|
-
"L"
|
147
|
-
"M"
|
148
|
-
"N"
|
149
|
-
"O"
|
150
|
-
"P"
|
151
|
-
"Q"
|
152
|
-
"R"
|
153
|
-
"S"
|
154
|
-
"T"
|
155
|
-
"U"
|
156
|
-
"V"
|
157
|
-
"W"
|
158
|
-
"X"
|
159
|
-
"Y"
|
160
|
-
"Z"
|
161
|
-
"["
|
162
|
-
"\\"
|
163
|
-
"]"
|
164
|
-
"^"
|
165
|
-
"_"
|
166
|
-
"`"
|
167
|
-
"a"
|
168
|
-
"b"
|
169
|
-
"c"
|
170
|
-
"d"
|
171
|
-
"e"
|
172
|
-
"f"
|
173
|
-
"g"
|
174
|
-
"h"
|
175
|
-
"i"
|
176
|
-
"j"
|
177
|
-
"k"
|
178
|
-
"l"
|
179
|
-
"m"
|
180
|
-
"n"
|
181
|
-
"o"
|
182
|
-
"p"
|
183
|
-
"q"
|
184
|
-
"r"
|
185
|
-
"s"
|
186
|
-
"t"
|
187
|
-
"u"
|
188
|
-
"v"
|
189
|
-
"w"
|
190
|
-
"x"
|
191
|
-
"y"
|
192
|
-
"z"
|
193
|
-
"{"
|
194
|
-
"|"
|
195
|
-
"}"
|
196
|
-
"~"
|
104
|
+
"dvorak" => {
|
105
|
+
"!" => ["`~", nil, nil, "2@", "'\"", nil],
|
106
|
+
"\"" => [ nil, "1!", "2@", ",<", "aA", nil],
|
107
|
+
"#" => ["2@", nil, nil, "4$", ".>", ",<"],
|
108
|
+
"$" => ["3#", nil, nil, "5%", "pP", ".>"],
|
109
|
+
"%" => ["4$", nil, nil, "6^", "yY", "pP"],
|
110
|
+
"&" => ["6^", nil, nil, "8*", "gG", "fF"],
|
111
|
+
"'" => [ nil, "1!", "2@", ",<", "aA", nil],
|
112
|
+
"(" => ["8*", nil, nil, "0)", "rR", "cC"],
|
113
|
+
")" => ["9(", nil, nil, "[{", "lL", "rR"],
|
114
|
+
"*" => ["7&", nil, nil, "9(", "cC", "gG"],
|
115
|
+
"+" => ["/?", "]}", nil, "\\|", nil, "-_"],
|
116
|
+
"," => ["'\"", "2@", "3#", ".>", "oO", "aA"],
|
117
|
+
"-" => ["sS", "/?", "=+", nil, nil, "zZ"],
|
118
|
+
"." => [",<", "3#", "4$", "pP", "eE", "oO"],
|
119
|
+
"/" => ["lL", "[{", "]}", "=+", "-_", "sS"],
|
120
|
+
"0" => ["9(", nil, nil, "[{", "lL", "rR"],
|
121
|
+
"1" => ["`~", nil, nil, "2@", "'\"", nil],
|
122
|
+
"2" => ["1!", nil, nil, "3#", ",<", "'\""],
|
123
|
+
"3" => ["2@", nil, nil, "4$", ".>", ",<"],
|
124
|
+
"4" => ["3#", nil, nil, "5%", "pP", ".>"],
|
125
|
+
"5" => ["4$", nil, nil, "6^", "yY", "pP"],
|
126
|
+
"6" => ["5%", nil, nil, "7&", "fF", "yY"],
|
127
|
+
"7" => ["6^", nil, nil, "8*", "gG", "fF"],
|
128
|
+
"8" => ["7&", nil, nil, "9(", "cC", "gG"],
|
129
|
+
"9" => ["8*", nil, nil, "0)", "rR", "cC"],
|
130
|
+
":" => [ nil, "aA", "oO", "qQ", nil, nil],
|
131
|
+
";" => [ nil, "aA", "oO", "qQ", nil, nil],
|
132
|
+
"<" => ["'\"", "2@", "3#", ".>", "oO", "aA"],
|
133
|
+
"=" => ["/?", "]}", nil, "\\|", nil, "-_"],
|
134
|
+
">" => [",<", "3#", "4$", "pP", "eE", "oO"],
|
135
|
+
"?" => ["lL", "[{", "]}", "=+", "-_", "sS"],
|
136
|
+
"@" => ["1!", nil, nil, "3#", ",<", "'\""],
|
137
|
+
"A" => [ nil, "'\"", ",<", "oO", ";:", nil],
|
138
|
+
"B" => ["xX", "dD", "hH", "mM", nil, nil],
|
139
|
+
"C" => ["gG", "8*", "9(", "rR", "tT", "hH"],
|
140
|
+
"D" => ["iI", "fF", "gG", "hH", "bB", "xX"],
|
141
|
+
"E" => ["oO", ".>", "pP", "uU", "jJ", "qQ"],
|
142
|
+
"F" => ["yY", "6^", "7&", "gG", "dD", "iI"],
|
143
|
+
"G" => ["fF", "7&", "8*", "cC", "hH", "dD"],
|
144
|
+
"H" => ["dD", "gG", "cC", "tT", "mM", "bB"],
|
145
|
+
"I" => ["uU", "yY", "fF", "dD", "xX", "kK"],
|
146
|
+
"J" => ["qQ", "eE", "uU", "kK", nil, nil],
|
147
|
+
"K" => ["jJ", "uU", "iI", "xX", nil, nil],
|
148
|
+
"L" => ["rR", "0)", "[{", "/?", "sS", "nN"],
|
149
|
+
"M" => ["bB", "hH", "tT", "wW", nil, nil],
|
150
|
+
"N" => ["tT", "rR", "lL", "sS", "vV", "wW"],
|
151
|
+
"O" => ["aA", ",<", ".>", "eE", "qQ", ";:"],
|
152
|
+
"P" => [".>", "4$", "5%", "yY", "uU", "eE"],
|
153
|
+
"Q" => [";:", "oO", "eE", "jJ", nil, nil],
|
154
|
+
"R" => ["cC", "9(", "0)", "lL", "nN", "tT"],
|
155
|
+
"S" => ["nN", "lL", "/?", "-_", "zZ", "vV"],
|
156
|
+
"T" => ["hH", "cC", "rR", "nN", "wW", "mM"],
|
157
|
+
"U" => ["eE", "pP", "yY", "iI", "kK", "jJ"],
|
158
|
+
"V" => ["wW", "nN", "sS", "zZ", nil, nil],
|
159
|
+
"W" => ["mM", "tT", "nN", "vV", nil, nil],
|
160
|
+
"X" => ["kK", "iI", "dD", "bB", nil, nil],
|
161
|
+
"Y" => ["pP", "5%", "6^", "fF", "iI", "uU"],
|
162
|
+
"Z" => ["vV", "sS", "-_", nil, nil, nil],
|
163
|
+
"[" => ["0)", nil, nil, "]}", "/?", "lL"],
|
164
|
+
"\\" => ["=+", nil, nil, nil, nil, nil],
|
165
|
+
"]" => ["[{", nil, nil, nil, "=+", "/?"],
|
166
|
+
"^" => ["5%", nil, nil, "7&", "fF", "yY"],
|
167
|
+
"_" => ["sS", "/?", "=+", nil, nil, "zZ"],
|
168
|
+
"`" => [ nil, nil, nil, "1!", nil, nil],
|
169
|
+
"a" => [ nil, "'\"", ",<", "oO", ";:", nil],
|
170
|
+
"b" => ["xX", "dD", "hH", "mM", nil, nil],
|
171
|
+
"c" => ["gG", "8*", "9(", "rR", "tT", "hH"],
|
172
|
+
"d" => ["iI", "fF", "gG", "hH", "bB", "xX"],
|
173
|
+
"e" => ["oO", ".>", "pP", "uU", "jJ", "qQ"],
|
174
|
+
"f" => ["yY", "6^", "7&", "gG", "dD", "iI"],
|
175
|
+
"g" => ["fF", "7&", "8*", "cC", "hH", "dD"],
|
176
|
+
"h" => ["dD", "gG", "cC", "tT", "mM", "bB"],
|
177
|
+
"i" => ["uU", "yY", "fF", "dD", "xX", "kK"],
|
178
|
+
"j" => ["qQ", "eE", "uU", "kK", nil, nil],
|
179
|
+
"k" => ["jJ", "uU", "iI", "xX", nil, nil],
|
180
|
+
"l" => ["rR", "0)", "[{", "/?", "sS", "nN"],
|
181
|
+
"m" => ["bB", "hH", "tT", "wW", nil, nil],
|
182
|
+
"n" => ["tT", "rR", "lL", "sS", "vV", "wW"],
|
183
|
+
"o" => ["aA", ",<", ".>", "eE", "qQ", ";:"],
|
184
|
+
"p" => [".>", "4$", "5%", "yY", "uU", "eE"],
|
185
|
+
"q" => [";:", "oO", "eE", "jJ", nil, nil],
|
186
|
+
"r" => ["cC", "9(", "0)", "lL", "nN", "tT"],
|
187
|
+
"s" => ["nN", "lL", "/?", "-_", "zZ", "vV"],
|
188
|
+
"t" => ["hH", "cC", "rR", "nN", "wW", "mM"],
|
189
|
+
"u" => ["eE", "pP", "yY", "iI", "kK", "jJ"],
|
190
|
+
"v" => ["wW", "nN", "sS", "zZ", nil, nil],
|
191
|
+
"w" => ["mM", "tT", "nN", "vV", nil, nil],
|
192
|
+
"x" => ["kK", "iI", "dD", "bB", nil, nil],
|
193
|
+
"y" => ["pP", "5%", "6^", "fF", "iI", "uU"],
|
194
|
+
"z" => ["vV", "sS", "-_", nil, nil, nil],
|
195
|
+
"{" => ["0)", nil, nil, "]}", "/?", "lL"],
|
196
|
+
"|" => ["=+", nil, nil, nil, nil, nil],
|
197
|
+
"}" => ["[{", nil, nil, nil, "=+", "/?"],
|
198
|
+
"~" => [ nil, nil, nil, "1!", nil, nil]
|
197
199
|
},
|
198
|
-
keypad
|
199
|
-
"*"
|
200
|
-
"+"
|
201
|
-
"-"
|
202
|
-
"."
|
203
|
-
"/"
|
204
|
-
"0"
|
205
|
-
"1"
|
206
|
-
"2"
|
207
|
-
"3"
|
208
|
-
"4"
|
209
|
-
"5"
|
210
|
-
"6"
|
211
|
-
"7"
|
212
|
-
"8"
|
213
|
-
"9"
|
200
|
+
"keypad" => {
|
201
|
+
"*" => ["/", nil, nil, nil, "-", "+", "9", "8"],
|
202
|
+
"+" => ["9", "*", "-", nil, nil, nil, nil, "6"],
|
203
|
+
"-" => ["*", nil, nil, nil, nil, nil, "+", "9"],
|
204
|
+
"." => ["0", "2", "3", nil, nil, nil, nil, nil],
|
205
|
+
"/" => [nil, nil, nil, nil, "*", "9", "8", "7"],
|
206
|
+
"0" => [nil, "1", "2", "3", ".", nil, nil, nil],
|
207
|
+
"1" => [nil, nil, "4", "5", "2", "0", nil, nil],
|
208
|
+
"2" => ["1", "4", "5", "6", "3", ".", "0", nil],
|
209
|
+
"3" => ["2", "5", "6", nil, nil, nil, ".", "0"],
|
210
|
+
"4" => [nil, nil, "7", "8", "5", "2", "1", nil],
|
211
|
+
"5" => ["4", "7", "8", "9", "6", "3", "2", "1"],
|
212
|
+
"6" => ["5", "8", "9", "+", nil, nil, "3", "2"],
|
213
|
+
"7" => [nil, nil, nil, "/", "8", "5", "4", nil],
|
214
|
+
"8" => ["7", nil, "/", "*", "9", "6", "5", "4"],
|
215
|
+
"9" => ["8", "/", "*", "-", "+", nil, "6", "5"]
|
214
216
|
},
|
215
|
-
mac_keypad
|
216
|
-
"*"
|
217
|
-
"+"
|
218
|
-
"-"
|
219
|
-
"."
|
220
|
-
"/"
|
221
|
-
"0"
|
222
|
-
"1"
|
223
|
-
"2"
|
224
|
-
"3"
|
225
|
-
"4"
|
226
|
-
"5"
|
227
|
-
"6"
|
228
|
-
"7"
|
229
|
-
"8"
|
230
|
-
"9"
|
231
|
-
"="
|
217
|
+
"mac_keypad" => {
|
218
|
+
"*" => ["/", nil, nil, nil, nil, nil, "-", "9"],
|
219
|
+
"+" => ["6", "9", "-", nil, nil, nil, nil, "3"],
|
220
|
+
"-" => ["9", "/", "*", nil, nil, nil, "+", "6"],
|
221
|
+
"." => ["0", "2", "3", nil, nil, nil, nil, nil],
|
222
|
+
"/" => ["=", nil, nil, nil, "*", "-", "9", "8"],
|
223
|
+
"0" => [nil, "1", "2", "3", ".", nil, nil, nil],
|
224
|
+
"1" => [nil, nil, "4", "5", "2", "0", nil, nil],
|
225
|
+
"2" => ["1", "4", "5", "6", "3", ".", "0", nil],
|
226
|
+
"3" => ["2", "5", "6", "+", nil, nil, ".", "0"],
|
227
|
+
"4" => [nil, nil, "7", "8", "5", "2", "1", nil],
|
228
|
+
"5" => ["4", "7", "8", "9", "6", "3", "2", "1"],
|
229
|
+
"6" => ["5", "8", "9", "-", "+", nil, "3", "2"],
|
230
|
+
"7" => [nil, nil, nil, "=", "8", "5", "4", nil],
|
231
|
+
"8" => ["7", nil, "=", "/", "9", "6", "5", "4"],
|
232
|
+
"9" => ["8", "=", "/", "*", "-", "+", "6", "5"],
|
233
|
+
"=" => [nil, nil, nil, nil, "/", "9", "8", "7"]
|
232
234
|
}
|
233
|
-
}
|
235
|
+
}.freeze
|
236
|
+
# rubocop:enable Layout/ExtraSpacing
|
237
|
+
# rubocop:enable Layout/SpaceInsideArrayLiteralBrackets
|
234
238
|
end
|