2020-01-10 09:01:00 +03:00
"use strict" ;
const { resolve } = require ( "path" ) ;
const fs = require ( "fs" ) ;
const ts = require ( "typescript" ) ;
function getDefinitions ( source ) {
const sourceFile = ts . createSourceFile ( "filename.ts" , source ) ;
const defs = [ ] ;
function add ( type , name , pos ) {
const lineNo = sourceFile . getLineAndCharacterOfPosition ( pos ) . line + 1 ;
name = type + "." + name
defs . push ( { type , name , lineNo } ) ;
}
let lastClass = null , lastEnum = null ;
function visit ( node , depth ) {
if ( ts . isConstructorDeclaration ( node ) ) {
add ( "constructor" , lastClass , node . body . pos ) ;
} else if ( ts . isFunctionDeclaration ( node ) ) {
add ( "function" , node . name . text , node . name . end ) ;
} else if ( ts . isConstructorDeclaration ( node ) ) {
add ( "constructor" , lastClass , node . pos ) ;
} else if ( ts . isClassDeclaration ( node ) ) {
lastClass = node . name . escapedText ;
add ( "class" , lastClass , node . name . end ) ;
} else if ( ts . isMethodDeclaration ( node ) ) {
if ( lastClass == null ) { throw new Error ( "missing class" ) ; }
if ( ts . hasStaticModifier ( node ) ) {
add ( "staticmethod" , ( lastClass + "." + node . name . text ) , node . name . end ) ;
} else {
add ( "method" , ( lastClass + "." + node . name . text ) , node . name . end ) ;
}
} else if ( ts . isEnumDeclaration ( node ) ) {
lastEnum = node . name . escapedText ;
add ( "enum" , lastEnum , node . name . end ) ;
} else if ( ts . isEnumMember ( node ) ) {
add ( "enum" , ( lastEnum + "." + node . name . escapedText ) , node . name . end ) ;
} else if ( ts . isVariableDeclaration ( node ) ) {
if ( depth === 3 ) {
add ( "var" , node . name . escapedText , node . name . end ) ;
}
2021-02-05 02:46:27 +03:00
} else if ( ts . isGetAccessorDeclaration ( node ) ) {
add ( "getter" , ( lastClass + "." + node . name . text ) , node . name . end ) ;
2020-01-10 09:01:00 +03:00
}
ts . forEachChild ( node , ( node ) => { return visit ( node , depth + 1 ) ; } ) ;
}
visit ( sourceFile , 0 ) ;
return defs ;
}
const getSourceUrl = ( function ( path , include , exclude ) {
console . log ( "Scanning TypeScript Sources..." ) ;
2020-07-03 08:44:17 +03:00
const Link = "https://github.com/ethers-io/ethers.js/blob/master/packages$FILENAME#L$LINE" ;
2020-01-10 09:01:00 +03:00
const Root = resolve ( _ _dirname , path ) ;
const readdir = function ( path ) {
if ( path . match ( exclude ) ) { return [ ] ; }
const stat = fs . statSync ( path ) ;
if ( stat . isDirectory ( ) ) {
return fs . readdirSync ( path ) . reduce ( ( result , filename ) => {
readdir ( resolve ( path , filename ) ) . forEach ( ( file ) => {
result . push ( file ) ;
} ) ;
return result ;
} , [ ] ) ;
}
if ( path . match ( include ) ) {
const source = fs . readFileSync ( path ) . toString ( ) ;
return [ { filename : path . substring ( Root . length ) , defs : getDefinitions ( source ) } ]
}
return [ ] ;
}
const defs = readdir ( Root ) ;
return function getSourceUrl ( key ) {
const comps = key . split ( ":" ) ;
if ( comps . length !== 2 ) { throw new Error ( "unsupported key" ) ; }
const pathCheck = new RegExp ( "(^|[^a-zA-Z0-9_])" + comps [ 0 ] . split ( "/" ) . join ( "/(.*/)*" ) + "($|[^a-zA-Z0-9_])" ) ;
let match = comps [ 1 ] ;
if ( match . indexOf ( "(" /* fix: )*/ ) ) {
match = new RegExp ( "(^|\\.)" + match . split ( "(" /* fix: ) */ ) [ 0 ] + "$" ) ;
} else if ( match [ 0 ] === "=" ) {
match = new RegExp ( "^" + match . substring ( 1 ) + "$" ) ;
} else {
match = new RegExp ( "(^|\\.)" + match + "$" ) ;
}
const result = [ ] ;
defs . forEach ( ( def ) => {
if ( ! def . filename . match ( pathCheck ) ) { return ; }
def . defs . forEach ( ( d ) => {
if ( ! d . name . match ( match ) ) { return ; }
2020-02-25 22:57:11 +03:00
result . push ( { filename : def . filename , lineNo : d . lineNo , name : d . name } ) ;
2020-01-10 09:01:00 +03:00
} ) ;
} ) ;
if ( result . length > 1 ) {
2020-02-25 22:57:11 +03:00
throw new Error ( ` Ambiguous TypeScript link: ${ key } in [ ${ result . map ( ( r ) => JSON . stringify ( r . filename + ":" + r . lineNo + "@" + r . name ) ) . join ( ", " ) } ] ` ) ;
2020-01-10 09:01:00 +03:00
} else if ( result . length === 0 ) {
throw new Error ( ` No matching TypeScript link: ${ key } ` ) ;
}
return Link
. replace ( "$LINE" , String ( result [ 0 ] . lineNo ) )
. replace ( "$FILENAME" , result [ 0 ] . filename ) ;
}
} ) ( "../packages/" , new RegExp ( "packages/.*/src.ts/.*\.ts$" ) , new RegExp ( "/node_modules/|src.ts/.*browser.*" ) ) ;
2020-04-19 09:18:20 +03:00
function codeContextify ( context ) {
2020-05-08 10:24:40 +03:00
const { inspect } = require ( "util" ) ;
2020-04-19 09:18:20 +03:00
const ethers = context . require ( "./packages/ethers" ) ;
context . ethers = ethers ;
context . BigNumber = ethers . BigNumber ;
context . constants = ethers . constants ;
context . utils = ethers . utils ;
context . arrayify = ethers . utils . arrayify ;
context . hexlify = ethers . utils . hexlify ;
context . hexValue = ethers . utils . hexValue ;
context . Wallet = ethers . Wallet ;
2020-11-23 07:03:50 +03:00
context . provider = new ethers . providers . InfuraProvider ( "mainnet" , "49a0efa3aaee4fd99797bfa94d8ce2f1" ) ;
2020-04-19 09:18:20 +03:00
2020-12-09 02:30:34 +03:00
// We use a local dev node for some signing examples, but want to
// resolve ENS names against mainnet; super hacky but makes the
// docs nicer
context . localProvider = new ethers . providers . JsonRpcProvider ( ) ;
context . localSigner = context . localProvider . getSigner ( ) ;
context . localProvider . resolveName = context . provider . resolveName . bind ( context . provider ) ;
2020-05-08 10:24:40 +03:00
context . BigNumber . prototype [ inspect . custom ] = function ( depth , options ) {
return ` { BigNumber: ${ JSON . stringify ( this . toString ( ) ) } } ` ;
}
context . _inspect = function ( value , depth ) {
2020-06-12 10:38:55 +03:00
if ( value && value . constructor && value . constructor . name === "Uint8Array" ) {
return ` Uint8Array [ ${ Array . prototype . join . call ( value , ", " ) } ] ` ;
2020-04-19 09:18:20 +03:00
}
2020-05-08 10:24:40 +03:00
//return JSON.stringify(value);
return inspect ( value , {
compact : false ,
2020-11-23 07:03:50 +03:00
depth : null ,
2020-06-12 10:38:55 +03:00
breakLength : Infinity ,
2020-05-08 10:24:40 +03:00
sorted : true ,
} ) ;
2020-04-19 09:18:20 +03:00
}
}
2020-06-12 10:38:55 +03:00
2020-01-10 09:01:00 +03:00
module . exports = {
title : "ethers" ,
2021-04-22 13:34:44 +03:00
subtitle : "v5.1" ,
2021-02-05 02:46:27 +03:00
description : "Documentation for ethers, a complete, tiny and simple Ethereum library." ,
2020-01-10 09:01:00 +03:00
logo : "logo.svg" ,
2020-02-02 15:58:29 +03:00
2021-02-05 02:46:27 +03:00
socialImage : "social.jpg" ,
2020-06-12 10:38:55 +03:00
prefix : "/v5" ,
2020-07-03 08:44:17 +03:00
link : "https:/\/docs.ethers.io" ,
2020-05-08 10:24:40 +03:00
copyright : "The content of this site is licensed under the [Creative Commons License](https:/\/choosealicense.com/licenses/cc-by-4.0/). Generated on &$now;." ,
2020-02-02 15:58:29 +03:00
2020-01-10 09:01:00 +03:00
markdown : {
2020-07-03 08:44:17 +03:00
"banner" : "-----\n\nDocumentation: [html](https://docs.ethers.io/)\n\n-----\n\n"
2020-01-10 09:01:00 +03:00
} ,
2020-02-02 15:58:29 +03:00
2020-04-19 09:18:20 +03:00
codeContextify : codeContextify ,
2020-02-02 15:58:29 +03:00
getSourceUrl : getSourceUrl ,
2020-04-17 05:25:05 +03:00
codeRoot : "../" ,
2020-02-02 15:58:29 +03:00
externalLinks : {
2021-02-05 02:46:27 +03:00
"link-mail" : "mailto:me@ricmoo.com" ,
2020-06-12 10:38:55 +03:00
"link-alchemy" : { name : "Alchemy" , url : "https:/\/alchemyapi.io" } ,
"link-cloudflare" : { name : "Cloudflare" , url : "https:/\/developers.cloudflare.com/distributed-web/ethereum-gateway/" } ,
"link-ens" : { name : "ENS" , url : "https:/\/ens.domains/" } ,
"link-ethereum" : { name : "Ethereum" , url : "https:/\/ethereumorg" } ,
"link-etherscan" : { name : "Etherscan" , url : "https:/\/etherscan.io" } ,
2020-09-08 02:40:50 +03:00
"link-expo" : { name : "Expo" , url : "https:/\/expo.io" } ,
2020-02-02 15:58:29 +03:00
"link-etherscan-api" : "https:/\/etherscan.io/apis" ,
2020-06-12 10:38:55 +03:00
"link-flatworm" : { name : "Flatworm" , url : "https:/\/github.com/ricmoo/flatworm" } ,
2020-05-08 10:24:40 +03:00
"link-geth" : { name : "Geth" , url : "https:/\/geth.ethereum.org" } ,
"link-infura" : { name : "INFURA" , url : "https:/\/infura.io" } ,
2020-09-08 02:40:50 +03:00
"link-javascriptcore" : { name : "JavaScriptCore" , url : "https:/\/developer.apple.com/documentation/javascriptcore?language=objc" } ,
2020-02-02 15:58:29 +03:00
"link-ledger" : "https:/\/www.ledger.com" ,
2020-05-08 10:24:40 +03:00
"link-metamask" : { name : "Metamask" , url : "https:/\/metamask.io/" } ,
2020-07-08 06:20:32 +03:00
"link-otto" : "https:/\/github.com/robertkrimen/otto" ,
2020-05-08 10:24:40 +03:00
"link-parity" : { name : "Parity" , url : "https:/\/www.parity.io" } ,
2020-11-23 07:03:50 +03:00
"link-pocket" : { name : "Pocket Network" , url : "https:/\/pokt.network" } ,
2020-09-08 02:40:50 +03:00
"link-react-native" : { name : "React Native" , url : "https:/\/reactnative.dev" } ,
2020-02-02 15:58:29 +03:00
"link-rtd" : "https:/\/github.com/readthedocs/sphinx_rtd_theme" ,
2020-04-17 05:25:05 +03:00
"link-semver" : { name : "semver" , url : "https:/\/semver.org" } ,
2021-02-05 02:46:27 +03:00
"link-solidity" : { name : "Solidity" , url : "https:/\/solidity.readthedocs.io/" } ,
"link-solidity-events" : "https:/\/docs.soliditylang.org/en/v0.8.1/abi-spec.html#events" ,
2020-06-12 10:38:55 +03:00
"link-sphinx" : { name : "Sphinx" , url : "https:/\/www.sphinx-doc.org/" } ,
2020-02-02 15:58:29 +03:00
2020-10-07 07:09:10 +03:00
"link-alchemy-signup" : "https:/\/dashboard.alchemyapi.io/signup?referral=55a35117-028e-4b7c-9e47-e275ad0acc6d" ,
2020-07-14 09:12:59 +03:00
"link-etherscan-signup" : "https:/\/etherscan.io/apis" ,
"link-etherscan-ratelimit" : "https:/\/info.etherscan.com/api-return-errors/" ,
"link-infura-signup" : "https:/\/infura.io/register" ,
2020-11-23 07:03:50 +03:00
"link-pocket-signup" : "https:/\/pokt.network/pocket-gateway-ethereum-mainnet/" ,
2020-07-14 09:12:59 +03:00
2020-05-08 10:24:40 +03:00
"link-json-rpc" : "https:/\/github.com/ethereum/wiki/wiki/JSON-RPC" ,
2020-06-12 10:38:55 +03:00
"link-web3-send" : "https:/\/github.com/ethereum/web3.js/blob/1.x/packages/web3-providers-http/types/index.d.ts#L57" ,
2020-05-08 10:24:40 +03:00
"link-parity-trace" : "https:/\/openethereum.github.io/wiki/JSONRPC-trace-module" ,
"link-parity-rpc" : "https:/\/openethereum.github.io/wiki/JSONRPC" ,
"link-geth-debug" : "https:/\/github.com/ethereum/go-ethereum/wiki/Management-APIs#debug" ,
"link-geth-rpc" : "https:/\/github.com/ethereum/go-ethereum/wiki/Management-APIs" ,
2020-06-12 10:38:55 +03:00
"link-legacy-docs3" : "https:/\/docs.ethers.io/v3/" ,
"link-legacy-docs4" : "https:/\/docs.ethers.io/v4/" ,
2020-02-02 15:58:29 +03:00
2020-07-08 06:20:32 +03:00
"link-github-ci" : "https:/\/github.com/ethers-io/ethers.js/actions/runs/158006903" ,
"link-github-issues" : "https:/\/github.com/ethers-io/ethers.js/issues" ,
"link-issue-407" : "https:/\/github.com/ethers-io/ethers.js/issues/407" ,
2020-05-08 10:24:40 +03:00
"link-infura-secret" : "https:/\/infura.io/docs/gettingStarted/authentication" ,
2020-02-02 15:58:29 +03:00
"link-web3" : "https:/\/github.com/ethereum/web3.js" ,
"link-web3-http" : "https:/\/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-http" ,
"link-web3-ipc" : "https:/\/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ipc" ,
"link-web3-ws" : "https:/\/github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ws" ,
"link-solc-output" : "https:/\/solidity.readthedocs.io/en/v0.6.0/using-the-compiler.html#output-description" ,
2020-06-12 10:38:55 +03:00
"link-bip39-wordlists" : "https:/\/github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md" ,
2020-02-02 15:58:29 +03:00
"link-icap" : "https:/\/github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-%28ICAP%29" ,
"link-jsonrpc" : "https:/\/github.com/ethereum/wiki/wiki/JSON-RPC" ,
2020-06-12 10:38:55 +03:00
"link-mit" : { name : "MIT License" , url : "https:/\/en.m.wikipedia.org/wiki/MIT_License" } ,
"link-namehash" : { name : "namehash" , url : "https:/\/docs.ens.domains/contract-api-reference/name-processing#hashing-names" } ,
2020-02-18 01:56:13 +03:00
"link-rlp" : { name : "Recursive Length Prefix" , url : "https:/\/github.com/ethereum/wiki/wiki/RLP" } ,
2020-02-02 15:58:29 +03:00
"link-ethersio" : "https:/\/ethers.io/" ,
"link-ethers-docs" : "https:/\/docs.ethers.io/" ,
2021-04-22 13:34:44 +03:00
"link-ethers-js" : "https:/\/cdn.ethers.io/lib/ethers-5.1.esm.min.js" ,
2020-02-02 15:58:29 +03:00
"link-ethers-npm" : "https:/\/www.npmjs.com/search?q=%40ethersproject%2F" ,
2020-07-03 08:44:17 +03:00
"link-ethers-asm-grammar" : "https:/\/github.com/ethers-io/ethers.js/blob/master/packages/asm/grammar.jison" ,
2020-02-02 15:58:29 +03:00
2020-02-18 01:56:13 +03:00
"link-eip-155" : { name : "EIP-155" , url : "https:/\/eips.ethereum.org/EIPS/eip-155" } ,
2020-02-25 22:57:11 +03:00
"link-eip-191" : { name : "EIP-191" , url : "https:/\/eips.ethereum.org/EIPS/eip-191" } ,
2020-06-12 10:38:55 +03:00
"link-eip-609" : { name : "EIP-609" , url : "https:/\/eips.ethereum.org/EIPS/eip-609" } ,
2021-02-05 02:46:27 +03:00
"link-eip-634" : { name : "EIP-634" , url : "https:/\/eips.ethereum.org/EIPS/eip-634" } ,
2020-11-23 07:03:50 +03:00
"link-eip-712" : { name : "EIP-712" , url : "https:/\/eips.ethereum.org/EIPS/eip-712" } ,
2020-06-12 10:38:55 +03:00
"link-eip-1014" : { name : "EIP-1014" , url : "https:/\/eips.ethereum.org/EIPS/eip-1014" } ,
2020-04-17 05:25:05 +03:00
"link-eip-1193" : { name : "EIP-1193" , url : "https:/\/eips.ethereum.org/EIPS/eip-1193" } ,
2021-02-05 02:46:27 +03:00
"link-eip-1577" : { name : "EIP-1577" , url : "https:/\/eips.ethereum.org/EIPS/eip-1577" } ,
2020-06-12 10:38:55 +03:00
"link-eip-2098" : { name : "EIP-2098" , url : "https:/\/eips.ethereum.org/EIPS/eip-2098" } ,
2021-02-05 02:46:27 +03:00
"link-eip-2304" : { name : "EIP-2304" , url : "https:/\/eips.ethereum.org/EIPS/eip-2304" } ,
2021-04-18 05:09:50 +03:00
"link-eip-2718" : { name : "EIP-2718" , url : "https:/\/eips.ethereum.org/EIPS/eip-2718" } ,
"link-eip-2930" : { name : "EIP-2930" , url : "https:/\/eips.ethereum.org/EIPS/eip-2930" } ,
2020-06-12 10:38:55 +03:00
"link-bip-39" : { name : "BIP-39" , url : "https:/\/en.bitcoin.it/wiki/BIP_0039" } ,
"link-bip-32" : { name : "BIP-32" , url : "https:/\/github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" } ,
2021-02-08 22:52:31 +03:00
"link-bip-44" : { name : "BIP-44" , url : "https:/\/en.bitcoin.it/wiki/BIP_0044" } ,
2020-02-18 01:56:13 +03:00
"link-npm-elliptic" : { name : "elliptic" , url : "https:/\/www.npmjs.com/package/elliptic" } ,
2020-09-08 02:40:50 +03:00
"link-npm-ethersproject-shims" : { name : "Shims" , url : "https:/\/www.npmjs.com/package/@ethersproject/shims" } ,
2020-04-17 05:25:05 +03:00
"link-npm-events" : { name : "EventEmitter" , url : "https:/\/nodejs.org/dist/latest-v13.x/docs/api/events.html#events_class_eventemitter" } ,
2020-02-18 01:56:13 +03:00
"link-npm-bnjs" : { name : "BN.js" , url : "https:/\/www.npmjs.com/package/bn.js" } ,
"link-npm-query-bignumber" : "https:/\/www.npmjs.com/search?q=bignumber" ,
2020-11-23 07:03:50 +03:00
"link-npm-react-native-get-random-values" : { name : "React Native get-random-values" , url : "https:/\/www.npmjs.com/package/react-native-get-random-values" } ,
2020-02-02 15:58:29 +03:00
"link-js-array" : "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" ,
"link-js-bigint" : "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt" ,
2020-02-25 22:57:11 +03:00
"link-js-normalize" : { name : "String.normalize" , url : "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize" } ,
2020-02-18 01:56:13 +03:00
"link-js-maxsafe" : "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER#Description" ,
2020-07-08 06:20:32 +03:00
"link-js-proxy" : "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy" ,
2020-02-02 15:58:29 +03:00
"link-js-typedarray" : "https:/\/developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray" ,
2021-02-05 02:46:27 +03:00
"link-cors" : { name : "CORS" , url : "https:/\/developer.mozilla.org/en-US/docs/Web/HTTP/CORS" } ,
2020-02-02 15:58:29 +03:00
"link-ricmoo-humanreadableabi" : "https:/\/blog.ricmoo.com/human-readable-contract-abis-in-ethers-js-141902f4d917" ,
2021-02-05 02:46:27 +03:00
"link-other-ethereum-dev-docs" : "https:/\/ethereum.org/en/developers/docs/" ,
2020-02-18 01:56:13 +03:00
"link-wiki-basicauth" : { name : "Basic Authentication" , url : "https:/\/en.wikipedia.org/wiki/Basic_access_authentication" } ,
"link-wiki-backoff" : { name : "Exponential Backoff" , url : "https:/\/en.wikipedia.org/wiki/Exponential_backoff" } ,
2020-02-25 22:57:11 +03:00
"link-wiki-bloomfilter" : { name : "Bloom Filter" , url : "https:/\/en.wikipedia.org/wiki/Bloom_filter" } ,
2020-04-17 05:25:05 +03:00
"link-wiki-bruteforce" : "https:/\/en.wikipedia.org/wiki/Brute-force_attack" ,
2020-02-02 15:58:29 +03:00
"link-wiki-cryptographichash" : "https:/\/en.wikipedia.org/wiki/Cryptographic_hash_function" ,
2020-04-19 09:18:20 +03:00
"link-wiki-ecrecover" : { name : "ECDSA Public Key Recovery" , url : "https:/\/en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Public_key_recovery" } ,
2020-02-02 15:58:29 +03:00
"link-wiki-homoglyph" : "https:/\/en.wikipedia.org/wiki/IDN_homograph_attack" ,
"link-wiki-hmac" : "https:/\/en.wikipedia.org/wiki/HMAC" ,
"link-wiki-iban" : "https:/\/en.wikipedia.org/wiki/International_Bank_Account_Number" ,
"link-wiki-ieee754" : "https:/\/en.wikipedia.org/wiki/Double-precision_floating-point_format" ,
2021-02-05 02:46:27 +03:00
"link-wiki-observer-pattern" : { name : "Obeserver Pattern" , url : "https:/\/en.wikipedia.org/wiki/Observer_pattern" } ,
2020-02-02 15:58:29 +03:00
"link-wiki-ripemd" : "https:/\/en.m.wikipedia.org/wiki/RIPEMD" ,
"link-wiki-sha2" : "https:/\/en.wikipedia.org/wiki/SHA-2" ,
"link-wiki-twoscomplement" : "https:/\/en.wikipedia.org/wiki/Two%27s_complement" ,
"link-wiki-unicode-equivalence" : "https:/\/en.wikipedia.org/wiki/Unicode_equivalence" ,
"link-wiki-utf8-overlong" : "https:/\/en.wikipedia.org/wiki/UTF-8#Overlong_encodings" ,
"link-wiki-utf8-replacement" : "https:/\/en.wikipedia.org/wiki/Specials_%28Unicode_block%29#Replacement_character" ,
"link-wiki-scrypt" : "https:/\/en.wikipedia.org/wiki/Scrypt" ,
"link-wiki-sha3" : "https:/\/en.wikipedia.org/wiki/SHA-3" ,
2020-02-25 22:57:11 +03:00
"link-wiki-shuffle" : { name : "Fisher-Yates Shuffle" , url : "https:/\/en.wikipedia.org/wiki/Fisher-Yates_shuffle" } ,
2020-02-18 01:56:13 +03:00
"link-wiki-overflow" : { name : "overflow" , url : "https:/\/en.wikipedia.org/wiki/Integer_overflow" } ,
"link-wiki-underflow" : { name : "arithmetic underflow" , url : "https:/\/en.wikipedia.org/wiki/Arithmetic_underflow" } ,
2020-06-12 10:38:55 +03:00
} ,
2020-01-10 09:01:00 +03:00
} ;