├── .gitignore ├── .npmignore ├── test ├── .eslintrc.js ├── base58.test.js └── examples.js ├── .travis.yml ├── .eslintrc.js ├── Makefile ├── package.json ├── README.md ├── LICENSE.md └── src └── base58.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | npm-debug.log -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .eslintrc.js 3 | .travis.yml 4 | Makefile 5 | node_modules 6 | package-lock.json 7 | -------------------------------------------------------------------------------- /test/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | mocha: true 4 | }, 5 | parserOptions: { 6 | "ecmaVersion": 6 7 | } 8 | }; 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | cache: 3 | directories: 4 | - node_modules 5 | node_js: 6 | - "node" 7 | - "6" 8 | - "7" 9 | - "8" 10 | - "9" 11 | - "10" 12 | - "11" 13 | 14 | script: 15 | - npm run lint 16 | - npm test 17 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | node: true 5 | }, 6 | extends: ["prettier"], 7 | plugins: ["prettier"], 8 | rules: { 9 | "prettier/prettier": "error" 10 | }, 11 | parserOptions: { 12 | "ecmaVersion": 6 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | NPM_EXECUTABLE_HOME := node_modules/.bin 2 | PATH := ${NPM_EXECUTABLE_HOME}:${PATH} 3 | 4 | publish: npm-dep 5 | npm publish 6 | 7 | test: npm-dep 8 | npm run test 9 | 10 | lint: npm-dep 11 | npm run lint 12 | 13 | npm-dep: 14 | test `which npm` || echo 'You need npm to do npm install... makes sense?' 15 | 16 | .SILENT: 17 | .PHONY: publish test lint npm-dep 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "base58", 3 | "version": "2.0.1", 4 | "keywords": [ 5 | "base58, flickr" 6 | ], 7 | "description": "Flickr Flavored Base58 Encoding and Decoding", 8 | "license": "MIT", 9 | "author": { 10 | "name": "Jim Myhrberg", 11 | "email": "contact@jimeh.me" 12 | }, 13 | "contributors": [ 14 | "Louis Buchbinder github@louisbuchbinder.com" 15 | ], 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/jimeh/node-base58.git" 19 | }, 20 | "main": "./src/base58", 21 | "engines": { 22 | "node": ">= 6" 23 | }, 24 | "devDependencies": { 25 | "eslint": "^5.6.0", 26 | "eslint-config-prettier": "^3.0.0", 27 | "eslint-plugin-prettier": "^2.7.0", 28 | "mocha": "^5.2.0", 29 | "prettier": "^1.14.3" 30 | }, 31 | "scripts": { 32 | "lint": "eslint .", 33 | "lint-fix": "eslint . --fix", 34 | "test": "mocha" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-base58 [![Build Status](https://secure.travis-ci.org/jimeh/node-base58.png)](http://travis-ci.org/jimeh/node-base58) 2 | 3 | A Base58 encoding and decoding library for [Node.js]. 4 | 5 | [node.js]: http://nodejs.org/ 6 | 7 | ## What? 8 | 9 | Base58 allows you to represent a numeric value with fewer characters, useful 10 | for short URLs among other things. Flickr is one the biggest sites that makes 11 | use of it for short photo URLs. 12 | 13 | For example `6857269519` becomes `brXijP` when Base58 encoded, and hence the 14 | Flickr short URL is: `http://flic.kr/p/brXijP` 15 | 16 | ## Installation 17 | 18 | npm install base58 19 | 20 | ## Usage 21 | 22 | ```javascript 23 | const Base58 = require('base58'); 24 | Base58.int_to_base58(6857269519); // 'brXijP' 25 | Base58.base58_to_int('brXijP'); // 6857269519 26 | ``` 27 | 28 | ## Credit 29 | 30 | This package is more or less a port of the [Base58][gem] Ruby Gem by the same 31 | name. 32 | 33 | [gem]: https://github.com/dougal/base58 34 | 35 | ## License 36 | 37 | Released under the MIT license. Copyright (c) 2018 Jim Myhrberg. 38 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018 Jim Myhrberg. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /src/base58.js: -------------------------------------------------------------------------------- 1 | const alphabet = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; 2 | const base = alphabet.length; 3 | 4 | // Create a lookup table to fetch character index 5 | const alphabetLookup = [...alphabet].reduce((lookup, char, index) => { 6 | lookup[char] = index; 7 | return lookup; 8 | }, {}); 9 | 10 | function assertNonNegativeSafeInteger(val) { 11 | if ( 12 | typeof val !== "number" || 13 | isNaN(val) || 14 | val < 0 || 15 | val > Number.MAX_SAFE_INTEGER || 16 | Math.floor(val) !== val 17 | ) { 18 | throw new Error("Value passed is not a non-negative safe integer."); 19 | } 20 | } 21 | 22 | function assertString(str) { 23 | if (typeof str !== "string") { 24 | throw new Error("Value passed is not a string."); 25 | } 26 | } 27 | 28 | function assertBase58Character(character) { 29 | if (alphabetLookup[character] === undefined) { 30 | throw new Error("Value passed is not a valid Base58 string."); 31 | } 32 | } 33 | 34 | exports.int_to_base58 = exports.encode = function(num) { 35 | let str = ""; 36 | let modulus; 37 | 38 | num = Number(num); 39 | 40 | assertNonNegativeSafeInteger(num); 41 | 42 | while (num >= base) { 43 | modulus = num % base; 44 | str = alphabet[modulus] + str; 45 | num = Math.floor(num / base); 46 | } 47 | 48 | return alphabet[num] + str; 49 | }; 50 | 51 | exports.base58_to_int = exports.decode = function(str) { 52 | assertString(str); 53 | 54 | return [...str].reverse().reduce((num, character, index) => { 55 | assertBase58Character(character); 56 | return num + alphabetLookup[character] * Math.pow(base, index); 57 | }, 0); 58 | }; 59 | -------------------------------------------------------------------------------- /test/base58.test.js: -------------------------------------------------------------------------------- 1 | const assert = require("assert"); 2 | const examples = require("./examples"); 3 | const base58 = require(".."); 4 | 5 | function exampleRunner(callback) { 6 | Object.keys(examples).forEach(function(str) { 7 | callback(str, examples[str]); 8 | }); 9 | } 10 | 11 | describe("Base58", function() { 12 | before(function() { 13 | var valid = true; 14 | var count = 0; 15 | 16 | exampleRunner(function(str, num) { 17 | count++; 18 | if (typeof str !== "string") { 19 | valid = false; 20 | } 21 | if (typeof num !== "number") { 22 | valid = false; 23 | } 24 | }); 25 | 26 | assert.strictEqual(count > 0, true, "Expected there to be examples"); 27 | assert.strictEqual(valid, true, "Expected the examples to be valid"); 28 | }); 29 | 30 | describe("backwards compatibility", function() { 31 | it(".encode() is an alias to .int_to_base58()", function() { 32 | assert.strictEqual(base58.encode, base58.int_to_base58); 33 | }); 34 | 35 | it(".decode() is an alias to .base58_to_int()", function() { 36 | assert.strictEqual(base58.decode, base58.base58_to_int); 37 | }); 38 | }); 39 | 40 | describe(".int_to_base58()", function() { 41 | it("encodes number to Base58 string", function() { 42 | exampleRunner(function(str, num) { 43 | assert.strictEqual(base58.int_to_base58(num), str); 44 | }); 45 | }); 46 | 47 | describe("when passed a string only containing numbers", function() { 48 | it("encodes string after first converting it to an integer", function() { 49 | exampleRunner(function(str, num) { 50 | assert.strictEqual(base58.int_to_base58(num.toString()), str); 51 | }); 52 | }); 53 | }); 54 | 55 | describe("when passed a non number", function() { 56 | it("throws an error", function() { 57 | assert.throws( 58 | function() { 59 | base58.int_to_base58("hi"); 60 | }, 61 | function(err) { 62 | return ( 63 | err.message === "Value passed is not a non-negative safe integer." 64 | ); 65 | } 66 | ); 67 | }); 68 | }); 69 | 70 | describe("when passed a float", function() { 71 | it("throws an error", function() { 72 | assert.throws( 73 | function() { 74 | base58.int_to_base58(3.14); 75 | }, 76 | function(err) { 77 | return ( 78 | err.message === "Value passed is not a non-negative safe integer." 79 | ); 80 | } 81 | ); 82 | }); 83 | }); 84 | 85 | describe("when passed a negative number", function() { 86 | it("throws an error", function() { 87 | assert.throws( 88 | function() { 89 | base58.int_to_base58(-300); 90 | }, 91 | function(err) { 92 | return ( 93 | err.message === "Value passed is not a non-negative safe integer." 94 | ); 95 | } 96 | ); 97 | }); 98 | }); 99 | 100 | describe("when passed a non-safe integer", function() { 101 | it("throws an error", function() { 102 | assert.throws( 103 | function() { 104 | base58.int_to_base58(1e100); 105 | }, 106 | function(err) { 107 | return ( 108 | err.message === "Value passed is not a non-negative safe integer." 109 | ); 110 | } 111 | ); 112 | }); 113 | }); 114 | }); 115 | 116 | describe(".base58_to_int()", function() { 117 | it("decodes base58 string to number", function() { 118 | exampleRunner(function(str, num) { 119 | assert.strictEqual(base58.base58_to_int(str), num); 120 | }); 121 | }); 122 | 123 | describe("when passed a non string", function() { 124 | it("throws an error", function() { 125 | assert.throws( 126 | function() { 127 | base58.base58_to_int(123); 128 | }, 129 | function(err) { 130 | return err.message === "Value passed is not a string."; 131 | } 132 | ); 133 | }); 134 | }); 135 | 136 | describe("when passed a non base58 string", function() { 137 | it("throws an error", function() { 138 | assert.throws( 139 | function() { 140 | base58.base58_to_int(">_<"); 141 | }, 142 | function(err) { 143 | return err.message === "Value passed is not a valid Base58 string."; 144 | } 145 | ); 146 | }); 147 | }); 148 | }); 149 | }); 150 | -------------------------------------------------------------------------------- /test/examples.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "6hKMCS": 3471391110, 3 | "6hDrmR": 3470152229, 4 | "6hHHZB": 3470988633, 5 | "6hHKum": 3470993664, 6 | "6hLgFW": 3471485480, 7 | "6hBRKR": 3469844075, 8 | "6hGRTd": 3470820062, 9 | "6hCuie": 3469966999, 10 | "6hJuXN": 3471139908, 11 | "6hJsyS": 3471131850, 12 | "6hFWFb": 3470641072, 13 | "6hENdZ": 3470417529, 14 | "6hEJqg": 3470404727, 15 | "6hGNaq": 3470807546, 16 | "6hDRoZ": 3470233089, 17 | "6hKkP9": 3471304242, 18 | "6hHVZ3": 3471028968, 19 | "6hNcfE": 3471860782, 20 | "6hJBqs": 3471161638, 21 | "6hCPyc": 3470031783, 22 | "6hJNrC": 3471198710, 23 | "6hKmkd": 3471305986, 24 | "6hFUYs": 3470635346, 25 | "6hK6UC": 3471257464, 26 | "6hBmiv": 3469744991, 27 | "6hKex1": 3471283122, 28 | "6hFHQj": 3470597870, 29 | "6hCA2n": 3469986263, 30 | "6hBTgt": 3469849157, 31 | "6hHEss": 3470976734, 32 | "6hLows": 3471508478, 33 | "6hD95z": 3470094097, 34 | "6hKjcq": 3471298806, 35 | "6hGEbd": 3470780680, 36 | "6hKSNS": 3471408510, 37 | "6hG8hv": 3470676761, 38 | "6hEmj6": 3470330361, 39 | "6hGjpn": 3470714163, 40 | "6hEsUr": 3470352537, 41 | "6hJEhy": 3471171272, 42 | "6hKBHn": 3471357731, 43 | "6hG3gi": 3470659871, 44 | "6hFJTT": 3470601441, 45 | "6hLZDs": 3471626624, 46 | "6hGdL7": 3470695182, 47 | "6hBpi4": 3469755057, 48 | "6hEuFV": 3470358539, 49 | "6hGVw1": 3470832288, 50 | "6hLdm1": 3471474232, 51 | "6hFcCK": 3470496279, 52 | "6hDZmR": 3470259877, 53 | "6hG8iX": 3470676845, 54 | "6hFZZL": 3470652242, 55 | "6hJ79u": 3471063156, 56 | "6hMsrS": 3471716780, 57 | "6hGH3G": 3470790336, 58 | "6hKqD3": 3471320476, 59 | "6hKxEY": 3471344136, 60 | "6hHVF1": 3471027922, 61 | "6hKDSQ": 3471365008, 62 | "6hKwHs": 3471340916, 63 | "6hH4s6": 3470858973, 64 | "6hGmKB": 3470722065, 65 | "6hEzdi": 3470373757, 66 | "6hJQwJ": 3471205734, 67 | "6hHd6a": 3470888035, 68 | "6hH1j3": 3470848414, 69 | "6hNP1u": 3471981064, 70 | "6hFWge": 3470639683, 71 | "6hFpmP": 3470535723, 72 | "6hCgQZ": 3469925109, 73 | "6hFJSm": 3470601352, 74 | "6hEd9v": 3470302893, 75 | "6hDwuF": 3470169503, 76 | "6hCVSX": 3470053055, 77 | "6hCUgr": 3470047631, 78 | "6hEsqR": 3470350937, 79 | "6hBmKg": 3469746485, 80 | "6hDvUx": 3470167523, 81 | "6hJUi7": 3471218400, 82 | "6hF39e": 3470464349, 83 | "6hH43K": 3470857619, 84 | "6hGSC5": 3470822548, 85 | "6hFz1s": 3470568182, 86 | "6hFaKZ": 3470489971, 87 | "6hD65K": 3470084015, 88 | "6hBAVk": 3469794165, 89 | "6hLkWA": 3471499786, 90 | "6hHi7q": 3470904928, 91 | "6hHdDF": 3470889921, 92 | "6hHcCo": 3470886482, 93 | "6hGQQf": 3470816526, 94 | "6hLAfo": 3471547914, 95 | "6hBDEV": 3469803421, 96 | "6hL4BE": 3471444864, 97 | "6hL2TT": 3471439077, 98 | "6hKcxb": 3471276404, 99 | "6hD1vg": 3470068617, 100 | "6hLtTT": 3471526541, 101 | "6hHXtw": 3471033984, 102 | "6hHCQj": 3470971274, 103 | "6hFrXx": 3470544465, 104 | "6hMVkJ": 3471807252, 105 | "6hDv6V": 3470164819, 106 | "6hD1gR": 3470067839, 107 | "6hShWW": 3472660386, 108 | "6hK4tb": 3471249260, 109 | "6hLzrQ": 3471545214, 110 | "6hBTAe": 3469850245, 111 | "6hLABq": 3471549134, 112 | "6hGbN7": 3470688570, 113 | "6hFtro": 3470549444, 114 | "6hRRAQ": 3472575120, 115 | "6hFViL": 3470636466, 116 | "6hFkLP": 3470523659, 117 | "6hNAKc": 3471939809, 118 | "6hLLNE": 3471583426, 119 | "6hJstp": 3471131533, 120 | "6hHxv3": 3470953336, 121 | "6hLToQ": 3471605592, 122 | "6hJ74F": 3471062877, 123 | "6hGjCA": 3470714930, 124 | "6hCQoD": 3470034593, 125 | "6hCqxX": 3469954397, 126 | "6hCbg8": 3469906325, 127 | "6hJwGw": 3471145750, 128 | "6hP2Tt": 3472024389, 129 | "6hHDuy": 3470973492, 130 | "6hGRpq": 3470818450, 131 | "6hDx8F": 3470171649, 132 | "6hLhxU": 3471488378, 133 | "6hFrkd": 3470542358, 134 | "6hPc3D": 3472055197, 135 | "6hJV29": 3471220838, 136 | "6hCc3c": 3469908939, 137 | "6hLycA": 3471541024, 138 | "6hLd75": 3471473424, 139 | "6hKJ1m": 3471378900, 140 | "6hHgEG": 3470900072, 141 | "6hFNfm": 3470612720, 142 | "6hFsaF": 3470545169, 143 | "6hERqV": 3470428313, 144 | "6hEnYK": 3470335967, 145 | "6hDGeT": 3470202285, 146 | "6hFDZo": 3470584940, 147 | "6hMvPE": 3471728136, 148 | "6hKTro": 3471410628, 149 | "6hKfXG": 3471287918, 150 | "6hKeuU": 3471283000, 151 | "6hHFYj": 3470981830, 152 | "6hHDzj": 3470973768, 153 | "6hCozt": 3469947757, 154 | "6hKB8D": 3471355775, 155 | "6hCtrc": 3469964097, 156 | "6hDXcx": 3470252609, 157 | "6hCxSR": 3469979041, 158 | "6hC1Vk": 3469874901, 159 | "6hKmaS": 3471305444, 160 | "6hK9fn": 3471265337, 161 | "6hFDH6": 3470583995, 162 | "6hEB7c": 3470380131, 163 | "6hC1E2": 3469874013, 164 | "6hBZnx": 3469869693, 165 | "6hBXNz": 3469864417, 166 | "6hQKjm": 3472358868, 167 | "6hHn4j": 3470918204, 168 | "6hHiQ2": 3470907341, 169 | "6hHhHb": 3470903580, 170 | "6hGnBc": 3470724941, 171 | "6hG6Ht": 3470671481, 172 | "6hDvh6": 3470165409, 173 | "6hCGtp": 3470007957, 174 | "6hCnzi": 3469944383, 175 | "6hMxEY": 3471734360, 176 | "6hG9sL": 3470680720, 177 | "6hCarn": 3469903555, 178 | "6hLsdE": 3471520902, 179 | "6hKnDa": 3471310391, 180 | "6hKn2L": 3471308338, 181 | "6hGpfH": 3470730481, 182 | "6hRkJS": 3472474666, 183 | "6hFEV3": 3470588052, 184 | "6hE7VV": 3470285343, 185 | "6hSSAq": 3472773572, 186 | "6hNTtQ": 3471996106, 187 | "6hMAuK": 3471743859, 188 | "6hJ95H": 3471069665, 189 | "6hHZ39": 3471039240, 190 | "6hByNi": 3469787029, 191 | "6hLLnb": 3471581948, 192 | "6hHYoQ": 3471037076, 193 | "6hHCLm": 3470971044, 194 | "6hFHkC": 3470596206, 195 | "6hDKq4": 3470212967, 196 | "6hRapC": 3472439910, 197 | "6hKJBs": 3471380936, 198 | "6hHids": 3470905278, 199 | "6hEJ8R": 3470403775, 200 | "6hMY3L": 3471816360, 201 | "6hFRAC": 3470623988, 202 | "6hEP9c": 3470420615, 203 | "6hEqVR": 3470345891, 204 | "6hHGBX": 3470984013, 205 | "6hEzFB": 3470375341, 206 | "6hDnRp": 3470140429, 207 | "6hDdQH": 3470110113, 208 | "6hCK7B": 3470016843, 209 | "6hCxvH": 3469977815, 210 | "6hC4v4": 3469883585, 211 | "6hC15g": 3469872055, 212 | "6hGHRA": 3470793056, 213 | "6hGCGL": 3470775724, 214 | "6hGbuW": 3470687574, 215 | "6hT7FY": 3472820990, 216 | "6hMFHs": 3471761416, 217 | "6hJybH": 3471150749, 218 | "6hGEFs": 3470782376, 219 | "6hCBnX": 3469990821, 220 | "6hNJZt": 3471967549, 221 | "6hMxUV": 3471735169, 222 | "6hLoGG": 3471509072, 223 | "6hJdy5": 3471084708, 224 | "6hGnwp": 3470724663, 225 | "6hGkhZ": 3470717157, 226 | "6hG7yd": 3470674308, 227 | "6hDAqF": 3470182727, 228 | "6hPQVJ": 3472182628, 229 | "6hHyqy": 3470956440, 230 | "6hFG6k": 3470592013, 231 | "6hTavC": 3472830482, 232 | "6hJjzU": 3471104998, 233 | "6hFE7r": 3470585349, 234 | "6hNQU7": 3471987422, 235 | "6hJYSj": 3471233782, 236 | "6hFVRB": 3470638313, 237 | "6hEeQt": 3470308575, 238 | "6hBmnK": 3469745237, 239 | "6hP9VU": 3472048078, 240 | "6hJeDp": 3471088381, 241 | "6hHV4d": 3471025846, 242 | "6hFXmS": 3470643374, 243 | "6hBgEn": 3469729381, 244 | "6hNDjB": 3471948475, 245 | "6hKEkd": 3471366538, 246 | "6hJDq6": 3471168345, 247 | "6hHbCG": 3470883136, 248 | "6hCgN2": 3469924937, 249 | "6hQa3S": 3472243594, 250 | "6hLphv": 3471511033, 251 | "6hHoqd": 3470922780, 252 | "6hGT2W": 3470823932, 253 | "6hEd6V": 3470302743, 254 | "6hNac3": 3471853844, 255 | "6hHzYe": 3470961641, 256 | "6hRDAC": 3472534740, 257 | "6hJ2bu": 3471046452, 258 | "6hGRPN": 3470819864, 259 | "6hFS6P": 3470625681, 260 | "6hG8Yn": 3470679073, 261 | "6hFSGB": 3470627699, 262 | "6hFQhL": 3470619588, 263 | "6hF4VT": 3470470361, 264 | "6hE7vD": 3470283935, 265 | "6hBeKa": 3469722931, 266 | "6hPLs1": 3472167564, 267 | "6hHcKm": 3470886886, 268 | "6hG9KW": 3470681716, 269 | "6hE8E4": 3470287787, 270 | "6hNp1U": 3471900352, 271 | "6hJ29T": 3471046359, 272 | "6hHPLb": 3471008038, 273 | "6hGWGq": 3470836256, 274 | "6hEipV": 3470320607, 275 | "6hMB8U": 3471746014, 276 | "6hKWyr": 3471421129, 277 | "6hKLxb": 3471387416, 278 | "6hJstE": 3471131548, 279 | "6hHk3k": 3470911419, 280 | "6hPSdE": 3472186974, 281 | "6hPfEY": 3472067396, 282 | "6hGVSS": 3470833498, 283 | "6hFVX4": 3470638629, 284 | "6hFQRa": 3470621467, 285 | "6hCsKK": 3469961809, 286 | "6hJbdY": 3471076872, 287 | "6hE2ok": 3470266691, 288 | "6hCrc8": 3469956553, 289 | "6hRgwS": 3472460514, 290 | "6hPhLY": 3472074472, 291 | "6hLTK1": 3471606762, 292 | "6hHh5u": 3470901452, 293 | "6hDiBB": 3470126173, 294 | "6hD678": 3470084095, 295 | "6hKMXC": 3471392198, 296 | "6hBohi": 3469751649, 297 | "6hJXRV": 3471230395, 298 | "6hFzad": 3470568690, 299 | "6hCCbH": 3469993533, 300 | "6hLpoA": 3471511386, 301 | "6hKZQN": 3471432170, 302 | "6hG3Ax": 3470660987, 303 | "6hT7kf": 3472819788, 304 | "6hKrzq": 3471323630, 305 | "6hHMHM": 3471001171, 306 | "6hHL9q": 3470995872, 307 | "6hBUkR": 3469852775, 308 | "6hRRLf": 3472575666, 309 | "6hJFUg": 3471176707, 310 | "6hBML2": 3469830629, 311 | "6hS9eE": 3472631080, 312 | "6hPD3o": 3472142646, 313 | "6hKWhL": 3471420220, 314 | "6hJMpr": 3471195219, 315 | "6hHzVA": 3470961488, 316 | "6hGvu9": 3470751444, 317 | "6hGkTu": 3470719158, 318 | "6hF7bv": 3470477937, 319 | "6hDzQp": 3470180739, 320 | "6hQ2Mo": 3472219148, 321 | "6hM7Tn": 3471650979, 322 | "6hJWDp": 3471226305, 323 | "6hJpX5": 3471123046, 324 | "6hNLTn": 3471973923, 325 | "6hGuRu": 3470749318, 326 | "6hG1CM": 3470654389, 327 | "6hEMDx": 3470415589, 328 | "6hCYpx": 3470061557, 329 | "6hCSTr": 3470042991, 330 | "6hBnJr": 3469749801, 331 | "6hRZSh": 3472602928, 332 | "6hRtVW": 3472502220, 333 | "6hDzc2": 3470178571, 334 | "6hCMan": 3470023731, 335 | "6hRfUj": 3472458394, 336 | "6hLdME": 3471475720, 337 | "6hE69P": 3470279363, 338 | "6hDgaa": 3470117911, 339 | "6hDeKg": 3470113161, 340 | "6hKSis": 3471406804, 341 | "6hKwYj": 3471341778, 342 | "6hJ4Ro": 3471055436, 343 | "6hHTug": 3471020571, 344 | "6hHSH2": 3471017947, 345 | "6hHCE6": 3470970681, 346 | "6hG5R5": 3470668558, 347 | "6hFaBX": 3470489505, 348 | "6hL13o": 3471432842, 349 | "6hJtQr": 3471136117, 350 | "6hHpg3": 3470925612, 351 | "6hGinv": 3470710691, 352 | "6hFQXR": 3470621855, 353 | "6hCKN6": 3470019133, 354 | "6hJme9": 3471110522, 355 | "6hGUY8": 3470830439, 356 | "6hEDPM": 3470389271, 357 | "6hBg1c": 3469727167, 358 | "6hNyoj": 3471931870, 359 | "6hNdQu": 3471866108, 360 | "6hMNAK": 3471784575, 361 | "6hHkvV": 3470913019, 362 | "6hDHLi": 3470207413, 363 | "6hCwUk": 3469975763, 364 | "6hCd2a": 3469912243, 365 | "6hPeRd": 3472064626, 366 | "6hP4SL": 3472031076, 367 | "6hJQFC": 3471206250, 368 | "6hJLVJ": 3471193612, 369 | "6hJAJT": 3471159343, 370 | "6hJ8Mi": 3471068655, 371 | "6hJ6o5": 3471060580, 372 | "6hH667": 3470864484, 373 | "6hH5RU": 3470863718, 374 | "6hC2jx": 3469876247, 375 | "6hPm75": 3472085672, 376 | "6hN8ud": 3471848112, 377 | "6hLD4g": 3471557361, 378 | "6hGAr2": 3470768083, 379 | "6hFVQH": 3470638261, 380 | "6hDxtV": 3470172823, 381 | "6hPNwj": 3472174542, 382 | "6hKTB7": 3471411192, 383 | "6hJdfQ": 3471083708, 384 | "6hRvdq": 3472506540, 385 | "6hNpN9": 3471902976, 386 | "6hMd75": 3471668536, 387 | "6hLkks": 3471497748, 388 | "6hHkYn": 3470914553, 389 | "6hGZgY": 3470844930, 390 | "6hGorv": 3470727743, 391 | "6hG941": 3470679342, 392 | "6hC6xK": 3469890469, 393 | "6hTA5N": 3472913142, 394 | "6hNzGE": 3471936298, 395 | "6hN3F1": 3471831918, 396 | "6hLdgN": 3471473988, 397 | "6hFyvS": 3470566524, 398 | "6hCxUM": 3469979153, 399 | "6hCmje": 3469940145, 400 | "6hC87z": 3469895737, 401 | "6hC4mV": 3469883113, 402 | "6hQXaJ": 3472398736, 403 | "6hP6Tw": 3472037848, 404 | "6hLx7r": 3471537361, 405 | "6hFvYh": 3470557964, 406 | "6hEPWM": 3470423317, 407 | "6hDKDT": 3470213769, 408 | "6hBrcn": 3469761455, 409 | "6hBkh4": 3469741543, 410 | "6hMdbq": 3471668788, 411 | "6hK3cE": 3471244996, 412 | "6hJSUj": 3471213714, 413 | "6hJvFs": 3471142324, 414 | "6hHVMu": 3471028298, 415 | "6hHUZG": 3471025642, 416 | "6hHeVT": 3470894225, 417 | "6hFqjr": 3470538949, 418 | "6hETNt": 3470436291, 419 | "6hEPkX": 3470421297, 420 | "6hCVrB": 3470051585, 421 | "6hCE2V": 3469999751, 422 | "6hNe3j": 3471866794, 423 | "6hKjmA": 3471299338, 424 | "6hHbMp": 3470883641, 425 | "6hGWJ7": 3470836354, 426 | "6hGn3F": 3470723055, 427 | "6hFoKL": 3470533690, 428 | "6hETWx": 3470436759, 429 | "6hPaH5": 3472050698, 430 | "6hNFFf": 3471956400, 431 | "6hNnyp": 3471895451, 432 | "6hM7ra": 3471649459, 433 | "6hHof7": 3470922194, 434 | "6hH8KM": 3470873455, 435 | "6hGbCG": 3470688024, 436 | "6hDXaB": 3470252497, 437 | "6hDSF2": 3470237383, 438 | "6hDfq8": 3470115415, 439 | "6hCqqR": 3469953985, 440 | "6hPpj7": 3472096462, 441 | "6hMSHG": 3471798434, 442 | "6hKyF6": 3471347507, 443 | "6hK33v": 3471244465, 444 | "6hJwva": 3471145091, 445 | "6hGX9e": 3470837753, 446 | "6hFWeR": 3470639603, 447 | "6hD8oF": 3470091783, 448 | "6hCopg": 3469947165, 449 | "6hC9L8": 3469901279, 450 | "6hBhS4": 3469733423, 451 | "6hMQXy": 3471792510, 452 | "6hLoRU": 3471509606, 453 | "6hKCib": 3471359692, 454 | "6hKder": 3471278739, 455 | "6hHYPy": 3471038510, 456 | "6hD4hz": 3470077973, 457 | "6hPgTS": 3472071508, 458 | "6hNXii": 3472008951, 459 | "6hKYzE": 3471427928, 460 | "6hKSr2": 3471407243, 461 | "6hG4fB": 3470663195, 462 | "6hFyz2": 3470566707, 463 | "6hFoMT": 3470533813, 464 | "6hC5V4": 3469888341, 465 | "6hBZmZ": 3469869661, 466 | "6hPXKU": 3472205606, 467 | "6hHVwm": 3471027420, 468 | "6hCzFH": 3469985123, 469 | "6hCvsM": 3469970917, 470 | "6hChKr": 3469928151, 471 | "6hBv6F": 3469774581, 472 | "6hPf62": 3472065427, 473 | "6hNS4s": 3471991328, 474 | "6hNPXe": 3471984239, 475 | "6hLguh": 3471484804, 476 | "6hJ5zB": 3471057885, 477 | "6hHr6j": 3470931776, 478 | "6hLBUx": 3471553491, 479 | "6hLi1P": 3471489939, 480 | "6hKQ35": 3471399184, 481 | "6hKK67": 3471382540, 482 | "6hHUcT": 3471022985, 483 | "6hGPjm": 3470811428, 484 | "6hF5ti": 3470472183, 485 | "6hDZPz": 3470261427, 486 | "6hC17D": 3469872193, 487 | "6hR7R3": 3472431292, 488 | "6hN7hS": 3471844090, 489 | "6hHqoC": 3470929416, 490 | "6hFDdx": 3470582339, 491 | "6hFzdL": 3470568896, 492 | "6hDuEH": 3470163357, 493 | "6hCaZk": 3469905409, 494 | "6hT2Hw": 3472804260, 495 | "6hPhJY": 3472074356, 496 | "6hKNBy": 3471394398, 497 | "6hJPEq": 3471202816, 498 | "6hGMH7": 3470806020, 499 | "6hGp5L": 3470729904, 500 | "6hFfRV": 3470507135, 501 | "6hESHt": 3470432637 502 | }; 503 | --------------------------------------------------------------------------------