highwayhasher
Version:
HighwayHash implementation for both node and browsers
467 lines (403 loc) • 35 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.highwayhasher = {}));
})(this, (function (exports) { 'use strict';
function validKey(key) {
if (key && key.length != 32) {
throw new Error("expected the key buffer to be 32 bytes long");
}
return key || new Uint8Array();
}
let wasm$2;
/**
* @param {number} key_data_ptr
* @param {number} key_len
* @param {number} idx
* @returns {number}
*/
function new_hasher$1(key_data_ptr, key_len, idx) {
const ret = wasm$2.new_hasher(key_data_ptr, key_len, idx);
return ret;
}
/**
* @param {number} data_ptr
* @param {number} data_len
* @param {number} idx
*/
function append$1(data_ptr, data_len, idx) {
wasm$2.append(data_ptr, data_len, idx);
}
/**
* @param {number} data_ptr
* @param {number} idx
*/
function finalize64$1(data_ptr, idx) {
wasm$2.finalize64(data_ptr, idx);
}
/**
* @param {number} data_ptr
* @param {number} idx
*/
function finalize128$1(data_ptr, idx) {
wasm$2.finalize128(data_ptr, idx);
}
/**
* @param {number} data_ptr
* @param {number} idx
*/
function finalize256$1(data_ptr, idx) {
wasm$2.finalize256(data_ptr, idx);
}
async function __wbg_load$1(module, imports) {
if (typeof Response === 'function' && module instanceof Response) {
if (typeof WebAssembly.instantiateStreaming === 'function') {
try {
return await WebAssembly.instantiateStreaming(module, imports);
} catch (e) {
if (module.headers.get('Content-Type') != 'application/wasm') {
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
} else {
throw e;
}
}
}
const bytes = await module.arrayBuffer();
return await WebAssembly.instantiate(bytes, imports);
} else {
const instance = await WebAssembly.instantiate(module, imports);
if (instance instanceof WebAssembly.Instance) {
return { instance, module };
} else {
return instance;
}
}
}
function __wbg_get_imports$1() {
const imports = {};
imports.wbg = {};
return imports;
}
function __wbg_finalize_init$1(instance, module) {
wasm$2 = instance.exports;
__wbg_init$1.__wbindgen_wasm_module = module;
return wasm$2;
}
async function __wbg_init$1(input) {
if (wasm$2 !== undefined) return wasm$2;
if (typeof input === 'undefined') {
input = new URL('highwayhasher_wasm_bg.wasm', "");
}
const imports = __wbg_get_imports$1();
if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {
input = fetch(input);
}
const { instance, module } = await __wbg_load$1(await input, imports);
return __wbg_finalize_init$1(instance, module);
}
let wasm$1;
/**
* @param {number} key_data_ptr
* @param {number} key_len
* @param {number} idx
* @returns {number}
*/
function new_hasher(key_data_ptr, key_len, idx) {
const ret = wasm$1.new_hasher(key_data_ptr, key_len, idx);
return ret;
}
/**
* @param {number} data_ptr
* @param {number} data_len
* @param {number} idx
*/
function append(data_ptr, data_len, idx) {
wasm$1.append(data_ptr, data_len, idx);
}
/**
* @param {number} data_ptr
* @param {number} idx
*/
function finalize64(data_ptr, idx) {
wasm$1.finalize64(data_ptr, idx);
}
/**
* @param {number} data_ptr
* @param {number} idx
*/
function finalize128(data_ptr, idx) {
wasm$1.finalize128(data_ptr, idx);
}
/**
* @param {number} data_ptr
* @param {number} idx
*/
function finalize256(data_ptr, idx) {
wasm$1.finalize256(data_ptr, idx);
}
async function __wbg_load(module, imports) {
if (typeof Response === 'function' && module instanceof Response) {
if (typeof WebAssembly.instantiateStreaming === 'function') {
try {
return await WebAssembly.instantiateStreaming(module, imports);
} catch (e) {
if (module.headers.get('Content-Type') != 'application/wasm') {
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
} else {
throw e;
}
}
}
const bytes = await module.arrayBuffer();
return await WebAssembly.instantiate(bytes, imports);
} else {
const instance = await WebAssembly.instantiate(module, imports);
if (instance instanceof WebAssembly.Instance) {
return { instance, module };
} else {
return instance;
}
}
}
function __wbg_get_imports() {
const imports = {};
imports.wbg = {};
return imports;
}
function __wbg_finalize_init(instance, module) {
wasm$1 = instance.exports;
__wbg_init.__wbindgen_wasm_module = module;
return wasm$1;
}
async function __wbg_init(input) {
if (wasm$1 !== undefined) return wasm$1;
if (typeof input === 'undefined') {
input = new URL('highwayhasher_wasm_simd_bg.wasm', "");
}
const imports = __wbg_get_imports();
if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {
input = fetch(input);
}
const { instance, module } = await __wbg_load(await input, imports);
return __wbg_finalize_init(instance, module);
}
let wasmInit = undefined;
const setWasmInit = (arg) => {
wasmInit = arg;
};
let wasmSimdInit = undefined;
const setWasmSimdInit = (arg) => {
wasmSimdInit = arg;
};
const isWasmInput = (x) => x === undefined || (typeof x === "object" && "simd" in x);
/**
* A Highway hasher implemented in Web assembly.
*/
class WasmHighwayHash {
static async loadModule(options) {
var _a, _b, _c;
if (isWasmInput(options === null || options === void 0 ? void 0 : options.wasm)) {
const useSimd = (_a = options === null || options === void 0 ? void 0 : options.simd) !== null && _a !== void 0 ? _a : hasSimd();
if (!useSimd) {
return await loadWasm((_b = options === null || options === void 0 ? void 0 : options.wasm) === null || _b === void 0 ? void 0 : _b.sisd);
}
else {
return await loadWasmSimd((_c = options === null || options === void 0 ? void 0 : options.wasm) === null || _c === void 0 ? void 0 : _c.simd);
}
}
else {
return await loadWasm(options === null || options === void 0 ? void 0 : options.wasm);
}
}
static async load(key, options) {
const module = await WasmHighwayHash.loadModule(options);
return module.create(key);
}
static resetModule() {
sisdMemory = undefined;
simdMemory = undefined;
}
}
const PAGE_SIZE = 65536;
class Allocator {
constructor(memory, offset) {
this.memory = memory;
this.offset = offset;
this.slots = [];
this.resultBufferOffset = this.appendBufferOffset;
this.keyBufferOffset = this.resultBufferOffset;
}
newAllocation() {
for (let i = 0; i < this.slots.length; i++) {
if (this.slots[i] === false) {
this.slots[i] = true;
return i;
}
}
const result = this.slots.length;
this.slots.push(true);
return result;
}
returnSlot(slot) {
this.slots[slot] = false;
}
appendBufferOffset() {
return this.offset;
}
}
function wasmHighway(alloc, hasher) {
const WasmHash = class {
constructor(key) {
var _a;
key = validKey(key);
this.idx = alloc.newAllocation();
const offset = alloc.keyBufferOffset();
const keyDest = new Uint8Array(alloc.memory.buffer, offset);
keyDest.set(key !== null && key !== void 0 ? key : new Uint8Array());
const hasherSlot = hasher.new_hasher(offset, (_a = key === null || key === void 0 ? void 0 : key.byteLength) !== null && _a !== void 0 ? _a : 0, this.idx);
if (hasherSlot !== this.idx) {
throw new Error("unable to allocate hasher in slot");
}
}
append(data) {
while (data.length != 0) {
const toWrite = Math.min(data.length, PAGE_SIZE);
const source = data.subarray(0, toWrite);
const dataOffset = alloc.appendBufferOffset();
new Uint8Array(alloc.memory.buffer, dataOffset, toWrite).set(source);
hasher.append(dataOffset, toWrite, this.idx);
data = data.subarray(toWrite);
}
}
finalize64() {
const resultOffset = alloc.resultBufferOffset();
hasher.finalize64(resultOffset, this.idx);
const out = new Uint8Array(alloc.memory.buffer, resultOffset, 8);
const result = new Uint8Array(8);
result.set(out);
alloc.returnSlot(this.idx);
return result;
}
finalize128() {
const resultOffset = alloc.resultBufferOffset();
hasher.finalize128(resultOffset, this.idx);
const out = new Uint8Array(alloc.memory.buffer, resultOffset, 16);
const result = new Uint8Array(16);
result.set(out);
alloc.returnSlot(this.idx);
return result;
}
finalize256() {
const resultOffset = alloc.resultBufferOffset();
hasher.finalize256(resultOffset, this.idx);
const out = new Uint8Array(alloc.memory.buffer, resultOffset, 32);
const result = new Uint8Array(32);
result.set(out);
alloc.returnSlot(this.idx);
return result;
}
};
return {
create: (key) => new WasmHash(key),
hash64(key, data) {
const hasher = new WasmHash(key);
hasher.append(data);
return hasher.finalize64();
},
hash128(key, data) {
const hasher = new WasmHash(key);
hasher.append(data);
return hasher.finalize128();
},
hash256(key, data) {
const hasher = new WasmHash(key);
hasher.append(data);
return hasher.finalize256();
},
};
}
let sisdMemory;
let simdMemory;
const loadWasmSimd = async (module) => {
if (simdMemory === undefined) {
simdMemory = __wbg_init(module !== null && module !== void 0 ? module : wasmSimdInit === null || wasmSimdInit === void 0 ? void 0 : wasmSimdInit()).then((x) => {
const prevLength = x.memory.grow(1);
const alloc = new Allocator(x.memory, prevLength);
return wasmHighway(alloc, {
new_hasher: new_hasher,
append: append,
finalize64: finalize64,
finalize128: finalize128,
finalize256: finalize256,
});
});
}
return await simdMemory;
};
const loadWasm = async (module) => {
if (sisdMemory === undefined) {
sisdMemory = __wbg_init$1(module !== null && module !== void 0 ? module : wasmInit === null || wasmInit === void 0 ? void 0 : wasmInit()).then((x) => {
// grow by 1 page to hold key, results, and data hashing
const prevLength = x.memory.grow(1);
const alloc = new Allocator(x.memory, prevLength);
return wasmHighway(alloc, {
new_hasher: new_hasher$1,
append: append$1,
finalize64: finalize64$1,
finalize128: finalize128$1,
finalize256: finalize256$1,
});
});
}
return await sisdMemory;
};
// Extracted from the compiled file of:
// https://github.com/GoogleChromeLabs/wasm-feature-detect/blob/40269813c83f7e9ff370afc92cde3cc0456c557e/src/detectors/simd/module.wat
//
// Changes:
// - Validation is cached so it needs to only run once
// - There's no need to mark as async
let simdEnabled;
const hasSimd = () => simdEnabled !== null && simdEnabled !== void 0 ? simdEnabled : (simdEnabled = WebAssembly.validate(new Uint8Array([
0, 97, 115, 109, 1, 0, 0, 0, 1, 5, 1, 96, 0, 1, 123, 3, 2, 1, 0, 10, 10,
1, 8, 0, 65, 0, 253, 15, 253, 98, 11,
])));
function _loadWasmModule (sync, filepath, src, imports) {
function _instantiateOrCompile(source, imports, stream) {
var instantiateFunc = stream ? WebAssembly.instantiateStreaming : WebAssembly.instantiate;
var compileFunc = stream ? WebAssembly.compileStreaming : WebAssembly.compile;
if (imports) {
return instantiateFunc(source, imports)
} else {
return compileFunc(source)
}
}
var buf = null;
var isNode = typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
if (isNode) {
buf = Buffer.from(src, 'base64');
} else {
var raw = globalThis.atob(src);
var rawLength = raw.length;
buf = new Uint8Array(new ArrayBuffer(rawLength));
for(var i = 0; i < rawLength; i++) {
buf[i] = raw.charCodeAt(i);
}
}
if(sync) {
var mod = new WebAssembly.Module(buf);
return imports ? new WebAssembly.Instance(mod, imports) : mod
} else {
return _instantiateOrCompile(buf, imports, false)
}
}
function wasm(imports){return _loadWasmModule(0, null, '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8AFrIgQkACAEQUBrIgIgAUGwAWxBgIBAa0GwARAIGiAEQRhqIgVCADcDACAEQRBqIgZCADcDACAEQQhqIgdCADcDACAEQgA3AwAgBEEgaiEBIwBBIGsiAyQAIAJBoAFqKAIABEAgAhABCyADIAIpAwhCIIk3AxggAyACKQMAQiCJNwMQIAMgAikDGEIgiTcDCCADIAIpAxBCIIk3AwAgAiADEAAgAyACKQMIQiCJNwMYIAMgAikDAEIgiTcDECADIAIpAxhCIIk3AwggAyACKQMQQiCJNwMAIAIgAxAAIAMgAikDCEIgiTcDGCADIAIpAwBCIIk3AxAgAyACKQMYQiCJNwMIIAMgAikDEEIgiTcDACACIAMQACADIAIpAwhCIIk3AxggAyACKQMAQiCJNwMQIAMgAikDGEIgiTcDCCADIAIpAxBCIIk3AwAgAiADEAAgAyACKQMIQiCJNwMYIAMgAikDAEIgiTcDECADIAIpAxhCIIk3AwggAyACKQMQQiCJNwMAIAIgAxAAIAMgAikDCEIgiTcDGCADIAIpAwBCIIk3AxAgAyACKQMYQiCJNwMIIAMgAikDEEIgiTcDACACIAMQACADIAIpAwhCIIk3AxggAyACKQMAQiCJNwMQIAMgAikDGEIgiTcDCCADIAIpAxBCIIk3AwAgAiADEAAgAyACKQMIQiCJNwMYIAMgAikDAEIgiTcDECADIAIpAxhCIIk3AwggAyACKQMQQiCJNwMAIAIgAxAAIAMgAikDCEIgiTcDGCADIAIpAwBCIIk3AxAgAyACKQMYQiCJNwMIIAMgAikDEEIgiTcDACACIAMQACADIAIpAwhCIIk3AxggAyACKQMAQiCJNwMQIAMgAikDGEIgiTcDCCADIAIpAxBCIIk3AwAgAiADEAAgASACQdAAaikDACACKQMQfCACQfAAaikDACACQTBqKQMAfCIIQgKGIAhCAYaFhTcDECABIAIpA0AgAikDAHwgAikDYCACKQMgfCIJQgKGIAlCAYaFhTcDACABIAJB2ABqKQMAIAIpAxh8IAJB+ABqKQMAIAJBOGopAwB8IgpCAoYgCEI+iIQgCkL//////////z+DQgGGIAhCP4iEhYU3AxggASACQcgAaikDACACKQMIfCACQegAaikDACACQShqKQMAfCIKQgKGIAlCPoiEIApC//////////8/g0IBhiAJQj+IhIWFNwMIIANBIGokACAEQSAgAUEEEAYgAEEYaiAFKQMANwAAIABBEGogBikDADcAACAAQQhqIAcpAwA3AAAgACAEKQMANwAAIARB8AFqJAALrwQBBH8jAEHQAWsiBCQAIARBIGoiAiABQbABbEGAgEBrQbABEAgaIARBCGoiBUIANwMAIARCADcDACAEQRBqIQEjAEEgayIDJAAgAkGgAWooAgAEQCACEAELIAMgAikDCEIgiTcDGCADIAIpAwBCIIk3AxAgAyACKQMYQiCJNwMIIAMgAikDEEIgiTcDACACIAMQACADIAIpAwhCIIk3AxggAyACKQMAQiCJNwMQIAMgAikDGEIgiTcDCCADIAIpAxBCIIk3AwAgAiADEAAgAyACKQMIQiCJNwMYIAMgAikDAEIgiTcDECADIAIpAxhCIIk3AwggAyACKQMQQiCJNwMAIAIgAxAAIAMgAikDCEIgiTcDGCADIAIpAwBCIIk3AxAgAyACKQMYQiCJNwMIIAMgAikDEEIgiTcDACACIAMQACADIAIpAwhCIIk3AxggAyACKQMAQiCJNwMQIAMgAikDGEIgiTcDCCADIAIpAxBCIIk3AwAgAiADEAAgAyACKQMIQiCJNwMYIAMgAikDAEIgiTcDECADIAIpAxhCIIk3AwggAyACKQMQQiCJNwMAIAIgAxAAIAEgAkH4AGopAwAgAkE4aikDACACQcgAaikDACACKQMIfHx8NwMIIAEgAkHwAGopAwAgAkEwaikDACACKQNAIAIpAwB8fHw3AwAgA0EgaiQAIARBECABQQIQBiAAQQhqIAUpAwA3AAAgACAEKQMANwAAIARB0AFqJAAL3AICAX8EfiMAQbABayICJAAgACACIAFBsAFsQYCAQGtBsAEQCCEAIwBBIGsiASQAIABBoAFqKAIABEAgABABCyABIAApAwhCIIk3AxggASAAKQMAQiCJNwMQIAEgACkDGEIgiTcDCCABIAApAxBCIIk3AwAgACABEAAgASAAKQMIQiCJNwMYIAEgACkDAEIgiTcDECABIAApAxhCIIk3AwggASAAKQMQQiCJNwMAIAAgARAAIAEgACkDCEIgiTcDGCABIAApAwBCIIk3AxAgASAAKQMYQiCJNwMIIAEgACkDEEIgiTcDACAAIAEQACABIAApAwhCIIk3AxggASAAKQMAQiCJNwMQIAEgACkDGEIgiTcDCCABIAApAxBCIIk3AwAgACABEAAgACkDACEDIAApAyAhBCAAKQNAIQUgACkDYCABQSBqJAAgBSADIAR8fHw3AAAgAEGwAWokAAsiACADIAFBA3YiASABIANLGyIBBEAgACACIAFBA3QQCBoLC+oDAQh/IAAhBSMAQSBrIgMkACACQbABbEGAgEBrIgRBgAFqIQYCQCAEQaABaigCACIARQRAIAFBYHEiAgRAQQAgAmshByAFIQADQCADQRhqIABBGGopAAA3AwAgA0EQaiAAQRBqKQAANwMAIANBCGogAEEIaikAADcDACADIAApAAA3AwAgBCADEAAgAEEgaiEAIAdBIGoiBw0ACwsgBCABQR9xIgA2AqABIABFDQEgBiACIAVqIAAQCBoMAQtBgIDAACAAIAZqIABBIEsbIQJBAEEgIABrIgAgAEEgSxsiACABSwRAIAIgBSABEAgaIAQgBCgCoAEgAWo2AqABDAELIAIgBSAAEAgaIARBIDYCoAEgA0EYaiIIIAZBGGopAwA3AwAgA0EQaiIJIAZBEGopAwA3AwAgA0EIaiIKIAZBCGopAwA3AwAgAyAGKQMANwMAIAQgAxAAIAAgBWohAiABIABrIgBBH3EhASAAQWBxIgUEQEEAIAVrIQcgAiEAA0AgCCAAQRhqKQAANwMAIAkgAEEQaikAADcDACAKIABBCGopAAA3AwAgAyAAKQAANwMAIAQgAxAAIABBIGohACAHQSBqIgcNAAsLIAQgATYCoAEgAUUNACAGIAIgBWogARAIGgsgA0EgaiQAC7gCAQd/AkAgAiIEQRBJBEAgACECDAELIABBACAAa0EDcSIDaiEFIAMEQCAAIQIgASEGA0AgAiAGLQAAOgAAIAZBAWohBiACQQFqIgIgBUkNAAsLIAUgBCADayIIQXxxIgdqIQICQCABIANqIgNBA3EEQCAHQQBMDQEgA0EDdCIEQRhxIQkgA0F8cSIGQQRqIQFBACAEa0EYcSEEIAYoAgAhBgNAIAUgBiAJdiABKAIAIgYgBHRyNgIAIAFBBGohASAFQQRqIgUgAkkNAAsMAQsgB0EATA0AIAMhAQNAIAUgASgCADYCACABQQRqIQEgBUEEaiIFIAJJDQALCyAIQQNxIQQgAyAHaiEBCyAEBEAgAiAEaiEDA0AgAiABLQAAOgAAIAFBAWohASACQQFqIgIgA0kNAAsLIAALBQBB9AILAEcJcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkCBndhbHJ1cwYwLjIwLjMMd2FzbS1iaW5kZ2VuEjAuMi45MiAoMmE0YTQ5MzYyKQ==', imports)}
function wasmSimd(imports){return _loadWasmModule(0, null, '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Tv3VASAR/VEhDyAK/Qz/////AAAAAP////8AAAAA/U4gF/0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PAAECA/0M/////wAAAAD/////AAAAAP1O/dUBIBL9UQshDUEKIQEDQCALIBP9zgEiFf0M/////wAAAAD/////AAAAAP1OIBAgFP0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PCAkKCyIK/c4BIA79zgEiEUEg/c0B/dUBIAv9USELIBH9DP////8AAAAA/////wAAAAD9TiATQSD9zQH91QEgDv1RIQ4gDCAT/Qz/////AAAAAP////8AAAAA/Q0EBQYHAAECAwwNDg8ICQoL/c4BIA/9zgEiEv0M/////wAAAAD/////AAAAAP1OIAr9DP////8AAAAA/////wAAAAD9Tv3VASAP/VEhDyARIBUgEf0M/////wAAAAD/////AAAAAP0NAwwCBQEOAA8LBAoNBgkHCP3OASIT/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIRAgEiANIBT9zgEiCiAS/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIhT9DP////8AAAAA/////wAAAAD9DQMMAgUBDgAPCwQKDQYJBwj9zgEhDCAK/Qz/////AAAAAP////8AAAAA/U4gEv0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PAAECA/0M/////wAAAAD/////AAAAAP1O/dUBIA39USENIAFBAWsiAQ0ACyACIAv9CwRwIAIgDf0LBGAgAiAO/QsEUCACIA/9CwRAIAIgEP0LBDAgAiAM/QsEICACIBP9CwQQIAIgFP0LBAAgByALIBD9zgEiCkEC/csBIA4gE/3OAf1RIApBPv3NAf0MAAAAAAAAAAAAAAAAAAAAAP0NCAkKCwwNDg8QERITFBUWF/1RIApBAf3LAf0M/////////3////////////1O/VEgCv0NCAkKCwwNDg8AAQIDBAUGB/0MAAAAAAAAAAAAAAAAAAAAACAKQT/9zQH9DQABAgMEBQYHGBkaGxwdHh/9Uf0LAxAgByANIAz9zgEiCkEC/csBIA8gFP3OAf1RIApBPv3NAf0MAAAAAAAAAAAAAAAAAAAAAP0NCAkKCwwNDg8QERITFBUWF/1RIApBAf3LAf0M/////////3////////////1O/VEgCv0NCAkKCwwNDg8AAQIDBAUGB/0MAAAAAAAAAAAAAAAAAAAAACAKQT/9zQH9DQABAgMEBQYHGBkaGxwdHh/9Uf0LAwAgA0EgIAdBBBAEIABBEGogCf0AAwD9CwAAIAAgA/0AAwD9CwAAIANBgAJqJAAL8A0DB38PewF+IwBB4AFrIgQkACAEQSBqIgIgAUHAAWxBgIBAa0HAARAGGiAE/QwAAAAAAAAAAAAAAAAAAAAA/QsDACAEQRBqIQcCeyACQaABaigCACIFRQRAIAL9AAQQIRIgAv0ABAAhEyAC/QAEcCEJIAL9AARQIRAgAv0ABEAhDCAC/QAEMCENIAL9AAQgIQogAv0ABGAMAQsgAkGAAWohBiAC/QAEMCELIAL9AAQgIQ4gAv0ABBAhFCAC/QAEACERAnsgBUEgIAVBIEkbIgNBEHFFBED9DAAAAAAAAAAAAAAAAAAAAAAgBikDACIY/R4B/QwAAAAAAAAAAAAAAAAAAAAAIANBB0siARshCSADQQRxBEAgAkGIAWooAgAgGKcgARv9Ef0M/////wAAAAAAAAAAAAAAAP0MAAAAAAAAAAD/////AAAAACABG/1OIAn9UCEJC/0MAAAAAAAAAAAAAAAAAAAAACADQQNxIghFDQEa/QwAAAAAAAAAAAAAAAAAAAAAIAYgA0E8cWoiASAIQQF2ajEAAEIIhiABMQAAhCABIAhqQQFrMQAAQhCGhP0eAQwBC/0MAAAAAAAAAAAAAAAAAAAAACACQYgBav0AAwAiD/0MAAAAAAAAAAAAAAAAAAAAAP0NEBESExQVFhcICQoLDA0ODyADQThxIgFBEEYbIQ0gBiAP/VcDAAEhCSADIAZqQQRrIANBBHEEeyAP/R0BpyACQZgBaigCACABQRBGIgEb/RH9DAAAAAAAAAAA/////wAAAAD9DP////8AAAAAAAAAAAAAAAAgARv9TiAN/VAFIA0L/VYAAAELIAtBICAFayIB/a0BIAsgBf2rAf1Q/c4BIAL9AARQIhf9zgEiFSAC/QAEcCIMIBQgBf0RIgr9zgEiEP3OASILIBUgCv0NAwwCBQEOAA8LBAoNBgkHCP3OASISIAr9DQMMAgUBDgAPCwQKDQYJBwj9zgEhDSAJIA4gAf2tASAOIAX9qwH9UP3OASAC/QAEQCIO/c4BIhYgAv0ABGAiDyARIAr9zgEiFP3OASIRIBYgCv0NAwwCBQEOAA8LBAoNBgkHCP3OASITIAr9DQMMAgUBDgAPCwQKDQYJBwj9zgEhCiAL/Qz/////AAAAAP////8AAAAA/U4gFUEg/c0B/dUBIAz9USEJIBX9DP////8AAAAA/////wAAAAD9TiAQQSD9zQH91QEgF/1RIRAgFv0M/////wAAAAD/////AAAAAP1OIBT9DP////8AAAAA/////wAAAAD9DQQFBgcAAQIDDA0ODwABAgP9DP////8AAAAA/////wAAAAD9Tv3VASAO/VEhDCAR/Qz/////AAAAAP////8AAAAA/U4gFv0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PAAECA/0M/////wAAAAD/////AAAAAP1O/dUBIA/9UQshC0EGIQEDQCAJIBL9zgEiFP0M/////wAAAAD/////AAAAAP1OIA0gE/0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PCAkKCyIR/c4BIBD9zgEiDkEg/c0B/dUBIAn9USEJIA79DP////8AAAAA/////wAAAAD9TiASQSD9zQH91QEgEP1RIRAgCiAS/Qz/////AAAAAP////8AAAAA/Q0EBQYHAAECAwwNDg8ICQoL/c4BIAz9zgEiD/0M/////wAAAAD/////AAAAAP1OIBH9DP////8AAAAA/////wAAAAD9Tv3VASAM/VEhDCAOIBQgDv0M/////wAAAAD/////AAAAAP0NAwwCBQEOAA8LBAoNBgkHCP3OASIS/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIQ0gDyALIBP9zgEiESAP/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIhP9DP////8AAAAA/////wAAAAD9DQMMAgUBDgAPCwQKDQYJBwj9zgEhCiAR/Qz/////AAAAAP////8AAAAA/U4gD/0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PAAECA/0M/////wAAAAD/////AAAAAP1O/dUBIAv9USELIAFBAWsiAQ0ACyACIAn9CwRwIAIgC/0LBGAgAiAQ/QsEUCACIAz9CwRAIAIgDf0LBDAgAiAK/QsEICACIBL9CwQQIAIgE/0LBAAgByAMIBP9zgEgDf3OASAJ/c4B/Qz/////AAAAAP////8AAAAA/Q0ICQoLDA0ODwABAgMEBQYH/QsDACAEQRAgB0ECEAQgACAE/QADAP0LAAAgBEHgAWokAAuTDQMOewR/AX4jAEHAAWsiEiQAIAACeyASIAFBwAFsQYCAQGtBwAEQBiIBQaABaigCACIRRQRAIAH9AAQQIQsgAf0ABAAhDCAB/QAEcCEIIAH9AARQIQQgAf0ABEAhBSAB/QAEMCEJIAH9AAQgIQMgAf0ABGAMAQsgAUGAAWohEyAB/QAEMCEEIAH9AAQgIQYgAf0ABBAhDSAB/QAEACEKAnsgEUEgIBFBIEkbIhBBEHFFBED9DAAAAAAAAAAAAAAAAAAAAAAgEykDACIU/R4B/QwAAAAAAAAAAAAAAAAAAAAAIBBBB0siABshAiAQQQRxBEAgAUGIAWooAgAgFKcgABv9Ef0M/////wAAAAAAAAAAAAAAAP0MAAAAAAAAAAD/////AAAAACAAG/1OIAL9UCECC/0MAAAAAAAAAAAAAAAAAAAAACAQQQNxIhJFDQEa/QwAAAAAAAAAAAAAAAAAAAAAIBMgEEE8cWoiACASQQF2ajEAAEIIhiAAMQAAhCAAIBJqQQFrMQAAQhCGhP0eAQwBC/0MAAAAAAAAAAAAAAAAAAAAACABQYgBav0AAwAiB/0MAAAAAAAAAAAAAAAAAAAAAP0NEBESExQVFhcICQoLDA0ODyAQQThxIgBBEEYbIQkgEyAH/VcDAAEhAiAQIBNqQQRrIBBBBHEEeyAH/R0BpyABQZgBaigCACAAQRBGIgAb/RH9DAAAAAAAAAAA/////wAAAAD9DP////8AAAAAAAAAAAAAAAAgABv9TiAJ/VAFIAkL/VYAAAELIARBICARayIA/a0BIAQgEf2rAf1Q/c4BIAH9AARQIg/9zgEiDiAB/QAEcCIIIA0gEf0RIgP9zgEiBf3OASIEIA4gA/0NAwwCBQEOAA8LBAoNBgkHCP3OASILIAP9DQMMAgUBDgAPCwQKDQYJBwj9zgEhCSACIAYgAP2tASAGIBH9qwH9UP3OASAB/QAEQCIG/c4BIgIgAf0ABGAiByAKIAP9zgEiDf3OASIKIAIgA/0NAwwCBQEOAA8LBAoNBgkHCP3OASIMIAP9DQMMAgUBDgAPCwQKDQYJBwj9zgEhAyAE/Qz/////AAAAAP////8AAAAA/U4gDkEg/c0B/dUBIAj9USEIIA79DP////8AAAAA/////wAAAAD9TiAFQSD9zQH91QEgD/1RIQQgAv0M/////wAAAAD/////AAAAAP1OIA39DP////8AAAAA/////wAAAAD9DQQFBgcAAQIDDA0ODwABAgP9DP////8AAAAA/////wAAAAD9Tv3VASAG/VEhBSAK/Qz/////AAAAAP////8AAAAA/U4gAv0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PAAECA/0M/////wAAAAD/////AAAAAP1O/dUBIAf9UQshAkEEIQADQCAIIAv9zgEiDf0M/////wAAAAD/////AAAAAP1OIAkgDP0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PCAkKCyIK/c4BIAT9zgEiBkEg/c0B/dUBIAj9USEIIAb9DP////8AAAAA/////wAAAAD9TiALQSD9zQH91QEgBP1RIQQgAyAL/Qz/////AAAAAP////8AAAAA/Q0EBQYHAAECAwwNDg8ICQoL/c4BIAX9zgEiB/0M/////wAAAAD/////AAAAAP1OIAr9DP////8AAAAA/////wAAAAD9Tv3VASAF/VEhBSAGIA0gBv0M/////wAAAAD/////AAAAAP0NAwwCBQEOAA8LBAoNBgkHCP3OASIL/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIQkgByACIAz9zgEiCiAH/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIgz9DP////8AAAAA/////wAAAAD9DQMMAgUBDgAPCwQKDQYJBwj9zgEhAyAK/Qz/////AAAAAP////8AAAAA/U4gB/0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PAAECA/0M/////wAAAAD/////AAAAAP1O/dUBIAL9USECIABBAWsiAA0ACyABIAj9CwRwIAEgAv0LBGAgASAE/QsEUCABIAX9CwRAIAEgCf0LBDAgASAD/QsEICABIAv9CwQQIAEgDP0LBAAgBSAM/c4BIAP9zgEgAv3OAf0dATcAACABQcABaiQACyIAIAMgAUEDdiIBIAEgA0sbIgEEQCAAIAIgAUEDdBAGGgsLgRACBH8MewJAIAAhBCACQcABbEGAgEBrIgNBgAFqIQYCQCADQaABaigCACIARQRAIAFBYHEiAgRAQQAgAmshBSAD/QAEACENIAP9AARwIQggA/0ABGAhCyAD/QAEECEJIAP9AARQIQogA/0ABEAhDCAD/QAEMCEHIAP9AAQgIRAgBCEAA0AgCCAJ/c4BIg79DP////8AAAAA/////wAAAAD9TiAHIABBEGogAP0KABj9VwAAAf3OASAK/c4BIgdBIP3NAf3VASAI/VEhCCAJQSD9zQEgB/0M/////wAAAAD/////AAAAAP1O/dUBIAr9USEKIA39DP////8AAAAA/////wAAAAD9DQQFBgcAAQIDDA0ODwABAgP9DP////8AAAAA/////wAAAAD9TiAQIAAgAP0KAAj9VwAAAf3OASAM/c4BIg/9DP////8AAAAA/////wAAAAD9Tv3VASAM/VEhDCAHIA4gB/0M/////wAAAAD/////AAAAAP0NAwwCBQEOAA8LBAoNBgkHCP3OASIJ/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIQcgDyALIA39zgEiDiAP/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIg39DP////8AAAAA/////wAAAAD9DQMMAgUBDgAPCwQKDQYJBwj9zgEhECAO/Qz/////AAAAAP////8AAAAA/U4gD/0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PAAECA/0M/////wAAAAD/////AAAAAP1O/dUBIAv9USELIABBIGohACAFQSBqIgUNAAsgAyAK/QsEUCADIAz9CwRAIAMgB/0LBDAgAyAQ/QsEICADIA39CwQAIAMgCP0LBHAgAyAL/QsEYCADIAn9CwQQCyADIAFBH3EiADYCoAEgAEUNASAGIAIgBGogABAGGgwCC0GAgMAAIAAgBmogAEEgSxshAkEAQSAgAGsiACAAQSBLGyIAIAFLBEAgAiAEIAEQBhogAyADKAKgASABajYCoAEMAQsgAiAEIAAQBhogA0EgNgKgASADIAP9AARgIgwgA/0ABAAiCP3OASIPIAP9AAQgIANBgAFqIANBiAFq/QADACIJ/VcDAAH9zgEgA/0ABEAiC/3OASIKIAj9DQMMAgUBDgAPCwQKDQYJBwj9zgEiDf0LBAAgAyALIAggCP0NBAUGBwABAgMMDQ4PAAECA/0M/////wAAAAD/////AAAAAP1OIAr9DP////8AAAAA/////wAAAAD9Tv3VAf1RIgv9CwRAIAMgA/0ABHAiDiAD/QAEECIR/c4BIhIgA/0ABDAgA0GYAWr9AAMAIAn9DQABAgMEBQYHGBkaGxwdHh/9zgEgA/0ABFAiCf3OASIH/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIgj9CwQQIAMgCiAN/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIhD9CwQgIAMgCSARQSD9zQEgB/0M/////wAAAAD/////AAAAAP1O/dUB/VEiCf0LBFAgAyAMIA/9DP////8AAAAA/////wAAAAD9TiAK/Qz/////AAAAAP////8AAAAA/Q0EBQYHAAECAwwNDg8AAQID/Qz/////AAAAAP////8AAAAA/U791QH9USIK/QsEYCADIA4gEv0M/////wAAAAD/////AAAAAP1OIAdBIP3NAf3VAf1RIgz9CwRwIAMgByAI/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIgf9CwQwIAAgBGohAiABIABrIgBBH3EhASAAQWBxIgQEQEEAIARrIQUgAiEAA0AgDCAI/c4BIg79DP////8AAAAA/////wAAAAD9TiAHIABBEGogAP0KABj9VwAAAf3OASAJ/c4BIgdBIP3NAf3VASAM/VEhDCAIQSD9zQEgB/0M/////wAAAAD/////AAAAAP1O/dUBIAn9USEJIA39DP////8AAAAA/////wAAAAD9DQQFBgcAAQIDDA0ODwABAgP9DP////8AAAAA/////wAAAAD9TiAQIAAgAP0KAAj9VwAAAf3OASAL/c4BIg/9DP////8AAAAA/////wAAAAD9Tv3VASAL/VEhCyAHIA4gB/0M/////wAAAAD/////AAAAAP0NAwwCBQEOAA8LBAoNBgkHCP3OASII/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIQcgDyAKIA39zgEiDiAP/Qz/////AAAAAP////8AAAAA/Q0DDAIFAQ4ADwsECg0GCQcI/c4BIg39DP////8AAAAA/////wAAAAD9DQMMAgUBDgAPCwQKDQYJBwj9zgEhECAO/Qz/////AAAAAP////8AAAAA/U4gD/0M/////wAAAAD/////AAAAAP0NBAUGBwABAgMMDQ4PAAECA/0M/////wAAAAD/////AAAAAP1O/dUBIAr9USEKIABBIGohACAFQSBqIgUNAAsgAyAM/QsEcCADIAr9CwRgIAMgCf0LBFAgAyAL/QsEQCADIA39CwQAIAMgB/0LBDAgAyAQ/QsEICADIAj9CwQQCyADIAE2AqABIAFFDQAgBiACIARqIAEQBhoLCwu4AgEHfwJAIAIiBEEQSQRAIAAhAgwBCyAAQQAgAGtBA3EiA2ohBSADBEAgACECIAEhBgNAIAIgBi0AADoAACAGQQFqIQYgAkEBaiICIAVJDQALCyAFIAQgA2siCEF8cSIHaiECAkAgASADaiIDQQNxBEAgB0EATA0BIANBA3QiBEEYcSEJIANBfHEiBkEEaiEBQQAgBGtBGHEhBCAGKAIAIQYDQCAFIAYgCXYgASgCACIGIAR0cjYCACABQQRqIQEgBUEEaiIFIAJJDQALDAELIAdBAEwNACADIQEDQCAFIAEoAgA2AgAgAUEEaiEBIAVBBGoiBSACSQ0ACwsgCEEDcSEEIAMgB2ohAQsgBARAIAIgBGohAwNAIAIgAS0AADoAACABQQFqIQEgAkEBaiICIANJDQALCyAACwUAQdUCCwBHCXByb2R1Y2VycwEMcHJvY2Vzc2VkLWJ5AgZ3YWxydXMGMC4yMC4zDHdhc20tYmluZGdlbhIwLjIuOTIgKDJhNGE0OTM2Mik=', imports)}
// @ts-ignore
setWasmInit(() => wasm());
// @ts-ignore
setWasmSimdInit(() => wasmSimd());
exports.HighwayHash = WasmHighwayHash;
exports.WasmHighwayHash = WasmHighwayHash;
exports.hasWasmSimd = hasSimd;
}));