Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

868 linhas
51 KiB

  1. /*
  2. * Realistic Password Strength Estimator v4.2.0
  3. *
  4. * Copyright (c) 2012-2015 Dan Wheeler and Dropbox, Inc.
  5. *
  6. * See https://github.com/dropbox/zxcvbn/blob/master/LICENSE.txt
  7. */
  8. (function (f) {
  9. if (typeof exports === "object" && typeof module !== "undefined") {
  10. module.exports = f()
  11. } else if (typeof define === "function" && define.amd) {
  12. define([], f)
  13. } else {
  14. var g;
  15. if (typeof window !== "undefined") {
  16. g = window
  17. } else if (typeof global !== "undefined") {
  18. g = global
  19. } else if (typeof self !== "undefined") {
  20. g = self
  21. } else {
  22. g = this
  23. }
  24. g.zxcvbn = f()
  25. }
  26. })(function () {
  27. var define, module, exports;
  28. return (function e(t, n, r) {
  29. function s(o, u) {
  30. if (!n[o]) {
  31. if (!t[o]) {
  32. var a = typeof require == "function" && require;
  33. if (!u && a)return a(o, !0);
  34. if (i)return i(o, !0);
  35. var f = new Error("Cannot find module '" + o + "'");
  36. throw f.code = "MODULE_NOT_FOUND", f
  37. }
  38. var l = n[o] = {exports: {}};
  39. t[o][0].call(l.exports, function (e) {
  40. var n = t[o][1][e];
  41. return s(n ? n : e)
  42. }, l, l.exports, e, t, n, r)
  43. }
  44. return n[o].exports
  45. }
  46. var i = typeof require == "function" && require;
  47. for (var o = 0; o < r.length; o++)s(r[o]);
  48. return s
  49. })({
  50. 1: [function (require, module, exports) {
  51. var adjacency_graphs;
  52. adjacency_graphs = {
  53. qwerty: {
  54. "!": ["`~", null, null, "2@", "qQ", null],
  55. '"': [";:", "[{", "]}", null, null, "/?"],
  56. "#": ["2@", null, null, "4$", "eE", "wW"],
  57. $: ["3#", null, null, "5%", "rR", "eE"],
  58. "%": ["4$", null, null, "6^", "tT", "rR"],
  59. "&": ["6^", null, null, "8*", "uU", "yY"],
  60. "'": [";:", "[{", "]}", null, null, "/?"],
  61. "(": ["8*", null, null, "0)", "oO", "iI"],
  62. ")": ["9(", null, null, "-_", "pP", "oO"],
  63. "*": ["7&", null, null, "9(", "iI", "uU"],
  64. "+": ["-_", null, null, null, "]}", "[{"],
  65. ",": ["mM", "kK", "lL", ".>", null, null],
  66. "-": ["0)", null, null, "=+", "[{", "pP"],
  67. ".": [",<", "lL", ";:", "/?", null, null],
  68. "/": [".>", ";:", "'\"", null, null, null],
  69. 0: ["9(", null, null, "-_", "pP", "oO"],
  70. 1: ["`~", null, null, "2@", "qQ", null],
  71. 2: ["1!", null, null, "3#", "wW", "qQ"],
  72. 3: ["2@", null, null, "4$", "eE", "wW"],
  73. 4: ["3#", null, null, "5%", "rR", "eE"],
  74. 5: ["4$", null, null, "6^", "tT", "rR"],
  75. 6: ["5%", null, null, "7&", "yY", "tT"],
  76. 7: ["6^", null, null, "8*", "uU", "yY"],
  77. 8: ["7&", null, null, "9(", "iI", "uU"],
  78. 9: ["8*", null, null, "0)", "oO", "iI"],
  79. ":": ["lL", "pP", "[{", "'\"", "/?", ".>"],
  80. ";": ["lL", "pP", "[{", "'\"", "/?", ".>"],
  81. "<": ["mM", "kK", "lL", ".>", null, null],
  82. "=": ["-_", null, null, null, "]}", "[{"],
  83. ">": [",<", "lL", ";:", "/?", null, null],
  84. "?": [".>", ";:", "'\"", null, null, null],
  85. "@": ["1!", null, null, "3#", "wW", "qQ"],
  86. A: [null, "qQ", "wW", "sS", "zZ", null],
  87. B: ["vV", "gG", "hH", "nN", null, null],
  88. C: ["xX", "dD", "fF", "vV", null, null],
  89. D: ["sS", "eE", "rR", "fF", "cC", "xX"],
  90. E: ["wW", "3#", "4$", "rR", "dD", "sS"],
  91. F: ["dD", "rR", "tT", "gG", "vV", "cC"],
  92. G: ["fF", "tT", "yY", "hH", "bB", "vV"],
  93. H: ["gG", "yY", "uU", "jJ", "nN", "bB"],
  94. I: ["uU", "8*", "9(", "oO", "kK", "jJ"],
  95. J: ["hH", "uU", "iI", "kK", "mM", "nN"],
  96. K: ["jJ", "iI", "oO", "lL", ",<", "mM"],
  97. L: ["kK", "oO", "pP", ";:", ".>", ",<"],
  98. M: ["nN", "jJ", "kK", ",<", null, null],
  99. N: ["bB", "hH", "jJ", "mM", null, null],
  100. O: ["iI", "9(", "0)", "pP", "lL", "kK"],
  101. P: ["oO", "0)", "-_", "[{", ";:", "lL"],
  102. Q: [null, "1!", "2@", "wW", "aA", null],
  103. R: ["eE", "4$", "5%", "tT", "fF", "dD"],
  104. S: ["aA", "wW", "eE", "dD", "xX", "zZ"],
  105. T: ["rR", "5%", "6^", "yY", "gG", "fF"],
  106. U: ["yY", "7&", "8*", "iI", "jJ", "hH"],
  107. V: ["cC", "fF", "gG", "bB", null, null],
  108. W: ["qQ", "2@", "3#", "eE", "sS", "aA"],
  109. X: ["zZ", "sS", "dD", "cC", null, null],
  110. Y: ["tT", "6^", "7&", "uU", "hH", "gG"],
  111. Z: [null, "aA", "sS", "xX", null, null],
  112. "[": ["pP", "-_", "=+", "]}", "'\"", ";:"],
  113. "\\": ["]}", null, null, null, null, null],
  114. "]": ["[{", "=+", null, "\\|", null, "'\""],
  115. "^": ["5%", null, null, "7&", "yY", "tT"],
  116. _: ["0)", null, null, "=+", "[{", "pP"],
  117. "`": [null, null, null, "1!", null, null],
  118. a: [null, "qQ", "wW", "sS", "zZ", null],
  119. b: ["vV", "gG", "hH", "nN", null, null],
  120. c: ["xX", "dD", "fF", "vV", null, null],
  121. d: ["sS", "eE", "rR", "fF", "cC", "xX"],
  122. e: ["wW", "3#", "4$", "rR", "dD", "sS"],
  123. f: ["dD", "rR", "tT", "gG", "vV", "cC"],
  124. g: ["fF", "tT", "yY", "hH", "bB", "vV"],
  125. h: ["gG", "yY", "uU", "jJ", "nN", "bB"],
  126. i: ["uU", "8*", "9(", "oO", "kK", "jJ"],
  127. j: ["hH", "uU", "iI", "kK", "mM", "nN"],
  128. k: ["jJ", "iI", "oO", "lL", ",<", "mM"],
  129. l: ["kK", "oO", "pP", ";:", ".>", ",<"],
  130. m: ["nN", "jJ", "kK", ",<", null, null],
  131. n: ["bB", "hH", "jJ", "mM", null, null],
  132. o: ["iI", "9(", "0)", "pP", "lL", "kK"],
  133. p: ["oO", "0)", "-_", "[{", ";:", "lL"],
  134. q: [null, "1!", "2@", "wW", "aA", null],
  135. r: ["eE", "4$", "5%", "tT", "fF", "dD"],
  136. s: ["aA", "wW", "eE", "dD", "xX", "zZ"],
  137. t: ["rR", "5%", "6^", "yY", "gG", "fF"],
  138. u: ["yY", "7&", "8*", "iI", "jJ", "hH"],
  139. v: ["cC", "fF", "gG", "bB", null, null],
  140. w: ["qQ", "2@", "3#", "eE", "sS", "aA"],
  141. x: ["zZ", "sS", "dD", "cC", null, null],
  142. y: ["tT", "6^", "7&", "uU", "hH", "gG"],
  143. z: [null, "aA", "sS", "xX", null, null],
  144. "{": ["pP", "-_", "=+", "]}", "'\"", ";:"],
  145. "|": ["]}", null, null, null, null, null],
  146. "}": ["[{", "=+", null, "\\|", null, "'\""],
  147. "~": [null, null, null, "1!", null, null]
  148. },
  149. dvorak: {
  150. "!": ["`~", null, null, "2@", "'\"", null],
  151. '"': [null, "1!", "2@", ",<", "aA", null],
  152. "#": ["2@", null, null, "4$", ".>", ",<"],
  153. $: ["3#", null, null, "5%", "pP", ".>"],
  154. "%": ["4$", null, null, "6^", "yY", "pP"],
  155. "&": ["6^", null, null, "8*", "gG", "fF"],
  156. "'": [null, "1!", "2@", ",<", "aA", null],
  157. "(": ["8*", null, null, "0)", "rR", "cC"],
  158. ")": ["9(", null, null, "[{", "lL", "rR"],
  159. "*": ["7&", null, null, "9(", "cC", "gG"],
  160. "+": ["/?", "]}", null, "\\|", null, "-_"],
  161. ",": ["'\"", "2@", "3#", ".>", "oO", "aA"],
  162. "-": ["sS", "/?", "=+", null, null, "zZ"],
  163. ".": [",<", "3#", "4$", "pP", "eE", "oO"],
  164. "/": ["lL", "[{", "]}", "=+", "-_", "sS"],
  165. 0: ["9(", null, null, "[{", "lL", "rR"],
  166. 1: ["`~", null, null, "2@", "'\"", null],
  167. 2: ["1!", null, null, "3#", ",<", "'\""],
  168. 3: ["2@", null, null, "4$", ".>", ",<"],
  169. 4: ["3#", null, null, "5%", "pP", ".>"],
  170. 5: ["4$", null, null, "6^", "yY", "pP"],
  171. 6: ["5%", null, null, "7&", "fF", "yY"],
  172. 7: ["6^", null, null, "8*", "gG", "fF"],
  173. 8: ["7&", null, null, "9(", "cC", "gG"],
  174. 9: ["8*", null, null, "0)", "rR", "cC"],
  175. ":": [null, "aA", "oO", "qQ", null, null],
  176. ";": [null, "aA", "oO", "qQ", null, null],
  177. "<": ["'\"", "2@", "3#", ".>", "oO", "aA"],
  178. "=": ["/?", "]}", null, "\\|", null, "-_"],
  179. ">": [",<", "3#", "4$", "pP", "eE", "oO"],
  180. "?": ["lL", "[{", "]}", "=+", "-_", "sS"],
  181. "@": ["1!", null, null, "3#", ",<", "'\""],
  182. A: [null, "'\"", ",<", "oO", ";:", null],
  183. B: ["xX", "dD", "hH", "mM", null, null],
  184. C: ["gG", "8*", "9(", "rR", "tT", "hH"],
  185. D: ["iI", "fF", "gG", "hH", "bB", "xX"],
  186. E: ["oO", ".>", "pP", "uU", "jJ", "qQ"],
  187. F: ["yY", "6^", "7&", "gG", "dD", "iI"],
  188. G: ["fF", "7&", "8*", "cC", "hH", "dD"],
  189. H: ["dD", "gG", "cC", "tT", "mM", "bB"],
  190. I: ["uU", "yY", "fF", "dD", "xX", "kK"],
  191. J: ["qQ", "eE", "uU", "kK", null, null],
  192. K: ["jJ", "uU", "iI", "xX", null, null],
  193. L: ["rR", "0)", "[{", "/?", "sS", "nN"],
  194. M: ["bB", "hH", "tT", "wW", null, null],
  195. N: ["tT", "rR", "lL", "sS", "vV", "wW"],
  196. O: ["aA", ",<", ".>", "eE", "qQ", ";:"],
  197. P: [".>", "4$", "5%", "yY", "uU", "eE"],
  198. Q: [";:", "oO", "eE", "jJ", null, null],
  199. R: ["cC", "9(", "0)", "lL", "nN", "tT"],
  200. S: ["nN", "lL", "/?", "-_", "zZ", "vV"],
  201. T: ["hH", "cC", "rR", "nN", "wW", "mM"],
  202. U: ["eE", "pP", "yY", "iI", "kK", "jJ"],
  203. V: ["wW", "nN", "sS", "zZ", null, null],
  204. W: ["mM", "tT", "nN", "vV", null, null],
  205. X: ["kK", "iI", "dD", "bB", null, null],
  206. Y: ["pP", "5%", "6^", "fF", "iI", "uU"],
  207. Z: ["vV", "sS", "-_", null, null, null],
  208. "[": ["0)", null, null, "]}", "/?", "lL"],
  209. "\\": ["=+", null, null, null, null, null],
  210. "]": ["[{", null, null, null, "=+", "/?"],
  211. "^": ["5%", null, null, "7&", "fF", "yY"],
  212. _: ["sS", "/?", "=+", null, null, "zZ"],
  213. "`": [null, null, null, "1!", null, null],
  214. a: [null, "'\"", ",<", "oO", ";:", null],
  215. b: ["xX", "dD", "hH", "mM", null, null],
  216. c: ["gG", "8*", "9(", "rR", "tT", "hH"],
  217. d: ["iI", "fF", "gG", "hH", "bB", "xX"],
  218. e: ["oO", ".>", "pP", "uU", "jJ", "qQ"],
  219. f: ["yY", "6^", "7&", "gG", "dD", "iI"],
  220. g: ["fF", "7&", "8*", "cC", "hH", "dD"],
  221. h: ["dD", "gG", "cC", "tT", "mM", "bB"],
  222. i: ["uU", "yY", "fF", "dD", "xX", "kK"],
  223. j: ["qQ", "eE", "uU", "kK", null, null],
  224. k: ["jJ", "uU", "iI", "xX", null, null],
  225. l: ["rR", "0)", "[{", "/?", "sS", "nN"],
  226. m: ["bB", "hH", "tT", "wW", null, null],
  227. n: ["tT", "rR", "lL", "sS", "vV", "wW"],
  228. o: ["aA", ",<", ".>", "eE", "qQ", ";:"],
  229. p: [".>", "4$", "5%", "yY", "uU", "eE"],
  230. q: [";:", "oO", "eE", "jJ", null, null],
  231. r: ["cC", "9(", "0)", "lL", "nN", "tT"],
  232. s: ["nN", "lL", "/?", "-_", "zZ", "vV"],
  233. t: ["hH", "cC", "rR", "nN", "wW", "mM"],
  234. u: ["eE", "pP", "yY", "iI", "kK", "jJ"],
  235. v: ["wW", "nN", "sS", "zZ", null, null],
  236. w: ["mM", "tT", "nN", "vV", null, null],
  237. x: ["kK", "iI", "dD", "bB", null, null],
  238. y: ["pP", "5%", "6^", "fF", "iI", "uU"],
  239. z: ["vV", "sS", "-_", null, null, null],
  240. "{": ["0)", null, null, "]}", "/?", "lL"],
  241. "|": ["=+", null, null, null, null, null],
  242. "}": ["[{", null, null, null, "=+", "/?"],
  243. "~": [null, null, null, "1!", null, null]
  244. },
  245. keypad: {
  246. "*": ["/", null, null, null, "-", "+", "9", "8"],
  247. "+": ["9", "*", "-", null, null, null, null, "6"],
  248. "-": ["*", null, null, null, null, null, "+", "9"],
  249. ".": ["0", "2", "3", null, null, null, null, null],
  250. "/": [null, null, null, null, "*", "9", "8", "7"],
  251. 0: [null, "1", "2", "3", ".", null, null, null],
  252. 1: [null, null, "4", "5", "2", "0", null, null],
  253. 2: ["1", "4", "5", "6", "3", ".", "0", null],
  254. 3: ["2", "5", "6", null, null, null, ".", "0"],
  255. 4: [null, null, "7", "8", "5", "2", "1", null],
  256. 5: ["4", "7", "8", "9", "6", "3", "2", "1"],
  257. 6: ["5", "8", "9", "+", null, null, "3", "2"],
  258. 7: [null, null, null, "/", "8", "5", "4", null],
  259. 8: ["7", null, "/", "*", "9", "6", "5", "4"],
  260. 9: ["8", "/", "*", "-", "+", null, "6", "5"]
  261. },
  262. mac_keypad: {
  263. "*": ["/", null, null, null, null, null, "-", "9"],
  264. "+": ["6", "9", "-", null, null, null, null, "3"],
  265. "-": ["9", "/", "*", null, null, null, "+", "6"],
  266. ".": ["0", "2", "3", null, null, null, null, null],
  267. "/": ["=", null, null, null, "*", "-", "9", "8"],
  268. 0: [null, "1", "2", "3", ".", null, null, null],
  269. 1: [null, null, "4", "5", "2", "0", null, null],
  270. 2: ["1", "4", "5", "6", "3", ".", "0", null],
  271. 3: ["2", "5", "6", "+", null, null, ".", "0"],
  272. 4: [null, null, "7", "8", "5", "2", "1", null],
  273. 5: ["4", "7", "8", "9", "6", "3", "2", "1"],
  274. 6: ["5", "8", "9", "-", "+", null, "3", "2"],
  275. 7: [null, null, null, "=", "8", "5", "4", null],
  276. 8: ["7", null, "=", "/", "9", "6", "5", "4"],
  277. 9: ["8", "=", "/", "*", "-", "+", "6", "5"],
  278. "=": [null, null, null, null, "/", "9", "8", "7"]
  279. }
  280. }, module.exports = adjacency_graphs;
  281. }, {}],
  282. 2: [function (require, module, exports) {
  283. var feedback, scoring;
  284. scoring = require("./scoring"), feedback = {
  285. default_feedback: {
  286. warning: "",
  287. suggestions: ["Use a few words, avoid common phrases", "No need for symbols, digits, or uppercase letters"]
  288. }, get_feedback: function (e, s) {
  289. var a, t, r, n, o, i;
  290. if (0 === s.length)return this.default_feedback;
  291. if (e > 2)return {warning: "", suggestions: []};
  292. for (n = s[0], i = s.slice(1), t = 0, r = i.length; r > t; t++)o = i[t], o.token.length > n.token.length && (n = o);
  293. return feedback = this.get_match_feedback(n, 1 === s.length), a = "Add another word or two. Uncommon words are better.", null != feedback ? (feedback.suggestions.unshift(a), null == feedback.warning && (feedback.warning = "")) : feedback = {
  294. warning: "",
  295. suggestions: [a]
  296. }, feedback
  297. }, get_match_feedback: function (e, s) {
  298. var a, t;
  299. switch (e.pattern) {
  300. case"dictionary":
  301. return this.get_dictionary_match_feedback(e, s);
  302. case"spatial":
  303. return a = e.graph.toUpperCase(), t = 1 === e.turns ? "Straight rows of keys are easy to guess" : "Short keyboard patterns are easy to guess", {
  304. warning: t,
  305. suggestions: ["Use a longer keyboard pattern with more turns"]
  306. };
  307. case"repeat":
  308. return t = 1 === e.base_token.length ? 'Repeats like "aaa" are easy to guess' : 'Repeats like "abcabcabc" are only slightly harder to guess than "abc"', {
  309. warning: t,
  310. suggestions: ["Avoid repeated words and characters"]
  311. };
  312. case"sequence":
  313. return {
  314. warning: "Sequences like abc or 6543 are easy to guess",
  315. suggestions: ["Avoid sequences"]
  316. };
  317. case"regex":
  318. if ("recent_year" === e.regex_name)return {
  319. warning: "Recent years are easy to guess",
  320. suggestions: ["Avoid recent years", "Avoid years that are associated with you"]
  321. };
  322. break;
  323. case"date":
  324. return {
  325. warning: "Dates are often easy to guess",
  326. suggestions: ["Avoid dates and years that are associated with you"]
  327. }
  328. }
  329. }, get_dictionary_match_feedback: function (e, s) {
  330. var a, t, r, n, o;
  331. return n = "passwords" === e.dictionary_name ? !s || e.l33t || e.reversed ? e.guesses_log10 <= 4 ? "This is similar to a commonly used password" : void 0 : e.rank <= 10 ? "This is a top-10 common password" : e.rank <= 100 ? "This is a top-100 common password" : "This is a very common password" : "english" === e.dictionary_name ? s ? "A word by itself is easy to guess" : void 0 : "surnames" === (a = e.dictionary_name) || "male_names" === a || "female_names" === a ? s ? "Names and surnames by themselves are easy to guess" : "Common names and surnames are easy to guess" : "", r = [], o = e.token, o.match(scoring.START_UPPER) ? r.push("Capitalization doesn't help very much") : o.match(scoring.ALL_UPPER) && r.push("All-uppercase is almost as easy to guess as all-lowercase"), e.reversed && e.token.length >= 4 && r.push("Reversed words aren't much harder to guess"), e.l33t && r.push("Predictable substitutions like '@' instead of 'a' don't help very much"), t = {
  332. warning: n,
  333. suggestions: r
  334. }
  335. }
  336. }, module.exports = feedback;
  337. }, {"./scoring": 6}],
  338. 3: [function (require, module, exports) {
  339. var frequency_lists;
  340. frequency_lists = {
  341. }, module.exports = frequency_lists;
  342. }, {}],
  343. 4: [function (require, module, exports) {
  344. var feedback, matching, scoring, time, time_estimates, zxcvbn;
  345. matching = require("./matching"), scoring = require("./scoring"), time_estimates = require("./time_estimates"), feedback = require("./feedback"), time = function () {
  346. return (new Date).getTime()
  347. }, zxcvbn = function (e, t) {
  348. var i, n, c, s, a, r, m, o, u, g, _;
  349. for (null == t && (t = []), g = time(), u = [], c = 0, s = t.length; s > c; c++)i = t[c], ("string" == (m = typeof i) || "number" === m || "boolean" === m) && u.push(i.toString().toLowerCase());
  350. matching.set_user_input_dictionary(u), a = matching.omnimatch(e), o = scoring.most_guessable_match_sequence(e, a), o.calc_time = time() - g, n = time_estimates.estimate_attack_times(o.guesses);
  351. for (r in n)_ = n[r], o[r] = _;
  352. return o.feedback = feedback.get_feedback(o.score, o.sequence), o
  353. }, module.exports = zxcvbn;
  354. }, {"./feedback": 2, "./matching": 5, "./scoring": 6, "./time_estimates": 7}],
  355. 5: [function (require, module, exports) {
  356. var DATE_MAX_YEAR, DATE_MIN_YEAR, DATE_SPLITS, GRAPHS, L33T_TABLE, RANKED_DICTIONARIES, REGEXEN, SEQUENCES, adjacency_graphs, build_ranked_dict, frequency_lists, lst, matching, name, scoring, indexOf = [].indexOf || function (e) {
  357. for (var t = 0, n = this.length; n > t; t++)if (t in this && this[t] === e)return t;
  358. return -1
  359. };
  360. frequency_lists = require("./frequency_lists"), adjacency_graphs = require("./adjacency_graphs"), scoring = require("./scoring"), build_ranked_dict = function (e) {
  361. var t, n, r, i, a;
  362. for (i = {}, t = 1, r = 0, n = e.length; n > r; r++)a = e[r], i[a] = t, t += 1;
  363. return i
  364. }, RANKED_DICTIONARIES = {};
  365. for (name in frequency_lists)lst = frequency_lists[name], RANKED_DICTIONARIES[name] = build_ranked_dict(lst);
  366. GRAPHS = {
  367. qwerty: adjacency_graphs.qwerty,
  368. dvorak: adjacency_graphs.dvorak,
  369. keypad: adjacency_graphs.keypad,
  370. mac_keypad: adjacency_graphs.mac_keypad
  371. }, SEQUENCES = {
  372. lower: "abcdefghijklmnopqrstuvwxyz",
  373. upper: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
  374. digits: "0123456789"
  375. }, L33T_TABLE = {
  376. a: ["4", "@"],
  377. b: ["8"],
  378. c: ["(", "{", "[", "<"],
  379. e: ["3"],
  380. g: ["6", "9"],
  381. i: ["1", "!", "|"],
  382. l: ["1", "|", "7"],
  383. o: ["0"],
  384. s: ["$", "5"],
  385. t: ["+", "7"],
  386. x: ["%"],
  387. z: ["2"]
  388. }, REGEXEN = {recent_year: /19\d\d|200\d|201\d/g}, DATE_MAX_YEAR = 2050, DATE_MIN_YEAR = 1e3, DATE_SPLITS = {
  389. 4: [[1, 2], [2, 3]],
  390. 5: [[1, 3], [2, 3]],
  391. 6: [[1, 2], [2, 4], [4, 5]],
  392. 7: [[1, 3], [2, 3], [4, 5], [4, 6]],
  393. 8: [[2, 4], [4, 6]]
  394. }, matching = {
  395. empty: function (e) {
  396. var t;
  397. return 0 === function () {
  398. var n;
  399. n = [];
  400. for (t in e)n.push(t);
  401. return n
  402. }().length
  403. },
  404. extend: function (e, t) {
  405. return e.push.apply(e, t)
  406. },
  407. translate: function (e, t) {
  408. var n;
  409. return function () {
  410. var r, i, a, s;
  411. for (a = e.split(""), s = [], i = 0, r = a.length; r > i; i++)n = a[i], s.push(t[n] || n);
  412. return s
  413. }().join("")
  414. },
  415. mod: function (e, t) {
  416. return (e % t + t) % t
  417. },
  418. sorted: function (e) {
  419. return e.sort(function (e, t) {
  420. return e.i - t.i || e.j - t.j
  421. })
  422. },
  423. omnimatch: function (e) {
  424. var t, n, r, i, a;
  425. for (i = [], r = [this.dictionary_match, this.reverse_dictionary_match, this.l33t_match, this.spatial_match, this.repeat_match, this.sequence_match, this.regex_match, this.date_match], a = 0, t = r.length; t > a; a++)n = r[a], this.extend(i, n.call(this, e));
  426. return this.sorted(i)
  427. },
  428. dictionary_match: function (e, t) {
  429. var n, r, i, a, s, o, h, c, u, l, _, f, d, g;
  430. null == t && (t = RANKED_DICTIONARIES), s = [], a = e.length, c = e.toLowerCase();
  431. for (n in t)for (l = t[n], r = o = 0, _ = a; _ >= 0 ? _ > o : o > _; r = _ >= 0 ? ++o : --o)for (i = h = f = r, d = a; d >= f ? d > h : h > d; i = d >= f ? ++h : --h)c.slice(r, +i + 1 || 9e9)in l && (g = c.slice(r, +i + 1 || 9e9), u = l[g], s.push({
  432. pattern: "dictionary",
  433. i: r,
  434. j: i,
  435. token: e.slice(r, +i + 1 || 9e9),
  436. matched_word: g,
  437. rank: u,
  438. dictionary_name: n,
  439. reversed: !1,
  440. l33t: !1
  441. }));
  442. return this.sorted(s)
  443. },
  444. reverse_dictionary_match: function (e, t) {
  445. var n, r, i, a, s, o;
  446. for (null == t && (t = RANKED_DICTIONARIES), o = e.split("").reverse().join(""), i = this.dictionary_match(o, t), a = 0, n = i.length; n > a; a++)r = i[a], r.token = r.token.split("").reverse().join(""), r.reversed = !0, s = [e.length - 1 - r.j, e.length - 1 - r.i], r.i = s[0], r.j = s[1];
  447. return this.sorted(i)
  448. },
  449. set_user_input_dictionary: function (e) {
  450. return RANKED_DICTIONARIES.user_inputs = build_ranked_dict(e.slice())
  451. },
  452. relevant_l33t_subtable: function (e, t) {
  453. var n, r, i, a, s, o, h, c, u, l;
  454. for (s = {}, o = e.split(""), a = 0, r = o.length; r > a; a++)n = o[a], s[n] = !0;
  455. l = {};
  456. for (i in t)u = t[i], h = function () {
  457. var e, t, n;
  458. for (n = [], t = 0, e = u.length; e > t; t++)c = u[t], c in s && n.push(c);
  459. return n
  460. }(), h.length > 0 && (l[i] = h);
  461. return l
  462. },
  463. enumerate_l33t_subs: function (e) {
  464. var t, n, r, i, a, s, o, h, c, u, l, _, f, d, g;
  465. a = function () {
  466. var t;
  467. t = [];
  468. for (i in e)t.push(i);
  469. return t
  470. }(), g = [[]], n = function (e) {
  471. var t, n, r, a, s, o, h, c;
  472. for (n = [], s = {}, o = 0, a = e.length; a > o; o++)h = e[o], t = function () {
  473. var e, t, n;
  474. for (n = [], c = t = 0, e = h.length; e > t; c = ++t)i = h[c], n.push([i, c]);
  475. return n
  476. }(), t.sort(), r = function () {
  477. var e, n, r;
  478. for (r = [], c = n = 0, e = t.length; e > n; c = ++n)i = t[c], r.push(i + "," + c);
  479. return r
  480. }().join("-"), r in s || (s[r] = !0, n.push(h));
  481. return n
  482. }, r = function (t) {
  483. var i, a, s, o, h, c, u, l, _, f, d, p, E, m, y, A;
  484. if (t.length) {
  485. for (a = t[0], E = t.slice(1), u = [], d = e[a], l = 0, h = d.length; h > l; l++)for (o = d[l], _ = 0, c = g.length; c > _; _++) {
  486. for (m = g[_], i = -1, s = f = 0, p = m.length; p >= 0 ? p > f : f > p; s = p >= 0 ? ++f : --f)if (m[s][0] === o) {
  487. i = s;
  488. break
  489. }
  490. -1 === i ? (A = m.concat([[o, a]]), u.push(A)) : (y = m.slice(0), y.splice(i, 1), y.push([o, a]), u.push(m), u.push(y))
  491. }
  492. return g = n(u), r(E)
  493. }
  494. }, r(a), d = [];
  495. for (c = 0, o = g.length; o > c; c++) {
  496. for (_ = g[c], f = {}, u = 0, h = _.length; h > u; u++)l = _[u], s = l[0], t = l[1], f[s] = t;
  497. d.push(f)
  498. }
  499. return d
  500. },
  501. l33t_match: function (e, t, n) {
  502. var r, i, a, s, o, h, c, u, l, _, f, d, g, p, E, m;
  503. for (null == t && (t = RANKED_DICTIONARIES), null == n && (n = L33T_TABLE), c = [], _ = this.enumerate_l33t_subs(this.relevant_l33t_subtable(e, n)), u = 0, a = _.length; a > u && (d = _[u], !this.empty(d)); u++)for (p = this.translate(e, d), f = this.dictionary_match(p, t), l = 0, s = f.length; s > l; l++)if (o = f[l], E = e.slice(o.i, +o.j + 1 || 9e9), E.toLowerCase() !== o.matched_word) {
  504. h = {};
  505. for (g in d)r = d[g], -1 !== E.indexOf(g) && (h[g] = r);
  506. o.l33t = !0, o.token = E, o.sub = h, o.sub_display = function () {
  507. var e;
  508. e = [];
  509. for (i in h)m = h[i], e.push(i + " -> " + m);
  510. return e
  511. }().join(", "), c.push(o)
  512. }
  513. return this.sorted(c.filter(function (e) {
  514. return e.token.length > 1
  515. }))
  516. },
  517. spatial_match: function (e, t) {
  518. var n, r, i;
  519. null == t && (t = GRAPHS), i = [];
  520. for (r in t)n = t[r], this.extend(i, this.spatial_match_helper(e, n, r));
  521. return this.sorted(i)
  522. },
  523. SHIFTED_RX: /[~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?]/,
  524. spatial_match_helper: function (e, t, n) {
  525. var r, i, a, s, o, h, c, u, l, _, f, d, g, p, E;
  526. for (f = [], c = 0; c < e.length - 1;)for (u = c + 1, l = null, E = 0, p = "qwerty" !== n && "dvorak" !== n || !this.SHIFTED_RX.exec(e.charAt(c)) ? 0 : 1; ;) {
  527. if (g = e.charAt(u - 1), o = !1, h = -1, s = -1, i = t[g] || [], u < e.length)for (a = e.charAt(u), d = 0, _ = i.length; _ > d; d++)if (r = i[d], s += 1, r && -1 !== r.indexOf(a)) {
  528. o = !0, h = s, 1 === r.indexOf(a) && (p += 1), l !== h && (E += 1, l = h);
  529. break
  530. }
  531. if (!o) {
  532. u - c > 2 && f.push({
  533. pattern: "spatial",
  534. i: c,
  535. j: u - 1,
  536. token: e.slice(c, u),
  537. graph: n,
  538. turns: E,
  539. shifted_count: p
  540. }), c = u;
  541. break
  542. }
  543. u += 1
  544. }
  545. return f
  546. },
  547. repeat_match: function (e) {
  548. var t, n, r, i, a, s, o, h, c, u, l, _, f, d, g;
  549. for (d = [], a = /(.+)\1+/g, u = /(.+?)\1+/g, l = /^(.+?)\1+$/, c = 0; c < e.length && (a.lastIndex = u.lastIndex = c, s = a.exec(e), _ = u.exec(e), null != s);)s[0].length > _[0].length ? (f = s, i = l.exec(f[0])[1]) : (f = _, i = f[1]), g = [f.index, f.index + f[0].length - 1], o = g[0], h = g[1], t = scoring.most_guessable_match_sequence(i, this.omnimatch(i)), r = t.match_sequence, n = t.guesses, d.push({
  550. pattern: "repeat",
  551. i: o,
  552. j: h,
  553. token: f[0],
  554. base_token: i,
  555. base_guesses: n,
  556. base_matches: r,
  557. repeat_count: f[0].length / i.length
  558. }), c = h + 1;
  559. return d
  560. },
  561. sequence_match: function (e) {
  562. var t, n, r, i, a, s, o, h, c, u, l, _;
  563. a = [];
  564. for (l in SEQUENCES)for (u = SEQUENCES[l], h = [1, -1], o = 0, i = h.length; i > o; o++)for (t = h[o], n = 0; n < e.length;)if (c = e.charAt(n), indexOf.call(u, c) < 0)n += 1; else {
  565. for (r = n + 1, _ = u.indexOf(e.charAt(n)); r < e.length && (s = this.mod(_ + t, u.length), u.indexOf(e.charAt(r)) === s);)r += 1, _ = s;
  566. r -= 1, r - n + 1 > 1 && a.push({
  567. pattern: "sequence",
  568. i: n,
  569. j: r,
  570. token: e.slice(n, +r + 1 || 9e9),
  571. sequence_name: l,
  572. sequence_space: u.length,
  573. ascending: 1 === t
  574. }), n = r + 1
  575. }
  576. return this.sorted(a)
  577. },
  578. regex_match: function (e, t) {
  579. var n, r, i, a;
  580. null == t && (t = REGEXEN), n = [];
  581. for (name in t)for (r = t[name], r.lastIndex = 0; i = r.exec(e);)a = i[0], n.push({
  582. pattern: "regex",
  583. token: a,
  584. i: i.index,
  585. j: i.index + i[0].length - 1,
  586. regex_name: name,
  587. regex_match: i
  588. });
  589. return this.sorted(n)
  590. },
  591. date_match: function (e) {
  592. var t, n, r, i, a, s, o, h, c, u, l, _, f, d, g, p, E, m, y, A, v, I, R, x, T, N, k, D, S, j, b, q, C, O;
  593. for (_ = [], f = /^\d{4,8}$/, d = /^(\d{1,4})([\s\/\\_.-])(\d{1,2})\2(\d{1,4})$/, s = E = 0, v = e.length - 4; v >= 0 ? v >= E : E >= v; s = v >= 0 ? ++E : --E)for (o = m = I = s + 3, R = s + 7; (R >= I ? R >= m : m >= R) && !(o >= e.length); o = R >= I ? ++m : --m)if (O = e.slice(s, +o + 1 || 9e9), f.exec(O)) {
  594. for (r = [], x = DATE_SPLITS[O.length], y = 0, u = x.length; u > y; y++)T = x[y], h = T[0], c = T[1], a = this.map_ints_to_dmy([parseInt(O.slice(0, h)), parseInt(O.slice(h, c)), parseInt(O.slice(c))]), null != a && r.push(a);
  595. if (r.length > 0) {
  596. for (t = r[0], g = function (e) {
  597. return Math.abs(e.year - scoring.REFERENCE_YEAR)
  598. }, p = g(r[0]), N = r.slice(1), A = 0, l = N.length; l > A; A++)n = N[A], i = g(n), p > i && (k = [n, i], t = k[0], p = k[1]);
  599. _.push({
  600. pattern: "date",
  601. token: O,
  602. i: s,
  603. j: o,
  604. separator: "",
  605. year: t.year,
  606. month: t.month,
  607. day: t.day
  608. })
  609. }
  610. }
  611. for (s = q = 0, D = e.length - 6; D >= 0 ? D >= q : q >= D; s = D >= 0 ? ++q : --q)for (o = C = S = s + 5, j = s + 9; (j >= S ? j >= C : C >= j) && !(o >= e.length); o = j >= S ? ++C : --C)O = e.slice(s, +o + 1 || 9e9), b = d.exec(O), null != b && (a = this.map_ints_to_dmy([parseInt(b[1]), parseInt(b[3]), parseInt(b[4])]), null != a && _.push({
  612. pattern: "date",
  613. token: O,
  614. i: s,
  615. j: o,
  616. separator: b[2],
  617. year: a.year,
  618. month: a.month,
  619. day: a.day
  620. }));
  621. return this.sorted(_.filter(function (e) {
  622. var t, n, r, i;
  623. for (t = !1, i = 0, n = _.length; n > i; i++)if (r = _[i], e !== r && r.i <= e.i && r.j >= e.j) {
  624. t = !0;
  625. break
  626. }
  627. return !t
  628. }))
  629. },
  630. map_ints_to_dmy: function (e) {
  631. var t, n, r, i, a, s, o, h, c, u, l, _, f, d, g, p;
  632. if (!(e[1] > 31 || e[1] <= 0)) {
  633. for (o = 0, h = 0, g = 0, s = 0, r = e.length; r > s; s++) {
  634. if (n = e[s], n > 99 && DATE_MIN_YEAR > n || n > DATE_MAX_YEAR)return;
  635. n > 31 && (h += 1), n > 12 && (o += 1), 0 >= n && (g += 1)
  636. }
  637. if (!(h >= 2 || 3 === o || g >= 2)) {
  638. for (u = [[e[2], e.slice(0, 2)], [e[0], e.slice(1, 3)]], c = 0, i = u.length; i > c; c++)if (_ = u[c], p = _[0], d = _[1], p >= DATE_MIN_YEAR && DATE_MAX_YEAR >= p)return t = this.map_ints_to_dm(d), null != t ? {
  639. year: p,
  640. month: t.month,
  641. day: t.day
  642. } : void 0;
  643. for (l = 0, a = u.length; a > l; l++)if (f = u[l], p = f[0], d = f[1], t = this.map_ints_to_dm(d), null != t)return p = this.two_to_four_digit_year(p), {
  644. year: p,
  645. month: t.month,
  646. day: t.day
  647. }
  648. }
  649. }
  650. },
  651. map_ints_to_dm: function (e) {
  652. var t, n, r, i, a, s;
  653. for (a = [e, e.slice().reverse()], i = 0, n = a.length; n > i; i++)if (s = a[i], t = s[0], r = s[1], t >= 1 && 31 >= t && r >= 1 && 12 >= r)return {
  654. day: t,
  655. month: r
  656. }
  657. },
  658. two_to_four_digit_year: function (e) {
  659. return e > 99 ? e : e > 50 ? e + scoring.REFERENCE_YEAR - 100 : e + scoring.REFERENCE_YEAR
  660. }
  661. }, module.exports = matching;
  662. }, {"./adjacency_graphs": 1, "./frequency_lists": 3, "./scoring": 6}],
  663. 6: [function (require, module, exports) {
  664. var BRUTEFORCE_CARDINALITY, MIN_GUESSES_BEFORE_GROWING_SEQUENCE, MIN_SUBMATCH_GUESSES_MULTI_CHAR, MIN_SUBMATCH_GUESSES_SINGLE_CHAR, adjacency_graphs, calc_average_degree, k, scoring, v;
  665. adjacency_graphs = require("./adjacency_graphs"), calc_average_degree = function (e) {
  666. var t, n, r, s, a, _;
  667. t = 0;
  668. for (r in e)a = e[r], t += function () {
  669. var e, t, n;
  670. for (n = [], t = 0, e = a.length; e > t; t++)s = a[t], s && n.push(s);
  671. return n
  672. }().length;
  673. return t /= function () {
  674. var t;
  675. t = [];
  676. for (n in e)_ = e[n], t.push(n);
  677. return t
  678. }().length
  679. }, BRUTEFORCE_CARDINALITY = 10, MIN_GUESSES_BEFORE_GROWING_SEQUENCE = 1e4, MIN_SUBMATCH_GUESSES_SINGLE_CHAR = 10, MIN_SUBMATCH_GUESSES_MULTI_CHAR = 50, scoring = {
  680. nCk: function (e, t) {
  681. var n, r, s, a;
  682. if (t > e)return 0;
  683. if (0 === t)return 1;
  684. for (s = 1, n = r = 1, a = t; a >= 1 ? a >= r : r >= a; n = a >= 1 ? ++r : --r)s *= e, s /= n, e -= 1;
  685. return s
  686. },
  687. log10: function (e) {
  688. return Math.log(e) / Math.log(10)
  689. },
  690. log2: function (e) {
  691. return Math.log(e) / Math.log(2)
  692. },
  693. factorial: function (e) {
  694. var t, n, r, s;
  695. if (2 > e)return 1;
  696. for (t = 1, n = r = 2, s = e; s >= 2 ? s >= r : r >= s; n = s >= 2 ? ++r : --r)t *= n;
  697. return t
  698. },
  699. most_guessable_match_sequence: function (e, t, n) {
  700. var r, s, a, _, i, u, o, h, E, g, c, l, f, A, S, R, p, M, v, I, N, C, U, T, G, d, k, m, O, P, L, y, B, D;
  701. for (null == n && (n = !1), C = [], r = [], M = 0, N = null, S = function (t) {
  702. return function (t, n) {
  703. var r;
  704. return r = {pattern: "bruteforce", token: e.slice(t, +n + 1 || 9e9), i: t, j: n}
  705. }
  706. }(this), D = function (e) {
  707. return function (t, r) {
  708. var s;
  709. return s = e.factorial(r) * t, n || (s += Math.pow(MIN_GUESSES_BEFORE_GROWING_SEQUENCE, r - 1)), s
  710. }
  711. }(this), c = A = 0, k = e.length; k >= 0 ? k > A : A > k; c = k >= 0 ? ++A : --A)for (r[c] = [], C[c] = [], U = 1 / 0, G = I = 0, m = M; m >= 0 ? m >= I : I >= m; G = m >= 0 ? ++I : --I)for (o = !0, a = c, 0 === G ? (s = 0, v = 1) : "bruteforce" === (null != (O = r[c - 1]) && null != (P = O[G]) ? P.pattern : void 0) ? (s = r[c - 1][G].i, v = G) : null != (null != (L = r[c - 1]) ? L[G] : void 0) ? (s = c, v = G + 1) : o = !1, o && (_ = S(s, a), T = c - _.token.length, i = this.estimate_guesses(_, e), v > 1 && (i *= C[T][v - 1]), u = D(i, v), U > u && (U = u, C[c][v] = i, N = v, M = Math.max(M, v), r[c][v] = _)), d = 0, f = t.length; f > d; d++)if (R = t[d], R.j === c) {
  712. if (y = [R.i, R.j], E = y[0], g = y[1], 0 === G) {
  713. if (0 !== E)continue
  714. } else if (null == (null != (B = C[E - 1]) ? B[G] : void 0))continue;
  715. i = this.estimate_guesses(R, e), G > 0 && (i *= C[E - 1][G]), u = D(i, G + 1), U > u && (U = u, C[c][G + 1] = i, N = G + 1, M = Math.max(M, G + 1), r[c][G + 1] = R)
  716. }
  717. for (p = [], l = N, c = e.length - 1; c >= 0;)R = r[c][l], p.push(R), c = R.i - 1, l -= 1;
  718. return p.reverse(), h = 0 === e.length ? 1 : U, {
  719. password: e,
  720. guesses: h,
  721. guesses_log10: this.log10(h),
  722. sequence: p
  723. }
  724. },
  725. estimate_guesses: function (e, t) {
  726. var n, r, s;
  727. return null != e.guesses ? e.guesses : (s = 1, e.token.length < t.length && (s = 1 === e.token.length ? MIN_SUBMATCH_GUESSES_SINGLE_CHAR : MIN_SUBMATCH_GUESSES_MULTI_CHAR), n = {
  728. bruteforce: this.bruteforce_guesses,
  729. dictionary: this.dictionary_guesses,
  730. spatial: this.spatial_guesses,
  731. repeat: this.repeat_guesses,
  732. sequence: this.sequence_guesses,
  733. regex: this.regex_guesses,
  734. date: this.date_guesses
  735. }, r = n[e.pattern].call(this, e), e.guesses = Math.max(r, s), e.guesses_log10 = this.log10(e.guesses), e.guesses)
  736. },
  737. bruteforce_guesses: function (e) {
  738. var t, n;
  739. return t = Math.pow(BRUTEFORCE_CARDINALITY, e.token.length), n = 1 === e.token.length ? MIN_SUBMATCH_GUESSES_SINGLE_CHAR + 1 : MIN_SUBMATCH_GUESSES_MULTI_CHAR + 1, Math.max(t, n)
  740. },
  741. repeat_guesses: function (e) {
  742. return e.base_guesses * e.repeat_count
  743. },
  744. sequence_guesses: function (e) {
  745. var t, n;
  746. return n = e.token.charAt(0), t = "a" === n || "A" === n || "z" === n || "Z" === n || "0" === n || "1" === n || "9" === n ? 4 : n.match(/\d/) ? 10 : 26, e.ascending || (t *= 2), t * e.token.length
  747. },
  748. MIN_YEAR_SPACE: 20,
  749. REFERENCE_YEAR: 2e3,
  750. regex_guesses: function (e) {
  751. var t, n;
  752. if (t = {
  753. alpha_lower: 26,
  754. alpha_upper: 26,
  755. alpha: 52,
  756. alphanumeric: 62,
  757. digits: 10,
  758. symbols: 33
  759. }, e.regex_name in t)return Math.pow(t[e.regex_name], e.token.length);
  760. switch (e.regex_name) {
  761. case"recent_year":
  762. return n = Math.abs(parseInt(e.regex_match[0]) - this.REFERENCE_YEAR), n = Math.max(n, this.MIN_YEAR_SPACE)
  763. }
  764. },
  765. date_guesses: function (e) {
  766. var t, n;
  767. return n = Math.max(Math.abs(e.year - this.REFERENCE_YEAR), this.MIN_YEAR_SPACE), t = 31 * n * 12, e.has_full_year && (t *= 2), e.separator && (t *= 4), t
  768. },
  769. KEYBOARD_AVERAGE_DEGREE: calc_average_degree(adjacency_graphs.qwerty),
  770. KEYPAD_AVERAGE_DEGREE: calc_average_degree(adjacency_graphs.keypad),
  771. KEYBOARD_STARTING_POSITIONS: function () {
  772. var e, t;
  773. e = adjacency_graphs.qwerty, t = [];
  774. for (k in e)v = e[k], t.push(k);
  775. return t
  776. }().length,
  777. KEYPAD_STARTING_POSITIONS: function () {
  778. var e, t;
  779. e = adjacency_graphs.keypad, t = [];
  780. for (k in e)v = e[k], t.push(k);
  781. return t
  782. }().length,
  783. spatial_guesses: function (e) {
  784. var t, n, r, s, a, _, i, u, o, h, E, g, c, l, f, A, S, R;
  785. for ("qwerty" === (g = e.graph) || "dvorak" === g ? (A = this.KEYBOARD_STARTING_POSITIONS, s = this.KEYBOARD_AVERAGE_DEGREE) : (A = this.KEYPAD_STARTING_POSITIONS, s = this.KEYPAD_AVERAGE_DEGREE), a = 0, t = e.token.length, R = e.turns, _ = u = 2, c = t; c >= 2 ? c >= u : u >= c; _ = c >= 2 ? ++u : --u)for (h = Math.min(R, _ - 1), i = o = 1, l = h; l >= 1 ? l >= o : o >= l; i = l >= 1 ? ++o : --o)a += this.nCk(_ - 1, i - 1) * A * Math.pow(s, i);
  786. if (e.shifted_count)if (n = e.shifted_count, r = e.token.length - e.shifted_count, 0 === n || 0 === r)a *= 2; else {
  787. for (S = 0, _ = E = 1, f = Math.min(n, r); f >= 1 ? f >= E : E >= f; _ = f >= 1 ? ++E : --E)S += this.nCk(n + r, _);
  788. a *= S
  789. }
  790. return a
  791. },
  792. dictionary_guesses: function (e) {
  793. var t;
  794. return e.base_guesses = e.rank, e.uppercase_variations = this.uppercase_variations(e), e.l33t_variations = this.l33t_variations(e), t = e.reversed && 2 || 1, e.base_guesses * e.uppercase_variations * e.l33t_variations * t
  795. },
  796. START_UPPER: /^[A-Z][^A-Z]+$/,
  797. END_UPPER: /^[^A-Z]+[A-Z]$/,
  798. ALL_UPPER: /^[^a-z]+$/,
  799. ALL_LOWER: /^[^A-Z]+$/,
  800. uppercase_variations: function (e) {
  801. var t, n, r, s, a, _, i, u, o, h, E, g;
  802. if (g = e.token, g.match(this.ALL_LOWER))return 1;
  803. for (u = [this.START_UPPER, this.END_UPPER, this.ALL_UPPER], _ = 0, a = u.length; a > _; _++)if (h = u[_], g.match(h))return 2;
  804. for (n = function () {
  805. var e, t, n, s;
  806. for (n = g.split(""), s = [], t = 0, e = n.length; e > t; t++)r = n[t], r.match(/[A-Z]/) && s.push(r);
  807. return s
  808. }().length, t = function () {
  809. var e, t, n, s;
  810. for (n = g.split(""), s = [], t = 0, e = n.length; e > t; t++)r = n[t], r.match(/[a-z]/) && s.push(r);
  811. return s
  812. }().length, E = 0, s = i = 1, o = Math.min(n, t); o >= 1 ? o >= i : i >= o; s = o >= 1 ? ++i : --i)E += this.nCk(n + t, s);
  813. return E
  814. },
  815. l33t_variations: function (e) {
  816. var t, n, r, s, a, _, i, u, o, h, E, g, c;
  817. if (!e.l33t)return 1;
  818. c = 1, o = e.sub;
  819. for (E in o)if (g = o[E], s = e.token.toLowerCase().split(""), t = function () {
  820. var e, t, n;
  821. for (n = [], t = 0, e = s.length; e > t; t++)r = s[t], r === E && n.push(r);
  822. return n
  823. }().length, n = function () {
  824. var e, t, n;
  825. for (n = [], t = 0, e = s.length; e > t; t++)r = s[t], r === g && n.push(r);
  826. return n
  827. }().length, 0 === t || 0 === n)c *= 2; else {
  828. for (i = Math.min(n, t), u = 0, a = _ = 1, h = i; h >= 1 ? h >= _ : _ >= h; a = h >= 1 ? ++_ : --_)u += this.nCk(n + t, a);
  829. c *= u
  830. }
  831. return c
  832. }
  833. }, module.exports = scoring;
  834. }, {"./adjacency_graphs": 1}],
  835. 7: [function (require, module, exports) {
  836. var time_estimates;
  837. time_estimates = {
  838. estimate_attack_times: function (e) {
  839. var t, n, s, o;
  840. n = {
  841. online_throttling_100_per_hour: e / (100 / 3600),
  842. online_no_throttling_10_per_second: e / 100,
  843. offline_slow_hashing_1e4_per_second: e / 1e4,
  844. offline_fast_hashing_1e10_per_second: e / 1e10
  845. }, t = {};
  846. for (s in n)o = n[s], t[s] = this.display_time(o);
  847. return {crack_times_seconds: n, crack_times_display: t, score: this.guesses_to_score(e)}
  848. }, guesses_to_score: function (e) {
  849. var t;
  850. return t = 5, 1e3 + t > e ? 0 : 1e6 + t > e ? 1 : 1e8 + t > e ? 2 : 1e10 + t > e ? 3 : 4
  851. }, display_time: function (e) {
  852. var t, n, s, o, _, r, i, a, u, c;
  853. return i = 60, r = 60 * i, s = 24 * r, a = 31 * s, c = 12 * a, n = 100 * c, u = 1 > e ? [null, "less than a second"] : i > e ? (t = Math.round(e), [t, t + " second"]) : r > e ? (t = Math.round(e / i), [t, t + " minute"]) : s > e ? (t = Math.round(e / r), [t, t + " hour"]) : a > e ? (t = Math.round(e / s), [t, t + " day"]) : c > e ? (t = Math.round(e / a), [t, t + " month"]) : n > e ? (t = Math.round(e / c), [t, t + " year"]) : [null, "centuries"], o = u[0], _ = u[1], null != o && 1 !== o && (_ += "s"), _
  854. }
  855. }, module.exports = time_estimates;
  856. }, {}]
  857. }, {}, [4])(4)
  858. });
  859. //# sourceMappingURL=zxcvbn.js.map