password-meter
Version:
This password meter library is inspired by pointing system in http://www.passwordmeter.com/, in which the main purpose is to help the end users to have more stronger passwords.
1 lines • 43.6 kB
Source Map (JSON)
{"version":3,"file":"index.min.cjs","sources":["../src/index.ts"],"sourcesContent":["export interface IRequirement {\n minLength?: number | IMessage;\n maxLength?: number | IMessage;\n uniqueLettersMinLength?: number | IMessage;\n uppercaseLettersMinLength?: number | IMessage;\n lowercaseLettersMinLength?: number | IMessage;\n numbersMinLength?: number | IMessage;\n symbolsMinLength?: number | IMessage;\n include?: string[] | IMessage;\n exclude?: string[] | IMessage;\n blackList?: string[] | IMessage;\n startsWith?: string | IMessage;\n endsWith?: string | IMessage;\n includeOne?: string[] | IMessage;\n}\n\nexport interface IMessage {\n value: number | string | string[];\n message: string;\n}\n\nexport interface IResult {\n score: number;\n status: string;\n percent: number;\n errors?: string | string[];\n}\n\nexport class PasswordMeter {\n private uppercaseLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n private lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz';\n private numbers = '1234567890';\n constructor(public requirements?: IRequirement, public scoreRange?: any) {}\n\n private startsWith(str: string, word: string): boolean {\n return str.lastIndexOf(word, 0) === 0;\n }\n\n private endsWith(str: string, word: string): boolean {\n return str.indexOf(word, str.length - word.length) !== -1;\n }\n\n private chunkString(str: string, len: number): string[] {\n const _size = Math.ceil(str.length / len),\n _ret = new Array(_size);\n let _offset = 0;\n for (let _i = 0; _i < _size; _i++) {\n _offset = _i * len;\n _ret[_i] = str.substring(_offset, _offset + len);\n }\n return _ret;\n }\n private getLength(text: string): number {\n if (text) {\n return text.length;\n }\n return 0;\n }\n private doesNotContains(text: string, list: string[]): boolean {\n if (text) {\n if (list) {\n const doesnotContainsAll = list.every((x) => text.indexOf(x) == -1);\n return doesnotContainsAll;\n } else {\n return true;\n }\n } else {\n return true;\n }\n }\n private contains(text: string, list: string[]): boolean {\n if (text) {\n if (list) {\n const containsAll = list.every((x) => text.indexOf(x) >= 0);\n return containsAll;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n private containsOne(text: string, list: string[]): boolean {\n if (text) {\n if (list) {\n const contains = list.some((x) => text.indexOf(x) >= 0);\n return contains;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private isInBlackList(text: string, list: string[]): boolean {\n if (text) {\n if (list) {\n for (let index = 0; index < list.length; index++) {\n if (text === list[index]) {\n return true;\n }\n }\n return false;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private between(x: number, min: number, max: number) {\n return x >= min && x < max;\n }\n\n private isIMessage(arg: any): arg is IMessage {\n const status = arg.message !== undefined;\n return status;\n }\n\n private isNumber(text: string): boolean {\n if (text) {\n const pattern = /^\\d+$/;\n return pattern.test(text);\n }\n return false;\n }\n\n private isLetter(text: string): boolean {\n if (text) {\n const pattern = /^[a-zA-Z]+$/;\n return pattern.test(text);\n }\n return false;\n }\n\n private isUppercaseLetter(text: string): boolean {\n if (text) {\n const pattern = /^[A-Z]+$/;\n return pattern.test(text);\n }\n return false;\n }\n\n private isLowercaseLetter(text: string): boolean {\n if (text) {\n const pattern = /^[a-z]+$/;\n return pattern.test(text);\n }\n return false;\n }\n\n private isSymbol(text: string): boolean {\n if (text) {\n return !this.isNumber(text) && !this.isLetter(text);\n }\n return false;\n }\n\n private getSymbols(text: string): string | undefined {\n let result = '';\n if (text) {\n for (let index = 0; index < text.length; index++) {\n if (this.isSymbol(text[index])) result += text[index];\n }\n }\n if (result.length === 0) return undefined;\n return result;\n }\n\n private getLengthScore(text: string): number {\n if (text) {\n // +(n*9)\n const ratio = 9;\n return this.getLength(text) * ratio;\n }\n return 0;\n }\n private getUppercaseLettersScore(text: string): number {\n if (text) {\n // +((len-n)*2)\n const ratio = 2;\n let n = 0;\n text.split('').forEach((value) => {\n if (this.isUppercaseLetter(value)) {\n n++;\n }\n });\n if (n == 0) {\n return 0;\n }\n return (this.getLength(text) - n) * ratio;\n }\n return 0;\n }\n private getLowercaseLettersScore(text: string): number {\n if (text) {\n // +((len-n)*2)\n const ratio = 2;\n let n = 0;\n text.split('').forEach((value) => {\n if (this.isLowercaseLetter(value)) {\n n++;\n }\n });\n if (n == 0) {\n return 0;\n }\n return (this.getLength(text) - n) * ratio;\n }\n return 0;\n }\n private getNumbersScore(text: string): number {\n if (text) {\n // +((len-n)*4)\n const ratio = 4;\n let n = 0;\n text.split('').forEach((value) => {\n if (this.isNumber(value)) {\n n++;\n }\n });\n if (n == 0) {\n return 0;\n }\n return (this.getLength(text) - n) * ratio;\n }\n return 0;\n }\n private getSymbolsScore(text: string): number {\n if (text) {\n // +((len-n)*6)\n const ratio = 6;\n let n = 0;\n text.split('').forEach((value) => {\n if (this.isSymbol(value)) {\n n++;\n }\n });\n if (n == 0) {\n return 0;\n }\n return (this.getLength(text) - n) * ratio;\n }\n return 0;\n }\n\n private getLettersOnlyScore(text: string): number {\n if (text) {\n // -n\n const ratio = -1;\n if (this.isLetter(text)) {\n return this.getLength(text) * ratio;\n }\n }\n return 0;\n }\n\n private getNumbersOnlyScore(text: string): number {\n if (text) {\n // -n\n const ratio = -1;\n if (this.isNumber(text)) {\n return this.getLength(text) * ratio;\n }\n }\n return 0;\n }\n\n private getConsecutiveUppercaseLettersScore(text: string): number {\n if (text) {\n const pattern = /[A-Z]+/g;\n const results = <RegExpMatchArray>text.match(pattern);\n if (!results) {\n return 0;\n }\n let score = 0;\n const ratio = -2;\n results.forEach((value) => {\n if (this.getLength(value) > 1) {\n // -(n*2)\n score +=\n (this.getLength(value) - 1) *\n /*There is no problem with a character, but the remaining repetition creates the problem.*/\n ratio;\n }\n });\n return score;\n }\n return 0;\n }\n private getConsecutiveLowercaseLettersScore(text: string): number {\n if (text) {\n const pattern = /[a-z]+/g;\n const results = <RegExpMatchArray>text.match(pattern);\n if (!results) {\n return 0;\n }\n let score = 0;\n const ratio = -2;\n results.forEach((value) => {\n if (this.getLength(value) > 1) {\n // -(n*2)\n score +=\n (this.getLength(value) - 1) *\n /*There is no problem with a character, but the remaining repetition creates the problem.*/\n ratio;\n }\n });\n return score;\n }\n return 0;\n }\n private getConsecutiveNumbersScore(text: string): number {\n if (text) {\n const pattern = /[0-9]+/g;\n const results = <RegExpMatchArray>text.match(pattern);\n if (!results) {\n return 0;\n }\n let score = 0;\n const ratio = -2;\n results.forEach((value) => {\n if (this.getLength(value) > 1) {\n // -(n*2)\n score +=\n (this.getLength(value) - 1) *\n /*There is no problem with a character, but the remaining repetition creates the problem.*/\n ratio;\n }\n });\n return score;\n }\n return 0;\n }\n private reverseString(str: string): string {\n return str.split('').reverse().join('');\n }\n\n private sequentialBuilder(text: string, minChunk: number): string[] {\n if (text) {\n const list: string[] = [];\n const len = text.split('').length - minChunk;\n for (let i = 0; i < len; i++) {\n for (let index = 0; index < len; index++) {\n const newText = text.substring(index, text.length);\n const arr = this.chunkString(newText, i + minChunk);\n for (let j = 0; j < arr.length; j++) {\n list.push(arr[j]);\n list.push(this.reverseString(arr[j]));\n }\n }\n }\n const result = this.distinctArray(this.sortByLength(list, minChunk));\n return result;\n }\n return [];\n }\n\n private distinctArray(arr: string[]): string[] {\n const a = [];\n for (let i = 0, l = arr.length; i < l; i++) if (a.indexOf(arr[i]) === -1 && arr[i] !== '') a.push(arr[i]);\n return a;\n }\n\n private sortByLength(arr: string[], limit?: number): string[] {\n arr.sort(function (a, b) {\n return b.length - a.length;\n });\n const list: string[] = [];\n for (let index = 0; index < arr.length; index++) {\n if (limit) {\n if (arr[index].length >= limit) {\n list.push(arr[index]);\n }\n } else {\n list.push(arr[index]);\n }\n }\n return list;\n }\n\n private getSequentialLettersScore(text: string): number {\n const minChunk = 3;\n if (text) {\n const uStr = this.sequentialBuilder(this.uppercaseLetters, minChunk);\n const lStr = this.sequentialBuilder(this.lowercaseLetters, minChunk);\n let score = 0;\n let uTxt = text;\n let lTxt = text;\n uStr.forEach((value) => {\n if (uTxt.indexOf(value) != -1) {\n score += value.length - (minChunk - 1);\n uTxt = uTxt.replace(value, '');\n }\n });\n lStr.forEach((value) => {\n if (lTxt.indexOf(value) != -1) {\n score += value.length - (minChunk - 1);\n lTxt = lTxt.replace(value, '');\n }\n });\n // -(n*3)\n const ratio = -3;\n return score * ratio;\n }\n return 0;\n }\n\n private getSequentialNumbersScore(text: string): number {\n const minChunk = 3;\n if (text) {\n const num = this.sequentialBuilder(this.numbers, minChunk);\n let score = 0;\n let txt = text;\n num.forEach((value) => {\n if (txt.indexOf(value) != -1) {\n score += value.length - (minChunk - 1);\n txt = txt.replace(value, '');\n }\n });\n // -(n*3)\n const ratio = -3;\n return score * ratio;\n }\n return 0;\n }\n\n private getSequentialSymbolsScore(text: string): number {\n const minChunk = 3;\n const sym = this.getSymbols(text);\n if (text && sym) {\n const num = this.sequentialBuilder(sym, minChunk);\n let score = 0;\n let txt = text;\n num.forEach((value) => {\n if (txt.indexOf(value) != -1) {\n score += value.length - (minChunk - 1);\n txt = txt.replace(value, '');\n }\n });\n // -(n*3)\n const ratio = -3;\n return score * ratio;\n }\n return 0;\n }\n\n private getRepeatCharactersScore(text: string): number {\n const pattern = /(.+)(?=.*?\\1)/g;\n if (text) {\n const matches = <RegExpMatchArray>text.match(pattern);\n if (!matches) {\n return 0;\n }\n const maxResultLength = this.sortByLength(matches)[0].length;\n let ratio = 0;\n if (maxResultLength >= 1 && maxResultLength <= 5) ratio = -8;\n if (maxResultLength >= 6 && maxResultLength <= 10) ratio = -5;\n if (maxResultLength >= 11) ratio = -2;\n // (-X * maxRegexResultLength) + (textLength - (maxRegexResultLength *2))\n const score = ratio * maxResultLength + (text.length - maxResultLength * 2);\n return score;\n }\n return 0;\n }\n\n private getRequirementsScore(text: string, ignoreCase: boolean): string[] {\n const req = this.requirements;\n const errors: string[] = [];\n if (req) {\n const minLengthMsg = 'The minimum password length is ' + req.minLength + '.';\n const maxLengthMsg = 'The maximum password length is ' + req.maxLength + '.';\n const uppercaseLettersMinLengthMsg =\n 'You must use at least ' + req.uppercaseLettersMinLength + ' uppercase letter(s).';\n const lowercaseLettersMinLengthMsg =\n 'You must use at least ' + req.lowercaseLettersMinLength + ' lowercase letter(s).';\n const numbersMinLengthMsg = 'You must use at least ' + req.numbersMinLength + ' number(s).';\n const symbolsMinLengthMsg = 'You must use at least ' + req.symbolsMinLength + ' symbol(s).';\n const includeMsg = 'The Password must include all the items specified.';\n const excludeMsg = 'The Password must exclude all the items specified.';\n const startsWithMsg = 'The password must start with ' + req.startsWith + '.';\n const endsWithMsg = 'The password must end with ' + req.endsWith + '.';\n const blackListMsg = 'Your password is in the blacklist.';\n const includeOneMsg = 'The Password must include at least one item specified [' + req.includeOne + '] .';\n\n const uniqueLettersMinLength = 'You must use at least ' + req.uniqueLettersMinLength + ' unique letter(s).';\n\n const upperCount = (text.match(/[A-Z]/g) || []).length;\n const lowerCount = (text.match(/[a-z]/g) || []).length;\n const numbersCount = (text.match(/[0-9]/g) || []).length;\n const symbolsCount = text.length - (upperCount + lowerCount + numbersCount);\n\n if (req.minLength) {\n let val: number;\n let msg = minLengthMsg;\n if (this.isIMessage(req.minLength)) {\n val = <number>req.minLength.value;\n msg = <string>req.minLength.message;\n } else {\n val = <number>req.minLength;\n }\n if (req.minLength && text.length < val) {\n errors.push(msg);\n }\n }\n if (req.maxLength) {\n let val: number;\n let msg = maxLengthMsg;\n if (this.isIMessage(req.maxLength)) {\n val = <number>req.maxLength.value;\n msg = <string>req.maxLength.message;\n } else {\n val = <number>req.maxLength;\n }\n if (req.maxLength && text.length > val) {\n errors.push(msg);\n }\n }\n if (req.startsWith) {\n let val: string;\n let msg = startsWithMsg;\n if (this.isIMessage(req.startsWith)) {\n val = <string>req.startsWith.value;\n msg = <string>req.startsWith.message;\n } else {\n val = <string>req.startsWith;\n }\n if (!this.startsWith(text, val)) {\n errors.push(msg);\n }\n }\n if (req.endsWith) {\n let val: string;\n let msg = endsWithMsg;\n if (this.isIMessage(req.endsWith)) {\n val = <string>req.endsWith.value;\n msg = <string>req.endsWith.message;\n } else {\n val = <string>req.endsWith;\n }\n if (!this.endsWith(text, val)) {\n errors.push(msg);\n }\n }\n\n if (req.uppercaseLettersMinLength) {\n let val: number;\n let msg = uppercaseLettersMinLengthMsg;\n if (this.isIMessage(req.uppercaseLettersMinLength)) {\n val = <number>req.uppercaseLettersMinLength.value;\n msg = <string>req.uppercaseLettersMinLength.message;\n } else {\n val = <number>req.uppercaseLettersMinLength;\n }\n if (val > upperCount) {\n errors.push(msg);\n }\n }\n\n if (req.lowercaseLettersMinLength) {\n let val: number;\n let msg = lowercaseLettersMinLengthMsg;\n if (this.isIMessage(req.lowercaseLettersMinLength)) {\n val = <number>req.lowercaseLettersMinLength.value;\n msg = <string>req.lowercaseLettersMinLength.message;\n } else {\n val = <number>req.lowercaseLettersMinLength;\n }\n if (val > lowerCount) {\n errors.push(msg);\n }\n }\n if (req.numbersMinLength) {\n let val: number;\n let msg = numbersMinLengthMsg;\n if (this.isIMessage(req.numbersMinLength)) {\n val = <number>req.numbersMinLength.value;\n msg = <string>req.numbersMinLength.message;\n } else {\n val = <number>req.numbersMinLength;\n }\n if (val > numbersCount) {\n errors.push(msg);\n }\n }\n if (req.symbolsMinLength) {\n let val: number;\n let msg = symbolsMinLengthMsg;\n if (this.isIMessage(req.symbolsMinLength)) {\n val = <number>req.symbolsMinLength.value;\n msg = <string>req.symbolsMinLength.message;\n } else {\n val = <number>req.symbolsMinLength;\n }\n if (val > symbolsCount) {\n errors.push(msg);\n }\n }\n if (req.uniqueLettersMinLength) {\n let val: number;\n let msg = uniqueLettersMinLength;\n if (this.isIMessage(req.uniqueLettersMinLength)) {\n val = <number>req.uniqueLettersMinLength.value;\n msg = <string>req.uniqueLettersMinLength.message;\n } else {\n val = <number>req.uniqueLettersMinLength;\n }\n const isValid = Array.from(new Set(text.split(''))).length >= val;\n if (req.uniqueLettersMinLength && !isValid) {\n errors.push(msg);\n }\n }\n if (req.include) {\n let val: string[];\n let msg = includeMsg;\n if (this.isIMessage(req.include)) {\n val = <string[]>req.include.value;\n msg = <string>req.include.message;\n } else {\n val = <string[]>req.include;\n }\n if (!this.contains(text, val)) {\n errors.push(msg);\n }\n }\n if (req.exclude) {\n let txt = text;\n let val: string[];\n let msg = excludeMsg;\n if (this.isIMessage(req.exclude)) {\n val = <string[]>req.exclude.value;\n msg = <string>req.exclude.message;\n } else {\n val = <string[]>req.exclude;\n }\n if (ignoreCase) {\n txt = text.toLowerCase();\n val = val.map((v) => v.toLowerCase());\n }\n if (!this.doesNotContains(txt, val)) {\n errors.push(msg);\n }\n }\n\n if (req.blackList) {\n let txt = text;\n let val: string[];\n let msg = blackListMsg;\n if (this.isIMessage(req.blackList)) {\n val = <string[]>req.blackList.value;\n msg = <string>req.blackList.message;\n } else {\n val = <string[]>req.blackList;\n }\n if (ignoreCase) {\n txt = text.toLowerCase();\n val = val.map((v) => v.toLowerCase());\n }\n if (this.isInBlackList(txt, val)) {\n errors.push(msg);\n }\n }\n\n if (req.includeOne) {\n let txt = text;\n let val: string[];\n let msg = includeOneMsg;\n if (this.isIMessage(req.includeOne)) {\n val = <string[]>req.includeOne.value;\n msg = <string>req.includeOne.message;\n } else {\n val = <string[]>req.includeOne;\n }\n if (ignoreCase) {\n txt = text.toLowerCase();\n val = val.map((v) => v.toLowerCase());\n }\n if (!this.containsOne(txt, val)) {\n errors.push(msg);\n }\n }\n\n return errors;\n }\n return [];\n }\n\n public getResults(passwords: string[], ignoreCase = false, skipReq = false): IResult[] {\n const results = [];\n if (passwords && passwords.length > 0) {\n for (let index = 0; index < passwords.length; index++) {\n results.push(this.getResult(passwords[index], ignoreCase, skipReq));\n }\n return results;\n }\n return [];\n }\n\n public getResult(password: string, ignoreCase = false, skipReq = false): IResult {\n if (password) {\n // Requirements\n const req = this.getRequirementsScore(password, ignoreCase);\n if (!skipReq && req.length) {\n return {\n score: -1,\n status: 'needs requirement(s)',\n errors: req,\n percent: 0,\n };\n }\n // Additions\n const len = this.getLengthScore(password);\n const upper = this.getUppercaseLettersScore(password);\n const lower = this.getLowercaseLettersScore(password);\n const num = this.getNumbersScore(password);\n const symbol = this.getSymbolsScore(password);\n // Deductions\n const letterOnly = this.getLettersOnlyScore(password);\n const numberOnly = this.getNumbersOnlyScore(password);\n const repetition = this.getRepeatCharactersScore(password);\n const consecutiveUpper = this.getConsecutiveUppercaseLettersScore(password);\n const consecutiveLower = this.getConsecutiveLowercaseLettersScore(password);\n const consecutiveNumber = this.getConsecutiveNumbersScore(password);\n const seqLetters = this.getSequentialLettersScore(password);\n const seqNumbers = this.getSequentialNumbersScore(password);\n const seqSymbols = this.getSequentialSymbolsScore(password);\n\n const score =\n len +\n upper +\n lower +\n num +\n symbol +\n letterOnly +\n numberOnly +\n repetition +\n consecutiveUpper +\n consecutiveLower +\n consecutiveNumber +\n seqLetters +\n seqNumbers +\n seqSymbols;\n\n const defaultRanges = {\n '40': 'veryWeak', // 001 <= x < 040\n '80': 'weak', // 040 <= x < 080\n '120': 'medium', // 080 <= x < 120\n '180': 'strong', // 120 <= x < 180\n '200': 'veryStrong', // 180 <= x < 200\n _: 'perfect', // >= 200\n };\n let stat = '';\n if (!this.scoreRange) {\n this.scoreRange = defaultRanges;\n }\n\n const range = Object.keys(this.scoreRange).sort(function (a: any, b: any) {\n if (isNaN(a) || isNaN(b)) {\n if (a > b) return 1;\n else return -1;\n }\n return a - b;\n });\n if (range.length < 2) {\n return {\n score: -2,\n status: 'error',\n errors: '\"scoreRange\" must have at least two members.',\n percent: 0,\n };\n }\n for (let index = 0; index < range.length; index++) {\n const key: any = range[index];\n if (key != undefined) {\n if (index == 0) {\n if (this.between(score, 1, parseFloat(range[index]))) {\n stat = this.scoreRange[range[0]];\n break;\n }\n }\n if (index === range.length - 1) {\n if (range[index] == '_') {\n if (this.between(score, parseFloat(range[index - 1]), 1000000000000000000)) {\n stat = this.scoreRange[range[range.length - 1]];\n break;\n }\n } else {\n return {\n score: -2,\n status: 'error',\n errors: 'The last member of the \"scoreRange\" must be \"_\".',\n percent: 0,\n };\n }\n }\n if (this.between(score, parseFloat(range[index - 1]), parseFloat(range[index]))) {\n stat = this.scoreRange[range[index]];\n break;\n }\n }\n }\n const percent = (score * 100) / parseFloat(range[range.length - 2]);\n\n let data = {\n score: score,\n status: stat,\n percent: percent >= 100 ? 100 : percent,\n };\n\n if (skipReq) {\n data = Object.assign(data, { errors: req });\n }\n\n return data;\n }\n return {\n score: 0,\n status: 'Empty',\n percent: 0,\n };\n }\n}\n"],"names":["PasswordMeter","requirements","scoreRange","this","uppercaseLetters","lowercaseLetters","numbers","prototype","startsWith","str","word","lastIndexOf","endsWith","indexOf","length","chunkString","len","_size","Math","ceil","_ret","Array","_offset","_i","substring","getLength","text","doesNotContains","list","every","x","contains","containsOne","some","isInBlackList","index","between","min","max","isIMessage","arg","undefined","message","isNumber","test","isLetter","isUppercaseLetter","isLowercaseLetter","isSymbol","getSymbols","result","getLengthScore","getUppercaseLettersScore","_this","n_1","split","forEach","value","getLowercaseLettersScore","n_2","getNumbersScore","n_3","getSymbolsScore","n_4","getLettersOnlyScore","getNumbersOnlyScore","getConsecutiveUppercaseLettersScore","results","match","score_1","getConsecutiveLowercaseLettersScore","score_2","getConsecutiveNumbersScore","score_3","reverseString","reverse","join","sequentialBuilder","minChunk","i","newText","arr","j","push","distinctArray","sortByLength","a","l","limit","sort","b","getSequentialLettersScore","uStr","lStr","score_4","uTxt_1","lTxt_1","replace","getSequentialNumbersScore","num","score_5","txt_1","getSequentialSymbolsScore","sym","score_6","txt_2","getRepeatCharactersScore","matches","maxResultLength","ratio","getRequirementsScore","ignoreCase","req","errors","minLengthMsg","minLength","maxLengthMsg","maxLength","uppercaseLettersMinLengthMsg","uppercaseLettersMinLength","lowercaseLettersMinLengthMsg","lowercaseLettersMinLength","numbersMinLengthMsg","numbersMinLength","symbolsMinLengthMsg","symbolsMinLength","startsWithMsg","endsWithMsg","includeOneMsg","includeOne","uniqueLettersMinLength","upperCount","lowerCount","numbersCount","symbolsCount","val","msg","isValid","from","Set","include","exclude","txt","toLowerCase","map","v","blackList","getResults","passwords","skipReq","getResult","password","score","status","percent","stat","_","range","Object","keys","isNaN","parseFloat","data","assign"],"mappings":"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"}