var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod2) => function __require() {
try {
return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports;
} catch (e) {
throw mod2 = 0, e;
}
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod2 || !mod2.__esModule ? __defProp(target, "default", { value: mod2, enumerable: true }) : target,
mod2
));
var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2);
// node_modules/bare-events/lib/errors.js
var require_errors = __commonJS({
"node_modules/bare-events/lib/errors.js"(exports2, module2) {
module2.exports = class EventEmitterError extends Error {
constructor(msg, code, fn = EventEmitterError, opts) {
super(`${code}: ${msg}`, opts);
this.code = code;
if (Error.captureStackTrace) {
Error.captureStackTrace(this, fn);
}
}
get name() {
return "EventEmitterError";
}
static OPERATION_ABORTED(cause, msg = "Operation aborted") {
return new EventEmitterError(msg, "OPERATION_ABORTED", EventEmitterError.OPERATION_ABORTED, {
cause
});
}
static UNHANDLED_ERROR(cause, msg = "Unhandled error") {
return new EventEmitterError(msg, "UNHANDLED_ERROR", EventEmitterError.UNHANDLED_ERROR, {
cause
});
}
};
}
});
// node_modules/bare-events/index.js
var require_bare_events = __commonJS({
"node_modules/bare-events/index.js"(exports2, module2) {
var errors = require_errors();
var EventListener = class {
constructor() {
this.list = [];
this.count = 0;
}
append(ctx, name, fn, once) {
this.count++;
ctx.emit("newListener", name, fn);
this.list.push([fn, once]);
}
prepend(ctx, name, fn, once) {
this.count++;
ctx.emit("newListener", name, fn);
this.list.unshift([fn, once]);
}
remove(ctx, name, fn) {
for (let i = 0, n = this.list.length; i < n; i++) {
const l = this.list[i];
if (l[0] === fn) {
this.list.splice(i, 1);
if (this.count === 1) delete ctx._events[name];
ctx.emit("removeListener", name, fn);
this.count--;
return;
}
}
}
removeAll(ctx, name) {
const list = [...this.list];
this.list = [];
if (this.count === list.length) delete ctx._events[name];
for (let i = list.length - 1; i >= 0; i--) {
ctx.emit("removeListener", name, list[i][0]);
}
this.count -= list.length;
}
emit(ctx, name, ...args) {
const list = [...this.list];
for (let i = 0, n = list.length; i < n; i++) {
const l = list[i];
if (l[1] === true) this.remove(ctx, name, l[0]);
Reflect.apply(l[0], ctx, args);
}
return list.length > 0;
}
};
function appendListener(ctx, name, fn, once) {
if (ctx._events === void 0) ctx._events = /* @__PURE__ */ Object.create(null);
const e = ctx._events[name] || (ctx._events[name] = new EventListener());
e.append(ctx, name, fn, once);
return ctx;
}
function prependListener(ctx, name, fn, once) {
if (ctx._events === void 0) ctx._events = /* @__PURE__ */ Object.create(null);
const e = ctx._events[name] || (ctx._events[name] = new EventListener());
e.prepend(ctx, name, fn, once);
return ctx;
}
function removeListener(ctx, name, fn) {
if (ctx._events === void 0) return ctx;
const e = ctx._events[name];
if (e !== void 0) e.remove(ctx, name, fn);
return ctx;
}
function throwUnhandledError(...args) {
let err;
if (args.length > 0) err = args[0];
if (err instanceof Error === false) err = errors.UNHANDLED_ERROR(err);
if (Error.captureStackTrace) {
Error.captureStackTrace(err, exports2.prototype.emit);
}
queueMicrotask(() => {
throw err;
});
}
module2.exports = exports2 = class EventEmitter {
constructor() {
this._events = /* @__PURE__ */ Object.create(null);
}
addListener(name, fn) {
return appendListener(this, name, fn, false);
}
addOnceListener(name, fn) {
return appendListener(this, name, fn, true);
}
prependListener(name, fn) {
return prependListener(this, name, fn, false);
}
prependOnceListener(name, fn) {
return prependListener(this, name, fn, true);
}
removeListener(name, fn) {
return removeListener(this, name, fn);
}
on(name, fn) {
return appendListener(this, name, fn, false);
}
once(name, fn) {
return appendListener(this, name, fn, true);
}
off(name, fn) {
return removeListener(this, name, fn);
}
emit(name, ...args) {
if (name === "error" && this._events !== void 0 && this._events.error === void 0) {
throwUnhandledError(...args);
}
if (this._events === void 0) return false;
const e = this._events[name];
return e === void 0 ? false : e.emit(this, name, ...args);
}
listeners(name) {
if (this._events === void 0) return [];
const e = this._events[name];
return e === void 0 ? [] : [...e.list];
}
listenerCount(name) {
if (this._events === void 0) return 0;
const e = this._events[name];
return e === void 0 ? 0 : e.list.length;
}
getMaxListeners() {
return EventEmitter.defaultMaxListeners;
}
setMaxListeners(n) {
}
removeAllListeners(name) {
if (arguments.length === 0) {
for (const key of Reflect.ownKeys(this._events)) {
if (key === "removeListener") continue;
this.removeAllListeners(key);
}
this.removeAllListeners("removeListener");
} else {
const e = this._events[name];
if (e !== void 0) e.removeAll(this, name);
}
return this;
}
};
exports2.EventEmitter = exports2;
exports2.errors = errors;
exports2.defaultMaxListeners = 10;
exports2.on = function on(emitter, name, opts = {}) {
const { signal } = opts;
if (signal && signal.aborted) {
throw errors.OPERATION_ABORTED(signal.reason);
}
let error = null;
let done = false;
const events = [];
const promises = [];
if (name !== "error") emitter.on("error", onerror);
if (signal) signal.addEventListener("abort", onabort);
emitter.on(name, onevent);
return {
next() {
if (events.length) {
return Promise.resolve({ value: events.shift(), done: false });
}
if (error) {
const err = error;
error = null;
return Promise.reject(err);
}
if (done) return onclose();
return new Promise((resolve, reject) => promises.push({ resolve, reject }));
},
return() {
return onclose();
},
throw(err) {
return onerror(err);
},
[Symbol.asyncIterator]() {
return this;
}
};
function onevent(...args) {
if (promises.length) {
promises.shift().resolve({ value: args, done: false });
} else {
events.push(args);
}
}
function onerror(err) {
emitter.off(name, onevent).off("error", onerror);
if (promises.length) {
promises.shift().reject(err);
} else {
error = err;
}
return Promise.resolve({ done: true });
}
function onabort() {
signal.removeEventListener("abort", onabort);
onerror(errors.OPERATION_ABORTED(signal.reason));
}
function onclose() {
emitter.off(name, onevent);
if (name !== "error") emitter.off("error", onerror);
if (signal) signal.removeEventListener("abort", onabort);
done = true;
if (promises.length) promises.shift().resolve({ done: true });
return Promise.resolve({ done: true });
}
};
exports2.once = function once(emitter, name, opts = {}) {
const { signal } = opts;
if (signal && signal.aborted) {
return Promise.reject(errors.OPERATION_ABORTED(signal.reason));
}
return new Promise((resolve, reject) => {
if (name !== "error") emitter.on("error", onerror);
if (signal) signal.addEventListener("abort", onabort);
emitter.once(name, onevent);
function onevent(...args) {
if (name !== "error") emitter.off("error", onerror);
if (signal) signal.removeEventListener("abort", onabort);
resolve(args);
}
function onerror(err) {
emitter.off(name, onevent);
if (name !== "error") emitter.off("error", onerror);
reject(err);
}
function onabort() {
signal.removeEventListener("abort", onabort);
onerror(errors.OPERATION_ABORTED(signal.reason));
}
});
};
exports2.forward = function forward(from, to, names, opts = {}) {
if (typeof names === "string") names = [names];
const { emit = to.emit.bind(to) } = opts;
const listeners = names.map(
(name) => function onevent(...args) {
emit(name, ...args);
}
);
to.on("newListener", (name) => {
const i = names.indexOf(name);
if (i !== -1 && to.listenerCount(name) === 0) {
from.on(name, listeners[i]);
}
}).on("removeListener", (name) => {
const i = names.indexOf(name);
if (i !== -1 && to.listenerCount(name) === 0) {
from.off(name, listeners[i]);
}
});
};
exports2.listenerCount = function listenerCount(emitter, name) {
return emitter.listenerCount(name);
};
exports2.getMaxListeners = function getMaxListeners(emitter) {
if (typeof emitter.getMaxListeners === "function") {
return emitter.getMaxListeners();
}
return exports2.defaultMaxListeners;
};
exports2.setMaxListeners = function setMaxListeners(n, ...emitters) {
if (emitters.length === 0) exports2.defaultMaxListeners = n;
else {
for (const emitter of emitters) {
if (typeof emitter.setMaxListeners === "function") {
emitter.setMaxListeners(n);
}
}
}
};
}
});
// node_modules/events-universal/default.js
var require_default = __commonJS({
"node_modules/events-universal/default.js"(exports2, module2) {
module2.exports = require_bare_events();
}
});
// node_modules/fast-fifo/fixed-size.js
var require_fixed_size = __commonJS({
"node_modules/fast-fifo/fixed-size.js"(exports2, module2) {
module2.exports = class FixedFIFO {
constructor(hwm) {
if (!(hwm > 0) || (hwm - 1 & hwm) !== 0) throw new Error("Max size for a FixedFIFO should be a power of two");
this.buffer = new Array(hwm);
this.mask = hwm - 1;
this.top = 0;
this.btm = 0;
this.next = null;
}
clear() {
this.top = this.btm = 0;
this.next = null;
this.buffer.fill(void 0);
}
push(data) {
if (this.buffer[this.top] !== void 0) return false;
this.buffer[this.top] = data;
this.top = this.top + 1 & this.mask;
return true;
}
shift() {
const last = this.buffer[this.btm];
if (last === void 0) return void 0;
this.buffer[this.btm] = void 0;
this.btm = this.btm + 1 & this.mask;
return last;
}
peek() {
return this.buffer[this.btm];
}
isEmpty() {
return this.buffer[this.btm] === void 0;
}
};
}
});
// node_modules/fast-fifo/index.js
var require_fast_fifo = __commonJS({
"node_modules/fast-fifo/index.js"(exports2, module2) {
var FixedFIFO = require_fixed_size();
module2.exports = class FastFIFO {
constructor(hwm) {
this.hwm = hwm || 16;
this.head = new FixedFIFO(this.hwm);
this.tail = this.head;
this.length = 0;
}
clear() {
this.head = this.tail;
this.head.clear();
this.length = 0;
}
push(val) {
this.length++;
if (!this.head.push(val)) {
const prev = this.head;
this.head = prev.next = new FixedFIFO(2 * this.head.buffer.length);
this.head.push(val);
}
}
shift() {
if (this.length !== 0) this.length--;
const val = this.tail.shift();
if (val === void 0 && this.tail.next) {
const next = this.tail.next;
this.tail.next = null;
this.tail = next;
return this.tail.shift();
}
return val;
}
peek() {
const val = this.tail.peek();
if (val === void 0 && this.tail.next) return this.tail.next.peek();
return val;
}
isEmpty() {
return this.length === 0;
}
};
}
});
// node_modules/b4a/index.js
var require_b4a = __commonJS({
"node_modules/b4a/index.js"(exports2, module2) {
function isBuffer(value) {
return Buffer.isBuffer(value) || value instanceof Uint8Array;
}
function isEncoding(encoding) {
return Buffer.isEncoding(encoding);
}
function alloc(size, fill2, encoding) {
return Buffer.alloc(size, fill2, encoding);
}
function allocUnsafe(size) {
return Buffer.allocUnsafe(size);
}
function allocUnsafeSlow(size) {
return Buffer.allocUnsafeSlow(size);
}
function byteLength(string, encoding) {
return Buffer.byteLength(string, encoding);
}
function compare(a, b) {
return Buffer.compare(a, b);
}
function concat(buffers, totalLength) {
return Buffer.concat(buffers, totalLength);
}
function copy(source, target, targetStart, start, end) {
return toBuffer(source).copy(target, targetStart, start, end);
}
function equals(a, b) {
return toBuffer(a).equals(b);
}
function fill(buffer, value, offset, end, encoding) {
return toBuffer(buffer).fill(value, offset, end, encoding);
}
function from(value, encodingOrOffset, length) {
return Buffer.from(value, encodingOrOffset, length);
}
function includes(buffer, value, byteOffset, encoding) {
return toBuffer(buffer).includes(value, byteOffset, encoding);
}
function indexOf(buffer, value, byfeOffset, encoding) {
return toBuffer(buffer).indexOf(value, byfeOffset, encoding);
}
function lastIndexOf(buffer, value, byteOffset, encoding) {
return toBuffer(buffer).lastIndexOf(value, byteOffset, encoding);
}
function swap16(buffer) {
return toBuffer(buffer).swap16();
}
function swap32(buffer) {
return toBuffer(buffer).swap32();
}
function swap64(buffer) {
return toBuffer(buffer).swap64();
}
function toBuffer(buffer) {
if (Buffer.isBuffer(buffer)) return buffer;
return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength);
}
function toString(buffer, encoding, start, end) {
return toBuffer(buffer).toString(encoding, start, end);
}
function write(buffer, string, offset, length, encoding) {
return toBuffer(buffer).write(string, offset, length, encoding);
}
function readDoubleBE(buffer, offset) {
return toBuffer(buffer).readDoubleBE(offset);
}
function readDoubleLE(buffer, offset) {
return toBuffer(buffer).readDoubleLE(offset);
}
function readFloatBE(buffer, offset) {
return toBuffer(buffer).readFloatBE(offset);
}
function readFloatLE(buffer, offset) {
return toBuffer(buffer).readFloatLE(offset);
}
function readInt32BE(buffer, offset) {
return toBuffer(buffer).readInt32BE(offset);
}
function readInt32LE(buffer, offset) {
return toBuffer(buffer).readInt32LE(offset);
}
function readUInt32BE(buffer, offset) {
return toBuffer(buffer).readUInt32BE(offset);
}
function readUInt32LE(buffer, offset) {
return toBuffer(buffer).readUInt32LE(offset);
}
function writeDoubleBE(buffer, value, offset) {
return toBuffer(buffer).writeDoubleBE(value, offset);
}
function writeDoubleLE(buffer, value, offset) {
return toBuffer(buffer).writeDoubleLE(value, offset);
}
function writeFloatBE(buffer, value, offset) {
return toBuffer(buffer).writeFloatBE(value, offset);
}
function writeFloatLE(buffer, value, offset) {
return toBuffer(buffer).writeFloatLE(value, offset);
}
function writeInt32BE(buffer, value, offset) {
return toBuffer(buffer).writeInt32BE(value, offset);
}
function writeInt32LE(buffer, value, offset) {
return toBuffer(buffer).writeInt32LE(value, offset);
}
function writeUInt32BE(buffer, value, offset) {
return toBuffer(buffer).writeUInt32BE(value, offset);
}
function writeUInt32LE(buffer, value, offset) {
return toBuffer(buffer).writeUInt32LE(value, offset);
}
module2.exports = {
isBuffer,
isEncoding,
alloc,
allocUnsafe,
allocUnsafeSlow,
byteLength,
compare,
concat,
copy,
equals,
fill,
from,
includes,
indexOf,
lastIndexOf,
swap16,
swap32,
swap64,
toBuffer,
toString,
write,
readDoubleBE,
readDoubleLE,
readFloatBE,
readFloatLE,
readInt32BE,
readInt32LE,
readUInt32BE,
readUInt32LE,
writeDoubleBE,
writeDoubleLE,
writeFloatBE,
writeFloatLE,
writeInt32BE,
writeInt32LE,
writeUInt32BE,
writeUInt32LE
};
}
});
// node_modules/text-decoder/lib/pass-through-decoder.js
var require_pass_through_decoder = __commonJS({
"node_modules/text-decoder/lib/pass-through-decoder.js"(exports2, module2) {
var b4a4 = require_b4a();
module2.exports = class PassThroughDecoder {
constructor(encoding) {
this.encoding = encoding;
}
get remaining() {
return 0;
}
decode(data) {
return b4a4.toString(data, this.encoding);
}
flush() {
return "";
}
};
}
});
// node_modules/text-decoder/lib/utf8-decoder.js
var require_utf8_decoder = __commonJS({
"node_modules/text-decoder/lib/utf8-decoder.js"(exports2, module2) {
var b4a4 = require_b4a();
module2.exports = class UTF8Decoder {
constructor() {
this._reset();
}
get remaining() {
return this.bytesSeen;
}
decode(data) {
if (data.byteLength === 0) return "";
if (this.bytesNeeded === 0 && trailingIncomplete(data, 0) === 0) {
this.bytesSeen = trailingBytesSeen(data);
return b4a4.toString(data, "utf8");
}
let result = "";
let start = 0;
if (this.bytesNeeded > 0) {
while (start < data.byteLength) {
const byte = data[start];
if (byte < this.lowerBoundary || byte > this.upperBoundary) {
result += "\uFFFD";
this._reset();
break;
}
this.lowerBoundary = 128;
this.upperBoundary = 191;
this.codePoint = this.codePoint << 6 | byte & 63;
this.bytesSeen++;
start++;
if (this.bytesSeen === this.bytesNeeded) {
result += String.fromCodePoint(this.codePoint);
this._reset();
break;
}
}
if (this.bytesNeeded > 0) return result;
}
const trailing = trailingIncomplete(data, start);
const end = data.byteLength - trailing;
if (end > start) result += b4a4.toString(data, "utf8", start, end);
for (let i = end; i < data.byteLength; i++) {
const byte = data[i];
if (this.bytesNeeded === 0) {
if (byte <= 127) {
this.bytesSeen = 0;
result += String.fromCharCode(byte);
} else if (byte >= 194 && byte <= 223) {
this.bytesNeeded = 2;
this.bytesSeen = 1;
this.codePoint = byte & 31;
} else if (byte >= 224 && byte <= 239) {
if (byte === 224) this.lowerBoundary = 160;
else if (byte === 237) this.upperBoundary = 159;
this.bytesNeeded = 3;
this.bytesSeen = 1;
this.codePoint = byte & 15;
} else if (byte >= 240 && byte <= 244) {
if (byte === 240) this.lowerBoundary = 144;
else if (byte === 244) this.upperBoundary = 143;
this.bytesNeeded = 4;
this.bytesSeen = 1;
this.codePoint = byte & 7;
} else {
this.bytesSeen = 1;
result += "\uFFFD";
}
continue;
}
if (byte < this.lowerBoundary || byte > this.upperBoundary) {
result += "\uFFFD";
i--;
this._reset();
continue;
}
this.lowerBoundary = 128;
this.upperBoundary = 191;
this.codePoint = this.codePoint << 6 | byte & 63;
this.bytesSeen++;
if (this.bytesSeen === this.bytesNeeded) {
result += String.fromCodePoint(this.codePoint);
this._reset();
}
}
return result;
}
flush() {
const result = this.bytesNeeded > 0 ? "\uFFFD" : "";
this._reset();
return result;
}
_reset() {
this.codePoint = 0;
this.bytesNeeded = 0;
this.bytesSeen = 0;
this.lowerBoundary = 128;
this.upperBoundary = 191;
}
};
function trailingIncomplete(data, start) {
const len = data.byteLength;
if (len <= start) return 0;
const limit = Math.max(start, len - 4);
let i = len - 1;
while (i > limit && (data[i] & 192) === 128) i--;
if (i < start) return 0;
const byte = data[i];
let needed;
if (byte <= 127) return 0;
if (byte >= 194 && byte <= 223) needed = 2;
else if (byte >= 224 && byte <= 239) needed = 3;
else if (byte >= 240 && byte <= 244) needed = 4;
else return 0;
const available = len - i;
return available < needed ? available : 0;
}
function trailingBytesSeen(data) {
const len = data.byteLength;
if (len === 0) return 0;
const last = data[len - 1];
if (last <= 127) return 0;
if ((last & 192) !== 128) return 1;
const limit = Math.max(0, len - 4);
let i = len - 2;
while (i >= limit && (data[i] & 192) === 128) i--;
if (i < 0) return 1;
const first = data[i];
let needed;
if (first >= 194 && first <= 223) needed = 2;
else if (first >= 224 && first <= 239) needed = 3;
else if (first >= 240 && first <= 244) needed = 4;
else return 1;
if (len - i !== needed) return 1;
if (needed >= 3) {
const second = data[i + 1];
if (first === 224 && second < 160) return 1;
if (first === 237 && second > 159) return 1;
if (first === 240 && second < 144) return 1;
if (first === 244 && second > 143) return 1;
}
return 0;
}
}
});
// node_modules/text-decoder/index.js
var require_text_decoder = __commonJS({
"node_modules/text-decoder/index.js"(exports2, module2) {
var PassThroughDecoder = require_pass_through_decoder();
var UTF8Decoder = require_utf8_decoder();
module2.exports = class TextDecoder {
constructor(encoding = "utf8") {
this.encoding = normalizeEncoding(encoding);
switch (this.encoding) {
case "utf8":
this.decoder = new UTF8Decoder();
break;
case "utf16le":
case "base64":
throw new Error("Unsupported encoding: " + this.encoding);
default:
this.decoder = new PassThroughDecoder(this.encoding);
}
}
get remaining() {
return this.decoder.remaining;
}
push(data) {
if (typeof data === "string") return data;
return this.decoder.decode(data);
}
// For Node.js compatibility
write(data) {
return this.push(data);
}
end(data) {
let result = "";
if (data) result = this.push(data);
result += this.decoder.flush();
return result;
}
};
function normalizeEncoding(encoding) {
encoding = encoding.toLowerCase();
switch (encoding) {
case "utf8":
case "utf-8":
return "utf8";
case "ucs2":
case "ucs-2":
case "utf16le":
case "utf-16le":
return "utf16le";
case "latin1":
case "binary":
return "latin1";
case "base64":
case "ascii":
case "hex":
return encoding;
default:
throw new Error("Unknown encoding: " + encoding);
}
}
}
});
// node_modules/streamx/index.js
var require_streamx = __commonJS({
"node_modules/streamx/index.js"(exports2, module2) {
var { EventEmitter } = require_default();
var STREAM_DESTROYED = new Error("Stream was destroyed");
var PREMATURE_CLOSE = new Error("Premature close");
var FIFO = require_fast_fifo();
var TextDecoder = require_text_decoder();
var qmt = typeof queueMicrotask === "undefined" ? (fn) => global.process.nextTick(fn) : queueMicrotask;
var MAX = (1 << 29) - 1;
var OPENING = 1;
var PREDESTROYING = 2;
var DESTROYING = 4;
var DESTROYED = 8;
var NOT_OPENING = MAX ^ OPENING;
var NOT_PREDESTROYING = MAX ^ PREDESTROYING;
var READ_ACTIVE = 1 << 4;
var READ_UPDATING = 2 << 4;
var READ_PRIMARY = 4 << 4;
var READ_QUEUED = 8 << 4;
var READ_RESUMED = 16 << 4;
var READ_PIPE_DRAINED = 32 << 4;
var READ_ENDING = 64 << 4;
var READ_EMIT_DATA = 128 << 4;
var READ_EMIT_READABLE = 256 << 4;
var READ_EMITTED_READABLE = 512 << 4;
var READ_DONE = 1024 << 4;
var READ_NEXT_TICK = 2048 << 4;
var READ_NEEDS_PUSH = 4096 << 4;
var READ_READ_AHEAD = 8192 << 4;
var READ_FLOWING = READ_RESUMED | READ_PIPE_DRAINED;
var READ_ACTIVE_AND_NEEDS_PUSH = READ_ACTIVE | READ_NEEDS_PUSH;
var READ_PRIMARY_AND_ACTIVE = READ_PRIMARY | READ_ACTIVE;
var READ_EMIT_READABLE_AND_QUEUED = READ_EMIT_READABLE | READ_QUEUED;
var READ_RESUMED_READ_AHEAD = READ_RESUMED | READ_READ_AHEAD;
var READ_NOT_ACTIVE = MAX ^ READ_ACTIVE;
var READ_NON_PRIMARY = MAX ^ READ_PRIMARY;
var READ_NON_PRIMARY_AND_PUSHED = MAX ^ (READ_PRIMARY | READ_NEEDS_PUSH);
var READ_PUSHED = MAX ^ READ_NEEDS_PUSH;
var READ_PAUSED = MAX ^ READ_RESUMED;
var READ_NOT_QUEUED = MAX ^ (READ_QUEUED | READ_EMITTED_READABLE);
var READ_NOT_ENDING = MAX ^ READ_ENDING;
var READ_PIPE_NOT_DRAINED = MAX ^ READ_FLOWING;
var READ_NOT_NEXT_TICK = MAX ^ READ_NEXT_TICK;
var READ_NOT_UPDATING = MAX ^ READ_UPDATING;
var READ_NO_READ_AHEAD = MAX ^ READ_READ_AHEAD;
var READ_PAUSED_NO_READ_AHEAD = MAX ^ READ_RESUMED_READ_AHEAD;
var WRITE_ACTIVE = 1 << 18;
var WRITE_UPDATING = 2 << 18;
var WRITE_PRIMARY = 4 << 18;
var WRITE_QUEUED = 8 << 18;
var WRITE_UNDRAINED = 16 << 18;
var WRITE_DONE = 32 << 18;
var WRITE_EMIT_DRAIN = 64 << 18;
var WRITE_NEXT_TICK = 128 << 18;
var WRITE_WRITING = 256 << 18;
var WRITE_FINISHING = 512 << 18;
var WRITE_CORKED = 1024 << 18;
var WRITE_NOT_ACTIVE = MAX ^ (WRITE_ACTIVE | WRITE_WRITING);
var WRITE_NON_PRIMARY = MAX ^ WRITE_PRIMARY;
var WRITE_NOT_FINISHING = MAX ^ (WRITE_ACTIVE | WRITE_FINISHING);
var WRITE_DRAINED = MAX ^ WRITE_UNDRAINED;
var WRITE_NOT_QUEUED = MAX ^ WRITE_QUEUED;
var WRITE_NOT_NEXT_TICK = MAX ^ WRITE_NEXT_TICK;
var WRITE_NOT_UPDATING = MAX ^ WRITE_UPDATING;
var WRITE_NOT_CORKED = MAX ^ WRITE_CORKED;
var ACTIVE = READ_ACTIVE | WRITE_ACTIVE;
var NOT_ACTIVE = MAX ^ ACTIVE;
var DONE = READ_DONE | WRITE_DONE;
var DESTROY_STATUS = DESTROYING | DESTROYED | PREDESTROYING;
var OPEN_STATUS = DESTROY_STATUS | OPENING;
var AUTO_DESTROY = DESTROY_STATUS | DONE;
var NON_PRIMARY = WRITE_NON_PRIMARY & READ_NON_PRIMARY;
var ACTIVE_OR_TICKING = WRITE_NEXT_TICK | READ_NEXT_TICK;
var TICKING = ACTIVE_OR_TICKING & NOT_ACTIVE;
var IS_OPENING = OPEN_STATUS | TICKING;
var READ_PRIMARY_STATUS = OPEN_STATUS | READ_ENDING | READ_DONE;
var READ_STATUS = OPEN_STATUS | READ_DONE | READ_QUEUED;
var READ_ENDING_STATUS = OPEN_STATUS | READ_ENDING | READ_QUEUED;
var READ_READABLE_STATUS = OPEN_STATUS | READ_EMIT_READABLE | READ_QUEUED | READ_EMITTED_READABLE;
var SHOULD_NOT_READ = OPEN_STATUS | READ_ACTIVE | READ_ENDING | READ_DONE | READ_NEEDS_PUSH | READ_READ_AHEAD;
var READ_BACKPRESSURE_STATUS = DESTROY_STATUS | READ_ENDING | READ_DONE;
var READ_UPDATE_SYNC_STATUS = READ_UPDATING | OPEN_STATUS | READ_NEXT_TICK | READ_PRIMARY;
var READ_NEXT_TICK_OR_OPENING = READ_NEXT_TICK | OPENING;
var WRITE_PRIMARY_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_DONE;
var WRITE_QUEUED_AND_UNDRAINED = WRITE_QUEUED | WRITE_UNDRAINED;
var WRITE_QUEUED_AND_ACTIVE = WRITE_QUEUED | WRITE_ACTIVE;
var WRITE_DRAIN_STATUS = WRITE_QUEUED | WRITE_UNDRAINED | OPEN_STATUS | WRITE_ACTIVE;
var WRITE_STATUS = OPEN_STATUS | WRITE_ACTIVE | WRITE_QUEUED | WRITE_CORKED;
var WRITE_PRIMARY_AND_ACTIVE = WRITE_PRIMARY | WRITE_ACTIVE;
var WRITE_ACTIVE_AND_WRITING = WRITE_ACTIVE | WRITE_WRITING;
var WRITE_FINISHING_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_QUEUED_AND_ACTIVE | WRITE_DONE;
var WRITE_BACKPRESSURE_STATUS = WRITE_UNDRAINED | DESTROY_STATUS | WRITE_FINISHING | WRITE_DONE;
var WRITE_UPDATE_SYNC_STATUS = WRITE_UPDATING | OPEN_STATUS | WRITE_NEXT_TICK | WRITE_PRIMARY;
var WRITE_DROP_DATA = WRITE_FINISHING | WRITE_DONE | DESTROY_STATUS;
var asyncIterator = Symbol.asyncIterator || /* @__PURE__ */ Symbol("asyncIterator");
var WritableState = class {
constructor(stream, { highWaterMark = 16384, map = null, mapWritable, byteLength, byteLengthWritable } = {}) {
this.stream = stream;
this.queue = new FIFO();
this.highWaterMark = highWaterMark;
this.buffered = 0;
this.error = null;
this.pipeline = null;
this.drains = null;
this.byteLength = byteLengthWritable || byteLength || defaultByteLength;
this.map = mapWritable || map;
this.afterWrite = afterWrite.bind(this);
this.afterUpdateNextTick = updateWriteNT.bind(this);
}
get ending() {
return (this.stream._duplexState & WRITE_FINISHING) !== 0;
}
get ended() {
return (this.stream._duplexState & WRITE_DONE) !== 0;
}
push(data) {
if ((this.stream._duplexState & WRITE_DROP_DATA) !== 0) return false;
if (this.map !== null) data = this.map(data);
this.buffered += this.byteLength(data);
this.queue.push(data);
if (this.buffered < this.highWaterMark) {
this.stream._duplexState |= WRITE_QUEUED;
return true;
}
this.stream._duplexState |= WRITE_QUEUED_AND_UNDRAINED;
return false;
}
shift() {
const data = this.queue.shift();
this.buffered -= this.byteLength(data);
if (this.buffered === 0) this.stream._duplexState &= WRITE_NOT_QUEUED;
return data;
}
end(data) {
if (typeof data === "function") this.stream.once("finish", data);
else if (data !== void 0 && data !== null) this.push(data);
this.stream._duplexState = (this.stream._duplexState | WRITE_FINISHING) & WRITE_NON_PRIMARY;
}
autoBatch(data, cb) {
const buffer = [];
const stream = this.stream;
buffer.push(data);
while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED_AND_ACTIVE) {
buffer.push(stream._writableState.shift());
}
if ((stream._duplexState & OPEN_STATUS) !== 0) return cb(null);
stream._writev(buffer, cb);
}
update() {
const stream = this.stream;
stream._duplexState |= WRITE_UPDATING;
do {
while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED) {
const data = this.shift();
stream._duplexState |= WRITE_ACTIVE_AND_WRITING;
stream._write(data, this.afterWrite);
}
if ((stream._duplexState & WRITE_PRIMARY_AND_ACTIVE) === 0) this.updateNonPrimary();
} while (this.continueUpdate() === true);
stream._duplexState &= WRITE_NOT_UPDATING;
}
updateNonPrimary() {
const stream = this.stream;
if ((stream._duplexState & WRITE_FINISHING_STATUS) === WRITE_FINISHING) {
stream._duplexState = stream._duplexState | WRITE_ACTIVE;
stream._final(afterFinal.bind(this));
return;
}
if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) {
if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) {
stream._duplexState |= ACTIVE;
stream._destroy(afterDestroy.bind(this));
}
return;
}
if ((stream._duplexState & IS_OPENING) === OPENING) {
stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING;
stream._open(afterOpen.bind(this));
}
}
continueUpdate() {
if ((this.stream._duplexState & WRITE_NEXT_TICK) === 0) return false;
this.stream._duplexState &= WRITE_NOT_NEXT_TICK;
return true;
}
updateCallback() {
if ((this.stream._duplexState & WRITE_UPDATE_SYNC_STATUS) === WRITE_PRIMARY) this.update();
else this.updateNextTick();
}
updateNextTick() {
if ((this.stream._duplexState & WRITE_NEXT_TICK) !== 0) return;
this.stream._duplexState |= WRITE_NEXT_TICK;
if ((this.stream._duplexState & WRITE_UPDATING) === 0) qmt(this.afterUpdateNextTick);
}
};
var ReadableState = class {
constructor(stream, { highWaterMark = 16384, map = null, mapReadable, byteLength, byteLengthReadable } = {}) {
this.stream = stream;
this.queue = new FIFO();
this.highWaterMark = highWaterMark === 0 ? 1 : highWaterMark;
this.buffered = 0;
this.readAhead = highWaterMark > 0;
this.error = null;
this.pipeline = null;
this.byteLength = byteLengthReadable || byteLength || defaultByteLength;
this.map = mapReadable || map;
this.pipeTo = null;
this.afterRead = afterRead.bind(this);
this.afterUpdateNextTick = updateReadNT.bind(this);
}
get ending() {
return (this.stream._duplexState & READ_ENDING) !== 0;
}
get ended() {
return (this.stream._duplexState & READ_DONE) !== 0;
}
pipe(pipeTo, cb) {
if (this.pipeTo !== null) throw new Error("Can only pipe to one destination");
if (typeof cb !== "function") cb = null;
this.stream._duplexState |= READ_PIPE_DRAINED;
this.pipeTo = pipeTo;
this.pipeline = new Pipeline(this.stream, pipeTo, cb);
if (cb) this.stream.on("error", noop);
if (isStreamx(pipeTo)) {
pipeTo._writableState.pipeline = this.pipeline;
if (cb) pipeTo.on("error", noop);
pipeTo.on("finish", this.pipeline.finished.bind(this.pipeline));
} else {
const onerror = this.pipeline.done.bind(this.pipeline, pipeTo);
const onclose = this.pipeline.done.bind(this.pipeline, pipeTo, null);
pipeTo.on("error", onerror);
pipeTo.on("close", onclose);
pipeTo.on("finish", this.pipeline.finished.bind(this.pipeline));
}
pipeTo.on("drain", afterDrain.bind(this));
this.stream.emit("piping", pipeTo);
pipeTo.emit("pipe", this.stream);
}
push(data) {
const stream = this.stream;
if (data === null) {
this.highWaterMark = 0;
stream._duplexState = (stream._duplexState | READ_ENDING) & READ_NON_PRIMARY_AND_PUSHED;
return false;
}
if (this.map !== null) {
data = this.map(data);
if (data === null) {
stream._duplexState &= READ_PUSHED;
return this.buffered < this.highWaterMark;
}
}
this.buffered += this.byteLength(data);
this.queue.push(data);
stream._duplexState = (stream._duplexState | READ_QUEUED) & READ_PUSHED;
return this.buffered < this.highWaterMark;
}
shift() {
const data = this.queue.shift();
this.buffered -= this.byteLength(data);
if (this.buffered === 0) this.stream._duplexState &= READ_NOT_QUEUED;
return data;
}
unshift(data) {
const pending = [this.map !== null ? this.map(data) : data];
while (this.buffered > 0) pending.push(this.shift());
for (let i = 0; i < pending.length - 1; i++) {
const data2 = pending[i];
this.buffered += this.byteLength(data2);
this.queue.push(data2);
}
this.push(pending[pending.length - 1]);
}
read() {
const stream = this.stream;
if ((stream._duplexState & READ_STATUS) === READ_QUEUED) {
const data = this.shift();
if (this.pipeTo !== null && this.pipeTo.write(data) === false)
stream._duplexState &= READ_PIPE_NOT_DRAINED;
if ((stream._duplexState & READ_EMIT_DATA) !== 0) stream.emit("data", data);
return data;
}
if (this.readAhead === false) {
stream._duplexState |= READ_READ_AHEAD;
this.updateNextTick();
}
return null;
}
drain() {
const stream = this.stream;
while ((stream._duplexState & READ_STATUS) === READ_QUEUED && (stream._duplexState & READ_FLOWING) !== 0) {
const data = this.shift();
if (this.pipeTo !== null && this.pipeTo.write(data) === false)
stream._duplexState &= READ_PIPE_NOT_DRAINED;
if ((stream._duplexState & READ_EMIT_DATA) !== 0) stream.emit("data", data);
}
}
update() {
const stream = this.stream;
stream._duplexState |= READ_UPDATING;
do {
this.drain();
while (this.buffered < this.highWaterMark && (stream._duplexState & SHOULD_NOT_READ) === READ_READ_AHEAD) {
stream._duplexState |= READ_ACTIVE_AND_NEEDS_PUSH;
stream._read(this.afterRead);
this.drain();
}
if ((stream._duplexState & READ_READABLE_STATUS) === READ_EMIT_READABLE_AND_QUEUED) {
stream._duplexState |= READ_EMITTED_READABLE;
stream.emit("readable");
}
if ((stream._duplexState & READ_PRIMARY_AND_ACTIVE) === 0) this.updateNonPrimary();
} while (this.continueUpdate() === true);
stream._duplexState &= READ_NOT_UPDATING;
}
updateNonPrimary() {
const stream = this.stream;
if ((stream._duplexState & READ_ENDING_STATUS) === READ_ENDING) {
stream._duplexState = (stream._duplexState | READ_DONE) & READ_NOT_ENDING;
stream.emit("end");
if ((stream._duplexState & AUTO_DESTROY) === DONE) stream._duplexState |= DESTROYING;
if (this.pipeTo !== null) this.pipeTo.end();
}
if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) {
if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) {
stream._duplexState |= ACTIVE;
stream._destroy(afterDestroy.bind(this));
}
return;
}
if ((stream._duplexState & IS_OPENING) === OPENING) {
stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING;
stream._open(afterOpen.bind(this));
}
}
continueUpdate() {
if ((this.stream._duplexState & READ_NEXT_TICK) === 0) return false;
this.stream._duplexState &= READ_NOT_NEXT_TICK;
return true;
}
updateCallback() {
if ((this.stream._duplexState & READ_UPDATE_SYNC_STATUS) === READ_PRIMARY) this.update();
else this.updateNextTick();
}
updateNextTickIfOpen() {
if ((this.stream._duplexState & READ_NEXT_TICK_OR_OPENING) !== 0) return;
this.stream._duplexState |= READ_NEXT_TICK;
if ((this.stream._duplexState & READ_UPDATING) === 0) qmt(this.afterUpdateNextTick);
}
updateNextTick() {
if ((this.stream._duplexState & READ_NEXT_TICK) !== 0) return;
this.stream._duplexState |= READ_NEXT_TICK;
if ((this.stream._duplexState & READ_UPDATING) === 0) qmt(this.afterUpdateNextTick);
}
};
var TransformState = class {
constructor(stream) {
this.data = null;
this.afterTransform = afterTransform.bind(stream);
this.afterFinal = null;
}
};
var Pipeline = class {
constructor(src, dst, cb) {
this.from = src;
this.to = dst;
this.afterPipe = cb;
this.error = null;
this.pipeToFinished = false;
}
finished() {
this.pipeToFinished = true;
}
done(stream, err) {
if (err) this.error = err;
if (stream === this.to) {
this.to = null;
if (this.from !== null) {
if ((this.from._duplexState & READ_DONE) === 0 || !this.pipeToFinished) {
this.from.destroy(this.error || new Error("Writable stream closed prematurely"));
}
return;
}
}
if (stream === this.from) {
this.from = null;
if (this.to !== null) {
if ((stream._duplexState & READ_DONE) === 0) {
this.to.destroy(this.error || new Error("Readable stream closed before ending"));
}
return;
}
}
if (this.afterPipe !== null) this.afterPipe(this.error);
this.to = this.from = this.afterPipe = null;
}
};
function afterDrain() {
this.stream._duplexState |= READ_PIPE_DRAINED;
this.updateCallback();
}
function afterFinal(err) {
const stream = this.stream;
if (err) stream.destroy(err);
if ((stream._duplexState & DESTROY_STATUS) === 0) {
stream._duplexState |= WRITE_DONE;
stream.emit("finish");
}
if ((stream._duplexState & AUTO_DESTROY) === DONE) {
stream._duplexState |= DESTROYING;
}
stream._duplexState &= WRITE_NOT_FINISHING;
if ((stream._duplexState & WRITE_UPDATING) === 0) this.update();
else this.updateNextTick();
}
function afterDestroy(err) {
const stream = this.stream;
if (!err && this.error !== STREAM_DESTROYED) err = this.error;
if (err) stream.emit("error", err);
stream._duplexState |= DESTROYED;
stream.emit("close");
const rs = stream._readableState;
const ws = stream._writableState;
if (rs !== null && rs.pipeline !== null) rs.pipeline.done(stream, err);
if (ws !== null) {
while (ws.drains !== null && ws.drains.length > 0) ws.drains.shift().resolve(false);
if (ws.pipeline !== null) ws.pipeline.done(stream, err);
}
}
function afterWrite(err) {
const stream = this.stream;
if (err) stream.destroy(err);
stream._duplexState &= WRITE_NOT_ACTIVE;
if (this.drains !== null) tickDrains(this.drains);
if ((stream._duplexState & WRITE_DRAIN_STATUS) === WRITE_UNDRAINED) {
stream._duplexState &= WRITE_DRAINED;
if ((stream._duplexState & WRITE_EMIT_DRAIN) === WRITE_EMIT_DRAIN) {
stream.emit("drain");
}
}
this.updateCallback();
}
function afterRead(err) {
if (err) this.stream.destroy(err);
this.stream._duplexState &= READ_NOT_ACTIVE;
if (this.readAhead === false && (this.stream._duplexState & READ_RESUMED) === 0)
this.stream._duplexState &= READ_NO_READ_AHEAD;
this.updateCallback();
}
function updateReadNT() {
if ((this.stream._duplexState & READ_UPDATING) === 0) {
this.stream._duplexState &= READ_NOT_NEXT_TICK;
this.update();
}
}
function updateWriteNT() {
if ((this.stream._duplexState & WRITE_UPDATING) === 0) {
this.stream._duplexState &= WRITE_NOT_NEXT_TICK;
this.update();
}
}
function tickDrains(drains) {
for (let i = 0; i < drains.length; i++) {
if (--drains[i].writes === 0) {
drains.shift().resolve(true);
i--;
}
}
}
function afterOpen(err) {
const stream = this.stream;
if (err) stream.destroy(err);
if ((stream._duplexState & DESTROYING) === 0) {
if ((stream._duplexState & READ_PRIMARY_STATUS) === 0) stream._duplexState |= READ_PRIMARY;
if ((stream._duplexState & WRITE_PRIMARY_STATUS) === 0) stream._duplexState |= WRITE_PRIMARY;
stream.emit("open");
}
stream._duplexState &= NOT_ACTIVE;
if (stream._writableState !== null) {
stream._writableState.updateCallback();
}
if (stream._readableState !== null) {
stream._readableState.updateCallback();
}
}
function afterTransform(err, data) {
if (data !== void 0 && data !== null) this.push(data);
this._writableState.afterWrite(err);
}
function newListener(name) {
if (this._readableState !== null) {
if (name === "data") {
this._duplexState |= READ_EMIT_DATA | READ_RESUMED_READ_AHEAD;
this._readableState.updateNextTick();
}
if (name === "readable") {
this._duplexState |= READ_EMIT_READABLE;
this._readableState.updateNextTick();
}
}
if (this._writableState !== null) {
if (name === "drain") {
this._duplexState |= WRITE_EMIT_DRAIN;
this._writableState.updateNextTick();
}
}
}
var Stream = class extends EventEmitter {
constructor(opts) {
super();
this._duplexState = 0;
this._readableState = null;
this._writableState = null;
if (opts) {
if (opts.open) this._open = opts.open;
if (opts.destroy) this._destroy = opts.destroy;
if (opts.predestroy) this._predestroy = opts.predestroy;
if (opts.signal) {
opts.signal.addEventListener("abort", abort.bind(this));
}
}
this.on("newListener", newListener);
}
_open(cb) {
cb(null);
}
_destroy(cb) {
cb(null);
}
_predestroy() {
}
get readable() {
return this._readableState !== null ? true : void 0;
}
get writable() {
return this._writableState !== null ? true : void 0;
}
get destroyed() {
return (this._duplexState & DESTROYED) !== 0;
}
get destroying() {
return (this._duplexState & DESTROY_STATUS) !== 0;
}
destroy(err) {
if ((this._duplexState & DESTROY_STATUS) === 0) {
if (!err) err = STREAM_DESTROYED;
this._duplexState = (this._duplexState | DESTROYING) & NON_PRIMARY;
if (this._readableState !== null) {
this._readableState.highWaterMark = 0;
this._readableState.error = err;
}
if (this._writableState !== null) {
this._writableState.highWaterMark = 0;
this._writableState.error = err;
}
this._duplexState |= PREDESTROYING;
this._predestroy();
this._duplexState &= NOT_PREDESTROYING;
if (this._readableState !== null) this._readableState.updateNextTick();
if (this._writableState !== null) this._writableState.updateNextTick();
}
}
};
var Readable = class _Readable extends Stream {
constructor(opts) {
super(opts);
this._duplexState |= OPENING | WRITE_DONE | READ_READ_AHEAD;
this._readableState = new ReadableState(this, opts);
if (opts) {
if (this._readableState.readAhead === false) this._duplexState &= READ_NO_READ_AHEAD;
if (opts.read) this._read = opts.read;
if (opts.eagerOpen) this._readableState.updateNextTick();
if (opts.encoding) this.setEncoding(opts.encoding);
}
}
setEncoding(encoding) {
const dec = new TextDecoder(encoding);
const map = this._readableState.map || echo;
this._readableState.map = mapOrSkip;
return this;
function mapOrSkip(data) {
const next = dec.push(data);
return next === "" && (data.byteLength !== 0 || dec.remaining > 0) ? null : map(next);
}
}
_read(cb) {
cb(null);
}
pipe(dest, cb) {
this._readableState.updateNextTick();
this._readableState.pipe(dest, cb);
return dest;
}
read() {
this._readableState.updateNextTick();
return this._readableState.read();
}
push(data) {
this._readableState.updateNextTickIfOpen();
return this._readableState.push(data);
}
unshift(data) {
this._readableState.updateNextTickIfOpen();
return this._readableState.unshift(data);
}
resume() {
this._duplexState |= READ_RESUMED_READ_AHEAD;
this._readableState.updateNextTick();
return this;
}
pause() {
this._duplexState &= this._readableState.readAhead === false ? READ_PAUSED_NO_READ_AHEAD : READ_PAUSED;
return this;
}
static _fromAsyncIterator(ite, opts) {
let destroy;
const rs = new _Readable({
...opts,
read(cb) {
ite.next().then(push).then(cb.bind(null, null)).catch(cb);
},
predestroy() {
destroy = ite.return();
},
destroy(cb) {
if (!destroy) return cb(null);
destroy.then(cb.bind(null, null)).catch(cb);
}
});
return rs;
function push(data) {
if (data.done) rs.push(null);
else rs.push(data.value);
}
}
static from(data, opts) {
if (isReadStreamx(data)) return data;
if (data[asyncIterator]) return this._fromAsyncIterator(data[asyncIterator](), opts);
if (!Array.isArray(data)) data = data === void 0 ? [] : [data];
let i = 0;
return new _Readable({
...opts,
read(cb) {
this.push(i === data.length ? null : data[i++]);
cb(null);
}
});
}
static isBackpressured(rs) {
return (rs._duplexState & READ_BACKPRESSURE_STATUS) !== 0 || rs._readableState.buffered >= rs._readableState.highWaterMark;
}
static isPaused(rs) {
return (rs._duplexState & READ_RESUMED) === 0;
}
[asyncIterator]() {
const stream = this;
let error = null;
let promiseResolve = null;
let promiseReject = null;
this.on("error", (err) => {
error = err;
});
this.on("readable", onreadable);
this.on("close", onclose);
return {
[asyncIterator]() {
return this;
},
next() {
return new Promise(function(resolve, reject) {
promiseResolve = resolve;
promiseReject = reject;
const data = stream.read();
if (data !== null) ondata(data);
else if ((stream._duplexState & DESTROYED) !== 0) ondata(null);
});
},
return() {
return destroy(null);
},
throw(err) {
return destroy(err);
}
};
function onreadable() {
if (promiseResolve !== null) ondata(stream.read());
}
function onclose() {
if (promiseResolve !== null) ondata(null);
}
function ondata(data) {
if (promiseReject === null) return;
if (error) promiseReject(error);
else if (data === null && (stream._duplexState & READ_DONE) === 0)
promiseReject(STREAM_DESTROYED);
else promiseResolve({ value: data, done: data === null });
promiseReject = promiseResolve = null;
}
function destroy(err) {
stream.destroy(err);
return new Promise((resolve, reject) => {
if (stream._duplexState & DESTROYED) return resolve({ value: void 0, done: true });
stream.once("close", function() {
if (err) reject(err);
else resolve({ value: void 0, done: true });
});
});
}
}
};
var Writable = class extends Stream {
constructor(opts) {
super(opts);
this._duplexState |= OPENING | READ_DONE;
this._writableState = new WritableState(this, opts);
if (opts) {
if (opts.writev) this._writev = opts.writev;
if (opts.write) this._write = opts.write;
if (opts.final) this._final = opts.final;
if (opts.eagerOpen) this._writableState.updateNextTick();
}
}
cork() {
this._duplexState |= WRITE_CORKED;
}
uncork() {
this._duplexState &= WRITE_NOT_CORKED;
this._writableState.updateNextTick();
}
_writev(batch, cb) {
cb(null);
}
_write(data, cb) {
this._writableState.autoBatch(data, cb);
}
_final(cb) {
cb(null);
}
static isBackpressured(ws) {
return (ws._duplexState & WRITE_BACKPRESSURE_STATUS) !== 0;
}
static drained(ws) {
if (ws.destroyed) return Promise.resolve(false);
const state = ws._writableState;
const pending = isWritev(ws) ? Math.min(1, state.queue.length) : state.queue.length;
const writes = pending + (ws._duplexState & WRITE_WRITING ? 1 : 0);
if (writes === 0) return Promise.resolve(true);
if (state.drains === null) state.drains = [];
return new Promise((resolve) => {
state.drains.push({ writes, resolve });
});
}
write(data) {
this._writableState.updateNextTick();
return this._writableState.push(data);
}
end(data) {
this._writableState.updateNextTick();
this._writableState.end(data);
return this;
}
};
var Duplex = class extends Readable {
// and Writable
constructor(opts) {
super(opts);
this._duplexState = OPENING | this._duplexState & READ_READ_AHEAD;
this._writableState = new WritableState(this, opts);
if (opts) {
if (opts.writev) this._writev = opts.writev;
if (opts.write) this._write = opts.write;
if (opts.final) this._final = opts.final;
}
}
cork() {
this._duplexState |= WRITE_CORKED;
}
uncork() {
this._duplexState &= WRITE_NOT_CORKED;
this._writableState.updateNextTick();
}
_writev(batch, cb) {
cb(null);
}
_write(data, cb) {
this._writableState.autoBatch(data, cb);
}
_final(cb) {
cb(null);
}
write(data) {
this._writableState.updateNextTick();
return this._writableState.push(data);
}
end(data) {
this._writableState.updateNextTick();
this._writableState.end(data);
return this;
}
};
var Transform = class extends Duplex {
constructor(opts) {
super(opts);
this._transformState = new TransformState(this);
if (opts) {
if (opts.transform) this._transform = opts.transform;
if (opts.flush) this._flush = opts.flush;
}
}
_write(data, cb) {
if (this._readableState.buffered >= this._readableState.highWaterMark) {
this._transformState.data = data;
} else {
this._transform(data, this._transformState.afterTransform);
}
}
_read(cb) {
if (this._transformState.data !== null) {
const data = this._transformState.data;
this._transformState.data = null;
cb(null);
this._transform(data, this._transformState.afterTransform);
} else {
cb(null);
}
}
destroy(err) {
super.destroy(err);
if (this._transformState.data !== null) {
this._transformState.data = null;
this._transformState.afterTransform();
}
}
_transform(data, cb) {
cb(null, data);
}
_flush(cb) {
cb(null);
}
_final(cb) {
this._transformState.afterFinal = cb;
this._flush(transformAfterFlush.bind(this));
}
};
var PassThrough = class extends Transform {
};
function transformAfterFlush(err, data) {
const cb = this._transformState.afterFinal;
if (err) return cb(err);
if (data !== null && data !== void 0) this.push(data);
this.push(null);
cb(null);
}
function pipelinePromise(...streams) {
return new Promise((resolve, reject) => {
return pipeline(...streams, (err) => {
if (err) return reject(err);
resolve();
});
});
}
function pipeline(stream, ...streams) {
const all = Array.isArray(stream) ? [...stream, ...streams] : [stream, ...streams];
const done = all.length && typeof all[all.length - 1] === "function" ? all.pop() : null;
if (all.length < 2) throw new Error("Pipeline requires at least 2 streams");
let src = all[0];
let dest = null;
let error = null;
for (let i = 1; i < all.length; i++) {
dest = all[i];
if (isStreamx(src)) {
src.pipe(dest, onerror);
} else {
errorHandle(src, true, i > 1, onerror);
src.pipe(dest);
}
src = dest;
}
if (done) {
let fin = false;
const autoDestroy = isStreamx(dest) || !!(dest._writableState && dest._writableState.autoDestroy);
dest.on("error", (err) => {
if (error === null) error = err;
});
dest.on("finish", () => {
fin = true;
if (!autoDestroy) done(error);
});
if (autoDestroy) {
dest.on("close", () => done(error || (fin ? null : PREMATURE_CLOSE)));
}
}
return dest;
function errorHandle(s, rd, wr, onerror2) {
s.on("error", onerror2);
s.on("close", onclose);
function onclose() {
if (rd && s._readableState && !s._readableState.ended) return onerror2(PREMATURE_CLOSE);
if (wr && s._writableState && !s._writableState.ended) return onerror2(PREMATURE_CLOSE);
}
}
function onerror(err) {
if (!err || error) return;
error = err;
for (const s of all) {
s.destroy(err);
}
}
}
function echo(s) {
return s;
}
function isStream(stream) {
return !!stream._readableState || !!stream._writableState;
}
function isStreamx(stream) {
return typeof stream._duplexState === "number" && isStream(stream);
}
function isEnding(stream) {
return !!stream._readableState && stream._readableState.ending;
}
function isEnded(stream) {
return !!stream._readableState && stream._readableState.ended;
}
function isFinishing(stream) {
return !!stream._writableState && stream._writableState.ending;
}
function isFinished(stream) {
return !!stream._writableState && stream._writableState.ended;
}
function getStreamError(stream, opts = {}) {
const err = stream._readableState && stream._readableState.error || stream._writableState && stream._writableState.error;
return !opts.all && err === STREAM_DESTROYED ? null : err;
}
function isReadStreamx(stream) {
return isStreamx(stream) && stream.readable;
}
function isDisturbed(stream) {
return (stream._duplexState & OPENING) !== OPENING || (stream._duplexState & DESTROYING) === DESTROYING || (stream._duplexState & ACTIVE_OR_TICKING) !== 0;
}
function isTypedArray(data) {
return typeof data === "object" && data !== null && typeof data.byteLength === "number";
}
function defaultByteLength(data) {
return isTypedArray(data) ? data.byteLength : 1024;
}
function noop() {
}
function abort() {
this.destroy(new Error("Stream aborted."));
}
function isWritev(s) {
return s._writev !== Writable.prototype._writev && s._writev !== Duplex.prototype._writev;
}
module2.exports = {
pipeline,
pipelinePromise,
isStream,
isStreamx,
isEnding,
isEnded,
isFinishing,
isFinished,
isDisturbed,
getStreamError,
Stream,
Writable,
Readable,
Duplex,
Transform,
// Export PassThrough for compatibility with Node.js core's stream module
PassThrough
};
}
});
// node_modules/hyperdb/lib/stream.js
var require_stream = __commonJS({
"node_modules/hyperdb/lib/stream.js"(exports2, module2) {
var { Readable, isEnded, getStreamError } = require_streamx();
var b4a4 = require_b4a();
module2.exports = class IndexStream extends Readable {
constructor(db, range, {
index = null,
collection = index.collection,
reverse = false,
limit = -1,
overlay = [],
checkout = 0
}) {
super();
this.versions = db.versions;
this.engine = db.engine;
this.snapshot = db.engineSnapshot;
this.activeRequests = db.activeRequests;
this.traceable = db.traceable;
this.collection = collection;
this.index = index;
this.stream = this.snapshot.createReadStream(range, {
reverse,
limit,
checkout,
activeRequests: this.activeRequests
});
this.streamClosed = false;
this.overlay = overlay;
this.overlayIndex = 0;
this.continueDestroy = null;
this.limit = limit;
this.reverse = reverse;
this.mapping = false;
this.ending = false;
this.checkout = checkout;
this.snapshot.ref();
}
_open(cb) {
const destroy = this.destroy.bind(this);
const drain = this._drain.bind(this);
const onclose = this._onclose.bind(this);
this.stream.on("readable", drain);
this.stream.on("end", drain);
this.stream.on("error", destroy);
this.stream.on("close", onclose);
cb(null);
}
_onclose() {
this.streamClosed = true;
if (isEnded(this.stream) === false) this.destroy();
this._continueDestroyMaybe();
}
_continueDestroyMaybe() {
if (this.mapping === true) return;
if (this.streamClosed === false) return;
if (this.continueDestroy === null) return;
const cb = this.continueDestroy;
this.continueDestroy = null;
this.snapshot.unref();
cb(null);
}
_push(value) {
if (value === null) return;
if (this.limit > 0) this.limit--;
this.push(
this.engine.finalize(
this.collection,
this.versions,
this.checkout,
this.traceable,
value[0],
value[1]
)
);
}
_process(batch, ended) {
for (let i = 0; i < batch.length && this.limit !== 0; i++) {
const data = batch[i];
while (this.limit !== 0) {
if (this.overlayIndex >= this.overlay.length) {
this._push(data.value);
break;
}
const cmp = b4a4.compare(data.key, this.overlay[this.overlayIndex].key);
if (this.reverse === true ? cmp > 0 : cmp < 0) {
this._push(data.value);
break;
}
this._push(this.overlay[this.overlayIndex++].value);
if (cmp === 0) break;
}
}
if (ended === true) {
while (this.overlayIndex < this.overlay.length && this.limit !== 0) {
this._push(this.overlay[this.overlayIndex++].value);
}
this.push(null);
this.ending = true;
}
}
async _processAsap(promises, ended) {
for (let i = 1; i < promises.length; i++) promises[i].catch(noop);
for (let i = 0; i < promises.length; i++) {
const batch = [await promises[i]];
if (this.destroying === true) return;
this._process(batch, i === promises.length - 1 && ended);
}
}
async _mapAndProcess() {
this.mapping = true;
while (!Readable.isBackpressured(this) && this.destroying === false) {
const entries = fullyDrain(this.stream);
const promises = entries.length === 0 ? entries : this.snapshot.getIndirectRange(
this.index.reconstruct,
entries,
this.checkout,
this.activeRequests
);
const ended = isEnded(this.stream);
if (promises.length === 0 && ended === false) break;
try {
if (this.engine.asap === true && promises.length > 1) {
await this._processAsap(promises, ended);
} else {
const batch = await Promise.all(promises);
if (this.destroying === false) this._process(batch, ended);
}
} catch (err) {
await Promise.allSettled(promises);
this.destroy(err);
}
}
this.mapping = false;
this._continueDestroyMaybe();
}
_drain() {
if (Readable.isBackpressured(this)) return;
if (this.index === null) {
this._process(fullyDrainMapped(this.stream), isEnded(this.stream));
} else if (this.mapping === false) {
this._mapAndProcess();
}
}
_read(cb) {
this._drain();
cb(null);
}
_predestroy() {
this.stream.destroy();
}
_destroy(cb) {
this.stream.destroy();
this.continueDestroy = cb;
this._continueDestroyMaybe();
}
one() {
const stream = this;
let last = null;
return new Promise(function(resolve, reject) {
stream.on("error", noop);
stream.on("readable", onreadable);
stream.on("close", onclose);
function onreadable() {
while (true) {
const data = stream.read();
if (data === null) return;
last = data;
}
}
function onclose() {
if (isEnded(stream)) resolve(last);
else reject(getStreamError(stream, { all: true }));
}
});
}
async toArray() {
const stream = this;
const list = [];
return new Promise(function(resolve, reject) {
stream.on("error", noop);
stream.on("readable", onreadable);
stream.on("close", onclose);
function onreadable() {
while (true) {
const data = stream.read();
if (data === null) return;
list.push(data);
}
}
function onclose() {
if (isEnded(stream)) resolve(list);
else reject(getStreamError(stream, { all: true }));
}
});
}
};
function fullyDrainMapped(stream) {
const batch = [];
while (true) {
const data = stream.read();
if (data === null) return batch;
batch.push({ key: data.key, value: [data.key, data.value] });
}
}
function fullyDrain(stream) {
const batch = [];
while (true) {
const data = stream.read();
if (data === null) return batch;
batch.push(data);
}
}
function noop() {
}
}
});
// node_modules/hyperdb/lib/definition.js
var require_definition = __commonJS({
"node_modules/hyperdb/lib/definition.js"(exports2) {
exports2.isDefinition = isDefinition;
exports2.compat = makeCompat;
function makeCompat(definition) {
if (definition.versions) return definition;
for (const c4 of definition.collections) {
if (typeof c4.version === "number") continue;
const { encodeValue } = c4;
c4.encodeValue = function(schemaVersion, collectionVersion, record) {
return encodeValue(schemaVersion, record);
};
c4.version = 0;
c4.decodedVersion = 0;
}
for (const i of definition.indexes) {
if (typeof i.version === "number") continue;
i.version = 0;
}
return {
versions: { schema: definition.version, db: 0 },
collections: definition.collections,
indexes: definition.indexes,
resolveCollection: definition.resolveCollection,
resolveIndex: definition.resolveIndex
};
}
function isDefinition(definition) {
return !!(definition && typeof definition.resolveCollection === "function");
}
}
});
// node_modules/scope-lock/index.js
var require_scope_lock = __commonJS({
"node_modules/scope-lock/index.js"(exports2, module2) {
var tmpResolve = null;
module2.exports = class ScopeLock {
constructor({ debounce = false } = {}) {
this.debounce = debounce;
this.waiting = [];
this.locked = false;
this.skip = 0;
this.destroyed = false;
}
flush() {
if (this.locked === false && this.waiting.length === 0) return Promise.resolve(this.destroyed === false);
const promise = new Promise(setTmpResolve);
const resolve = tmpResolve;
tmpResolve = null;
this.waiting.push({ lock: false, resolve });
return promise;
}
destroy() {
this.destroyed = true;
}
lock() {
const promise = new Promise(setTmpResolve);
const resolve = tmpResolve;
tmpResolve = null;
if (this.locked === true) {
this.waiting.push({ lock: true, resolve });
return promise;
}
if (this.destroyed === true) {
resolve(false);
return promise;
}
this.locked = true;
resolve(true);
return promise;
}
unlock() {
if (this.destroyed === true) {
for (let i = 0; i < this.waiting.length; i++) {
this.waiting[i].resolve(false);
}
this.waiting = [];
this.skip = 0;
this.locked = false;
return;
}
if (this.skip !== 0) {
for (let i = 0; i < this.skip; i++) {
const { lock, resolve: resolve2 } = this.waiting[i];
resolve2(lock === false);
}
this.waiting = this.waiting.slice(this.skip);
this.skip = 0;
}
while (this.waiting.length > 0 && this.waiting[0].lock === false) {
this.waiting.shift().resolve(true);
}
if (this.waiting.length === 0) {
this.locked = false;
return;
}
const { resolve } = this.waiting.shift();
if (this.debounce === true) this.skip = this.waiting.length;
resolve(true);
}
};
function setTmpResolve(resolve) {
tmpResolve = resolve;
}
}
});
// node_modules/hyperdb/lib/sessions.js
var require_sessions = __commonJS({
"node_modules/hyperdb/lib/sessions.js"(exports2, module2) {
module2.exports = class SessionTracker {
constructor() {
this.sessions = [];
}
get size() {
return this.sessions.length;
}
has(s) {
return s.index < this.sessions.length && this.sessions[s.index] === s;
}
add(s) {
if (this.has(s)) return;
s.index = this.sessions.push(s) - 1;
}
remove(s) {
if (!this.has(s)) return;
const head = this.sessions.pop();
if (head === s) return;
this.sessions[head.index = s.index] = head;
}
close(skip) {
const closing = [];
for (let i = this.sessions.length - 1; i >= 0; i--) {
const s = this.sessions[i];
if (s === skip) continue;
closing.push(s.close());
}
return Promise.all(closing);
}
};
}
});
// node_modules/hyperdb/lib/engine/rocks.js
var require_rocks = __commonJS({
"node_modules/hyperdb/lib/engine/rocks.js"(exports2, module2) {
var RocksDB = require("rocksdb-native");
var ScopeLock = require_scope_lock();
var Sessions = require_sessions();
var RocksSnapshot = class {
constructor(snap, clock) {
this.clock = clock;
this.corks = 0;
this.refs = 1;
this.snapshot = snap;
this.opened = true;
this.batch = null;
this.batches = [];
}
ready() {
return this.snapshot.ready();
}
ref() {
this.refs++;
return this;
}
unref() {
if (--this.refs === 0) {
this.snapshot.close().catch(noop);
for (const b of this.batches) b.destroy();
}
}
cork() {
this.corks++;
if (this.batch === null) this.batch = this.snapshot.read();
}
uncork() {
if (--this.corks !== 0) return;
if (this.batch !== null) this._flushBackground(this.batch);
this.batch = null;
}
// checkout, reqs is just here for completeness, not supported in rocks
getIndirectRange(reconstruct, entries, checkout, reqs) {
if (this.snapshot._state.closing) return rejectAll(entries);
const read = this.batches.length > 0 ? this.batches.pop() : this.snapshot.read();
const promises = new Array(entries.length);
for (let i = 0; i < promises.length; i++) {
const { key, value } = entries[i];
promises[i] = getWrapped(read, key, reconstruct(key, value));
}
this._flushBackground(read);
return promises;
}
// checkout is just here for completeness, not supported in rocks
getBatch(keys, checkout, reqs) {
const read = this.batches.length > 0 ? this.batches.pop() : this.snapshot.read();
const promises = new Array(keys.length);
for (let i = 0; i < promises.length; i++) {
promises[i] = read.get(keys[i]);
}
this._flushBackground(read);
return Promise.all(promises);
}
// checkout is just here for completeness, not supported in rocks
get(key, checkout, reqs) {
return this.batch === null ? this.snapshot.get(key) : this.batch.get(key);
}
createReadStream(range, options) {
return this.snapshot.iterator({ ...range, ...options });
}
async _flushBackground(batch) {
try {
await batch.flush();
this.batches.push(batch);
} catch (err) {
batch.destroy();
}
}
};
module2.exports = class RocksEngine {
constructor(storage, options = {}) {
this.asap = false;
this.clock = 0;
this.sessions = new Sessions();
this.trace = options.trace || null;
this.core = null;
this.db = typeof storage === "object" ? storage : new RocksDB(storage, options);
this.db.ready().catch(noop);
this.write = null;
this.tx = null;
this.lock = new ScopeLock();
}
get closed() {
return this.db.closed;
}
enter() {
return this.lock.lock();
}
exit() {
this.tx = null;
this.lock.unlock();
}
ready() {
return this.db.ready();
}
close() {
if (this.write !== null) this.write.destroy();
return this.db.close();
}
finalize(collection, versions, checkout, tracing, key, value) {
if (value === null) return null;
const reconstructed = collection.reconstruct(versions.schema, key, value);
if (this.trace && tracing) this.trace(collection.name, reconstructed, checkout);
return reconstructed;
}
changes() {
throw new Error("Not supported in Rocks engine");
}
snapshot() {
return new RocksSnapshot(this.db.snapshot(), this.clock);
}
outdated(snap) {
return snap === null || snap.clock !== this.clock;
}
async commit(updates) {
this.clock++;
if (this.write === null) this.write = this.db.write();
const entries = updates.batch();
for (let i = 0; i < entries.length; i++) {
const [key, value] = entries[i];
if (value !== null) this.write.tryPut(key, value);
else this.write.tryDelete(key);
}
await this.write.flush();
}
clearRequests(reqs) {
}
};
async function getWrapped(read, key, value) {
return { key, value: [value, await read.get(value)] };
}
function noop() {
}
function rejectAll(entries) {
const promises = new Array(entries.length);
for (let i = 0; i < entries.length; i++) {
promises[i] = Promise.reject(new Error("Database is closed"));
}
return promises;
}
}
});
// node_modules/codecs/index.js
var require_codecs = __commonJS({
"node_modules/codecs/index.js"(exports2, module2) {
var b4a4 = require_b4a();
module2.exports = codecs;
codecs.ascii = createString("ascii");
codecs.utf8 = createString("utf-8");
codecs.hex = createString("hex");
codecs.base64 = createString("base64");
codecs.ucs2 = createString("ucs2");
codecs.utf16le = createString("utf16le");
codecs.ndjson = createJSON(true);
codecs.json = createJSON(false);
codecs.binary = {
name: "binary",
encode: function encodeBinary(obj) {
return typeof obj === "string" ? b4a4.from(obj, "utf-8") : b4a4.toBuffer(obj);
},
decode: function decodeBinary(buf) {
return b4a4.toBuffer(buf);
}
};
function isCompactEncoding(c4) {
return !!(c4.encode && c4.decode && c4.preencode);
}
function fromCompactEncoding(c4) {
return {
name: "compact-encoding",
encode: function encodeWithCompact(value) {
const state = { start: 0, end: 0, buffer: null, cache: null };
c4.preencode(state, value);
state.buffer = b4a4.allocUnsafe(state.end);
c4.encode(state, value);
return state.buffer;
},
decode: function decodeWithCompact(buffer) {
return c4.decode({ start: 0, end: buffer.byteLength, buffer, cache: null });
}
};
}
function codecs(fmt, fallback) {
if (typeof fmt === "object" && fmt) {
return isCompactEncoding(fmt) ? fromCompactEncoding(fmt) : fmt;
}
switch (fmt) {
case "ndjson":
return codecs.ndjson;
case "json":
return codecs.json;
case "ascii":
return codecs.ascii;
case "utf-8":
case "utf8":
return codecs.utf8;
case "hex":
return codecs.hex;
case "base64":
return codecs.base64;
case "ucs-2":
case "ucs2":
return codecs.ucs2;
case "utf16-le":
case "utf16le":
return codecs.utf16le;
}
return fallback !== void 0 ? fallback : codecs.binary;
}
function createJSON(newline) {
return {
name: newline ? "ndjson" : "json",
encode: newline ? encodeNDJSON : encodeJSON,
decode: function decodeJSON(buf) {
return JSON.parse(b4a4.toString(buf));
}
};
function encodeJSON(val) {
return b4a4.from(JSON.stringify(val));
}
function encodeNDJSON(val) {
return b4a4.from(JSON.stringify(val) + "\n");
}
}
function createString(type) {
return {
name: type,
encode: function encodeString(val) {
if (typeof val !== "string") val = val.toString();
return b4a4.from(val, type);
},
decode: function decodeString(buf) {
return b4a4.toString(buf, type);
}
};
}
}
});
// node_modules/queue-tick/queue-microtask.js
var require_queue_microtask = __commonJS({
"node_modules/queue-tick/queue-microtask.js"(exports2, module2) {
module2.exports = typeof queueMicrotask === "function" ? queueMicrotask : (fn) => Promise.resolve().then(fn);
}
});
// node_modules/queue-tick/process-next-tick.js
var require_process_next_tick = __commonJS({
"node_modules/queue-tick/process-next-tick.js"(exports2, module2) {
module2.exports = typeof process !== "undefined" && typeof process.nextTick === "function" ? process.nextTick.bind(process) : require_queue_microtask();
}
});
// node_modules/mutexify/index.js
var require_mutexify = __commonJS({
"node_modules/mutexify/index.js"(exports2, module2) {
var queueTick = require_process_next_tick();
var mutexify = function() {
var queue = [];
var used = null;
var call = function() {
used(release);
};
var acquire = function(fn) {
if (used) return queue.push(fn);
used = fn;
acquire.locked = true;
queueTick(call);
return 0;
};
acquire.locked = false;
var release = function(fn, err, value) {
used = null;
acquire.locked = false;
if (queue.length) acquire(queue.shift());
if (fn) fn(err, value);
};
return acquire;
};
module2.exports = mutexify;
}
});
// node_modules/mutexify/promise.js
var require_promise = __commonJS({
"node_modules/mutexify/promise.js"(exports2, module2) {
var mutexify = require_mutexify();
var mutexifyPromise = function() {
var lock = mutexify();
var acquire = function() {
return new Promise(lock);
};
Object.defineProperty(acquire, "locked", {
get: function() {
return lock.locked;
},
enumerable: true
});
return acquire;
};
module2.exports = mutexifyPromise;
}
});
// node_modules/safety-catch/index.js
var require_safety_catch = __commonJS({
"node_modules/safety-catch/index.js"(exports2, module2) {
module2.exports = safetyCatch;
function isActuallyUncaught(err) {
if (!err) return false;
return err instanceof TypeError || err instanceof SyntaxError || err instanceof ReferenceError || err instanceof EvalError || err instanceof RangeError || err instanceof URIError || err.code === "ERR_ASSERTION" || err.name === "AssertionError";
}
function throwErrorNT(err) {
queueMicrotask(() => {
throw err;
});
}
function safetyCatch(err) {
if (isActuallyUncaught(err)) {
throwErrorNT(err);
throw err;
}
}
}
});
// node_modules/ready-resource/index.js
var require_ready_resource = __commonJS({
"node_modules/ready-resource/index.js"(exports2, module2) {
var EventEmitter = require_bare_events();
module2.exports = class ReadyResource extends EventEmitter {
constructor() {
super();
this.opening = null;
this.closing = null;
this.opened = false;
this.closed = false;
}
ready() {
if (this.opening !== null) return this.opening;
this.opening = open(this);
return this.opening;
}
close() {
if (this.closing !== null) return this.closing;
this.closing = close(this);
return this.closing;
}
async _open() {
}
async _close() {
}
};
async function open(self) {
if (self.closing !== null) return;
try {
await self._open();
} catch (err) {
self.close();
throw err;
}
self.opened = true;
self.emit("ready");
}
async function close(self) {
try {
if (self.opened === false && self.opening !== null) await self.opening;
} catch {
}
if (self.opened === true || self.opening === null) await self._close();
self.closed = true;
self.emit("close");
}
}
});
// node_modules/debounceify/index.js
var require_debounceify = __commonJS({
"node_modules/debounceify/index.js"(exports2, module2) {
module2.exports = function debounce(worker, context = null) {
debounced.running = null;
return debounced;
async function debounced() {
if (debounced.running !== null) {
try {
await debounced.running;
} catch (_) {
}
}
if (debounced.running !== null) return debounced.running;
debounced.running = worker.call(context);
try {
return await debounced.running;
} finally {
debounced.running = null;
}
}
};
}
});
// node_modules/rache/index.js
var require_rache = __commonJS({
"node_modules/rache/index.js"(exports2, module2) {
var CacheEntry = class {
constructor(key, index, map) {
this.key = key;
this.index = index;
this.map = map;
}
};
var CacheValue = class {
constructor(entry, value) {
this.entry = entry;
this.value = value;
}
};
var Rache = class _Rache {
constructor({ maxSize = 65536, parent = null } = {}) {
this.maxSize = parent?.maxSize || maxSize;
this._array = parent?._array || [];
this._map = /* @__PURE__ */ new Map();
}
static from(cache) {
return cache ? new this({ parent: cache }) : new this();
}
get globalSize() {
return this._array.length;
}
get size() {
return this._map.size;
}
sub() {
return new _Rache({ parent: this });
}
set(key, value) {
const existing = this._map.get(key);
if (existing !== void 0) {
existing.value = value;
return;
}
if (this._array.length >= this.maxSize) this._gc();
const entry = new CacheEntry(key, this._array.length, this._map);
this._array.push(entry);
const cacheValue = new CacheValue(entry, value);
this._map.set(key, cacheValue);
}
delete(key) {
const existing = this._map.get(key);
if (existing === void 0) return false;
this._delete(existing.entry.index);
return true;
}
get(key) {
const existing = this._map.get(key);
return existing === void 0 ? void 0 : existing.value;
}
*[Symbol.iterator]() {
for (const [key, { value }] of this._map) {
yield [key, value];
}
}
keys() {
return this._map.keys();
}
*values() {
for (const { value } of this._map.values()) {
yield value;
}
}
clear() {
this._map.clear();
this._map = /* @__PURE__ */ new Map();
}
destroy() {
this._map = null;
this._array = null;
}
_gc() {
this._delete(Math.floor(Math.random() * this._array.length));
}
_delete(index) {
if (index >= this._array.length) throw new Error("Cannot delete unused index (logic bug?)");
const head = this._array.pop();
let removed = head;
if (index < this._array.length) {
removed = this._array[index];
head.index = index;
this._array[index] = head;
}
removed.map.delete(removed.key);
}
};
module2.exports = Rache;
}
});
// node_modules/resolve-reject-promise/index.js
var require_resolve_reject_promise = __commonJS({
"node_modules/resolve-reject-promise/index.js"(exports2, module2) {
var tmpResolve = null;
var tmpReject = null;
if (Promise.withResolvers) {
module2.exports = Promise.withResolvers.bind(Promise);
} else {
module2.exports = function resolveRejectPromise() {
const promise = new Promise(setTmp);
const result = { promise, resolve: tmpResolve, reject: tmpReject };
tmpResolve = tmpReject = null;
return result;
};
}
function setTmp(resolve, reject) {
tmpResolve = resolve;
tmpReject = reject;
}
}
});
// node_modules/unslab/index.js
var require_unslab = __commonJS({
"node_modules/unslab/index.js"(exports2, module2) {
var b4a4 = require_b4a();
unslab.all = all;
unslab.is = is;
module2.exports = unslab;
function unslab(buf) {
if (buf === null || buf.buffer.byteLength === buf.byteLength) return buf;
const copy = b4a4.allocUnsafeSlow(buf.byteLength);
copy.set(buf, 0);
return copy;
}
function is(buf) {
return buf.buffer.byteLength !== buf.byteLength;
}
function all(list) {
let size = 0;
for (let i = 0; i < list.length; i++) {
const buf = list[i];
size += buf === null || buf.buffer.byteLength === buf.byteLength ? 0 : buf.byteLength;
}
const copy = b4a4.allocUnsafeSlow(size);
const result = new Array(list.length);
let offset = 0;
for (let i = 0; i < list.length; i++) {
let buf = list[i];
if (buf !== null && buf.buffer.byteLength !== buf.byteLength) {
copy.set(buf, offset);
buf = copy.subarray(offset, offset += buf.byteLength);
}
result[i] = buf;
}
return result;
}
}
});
// node_modules/hyperbee/iterators/range.js
var require_range = __commonJS({
"node_modules/hyperbee/iterators/range.js"(exports2, module2) {
var b4a4 = require_b4a();
module2.exports = class RangeIterator {
constructor(batch, encoding, opts = {}) {
this.batch = batch;
this.stack = [];
this.opened = false;
this.encoding = encoding || batch.encoding;
this._limit = typeof opts.limit === "number" ? opts.limit : -1;
this._gIncl = !opts.gt;
this._gKey = opts.gt || opts.gte || null;
this._lIncl = !opts.lt;
this._lKey = opts.lt || opts.lte || null;
this._reverse = !!opts.reverse;
this._version = 0;
this._checkpoint = opts.checkpoint && opts.checkpoint.length ? opts.checkpoint : null;
this._nexting = false;
this._closed = false;
}
snapshot(version3 = this.batch.version) {
const checkpoint = [];
for (const s of this.stack) {
let { node, i } = s;
if (this._nexting && s === this.stack[this.stack.length - 1]) {
i = this._reverse ? i + 1 : i - 1;
}
if (!node.block) continue;
if (i < 0) continue;
checkpoint.push(node.block.seq, node.offset, i);
}
return {
version: version3,
gte: this._gIncl ? this._gKey : null,
gt: this._gIncl ? null : this._gKey,
lte: this._lIncl ? this._lKey : null,
lt: this._lIncl ? null : this._lKey,
limit: this._limit,
reverse: this._reverse,
ended: this.opened && !checkpoint.length,
checkpoint: this.opened ? checkpoint : []
};
}
async open() {
await this._open();
this.opened = true;
}
async _open() {
if (this._checkpoint) {
for (let j = 0; j < this._checkpoint.length; j += 3) {
const seq = this._checkpoint[j];
const offset = this._checkpoint[j + 1];
const i = this._checkpoint[j + 2];
this.stack.push({
node: (await this.batch.getBlock(seq)).getTreeNode(offset),
i
});
}
return;
}
this._nexting = true;
let node = await this.batch.getRoot(false);
if (!node) {
this._nexting = false;
return;
}
const incl = this._reverse ? this._lIncl : this._gIncl;
const start = this._reverse ? this._lKey : this._gKey;
if (!start) {
this.stack.push({ node, i: this._reverse ? node.keys.length << 1 : 0 });
this._nexting = false;
this._preloadQuery();
return;
}
while (true) {
const entry = { node, i: this._reverse ? node.keys.length << 1 : 0 };
let s = 0;
let e = node.keys.length;
let c4;
while (s < e) {
const mid = s + e >> 1;
c4 = b4a4.compare(start, await node.getKey(mid));
if (c4 === 0) {
if (incl) entry.i = mid * 2 + 1;
else entry.i = mid * 2 + (this._reverse ? 0 : 2);
this.stack.push(entry);
this._nexting = false;
this._preloadQuery();
return;
}
if (c4 < 0) e = mid;
else s = mid + 1;
}
const i = c4 < 0 ? e : s;
entry.i = 2 * i + (this._reverse ? -1 : 1);
if (entry.i >= 0 && entry.i <= node.keys.length << 1) this.stack.push(entry);
if (!node.children.length) {
this._nexting = false;
this._preloadQuery();
return;
}
node = await node.getChildNode(i);
}
}
_preloadQuery() {
const max = { nodes: 0, max: 2048 };
if (this._limit === -1 && !this._reverse && this.stack.length) {
for (const s of this.stack) {
const k = (s.i - (s.i & 1)) / 2;
this._preload(s.node, k + 1, this._lKey, max).catch(noop);
}
}
}
async _preload(node, i, end, max) {
for (; i < node.keys.length; i++) {
const key = node.keys[i];
const block = await this.batch.getBlock(key.seq);
if (this._closed) return;
const c4 = end ? b4a4.compare(block.key, end) : -1;
if (c4 >= 0 || max.nodes >= max.max || i >= node.children.length) return;
max.nodes++;
const next = await node.getChildNode(i);
if (this._closed) return;
this._preload(next, 0, end, max).catch(noop);
}
if (node.children.length && max.nodes < max.max) {
const next = await node.getChildNode(node.children.length - 1);
if (this._closed) return;
this._preload(next, 0, end, max).catch(noop);
}
}
async next() {
this._nexting = true;
const end = this._reverse ? this._gKey : this._lKey;
const incl = this._reverse ? this._gIncl : this._lIncl;
while (this.stack.length && (this._limit === -1 || this._limit > 0)) {
const top = this.stack[this.stack.length - 1];
const isKey = (top.i & 1) === 1;
const n = this._reverse ? top.i < 0 ? top.node.keys.length : top.i-- >> 1 : top.i++ >> 1;
if (!isKey) {
if (!top.node.children.length) continue;
const node = await top.node.getChildNode(n);
if (top.node.block.seq < this.batch.core.length) {
top.node.children[n].value = null;
}
this.stack.push({ i: this._reverse ? node.keys.length << 1 : 0, node });
continue;
}
if (n >= top.node.keys.length) {
this.stack.pop();
continue;
}
const key = top.node.keys[n];
const block = await this.batch.getBlock(key.seq);
if (end) {
const c4 = b4a4.compare(block.key, end);
if (c4 === 0 ? !incl : this._reverse ? c4 < 0 : c4 > 0) {
this._limit = 0;
break;
}
}
if (this._limit > 0) this._limit--;
this._nexting = false;
return block.final(this.encoding);
}
this._nexting = false;
return null;
}
close() {
this._closed = true;
return this.batch._closeSnapshot();
}
};
function noop() {
}
}
});
// node_modules/hyperbee/iterators/history.js
var require_history = __commonJS({
"node_modules/hyperbee/iterators/history.js"(exports2, module2) {
module2.exports = class HistoryIterator {
constructor(batch, opts = {}) {
this.batch = batch;
this.options = opts;
this.live = !!opts.live;
this.gte = 0;
this.lt = 0;
this.reverse = !!opts.reverse;
this.limit = typeof opts.limit === "number" ? opts.limit : -1;
this.encoding = opts.encoding || batch.encoding;
if (this.live && this.reverse) {
throw new Error("Cannot have both live and reverse enabled");
}
}
async open() {
await this.batch.getRoot(false);
this.gte = gte(this.options, this.batch.version);
this.lt = this.live ? Infinity : lt(this.options, this.batch.version);
}
async next() {
if (this.limit === 0) return null;
if (this.limit > 0) this.limit--;
if (this.gte >= this.lt) return null;
if (this.reverse) {
if (this.lt <= 1) return null;
return final(await this.batch.getBlock(--this.lt), this.encoding);
}
return final(await this.batch.getBlock(this.gte++), this.encoding);
}
close() {
return this.batch._closeSnapshot();
}
};
function final(node, encoding) {
const type = node.isDeletion() ? "del" : "put";
return { type, ...node.final(encoding) };
}
function gte(opts, version3) {
if (opts.gt) return (opts.gt < 0 ? opts.gt + version3 : opts.gt) + 1;
const gte2 = opts.gte || opts.since || 1;
return gte2 < 0 ? gte2 + version3 : gte2;
}
function lt(opts, version3) {
if (opts.lte === 0 || opts.lt === 0 || opts.end === 0) return 0;
if (opts.lte) return (opts.lte < 0 ? opts.lte + version3 : opts.lte) + 1;
const lt2 = opts.lt || opts.end || version3;
return lt2 < 0 ? lt2 + version3 : lt2;
}
}
});
// node_modules/hyperbee/iterators/diff.js
var require_diff = __commonJS({
"node_modules/hyperbee/iterators/diff.js"(exports2, module2) {
var b4a4 = require_b4a();
var SubTree = class {
constructor(node, parent) {
this.node = node;
this.parent = parent;
this.isKey = node.children.length === 0;
this.i = this.isKey ? 1 : 0;
this.n = 0;
const child = this.isKey ? null : this.node.children[0];
this.seq = child !== null ? child.seq : this.node.keys[0].seq;
this.offset = child !== null ? child.offset : 0;
}
next() {
this.i++;
this.isKey = (this.i & 1) === 1;
if (!this.isKey && !this.node.children.length) this.i++;
return this.update();
}
async bisect(key, incl) {
let s = 0;
let e = this.node.keys.length;
let c4;
while (s < e) {
const mid = s + e >> 1;
c4 = cmp(key, await this.node.getKey(mid));
if (c4 === 0) {
if (incl) this.i = mid * 2 + 1;
else this.i = mid * 2 + (this.node.children.length ? 2 : 3);
return true;
}
if (c4 < 0) e = mid;
else s = mid + 1;
}
const i = c4 < 0 ? e : s;
this.i = 2 * i + (this.node.children.length ? 0 : 1);
return this.node.children.length === 0;
}
update() {
this.isKey = (this.i & 1) === 1;
this.n = this.i >> 1;
if (this.n >= (this.isKey ? this.node.keys.length : this.node.children.length)) return false;
const child = this.isKey ? null : this.node.children[this.n];
this.seq = child !== null ? child.seq : this.node.keys[this.n].seq;
this.offset = child !== null ? child.offset : 0;
return true;
}
async key() {
return this.n < this.node.keys.length ? this.node.getKey(this.n) : this.parent && this.parent.key();
}
async compare(tree) {
const [a, b] = await Promise.all([this.key(), tree.key()]);
return cmp(a, b);
}
};
var TreeIterator = class {
constructor(batch, opts) {
this.batch = batch;
this.stack = [];
this.lt = opts.lt || opts.lte || null;
this.lte = !!opts.lte;
this.gt = opts.gt || opts.gte || null;
this.gte = !!opts.gte;
this.seeking = !!this.gt;
this.encoding = opts.encoding || batch.encoding;
}
async open() {
const node = await this.batch.getRoot(false);
if (!node || !node.keys.length) return;
const tree = new SubTree(node, null);
if (this.seeking && !await this._seek(tree)) return;
this.stack.push(tree);
}
async _seek(tree) {
const done = await tree.bisect(this.gt, this.gte);
const oob = !tree.update();
if (done || oob) {
this.seeking = false;
if (oob) return false;
}
return true;
}
peek() {
if (!this.stack.length) return null;
return this.stack[this.stack.length - 1];
}
skip() {
if (!this.stack.length) return;
if (!this.stack[this.stack.length - 1].next()) this.stack.pop();
}
async nextKey() {
let n = null;
while (this.stack.length && n === null) n = await this.next();
if (n === null) return null;
if (!this.lt) return n.final(this.encoding);
const c4 = cmp(n.key, this.lt);
if (this.lte ? c4 <= 0 : c4 < 0) return n.final(this.encoding);
this.stack = [];
return null;
}
async next() {
if (!this.stack.length) return null;
const top = this.stack[this.stack.length - 1];
const { isKey, n, seq } = top;
if (!top.next()) {
this.stack.pop();
}
if (isKey) {
this.seeking = false;
return this.batch.getBlock(seq);
}
const child = await top.node.getChildNode(n);
top.node.children[n] = null;
const tree = new SubTree(child, top);
if (this.seeking && !await this._seek(tree)) return null;
this.stack.push(tree);
return null;
}
close() {
return this.batch._closeSnapshot();
}
};
module2.exports = class DiffIterator {
constructor(left, right, opts = {}) {
this.left = new TreeIterator(left, opts);
this.right = new TreeIterator(right, opts);
this.limit = typeof opts.limit === "number" ? opts.limit : -1;
}
async open() {
await Promise.all([this.left.open(), this.right.open()]);
}
async next() {
if (this.limit === 0) return null;
const res = await this._next();
if (!res || res.left === null && res.right === null) return null;
this.limit--;
return res;
}
async _next() {
const a = this.left;
const b = this.right;
while (true) {
const [l, r] = await Promise.all([a.peek(), b.peek()]);
if (!l && !r) return null;
if (!l) return { left: null, right: await b.nextKey() };
if (!r) return { left: await a.nextKey(), right: null };
if (l.seq === r.seq && l.isKey === r.isKey && l.offset === r.offset) {
a.skip();
b.skip();
continue;
}
const c4 = await l.compare(r);
if (l.isKey && !r.isKey) {
await b.next();
continue;
}
if (!l.isKey && r.isKey) {
await a.next();
continue;
}
if (l.isKey && r.isKey) {
if (c4 === 0) return { left: await a.nextKey(), right: await b.nextKey() };
if (c4 < 0) return { left: await a.nextKey(), right: null };
return { left: null, right: await b.nextKey() };
}
if (c4 === 0) await Promise.all([a.next(), b.next()]);
else if (c4 < 0) await b.next();
else await a.next();
}
}
async close() {
await Promise.all([this.left.close(), this.right.close()]);
}
};
function cmp(a, b) {
if (!a) return b ? 1 : 0;
if (!b) return a ? -1 : 0;
return b4a4.compare(a, b);
}
}
});
// node_modules/hyperbee/iterators/local.js
var require_local = __commonJS({
"node_modules/hyperbee/iterators/local.js"(exports2, module2) {
module2.exports = class LocalBlocksIterator {
constructor(batch, opts = {}) {
this.batch = batch;
this.options = opts;
this.gte = 0;
this.lt = 0;
this.limit = typeof opts.limit === "number" ? opts.limit : -1;
}
async open() {
await this.batch.getRoot(false);
this.gte = gte(this.options, this.batch.version);
this.lt = lt(this.options, this.batch.version);
}
async next() {
if (this.limit === 0) return null;
if (this.limit > 0) this.limit--;
while (this.gte < this.lt) {
try {
return await this.batch.getBlock(this.gte++);
} catch {
continue;
}
}
return null;
}
close() {
return this.batch._closeSnapshot();
}
};
function gte(opts, version3) {
if (opts.gt) return (opts.gt < 0 ? opts.gt + version3 : opts.gt) + 1;
const gte2 = opts.gte || opts.since || 1;
return gte2 < 0 ? gte2 + version3 : gte2;
}
function lt(opts, version3) {
if (opts.lte === 0 || opts.lt === 0 || opts.end === 0) return 0;
if (opts.lte) return (opts.lte < 0 ? opts.lte + version3 : opts.lte) + 1;
const lt2 = opts.lt || opts.end || version3;
return lt2 < 0 ? lt2 + version3 : lt2;
}
}
});
// node_modules/varint/encode.js
var require_encode = __commonJS({
"node_modules/varint/encode.js"(exports2, module2) {
module2.exports = encode2;
var MSB = 128;
var REST = 127;
var MSBALL = ~REST;
var INT = Math.pow(2, 31);
function encode2(num, out, offset) {
out = out || [];
offset = offset || 0;
var oldOffset = offset;
while (num >= INT) {
out[offset++] = num & 255 | MSB;
num /= 128;
}
while (num & MSBALL) {
out[offset++] = num & 255 | MSB;
num >>>= 7;
}
out[offset] = num | 0;
encode2.bytes = offset - oldOffset + 1;
return out;
}
}
});
// node_modules/varint/decode.js
var require_decode = __commonJS({
"node_modules/varint/decode.js"(exports2, module2) {
module2.exports = read;
var MSB = 128;
var REST = 127;
function read(buf, offset) {
var res = 0, offset = offset || 0, shift = 0, counter = offset, b, l = buf.length;
do {
if (counter >= l) {
read.bytes = 0;
throw new RangeError("Could not decode varint");
}
b = buf[counter++];
res += shift < 28 ? (b & REST) << shift : (b & REST) * Math.pow(2, shift);
shift += 7;
} while (b >= MSB);
read.bytes = counter - offset;
return res;
}
}
});
// node_modules/varint/length.js
var require_length = __commonJS({
"node_modules/varint/length.js"(exports2, module2) {
var N1 = Math.pow(2, 7);
var N2 = Math.pow(2, 14);
var N3 = Math.pow(2, 21);
var N4 = Math.pow(2, 28);
var N5 = Math.pow(2, 35);
var N6 = Math.pow(2, 42);
var N7 = Math.pow(2, 49);
var N8 = Math.pow(2, 56);
var N9 = Math.pow(2, 63);
module2.exports = function(value) {
return value < N1 ? 1 : value < N2 ? 2 : value < N3 ? 3 : value < N4 ? 4 : value < N5 ? 5 : value < N6 ? 6 : value < N7 ? 7 : value < N8 ? 8 : value < N9 ? 9 : 10;
};
}
});
// node_modules/varint/index.js
var require_varint = __commonJS({
"node_modules/varint/index.js"(exports2, module2) {
module2.exports = {
encode: require_encode(),
decode: require_decode(),
encodingLength: require_length()
};
}
});
// node_modules/signed-varint/index.js
var require_signed_varint = __commonJS({
"node_modules/signed-varint/index.js"(exports2) {
var varint = require_varint();
exports2.encode = function encode2(v, b, o) {
v = v >= 0 ? v * 2 : v * -2 - 1;
var r = varint.encode(v, b, o);
encode2.bytes = varint.encode.bytes;
return r;
};
exports2.decode = function decode2(b, o) {
var v = varint.decode(b, o);
decode2.bytes = varint.decode.bytes;
return v & 1 ? (v + 1) / -2 : v / 2;
};
exports2.encodingLength = function(v) {
return varint.encodingLength(v >= 0 ? v * 2 : v * -2 - 1);
};
}
});
// node_modules/protocol-buffers-encodings/index.js
var require_protocol_buffers_encodings = __commonJS({
"node_modules/protocol-buffers-encodings/index.js"(exports2) {
var varint = require_varint();
var svarint = require_signed_varint();
var b4a4 = require_b4a();
exports2.make = encoder;
exports2.name = function(enc) {
var keys = Object.keys(exports2);
for (var i = 0; i < keys.length; i++) {
if (exports2[keys[i]] === enc) return keys[i];
}
return null;
};
exports2.skip = function(type, buffer, offset) {
switch (type) {
case 0:
varint.decode(buffer, offset);
return offset + varint.decode.bytes;
case 1:
return offset + 8;
case 2:
var len = varint.decode(buffer, offset);
return offset + varint.decode.bytes + len;
case 3:
case 4:
throw new Error("Groups are not supported");
case 5:
return offset + 4;
}
throw new Error("Unknown wire type: " + type);
};
exports2.bytes = encoder(
2,
function encode2(val, buffer, offset) {
var oldOffset = offset;
var len = bufferLength(val);
varint.encode(len, buffer, offset);
offset += varint.encode.bytes;
if (b4a4.isBuffer(val)) b4a4.copy(val, buffer, offset);
else b4a4.write(buffer, val, offset, len);
offset += len;
encode2.bytes = offset - oldOffset;
return buffer;
},
function decode2(buffer, offset) {
var oldOffset = offset;
var len = varint.decode(buffer, offset);
offset += varint.decode.bytes;
var val = buffer.subarray(offset, offset + len);
offset += val.length;
decode2.bytes = offset - oldOffset;
return val;
},
function encodingLength(val) {
var len = bufferLength(val);
return varint.encodingLength(len) + len;
}
);
exports2.string = encoder(
2,
function encode2(val, buffer, offset) {
var oldOffset = offset;
var len = b4a4.byteLength(val);
varint.encode(len, buffer, offset, "utf-8");
offset += varint.encode.bytes;
b4a4.write(buffer, val, offset, len);
offset += len;
encode2.bytes = offset - oldOffset;
return buffer;
},
function decode2(buffer, offset) {
var oldOffset = offset;
var len = varint.decode(buffer, offset);
offset += varint.decode.bytes;
var val = b4a4.toString(buffer, "utf-8", offset, offset + len);
offset += len;
decode2.bytes = offset - oldOffset;
return val;
},
function encodingLength(val) {
var len = b4a4.byteLength(val);
return varint.encodingLength(len) + len;
}
);
exports2.bool = encoder(
0,
function encode2(val, buffer, offset) {
buffer[offset] = val ? 1 : 0;
encode2.bytes = 1;
return buffer;
},
function decode2(buffer, offset) {
var bool = buffer[offset] > 0;
decode2.bytes = 1;
return bool;
},
function encodingLength() {
return 1;
}
);
exports2.int32 = encoder(
0,
function encode2(val, buffer, offset) {
varint.encode(val < 0 ? val + 4294967296 : val, buffer, offset);
encode2.bytes = varint.encode.bytes;
return buffer;
},
function decode2(buffer, offset) {
var val = varint.decode(buffer, offset);
decode2.bytes = varint.decode.bytes;
return val > 2147483647 ? val - 4294967296 : val;
},
function encodingLength(val) {
return varint.encodingLength(val < 0 ? val + 4294967296 : val);
}
);
exports2.int64 = encoder(
0,
function encode2(val, buffer, offset) {
if (val < 0) {
var last = offset + 9;
varint.encode(val * -1, buffer, offset);
offset += varint.encode.bytes - 1;
buffer[offset] = buffer[offset] | 128;
while (offset < last - 1) {
offset++;
buffer[offset] = 255;
}
buffer[last] = 1;
encode2.bytes = 10;
} else {
varint.encode(val, buffer, offset);
encode2.bytes = varint.encode.bytes;
}
return buffer;
},
function decode2(buffer, offset) {
var val = varint.decode(buffer, offset);
if (val >= Math.pow(2, 63)) {
var limit = 9;
while (buffer[offset + limit - 1] === 255) limit--;
limit = limit || 9;
var subset = b4a4.allocUnsafe(limit);
b4a4.copy(buffer, subset, 0, offset, offset + limit);
subset[limit - 1] = subset[limit - 1] & 127;
val = -1 * varint.decode(subset, 0);
decode2.bytes = 10;
} else {
decode2.bytes = varint.decode.bytes;
}
return val;
},
function encodingLength(val) {
return val < 0 ? 10 : varint.encodingLength(val);
}
);
exports2.sint32 = exports2.sint64 = encoder(
0,
svarint.encode,
svarint.decode,
svarint.encodingLength
);
exports2.uint32 = exports2.uint64 = exports2.enum = exports2.varint = encoder(
0,
varint.encode,
varint.decode,
varint.encodingLength
);
exports2.fixed64 = exports2.sfixed64 = encoder(
1,
function encode2(val, buffer, offset) {
b4a4.copy(val, buffer, offset);
encode2.bytes = 8;
return buffer;
},
function decode2(buffer, offset) {
var val = buffer.subarray(offset, offset + 8);
decode2.bytes = 8;
return val;
},
function encodingLength() {
return 8;
}
);
exports2.double = encoder(
1,
function encode2(val, buffer, offset) {
b4a4.writeDoubleLE(buffer, val, offset);
encode2.bytes = 8;
return buffer;
},
function decode2(buffer, offset) {
var val = b4a4.readDoubleLE(buffer, offset);
decode2.bytes = 8;
return val;
},
function encodingLength() {
return 8;
}
);
exports2.fixed32 = encoder(
5,
function encode2(val, buffer, offset) {
b4a4.writeUInt32LE(buffer, val, offset);
encode2.bytes = 4;
return buffer;
},
function decode2(buffer, offset) {
var val = b4a4.readUInt32LE(buffer, offset);
decode2.bytes = 4;
return val;
},
function encodingLength() {
return 4;
}
);
exports2.sfixed32 = encoder(
5,
function encode2(val, buffer, offset) {
b4a4.writeInt32LE(buffer, val, offset);
encode2.bytes = 4;
return buffer;
},
function decode2(buffer, offset) {
var val = b4a4.readInt32LE(buffer, offset);
decode2.bytes = 4;
return val;
},
function encodingLength() {
return 4;
}
);
exports2.float = encoder(
5,
function encode2(val, buffer, offset) {
b4a4.writeFloatLE(buffer, val, offset);
encode2.bytes = 4;
return buffer;
},
function decode2(buffer, offset) {
var val = b4a4.readFloatLE(buffer, offset);
decode2.bytes = 4;
return val;
},
function encodingLength() {
return 4;
}
);
function encoder(type, encode2, decode2, encodingLength) {
encode2.bytes = decode2.bytes = 0;
return {
type,
encode: encode2,
decode: decode2,
encodingLength
};
}
function bufferLength(val) {
return b4a4.isBuffer(val) ? val.length : b4a4.byteLength(val);
}
}
});
// node_modules/hyperbee/lib/messages.js
var require_messages = __commonJS({
"node_modules/hyperbee/lib/messages.js"(exports2) {
var encodings = require_protocol_buffers_encodings();
var b4a4 = require_b4a();
var varint = encodings.varint;
var skip = encodings.skip;
var YoloIndex = exports2.YoloIndex = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
};
var Header = exports2.Header = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
};
var Node = exports2.Node = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
};
var Extension = exports2.Extension = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
};
defineYoloIndex();
defineHeader();
defineNode();
defineExtension();
function defineYoloIndex() {
var Level = YoloIndex.Level = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
};
defineLevel();
function defineLevel() {
Level.encodingLength = encodingLength2;
Level.encode = encode3;
Level.decode = decode3;
function encodingLength2(obj) {
var length = 0;
if (defined(obj.keys)) {
var packedLen = 0;
for (var i = 0; i < obj.keys.length; i++) {
if (!defined(obj.keys[i])) continue;
var len = encodings.varint.encodingLength(obj.keys[i]);
packedLen += len;
}
if (packedLen) {
length += 1 + packedLen + varint.encodingLength(packedLen);
}
}
if (defined(obj.children)) {
var packedLen = 0;
for (var i = 0; i < obj.children.length; i++) {
if (!defined(obj.children[i])) continue;
var len = encodings.varint.encodingLength(obj.children[i]);
packedLen += len;
}
if (packedLen) {
length += 1 + packedLen + varint.encodingLength(packedLen);
}
}
return length;
}
function encode3(obj, buf, offset) {
if (!offset) offset = 0;
if (!buf) buf = b4a4.allocUnsafe(encodingLength2(obj));
var oldOffset = offset;
if (defined(obj.keys)) {
var packedLen = 0;
for (var i = 0; i < obj.keys.length; i++) {
if (!defined(obj.keys[i])) continue;
packedLen += encodings.varint.encodingLength(obj.keys[i]);
}
if (packedLen) {
buf[offset++] = 10;
varint.encode(packedLen, buf, offset);
offset += varint.encode.bytes;
}
for (var i = 0; i < obj.keys.length; i++) {
if (!defined(obj.keys[i])) continue;
encodings.varint.encode(obj.keys[i], buf, offset);
offset += encodings.varint.encode.bytes;
}
}
if (defined(obj.children)) {
var packedLen = 0;
for (var i = 0; i < obj.children.length; i++) {
if (!defined(obj.children[i])) continue;
packedLen += encodings.varint.encodingLength(obj.children[i]);
}
if (packedLen) {
buf[offset++] = 18;
varint.encode(packedLen, buf, offset);
offset += varint.encode.bytes;
}
for (var i = 0; i < obj.children.length; i++) {
if (!defined(obj.children[i])) continue;
encodings.varint.encode(obj.children[i], buf, offset);
offset += encodings.varint.encode.bytes;
}
}
encode3.bytes = offset - oldOffset;
return buf;
}
function decode3(buf, offset, end) {
if (!offset) offset = 0;
if (!end) end = buf.length;
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid");
var oldOffset = offset;
var obj = {
keys: [],
children: []
};
while (true) {
if (end <= offset) {
decode3.bytes = offset - oldOffset;
return obj;
}
var prefix = varint.decode(buf, offset);
offset += varint.decode.bytes;
var tag = prefix >> 3;
switch (tag) {
case 1:
var packedEnd = varint.decode(buf, offset);
offset += varint.decode.bytes;
packedEnd += offset;
while (offset < packedEnd) {
obj.keys.push(encodings.varint.decode(buf, offset));
offset += encodings.varint.decode.bytes;
}
break;
case 2:
var packedEnd = varint.decode(buf, offset);
offset += varint.decode.bytes;
packedEnd += offset;
while (offset < packedEnd) {
obj.children.push(encodings.varint.decode(buf, offset));
offset += encodings.varint.decode.bytes;
}
break;
default:
offset = skip(prefix & 7, buf, offset);
}
}
}
}
YoloIndex.encodingLength = encodingLength;
YoloIndex.encode = encode2;
YoloIndex.decode = decode2;
function encodingLength(obj) {
var length = 0;
if (defined(obj.levels)) {
for (var i = 0; i < obj.levels.length; i++) {
if (!defined(obj.levels[i])) continue;
var len = Level.encodingLength(obj.levels[i]);
length += varint.encodingLength(len);
length += 1 + len;
}
}
return length;
}
function encode2(obj, buf, offset) {
if (!offset) offset = 0;
if (!buf) buf = b4a4.allocUnsafe(encodingLength(obj));
var oldOffset = offset;
if (defined(obj.levels)) {
for (var i = 0; i < obj.levels.length; i++) {
if (!defined(obj.levels[i])) continue;
buf[offset++] = 10;
varint.encode(Level.encodingLength(obj.levels[i]), buf, offset);
offset += varint.encode.bytes;
Level.encode(obj.levels[i], buf, offset);
offset += Level.encode.bytes;
}
}
encode2.bytes = offset - oldOffset;
return buf;
}
function decode2(buf, offset, end) {
if (!offset) offset = 0;
if (!end) end = buf.length;
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid");
var oldOffset = offset;
var obj = {
levels: []
};
while (true) {
if (end <= offset) {
decode2.bytes = offset - oldOffset;
return obj;
}
var prefix = varint.decode(buf, offset);
offset += varint.decode.bytes;
var tag = prefix >> 3;
switch (tag) {
case 1:
var len = varint.decode(buf, offset);
offset += varint.decode.bytes;
obj.levels.push(Level.decode(buf, offset, offset + len));
offset += Level.decode.bytes;
break;
default:
offset = skip(prefix & 7, buf, offset);
}
}
}
}
function defineHeader() {
var Metadata = Header.Metadata = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
};
defineMetadata();
function defineMetadata() {
Metadata.encodingLength = encodingLength2;
Metadata.encode = encode3;
Metadata.decode = decode3;
function encodingLength2(obj) {
var length = 0;
if (defined(obj.contentFeed)) {
var len = encodings.bytes.encodingLength(obj.contentFeed);
length += 1 + len;
}
if (defined(obj.userData)) {
var len = encodings.bytes.encodingLength(obj.userData);
length += 1 + len;
}
return length;
}
function encode3(obj, buf, offset) {
if (!offset) offset = 0;
if (!buf) buf = b4a4.allocUnsafe(encodingLength2(obj));
var oldOffset = offset;
if (defined(obj.contentFeed)) {
buf[offset++] = 10;
encodings.bytes.encode(obj.contentFeed, buf, offset);
offset += encodings.bytes.encode.bytes;
}
if (defined(obj.userData)) {
buf[offset++] = 18;
encodings.bytes.encode(obj.userData, buf, offset);
offset += encodings.bytes.encode.bytes;
}
encode3.bytes = offset - oldOffset;
return buf;
}
function decode3(buf, offset, end) {
if (!offset) offset = 0;
if (!end) end = buf.length;
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid");
var oldOffset = offset;
var obj = {
contentFeed: null,
userData: null
};
while (true) {
if (end <= offset) {
decode3.bytes = offset - oldOffset;
return obj;
}
var prefix = varint.decode(buf, offset);
offset += varint.decode.bytes;
var tag = prefix >> 3;
switch (tag) {
case 1:
obj.contentFeed = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
break;
case 2:
obj.userData = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
break;
default:
offset = skip(prefix & 7, buf, offset);
}
}
}
}
Header.encodingLength = encodingLength;
Header.encode = encode2;
Header.decode = decode2;
function encodingLength(obj) {
var length = 0;
if (!defined(obj.protocol)) throw new Error("protocol is required");
var len = encodings.string.encodingLength(obj.protocol);
length += 1 + len;
if (defined(obj.metadata)) {
var len = Metadata.encodingLength(obj.metadata);
length += varint.encodingLength(len);
length += 1 + len;
}
return length;
}
function encode2(obj, buf, offset) {
if (!offset) offset = 0;
if (!buf) buf = b4a4.allocUnsafe(encodingLength(obj));
var oldOffset = offset;
if (!defined(obj.protocol)) throw new Error("protocol is required");
buf[offset++] = 10;
encodings.string.encode(obj.protocol, buf, offset);
offset += encodings.string.encode.bytes;
if (defined(obj.metadata)) {
buf[offset++] = 18;
varint.encode(Metadata.encodingLength(obj.metadata), buf, offset);
offset += varint.encode.bytes;
Metadata.encode(obj.metadata, buf, offset);
offset += Metadata.encode.bytes;
}
encode2.bytes = offset - oldOffset;
return buf;
}
function decode2(buf, offset, end) {
if (!offset) offset = 0;
if (!end) end = buf.length;
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid");
var oldOffset = offset;
var obj = {
protocol: "",
metadata: null
};
var found0 = false;
while (true) {
if (end <= offset) {
if (!found0) throw new Error("Decoded message is not valid");
decode2.bytes = offset - oldOffset;
return obj;
}
var prefix = varint.decode(buf, offset);
offset += varint.decode.bytes;
var tag = prefix >> 3;
switch (tag) {
case 1:
obj.protocol = encodings.string.decode(buf, offset);
offset += encodings.string.decode.bytes;
found0 = true;
break;
case 2:
var len = varint.decode(buf, offset);
offset += varint.decode.bytes;
obj.metadata = Metadata.decode(buf, offset, offset + len);
offset += Metadata.decode.bytes;
break;
default:
offset = skip(prefix & 7, buf, offset);
}
}
}
}
function defineNode() {
Node.encodingLength = encodingLength;
Node.encode = encode2;
Node.decode = decode2;
function encodingLength(obj) {
var length = 0;
if (!defined(obj.index)) throw new Error("index is required");
var len = encodings.bytes.encodingLength(obj.index);
length += 1 + len;
if (!defined(obj.key)) throw new Error("key is required");
var len = encodings.bytes.encodingLength(obj.key);
length += 1 + len;
if (defined(obj.value)) {
var len = encodings.bytes.encodingLength(obj.value);
length += 1 + len;
}
return length;
}
function encode2(obj, buf, offset) {
if (!offset) offset = 0;
if (!buf) buf = b4a4.allocUnsafe(encodingLength(obj));
var oldOffset = offset;
if (!defined(obj.index)) throw new Error("index is required");
buf[offset++] = 10;
encodings.bytes.encode(obj.index, buf, offset);
offset += encodings.bytes.encode.bytes;
if (!defined(obj.key)) throw new Error("key is required");
buf[offset++] = 18;
encodings.bytes.encode(obj.key, buf, offset);
offset += encodings.bytes.encode.bytes;
if (defined(obj.value)) {
buf[offset++] = 26;
encodings.bytes.encode(obj.value, buf, offset);
offset += encodings.bytes.encode.bytes;
}
encode2.bytes = offset - oldOffset;
return buf;
}
function decode2(buf, offset, end) {
if (!offset) offset = 0;
if (!end) end = buf.length;
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid");
var oldOffset = offset;
var obj = {
index: null,
key: null,
value: null
};
var found0 = false;
var found1 = false;
while (true) {
if (end <= offset) {
if (!found0 || !found1) throw new Error("Decoded message is not valid");
decode2.bytes = offset - oldOffset;
return obj;
}
var prefix = varint.decode(buf, offset);
offset += varint.decode.bytes;
var tag = prefix >> 3;
switch (tag) {
case 1:
obj.index = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
found0 = true;
break;
case 2:
obj.key = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
found1 = true;
break;
case 3:
obj.value = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
break;
default:
offset = skip(prefix & 7, buf, offset);
}
}
}
}
function defineExtension() {
var Get = Extension.Get = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
};
var Iterator = Extension.Iterator = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
};
var Cache = Extension.Cache = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
};
defineGet();
defineIterator();
defineCache();
function defineGet() {
Get.encodingLength = encodingLength2;
Get.encode = encode3;
Get.decode = decode3;
function encodingLength2(obj) {
var length = 0;
if (defined(obj.version)) {
var len = encodings.varint.encodingLength(obj.version);
length += 1 + len;
}
if (defined(obj.key)) {
var len = encodings.bytes.encodingLength(obj.key);
length += 1 + len;
}
return length;
}
function encode3(obj, buf, offset) {
if (!offset) offset = 0;
if (!buf) buf = b4a4.allocUnsafe(encodingLength2(obj));
var oldOffset = offset;
if (defined(obj.version)) {
buf[offset++] = 8;
encodings.varint.encode(obj.version, buf, offset);
offset += encodings.varint.encode.bytes;
}
if (defined(obj.key)) {
buf[offset++] = 18;
encodings.bytes.encode(obj.key, buf, offset);
offset += encodings.bytes.encode.bytes;
}
encode3.bytes = offset - oldOffset;
return buf;
}
function decode3(buf, offset, end) {
if (!offset) offset = 0;
if (!end) end = buf.length;
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid");
var oldOffset = offset;
var obj = {
version: 0,
key: null
};
while (true) {
if (end <= offset) {
decode3.bytes = offset - oldOffset;
return obj;
}
var prefix = varint.decode(buf, offset);
offset += varint.decode.bytes;
var tag = prefix >> 3;
switch (tag) {
case 1:
obj.version = encodings.varint.decode(buf, offset);
offset += encodings.varint.decode.bytes;
break;
case 2:
obj.key = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
break;
default:
offset = skip(prefix & 7, buf, offset);
}
}
}
}
function defineIterator() {
Iterator.encodingLength = encodingLength2;
Iterator.encode = encode3;
Iterator.decode = decode3;
function encodingLength2(obj) {
var length = 0;
if (defined(obj.version)) {
var len = encodings.varint.encodingLength(obj.version);
length += 1 + len;
}
if (defined(obj.gte)) {
var len = encodings.bytes.encodingLength(obj.gte);
length += 1 + len;
}
if (defined(obj.gt)) {
var len = encodings.bytes.encodingLength(obj.gt);
length += 1 + len;
}
if (defined(obj.lte)) {
var len = encodings.bytes.encodingLength(obj.lte);
length += 1 + len;
}
if (defined(obj.lt)) {
var len = encodings.bytes.encodingLength(obj.lt);
length += 1 + len;
}
if (defined(obj.limit)) {
var len = encodings.varint.encodingLength(obj.limit);
length += 1 + len;
}
if (defined(obj.reverse)) {
var len = encodings.bool.encodingLength(obj.reverse);
length += 1 + len;
}
if (defined(obj.checkpoint)) {
var packedLen = 0;
for (var i = 0; i < obj.checkpoint.length; i++) {
if (!defined(obj.checkpoint[i])) continue;
var len = encodings.varint.encodingLength(obj.checkpoint[i]);
packedLen += len;
}
if (packedLen) {
length += 1 + packedLen + varint.encodingLength(packedLen);
}
}
return length;
}
function encode3(obj, buf, offset) {
if (!offset) offset = 0;
if (!buf) buf = b4a4.allocUnsafe(encodingLength2(obj));
var oldOffset = offset;
if (defined(obj.version)) {
buf[offset++] = 8;
encodings.varint.encode(obj.version, buf, offset);
offset += encodings.varint.encode.bytes;
}
if (defined(obj.gte)) {
buf[offset++] = 18;
encodings.bytes.encode(obj.gte, buf, offset);
offset += encodings.bytes.encode.bytes;
}
if (defined(obj.gt)) {
buf[offset++] = 26;
encodings.bytes.encode(obj.gt, buf, offset);
offset += encodings.bytes.encode.bytes;
}
if (defined(obj.lte)) {
buf[offset++] = 34;
encodings.bytes.encode(obj.lte, buf, offset);
offset += encodings.bytes.encode.bytes;
}
if (defined(obj.lt)) {
buf[offset++] = 42;
encodings.bytes.encode(obj.lt, buf, offset);
offset += encodings.bytes.encode.bytes;
}
if (defined(obj.limit)) {
buf[offset++] = 48;
encodings.varint.encode(obj.limit, buf, offset);
offset += encodings.varint.encode.bytes;
}
if (defined(obj.reverse)) {
buf[offset++] = 56;
encodings.bool.encode(obj.reverse, buf, offset);
offset += encodings.bool.encode.bytes;
}
if (defined(obj.checkpoint)) {
var packedLen = 0;
for (var i = 0; i < obj.checkpoint.length; i++) {
if (!defined(obj.checkpoint[i])) continue;
packedLen += encodings.varint.encodingLength(obj.checkpoint[i]);
}
if (packedLen) {
buf[offset++] = 66;
varint.encode(packedLen, buf, offset);
offset += varint.encode.bytes;
}
for (var i = 0; i < obj.checkpoint.length; i++) {
if (!defined(obj.checkpoint[i])) continue;
encodings.varint.encode(obj.checkpoint[i], buf, offset);
offset += encodings.varint.encode.bytes;
}
}
encode3.bytes = offset - oldOffset;
return buf;
}
function decode3(buf, offset, end) {
if (!offset) offset = 0;
if (!end) end = buf.length;
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid");
var oldOffset = offset;
var obj = {
version: 0,
gte: null,
gt: null,
lte: null,
lt: null,
limit: 0,
reverse: false,
checkpoint: []
};
while (true) {
if (end <= offset) {
decode3.bytes = offset - oldOffset;
return obj;
}
var prefix = varint.decode(buf, offset);
offset += varint.decode.bytes;
var tag = prefix >> 3;
switch (tag) {
case 1:
obj.version = encodings.varint.decode(buf, offset);
offset += encodings.varint.decode.bytes;
break;
case 2:
obj.gte = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
break;
case 3:
obj.gt = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
break;
case 4:
obj.lte = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
break;
case 5:
obj.lt = encodings.bytes.decode(buf, offset);
offset += encodings.bytes.decode.bytes;
break;
case 6:
obj.limit = encodings.varint.decode(buf, offset);
offset += encodings.varint.decode.bytes;
break;
case 7:
obj.reverse = encodings.bool.decode(buf, offset);
offset += encodings.bool.decode.bytes;
break;
case 8:
var packedEnd = varint.decode(buf, offset);
offset += varint.decode.bytes;
packedEnd += offset;
while (offset < packedEnd) {
obj.checkpoint.push(encodings.varint.decode(buf, offset));
offset += encodings.varint.decode.bytes;
}
break;
default:
offset = skip(prefix & 7, buf, offset);
}
}
}
}
function defineCache() {
Cache.encodingLength = encodingLength2;
Cache.encode = encode3;
Cache.decode = decode3;
function encodingLength2(obj) {
var length = 0;
if (!defined(obj.start)) throw new Error("start is required");
var len = encodings.varint.encodingLength(obj.start);
length += 1 + len;
if (!defined(obj.end)) throw new Error("end is required");
var len = encodings.varint.encodingLength(obj.end);
length += 1 + len;
if (defined(obj.blocks)) {
var packedLen = 0;
for (var i = 0; i < obj.blocks.length; i++) {
if (!defined(obj.blocks[i])) continue;
var len = encodings.varint.encodingLength(obj.blocks[i]);
packedLen += len;
}
if (packedLen) {
length += 1 + packedLen + varint.encodingLength(packedLen);
}
}
return length;
}
function encode3(obj, buf, offset) {
if (!offset) offset = 0;
if (!buf) buf = b4a4.allocUnsafe(encodingLength2(obj));
var oldOffset = offset;
if (!defined(obj.start)) throw new Error("start is required");
buf[offset++] = 8;
encodings.varint.encode(obj.start, buf, offset);
offset += encodings.varint.encode.bytes;
if (!defined(obj.end)) throw new Error("end is required");
buf[offset++] = 16;
encodings.varint.encode(obj.end, buf, offset);
offset += encodings.varint.encode.bytes;
if (defined(obj.blocks)) {
var packedLen = 0;
for (var i = 0; i < obj.blocks.length; i++) {
if (!defined(obj.blocks[i])) continue;
packedLen += encodings.varint.encodingLength(obj.blocks[i]);
}
if (packedLen) {
buf[offset++] = 26;
varint.encode(packedLen, buf, offset);
offset += varint.encode.bytes;
}
for (var i = 0; i < obj.blocks.length; i++) {
if (!defined(obj.blocks[i])) continue;
encodings.varint.encode(obj.blocks[i], buf, offset);
offset += encodings.varint.encode.bytes;
}
}
encode3.bytes = offset - oldOffset;
return buf;
}
function decode3(buf, offset, end) {
if (!offset) offset = 0;
if (!end) end = buf.length;
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid");
var oldOffset = offset;
var obj = {
start: 0,
end: 0,
blocks: []
};
var found0 = false;
var found1 = false;
while (true) {
if (end <= offset) {
if (!found0 || !found1) throw new Error("Decoded message is not valid");
decode3.bytes = offset - oldOffset;
return obj;
}
var prefix = varint.decode(buf, offset);
offset += varint.decode.bytes;
var tag = prefix >> 3;
switch (tag) {
case 1:
obj.start = encodings.varint.decode(buf, offset);
offset += encodings.varint.decode.bytes;
found0 = true;
break;
case 2:
obj.end = encodings.varint.decode(buf, offset);
offset += encodings.varint.decode.bytes;
found1 = true;
break;
case 3:
var packedEnd = varint.decode(buf, offset);
offset += varint.decode.bytes;
packedEnd += offset;
while (offset < packedEnd) {
obj.blocks.push(encodings.varint.decode(buf, offset));
offset += encodings.varint.decode.bytes;
}
break;
default:
offset = skip(prefix & 7, buf, offset);
}
}
}
}
Extension.encodingLength = encodingLength;
Extension.encode = encode2;
Extension.decode = decode2;
function encodingLength(obj) {
var length = 0;
if (defined(obj.cache)) {
var len = Cache.encodingLength(obj.cache);
length += varint.encodingLength(len);
length += 1 + len;
}
if (defined(obj.get)) {
var len = Get.encodingLength(obj.get);
length += varint.encodingLength(len);
length += 1 + len;
}
if (defined(obj.iterator)) {
var len = Iterator.encodingLength(obj.iterator);
length += varint.encodingLength(len);
length += 1 + len;
}
return length;
}
function encode2(obj, buf, offset) {
if (!offset) offset = 0;
if (!buf) buf = b4a4.allocUnsafe(encodingLength(obj));
var oldOffset = offset;
if (defined(obj.cache)) {
buf[offset++] = 10;
varint.encode(Cache.encodingLength(obj.cache), buf, offset);
offset += varint.encode.bytes;
Cache.encode(obj.cache, buf, offset);
offset += Cache.encode.bytes;
}
if (defined(obj.get)) {
buf[offset++] = 18;
varint.encode(Get.encodingLength(obj.get), buf, offset);
offset += varint.encode.bytes;
Get.encode(obj.get, buf, offset);
offset += Get.encode.bytes;
}
if (defined(obj.iterator)) {
buf[offset++] = 26;
varint.encode(Iterator.encodingLength(obj.iterator), buf, offset);
offset += varint.encode.bytes;
Iterator.encode(obj.iterator, buf, offset);
offset += Iterator.encode.bytes;
}
encode2.bytes = offset - oldOffset;
return buf;
}
function decode2(buf, offset, end) {
if (!offset) offset = 0;
if (!end) end = buf.length;
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid");
var oldOffset = offset;
var obj = {
cache: null,
get: null,
iterator: null
};
while (true) {
if (end <= offset) {
decode2.bytes = offset - oldOffset;
return obj;
}
var prefix = varint.decode(buf, offset);
offset += varint.decode.bytes;
var tag = prefix >> 3;
switch (tag) {
case 1:
var len = varint.decode(buf, offset);
offset += varint.decode.bytes;
obj.cache = Cache.decode(buf, offset, offset + len);
offset += Cache.decode.bytes;
break;
case 2:
var len = varint.decode(buf, offset);
offset += varint.decode.bytes;
obj.get = Get.decode(buf, offset, offset + len);
offset += Get.decode.bytes;
break;
case 3:
var len = varint.decode(buf, offset);
offset += varint.decode.bytes;
obj.iterator = Iterator.decode(buf, offset, offset + len);
offset += Iterator.decode.bytes;
break;
default:
offset = skip(prefix & 7, buf, offset);
}
}
}
}
function defined(val) {
return val !== null && val !== void 0 && (typeof val !== "number" || !isNaN(val));
}
}
});
// node_modules/hyperbee/lib/extension.js
var require_extension = __commonJS({
"node_modules/hyperbee/lib/extension.js"(exports2, module2) {
var { Extension } = require_messages();
var FLUSH_BATCH = 128;
var MAX_PASSIVE_BATCH = 2048;
var MAX_ACTIVE_BATCH = MAX_PASSIVE_BATCH + FLUSH_BATCH;
var Batch = class {
constructor(outgoing, from) {
this.blocks = [];
this.start = 0;
this.end = 0;
this.outgoing = outgoing;
this.from = from;
}
push(seq) {
const len = this.blocks.push(seq);
if (len === 1 || seq < this.start) this.start = seq;
if (len === 1 || seq >= this.end) this.end = seq + 1;
if (len >= FLUSH_BATCH) {
this.send();
this.clear();
}
}
send() {
if (!this.blocks.length) return;
this.outgoing.send(
Extension.encode({
cache: { blocks: this.blocks, start: this.start, end: this.end }
}),
this.from
);
}
clear() {
this.start = this.end = 0;
this.blocks = [];
}
};
var HyperbeeExtension = class {
constructor(db) {
this.encoding = null;
this.outgoing = null;
this.db = db;
this.active = 0;
}
get(version3, key) {
this.outgoing.broadcast(Extension.encode({ get: { version: version3, key } }));
}
iterator(snapshot) {
if (snapshot.ended) return;
if (snapshot.limit === 0) return;
if (snapshot.limit === -1) snapshot.limit = 0;
this.outgoing.broadcast(Extension.encode({ iterator: snapshot }));
}
onmessage(buf, from) {
const message = decode2(buf);
if (!message) return;
if (message.cache) this.oncache(message.cache, from);
if (message.get) this.onget(message.get, from);
if (message.iterator) this.oniterator(message.iterator, from);
}
oncache(message, from) {
if (!message.blocks.length) return;
this.db.core.download(message);
}
onget(message, from) {
if (!message.version || message.version > this.db.version) return;
const b = new Batch(this.outgoing, from);
const db = this.db.checkout(message.version);
db.get(message.key, {
extension: false,
wait: false,
update: false,
onseq
}).then(done, done);
function done() {
db.close().catch(noop);
b.send();
}
function onseq(seq) {
b.push(seq);
}
}
async oniterator(message, from) {
if (!message.version || message.version > this.db.version) return;
const b = new Batch(this.outgoing, from);
const seqs = /* @__PURE__ */ new Set();
let skip = message.checkpoint.length;
let work = 0;
const db = this.db.checkout(message.version);
const ite = db.createRangeIterator({
...message,
wait: false,
extension: false,
update: false,
limit: message.limit === 0 ? -1 : message.limit,
onseq(seq) {
if (skip && skip--) return;
if (seqs.has(seq)) return;
work++;
seqs.add(seq);
b.push(seq);
}
});
try {
await ite.open();
while (work < MAX_ACTIVE_BATCH) {
if (!await ite.next()) break;
}
} catch (_) {
} finally {
ite.close().catch(noop);
db.close().catch(noop);
b.send();
}
}
static register(db) {
const e = new this(db);
e.outgoing = db.core.registerExtension("hyperbee", e);
return e;
}
};
HyperbeeExtension.BATCH_SIZE = MAX_PASSIVE_BATCH;
module2.exports = HyperbeeExtension;
function decode2(buf) {
try {
return Extension.decode(buf);
} catch (err) {
return null;
}
}
function noop() {
}
}
});
// node_modules/z32/index.js
var require_z32 = __commonJS({
"node_modules/z32/index.js"(exports2) {
var b4a4 = require_b4a();
var ALPHABET = "ybndrfg8ejkmcpqxot1uwisza345h769";
var MIN = 49;
var MAX = 122;
var REVERSE = new Int8Array(1 + MAX - MIN);
REVERSE.fill(-1);
for (let i = 0; i < ALPHABET.length; i++) {
const v = ALPHABET.charCodeAt(i) - MIN;
REVERSE[v] = i;
}
exports2.encode = encode2;
exports2.decode = decode2;
exports2.ALPHABET = ALPHABET;
function decode2(s, out) {
let pb = 0;
let ps = 0;
const r = s.length & 7;
const q = (s.length - r) / 8;
if (!out) out = b4a4.allocUnsafe(Math.ceil(s.length * 5 / 8));
for (let i = 0; i < q; i++) {
const a2 = quintet(s, ps++);
const b2 = quintet(s, ps++);
const c5 = quintet(s, ps++);
const d2 = quintet(s, ps++);
const e2 = quintet(s, ps++);
const f2 = quintet(s, ps++);
const g2 = quintet(s, ps++);
const h2 = quintet(s, ps++);
out[pb++] = a2 << 3 | b2 >>> 2;
out[pb++] = (b2 & 3) << 6 | c5 << 1 | d2 >>> 4;
out[pb++] = (d2 & 15) << 4 | e2 >>> 1;
out[pb++] = (e2 & 1) << 7 | f2 << 2 | g2 >>> 3;
out[pb++] = (g2 & 7) << 5 | h2;
}
if (r === 0) return out.subarray(0, pb);
const a = quintet(s, ps++);
const b = quintet(s, ps++);
out[pb++] = a << 3 | b >>> 2;
if (r <= 2) return out.subarray(0, pb);
const c4 = quintet(s, ps++);
const d = quintet(s, ps++);
out[pb++] = (b & 3) << 6 | c4 << 1 | d >>> 4;
if (r <= 4) return out.subarray(0, pb);
const e = quintet(s, ps++);
out[pb++] = (d & 15) << 4 | e >>> 1;
if (r <= 5) return out.subarray(0, pb);
const f = quintet(s, ps++);
const g = quintet(s, ps++);
out[pb++] = (e & 1) << 7 | f << 2 | g >>> 3;
if (r <= 7) return out.subarray(0, pb);
const h = quintet(s, ps++);
out[pb++] = (g & 7) << 5 | h;
return out.subarray(0, pb);
}
function encode2(buf) {
if (typeof buf === "string") buf = b4a4.from(buf);
const max = buf.byteLength * 8;
let s = "";
for (let p = 0; p < max; p += 5) {
const i = p >>> 3;
const j = p & 7;
if (j <= 3) {
s += ALPHABET[buf[i] >>> 3 - j & 31];
continue;
}
const of = j - 3;
const h = buf[i] << of & 31;
const l = (i >= buf.byteLength ? 0 : buf[i + 1]) >>> 8 - of;
s += ALPHABET[h | l];
}
return s;
}
function quintet(s, i) {
if (i > s.length) {
return 0;
}
const v = s.charCodeAt(i);
if (v < MIN || v > MAX) {
throw Error('Invalid character in base32 input: "' + s[i] + '" at position ' + i);
}
const bits = REVERSE[v - MIN];
if (bits === -1) {
throw Error('Invalid character in base32 input: "' + s[i] + '" at position ' + i);
}
return bits;
}
}
});
// node_modules/hypercore-id-encoding/index.js
var require_hypercore_id_encoding = __commonJS({
"node_modules/hypercore-id-encoding/index.js"(exports2, module2) {
var z322 = require_z32();
var b4a4 = require_b4a();
module2.exports = {
encode: encode2,
decode: decode2,
normalize,
isValid
};
function encode2(key) {
if (!b4a4.isBuffer(key)) throw new Error("Key must be a Buffer");
if (key.byteLength !== 32) throw new Error("Key must be 32-bytes long");
return z322.encode(key);
}
function decode2(id) {
if (b4a4.isBuffer(id)) {
if (id.byteLength !== 32) throw new Error("ID must be 32-bytes long");
return id;
}
if (typeof id === "string") {
if (id.startsWith("pear://")) id = id.slice(7).split("/")[0];
if (id.length === 52) return z322.decode(id);
if (id.length === 64) {
const buf = b4a4.from(id, "hex");
if (buf.byteLength === 32) return buf;
}
}
throw new Error("Invalid Hypercore key");
}
function normalize(any) {
return encode2(decode2(any));
}
function isValid(any) {
try {
decode2(any);
return true;
} catch {
return false;
}
}
}
});
// node_modules/hypercore-errors/index.js
var require_hypercore_errors = __commonJS({
"node_modules/hypercore-errors/index.js"(exports2, module2) {
var IdEnc = require_hypercore_id_encoding();
module2.exports = class HypercoreError extends Error {
constructor(msg, code, fn = HypercoreError, discoveryKey = null) {
if (discoveryKey) msg = `${msg} (discovery key: ${IdEnc.normalize(discoveryKey)})`;
super(`${code}: ${msg}`);
this.code = code;
this.discoveryKey = discoveryKey;
if (Error.captureStackTrace) {
Error.captureStackTrace(this, fn);
}
}
get name() {
return "HypercoreError";
}
static ASSERTION(msg, discoveryKey = null) {
return new HypercoreError(msg, "ERR_ASSERTION", HypercoreError.ASSERT, discoveryKey);
}
static BAD_ARGUMENT(msg, discoveryKey = null) {
return new HypercoreError(msg, "BAD_ARGUMENT", HypercoreError.BAD_ARGUMENT, discoveryKey);
}
static STORAGE_EMPTY(msg, discoveryKey = null) {
return new HypercoreError(msg, "STORAGE_EMPTY", HypercoreError.STORAGE_EMPTY, discoveryKey);
}
static STORAGE_CONFLICT(msg, discoveryKey = null) {
return new HypercoreError(msg, "STORAGE_CONFLICT", HypercoreError.STORAGE_CONFLICT, discoveryKey);
}
static INVALID_SIGNATURE(msg, discoveryKey = null) {
return new HypercoreError(msg, "INVALID_SIGNATURE", HypercoreError.INVALID_SIGNATURE, discoveryKey);
}
static INVALID_CAPABILITY(msg, discoveryKey = null) {
return new HypercoreError(msg, "INVALID_CAPABILITY", HypercoreError.INVALID_CAPABILITY, discoveryKey);
}
static INVALID_CHECKSUM(msg = "Invalid checksum", discoveryKey = null) {
return new HypercoreError(msg, "INVALID_CHECKSUM", HypercoreError.INVALID_CHECKSUM, discoveryKey);
}
static INVALID_OPERATION(msg, discoveryKey = null) {
return new HypercoreError(msg, "INVALID_OPERATION", HypercoreError.INVALID_OPERATION, discoveryKey);
}
static INVALID_PROOF(msg = "Proof not verifiable", discoveryKey = null) {
return new HypercoreError(msg, "INVALID_PROOF", HypercoreError.INVALID_PROOF, discoveryKey);
}
static BLOCK_NOT_AVAILABLE(msg = "Block is not available", discoveryKey = null) {
return new HypercoreError(msg, "BLOCK_NOT_AVAILABLE", HypercoreError.BLOCK_NOT_AVAILABLE, discoveryKey);
}
static SNAPSHOT_NOT_AVAILABLE(msg = "Snapshot is not available", discoveryKey = null) {
return new HypercoreError(msg, "SNAPSHOT_NOT_AVAILABLE", HypercoreError.SNAPSHOT_NOT_AVAILABLE, discoveryKey);
}
static REQUEST_CANCELLED(msg = "Request was cancelled", discoveryKey = null) {
return new HypercoreError(msg, "REQUEST_CANCELLED", HypercoreError.REQUEST_CANCELLED, discoveryKey);
}
static REQUEST_TIMEOUT(msg = "Request timed out", discoveryKey = null) {
return new HypercoreError(msg, "REQUEST_TIMEOUT", HypercoreError.REQUEST_TIMEOUT, discoveryKey);
}
static SESSION_NOT_WRITABLE(msg = "Session is not writable", discoveryKey = null) {
return new HypercoreError(msg, "SESSION_NOT_WRITABLE", HypercoreError.SESSION_NOT_WRITABLE, discoveryKey);
}
static SESSION_CLOSED(msg = "Session is closed", discoveryKey = null) {
return new HypercoreError(msg, "SESSION_CLOSED", HypercoreError.SESSION_CLOSED, discoveryKey);
}
static BATCH_UNFLUSHED(msg = "Batch not yet flushed", discoveryKey = null) {
return new HypercoreError(msg, "BATCH_UNFLUSHED", HypercoreError.BATCH_UNFLUSHED, discoveryKey);
}
static BATCH_ALREADY_EXISTS(msg = "Batch already exists", discoveryKey = null) {
return new HypercoreError(msg, "BATCH_ALREADY_EXISTS", HypercoreError.BATCH_ALREADY_EXISTS, discoveryKey);
}
static BATCH_ALREADY_FLUSHED(msg = "Batch has already been flushed", discoveryKey = null) {
return new HypercoreError(msg, "BATCH_ALREADY_FLUSHED", HypercoreError.BATCH_ALREADY_FLUSHED, discoveryKey);
}
static OPLOG_CORRUPT(msg = "Oplog file appears corrupt or out of date", discoveryKey = null) {
return new HypercoreError(msg, "OPLOG_CORRUPT", HypercoreError.OPLOG_CORRUPT, discoveryKey);
}
static OPLOG_HEADER_OVERFLOW(msg = "Oplog header exceeds page size", discoveryKey = null) {
return new HypercoreError(msg, "OPLOG_HEADER_OVERFLOW", HypercoreError.OPLOG_HEADER_OVERFLOW, discoveryKey);
}
static INVALID_OPLOG_VERSION(msg = "Invalid header version", discoveryKey = null) {
return new HypercoreError(msg, "INVALID_OPLOG_VERSION", HypercoreError.INVALID_OPLOG_VERSION, discoveryKey);
}
static WRITE_FAILED(msg = "Write to storage failed", discoveryKey = null) {
return new HypercoreError(msg, "WRITE_FAILED", HypercoreError.WRITE_FAILED, discoveryKey);
}
static DECODING_ERROR(msg = "Decoding error", discoveryKey = null) {
return new HypercoreError(msg, "DECODING_ERROR", HypercoreError.DECODING_ERROR, discoveryKey);
}
static SESSION_MOVED(msg = "Session moved", discoveryKey = null) {
return new HypercoreError(msg, "SESSION_MOVED", HypercoreError.SESSION_MOVED, discoveryKey);
}
};
}
});
// node_modules/hyperbee/index.js
var require_hyperbee = __commonJS({
"node_modules/hyperbee/index.js"(exports2, module2) {
var codecs = require_codecs();
var { Readable } = require_streamx();
var mutexify = require_promise();
var b4a4 = require_b4a();
var safetyCatch = require_safety_catch();
var ReadyResource = require_ready_resource();
var debounce = require_debounceify();
var Rache = require_rache();
var rrp = require_resolve_reject_promise();
var { all: unslabAll } = require_unslab();
var RangeIterator = require_range();
var HistoryIterator = require_history();
var DiffIterator = require_diff();
var LocalBlockIterator = require_local();
var Extension = require_extension();
var { YoloIndex, Node, Header } = require_messages();
var { BLOCK_NOT_AVAILABLE, DECODING_ERROR } = require_hypercore_errors();
var T = 5;
var MIN_KEYS = T - 1;
var MAX_CHILDREN = MIN_KEYS * 2 + 1;
var SEP = b4a4.alloc(1);
var EMPTY = b4a4.alloc(0);
var Key = class {
constructor(seq, value) {
this.seq = seq;
this.value = value;
}
};
var Child = class {
constructor(seq, offset, value) {
this.seq = seq;
this.offset = offset;
this.value = value;
}
};
var Cache = class {
constructor(rache) {
this.keys = rache;
this.length = 0;
}
get(seq) {
return this.keys.get(seq) || null;
}
set(seq, key) {
this.keys.set(seq, key);
if (seq >= this.length) this.length = seq + 1;
}
gc(length) {
if (this.length - length > 128) {
this.keys.clear();
} else {
for (let i = length; i < this.length; i++) {
this.keys.delete(i);
}
}
this.length = length;
}
clear() {
this.keys.clear();
}
};
var Pointers = class {
constructor(decoded) {
this.levels = decoded.levels.map((l) => {
const children = [];
const keys = [];
for (let i = 0; i < l.keys.length; i++) {
keys.push(new Key(l.keys[i], null));
}
for (let i = 0; i < l.children.length; i += 2) {
children.push(new Child(l.children[i], l.children[i + 1], null));
}
return { keys, children };
});
}
get(i) {
return this.levels[i];
}
hasKey(seq) {
for (const lvl of this.levels) {
for (const key of lvl.keys) {
if (key.seq === seq) return true;
}
}
return false;
}
};
function inflate(entry) {
if (entry.inflated === null) {
entry.inflated = YoloIndex.decode(entry.index);
entry.index = null;
}
return new Pointers(entry.inflated);
}
function deflate(index) {
const levels = index.map((l) => {
const keys = [];
const children = [];
for (let i = 0; i < l.value.keys.length; i++) {
keys.push(l.value.keys[i].seq);
}
for (let i = 0; i < l.value.children.length; i++) {
children.push(l.value.children[i].seq, l.value.children[i].offset);
}
return { keys, children };
});
return YoloIndex.encode({ levels });
}
var TreeNode = class _TreeNode {
constructor(block, keys, children, offset) {
this.block = block;
this.offset = offset;
this.keys = keys;
this.children = children;
this.changed = false;
this.preload();
}
preload() {
if (this.block === null) return;
const core = getBackingCore(this.block.tree.core);
if (!core) return;
const bitfield = core.core.bitfield;
const blocks = [];
for (let i = 0; i < this.keys.length; i++) {
const k = this.keys[i];
if (k.value) continue;
if (k.seq >= core.signedLength || bitfield && bitfield.get(k.seq)) continue;
blocks.push(k.seq);
}
for (let i = 0; i < this.children.length; i++) {
const c4 = this.children[i];
if (c4.value) continue;
if (c4.seq >= core.signedLength || bitfield && bitfield.get(c4.seq)) continue;
blocks.push(c4.seq);
}
if (blocks.length) core.download({ blocks });
}
async insertKey(key, value, child, node, encoding, cas) {
let s = 0;
let e = this.keys.length;
let c4;
while (s < e) {
const mid = s + e >> 1;
c4 = b4a4.compare(key.value, await this.getKey(mid));
if (c4 === 0) {
if (cas) {
const prev = await this.getKeyNode(mid);
if (!await cas(prev.final(encoding), node)) return true;
}
if (!this.block.tree.tree.alwaysDuplicate) {
const prev = await this.getKeyNode(mid);
if (sameValue(prev.value, value)) return true;
}
this.changed = true;
this.keys[mid] = key;
return true;
}
if (c4 < 0) e = mid;
else s = mid + 1;
}
const i = c4 < 0 ? e : s;
this.keys.splice(i, 0, key);
if (child) this.children.splice(i + 1, 0, new Child(0, 0, child));
this.changed = true;
return this.keys.length < MAX_CHILDREN;
}
removeKey(index) {
this.keys.splice(index, 1);
if (this.children.length) {
this.children[index + 1].seq = 0;
this.children.splice(index + 1, 1);
}
this.changed = true;
}
async siblings(parent) {
for (let i = 0; i < parent.children.length; i++) {
if (parent.children[i].value === this) {
const [left, right] = await Promise.all([
i ? parent.getChildNode(i - 1) : null,
i < parent.children.length - 1 ? parent.getChildNode(i + 1) : null
]);
return { left, index: i, right };
}
}
throw new Error("Bad parent");
}
merge(node, median) {
this.changed = true;
this.keys.push(median);
for (let i = 0; i < node.keys.length; i++) this.keys.push(node.keys[i]);
for (let i = 0; i < node.children.length; i++) this.children.push(node.children[i]);
}
async split() {
const len = this.keys.length >> 1;
const right = _TreeNode.create(this.block);
while (right.keys.length < len) right.keys.push(this.keys.pop());
right.keys.reverse();
await this.getKey(this.keys.length - 1);
const median = this.keys.pop();
if (this.children.length) {
while (right.children.length < len + 1) right.children.push(this.children.pop());
right.children.reverse();
}
this.changed = true;
return {
left: this,
median,
right
};
}
getKeyNode(index) {
return this.block.tree.getBlock(this.keys[index].seq);
}
async getChildNode(index) {
const child = this.children[index];
if (child.value) return child.value;
const block = child.seq === this.block.seq ? this.block : await this.block.tree.getBlock(child.seq);
return child.value = block.getTreeNode(child.offset);
}
setKey(index, key) {
this.keys[index] = key;
this.changed = true;
}
async getKey(index) {
const key = this.keys[index];
if (key.value) return key.value;
const k = key.seq === this.block.seq ? this.block.key : await this.block.tree.getKey(key.seq);
return key.value = k;
}
indexChanges(index, seq) {
const offset = index.push(null) - 1;
this.changed = false;
for (const child of this.children) {
if (!child.value || !child.value.changed) continue;
child.seq = seq;
child.offset = child.value.indexChanges(index, seq);
index[child.offset] = child;
}
return offset;
}
updateChildren(seq, block) {
for (const child of this.children) {
if (!child.value || child.seq !== seq) continue;
child.value.block = block;
child.value.updateChildren(seq, block);
}
}
static create(block) {
const node = new _TreeNode(block, [], [], 0);
node.changed = true;
return node;
}
};
var BlockEntry = class {
constructor(seq, tree, entry) {
this.seq = seq;
this.tree = tree;
this.index = null;
this.entry = entry;
this.key = entry.key;
this.value = entry.value;
}
isTarget(key) {
return b4a4.equals(this.key, key);
}
inflate() {
if (this.index === null) {
this.index = inflate(this.entry);
}
}
isDeletion() {
if (this.value !== null) return false;
if (this.index === null) {
this.index = inflate(this.entry);
}
return !this.index.hasKey(this.seq);
}
final(encoding) {
return {
seq: this.seq,
key: encoding.key ? encoding.key.decode(this.key) : this.key,
value: this.value && (encoding.value ? encoding.value.decode(this.value) : this.value)
};
}
getTreeNode(offset) {
if (this.index === null) {
this.index = inflate(this.entry);
}
const entry = this.index.get(offset);
return new TreeNode(this, entry.keys, entry.children, offset);
}
};
var CacheLock = class {
constructor() {
this.map = /* @__PURE__ */ new Map();
}
enter(seq) {
const pending = this.map.get(seq);
if (!pending) {
this.map.set(seq, []);
return Promise.resolve();
}
const { resolve, promise } = rrp();
pending.push(resolve);
return promise;
}
exit(seq) {
const pending = this.map.get(seq);
if (!pending.length) {
this.map.delete(seq);
return;
}
pending.pop()();
}
};
var BatchEntry = class extends BlockEntry {
constructor(seq, tree, key, value, index) {
super(seq, tree, { key, value, index: null, inflated: null });
this.pendingIndex = index;
}
isTarget(key) {
return false;
}
getTreeNode(offset) {
return this.pendingIndex[offset].value;
}
};
var Hyperbee = class _Hyperbee extends ReadyResource {
constructor(core, opts = {}) {
super();
this.feed = core;
this.core = core;
this.keyEncoding = opts.keyEncoding ? codecs(opts.keyEncoding) : null;
this.valueEncoding = opts.valueEncoding ? codecs(opts.valueEncoding) : null;
this.extension = opts.extension !== false ? getExtension(this, opts) : null;
this.metadata = opts.metadata || null;
this.lock = opts.lock || mutexify();
this.sep = opts.sep || SEP;
this.readonly = !!opts.readonly;
this.prefix = opts.prefix || null;
this.alwaysDuplicate = opts.alwaysDuplicate !== false;
this._unprefixedKeyEncoding = this.keyEncoding;
this._sub = !!this.prefix;
this._checkout = opts.checkout || 0;
this._view = !!opts._view;
this._onappendBound = this._view ? null : this._onappend.bind(this);
this._ontruncateBound = this._view ? null : this._ontruncate.bind(this);
this._watchers = this._onappendBound ? [] : null;
this._entryWatchers = this._onappendBound ? [] : null;
this._sessions = opts.sessions !== false;
this._keyCache = null;
this._nodeCache = null;
this._cacheLock = new CacheLock();
this._batches = [];
if (this._watchers) {
this.core.on("append", this._onappendBound);
this.core.on("truncate", this._ontruncateBound);
}
if (this.prefix && opts._sub) {
this.keyEncoding = prefixEncoding(this.prefix, this.keyEncoding);
}
this.ready().catch(safetyCatch);
}
async _open() {
if (this.core.opened === false) await this.core.ready();
if (this._watchers && this.core.replicator.setInflightRange) {
this.core.replicator.setInflightRange(256, 512);
}
if (this._checkout === -1) this._checkout = Math.max(1, this.core.length);
const baseCache = Rache.from(this.core.globalCache);
this._keyCache = new Cache(baseCache);
this._nodeCache = new Cache(Rache.from(baseCache));
}
get version() {
return Math.max(1, this._checkout || this.core.length);
}
get id() {
return this.core.id;
}
get key() {
return this.core.key;
}
get discoveryKey() {
return this.core.discoveryKey;
}
get writable() {
return this.core.writable;
}
get readable() {
return this.core.readable;
}
replicate(isInitiator, opts) {
return this.core.replicate(isInitiator, opts);
}
update(opts) {
return this.core.update(opts);
}
peek(range, opts) {
return iteratorPeek(this.createRangeIterator(range, { ...opts, limit: 1 }));
}
createRangeIterator(range, opts = {}) {
opts = opts ? { ...opts, ...range } : range;
const extension = opts.extension === false && opts.limit !== 0 ? null : this.extension;
const keyEncoding = opts.keyEncoding ? codecs(opts.keyEncoding) : this.keyEncoding;
if (extension) {
const { onseq, onwait } = opts;
let version3 = 0;
let next = 0;
opts = encRange(keyEncoding, {
...opts,
sub: this._sub,
onseq(seq) {
if (!version3) version3 = seq + 1;
if (next) next--;
if (onseq) onseq(seq);
},
onwait(seq) {
if (!next) {
next = Extension.BATCH_SIZE;
extension.iterator(ite.snapshot(version3));
}
if (onwait) onwait(seq);
}
});
} else {
opts = encRange(keyEncoding, { ...opts, sub: this._sub });
}
const ite = new RangeIterator(
new Batch(this, this._makeSnapshot(), null, false, opts),
null,
opts
);
return ite;
}
createReadStream(range, opts) {
const signal = opts && opts.signal || null;
return iteratorToStream(this.createRangeIterator(range, opts), signal);
}
createHistoryStream(opts) {
const session = opts && opts.live ? this.core.session() : this._makeSnapshot();
const signal = opts && opts.signal || null;
return iteratorToStream(
new HistoryIterator(new Batch(this, session, null, false, opts), opts),
signal
);
}
createDiffStream(right, range, opts) {
if (typeof right === "number") right = this.checkout(Math.max(1, right), { reuseSession: true });
opts = opts ? { ...opts, ...range } : range;
const signal = opts && opts.signal || null;
const keyEncoding = opts && opts.keyEncoding ? codecs(opts.keyEncoding) : this.keyEncoding;
if (keyEncoding) opts = encRange(keyEncoding, { ...opts, sub: this._sub });
let done;
let closing;
let ite;
const left = this;
const rs = new Readable({
signal,
eagerOpen: true,
async open(cb) {
try {
if (right.opened === false) await right.ready();
if (left.opened === false) await left.ready();
} catch (err) {
cb(err);
return;
}
if (closing) {
cb(null);
return;
}
if (left.core.closing || right.core.closing) {
cb(new Error("Bee closed"));
return;
}
const snapshot = right.version > left.version ? right._makeSnapshot() : left._makeSnapshot();
done = cb;
ite = new DiffIterator(
new Batch(left, snapshot, null, false, opts),
new Batch(right, snapshot, null, false, opts),
opts
);
ite.open().then(fin, fin);
},
read(cb) {
done = cb;
ite.next().then(push, fin);
},
predestroy() {
if (!ite) {
closing = Promise.resolve();
} else {
closing = ite.close();
closing.catch(noop);
}
},
destroy(cb) {
done = cb;
if (!closing) closing = ite.close();
closing.then(fin, fin);
}
});
return rs;
function fin(err) {
done(err);
}
function push(val) {
rs.push(val);
done(null);
}
}
get(key, opts) {
const b = new Batch(this, this._makeSnapshot(), null, true, opts);
return b.get(key);
}
getBySeq(seq, opts) {
const b = new Batch(this, this._makeSnapshot(), null, true, opts);
return b.getBySeq(seq);
}
put(key, value, opts) {
const b = new Batch(this, this.core, null, true, opts);
return b.put(key, value, opts);
}
batch(opts) {
return new Batch(this, this.core, mutexify(), true, opts);
}
del(key, opts) {
const b = new Batch(this, this.core, null, true, opts);
return b.del(key, opts);
}
watch(range, opts) {
if (!this._watchers) throw new Error("Can only watch the main bee instance");
return new Watcher(this, range, opts);
}
async getAndWatch(key, opts) {
if (!this._watchers) throw new Error("Can only watch the main bee instance");
const watcher = new EntryWatcher(this, key, opts);
await watcher._debouncedUpdate();
if (this.closing) {
await watcher.close();
throw new Error("Bee closed");
}
return watcher;
}
_onappend() {
for (const watcher of this._watchers) {
watcher._onappend();
}
for (const watcher of this._entryWatchers) {
watcher._onappend();
}
}
_ontruncate(length) {
for (const watcher of this._watchers) {
watcher._ontruncate();
}
for (const watcher of this._entryWatchers) {
watcher._ontruncate();
}
this._nodeCache.gc(length);
this._keyCache.gc(length);
}
_makeSnapshot() {
if (this._sessions === false) return this.core;
return this._checkout <= this.core.length || this._checkout <= 1 ? this.core.snapshot() : this.core.session({ snapshot: false });
}
async clearUnlinked(options = {}) {
await this.ready();
const { gte = 0, lt = this.version - 1, batchSize = 4096, wait = true } = options;
const checkout = this.version;
let prev = this.batch({ wait: false, checkout: gte });
let b = this.batch({ wait, checkout });
const iteBatch = this.batch({ wait: false, checkout });
const ite = new LocalBlockIterator(iteBatch, { gte, lt });
await ite.open();
let ticks = 0;
while (true) {
const data = await ite.next();
if (!data) break;
if (!await isLinked(b, data)) {
if (b.core.closing || this.core.closing || this.closing) break;
await this.core.clear(data.seq);
}
const prevNode = await prev.get(data.key, { finalize: false }).catch(toNull);
if (prevNode && !await isLinked(b, prevNode)) {
if (b.core.closing || this.core.closing || this.closing) break;
await this.core.clear(prevNode.seq);
}
if (ticks++ >= batchSize) {
ticks = 0;
await prev.close();
await b.close();
prev = this.batch({ wait: false, checkout: gte });
b = this.batch({ wait, checkout });
}
}
if (b.core.closing || this.core.closing || this.closing) throw new Error("Core is closed");
await b.close();
await prev.close();
await ite.close();
await iteBatch.close();
return lt;
}
checkout(version3, opts = {}) {
if (version3 === 0) version3 = 1;
const snap = opts.reuseSession || this._sessions === false ? this.core : version3 <= this.core.length || version3 <= 1 ? this.core.snapshot() : this.core.session({ snapshot: false });
return new _Hyperbee(snap, {
_view: true,
_sub: false,
prefix: this.prefix,
sep: this.sep,
lock: this.lock,
checkout: version3,
keyEncoding: opts.keyEncoding || this.keyEncoding,
valueEncoding: opts.valueEncoding || this.valueEncoding,
extension: this.extension !== null ? this.extension : false
});
}
snapshot(opts) {
return this.checkout(
this.core.opened === false || this._checkout <= 0 ? -1 : Math.max(1, this.version),
opts
);
}
sub(prefix, opts = {}) {
let sep = opts.sep || this.sep;
if (!b4a4.isBuffer(sep)) sep = b4a4.from(sep);
prefix = b4a4.concat([this.prefix || EMPTY, b4a4.from(prefix), sep]);
const valueEncoding = codecs(opts.valueEncoding || this.valueEncoding);
const keyEncoding = codecs(opts.keyEncoding || this._unprefixedKeyEncoding);
return new _Hyperbee(this.core, {
_view: true,
_sub: true,
prefix,
sep: this.sep,
lock: this.lock,
checkout: this._checkout,
valueEncoding,
keyEncoding,
extension: this.extension !== null ? this.extension : false,
metadata: this.metadata
});
}
async getHeader(opts) {
const blk = await this.core.get(0, opts);
try {
return blk && Header.decode(blk);
} catch {
throw DECODING_ERROR();
}
}
async _close() {
if (!this._view) {
if (this._keyCache) this._keyCache.clear();
if (this._nodeCache) this._nodeCache.clear();
}
if (this._watchers) {
this.core.off("append", this._onappendBound);
this.core.off("truncate", this._ontruncateBound);
while (this._watchers.length) {
await this._watchers[this._watchers.length - 1].close();
}
}
if (this._entryWatchers) {
while (this._entryWatchers.length) {
await this._entryWatchers[this._entryWatchers.length - 1].close();
}
}
while (this._batches.length) {
await this._batches[this._batches.length - 1].close();
}
return this.core.close();
}
static async isHyperbee(core, opts) {
await core.ready();
const blk0 = await core.get(0, opts);
if (blk0 === null) throw BLOCK_NOT_AVAILABLE();
try {
return Header.decode(blk0).protocol === "hyperbee";
} catch (err) {
return false;
}
}
};
var Batch = class {
constructor(tree, core, batchLock, cache, options = {}) {
this.tree = tree;
this.feed = core;
this.core = core;
this.index = tree._batches.push(this) - 1;
this.blocks = cache ? /* @__PURE__ */ new Map() : null;
this.autoFlush = !batchLock;
this.maxBlocksCached = options.maxBlocksCached || 128;
this.rootSeq = 0;
this.root = null;
this.length = 0;
this.checkout = options.checkout === void 0 ? -1 : options.checkout;
this.options = options;
this.locked = null;
this.batchLock = batchLock;
this.onseq = this.options.onseq || noop;
this.appending = null;
this.isSnapshot = this.core !== this.tree.core;
this.shouldUpdate = this.options.update !== false;
this.updating = null;
this.encoding = {
key: options.keyEncoding ? codecs(options.keyEncoding) : tree.keyEncoding,
value: options.valueEncoding ? codecs(options.valueEncoding) : tree.valueEncoding
};
}
async ready() {
if (this.core.opened === false) await this.core.ready();
if (this.tree.opened === false) await this.tree.ready();
}
async lock() {
if (this.tree.readonly) throw new Error("Hyperbee is marked as read-only");
if (this.locked === null) this.locked = await this.tree.lock();
}
get version() {
if (this.checkout !== -1) return Math.max(1, this.checkout);
return Math.max(1, this.tree._checkout || this.core.length + this.length);
}
async getRoot(ensureHeader) {
await this.ready();
if (ensureHeader) {
if (this.core.length === 0 && this.core.writable && !this.tree.readonly) {
await this.core.append(
Header.encode({
protocol: "hyperbee",
metadata: this.tree.metadata
})
);
}
}
if (this.tree._checkout === 0 && this.checkout === -1 && this.shouldUpdate) {
if (this.updating === null) this.updating = this.core.update();
await this.updating;
}
if (this.version < 2) return null;
return (await this.getBlock(this.version - 1)).getTreeNode(0);
}
async getKey(seq) {
await this.tree._cacheLock.enter(seq);
try {
const k = this.core.fork === this.tree.core.fork ? this.tree._keyCache.get(seq) : null;
if (k !== null) return k;
const key = (await this._getBlock(seq)).key;
if (this.core.fork === this.tree.core.fork) this.tree._keyCache.set(seq, key);
return key;
} finally {
this.tree._cacheLock.exit(seq);
}
}
async _getNode(seq) {
const cached = this.tree._nodeCache !== null && this.core.fork === this.tree.core.fork ? this.tree._nodeCache.get(seq) : null;
if (cached !== null) return cached;
const entry = await this.core.get(seq, {
...this.options,
valueEncoding: Node
});
if (entry === null) throw BLOCK_NOT_AVAILABLE();
const wrap = copyEntry(entry);
if (this.core.fork === this.tree.core.fork && this.tree._nodeCache !== null) {
this.tree._nodeCache.set(seq, wrap);
}
return wrap;
}
async getBlock(seq) {
if (this.rootSeq === 0) this.rootSeq = seq;
await this.tree._cacheLock.enter(seq);
try {
return await this._getBlock(seq);
} finally {
this.tree._cacheLock.exit(seq);
}
}
async _getBlock(seq) {
let b = this.blocks && this.blocks.get(seq);
if (b) return b;
this.onseq(seq);
const entry = await this._getNode(seq);
b = this.blocks && this.blocks.get(seq);
if (b) return b;
b = new BlockEntry(seq, this, entry);
if (this.blocks && this.blocks.size - this.length < this.maxBlocksCached) {
this.blocks.set(seq, b);
}
return b;
}
_onwait(key) {
this.options.onwait = null;
this.tree.extension.get(this.rootSeq + 1, key);
}
_getEncoding(opts) {
if (!opts) return this.encoding;
return {
key: opts.keyEncoding ? codecs(opts.keyEncoding) : this.encoding.key,
value: opts.valueEncoding ? codecs(opts.valueEncoding) : this.encoding.value
};
}
peek(range, opts) {
return iteratorPeek(this.createRangeIterator(range, { ...opts, limit: 1 }));
}
createRangeIterator(range, opts = {}) {
opts = opts ? { ...opts, ...range } : range;
const encoding = this._getEncoding(opts);
return new RangeIterator(
this,
encoding,
encRange(encoding.key, { ...opts, sub: this.tree._sub })
);
}
createReadStream(range, opts) {
const signal = opts && opts.signal || null;
return iteratorToStream(this.createRangeIterator(range, opts), signal);
}
async getBySeq(seq, opts) {
const encoding = this._getEncoding(opts);
try {
const block = (await this.getBlock(seq)).final(encoding);
return { key: block.key, value: block.value };
} finally {
await this._closeSnapshot();
}
}
async get(key, opts) {
const encoding = this._getEncoding(opts);
const finalize = opts ? opts.finalize !== false : true;
try {
return await this._get(key, encoding, finalize);
} finally {
await this._closeSnapshot();
}
}
async _get(key, encoding, finalize) {
key = enc(encoding.key, key);
if (this.tree.extension !== null && this.options.extension !== false) {
this.options.onwait = this._onwait.bind(this, key);
}
let node = await this.getRoot(false);
if (!node) return null;
while (true) {
if (node.block.isTarget(key)) {
return node.block.isDeletion() ? null : finalize ? node.block.final(encoding) : node.block;
}
let s = 0;
let e = node.keys.length;
let c4;
while (s < e) {
const mid = s + e >> 1;
c4 = b4a4.compare(key, await node.getKey(mid));
if (c4 === 0) {
const block = await this.getBlock(node.keys[mid].seq);
return finalize ? block.final(encoding) : block;
}
if (c4 < 0) e = mid;
else s = mid + 1;
}
if (!node.children.length) return null;
const i = c4 < 0 ? e : s;
node = await node.getChildNode(i);
}
}
async links(key, seq) {
let node = await this.getRoot(false);
if (!node) return false;
if (node.block.seq === seq) return true;
while (true) {
if (node.block.isTarget(key)) return false;
let s = 0;
let e = node.keys.length;
let c4;
while (s < e) {
const mid = s + e >> 1;
if (node.keys[mid].seq === seq) return true;
c4 = b4a4.compare(key, await node.getKey(mid));
if (c4 === 0) return false;
if (c4 < 0) e = mid;
else s = mid + 1;
}
if (!node.children.length) return false;
const i = c4 < 0 ? e : s;
node = await node.getChildNode(i);
if (node.block.seq === seq) return true;
}
}
async put(key, value, opts) {
const release = this.batchLock ? await this.batchLock() : null;
const cas = opts && opts.cas || null;
const encoding = this._getEncoding(opts);
if (!this.locked) await this.lock();
if (!release) return this._put(key, value, encoding, cas);
try {
return await this._put(key, value, encoding, cas);
} finally {
release();
}
}
async _put(key, value, encoding, cas) {
const newNode = {
seq: 0,
key,
value
};
key = enc(encoding.key, key);
value = enc(encoding.value, value);
const stack = [];
let root;
let node = root = await this.getRoot(true);
if (!node) node = root = TreeNode.create(null);
const seq = newNode.seq = this.core.length + this.length;
const target = new Key(seq, key);
while (node.children.length) {
stack.push(node);
node.changed = true;
let s = 0;
let e = node.keys.length;
let c4;
while (s < e) {
const mid = s + e >> 1;
c4 = b4a4.compare(target.value, await node.getKey(mid));
if (c4 === 0) {
if (cas) {
const prev = await node.getKeyNode(mid);
if (!await cas(prev.final(encoding), newNode)) return this._unlockMaybe();
}
if (!this.tree.alwaysDuplicate) {
const prev = await node.getKeyNode(mid);
if (sameValue(prev.value, value)) return this._unlockMaybe();
}
node.setKey(mid, target);
return this._append(root, seq, key, value);
}
if (c4 < 0) e = mid;
else s = mid + 1;
}
const i = c4 < 0 ? e : s;
node = await node.getChildNode(i);
}
let needsSplit = !await node.insertKey(target, value, null, newNode, encoding, cas);
if (!node.changed) return this._unlockMaybe();
while (needsSplit) {
const parent = stack.pop();
const { median, right } = await node.split();
if (parent) {
needsSplit = !await parent.insertKey(median, value, right, null, encoding, null);
node = parent;
} else {
root = TreeNode.create(node.block);
root.changed = true;
root.keys.push(median);
root.children.push(new Child(0, 0, node), new Child(0, 0, right));
needsSplit = false;
}
}
return this._append(root, seq, key, value);
}
async del(key, opts) {
const release = this.batchLock ? await this.batchLock() : null;
const cas = opts && opts.cas || null;
const encoding = this._getEncoding(opts);
if (!this.locked) await this.lock();
if (!release) return this._del(key, encoding, cas);
try {
return await this._del(key, encoding, cas);
} finally {
release();
}
}
async _del(key, encoding, cas) {
const delNode = {
seq: 0,
key,
value: null
};
key = enc(encoding.key, key);
const stack = [];
let node = await this.getRoot(true);
if (!node) return this._unlockMaybe();
const seq = delNode.seq = this.core.length + this.length;
while (true) {
stack.push(node);
let s = 0;
let e = node.keys.length;
let c4;
while (s < e) {
const mid = s + e >> 1;
c4 = b4a4.compare(key, await node.getKey(mid));
if (c4 === 0) {
if (cas) {
const prev = await node.getKeyNode(mid);
if (!await cas(prev.final(encoding), delNode)) return this._unlockMaybe();
}
if (node.children.length) await setKeyToNearestLeaf(node, mid, stack);
else node.removeKey(mid);
for (const node2 of stack) node2.changed = true;
return this._append(await rebalance(stack), seq, key, null);
}
if (c4 < 0) e = mid;
else s = mid + 1;
}
if (!node.children.length) return this._unlockMaybe();
const i = c4 < 0 ? e : s;
node = await node.getChildNode(i);
}
}
async _closeSnapshot() {
if (this.isSnapshot) {
await this.core.close();
this._finalize();
}
}
async close() {
if (this.isSnapshot) return this._closeSnapshot();
this.root = null;
if (this.blocks) this.blocks.clear();
this.length = 0;
this._unlock();
}
destroy() {
this.close().catch(noop);
}
toBlocks() {
if (this.appending) return this.appending;
const batch = new Array(this.length);
for (let i = 0; i < this.length; i++) {
const seq = this.core.length + i;
const { pendingIndex, key, value } = this.blocks.get(seq);
if (i < this.length - 1) {
pendingIndex[0] = null;
let j = 0;
while (j < pendingIndex.length) {
const idx = pendingIndex[j];
if (idx !== null && idx.seq === seq) {
idx.offset = j++;
continue;
}
if (j === pendingIndex.length - 1) pendingIndex.pop();
else pendingIndex[j] = pendingIndex.pop();
}
}
batch[i] = Node.encode({
key,
value,
index: deflate(pendingIndex)
});
}
this.appending = batch;
return batch;
}
flush() {
if (!this.length) return this.close();
const batch = this.toBlocks();
this.root = null;
this.blocks.clear();
this.length = 0;
return this._appendBatch(batch);
}
_unlockMaybe() {
if (this.autoFlush) this._unlock();
}
_unlock() {
const locked = this.locked;
this.locked = null;
if (locked !== null) locked();
this._finalize();
}
_finalize() {
if (this.index >= this.tree._batches.length || this.tree._batches[this.index] !== this) return;
const top = this.tree._batches.pop();
if (top === this) return;
top.index = this.index;
this.tree._batches[top.index] = top;
}
_append(root, seq, key, value) {
const index = [];
root.indexChanges(index, seq);
index[0] = new Child(seq, 0, root);
if (!this.autoFlush) {
const block = new BatchEntry(seq, this, key, value, index);
root.block = block;
this.root = root;
this.length++;
this.blocks.set(seq, block);
root.updateChildren(seq, block);
return;
}
return this._appendBatch(
Node.encode({
key,
value,
index: deflate(index)
})
);
}
async _appendBatch(raw) {
try {
await this.core.append(raw);
} finally {
this._unlock();
}
}
};
var EntryWatcher = class extends ReadyResource {
constructor(bee, key, opts = {}) {
super();
this.keyEncoding = opts.keyEncoding || bee.keyEncoding;
this.valueEncoding = opts.valueEncoding || bee.valueEncoding;
this.index = bee._entryWatchers.push(this) - 1;
this.bee = bee;
this.key = key;
this.node = null;
this._forceUpdate = false;
this._debouncedUpdate = debounce(this._processUpdate.bind(this));
}
_close() {
const top = this.bee._entryWatchers.pop();
if (top !== this) {
top.index = this.index;
this.bee._entryWatchers[top.index] = top;
}
}
_onappend() {
this._debouncedUpdate();
}
_ontruncate() {
this._forceUpdate = true;
this._debouncedUpdate();
}
async _processUpdate() {
const force = this._forceUpdate;
this._forceUpdate = false;
let newNode;
try {
newNode = await this.bee.get(this.key, {
keyEncoding: this.keyEncoding,
valueEncoding: this.valueEncoding
});
} catch (e) {
if (e.code === "SNAPSHOT_NOT_AVAILABLE") {
return;
} else if (this.bee.closing) {
this.close().catch(safetyCatch);
return;
}
this.emit("error", e);
return;
}
if (force || newNode?.seq !== this.node?.seq) {
this.node = newNode;
this.emit("update");
}
}
};
var Watcher = class extends ReadyResource {
constructor(bee, range, opts = {}) {
super();
this.keyEncoding = opts.keyEncoding || bee.keyEncoding;
this.valueEncoding = opts.valueEncoding || bee.valueEncoding;
this.index = bee._watchers.push(this) - 1;
this.bee = bee;
this.core = bee.core;
this.latestDiff = 0;
this.range = range;
this.map = opts.map || defaultWatchMap;
this.current = null;
this.previous = null;
this.currentMapped = null;
this.previousMapped = null;
this.stream = null;
this._lock = mutexify();
this._flowing = false;
this._resolveOnChange = null;
this._differ = opts.differ || defaultDiffer;
this._eager = !!opts.eager;
this._onchange = opts.onchange || null;
this.on("newListener", autoFlowOnUpdate);
this.ready().catch(safetyCatch);
}
async _consume() {
if (this._flowing) return;
try {
for await (const _ of this) {
}
} catch {
}
}
async _open() {
await this.bee.ready();
const opts = {
keyEncoding: this.keyEncoding,
valueEncoding: this.valueEncoding
};
this.current = this._eager ? this.bee.checkout(1, opts) : this.bee.snapshot(opts);
await this.current.ready();
if (this._onchange) {
if (this._eager) await this._onchange();
this._consume();
}
}
[Symbol.asyncIterator]() {
this._flowing = true;
return this;
}
_ontruncate() {
this._onappend();
}
_onappend() {
const resolve = this._resolveOnChange;
this._resolveOnChange = null;
if (resolve) resolve();
}
async _waitForChanges() {
if (this.current.version < this.bee.version || this.closing) return;
await new Promise((resolve) => {
this._resolveOnChange = resolve;
});
}
async next() {
try {
return await this._next();
} catch (err) {
if (this.closing) return { value: void 0, done: true };
await this.close();
throw err;
}
}
async _next() {
const release = await this._lock();
try {
if (this.closing) return { value: void 0, done: true };
if (!this.opened) await this.ready();
while (true) {
await this._waitForChanges();
if (this.closing) return { value: void 0, done: true };
await this._closePrevious();
this.previous = this.current.snapshot();
await this._closeCurrent();
this.current = this.bee.snapshot({
keyEncoding: this.keyEncoding,
valueEncoding: this.valueEncoding
});
await this.current.ready();
await this.previous.ready();
if (this.current.core.fork !== this.previous.core.fork) {
return await this._yield();
}
this.stream = this._differ(this.current, this.previous, this.range);
try {
for await (const data of this.stream) {
return await this._yield();
}
} finally {
this.stream = null;
}
}
} finally {
release();
}
}
async _yield() {
this.currentMapped = this.map(this.current);
this.previousMapped = this.map(this.previous);
if (this._onchange) {
try {
await this._onchange();
} catch (err) {
safetyCatch(err);
}
}
this.emit("update");
return { done: false, value: [this.currentMapped, this.previousMapped] };
}
async return() {
await this.close();
return { done: true };
}
async _close() {
const top = this.bee._watchers.pop();
if (top !== this) {
top.index = this.index;
this.bee._watchers[top.index] = top;
}
if (this.stream && !this.stream.destroying) {
this.stream.destroy();
}
this._onappend();
await this._closeCurrent().catch(safetyCatch);
await this._closePrevious().catch(safetyCatch);
const release = await this._lock();
release();
}
destroy() {
return this.close();
}
async _closeCurrent() {
if (this.currentMapped) await this.currentMapped.close();
if (this.current) await this.current.close();
this.current = this.currentMapped = null;
}
async _closePrevious() {
if (this.previousMapped) await this.previousMapped.close();
if (this.previous) await this.previous.close();
this.previous = this.previousMapped = null;
}
};
function autoFlowOnUpdate(name) {
if (name === "update") this._consume();
}
function defaultWatchMap(snapshot) {
return snapshot;
}
async function leafSize(node, goLeft) {
while (node.children.length) node = await node.getChildNode(goLeft ? 0 : node.children.length - 1);
return node.keys.length;
}
async function setKeyToNearestLeaf(node, index, stack) {
let [left, right] = await Promise.all([node.getChildNode(index), node.getChildNode(index + 1)]);
const [ls, rs] = await Promise.all([leafSize(left, false), leafSize(right, true)]);
if (ls < rs) {
stack.push(right);
while (right.children.length) stack.push(right = right.children[0].value);
node.keys[index] = right.keys.shift();
} else {
stack.push(left);
while (left.children.length) stack.push(left = left.children[left.children.length - 1].value);
node.keys[index] = left.keys.pop();
}
}
async function rebalance(stack) {
const root = stack[0];
while (stack.length > 1) {
const node = stack.pop();
const parent = stack[stack.length - 1];
if (node.keys.length >= MIN_KEYS) return root;
let { left, index, right } = await node.siblings(parent);
if (left && left.keys.length > MIN_KEYS) {
left.changed = true;
node.keys.unshift(parent.keys[index - 1]);
if (left.children.length) node.children.unshift(left.children.pop());
parent.keys[index - 1] = left.keys.pop();
return root;
}
if (right && right.keys.length > MIN_KEYS) {
right.changed = true;
node.keys.push(parent.keys[index]);
if (right.children.length) node.children.push(right.children.shift());
parent.keys[index] = right.keys.shift();
return root;
}
if (left) {
index--;
right = node;
} else {
left = node;
}
left.merge(right, parent.keys[index]);
parent.removeKey(index);
}
if (!root.keys.length && root.children.length) return root.getChildNode(0);
return root;
}
function iteratorToStream(ite, signal) {
let done;
let closing;
const rs = new Readable({
signal,
open(cb) {
done = cb;
ite.open().then(fin, fin);
},
read(cb) {
done = cb;
ite.next().then(push, fin);
},
predestroy() {
closing = ite.close();
closing.catch(noop);
},
destroy(cb) {
done = cb;
if (!closing) closing = ite.close();
closing.then(fin, fin);
}
});
return rs;
function fin(err) {
done(err);
}
function push(val) {
rs.push(val);
done(null);
}
}
async function iteratorPeek(ite) {
try {
await ite.open();
return await ite.next();
} finally {
await ite.close();
}
}
function encRange(e, opts) {
if (!e) return opts;
if (e.encodeRange) {
const r = e.encodeRange({
gt: opts.gt,
gte: opts.gte,
lt: opts.lt,
lte: opts.lte
});
opts.gt = r.gt;
opts.gte = r.gte;
opts.lt = r.lt;
opts.lte = r.lte;
return opts;
}
if (opts.gt !== void 0) opts.gt = enc(e, opts.gt);
if (opts.gte !== void 0) opts.gte = enc(e, opts.gte);
if (opts.lt !== void 0) opts.lt = enc(e, opts.lt);
if (opts.lte !== void 0) opts.lte = enc(e, opts.lte);
if (opts.sub && !opts.gt && !opts.gte) opts.gt = enc(e, SEP);
if (opts.sub && !opts.lt && !opts.lte) opts.lt = bump(enc(e, EMPTY));
return opts;
}
function bump(key) {
key[key.length - 1]++;
return key;
}
function enc(e, v) {
if (v === void 0 || v === null) return null;
if (e !== null) return e.encode(v);
if (typeof v === "string") return b4a4.from(v);
return v;
}
function prefixEncoding(prefix, keyEncoding) {
return {
encode(key) {
return b4a4.concat([prefix, b4a4.isBuffer(key) ? key : enc(keyEncoding, key)]);
},
decode(key) {
const sliced = key.slice(prefix.length, key.length);
return keyEncoding ? keyEncoding.decode(sliced) : sliced;
}
};
}
function copyEntry(entry) {
let key = entry.key;
let value = entry.value;
let index = entry.index;
const size = key.byteLength + (value === null ? 0 : value.byteLength) + (index === null ? 0 : index.byteLength);
if (2 * size < key.buffer.byteLength) {
const [newKey, newValue, newIndex] = unslabAll([entry.key, entry.value, entry.index]);
key = newKey;
value = newValue;
index = newIndex;
}
return {
key,
value,
index,
inflated: null
};
}
function defaultDiffer(currentSnap, previousSnap, opts) {
return currentSnap.createDiffStream(previousSnap, opts);
}
function toNull() {
return null;
}
function getBackingCore(core) {
if (core.core) return core;
if (core.getBackingCore) return core.getBackingCore().session;
return null;
}
function sameValue(a, b) {
return a === b || a !== null && b !== null && b4a4.equals(a, b);
}
function noop() {
}
function getExtension(db, opts) {
if (opts.extension === false) return null;
if (opts.extension && opts.extension !== true) return opts.extension;
return Extension.register(db);
}
async function isLinked(batch, block) {
const seq = block.seq;
block.inflate();
const keys = [block.key];
const wait = batch.options.wait;
for (const l of block.index.levels) {
if (!l.keys.length) continue;
batch.options.wait = false;
try {
keys.push(await batch.getKey(l.keys[0].seq));
} catch {
}
batch.options.wait = wait;
}
for (const k of keys) {
if (await batch.links(k, seq)) return true;
}
if (batch.core.closing) throw new Error("Core is closed");
return false;
}
module2.exports = Hyperbee;
}
});
// node_modules/compact-encoding/endian.js
var require_endian = __commonJS({
"node_modules/compact-encoding/endian.js"(exports2) {
var LE = exports2.LE = new Uint8Array(new Uint16Array([255]).buffer)[0] === 255;
exports2.BE = !LE;
}
});
// node_modules/compact-encoding/raw.js
var require_raw = __commonJS({
"node_modules/compact-encoding/raw.js"(exports2, module2) {
var b4a4 = require_b4a();
var { BE } = require_endian();
exports2 = module2.exports = {
preencode(state, b) {
state.end += b.byteLength;
},
encode(state, b) {
state.buffer.set(b, state.start);
state.start += b.byteLength;
},
decode(state) {
const b = state.buffer.subarray(state.start, state.end);
state.start = state.end;
return b;
}
};
var buffer = exports2.buffer = {
preencode(state, b) {
if (b) uint8array.preencode(state, b);
else state.end++;
},
encode(state, b) {
if (b) uint8array.encode(state, b);
else state.buffer[state.start++] = 0;
},
decode(state) {
const b = state.buffer.subarray(state.start);
if (b.byteLength === 0) return null;
state.start = state.end;
return b;
}
};
exports2.binary = {
...buffer,
preencode(state, b) {
if (typeof b === "string") utf8.preencode(state, b);
else buffer.preencode(state, b);
},
encode(state, b) {
if (typeof b === "string") utf8.encode(state, b);
else buffer.encode(state, b);
}
};
exports2.arraybuffer = {
preencode(state, b) {
state.end += b.byteLength;
},
encode(state, b) {
const view = new Uint8Array(b);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
const b = new ArrayBuffer(state.end - state.start);
const view = new Uint8Array(b);
view.set(state.buffer.subarray(state.start));
state.start = state.end;
return b;
}
};
function typedarray(TypedArray, swap) {
const n = TypedArray.BYTES_PER_ELEMENT;
return {
preencode(state, b) {
state.end += b.byteLength;
},
encode(state, b) {
const view = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
if (BE && swap) swap(view);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
let b = state.buffer.subarray(state.start);
if (b.byteOffset % n !== 0) b = new Uint8Array(b);
if (BE && swap) swap(b);
state.start = state.end;
return new TypedArray(b.buffer, b.byteOffset, b.byteLength / n);
}
};
}
var uint8array = exports2.uint8array = typedarray(Uint8Array);
exports2.uint16array = typedarray(Uint16Array, b4a4.swap16);
exports2.uint32array = typedarray(Uint32Array, b4a4.swap32);
exports2.int8array = typedarray(Int8Array);
exports2.int16array = typedarray(Int16Array, b4a4.swap16);
exports2.int32array = typedarray(Int32Array, b4a4.swap32);
exports2.biguint64array = typedarray(BigUint64Array, b4a4.swap64);
exports2.bigint64array = typedarray(BigInt64Array, b4a4.swap64);
exports2.float32array = typedarray(Float32Array, b4a4.swap32);
exports2.float64array = typedarray(Float64Array, b4a4.swap64);
function string(encoding) {
return {
preencode(state, s) {
state.end += b4a4.byteLength(s, encoding);
},
encode(state, s) {
state.start += b4a4.write(state.buffer, s, state.start, encoding);
},
decode(state) {
const s = b4a4.toString(state.buffer, encoding, state.start);
state.start = state.end;
return s;
}
};
}
var utf8 = exports2.string = exports2.utf8 = string("utf-8");
exports2.ascii = string("ascii");
exports2.hex = string("hex");
exports2.base64 = string("base64");
exports2.ucs2 = exports2.utf16le = string("utf16le");
exports2.array = function array(enc) {
return {
preencode(state, list) {
for (const value of list) enc.preencode(state, value);
},
encode(state, list) {
for (const value of list) enc.encode(state, value);
},
decode(state) {
const arr = [];
while (state.start < state.end) arr.push(enc.decode(state));
return arr;
}
};
};
exports2.json = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v));
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v));
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
exports2.ndjson = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v) + "\n");
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v) + "\n");
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
}
});
// node_modules/compact-encoding/lexint.js
var require_lexint = __commonJS({
"node_modules/compact-encoding/lexint.js"(exports2, module2) {
module2.exports = {
preencode,
encode: encode2,
decode: decode2
};
function preencode(state, num) {
if (num < 251) {
state.end++;
} else if (num < 256) {
state.end += 2;
} else if (num < 65536) {
state.end += 3;
} else if (num < 16777216) {
state.end += 4;
} else if (num < 4294967296) {
state.end += 5;
} else {
state.end++;
const exp = Math.floor(Math.log(num) / Math.log(2)) - 32;
preencode(state, exp);
state.end += 6;
}
}
function encode2(state, num) {
const max = 251;
const x = num - max;
if (num < max) {
state.buffer[state.start++] = num;
} else if (num < 256) {
state.buffer[state.start++] = max;
state.buffer[state.start++] = x;
} else if (num < 65536) {
state.buffer[state.start++] = max + 1;
state.buffer[state.start++] = x >> 8 & 255;
state.buffer[state.start++] = x & 255;
} else if (num < 16777216) {
state.buffer[state.start++] = max + 2;
state.buffer[state.start++] = x >> 16;
state.buffer[state.start++] = x >> 8 & 255;
state.buffer[state.start++] = x & 255;
} else if (num < 4294967296) {
state.buffer[state.start++] = max + 3;
state.buffer[state.start++] = x >> 24;
state.buffer[state.start++] = x >> 16 & 255;
state.buffer[state.start++] = x >> 8 & 255;
state.buffer[state.start++] = x & 255;
} else {
const exp = Math.floor(Math.log(x) / Math.log(2)) - 32;
state.buffer[state.start++] = 255;
encode2(state, exp);
const rem = x / Math.pow(2, exp - 11);
for (let i = 5; i >= 0; i--) {
state.buffer[state.start++] = rem / Math.pow(2, 8 * i) & 255;
}
}
}
function decode2(state) {
const max = 251;
if (state.end - state.start < 1) throw new Error("Out of bounds");
const flag = state.buffer[state.start++];
if (flag < max) return flag;
if (state.end - state.start < flag - max + 1) {
throw new Error("Out of bounds.");
}
if (flag < 252) {
return state.buffer[state.start++] + max;
}
if (flag < 253) {
return (state.buffer[state.start++] << 8) + state.buffer[state.start++] + max;
}
if (flag < 254) {
return (state.buffer[state.start++] << 16) + (state.buffer[state.start++] << 8) + state.buffer[state.start++] + max;
}
if (flag < 255) {
return state.buffer[state.start++] * 16777216 + (state.buffer[state.start++] << 16) + (state.buffer[state.start++] << 8) + state.buffer[state.start++] + max;
}
const exp = decode2(state);
if (state.end - state.start < 6) throw new Error("Out of bounds");
let rem = 0;
for (let i = 5; i >= 0; i--) {
rem += state.buffer[state.start++] * Math.pow(2, 8 * i);
}
return rem * Math.pow(2, exp - 11) + max;
}
}
});
// node_modules/compact-encoding/index.js
var require_compact_encoding = __commonJS({
"node_modules/compact-encoding/index.js"(exports2) {
var b4a4 = require_b4a();
var { BE } = require_endian();
exports2.state = function(start = 0, end = 0, buffer2 = null) {
return { start, end, buffer: buffer2 };
};
var raw = exports2.raw = require_raw();
var uint = exports2.uint = {
preencode(state, n) {
state.end += n <= 252 ? 1 : n <= 65535 ? 3 : n <= 4294967295 ? 5 : 9;
},
encode(state, n) {
if (n <= 252) uint8.encode(state, n);
else if (n <= 65535) {
state.buffer[state.start++] = 253;
uint16.encode(state, n);
} else if (n <= 4294967295) {
state.buffer[state.start++] = 254;
uint32.encode(state, n);
} else {
state.buffer[state.start++] = 255;
uint64.encode(state, n);
}
},
decode(state) {
const a = uint8.decode(state);
if (a <= 252) return a;
if (a === 253) return uint16.decode(state);
if (a === 254) return uint32.decode(state);
return uint64.decode(state);
}
};
var uint8 = exports2.uint8 = {
preencode(state, n) {
state.end += 1;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
},
decode(state) {
if (state.start >= state.end) throw new Error("Out of bounds");
return state.buffer[state.start++];
}
};
var uint16 = exports2.uint16 = {
preencode(state, n) {
state.end += 2;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
state.buffer[state.start++] = n >>> 8;
},
decode(state) {
if (state.end - state.start < 2) throw new Error("Out of bounds");
return state.buffer[state.start++] + state.buffer[state.start++] * 256;
}
};
var uint24 = exports2.uint24 = {
preencode(state, n) {
state.end += 3;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n >>> 16;
},
decode(state) {
if (state.end - state.start < 3) throw new Error("Out of bounds");
return state.buffer[state.start++] + state.buffer[state.start++] * 256 + state.buffer[state.start++] * 65536;
}
};
var uint32 = exports2.uint32 = {
preencode(state, n) {
state.end += 4;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n >>> 16;
state.buffer[state.start++] = n >>> 24;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
return state.buffer[state.start++] + state.buffer[state.start++] * 256 + state.buffer[state.start++] * 65536 + state.buffer[state.start++] * 16777216;
}
};
var uint40 = exports2.uint40 = {
preencode(state, n) {
state.end += 5;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 256);
uint8.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 5) throw new Error("Out of bounds");
return uint8.decode(state) + 256 * uint32.decode(state);
}
};
var uint48 = exports2.uint48 = {
preencode(state, n) {
state.end += 6;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 65536);
uint16.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 6) throw new Error("Out of bounds");
return uint16.decode(state) + 65536 * uint32.decode(state);
}
};
var uint56 = exports2.uint56 = {
preencode(state, n) {
state.end += 7;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 16777216);
uint24.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 7) throw new Error("Out of bounds");
return uint24.decode(state) + 16777216 * uint32.decode(state);
}
};
var uint64 = exports2.uint64 = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 4294967296);
uint32.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
return uint32.decode(state) + 4294967296 * uint32.decode(state);
}
};
var int = exports2.int = zigZagInt(uint);
exports2.int8 = zigZagInt(uint8);
exports2.int16 = zigZagInt(uint16);
exports2.int24 = zigZagInt(uint24);
exports2.int32 = zigZagInt(uint32);
exports2.int40 = zigZagInt(uint40);
exports2.int48 = zigZagInt(uint48);
exports2.int56 = zigZagInt(uint56);
exports2.int64 = zigZagInt(uint64);
var biguint64 = exports2.biguint64 = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
view.setBigUint64(0, n, true);
state.start += 8;
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
const n = view.getBigUint64(0, true);
state.start += 8;
return n;
}
};
exports2.bigint64 = zigZagBigInt(biguint64);
var biguint = exports2.biguint = {
preencode(state, n) {
let len = 0;
for (let m = n; m; m = m >> 64n) len++;
uint.preencode(state, len);
state.end += 8 * len;
},
encode(state, n) {
let len = 0;
for (let m = n; m; m = m >> 64n) len++;
uint.encode(state, len);
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8 * len
);
for (let m = n, i = 0; m; m = m >> 64n, i += 8) {
view.setBigUint64(i, BigInt.asUintN(64, m), true);
}
state.start += 8 * len;
},
decode(state) {
const len = uint.decode(state);
if (state.end - state.start < 8 * len) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8 * len
);
let n = 0n;
for (let i = len - 1; i >= 0; i--)
n = (n << 64n) + view.getBigUint64(i * 8, true);
state.start += 8 * len;
return n;
}
};
exports2.bigint = zigZagBigInt(biguint);
exports2.lexint = require_lexint();
exports2.float32 = {
preencode(state, n) {
state.end += 4;
},
encode(state, n) {
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
4
);
view.setFloat32(0, n, true);
state.start += 4;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
4
);
const float = view.getFloat32(0, true);
state.start += 4;
return float;
}
};
exports2.float64 = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
view.setFloat64(0, n, true);
state.start += 8;
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
const float = view.getFloat64(0, true);
state.start += 8;
return float;
}
};
var buffer = exports2.buffer = {
preencode(state, b) {
if (b) uint8array.preencode(state, b);
else state.end++;
},
encode(state, b) {
if (b) uint8array.encode(state, b);
else state.buffer[state.start++] = 0;
},
decode(state) {
const len = uint.decode(state);
if (len === 0) return null;
if (state.end - state.start < len) throw new Error("Out of bounds");
return state.buffer.subarray(state.start, state.start += len);
}
};
exports2.binary = {
...buffer,
preencode(state, b) {
if (typeof b === "string") utf8.preencode(state, b);
else buffer.preencode(state, b);
},
encode(state, b) {
if (typeof b === "string") utf8.encode(state, b);
else buffer.encode(state, b);
}
};
exports2.arraybuffer = {
preencode(state, b) {
uint.preencode(state, b.byteLength);
state.end += b.byteLength;
},
encode(state, b) {
uint.encode(state, b.byteLength);
const view = new Uint8Array(b);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
const len = uint.decode(state);
const b = new ArrayBuffer(len);
const view = new Uint8Array(b);
view.set(state.buffer.subarray(state.start, state.start += len));
return b;
}
};
function typedarray(TypedArray, swap) {
const n = TypedArray.BYTES_PER_ELEMENT;
return {
preencode(state, b) {
uint.preencode(state, b.length);
state.end += b.byteLength;
},
encode(state, b) {
uint.encode(state, b.length);
const view = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
if (BE && swap) swap(view);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
const len = uint.decode(state);
let b = state.buffer.subarray(state.start, state.start += len * n);
if (b.byteLength !== len * n) throw new Error("Out of bounds");
if (b.byteOffset % n !== 0) b = new Uint8Array(b);
if (BE && swap) swap(b);
return new TypedArray(b.buffer, b.byteOffset, b.byteLength / n);
}
};
}
var uint8array = exports2.uint8array = typedarray(Uint8Array);
exports2.uint16array = typedarray(Uint16Array, b4a4.swap16);
exports2.uint32array = typedarray(Uint32Array, b4a4.swap32);
exports2.int8array = typedarray(Int8Array);
exports2.int16array = typedarray(Int16Array, b4a4.swap16);
exports2.int32array = typedarray(Int32Array, b4a4.swap32);
exports2.biguint64array = typedarray(BigUint64Array, b4a4.swap64);
exports2.bigint64array = typedarray(BigInt64Array, b4a4.swap64);
exports2.float32array = typedarray(Float32Array, b4a4.swap32);
exports2.float64array = typedarray(Float64Array, b4a4.swap64);
function string(encoding) {
return {
preencode(state, s) {
const len = b4a4.byteLength(s, encoding);
uint.preencode(state, len);
state.end += len;
},
encode(state, s) {
const len = b4a4.byteLength(s, encoding);
uint.encode(state, len);
b4a4.write(state.buffer, s, state.start, encoding);
state.start += len;
},
decode(state) {
const len = uint.decode(state);
if (state.end - state.start < len) throw new Error("Out of bounds");
return b4a4.toString(
state.buffer,
encoding,
state.start,
state.start += len
);
},
fixed(n) {
return {
preencode(state) {
state.end += n;
},
encode(state, s) {
b4a4.write(state.buffer, s, state.start, n, encoding);
state.start += n;
},
decode(state) {
if (state.end - state.start < n) throw new Error("Out of bounds");
return b4a4.toString(
state.buffer,
encoding,
state.start,
state.start += n
);
}
};
}
};
}
var utf8 = exports2.string = exports2.utf8 = string("utf-8");
exports2.ascii = string("ascii");
exports2.hex = string("hex");
exports2.base64 = string("base64");
exports2.ucs2 = exports2.utf16le = string("utf16le");
exports2.bool = {
preencode(state, b) {
state.end++;
},
encode(state, b) {
state.buffer[state.start++] = b ? 1 : 0;
},
decode(state) {
if (state.start >= state.end) throw Error("Out of bounds");
return state.buffer[state.start++] === 1;
}
};
var fixed = exports2.fixed = function fixed2(n) {
return {
preencode(state, s) {
if (s.byteLength !== n) throw new Error("Incorrect buffer size");
state.end += n;
},
encode(state, s) {
state.buffer.set(s, state.start);
state.start += n;
},
decode(state) {
if (state.end - state.start < n) throw new Error("Out of bounds");
return state.buffer.subarray(state.start, state.start += n);
}
};
};
exports2.fixed32 = fixed(32);
exports2.fixed64 = fixed(64);
exports2.array = function array(enc) {
return {
preencode(state, list) {
uint.preencode(state, list.length);
for (let i = 0; i < list.length; i++) enc.preencode(state, list[i]);
},
encode(state, list) {
uint.encode(state, list.length);
for (let i = 0; i < list.length; i++) enc.encode(state, list[i]);
},
decode(state) {
const len = uint.decode(state);
if (len > 1048576) throw new Error("Array is too big");
const arr = new Array(len);
for (let i = 0; i < len; i++) arr[i] = enc.decode(state);
return arr;
}
};
};
exports2.frame = function frame(enc) {
const dummy = exports2.state();
return {
preencode(state, m) {
const end = state.end;
enc.preencode(state, m);
uint.preencode(state, state.end - end);
},
encode(state, m) {
dummy.end = 0;
enc.preencode(dummy, m);
uint.encode(state, dummy.end);
enc.encode(state, m);
},
decode(state) {
const end = state.end;
const len = uint.decode(state);
state.end = state.start + len;
const m = enc.decode(state);
state.start = state.end;
state.end = end;
return m;
}
};
};
exports2.date = {
preencode(state, d) {
int.preencode(state, d.getTime());
},
encode(state, d) {
int.encode(state, d.getTime());
},
decode(state, d) {
return new Date(int.decode(state));
}
};
exports2.json = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v));
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v));
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
exports2.ndjson = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v) + "\n");
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v) + "\n");
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
exports2.none = {
preencode(state, n) {
},
encode(state, n) {
},
decode(state) {
return null;
}
};
var anyArray = {
preencode(state, arr) {
uint.preencode(state, arr.length);
for (let i = 0; i < arr.length; i++) {
any.preencode(state, arr[i]);
}
},
encode(state, arr) {
uint.encode(state, arr.length);
for (let i = 0; i < arr.length; i++) {
any.encode(state, arr[i]);
}
},
decode(state) {
const arr = [];
let len = uint.decode(state);
while (len-- > 0) {
arr.push(any.decode(state));
}
return arr;
}
};
var anyObject = {
preencode(state, o) {
const keys = Object.keys(o);
uint.preencode(state, keys.length);
for (const key of keys) {
utf8.preencode(state, key);
any.preencode(state, o[key]);
}
},
encode(state, o) {
const keys = Object.keys(o);
uint.encode(state, keys.length);
for (const key of keys) {
utf8.encode(state, key);
any.encode(state, o[key]);
}
},
decode(state) {
let len = uint.decode(state);
const o = {};
while (len-- > 0) {
const key = utf8.decode(state);
o[key] = any.decode(state);
}
return o;
}
};
var anyTypes = [
exports2.none,
exports2.bool,
exports2.string,
exports2.buffer,
exports2.uint,
exports2.int,
exports2.float64,
anyArray,
anyObject,
exports2.date
];
var any = exports2.any = {
preencode(state, o) {
const t = getType(o);
uint.preencode(state, t);
anyTypes[t].preencode(state, o);
},
encode(state, o) {
const t = getType(o);
uint.encode(state, t);
anyTypes[t].encode(state, o);
},
decode(state) {
const t = uint.decode(state);
if (t >= anyTypes.length) throw new Error("Unknown type: " + t);
return anyTypes[t].decode(state);
}
};
var port = exports2.port = uint16;
var address = (host, family) => {
return {
preencode(state, m) {
host.preencode(state, m.host);
port.preencode(state, m.port);
},
encode(state, m) {
host.encode(state, m.host);
port.encode(state, m.port);
},
decode(state) {
return {
host: host.decode(state),
family,
port: port.decode(state)
};
}
};
};
var ipv4 = exports2.ipv4 = {
preencode(state) {
state.end += 4;
},
encode(state, string2) {
const start = state.start;
const end = start + 4;
let i = 0;
while (i < string2.length) {
let n = 0;
let c4;
while (i < string2.length && (c4 = string2.charCodeAt(i++)) !== /* . */
46) {
n = n * 10 + (c4 - /* 0 */
48);
}
state.buffer[state.start++] = n;
}
state.start = end;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
return state.buffer[state.start++] + "." + state.buffer[state.start++] + "." + state.buffer[state.start++] + "." + state.buffer[state.start++];
}
};
exports2.ipv4Address = address(ipv4, 4);
var ipv6 = exports2.ipv6 = {
preencode(state) {
state.end += 16;
},
encode(state, string2) {
const start = state.start;
const end = start + 16;
let i = 0;
let split2 = null;
while (i < string2.length) {
let n = 0;
let c4;
while (i < string2.length && (c4 = string2.charCodeAt(i++)) !== /* : */
58) {
if (c4 >= 48 && c4 <= 57) n = n * 16 + (c4 - /* 0 */
48);
else if (c4 >= 65 && c4 <= 70) n = n * 16 + (c4 - /* A */
65 + 10);
else if (c4 >= 97 && c4 <= 102) n = n * 16 + (c4 - /* a */
97 + 10);
}
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n;
if (i < string2.length && string2.charCodeAt(i) === /* : */
58) {
i++;
split2 = state.start;
}
}
if (split2 !== null) {
const offset = end - state.start;
state.buffer.copyWithin(split2 + offset, split2).fill(0, split2, split2 + offset);
}
state.start = end;
},
decode(state) {
if (state.end - state.start < 16) throw new Error("Out of bounds");
return (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16);
}
};
exports2.ipv6Address = address(ipv6, 6);
var ip = exports2.ip = {
preencode(state, string2) {
const family = string2.includes(":") ? 6 : 4;
uint8.preencode(state, family);
if (family === 4) ipv4.preencode(state);
else ipv6.preencode(state);
},
encode(state, string2) {
const family = string2.includes(":") ? 6 : 4;
uint8.encode(state, family);
if (family === 4) ipv4.encode(state, string2);
else ipv6.encode(state, string2);
},
decode(state) {
const family = uint8.decode(state);
if (family === 4) return ipv4.decode(state);
else return ipv6.decode(state);
}
};
exports2.ipAddress = {
preencode(state, m) {
ip.preencode(state, m.host);
port.preencode(state, m.port);
},
encode(state, m) {
ip.encode(state, m.host);
port.encode(state, m.port);
},
decode(state) {
const family = uint8.decode(state);
return {
host: family === 4 ? ipv4.decode(state) : ipv6.decode(state),
family,
port: port.decode(state)
};
}
};
var record = exports2.record = function(keyEncoding, valueEncoding) {
return {
preencode(state, v) {
const keys = Object.keys(v);
uint.preencode(state, keys.length);
for (const k of keys) {
keyEncoding.preencode(state, k);
valueEncoding.preencode(state, v[k]);
}
},
encode(state, v) {
const keys = Object.keys(v);
uint.encode(state, keys.length);
for (const k of keys) {
keyEncoding.encode(state, k);
valueEncoding.encode(state, v[k]);
}
},
decode(state) {
const out = /* @__PURE__ */ Object.create(null);
const keys = uint.decode(state);
for (let i = 0; i < keys; i++) {
out[keyEncoding.decode(state)] = valueEncoding.decode(state);
}
return out;
}
};
};
exports2.stringRecord = record(utf8, utf8);
function getType(o) {
if (o === null || o === void 0) return 0;
if (typeof o === "boolean") return 1;
if (typeof o === "string") return 2;
if (b4a4.isBuffer(o)) return 3;
if (typeof o === "number") {
if (Number.isInteger(o)) return o >= 0 ? 4 : 5;
return 6;
}
if (Array.isArray(o)) return 7;
if (o instanceof Date) return 9;
if (typeof o === "object") return 8;
throw new Error("Unsupported type for " + o);
}
exports2.from = function from(enc) {
if (typeof enc === "string") return fromNamed(enc);
if (enc.preencode) return enc;
if (enc.encodingLength) return fromAbstractEncoder(enc);
return fromCodec(enc);
};
function fromNamed(enc) {
switch (enc) {
case "ascii":
return raw.ascii;
case "utf-8":
case "utf8":
return raw.utf8;
case "hex":
return raw.hex;
case "base64":
return raw.base64;
case "utf16-le":
case "utf16le":
case "ucs-2":
case "ucs2":
return raw.ucs2;
case "ndjson":
return raw.ndjson;
case "json":
return raw.json;
case "binary":
default:
return raw.binary;
}
}
function fromCodec(enc) {
let tmpM = null;
let tmpBuf = null;
return {
preencode(state, m) {
tmpM = m;
tmpBuf = enc.encode(m);
state.end += tmpBuf.byteLength;
},
encode(state, m) {
raw.encode(state, m === tmpM ? tmpBuf : enc.encode(m));
tmpM = tmpBuf = null;
},
decode(state) {
return enc.decode(raw.decode(state));
}
};
}
function fromAbstractEncoder(enc) {
return {
preencode(state, m) {
state.end += enc.encodingLength(m);
},
encode(state, m) {
enc.encode(m, state.buffer, state.start);
state.start += enc.encode.bytes;
},
decode(state) {
const m = enc.decode(state.buffer, state.start, state.end);
state.start += enc.decode.bytes;
return m;
}
};
}
exports2.encode = function encode2(enc, m) {
const state = exports2.state();
enc.preencode(state, m);
state.buffer = b4a4.allocUnsafe(state.end);
enc.encode(state, m);
return state.buffer;
};
exports2.decode = function decode2(enc, buffer2) {
return enc.decode(exports2.state(0, buffer2.byteLength, buffer2));
};
function zigZagInt(enc) {
return {
preencode(state, n) {
enc.preencode(state, zigZagEncodeInt(n));
},
encode(state, n) {
enc.encode(state, zigZagEncodeInt(n));
},
decode(state) {
return zigZagDecodeInt(enc.decode(state));
}
};
}
function zigZagDecodeInt(n) {
return n === 0 ? n : (n & 1) === 0 ? n / 2 : -(n + 1) / 2;
}
function zigZagEncodeInt(n) {
return n < 0 ? 2 * -n - 1 : n === 0 ? 0 : 2 * n;
}
function zigZagBigInt(enc) {
return {
preencode(state, n) {
enc.preencode(state, zigZagEncodeBigInt(n));
},
encode(state, n) {
enc.encode(state, zigZagEncodeBigInt(n));
},
decode(state) {
return zigZagDecodeBigInt(enc.decode(state));
}
};
}
function zigZagDecodeBigInt(n) {
return n === 0n ? n : (n & 1n) === 0n ? n / 2n : -(n + 1n) / 2n;
}
function zigZagEncodeBigInt(n) {
return n < 0n ? 2n * -n - 1n : n === 0n ? 0n : 2n * n;
}
function validateUint(n) {
if (n >= 0 === false)
throw new Error("uint must be positive");
}
}
});
// node_modules/refcounter/index.js
var require_refcounter = __commonJS({
"node_modules/refcounter/index.js"(exports2, module2) {
module2.exports = class RefCounter {
constructor() {
this.count = 0;
this._onidle = null;
this._idle = null;
}
isIdle() {
return this.count === 0;
}
idle() {
if (this.count === 0) return Promise.resolve();
if (this._idle !== null) return this._idle;
this._idle = new Promise((resolve) => {
this._onidle = resolve;
});
return this._idle;
}
inc() {
this.count++;
}
dec() {
if (--this.count > 0) return;
if (this._onidle !== null) {
const resolve = this._onidle;
this._idle = null;
this._onidle = null;
resolve();
}
}
};
}
});
// node_modules/hyperdb/lib/engine/bee.js
var require_bee = __commonJS({
"node_modules/hyperdb/lib/engine/bee.js"(exports2, module2) {
var HyperBee = require_hyperbee();
var ScopeLock = require_scope_lock();
var { Readable, getStreamError } = require_streamx();
var c4 = require_compact_encoding();
var RefCounter = require_refcounter();
var Sessions = require_sessions();
var BeeSnapshot = class {
constructor(snap, onfree) {
this.refs = 1;
this.snapshot = snap;
this.opened = false;
this.onfree = onfree;
}
async ready() {
await this.snapshot.ready();
this.opened = true;
}
ref() {
this.refs++;
return this;
}
unref() {
if (--this.refs === 0) {
this.snapshot.close().then(this.onfree, this.onfree);
this.snapshot = null;
}
}
cork() {
}
uncork() {
}
getIndirectRange(reconstruct, entries, checkout, reqs) {
const promises = new Array(entries.length);
for (let i = 0; i < promises.length; i++) {
const { key, value } = entries[i];
promises[i] = getWrapped(this.snapshot, key, reconstruct(key, value), checkout, reqs);
}
return promises;
}
getBatch(keys, checkout, reqs) {
const promises = new Array(keys.length);
for (let i = 0; i < keys.length; i++) {
promises[i] = getValue(this.snapshot, keys[i], checkout, reqs);
}
return Promise.all(promises);
}
get(key, checkout, reqs) {
return getValue(this.snapshot, key, checkout, reqs);
}
createReadStream(range, options) {
return this.snapshot.createReadStream(range, options);
}
};
var ChangesStream = class extends Readable {
constructor(db, versions, definition, range) {
super();
this.db = db;
this.versions = versions;
this.definition = definition;
this.stream = null;
this.collectionsById = /* @__PURE__ */ new Map();
this.range = range;
for (const c5 of this.definition.collections) this.collectionsById.set(c5.id, c5);
}
_open(cb) {
this.stream = this.db.createHistoryStream(this.range);
this.stream.on("readable", this._ondrain.bind(this));
this.stream.on("error", noop);
this.stream.on("close", this._onclose.bind(this));
cb(null);
}
_ondrain() {
while (Readable.isBackpressured(this) === false) {
const data = this.stream.read();
if (data === null) break;
const id = c4.uint.decode({ start: 0, end: data.key.byteLength, buffer: data.key });
const coll = this.collectionsById.get(id);
if (coll === void 0) continue;
if (data.type === "put") {
const doc = coll.reconstruct(this.versions.schema, data.key, data.value);
this.push({ type: "insert", seq: data.seq, collection: coll.name, value: doc });
} else {
const key = coll.reconstructKey(data.key);
this.push({ type: "delete", seq: data.seq, collection: coll.name, value: key });
}
}
}
_onclose() {
const err = getStreamError(this.stream, { all: true });
if (err === null) this.push(null);
else this.destroy(err);
}
_read(cb) {
this._ondrain();
cb(null);
}
_destroy(cb) {
this.stream.destroy();
cb(null);
}
};
module2.exports = class BeeEngine {
constructor(core, { extension, trace } = {}) {
this.asap = true;
this.clock = 0;
this.core = core;
this.sessions = new Sessions();
this.trace = trace;
this.snaps = new RefCounter();
this.db = new HyperBee(core, {
extension,
keyEncoding: "binary",
valueEncoding: "binary"
});
this.tx = null;
this.lock = new ScopeLock();
this._freeSnapBound = this.snaps.dec.bind(this.snaps);
}
get closed() {
return this.db.closed;
}
ready() {
return this.db.ready();
}
async close() {
while (!this.snaps.isIdle()) await this.snaps.idle();
await this.db.close();
}
enter() {
return this.lock.lock();
}
exit() {
this.tx = null;
this.lock.unlock();
}
finalize(collection, versions, checkout, tracing, key, value) {
if (value === null) return null;
const reconstructed = collection.reconstruct(versions.schema, key, value);
if (this.trace && tracing) this.trace(collection.name, reconstructed, checkout);
return reconstructed;
}
changes(snapshot, versions, definition, range) {
const db = snapshot === null ? this.db : snapshot.snapshot;
return new ChangesStream(db, versions, definition, range);
}
snapshot() {
this.snaps.inc();
return new BeeSnapshot(this.db.snapshot(), this._freeSnapBound);
}
outdated(snap) {
return snap === null || this.core.length !== snap.snapshot.core.length || this.core.fork !== snap.snapshot.core.fork;
}
async commit(updates) {
this.clock++;
let i = 0;
const entries = updates.batch();
const batch = this.db.batch({ maxBlocksCached: entries.length * 2 });
for (; i < entries.length; i++) {
const [key, value] = entries[i];
if (value !== null) await batch.put(key, value);
else await batch.del(key);
}
await batch.flush();
}
clearRequests(reqs) {
if (!reqs.length) return;
this.core.core.replicator.clearRequests(reqs, null);
}
};
async function getWrapped(db, key, value, checkout, reqs) {
return { key, value: [value, await getValue(db, value, checkout, reqs)] };
}
async function getValue(db, key, checkout, activeRequests) {
const node = await db.get(key, { checkout, activeRequests });
return node === null ? null : node.value;
}
function noop() {
}
}
});
// node_modules/hyperdb/index.js
var require_hyperdb = __commonJS({
"node_modules/hyperdb/index.js"(exports2, module2) {
var IndexStream = require_stream();
var def = require_definition();
var b4a4 = require_b4a();
var RocksEngine = require_rocks();
var BeeEngine = require_bee();
var compareHasDups = false;
var Updates = class _Updates {
constructor(tick, entries) {
this.refs = 1;
this.mutating = 0;
this.tick = tick;
this.map = new Map(entries);
this.locks = /* @__PURE__ */ new Map();
}
get size() {
return this.map.size;
}
nextTick() {
return this.tick++;
}
enter(collection) {
if (collection.trigger !== null) {
if (this.locks.has(collection.id)) return false;
this.locks.set(collection.id, { resolve: null, promise: null });
}
this.mutating++;
return true;
}
exit(collection) {
this.mutating--;
if (collection.trigger === null) return;
const { resolve } = this.locks.get(collection.id);
this.locks.delete(collection.id);
if (resolve) resolve();
}
wait(collection) {
const state = this.locks.get(collection.id);
if (state.promise) return state.promise;
state.promise = new Promise((resolve) => {
state.resolve = resolve;
});
return state.promise;
}
ref() {
this.refs++;
return this;
}
unref() {
this.refs--;
}
detach() {
const entries = new Array(this.map.size);
if (entries.length > 0) {
let i = 0;
for (const [key, u] of this.map) {
const clone = {
created: u.created,
tick: u.tick,
collection: u.collection,
key: u.key,
value: u.value,
indexes: u.indexes.slice(0)
};
entries[i++] = [key, clone];
}
}
this.refs--;
return new _Updates(this.tick, entries);
}
get(key) {
const u = this.map.get(b4a4.toString(key, "hex"));
return u === void 0 ? null : u;
}
getIndex(index, key) {
if (this.map.size === 0 || index.offset === -1) return null;
const matches = [];
for (const u of this.map.values()) {
if (u.collection.id !== index.collection.id) continue;
const ups = u.indexes[index.offset];
for (let i = 0; i < ups.length; i++) {
if (b4a4.equals(key, ups[i].key)) matches.push(u);
}
}
if (!matches.length) return null;
let latest = matches[0];
for (let i = 1; i < matches.length; i++) {
const m = matches[i];
if (m.tick > latest.tick) latest = m;
}
return latest;
}
flush() {
this.map.clear();
}
update(collection, tick, key, value) {
const u = {
created: false,
tick,
collection,
key,
value,
indexes: []
};
this.map.set(b4a4.toString(key, "hex"), u);
return u;
}
delete(key) {
this.map.delete(b4a4.toString(key, "hex"));
}
batch() {
const ordered = new Array(this.map.size);
let sort = false;
let i = 0;
for (const u of this.map.values()) {
if (i > 0 && u.tick < ordered[i - 1].tick) sort = true;
ordered[i++] = u;
}
if (sort) ordered.sort(sortUpdates);
const dedup = ordered.length > 1 ? /* @__PURE__ */ new Set() : null;
const batch = [];
for (let i2 = ordered.length - 1; i2 >= 0; i2--) {
const u = ordered[i2];
for (let j = 0; j < u.indexes.length; j++) {
const idx = u.indexes[j];
for (let k = 0; k < idx.length; k++) {
const { key, value } = idx[k];
if (dedup !== null) {
const id = b4a4.toString(key, "hex");
if (dedup.has(id)) continue;
dedup.add(id);
}
batch.push([key, value]);
}
}
batch.push([u.key, u.value]);
}
return batch;
}
collectionOverlay(collection, range, reverse) {
const overlay = [];
if (this.map.size === 0) return overlay;
for (const u of this.map.values()) {
if (u.collection.id !== collection.id) continue;
if (withinRange(range, u.key)) {
overlay.push({
tick: u.tick,
key: u.key,
value: u.value === null ? null : [u.key, u.value]
});
}
}
return sortOverlay(overlay, reverse);
}
indexOverlay(index, range, reverse) {
const overlay = [];
if (this.map.size === 0 || index.offset === -1) return overlay;
const collection = index.collection;
for (const u of this.map.values()) {
if (u.collection.id !== collection.id) continue;
for (const { key, value } of u.indexes[index.offset]) {
if (withinRange(range, key)) {
overlay.push({
tick: u.tick,
key,
value: value === null ? null : [u.key, u.value]
});
}
}
}
return sortOverlay(overlay, reverse);
}
};
var HyperDB2 = class _HyperDB {
constructor(engine, definition, {
versions = definition.versions,
snapshot = engine.snapshot(),
updates = new Updates(0, []),
rootInstance = null,
writable = true,
context = null
} = {}) {
this.versions = versions;
this.context = context;
this.index = 0;
this.engine = engine;
this.engineSnapshot = snapshot;
this.definition = definition;
this.updates = updates;
this.rootInstance = writable === true ? rootInstance || this : null;
this.watchers = null;
this.closing = null;
this.activeRequests = [];
this.engine.sessions.add(this);
}
static isDefinition(definition) {
return def.isDefinition(definition);
}
static rocks(storage, definition, options = {}) {
const readOnly = options.readOnly === true || options.readonly === true;
const trace = options.trace || null;
const engine = new RocksEngine(storage, { readOnly, trace });
return new _HyperDB(engine, def.compat(definition), options);
}
static bee(core, definition, options = {}) {
const extension = options.extension;
const autoUpdate = !!options.autoUpdate;
const trace = options.trace || null;
const engine = new BeeEngine(core, { extension, trace });
const db = new _HyperDB(engine, def.compat(definition), options);
if (autoUpdate) {
const update = db.update.bind(db);
core.on("append", update);
core.on("truncate", update);
}
return db;
}
get core() {
return this.engine.core;
}
get db() {
return this.engine.db;
}
get closed() {
return this.engine === null;
}
get writable() {
return this.rootInstance !== null;
}
get traceable() {
return this.rootInstance === this || this.rootInstance === null;
}
get readable() {
return this.closing !== null;
}
get autoClose() {
return this.rootInstance !== null && this.rootInstance !== this;
}
setVersions(versions) {
this.versions = versions;
}
setDefinition(definition) {
definition = def.compat(definition);
this.versions = definition.versions;
this.definition = definition;
}
cork() {
if (this.engineSnapshot !== null) this.engineSnapshot.cork();
}
uncork() {
if (this.engineSnapshot !== null) this.engineSnapshot.uncork();
}
ready() {
return this.engineSnapshot === null ? Promise.resolve() : this.engineSnapshot.ready();
}
close() {
if (this.closing === null) this.closing = this._close();
return this.closing;
}
changes(range = {}) {
maybeClosed(this);
const snap = range.live ? null : this.engineSnapshot;
return this.engine.changes(snap, this.versions, this.definition, range);
}
watch(fn) {
if (this.watchers === null) this.watchers = /* @__PURE__ */ new Set();
this.watchers.add(fn);
}
unwatch(fn) {
if (this.watchers === null) return;
this.watchers.delete(fn);
}
async _close() {
this.engine.clearRequests(this.activeRequests);
this.updates.unref();
this.updates = null;
this.engineSnapshot.unref();
this.engineSnapshot = null;
if (this.rootInstance === this) {
await this.engine.sessions.close(this);
}
this.engine.sessions.remove(this);
if (this.engine.tx === this) this.engine.exit();
if (this.engine.sessions.size === 0) await this.engine.close();
this.engine = null;
}
_createSnapshot(rootInstance, writable, context) {
const snapshot = this.engineSnapshot.ref();
return new _HyperDB(this.engine, this.definition, {
versions: this.versions,
snapshot,
updates: this.updates.ref(),
rootInstance,
writable,
context
});
}
snapshot(options) {
maybeClosed(this);
const context = options && options.context || this.context;
return this._createSnapshot(this, false, context);
}
// in future major, lets move transaction to be exclusive (aka sync) always
async exclusiveTransaction(options) {
await this.engine.enter();
if (this.closing) {
this.engine.exit();
maybeClosed(this);
}
this.engine.tx = this.transaction(options);
return this.engine.tx;
}
transaction(options) {
maybeClosed(this);
if (this.rootInstance !== this) {
throw new Error("Can only make transactions on main instance");
}
const context = options && options.context || this.context;
const tx = this._createSnapshot(this, true, context);
tx.update();
return tx;
}
find(indexName, query = {}, options) {
if (options) query = { ...query, ...options };
maybeClosed(this);
const index = this.definition.resolveIndex(indexName);
const collection = index === null ? this.definition.resolveCollection(indexName) : index.collection;
if (collection === null) throw new Error("Unknown index: " + indexName);
const { checkout = -1, limit, reverse = false } = query;
const range = index === null ? collection.encodeKeyRange(query) : index.encodeKeyRange(query);
const overlay = checkout !== -1 ? [] : index === null ? this.updates.collectionOverlay(collection, range, reverse) : this.updates.indexOverlay(index, range, reverse);
return new IndexStream(this, range, {
index,
collection,
reverse,
limit,
overlay,
checkout
});
}
async findOne(indexName, query, options) {
return this.find(indexName, query, { ...options, limit: 1 }).one();
}
updated(collectionName, record) {
if (this.updates === null) return false;
if (!collectionName) return this.updates.size > 0;
const collection = this.definition.resolveCollection(collectionName);
if (collection === null) return false;
const key = b4a4.isBuffer(record) ? record : collection.encodeKey(record);
const u = this.updates.get(key);
return u !== null;
}
getAll(batch) {
const promises = [];
for (const b of batch) {
if (Array.isArray(b)) promises.push(this.get(...b));
else promises.push(b);
}
return Promise.all(promises);
}
async get(collectionName, record, { checkout = -1 } = {}) {
maybeClosed(this);
const snap = this.engineSnapshot.ref();
try {
const collection = this.definition.resolveCollection(collectionName);
if (collection !== null) return await this._getCollection(collection, snap, record, checkout);
const index = this.definition.resolveIndex(collectionName);
if (index === null) throw new Error("Unknown index or collection: " + collectionName);
const key = index.encodeKey(record, this.context);
if (key === null) return null;
const u = this.updates.getIndex(index, key);
if (u !== null && checkout === -1) {
return u.value === null ? null : index.collection.reconstruct(this.versions.schema, u.key, u.value);
}
const value = await snap.get(key, checkout, this.activeRequests);
if (value === null) return null;
return this._getCollection(index.collection, snap, index.reconstruct(key, value), checkout);
} finally {
if (snap !== null) snap.unref();
}
}
async _getCollection(collection, snap, record, checkout) {
maybeClosed(this);
const key = b4a4.isBuffer(record) ? record : collection.encodeKey(record);
const u = this.updates.get(key);
const value = u !== null && checkout === -1 ? u.value : await snap.get(key, checkout, this.activeRequests);
maybeClosed(this);
return this.engine.finalize(collection, this.versions, checkout, this.traceable, key, value);
}
// TODO: needs to wait for pending inserts/deletes and then lock all future ones whilst it runs
_runTrigger(collection, key, record) {
return collection.trigger(this, key, record, this.context);
}
async delete(collectionName, record) {
maybeClosed(this);
if (this.updates.refs > 1) this.updates = this.updates.detach();
const collection = this.definition.resolveCollection(collectionName);
if (collection === null) return;
const tick = this.updates.nextTick();
while (this.updates.enter(collection) === false) await this.updates.wait(collection);
const snap = this.engineSnapshot.ref();
const key = collection.encodeKey(record);
let prevValue = null;
try {
prevValue = await this.engineSnapshot.get(key, -1, this.activeRequests);
if (collection.trigger !== null) await this._runTrigger(collection, record, null);
if (prevValue === null) {
this.updates.delete(key);
return;
}
const prevDoc = collection.reconstruct(this.versions.schema, key, prevValue);
const prevVersion = collection.decodedVersion;
const u = this.updates.update(collection, tick, key, null);
for (let i = 0; i < collection.indexes.length; i++) {
const idx = collection.indexes[i];
if (idx.version > prevVersion) continue;
const del = idx.encodeIndexKeys(prevDoc, this.context);
const ups = [];
u.indexes.push(ups);
for (let j = 0; j < del.length; j++) ups.push({ key: del[j], value: null });
}
} finally {
snap.unref();
this.updates.exit(collection);
}
}
async insert(collectionName, record) {
maybeClosed(this);
if (this.updates.refs > 1) this.updates = this.updates.detach();
const collection = this.definition.resolveCollection(collectionName);
if (collection === null) throw new Error("Unknown collection: " + collectionName);
const tick = this.updates.nextTick();
while (this.updates.enter(collection) === false) await this.updates.wait(collection);
const snap = this.engineSnapshot.ref();
const key = collection.encodeKey(record);
const collectionVersion = Math.min(this.versions.db, collection.version);
const value = collection.encodeValue(this.versions.schema, collectionVersion, record);
let prevValue = null;
try {
prevValue = await this.engineSnapshot.get(key, -1, this.activeRequests);
if (collection.trigger !== null) await this._runTrigger(collection, record, record);
const prevDoc = prevValue === null ? null : collection.reconstruct(this.versions.schema, key, prevValue);
const prevVersion = prevDoc ? collection.decodedVersion : -1;
if (prevValue !== null && prevVersion === collectionVersion && b4a4.equals(value, prevValue)) {
this.updates.delete(key);
return;
}
const u = this.updates.update(collection, tick, key, value);
u.created = prevValue === null;
for (let i = 0; i < collection.indexes.length; i++) {
const idx = collection.indexes[i];
const prevKeys = idx.version <= prevVersion ? idx.encodeIndexKeys(prevDoc, this.context) : [];
const nextKeys = idx.encodeIndexKeys(record, this.context);
const ups = [];
u.indexes.push(ups);
const [del, put] = diffKeys(prevKeys, nextKeys);
const value2 = put.length === 0 ? null : idx.encodeValue(record);
for (let j = 0; j < del.length; j++) ups.push({ key: del[j], value: null });
for (let j = 0; j < put.length; j++) ups.push({ key: put[j], value: value2 });
}
} finally {
snap.unref();
this.updates.exit(collection);
}
}
async insertAll(batch) {
const promises = [];
for (const [collection, record, opts] of batch) {
if (opts && opts.type === "delete") {
promises.push(this.delete(collection, record));
} else {
promises.push(this.insert(collection, record));
}
}
await Promise.all(promises);
}
update() {
maybeClosed(this);
if (!this.engine.outdated(this.engineSnapshot)) return;
if (this.updates.refs > 1) this.updates = this.updates.detach();
this.updates.flush();
this.engineSnapshot.unref();
this.engineSnapshot = this.engine.snapshot();
if (this.watchers !== null) {
for (const fn of this.watchers) fn();
}
}
async _flush() {
if (this.engine.outdated(this.engineSnapshot)) {
throw new Error("Database has changed, refusing to commit");
}
if (this.updates.refs > 1) this.updates = this.updates.detach();
await this.engine.commit(this.updates);
this.update();
if (this.rootInstance !== this && this.rootInstance.updates.size === 0) {
this.rootInstance.update();
}
}
async flush() {
maybeClosed(this);
if (this.engineSnapshot.opened === false) await this.engineSnapshot.ready();
if (this.updating > 0) throw new Error("Insert/delete in progress, refusing to commit");
if (this.rootInstance === null) throw new Error("Instance is not writable, refusing to commit");
if (this.updates.size > 0) await this._flush();
if (this.autoClose === true) await this.close();
}
};
function maybeClosed(db) {
if (db.closing !== null) throw new Error("Hyperdb is closed");
}
function withinRange(range, key) {
if (range.gte && b4a4.compare(range.gte, key) > 0) return false;
if (range.gt && b4a4.compare(range.gt, key) >= 0) return false;
if (range.lte && b4a4.compare(range.lte, key) < 0) return false;
if (range.lt && b4a4.compare(range.lt, key) <= 0) return false;
return true;
}
function sortKeys(a, b) {
return b4a4.compare(a, b);
}
function sortUpdates(a, b) {
return a.tick - b.tick;
}
function compareOverlay(a, b) {
const c4 = b4a4.compare(a.key, b.key);
if (c4 !== 0) return c4;
compareHasDups = true;
return b.tick - a.tick;
}
function reverseCompareOverlay(a, b) {
const c4 = b4a4.compare(b.key, a.key);
if (c4 !== 0) return c4;
compareHasDups = true;
return b.tick - a.tick;
}
function diffKeys(a, b) {
if (a.length === 0 || b.length === 0) return [a, b];
if (a.length === 1 && b.length === 1) {
return b4a4.equals(a[0], b[0]) ? [[], []] : [a, b];
}
a.sort(sortKeys);
b.sort(sortKeys);
const res = [[], []];
let ai = 0;
let bi = 0;
while (true) {
if (ai < a.length && bi < b.length) {
const cmp = b4a4.compare(a[ai], b[bi]);
if (cmp === 0) {
ai++;
bi++;
} else if (cmp < 0) {
res[0].push(a[ai++]);
} else {
res[1].push(b[bi++]);
}
continue;
}
if (ai < a.length) res[0].push(a[ai++]);
else if (bi < b.length) res[1].push(b[bi++]);
else break;
}
return res;
}
function stripDups(overlay) {
let j = 0;
for (let i = 0; i < overlay.length; i++) {
const a = overlay[i];
overlay[j++] = a;
while (i + 1 < overlay.length && b4a4.equals(a.key, overlay[i + 1].key)) i++;
}
overlay.length = j;
}
function sortOverlay(overlay, reverse) {
compareHasDups = false;
overlay.sort(reverse ? reverseCompareOverlay : compareOverlay);
if (compareHasDups === true) stripDups(overlay);
return overlay;
}
module2.exports = HyperDB2;
}
});
// node_modules/nanoassert/index.js
var require_nanoassert = __commonJS({
"node_modules/nanoassert/index.js"(exports2, module2) {
module2.exports = assert2;
var AssertionError = class extends Error {
};
AssertionError.prototype.name = "AssertionError";
function assert2(t, m) {
if (!t) {
var err = new AssertionError(m);
if (Error.captureStackTrace) Error.captureStackTrace(err, assert2);
throw err;
}
}
}
});
// node_modules/signal-promise/index.js
var require_signal_promise = __commonJS({
"node_modules/signal-promise/index.js"(exports2, module2) {
module2.exports = class Signal {
constructor() {
this._resolve = null;
this._reject = null;
this._promise = null;
this._bind = bind.bind(this);
this._onerror = clear.bind(this);
this._onsuccess = clear.bind(this, null);
this._timers = /* @__PURE__ */ new Set();
}
wait(max) {
if (!this._promise) {
this._promise = new Promise(this._bind);
this._promise.then(this._onsuccess).catch(this._onerror);
}
if (max) return this._sleep(max);
return this._promise;
}
_sleep(max) {
const s = new Promise((resolve, reject) => {
const done = () => {
this._timers.delete(state);
resolve(true);
};
const id = setTimeout(done, max);
const state = { id, resolve, reject };
this._timers.add(state);
});
return s;
}
notify(err) {
if (!this._promise) return;
const resolve = this._resolve;
const reject = this._reject;
this._promise = null;
if (err) reject(err);
else resolve(true);
}
};
function clear(err) {
for (const { id, resolve, reject } of this._timers) {
clearTimeout(id);
if (err) reject(err);
else resolve(true);
}
this._timers.clear();
}
function bind(resolve, reject) {
this._resolve = resolve;
this._reject = reject;
}
}
});
// node_modules/core-coupler/index.js
var require_core_coupler = __commonJS({
"node_modules/core-coupler/index.js"(exports2, module2) {
var safetyCatch = require_safety_catch();
module2.exports = class CoreCoupler {
constructor(target, wakeup) {
this.target = target;
this.wakeup = wakeup;
this.coupled = /* @__PURE__ */ new Set();
this._onpeeraddBound = this._onpeeradd.bind(this);
this.target.on("peer-add", this._onpeeraddBound);
}
add(core) {
const added = this.coupled.size;
this.coupled.add(core);
if (added !== this.coupled.size) this._couple(core);
}
remove(core) {
this.coupled.delete(core);
}
destroy() {
this.target.off("peer-add", this._onpeeraddBound);
}
async update(stream) {
const muxer = stream.userData;
if (!muxer) return;
try {
if (!await this._hasMuxer(this.target, muxer)) return;
let wakeup = null;
for (const core of this.coupled) {
if (await this._hasMuxer(core, muxer)) continue;
if (wakeup === null) wakeup = [];
wakeup.push(core);
}
if (wakeup !== null) {
this.wakeup(stream, wakeup);
}
} catch (err) {
safetyCatch(err);
}
}
async _couple(core) {
try {
let wakeup = null;
for (const peer of this.target.peers) {
if (await this._hasPeer(core, peer)) continue;
if (wakeup === null) wakeup = [];
wakeup.push(peer);
}
if (wakeup !== null && this.coupled.has(core)) {
for (const peer of wakeup) this.wakeup(peer.stream, [core]);
}
} catch (err) {
safetyCatch(err);
}
}
async _onpeeradd(peer) {
try {
let wakeup = null;
for (const core of this.coupled) {
if (await this._hasPeer(core, peer)) continue;
if (wakeup === null) wakeup = [];
wakeup.push(core);
}
if (wakeup !== null) {
this.wakeup(peer.stream, wakeup);
}
} catch (err) {
safetyCatch(err);
}
}
_hasMuxer(core, muxer) {
const ch = muxer.getLastChannel({ protocol: "hypercore", id: core.discoveryKey });
if (ch) return ch.fullyOpened();
const cha = muxer.getLastChannel({ protocol: "hypercore/alpha", id: core.discoveryKey });
if (cha) return cha.fullyOpened();
return Promise.resolve(false);
}
_hasPeer(core, peer) {
return this._hasMuxer(core, peer.protomux);
}
};
}
});
// node_modules/sodium-universal/index.js
var require_sodium_universal = __commonJS({
"node_modules/sodium-universal/index.js"(exports2, module2) {
module2.exports = require("sodium-native");
}
});
// node_modules/hypercore-crypto/index.js
var require_hypercore_crypto = __commonJS({
"node_modules/hypercore-crypto/index.js"(exports2) {
var sodium = require_sodium_universal();
var c4 = require_compact_encoding();
var b4a4 = require_b4a();
var LEAF_TYPE = b4a4.from([0]);
var PARENT_TYPE = b4a4.from([1]);
var ROOT_TYPE = b4a4.from([2]);
var HYPERCORE = b4a4.from("hypercore");
exports2.keyPair = function(seed) {
const slab = b4a4.allocUnsafeSlow(sodium.crypto_sign_PUBLICKEYBYTES + sodium.crypto_sign_SECRETKEYBYTES);
const publicKey = slab.subarray(0, sodium.crypto_sign_PUBLICKEYBYTES);
const secretKey = slab.subarray(sodium.crypto_sign_PUBLICKEYBYTES);
if (seed) sodium.crypto_sign_seed_keypair(publicKey, secretKey, seed);
else sodium.crypto_sign_keypair(publicKey, secretKey);
return {
publicKey,
secretKey
};
};
exports2.validateKeyPair = function(keyPair) {
const pk = b4a4.allocUnsafe(sodium.crypto_sign_PUBLICKEYBYTES);
sodium.crypto_sign_ed25519_sk_to_pk(pk, keyPair.secretKey);
return b4a4.equals(pk, keyPair.publicKey);
};
exports2.sign = function(message, secretKey) {
const signature = b4a4.allocUnsafeSlow(sodium.crypto_sign_BYTES);
sodium.crypto_sign_detached(signature, message, secretKey);
return signature;
};
exports2.verify = function(message, signature, publicKey) {
if (signature.byteLength !== sodium.crypto_sign_BYTES) return false;
if (publicKey.byteLength !== sodium.crypto_sign_PUBLICKEYBYTES) return false;
return sodium.crypto_sign_verify_detached(signature, message, publicKey);
};
exports2.encrypt = function(message, publicKey) {
const ciphertext = b4a4.alloc(message.byteLength + sodium.crypto_box_SEALBYTES);
sodium.crypto_box_seal(ciphertext, message, publicKey);
return ciphertext;
};
exports2.decrypt = function(ciphertext, keyPair) {
if (ciphertext.byteLength < sodium.crypto_box_SEALBYTES) return null;
const plaintext = b4a4.alloc(ciphertext.byteLength - sodium.crypto_box_SEALBYTES);
if (!sodium.crypto_box_seal_open(plaintext, ciphertext, keyPair.publicKey, keyPair.secretKey)) {
return null;
}
return plaintext;
};
exports2.encryptionKeyPair = function(seed) {
const publicKey = b4a4.alloc(sodium.crypto_box_PUBLICKEYBYTES);
const secretKey = b4a4.alloc(sodium.crypto_box_SECRETKEYBYTES);
if (seed) {
sodium.crypto_box_seed_keypair(publicKey, secretKey, seed);
} else {
sodium.crypto_box_keypair(publicKey, secretKey);
}
return {
publicKey,
secretKey
};
};
exports2.data = function(data) {
const out = b4a4.allocUnsafe(32);
sodium.crypto_generichash_batch(out, [
LEAF_TYPE,
c4.encode(c4.uint64, data.byteLength),
data
]);
return out;
};
exports2.parent = function(a, b) {
if (a.index > b.index) {
const tmp = a;
a = b;
b = tmp;
}
const out = b4a4.allocUnsafe(32);
sodium.crypto_generichash_batch(out, [
PARENT_TYPE,
c4.encode(c4.uint64, a.size + b.size),
a.hash,
b.hash
]);
return out;
};
exports2.tree = function(roots, out) {
const buffers = new Array(3 * roots.length + 1);
let j = 0;
buffers[j++] = ROOT_TYPE;
for (let i = 0; i < roots.length; i++) {
const r = roots[i];
buffers[j++] = r.hash;
buffers[j++] = c4.encode(c4.uint64, r.index);
buffers[j++] = c4.encode(c4.uint64, r.size);
}
if (!out) out = b4a4.allocUnsafe(32);
sodium.crypto_generichash_batch(out, buffers);
return out;
};
exports2.hash = function(data, out) {
if (!out) out = b4a4.allocUnsafe(32);
if (!Array.isArray(data)) data = [data];
sodium.crypto_generichash_batch(out, data);
return out;
};
exports2.randomBytes = function(n) {
const buf = b4a4.allocUnsafe(n);
sodium.randombytes_buf(buf);
return buf;
};
exports2.discoveryKey = function(key) {
if (!key || key.byteLength !== 32) throw new Error("Must pass a 32 byte buffer");
const digest = b4a4.allocUnsafeSlow(32);
sodium.crypto_generichash(digest, HYPERCORE, key);
return digest;
};
if (sodium.sodium_free) {
exports2.free = function(secureBuf) {
if (secureBuf.secure) sodium.sodium_free(secureBuf);
};
} else {
exports2.free = function() {
};
}
exports2.namespace = function(name, count) {
const ids = typeof count === "number" ? range(count) : count;
const buf = b4a4.allocUnsafeSlow(32 * ids.length);
const list = new Array(ids.length);
const ns = b4a4.allocUnsafe(33);
sodium.crypto_generichash(ns.subarray(0, 32), typeof name === "string" ? b4a4.from(name) : name);
for (let i = 0; i < list.length; i++) {
list[i] = buf.subarray(32 * i, 32 * i + 32);
ns[32] = ids[i];
sodium.crypto_generichash(list[i], ns);
}
return list;
};
function range(count) {
const arr = new Array(count);
for (let i = 0; i < count; i++) arr[i] = i;
return arr;
}
}
});
// node_modules/protomux/index.js
var require_protomux = __commonJS({
"node_modules/protomux/index.js"(exports2, module2) {
var b4a4 = require_b4a();
var c4 = require_compact_encoding();
var queueTick = require_process_next_tick();
var safetyCatch = require_safety_catch();
var unslab = require_unslab();
var MAX_BUFFERED = 32768;
var MAX_BACKLOG = Infinity;
var MAX_BATCH = 8 * 1024 * 1024;
var Channel = class {
constructor(mux, info, userData, protocol, aliases, id, handshake, messages, onopen, onclose, ondestroy, ondrain) {
this.userData = userData;
this.protocol = protocol;
this.aliases = aliases;
this.id = id;
this.handshake = null;
this.messages = [];
this.opened = false;
this.closed = false;
this.destroyed = false;
this.onopen = onopen;
this.onclose = onclose;
this.ondestroy = ondestroy;
this.ondrain = ondrain;
this._handshake = handshake;
this._mux = mux;
this._info = info;
this._localId = 0;
this._remoteId = 0;
this._active = 0;
this._extensions = null;
this._decBound = this._dec.bind(this);
this._decAndDestroyBound = this._decAndDestroy.bind(this);
this._openedPromise = null;
this._openedResolve = null;
this._destroyedPromise = null;
this._destroyedResolve = null;
for (const m of messages) this.addMessage(m);
}
get drained() {
return this._mux.drained;
}
fullyOpened() {
if (this.opened) return Promise.resolve(true);
if (this.closed) return Promise.resolve(false);
if (this._openedPromise) return this._openedPromise;
this._openedPromise = new Promise((resolve) => {
this._openedResolve = resolve;
});
return this._openedPromise;
}
fullyClosed() {
if (this.destroyed) return Promise.resolve();
if (this._destroyedPromise) return this._destroyedPromise;
this._destroyedPromise = new Promise((resolve) => {
this._destroyedResolve = resolve;
});
return this._destroyedPromise;
}
open(handshake) {
const id = this._mux._free.length > 0 ? this._mux._free.pop() : this._mux._local.push(null) - 1;
this._info.opened++;
this._info.lastChannel = this;
this._localId = id + 1;
this._mux._local[id] = this;
if (this._remoteId === 0) {
this._info.outgoing.push(this._localId);
}
const state = { buffer: null, start: 2, end: 2 };
c4.uint.preencode(state, this._localId);
c4.string.preencode(state, this.protocol);
c4.buffer.preencode(state, this.id);
if (this._handshake) this._handshake.preencode(state, handshake);
state.buffer = this._mux._alloc(state.end);
state.buffer[0] = 0;
state.buffer[1] = 1;
c4.uint.encode(state, this._localId);
c4.string.encode(state, this.protocol);
c4.buffer.encode(state, this.id);
if (this._handshake) this._handshake.encode(state, handshake);
this._mux._write0(state.buffer);
}
_dec() {
if (--this._active === 0 && this.closed === true) this._destroy();
}
_decAndDestroy(err) {
this._dec();
this._mux._safeDestroy(err);
}
_fullyOpenSoon() {
this._mux._remote[this._remoteId - 1].session = this;
queueTick(this._fullyOpen.bind(this));
}
_fullyOpen() {
if (this.opened === true || this.closed === true) return;
const remote = this._mux._remote[this._remoteId - 1];
this.opened = true;
this.handshake = this._handshake ? this._handshake.decode(remote.state) : null;
this._track(this.onopen(this.handshake, this));
remote.session = this;
remote.state = null;
if (remote.pending !== null) this._drain(remote);
this._resolveOpen(true);
}
_resolveOpen(opened) {
if (this._openedResolve !== null) {
this._openedResolve(opened);
this._openedResolve = this._openedPromise = null;
}
}
_resolveDestroyed() {
if (this._destroyedResolve !== null) {
this._destroyedResolve();
this._destroyedResolve = this._destroyedPromise = null;
}
}
_drain(remote) {
for (let i = 0; i < remote.pending.length; i++) {
const p = remote.pending[i];
this._mux._buffered -= byteSize(p.state);
this._recv(p.type, p.state);
}
remote.pending = null;
this._mux._resumeMaybe();
}
_track(p) {
if (isPromise(p) === true) {
this._active++;
return p.then(this._decBound, this._decAndDestroyBound);
}
return null;
}
_close(isRemote) {
if (this.closed === true) return;
this.closed = true;
this._info.opened--;
if (this._info.lastChannel === this) this._info.lastChannel = null;
if (this._remoteId > 0) {
this._mux._remote[this._remoteId - 1] = null;
this._remoteId = 0;
this._mux._free.push(this._localId - 1);
}
this._mux._local[this._localId - 1] = null;
this._localId = 0;
this._mux._gc(this._info);
this._track(this.onclose(isRemote, this));
if (this._active === 0) this._destroy();
this._resolveOpen(false);
}
_destroy() {
if (this.destroyed === true) return;
this.destroyed = true;
this._track(this.ondestroy(this));
this._resolveDestroyed();
}
_recv(type, state) {
if (type < this.messages.length) {
const m = this.messages[type];
const p = m.recv(state, this);
if (m.autoBatch === true) return p;
}
return null;
}
cork() {
this._mux.cork();
}
uncork() {
this._mux.uncork();
}
close() {
if (this.closed === true) return;
const state = { buffer: null, start: 2, end: 2 };
c4.uint.preencode(state, this._localId);
state.buffer = this._mux._alloc(state.end);
state.buffer[0] = 0;
state.buffer[1] = 3;
c4.uint.encode(state, this._localId);
this._close(false);
this._mux._write0(state.buffer);
}
addMessage(opts) {
if (!opts) return this._skipMessage();
const type = this.messages.length;
const autoBatch = opts.autoBatch !== false;
const encoding = opts.encoding || c4.raw;
const onmessage = opts.onmessage || noop;
const s = this;
const typeLen = encodingLength(c4.uint, type);
const m = {
type,
autoBatch,
encoding,
onmessage,
recv(state, session) {
return session._track(m.onmessage(encoding.decode(state), session));
},
send(m2, session = s) {
if (session.closed === true) return false;
const mux = session._mux;
const state = { buffer: null, start: 0, end: typeLen };
if (mux._batch !== null) {
encoding.preencode(state, m2);
state.buffer = mux._alloc(state.end);
c4.uint.encode(state, type);
encoding.encode(state, m2);
mux._pushBatch(session._localId, state.buffer);
return true;
}
c4.uint.preencode(state, session._localId);
encoding.preencode(state, m2);
state.buffer = mux._alloc(state.end);
c4.uint.encode(state, session._localId);
c4.uint.encode(state, type);
encoding.encode(state, m2);
mux.drained = mux.stream.write(state.buffer);
return mux.drained;
}
};
this.messages.push(m);
return m;
}
_skipMessage() {
const type = this.messages.length;
const m = {
type,
encoding: c4.raw,
onmessage: noop,
recv(state, session) {
},
send(m2, session) {
}
};
this.messages.push(m);
return m;
}
};
module2.exports = class Protomux {
constructor(stream, { alloc } = {}) {
if (stream.userData === null) stream.userData = this;
this.isProtomux = true;
this.stream = stream;
this.corked = 0;
this.drained = true;
this._alloc = alloc || (typeof stream.alloc === "function" ? stream.alloc.bind(stream) : b4a4.allocUnsafe);
this._safeDestroyBound = this._safeDestroy.bind(this);
this._uncorkBound = this.uncork.bind(this);
this._remoteBacklog = 0;
this._buffered = 0;
this._paused = false;
this._remote = [];
this._local = [];
this._free = [];
this._batch = null;
this._batchState = null;
this._infos = /* @__PURE__ */ new Map();
this._notify = /* @__PURE__ */ new Map();
this.stream.on("data", this._ondata.bind(this));
this.stream.on("drain", this._ondrain.bind(this));
this.stream.on("end", this._onend.bind(this));
this.stream.on("error", noop);
this.stream.on("close", this._shutdown.bind(this));
}
static from(stream, opts) {
if (stream.userData && stream.userData.isProtomux) return stream.userData;
if (stream.isProtomux) return stream;
return new this(stream, opts);
}
static isProtomux(mux) {
return typeof mux === "object" && mux.isProtomux === true;
}
*[Symbol.iterator]() {
for (const session of this._local) {
if (session !== null) yield session;
}
}
isIdle() {
return this._local.length === this._free.length;
}
cork() {
if (++this.corked === 1) {
this._batch = [];
this._batchState = { buffer: null, start: 0, end: 1 };
}
}
uncork() {
if (--this.corked === 0) {
this._sendBatch(this._batch, this._batchState);
this._batch = null;
this._batchState = null;
}
}
getLastChannel({ protocol, id = null }) {
const key = toKey(protocol, id);
const info = this._infos.get(key);
if (info) return info.lastChannel;
return null;
}
pair({ protocol, id = null }, notify) {
this._notify.set(toKey(protocol, id), notify);
}
unpair({ protocol, id = null }) {
this._notify.delete(toKey(protocol, id));
}
opened({ protocol, id = null }) {
const key = toKey(protocol, id);
const info = this._infos.get(key);
return info ? info.opened > 0 : false;
}
createChannel({ userData = null, protocol, aliases = [], id = null, unique = true, handshake = null, messages = [], onopen = noop, onclose = noop, ondestroy = noop, ondrain = noop }) {
if (this.stream.destroyed) return null;
const info = this._get(protocol, id, aliases);
if (unique && info.opened > 0) return null;
if (info.incoming.length === 0) {
return new Channel(this, info, userData, protocol, aliases, id, handshake, messages, onopen, onclose, ondestroy, ondrain);
}
this._remoteBacklog--;
const remoteId = info.incoming.shift();
const r = this._remote[remoteId - 1];
if (r === null) return null;
const session = new Channel(this, info, userData, protocol, aliases, id, handshake, messages, onopen, onclose, ondestroy, ondrain);
session._remoteId = remoteId;
session._fullyOpenSoon();
return session;
}
_pushBatch(localId, buffer) {
if (this._batchState.end >= MAX_BATCH) {
this._sendBatch(this._batch, this._batchState);
this._batch = [];
this._batchState = { buffer: null, start: 0, end: 1 };
}
if (this._batch.length === 0 || this._batch[this._batch.length - 1].localId !== localId) {
this._batchState.end++;
c4.uint.preencode(this._batchState, localId);
}
c4.buffer.preencode(this._batchState, buffer);
this._batch.push({ localId, buffer });
}
_sendBatch(batch, state) {
if (batch.length === 0) return;
let prev = batch[0].localId;
state.buffer = this._alloc(state.end);
state.buffer[state.start++] = 0;
state.buffer[state.start++] = 0;
c4.uint.encode(state, prev);
for (let i = 0; i < batch.length; i++) {
const b = batch[i];
if (prev !== b.localId) {
state.buffer[state.start++] = 0;
c4.uint.encode(state, prev = b.localId);
}
c4.buffer.encode(state, b.buffer);
}
this.drained = this.stream.write(state.buffer);
}
_get(protocol, id, aliases = []) {
const key = toKey(protocol, id);
let info = this._infos.get(key);
if (info) return info;
info = { key, protocol, aliases: [], id, pairing: 0, opened: 0, incoming: [], outgoing: [], lastChannel: null };
this._infos.set(key, info);
for (const alias of aliases) {
const key2 = toKey(alias, id);
info.aliases.push(key2);
this._infos.set(key2, info);
}
return info;
}
_gc(info) {
if (info.opened === 0 && info.outgoing.length === 0 && info.incoming.length === 0) {
this._infos.delete(info.key);
for (const alias of info.aliases) this._infos.delete(alias);
}
}
_ondata(buffer) {
if (buffer.byteLength === 0) return;
try {
const state = { buffer, start: 0, end: buffer.byteLength };
this._decode(c4.uint.decode(state), state);
} catch (err) {
this._safeDestroy(err);
}
}
_ondrain() {
this.drained = true;
for (const s of this._local) {
if (s !== null) s._track(s.ondrain(s));
}
}
_onend() {
this.stream.end();
}
_decode(remoteId, state) {
const type = c4.uint.decode(state);
if (remoteId === 0) {
return this._oncontrolsession(type, state);
}
const r = remoteId <= this._remote.length ? this._remote[remoteId - 1] : null;
if (r === null) return null;
if (r.pending !== null) {
this._bufferMessage(r, type, state);
return null;
}
return r.session._recv(type, state);
}
_oncontrolsession(type, state) {
switch (type) {
case 0:
this._onbatch(state);
break;
case 1:
return this._onopensession(state);
case 2:
this._onrejectsession(state);
break;
case 3:
this._onclosesession(state);
break;
}
return null;
}
_bufferMessage(r, type, { buffer, start, end }) {
const state = { buffer, start, end };
r.pending.push({ type, state });
this._buffered += byteSize(state);
this._pauseMaybe();
}
_pauseMaybe() {
if (this._paused === true || this._buffered <= MAX_BUFFERED) return;
this._paused = true;
this.stream.pause();
}
_resumeMaybe() {
if (this._paused === false || this._buffered > MAX_BUFFERED) return;
this._paused = false;
this.stream.resume();
}
_onbatch(state) {
const end = state.end;
let remoteId = c4.uint.decode(state);
let waiting = null;
while (state.end > state.start) {
const len = c4.uint.decode(state);
if (len === 0) {
remoteId = c4.uint.decode(state);
continue;
}
state.end = state.start + len;
if (end !== state.end && waiting === null) {
waiting = [];
this.cork();
}
const p = this._decode(remoteId, state);
if (waiting !== null && p !== null) waiting.push(p);
state.start = state.end;
state.end = end;
}
if (waiting !== null) {
Promise.all(waiting).then(this._uncorkBound, this._safeDestroyBound);
}
}
_onopensession(state) {
const remoteId = c4.uint.decode(state);
const protocol = c4.string.decode(state);
const id = unslab(c4.buffer.decode(state));
if (remoteId === 0) {
this._rejectSession(0);
return null;
}
const rid = remoteId - 1;
const info = this._get(protocol, id);
if (this._remote.length === rid) {
this._remote.push(null);
}
if (rid >= this._remote.length || this._remote[rid] !== null) {
throw new Error("Invalid open message");
}
if (info.outgoing.length > 0) {
const localId = info.outgoing.shift();
const session = this._local[localId - 1];
if (session === null) {
this._free.push(localId - 1);
return null;
}
this._remote[rid] = { state, pending: null, session: null };
session._remoteId = remoteId;
session._fullyOpen();
return null;
}
const copyState = { buffer: state.buffer, start: state.start, end: state.end };
this._remote[rid] = { state: copyState, pending: [], session: null };
if (++this._remoteBacklog > MAX_BACKLOG) {
throw new Error("Remote exceeded backlog");
}
info.pairing++;
info.incoming.push(remoteId);
return this._requestSession(protocol, id, info).catch(this._safeDestroyBound);
}
_onrejectsession(state) {
const localId = c4.uint.decode(state);
for (const info of this._infos.values()) {
const i = info.outgoing.indexOf(localId);
if (i === -1) continue;
info.outgoing.splice(i, 1);
const session = this._local[localId - 1];
this._free.push(localId - 1);
if (session !== null) session._close(true);
this._gc(info);
return;
}
throw new Error("Invalid reject message");
}
_onclosesession(state) {
const remoteId = c4.uint.decode(state);
if (remoteId === 0) return;
const rid = remoteId - 1;
const r = rid < this._remote.length ? this._remote[rid] : null;
if (r === null) return;
if (r.session !== null) r.session._close(true);
}
async _requestSession(protocol, id, info) {
const notify = this._notify.get(toKey(protocol, id)) || this._notify.get(toKey(protocol, null));
if (notify) await notify(id);
if (--info.pairing > 0) return;
while (info.incoming.length > 0) {
this._rejectSession(info, info.incoming.shift());
}
this._gc(info);
}
_rejectSession(info, remoteId) {
if (remoteId > 0) {
const r = this._remote[remoteId - 1];
if (r.pending !== null) {
for (let i = 0; i < r.pending.length; i++) {
this._buffered -= byteSize(r.pending[i].state);
}
}
this._remote[remoteId - 1] = null;
this._resumeMaybe();
}
const state = { buffer: null, start: 2, end: 2 };
c4.uint.preencode(state, remoteId);
state.buffer = this._alloc(state.end);
state.buffer[0] = 0;
state.buffer[1] = 2;
c4.uint.encode(state, remoteId);
this._write0(state.buffer);
}
_write0(buffer) {
if (this._batch !== null) {
this._pushBatch(0, buffer.subarray(1));
return;
}
this.drained = this.stream.write(buffer);
}
destroy(err) {
this.stream.destroy(err);
}
_safeDestroy(err) {
safetyCatch(err);
this.stream.destroy(err);
}
_shutdown() {
for (const s of this._local) {
if (s !== null) s._close(true);
}
}
};
function noop() {
}
function toKey(protocol, id) {
return protocol + "##" + (id ? b4a4.toString(id, "hex") : "");
}
function byteSize(state) {
return 512 + (state.end - state.start);
}
function isPromise(p) {
return !!(p && typeof p.then === "function");
}
function encodingLength(enc, val) {
const state = { buffer: null, start: 0, end: 0 };
enc.preencode(state, val);
return state.end;
}
}
});
// node_modules/hyperschema/runtime.cjs
var require_runtime = __commonJS({
"node_modules/hyperschema/runtime.cjs"(exports2, module2) {
module2.exports = {
c: require_compact_encoding()
};
}
});
// node_modules/protomux-wakeup/spec/hyperschema/index.js
var require_hyperschema = __commonJS({
"node_modules/protomux-wakeup/spec/hyperschema/index.js"(exports2, module2) {
var VERSION3 = 1;
var { c: c4 } = require_runtime();
var version3 = VERSION3;
var encoding03 = {
preencode(state, m) {
state.end++;
},
encode(state, m) {
const flags = m.active ? 1 : 0;
c4.uint.encode(state, flags);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
active: (flags & 1) !== 0
};
}
};
var encoding110 = {
preencode(state, m) {
c4.uint.preencode(state, m.version);
c4.fixed32.preencode(state, m.capability);
state.end++;
},
encode(state, m) {
const flags = m.active ? 1 : 0;
c4.uint.encode(state, m.version);
c4.fixed32.encode(state, m.capability);
c4.uint.encode(state, flags);
},
decode(state) {
const r0 = c4.uint.decode(state);
const r1 = c4.fixed32.decode(state);
const flags = c4.uint.decode(state);
return {
version: r0,
capability: r1,
active: (flags & 1) !== 0
};
}
};
var encoding23 = {
preencode(state, m) {
c4.fixed32.preencode(state, m.key);
c4.uint.preencode(state, m.length);
},
encode(state, m) {
c4.fixed32.encode(state, m.key);
c4.uint.encode(state, m.length);
},
decode(state) {
const r0 = c4.fixed32.decode(state);
const r1 = c4.uint.decode(state);
return {
key: r0,
length: r1
};
}
};
var encoding33 = c4.array(encoding23);
var encoding43 = {
preencode(state, m) {
state.end++;
if (m.hash) c4.fixed32.preencode(state, m.hash);
},
encode(state, m) {
const flags = m.hash ? 1 : 0;
c4.uint.encode(state, flags);
if (m.hash) c4.fixed32.encode(state, m.hash);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
hash: (flags & 1) !== 0 ? c4.fixed32.decode(state) : null
};
}
};
function setVersion3(v) {
version3 = v;
}
function encode2(name, value, v = VERSION3) {
version3 = v;
return c4.encode(getEncoding3(name), value);
}
function decode2(name, buffer, v = VERSION3) {
version3 = v;
return c4.decode(getEncoding3(name), buffer);
}
function getEnum(name) {
switch (name) {
default:
throw new Error("Enum not found " + name);
}
}
function getEncoding3(name) {
switch (name) {
case "@wakeup/info":
return encoding03;
case "@wakeup/handshake":
return encoding110;
case "@wakeup/writer":
return encoding23;
case "@wakeup/announce":
return encoding33;
case "@wakeup/lookup":
return encoding43;
default:
throw new Error("Encoder not found " + name);
}
}
function getStruct(name, v = VERSION3) {
const enc = getEncoding3(name);
return {
preencode(state, m) {
version3 = v;
enc.preencode(state, m);
},
encode(state, m) {
version3 = v;
enc.encode(state, m);
},
decode(state) {
version3 = v;
return enc.decode(state);
}
};
}
var resolveStruct = getStruct;
module2.exports = {
resolveStruct,
getStruct,
getEnum,
getEncoding: getEncoding3,
encode: encode2,
decode: decode2,
setVersion: setVersion3,
version: version3
};
}
});
// node_modules/protomux-wakeup/index.js
var require_protomux_wakeup = __commonJS({
"node_modules/protomux-wakeup/index.js"(exports2, module2) {
var crypto = require_hypercore_crypto();
var Protomux = require_protomux();
var b4a4 = require_b4a();
var schema = require_hyperschema();
var [NS_INITATOR, NS_RESPONDER] = crypto.namespace("wakeup", 2);
var Handshake = schema.getEncoding("@wakeup/handshake");
var Announce = schema.getEncoding("@wakeup/announce");
var Lookup = schema.getEncoding("@wakeup/lookup");
var Info = schema.getEncoding("@wakeup/info");
module2.exports = class WakeupSwarm {
constructor(onwakeup = noop, { gcTickTime = 2e3 } = {}) {
this.gcTickTime = gcTickTime;
this.topics = /* @__PURE__ */ new Map();
this.topicsGC = /* @__PURE__ */ new Set();
this.muxers = /* @__PURE__ */ new Set();
this.stats = {
sessionsOpened: 0,
sessionsClosed: 0,
topicsAdded: 0,
topicsGcd: 0,
peersAdded: 0,
peersRemoved: 0,
wireAnnounce: { rx: 0, tx: 0 },
wireLookup: { rx: 0, tx: 0 },
wireInfo: { rx: 0, tx: 0 }
};
this.onwakeup = onwakeup;
this._gcInterval = null;
this._gcBound = this._gc.bind(this);
}
session(capability, handlers = {}) {
const id = handlers.discoveryKey || crypto.discoveryKey(capability);
const active = handlers.active !== false;
const hex = b4a4.toString(id, "hex");
let w = this.topics.get(hex);
if (w) return w.addSession(handlers);
w = new WakeupTopic(this, id, capability, active);
this.topics.set(hex, w);
for (const muxer of this.muxers) {
w._onopen(muxer, true);
}
return w.addSession(handlers);
}
getSessions(capability, handlers = {}) {
const id = handlers.discoveryKey || crypto.discoveryKey(capability);
const hex = b4a4.toString(id, "hex");
const w = this.topics.get(hex);
return w ? w.sessions : [];
}
hasStream(stream, capability, handlers = {}) {
if (!capability) {
const noiseStream = stream.noiseStream || stream;
return this.muxers.has(getMuxer(noiseStream));
}
const id = handlers.discoveryKey || crypto.discoveryKey(capability);
const hex = b4a4.toString(id, "hex");
const t = this.topics.get(hex);
return t ? t.peersByStream.has(stream) : false;
}
addStream(stream) {
const noiseStream = stream.noiseStream || stream;
if (!noiseStream.connected) {
noiseStream.once("open", this.addStream.bind(this, noiseStream));
return;
}
const muxer = getMuxer(noiseStream);
muxer.pair({ protocol: "wakeup" }, (id) => this._onpair(id, muxer));
this.muxers.add(muxer);
noiseStream.on("close", () => this.muxers.delete(muxer));
for (const w of this.topics.values()) {
if (!w.isActive) continue;
w._onopen(muxer, true);
}
}
_onActive(w) {
for (const m of this.muxers) {
w._onopen(m, false);
}
}
_addGC(topic) {
if (topic.destroyed) return;
this.topicsGC.add(topic);
if (this._gcInterval === null) {
this._gcInterval = setInterval(this._gcBound, this.gcTickTime);
}
}
_removeGC(topic) {
this.topicsGC.delete(topic);
if (this.topicsGC.size === 0 && this._gcInterval) {
clearInterval(this._gcInterval);
this._gcInterval = null;
}
}
_gc() {
const destroy = [];
for (const w of this.topicsGC) {
w.idleTicks++;
if (w.idleTicks >= 5) destroy.push(w);
}
for (const w of destroy) w.teardown();
}
destroy() {
if (this._gcInterval) clearInterval(this._gcInterval);
this._gcInterval = null;
for (const w of this.topics.values()) w.teardown();
}
async _onpair(id, stream) {
const hex = b4a4.toString(id, "hex");
const w = this.topics.get(hex);
if (!w || !w.sessions.length) return this.onwakeup(id, stream);
w._onopen(getMuxer(stream), false);
}
registerMetrics(promClient) {
const self = this;
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_sessions_opened",
help: "The amount of sessions opened by protomux wakeup",
collect() {
this.set(self.stats.sessionsOpened);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_sessions_closed",
help: "The amount of sessions closed by protomux wakeup",
collect() {
this.set(self.stats.sessionsClosed);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_topics_added",
help: "The amount of topics added to protomux wakeup",
collect() {
this.set(self.stats.topicsAdded);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_topics_gcd",
help: "The amount of topics that got garbage collected by protomux wakeup",
collect() {
this.set(self.stats.topicsGcd);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_peers_added",
help: "The amount of peers added by protomux wakeup, across all topics",
collect() {
this.set(self.stats.peersAdded);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_peers_removed",
help: "The amount of peers removed by protomux wakeup, across all topics",
collect() {
this.set(self.stats.peersRemoved);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_wire_announce_rx",
help: "The amount of wire announce messages received by protomux wakeup",
collect() {
this.set(self.stats.wireAnnounce.rx);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_wire_announce_tx",
help: "The amount of wire announce messages transmitted by protomux wakeup",
collect() {
this.set(self.stats.wireAnnounce.tx);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_wire_lookup_rx",
help: "The amount of wire lookup messages received by protomux wakeup",
collect() {
this.set(self.stats.wireLookup.rx);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_wire_lookup_tx",
help: "The amount of wire lookup messages transmitted by protomux wakeup",
collect() {
this.set(self.stats.wireLookup.tx);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_wire_info_rx",
help: "The amount of wire info messages received by protomux wakeup",
collect() {
this.set(self.stats.wireInfo.rx);
}
});
new promClient.Gauge({
// eslint-disable-line no-new
name: "protomux_wakeup_wire_info_tx",
help: "The amount of wire info messages transmitted by protomux wakeup",
collect() {
this.set(self.stats.wireInfo.rx);
}
});
}
};
var WakeupPeer = class {
constructor(topic) {
this.index = 0;
this.userData = null;
this.clock = 0;
this.pending = true;
this.removed = false;
this.topic = topic;
this.channel = null;
this.stream = null;
this.wireLookup = null;
this.wireAnnounce = null;
this.wireInfo = null;
this.active = false;
}
unlink(list) {
const head = list.pop();
if (head === this) return;
head.index = this.index;
list[head.index] = head;
}
};
var WakeupSession = class {
constructor(topic, handlers) {
this.index = 0;
this.topic = topic;
this.handlers = handlers;
this.isActive = handlers.active !== false;
this.destroyed = false;
}
get peers() {
return this.topic.peers;
}
hasStream(stream) {
return !!this.getPeer(stream);
}
addStream(stream) {
this.topic.addStream(stream);
}
getPeer(stream) {
return this.topic.peersByStream.get(stream) || null;
}
broadcastLookup(req) {
for (const peer of this.topic.pendingPeers) {
this.lookup(peer, req);
}
for (const peer of this.topic.peers) {
this.lookup(peer, req);
}
}
lookupByStream(stream, req) {
const peer = this.topic.peersByStream.get(stream);
if (peer) this.lookup(peer, req);
}
lookup(peer, req) {
peer.topic.state.stats.wireLookup.tx++;
peer.wireLookup.send(req || { hash: null });
}
announceByStream(stream, wakeup) {
const peer = this.topic.peersByStream.get(stream);
if (peer && !peer.pending) this.announce(peer, wakeup);
}
announce(peer, wakeup) {
peer.topic.state.stats.wireAnnounce.tx++;
peer.wireAnnounce.send(wakeup);
}
active() {
this.isActive = true;
this.topic._bumpActivity();
}
inactive() {
this.isActive = false;
this.topic._bumpActivity();
}
destroy() {
if (this.destroyed) return;
this.destroyed = true;
this.topic.removeSession(this);
}
};
var WakeupTopic = class {
constructor(state, id, capability, active) {
this.state = state;
this.sessions = [];
this.id = id;
this.capability = capability;
this.peers = [];
this.pendingPeers = [];
this.peersByStream = /* @__PURE__ */ new Map();
this.activePeers = 0;
this.isActive = active;
this.idleTicks = 0;
this.gcing = false;
this.destroyed = false;
this.state.stats.topicsAdded++;
}
addSession(handlers) {
this.state.stats.sessionsOpened++;
const session = new WakeupSession(this, handlers);
session.index = this.sessions.length;
this.sessions.push(session);
this._bumpActivity();
this._checkGC();
return session;
}
removeSession(session) {
if (this.sessions.length <= session.index) return;
if (this.sessions[session.index] !== session) return;
this.state.stats.sessionsClosed++;
const head = this.sessions.pop();
if (head !== session) {
head.index = session.index;
this.sessions[head.index] = head;
}
this._bumpActivity();
this._checkGC();
}
_bumpActivity() {
let isActive = false;
for (let i = this.sessions.length - 1; i >= 0; i--) {
if (this.sessions[i].isActive) {
isActive = true;
break;
}
}
if (isActive) this.active();
else this.inactive();
}
active() {
if (this.isActive) return;
this.idleTicks = 0;
this.isActive = true;
this._updateActive(true);
}
inactive() {
if (!this.isActive) return;
this.isActive = false;
this._updateActive(false);
}
_updateActive(active) {
const info = { active };
for (const peer of this.pendingPeers) {
peer.topic.state.stats.wireInfo.tx++;
peer.wireInfo.send(info);
}
for (const peer of this.peers) {
peer.topic.state.stats.wireInfo.tx++;
peer.wireInfo.send(info);
}
this._checkGC();
if (active) this.state._onActive(this);
}
teardown() {
if (this.destroyed) return;
this.destroyed = true;
this.state.stats.topicsGcd++;
for (let i = this.peers.length - 1; i >= 0; i--) {
this.peers[i].channel.close();
}
for (let i = this.pendingPeers.length - 1; i >= 0; i--) {
this.pendingPeers[i].channel.close();
}
const hex = b4a4.toString(this.id, "hex");
this.gcing = false;
this.state.topics.delete(hex);
this.state._removeGC(this);
for (let i = this.sessions.length - 1; i >= 0; i--) {
this.state.stats.sessionsClosed++;
const session = this.sessions[i];
if (session.handlers.ondestroy) session.handlers.ondestroy(session);
}
}
addStream(stream) {
this._onopen(getMuxer(stream), false);
}
_proveCapabilityTo(stream) {
return this._makeCapability(stream.isInitiator, stream.handshakeHash);
}
_makeCapability(isInitiator, handshakeHash) {
return crypto.hash([isInitiator ? NS_INITATOR : NS_RESPONDER, this.capability, handshakeHash]);
}
_addPeer(peer, open) {
if (!b4a4.equals(
open.capability,
this._makeCapability(!peer.stream.isInitiator, peer.stream.handshakeHash)
)) {
peer.channel.close();
return;
}
if (peer.pending) {
peer.unlink(this.pendingPeers);
}
peer.active = open.active;
peer.pending = false;
peer.index = this.peers.push(peer) - 1;
if (peer.active) {
this.activePeers++;
this._checkGC();
}
for (let i = this.sessions.length - 1; i >= 0; i--) {
const session = this.sessions[i];
const handlers = session.handlers;
if (handlers.onpeeradd) handlers.onpeeradd(peer, session);
if (peer.active && handlers.onpeeractive) handlers.onpeeractive(peer, session);
}
}
_checkGC() {
const shouldGC = this.activePeers === 0 && this.sessions.length === 0;
if (shouldGC) {
if (!this.gcing) {
this.gcing = true;
this.state._addGC(this);
}
} else {
if (this.gcing) {
this.gcing = false;
this.state._removeGC(this);
}
}
}
_removePeer(peer) {
this.state.stats.peersRemoved++;
peer.removed = true;
this.peersByStream.delete(peer.stream);
if (peer.pending) {
peer.unlink(this.pendingPeers);
return;
}
const active = peer.active;
if (active) {
peer.active = false;
this.activePeers--;
this._checkGC();
}
peer.unlink(this.peers);
for (let i = this.sessions.length - 1; i >= 0; i--) {
const session = this.sessions[i];
const handlers = session.handlers;
if (active && handlers.onpeerinactive) handlers.onpeerinactive(peer, session);
if (handlers.onpeerremove) handlers.onpeerremove(peer, session);
}
}
_onannounce(wakeup, peer) {
for (let i = this.sessions.length - 1; i >= 0; i--) {
const session = this.sessions[i];
const handlers = session.handlers;
if (handlers.onannounce) handlers.onannounce(wakeup, peer, session);
}
}
_onlookup(req, peer) {
for (let i = this.sessions.length - 1; i >= 0; i--) {
const session = this.sessions[i];
const handlers = session.handlers;
if (handlers.onlookup) handlers.onlookup(req, peer, session);
}
}
_oninfo(info, peer) {
if (info.active) {
if (!peer.active) {
peer.active = true;
this.activePeers++;
this._checkGC();
for (let i = this.sessions.length - 1; i >= 0; i--) {
const session = this.sessions[i];
const handlers = session.handlers;
if (handlers.onpeeractive) handlers.onpeeractive(peer, session);
}
}
} else {
if (peer.active) {
peer.active = false;
this.activePeers--;
this._checkGC();
for (let i = this.sessions.length - 1; i >= 0; i--) {
const session = this.sessions[i];
const handlers = session.handlers;
if (handlers.onpeerinactive) handlers.onpeerinactive(peer, session);
}
}
}
}
_onopen(muxer, unique) {
if (!unique && this.peersByStream.has(muxer.stream)) return;
const peer = new WakeupPeer(this);
const ch = muxer.createChannel({
userData: peer,
protocol: "wakeup",
id: this.id,
handshake: Handshake,
messages: [
{ encoding: Lookup, onmessage: onlookup },
{ encoding: Announce, onmessage: onannounce },
{ encoding: Info, onmessage: onchannelinfo }
],
onopen: onchannelopen,
onclose: onchannelclose
});
if (!ch) return;
this.state.stats.peersAdded++;
peer.channel = ch;
peer.stream = muxer.stream;
peer.wireLookup = ch.messages[0];
peer.wireAnnounce = ch.messages[1];
peer.wireInfo = ch.messages[2];
peer.index = this.pendingPeers.push(peer) - 1;
this.peersByStream.set(muxer.stream, peer);
ch.open({
version: 0,
capability: this._proveCapabilityTo(muxer.stream),
active: this.isActive
});
}
};
function onchannelopen(open, channel) {
const peer = channel.userData;
peer.topic._addPeer(peer, open);
}
function onchannelclose(close, channel) {
const peer = channel.userData;
peer.topic._removePeer(peer);
}
function onlookup(req, channel) {
const peer = channel.userData;
peer.topic.state.stats.wireLookup.rx++;
peer.topic._onlookup(req, peer);
}
function onannounce(wakeup, channel) {
const peer = channel.userData;
peer.topic.state.stats.wireAnnounce.rx++;
peer.topic._onannounce(wakeup, peer);
}
function onchannelinfo(info, channel) {
const peer = channel.userData;
peer.topic.state.stats.wireInfo.rx++;
peer.topic._oninfo(info, peer);
}
function getMuxer(stream) {
if (Protomux.isProtomux(stream)) return stream;
if (stream.noiseStream.userData) return stream.noiseStream.userData;
const mux = Protomux.from(stream.noiseStream);
stream.noiseStream.userData = mux;
return mux;
}
function noop() {
}
}
});
// node_modules/is-options/index.js
var require_is_options = __commonJS({
"node_modules/is-options/index.js"(exports2, module2) {
var b4a4 = require_b4a();
module2.exports = function isOptions(opts) {
return typeof opts === "object" && opts && !b4a4.isBuffer(opts);
};
}
});
// node_modules/sodium-secretstream/index.js
var require_sodium_secretstream = __commonJS({
"node_modules/sodium-secretstream/index.js"(exports2, module2) {
var sodium = require_sodium_universal();
var b4a4 = require_b4a();
var ABYTES = sodium.crypto_secretstream_xchacha20poly1305_ABYTES;
var TAG_MESSAGE = sodium.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE;
var TAG_FINAL = sodium.crypto_secretstream_xchacha20poly1305_TAG_FINAL;
var STATEBYTES = sodium.crypto_secretstream_xchacha20poly1305_STATEBYTES;
var HEADERBYTES = sodium.crypto_secretstream_xchacha20poly1305_HEADERBYTES;
var KEYBYTES = sodium.crypto_secretstream_xchacha20poly1305_KEYBYTES;
var TAG_FINAL_BYTE = b4a4.isBuffer(TAG_FINAL) ? TAG_FINAL[0] : TAG_FINAL;
var EMPTY = b4a4.alloc(0);
var TAG = b4a4.alloc(1);
var Push = class {
constructor(key, state = b4a4.allocUnsafeSlow(STATEBYTES), header = b4a4.allocUnsafeSlow(HEADERBYTES)) {
if (!TAG_FINAL) throw new Error("JavaScript sodium version needs to support crypto_secretstream_xchacha20poly");
this.key = key;
this.state = state;
this.header = header;
sodium.crypto_secretstream_xchacha20poly1305_init_push(this.state, this.header, this.key);
}
next(message, cipher = b4a4.allocUnsafe(message.byteLength + ABYTES)) {
sodium.crypto_secretstream_xchacha20poly1305_push(this.state, cipher, message, null, TAG_MESSAGE);
return cipher;
}
final(message = EMPTY, cipher = b4a4.allocUnsafe(ABYTES)) {
sodium.crypto_secretstream_xchacha20poly1305_push(this.state, cipher, message, null, TAG_FINAL);
return cipher;
}
};
var Pull = class {
constructor(key, state = b4a4.allocUnsafeSlow(STATEBYTES)) {
if (!TAG_FINAL) throw new Error("JavaScript sodium version needs to support crypto_secretstream_xchacha20poly");
this.key = key;
this.state = state;
this.final = false;
}
init(header) {
sodium.crypto_secretstream_xchacha20poly1305_init_pull(this.state, header, this.key);
}
next(cipher, message = b4a4.allocUnsafe(cipher.byteLength - ABYTES)) {
sodium.crypto_secretstream_xchacha20poly1305_pull(this.state, message, TAG, cipher, null);
this.final = TAG[0] === TAG_FINAL_BYTE;
return message;
}
};
function keygen(buf = b4a4.alloc(KEYBYTES)) {
sodium.crypto_secretstream_xchacha20poly1305_keygen(buf);
return buf;
}
module2.exports = {
keygen,
KEYBYTES,
ABYTES,
STATEBYTES,
HEADERBYTES,
Push,
Pull
};
}
});
// node_modules/timeout-refresh/node.js
var require_node = __commonJS({
"node_modules/timeout-refresh/node.js"(exports2, module2) {
module2.exports = class Timer {
constructor(ms, fn, ctx = null, interval = false) {
this.ms = ms;
this.ontimeout = fn;
this.context = ctx;
this.interval = interval;
this.done = false;
this._timer = interval ? setInterval(callInterval, ms, this) : setTimeout(callTimeout, ms, this);
}
unref() {
this._timer.unref();
}
ref() {
this._timer.ref();
}
refresh() {
if (this.done !== true) this._timer.refresh();
}
destroy() {
this.done = true;
this.ontimeout = null;
if (this.interval) clearInterval(this._timer);
else clearTimeout(this._timer);
}
static once(ms, fn, ctx) {
return new this(ms, fn, ctx, false);
}
static on(ms, fn, ctx) {
return new this(ms, fn, ctx, true);
}
};
function callTimeout(self) {
self.done = true;
self.ontimeout.call(self.context);
}
function callInterval(self) {
self.ontimeout.call(self.context);
}
}
});
// node_modules/timeout-refresh/browser.js
var require_browser = __commonJS({
"node_modules/timeout-refresh/browser.js"(exports2, module2) {
module2.exports = class TimerBrowser {
constructor(ms, fn, ctx = null, interval = false) {
this.ms = ms;
this.ontimeout = fn;
this.context = ctx || null;
this.interval = interval;
this.done = false;
this._timer = interval ? setInterval(callInterval, ms, this) : setTimeout(callTimeout, ms, this);
}
unref() {
}
ref() {
}
refresh() {
if (this.done) return;
if (this.interval) {
clearInterval(this._timer);
this._timer = setInterval(callInterval, this.ms, this);
} else {
clearTimeout(this._timer);
this._timer = setTimeout(callTimeout, this.ms, this);
}
}
destroy() {
this.done = true;
this.ontimeout = null;
if (this.interval) clearInterval(this._timer);
else clearTimeout(this._timer);
}
static once(ms, fn, ctx) {
return new this(ms, fn, ctx, false);
}
static on(ms, fn, ctx) {
return new this(ms, fn, ctx, true);
}
};
function callTimeout(self) {
self.done = true;
self.ontimeout.call(self.context);
}
function callInterval(self) {
self.ontimeout.call(self.context);
}
}
});
// node_modules/timeout-refresh/index.js
var require_timeout_refresh = __commonJS({
"node_modules/timeout-refresh/index.js"(exports2, module2) {
module2.exports = isNode() ? require_node() : require_browser();
function isNode() {
const to = setTimeout(function() {
}, 1e3);
clearTimeout(to);
return !!to.refresh;
}
}
});
// node_modules/@hyperswarm/secret-stream/lib/bridge.js
var require_bridge = __commonJS({
"node_modules/@hyperswarm/secret-stream/lib/bridge.js"(exports2, module2) {
var { Duplex, Writable } = require_streamx();
var ReversePassThrough = class extends Duplex {
constructor(s) {
super();
this._stream = s;
this._ondrain = null;
}
_write(data, cb) {
if (this._stream.push(data) === false) {
this._stream._ondrain = cb;
} else {
cb(null);
}
}
_final(cb) {
this._stream.push(null);
cb(null);
}
_read(cb) {
const ondrain = this._ondrain;
this._ondrain = null;
if (ondrain) ondrain();
cb(null);
}
};
module2.exports = class Bridge extends Duplex {
constructor(noiseStream) {
super();
this.noiseStream = noiseStream;
this._ondrain = null;
this.reverse = new ReversePassThrough(this);
}
get publicKey() {
return this.noiseStream.publicKey;
}
get remotePublicKey() {
return this.noiseStream.remotePublicKey;
}
get handshakeHash() {
return this.noiseStream.handshakeHash;
}
flush() {
return Writable.drained(this);
}
_read(cb) {
const ondrain = this._ondrain;
this._ondrain = null;
if (ondrain) ondrain();
cb(null);
}
_write(data, cb) {
if (this.reverse.push(data) === false) {
this.reverse._ondrain = cb;
} else {
cb(null);
}
}
_final(cb) {
this.reverse.push(null);
cb(null);
}
};
}
});
// node_modules/noise-curve-ed/index.js
var require_noise_curve_ed = __commonJS({
"node_modules/noise-curve-ed/index.js"(exports2, module2) {
var sodium = require_sodium_universal();
var assert2 = require_nanoassert();
var b4a4 = require_b4a();
var DHLEN = sodium.crypto_scalarmult_ed25519_BYTES;
var PKLEN = sodium.crypto_scalarmult_ed25519_BYTES;
var SCALARLEN = sodium.crypto_scalarmult_ed25519_BYTES;
var SKLEN = sodium.crypto_sign_SECRETKEYBYTES;
var ALG = "Ed25519";
module2.exports = {
DHLEN,
PKLEN,
SCALARLEN,
SKLEN,
ALG,
name: ALG,
generateKeyPair,
dh
};
function generateKeyPair(privKey) {
if (privKey) return generateSeedKeyPair(privKey.subarray(0, 32));
const keyPair = {};
keyPair.secretKey = b4a4.alloc(SKLEN);
keyPair.publicKey = b4a4.alloc(PKLEN);
sodium.crypto_sign_keypair(keyPair.publicKey, keyPair.secretKey);
return keyPair;
}
function generateSeedKeyPair(seed) {
const keyPair = {};
keyPair.secretKey = b4a4.alloc(SKLEN);
keyPair.publicKey = b4a4.alloc(PKLEN);
sodium.crypto_sign_seed_keypair(keyPair.publicKey, keyPair.secretKey, seed);
return keyPair;
}
function dh(publicKey, { scalar, secretKey }) {
if (!scalar) {
assert2(secretKey.byteLength === SKLEN);
const sk = b4a4.alloc(64);
sodium.crypto_hash_sha512(sk, secretKey.subarray(0, 32));
sk[0] &= 248;
sk[31] &= 127;
sk[31] |= 64;
scalar = sk.subarray(0, 32);
}
assert2(scalar.byteLength === SCALARLEN);
assert2(publicKey.byteLength === PKLEN);
const output = b4a4.alloc(DHLEN);
sodium.crypto_scalarmult_ed25519_noclamp(
output,
scalar,
publicKey
);
return output;
}
}
});
// node_modules/noise-handshake/cipher.js
var require_cipher = __commonJS({
"node_modules/noise-handshake/cipher.js"(exports2, module2) {
var sodium = require_sodium_universal();
var b4a4 = require_b4a();
module2.exports = class CipherState {
constructor(key) {
this.key = key || null;
this.nonce = 0;
this.CIPHER_ALG = "ChaChaPoly";
}
initialiseKey(key) {
this.key = key;
this.nonce = 0;
}
setNonce(nonce) {
this.nonce = nonce;
}
encrypt(plaintext, ad) {
if (!this.hasKey) return plaintext;
if (!ad) ad = b4a4.alloc(0);
const ciphertext = encryptWithAD(this.key, this.nonce, ad, plaintext);
if (ciphertext.length > 65535) throw new Error(`ciphertext length of ${ciphertext.length} exceeds maximum Noise message length of 65535`);
this.nonce++;
return ciphertext;
}
decrypt(ciphertext, ad) {
if (!this.hasKey) return ciphertext;
if (!ad) ad = b4a4.alloc(0);
if (ciphertext.length > 65535) throw new Error(`ciphertext length of ${ciphertext.length} exceeds maximum Noise message length of 65535`);
const plaintext = decryptWithAD(this.key, this.nonce, ad, ciphertext);
this.nonce++;
return plaintext;
}
get hasKey() {
return this.key !== null;
}
_clear() {
sodium.sodium_memzero(this.key);
this.key = null;
this.nonce = null;
}
static get MACBYTES() {
return 16;
}
static get NONCEBYTES() {
return 8;
}
static get KEYBYTES() {
return 32;
}
};
function encryptWithAD(key, counter, additionalData, plaintext) {
if (!b4a4.isBuffer(additionalData)) additionalData = b4a4.from(additionalData, "hex");
if (!b4a4.isBuffer(plaintext)) plaintext = b4a4.from(plaintext, "hex");
const nonce = b4a4.alloc(sodium.crypto_aead_chacha20poly1305_ietf_NPUBBYTES);
const view = new DataView(nonce.buffer, nonce.byteOffset, nonce.byteLength);
view.setUint32(4, counter, true);
const ciphertext = b4a4.alloc(plaintext.byteLength + sodium.crypto_aead_chacha20poly1305_ietf_ABYTES);
sodium.crypto_aead_chacha20poly1305_ietf_encrypt(ciphertext, plaintext, additionalData, null, nonce, key);
return ciphertext;
}
function decryptWithAD(key, counter, additionalData, ciphertext) {
if (!b4a4.isBuffer(additionalData)) additionalData = b4a4.from(additionalData, "hex");
if (!b4a4.isBuffer(ciphertext)) ciphertext = b4a4.from(ciphertext, "hex");
const nonce = b4a4.alloc(sodium.crypto_aead_chacha20poly1305_ietf_NPUBBYTES);
const view = new DataView(nonce.buffer, nonce.byteOffset, nonce.byteLength);
view.setUint32(4, counter, true);
const plaintext = b4a4.alloc(ciphertext.byteLength - sodium.crypto_aead_chacha20poly1305_ietf_ABYTES);
sodium.crypto_aead_chacha20poly1305_ietf_decrypt(plaintext, null, ciphertext, additionalData, nonce, key);
return plaintext;
}
}
});
// node_modules/noise-handshake/dh.js
var require_dh = __commonJS({
"node_modules/noise-handshake/dh.js"(exports2, module2) {
var {
crypto_kx_SEEDBYTES,
crypto_kx_keypair,
crypto_kx_seed_keypair,
crypto_scalarmult_BYTES,
crypto_scalarmult_SCALARBYTES,
crypto_scalarmult,
crypto_scalarmult_base
} = require_sodium_universal();
var assert2 = require_nanoassert();
var b4a4 = require_b4a();
var DHLEN = crypto_scalarmult_BYTES;
var PKLEN = crypto_scalarmult_BYTES;
var SKLEN = crypto_scalarmult_SCALARBYTES;
var SEEDLEN = crypto_kx_SEEDBYTES;
var ALG = "25519";
module2.exports = {
DHLEN,
PKLEN,
SKLEN,
SEEDLEN,
ALG,
generateKeyPair,
generateSeedKeyPair,
dh
};
function generateKeyPair(privKey) {
const keyPair = {};
keyPair.secretKey = privKey || b4a4.alloc(SKLEN);
keyPair.publicKey = b4a4.alloc(PKLEN);
if (privKey) {
crypto_scalarmult_base(keyPair.publicKey, keyPair.secretKey);
} else {
crypto_kx_keypair(keyPair.publicKey, keyPair.secretKey);
}
return keyPair;
}
function generateSeedKeyPair(seed) {
assert2(seed.byteLength === SKLEN);
const keyPair = {};
keyPair.secretKey = b4a4.alloc(SKLEN);
keyPair.publicKey = b4a4.alloc(PKLEN);
crypto_kx_seed_keypair(keyPair.publicKey, keyPair.secretKey, seed);
return keyPair;
}
function dh(publicKey, { secretKey }) {
assert2(secretKey.byteLength === SKLEN);
assert2(publicKey.byteLength === PKLEN);
const output = b4a4.alloc(DHLEN);
crypto_scalarmult(
output,
secretKey,
publicKey
);
return output;
}
}
});
// node_modules/noise-handshake/hmac.js
var require_hmac = __commonJS({
"node_modules/noise-handshake/hmac.js"(exports2, module2) {
var b4a4 = require_b4a();
var { sodium_memzero, crypto_generichash, crypto_generichash_batch } = require_sodium_universal();
var HASHLEN = 64;
var BLOCKLEN = 128;
var scratch = b4a4.alloc(BLOCKLEN * 3);
var HMACKey = scratch.subarray(BLOCKLEN * 0, BLOCKLEN * 1);
var OuterKeyPad = scratch.subarray(BLOCKLEN * 1, BLOCKLEN * 2);
var InnerKeyPad = scratch.subarray(BLOCKLEN * 2, BLOCKLEN * 3);
module2.exports = function hmac(out, batch, key) {
if (key.byteLength > BLOCKLEN) {
crypto_generichash(HMACKey.subarray(0, HASHLEN), key);
sodium_memzero(HMACKey.subarray(HASHLEN));
} else {
HMACKey.set(key);
sodium_memzero(HMACKey.subarray(key.byteLength));
}
for (let i = 0; i < HMACKey.byteLength; i++) {
OuterKeyPad[i] = 92 ^ HMACKey[i];
InnerKeyPad[i] = 54 ^ HMACKey[i];
}
sodium_memzero(HMACKey);
crypto_generichash_batch(out, [InnerKeyPad].concat(batch));
sodium_memzero(InnerKeyPad);
crypto_generichash_batch(out, [OuterKeyPad, out]);
sodium_memzero(OuterKeyPad);
};
module2.exports.BYTES = HASHLEN;
module2.exports.KEYBYTES = BLOCKLEN;
}
});
// node_modules/noise-handshake/hkdf.js
var require_hkdf = __commonJS({
"node_modules/noise-handshake/hkdf.js"(exports2, module2) {
var hmacBlake2b = require_hmac();
var b4a4 = require_b4a();
var HASHLEN = 64;
module2.exports = {
hkdf,
HASHLEN
};
function hkdf(salt, inputKeyMaterial, info = "", length = 2 * HASHLEN) {
const pseudoRandomKey = hkdfExtract(salt, inputKeyMaterial);
return hkdfExpand(pseudoRandomKey, info, length);
}
function hkdfExtract(salt, inputKeyMaterial) {
const hmac = b4a4.alloc(HASHLEN);
return hmacDigest(hmac, salt, inputKeyMaterial);
}
function hkdfExpand(key, info, length) {
const buffer = b4a4.allocUnsafeSlow(length);
const infoBuf = b4a4.from(info);
let prev = infoBuf;
const result = [];
for (let i = 0; i < length; i += HASHLEN) {
const pos = b4a4.from([i / HASHLEN + 1]);
const out = buffer.subarray(i, i + HASHLEN);
result.push(out);
prev = hmacDigest(out, key, [prev, infoBuf, pos]);
}
return result;
}
function hmacDigest(out, key, input) {
hmacBlake2b(out, input, key);
return out;
}
}
});
// node_modules/noise-handshake/symmetric-state.js
var require_symmetric_state = __commonJS({
"node_modules/noise-handshake/symmetric-state.js"(exports2, module2) {
var sodium = require_sodium_universal();
var assert2 = require_nanoassert();
var b4a4 = require_b4a();
var CipherState = require_cipher();
var curve = require_dh();
var { HASHLEN, hkdf } = require_hkdf();
module2.exports = class SymmetricState extends CipherState {
constructor(opts = {}) {
super();
this.curve = opts.curve || curve;
this.digest = b4a4.alloc(HASHLEN);
this.chainingKey = null;
this.offset = 0;
this.DH_ALG = this.curve.ALG;
}
mixHash(data) {
accumulateDigest(this.digest, data);
}
mixKeyAndHash(key) {
const [ck, tempH, tempK] = hkdf(this.chainingKey, key, "", 3 * HASHLEN);
this.chainingKey = ck;
this.mixHash(tempH);
this.initialiseKey(tempK.subarray(0, 32));
}
mixKeyNormal(key) {
const [ck, tempK] = hkdf(this.chainingKey, key);
this.chainingKey = ck;
this.initialiseKey(tempK.subarray(0, 32));
}
mixKey(remoteKey, localKey) {
const dh = this.curve.dh(remoteKey, localKey);
const hkdfResult = hkdf(this.chainingKey, dh);
this.chainingKey = hkdfResult[0];
this.initialiseKey(hkdfResult[1].subarray(0, 32));
}
encryptAndHash(plaintext) {
const ciphertext = this.encrypt(plaintext, this.digest);
accumulateDigest(this.digest, ciphertext);
return ciphertext;
}
decryptAndHash(ciphertext) {
const plaintext = this.decrypt(ciphertext, this.digest);
accumulateDigest(this.digest, ciphertext);
return plaintext;
}
getHandshakeHash(out) {
if (!out) return this.getHandshakeHash(b4a4.alloc(HASHLEN));
assert2(out.byteLength === HASHLEN, `output must be ${HASHLEN} bytes`);
out.set(this.digest);
return out;
}
split() {
const res = hkdf(this.chainingKey, b4a4.alloc(0));
return res.map((k) => k.subarray(0, 32));
}
_clear() {
super._clear();
sodium.sodium_memzero(this.digest);
sodium.sodium_memzero(this.chainingKey);
this.digest = null;
this.chainingKey = null;
this.offset = null;
this.curve = null;
}
static get alg() {
return CipherState.alg + "_BLAKE2b";
}
};
function accumulateDigest(digest, input) {
const toHash = b4a4.concat([digest, input]);
sodium.crypto_generichash(digest, toHash);
}
}
});
// node_modules/noise-handshake/noise.js
var require_noise = __commonJS({
"node_modules/noise-handshake/noise.js"(exports2, module2) {
var assert2 = require_nanoassert();
var b4a4 = require_b4a();
var SymmetricState = require_symmetric_state();
var { HASHLEN } = require_hkdf();
var PRESHARE_IS = /* @__PURE__ */ Symbol("initiator static key preshared");
var PRESHARE_RS = /* @__PURE__ */ Symbol("responder static key preshared");
var TOK_PSK = /* @__PURE__ */ Symbol("psk");
var TOK_S = /* @__PURE__ */ Symbol("s");
var TOK_E = /* @__PURE__ */ Symbol("e");
var TOK_ES = /* @__PURE__ */ Symbol("es");
var TOK_SE = /* @__PURE__ */ Symbol("se");
var TOK_EE = /* @__PURE__ */ Symbol("ee");
var TOK_SS = /* @__PURE__ */ Symbol("ss");
var HANDSHAKES = Object.freeze({
NN: [
[TOK_E],
[TOK_E, TOK_EE]
],
NNpsk0: [
[TOK_PSK, TOK_E],
[TOK_E, TOK_EE]
],
XX: [
[TOK_E],
[TOK_E, TOK_EE, TOK_S, TOK_ES],
[TOK_S, TOK_SE]
],
XXpsk0: [
[TOK_PSK, TOK_E],
[TOK_E, TOK_EE, TOK_S, TOK_ES],
[TOK_S, TOK_SE]
],
IK: [
PRESHARE_RS,
[TOK_E, TOK_ES, TOK_S, TOK_SS],
[TOK_E, TOK_EE, TOK_SE]
],
XK: [
PRESHARE_RS,
[TOK_E, TOK_ES],
[TOK_E, TOK_EE],
[TOK_S, TOK_SE]
]
});
var Writer = class {
constructor() {
this.size = 0;
this.buffers = [];
}
push(b) {
this.size += b.byteLength;
this.buffers.push(b);
}
end() {
const all = b4a4.alloc(this.size);
let offset = 0;
for (const b of this.buffers) {
all.set(b, offset);
offset += b.byteLength;
}
return all;
}
};
var Reader = class {
constructor(buf) {
this.offset = 0;
this.buffer = buf;
}
shift(n) {
const start = this.offset;
const end = this.offset += n;
if (end > this.buffer.byteLength) throw new Error("Insufficient bytes");
return this.buffer.subarray(start, end);
}
end() {
return this.shift(this.buffer.byteLength - this.offset);
}
};
module2.exports = class NoiseState extends SymmetricState {
constructor(pattern, initiator, staticKeypair, opts = {}) {
super(opts);
this.s = staticKeypair || this.curve.generateKeyPair();
this.e = null;
this.psk = null;
if (opts && opts.psk) this.psk = opts.psk;
this.re = null;
this.rs = null;
this.pattern = pattern;
this.handshake = HANDSHAKES[this.pattern].slice();
this.isPskHandshake = !!this.psk && hasPskToken(this.handshake);
this.protocol = b4a4.from([
"Noise",
this.pattern,
this.DH_ALG,
this.CIPHER_ALG,
"BLAKE2b"
].join("_"));
this.initiator = initiator;
this.complete = false;
this.rx = null;
this.tx = null;
this.hash = null;
}
initialise(prologue, remoteStatic) {
if (this.protocol.byteLength <= HASHLEN) this.digest.set(this.protocol);
else this.mixHash(this.protocol);
this.chainingKey = b4a4.from(this.digest);
this.mixHash(prologue);
while (!Array.isArray(this.handshake[0])) {
const message = this.handshake.shift();
assert2(
message === PRESHARE_RS || message === PRESHARE_IS,
"Unexpected pattern"
);
const takeRemoteKey = this.initiator ? message === PRESHARE_RS : message === PRESHARE_IS;
if (takeRemoteKey) this.rs = remoteStatic;
const key = takeRemoteKey ? this.rs : this.s.publicKey;
assert2(key != null, "Remote pubkey required");
this.mixHash(key);
}
}
final() {
const [k1, k2] = this.split();
this.tx = this.initiator ? k1 : k2;
this.rx = this.initiator ? k2 : k1;
this.complete = true;
this.hash = this.getHandshakeHash();
this._clear();
}
recv(buf) {
const r = new Reader(buf);
for (const pattern of this.handshake.shift()) {
switch (pattern) {
case TOK_PSK:
this.mixKeyAndHash(this.psk);
break;
case TOK_E:
this.re = r.shift(this.curve.PKLEN);
this.mixHash(this.re);
if (this.isPskHandshake) this.mixKeyNormal(this.re);
break;
case TOK_S: {
const klen = this.hasKey ? this.curve.PKLEN + 16 : this.curve.PKLEN;
this.rs = this.decryptAndHash(r.shift(klen));
break;
}
case TOK_EE:
case TOK_ES:
case TOK_SE:
case TOK_SS: {
const useStatic = keyPattern(pattern, this.initiator);
const localKey = useStatic.local ? this.s : this.e;
const remoteKey = useStatic.remote ? this.rs : this.re;
this.mixKey(remoteKey, localKey);
break;
}
default:
throw new Error("Unexpected message");
}
}
const payload = this.decryptAndHash(r.end());
if (!this.handshake.length) this.final();
return payload;
}
send(payload = b4a4.alloc(0)) {
const w = new Writer();
for (const pattern of this.handshake.shift()) {
switch (pattern) {
case TOK_PSK:
this.mixKeyAndHash(this.psk);
break;
case TOK_E:
if (this.e === null) this.e = this.curve.generateKeyPair();
this.mixHash(this.e.publicKey);
if (this.isPskHandshake) this.mixKeyNormal(this.e.publicKey);
w.push(this.e.publicKey);
break;
case TOK_S:
w.push(this.encryptAndHash(this.s.publicKey));
break;
case TOK_ES:
case TOK_SE:
case TOK_EE:
case TOK_SS: {
const useStatic = keyPattern(pattern, this.initiator);
const localKey = useStatic.local ? this.s : this.e;
const remoteKey = useStatic.remote ? this.rs : this.re;
this.mixKey(remoteKey, localKey);
break;
}
default:
throw new Error("Unexpected message");
}
}
w.push(this.encryptAndHash(payload));
const response = w.end();
if (!this.handshake.length) this.final();
return response;
}
_clear() {
super._clear();
this.e.secretKey.fill(0);
this.e.publicKey.fill(0);
this.re.fill(0);
this.e = null;
this.re = null;
}
};
function keyPattern(pattern, initiator) {
const ret = {
local: false,
remote: false
};
switch (pattern) {
case TOK_EE:
return ret;
case TOK_ES:
ret.local ^= !initiator;
ret.remote ^= initiator;
return ret;
case TOK_SE:
ret.local ^= initiator;
ret.remote ^= !initiator;
return ret;
case TOK_SS:
ret.local ^= 1;
ret.remote ^= 1;
return ret;
}
}
function hasPskToken(handshake) {
return handshake.some((x) => {
return Array.isArray(x) && x.indexOf(TOK_PSK) !== -1;
});
}
}
});
// node_modules/@hyperswarm/secret-stream/lib/handshake.js
var require_handshake = __commonJS({
"node_modules/@hyperswarm/secret-stream/lib/handshake.js"(exports2, module2) {
var sodium = require_sodium_universal();
var curve = require_noise_curve_ed();
var Noise = require_noise();
var b4a4 = require_b4a();
var EMPTY = b4a4.alloc(0);
module2.exports = class Handshake {
constructor(isInitiator, keyPair, remotePublicKey, pattern) {
this.isInitiator = isInitiator;
this.keyPair = keyPair;
this.noise = new Noise(pattern, isInitiator, keyPair, { curve });
this.noise.initialise(EMPTY, remotePublicKey);
this.destroyed = false;
}
static keyPair(seed) {
const publicKey = b4a4.alloc(32);
const secretKey = b4a4.alloc(64);
if (seed) sodium.crypto_sign_seed_keypair(publicKey, secretKey, seed);
else sodium.crypto_sign_keypair(publicKey, secretKey);
return { publicKey, secretKey };
}
recv(data) {
try {
this.noise.recv(data);
if (this.noise.complete) return this._return(null);
return this.send();
} catch {
this.destroy();
return null;
}
}
// note that the data returned here is framed so we don't have to do an extra copy
// when sending it...
send() {
try {
const data = this.noise.send();
const wrap = b4a4.allocUnsafe(data.byteLength + 3);
writeUint24le(data.byteLength, wrap);
wrap.set(data, 3);
return this._return(wrap);
} catch {
this.destroy();
return null;
}
}
destroy() {
if (this.destroyed) return;
this.destroyed = true;
}
_return(data) {
const tx = this.noise.complete ? b4a4.toBuffer(this.noise.tx) : null;
const rx = this.noise.complete ? b4a4.toBuffer(this.noise.rx) : null;
const hash = this.noise.complete ? b4a4.toBuffer(this.noise.hash) : null;
const remotePublicKey = this.noise.complete ? b4a4.toBuffer(this.noise.rs) : null;
return {
data,
remotePublicKey,
hash,
tx,
rx
};
}
};
function writeUint24le(n, buf) {
buf[0] = n & 255;
buf[1] = n >>> 8 & 255;
buf[2] = n >>> 16 & 255;
}
}
});
// node_modules/@hyperswarm/secret-stream/index.js
var require_secret_stream = __commonJS({
"node_modules/@hyperswarm/secret-stream/index.js"(exports2, module2) {
var { Pull, Push, HEADERBYTES, KEYBYTES, ABYTES } = require_sodium_secretstream();
var sodium = require_sodium_universal();
var crypto = require_hypercore_crypto();
var { Duplex, Writable, getStreamError } = require_streamx();
var b4a4 = require_b4a();
var Timeout = require_timeout_refresh();
var unslab = require_unslab();
var Bridge = require_bridge();
var Handshake = require_handshake();
var IDHEADERBYTES = HEADERBYTES + 32;
var [NS_INITIATOR, NS_RESPONDER, NS_SEND] = crypto.namespace("hyperswarm/secret-stream", 3);
var MAX_ATOMIC_WRITE = 256 * 256 * 256 - 1;
module2.exports = class NoiseSecretStream extends Duplex {
constructor(isInitiator, rawStream, opts = {}) {
super({ mapWritable: toBuffer });
if (typeof isInitiator !== "boolean") {
throw new Error("isInitiator should be a boolean");
}
this.noiseStream = this;
this.isInitiator = isInitiator;
this.rawStream = null;
this.publicKey = opts.publicKey || null;
this.remotePublicKey = opts.remotePublicKey || null;
this.handshakeHash = null;
this.connected = false;
this.keepAlive = opts.keepAlive || 0;
this.timeout = 0;
this.enableSend = opts.enableSend !== false;
this.userData = null;
let openedDone = null;
this.opened = new Promise((resolve) => {
openedDone = resolve;
});
this.rawBytesWritten = 0;
this.rawBytesRead = 0;
this.relay = null;
this.puncher = null;
this._rawStream = null;
this._handshake = null;
this._handshakePattern = opts.pattern || null;
this._handshakeDone = null;
this._state = 0;
this._len = 0;
this._tmp = 1;
this._message = null;
this._openedDone = openedDone;
this._startDone = null;
this._drainDone = null;
this._outgoingPlain = null;
this._outgoingWrapped = null;
this._utp = null;
this._setup = true;
this._ended = 2;
this._encrypt = null;
this._decrypt = null;
this._timeoutTimer = null;
this._keepAliveTimer = null;
this._sendState = null;
if (opts.autoStart !== false) this.start(rawStream, opts);
this.resume();
this.pause();
}
static keyPair(seed) {
return Handshake.keyPair(seed);
}
static id(handshakeHash, isInitiator, id) {
return streamId(handshakeHash, isInitiator, id);
}
setTimeout(ms) {
if (!ms) ms = 0;
this._clearTimeout();
this.timeout = ms;
if (!ms || this.rawStream === null) return;
this._timeoutTimer = Timeout.once(ms, destroyTimeout, this);
this._timeoutTimer.unref();
}
setKeepAlive(ms) {
if (!ms) ms = 0;
this._clearKeepAlive();
this.keepAlive = ms;
if (!ms || this.rawStream === null) return;
this._keepAliveTimer = Timeout.on(ms, sendKeepAlive, this);
this._keepAliveTimer.unref();
}
sendKeepAlive() {
const empty = this.alloc(0);
this.write(empty);
}
start(rawStream, opts = {}) {
if (rawStream) {
this.rawStream = rawStream;
this._rawStream = rawStream;
if (typeof this.rawStream.setContentSize === "function") {
this._utp = rawStream;
}
} else {
this.rawStream = new Bridge(this);
this._rawStream = this.rawStream.reverse;
}
this.rawStream.on("error", this._onrawerror.bind(this));
this.rawStream.on("close", this._onrawclose.bind(this));
this._startHandshake(opts.handshake, opts.keyPair || null);
this._continueOpen(null);
if (this.destroying) return;
if (opts.data) this._onrawdata(opts.data);
if (opts.ended) this._onrawend();
if (this.keepAlive > 0 && this._keepAliveTimer === null) {
this.setKeepAlive(this.keepAlive);
}
if (this.timeout > 0 && this._timeoutTimer === null) {
this.setTimeout(this.timeout);
}
}
async flush() {
if (await this.opened === false) return false;
if (await Writable.drained(this) === false) return false;
if (this.destroying) return false;
if (this.rawStream !== null && this.rawStream.flush) {
return await this.rawStream.flush();
}
return true;
}
_continueOpen(err) {
if (err) this.destroy(err);
if (this._startDone === null) return;
const done = this._startDone;
this._startDone = null;
this._open(done);
}
_onkeypairpromise(p) {
const self = this;
const cont = this._continueOpen.bind(this);
p.then(onkeypair, cont);
function onkeypair(kp) {
self._onkeypair(kp);
cont(null);
}
}
_onkeypair(keyPair) {
const pattern = this._handshakePattern || "XX";
const remotePublicKey = this.remotePublicKey;
this._handshake = new Handshake(this.isInitiator, keyPair, remotePublicKey, pattern);
this.publicKey = this._handshake.keyPair.publicKey;
}
_startHandshake(handshake, keyPair) {
if (handshake) {
const { tx, rx, hash, publicKey, remotePublicKey } = handshake;
this._setupSecretStream(tx, rx, hash, publicKey, remotePublicKey);
return;
}
if (!keyPair) keyPair = Handshake.keyPair();
if (typeof keyPair.then === "function") {
this._onkeypairpromise(keyPair);
} else {
this._onkeypair(keyPair);
}
}
_onrawerror(err) {
this.destroy(err);
}
_onrawclose() {
if (this._ended !== 0) this.destroy();
}
_onrawdata(data) {
let offset = 0;
if (this._timeoutTimer !== null) {
this._timeoutTimer.refresh();
}
do {
switch (this._state) {
case 0: {
while (this._tmp !== 16777216 && offset < data.byteLength) {
const v = data[offset++];
this._len += this._tmp * v;
this._tmp *= 256;
}
if (this._tmp === 16777216) {
this._tmp = 0;
this._state = 1;
const unprocessed = data.byteLength - offset;
if (unprocessed < this._len && this._utp !== null)
this._utp.setContentSize(this._len - unprocessed);
}
break;
}
case 1: {
const missing = this._len - this._tmp;
const end = missing + offset;
if (this._message === null && end <= data.byteLength) {
this._message = data.subarray(offset, end);
offset += missing;
this._incoming();
break;
}
const unprocessed = data.byteLength - offset;
if (this._message === null) {
this._message = b4a4.allocUnsafe(this._len);
}
b4a4.copy(data, this._message, this._tmp, offset);
this._tmp += unprocessed;
if (end <= data.byteLength) {
offset += missing;
this._incoming();
} else {
offset += unprocessed;
}
break;
}
}
} while (offset < data.byteLength && !this.destroying);
}
_onrawend() {
this._ended--;
this.push(null);
}
_onrawdrain() {
const drain = this._drainDone;
if (drain === null) return;
this._drainDone = null;
drain();
}
_read(cb) {
this.rawStream.resume();
cb(null);
}
_incoming() {
const message = this._message;
this._state = 0;
this._len = 0;
this._tmp = 1;
this._message = null;
if (this._setup === true) {
if (this._handshake) {
this._onhandshakert(this._handshake.recv(message));
} else {
if (message.byteLength !== IDHEADERBYTES) {
this.destroy(new Error("Invalid header message received"));
return;
}
const remoteId = message.subarray(0, 32);
const expectedId = streamId(this.handshakeHash, !this.isInitiator);
const header = message.subarray(32);
if (!b4a4.equals(expectedId, remoteId)) {
this.destroy(new Error("Invalid header received"));
return;
}
this._decrypt.init(header);
this._setup = false;
}
return;
}
if (message.byteLength < ABYTES) {
this.destroy(new Error("Invalid message received"));
return;
}
this.rawBytesRead += message.byteLength;
const plain = message.subarray(1, message.byteLength - ABYTES + 1);
try {
this._decrypt.next(message, plain);
} catch (err) {
this.destroy(err);
return;
}
if (plain.byteLength === 0 && this.keepAlive !== 0) return;
if (this.push(plain) === false) {
this.rawStream.pause();
}
}
_onhandshakert(h) {
if (this._handshakeDone === null) return;
if (h !== null) {
if (h.data) this._rawStream.write(h.data);
if (!h.tx) return;
}
const done = this._handshakeDone;
const publicKey = this._handshake.keyPair.publicKey;
this._handshakeDone = null;
this._handshake = null;
if (h === null) return done(new Error("Noise handshake failed"));
this._setupSecretStream(h.tx, h.rx, h.hash, publicKey, h.remotePublicKey);
this._resolveOpened(true);
done(null);
}
_setupSecretStream(tx, rx, handshakeHash, publicKey, remotePublicKey) {
const buf = b4a4.allocUnsafeSlow(3 + IDHEADERBYTES);
writeUint24le(IDHEADERBYTES, buf);
this._encrypt = new Push(unslab(tx.subarray(0, KEYBYTES)), void 0, buf.subarray(3 + 32));
this._decrypt = new Pull(unslab(rx.subarray(0, KEYBYTES)));
this.publicKey = publicKey;
this.remotePublicKey = remotePublicKey;
this.handshakeHash = handshakeHash;
const id = buf.subarray(3, 3 + 32);
streamId(handshakeHash, this.isInitiator, id);
this._setupSecretSend(handshakeHash);
this.emit("handshake");
if (this.rawStream !== this._rawStream) this.rawStream.emit("handshake");
if (this.destroying) return;
this._rawStream.write(buf);
}
_setupSecretSend(handshakeHash) {
this._sendState = b4a4.allocUnsafeSlow(32 + 32 + 8 + 8);
const encrypt = this._sendState.subarray(0, 32);
const decrypt = this._sendState.subarray(32, 64);
const counter = this._sendState.subarray(64, 72);
const initial = this._sendState.subarray(72);
const inputs = this.isInitiator ? [
[NS_INITIATOR, NS_SEND],
[NS_RESPONDER, NS_SEND]
] : [
[NS_RESPONDER, NS_SEND],
[NS_INITIATOR, NS_SEND]
];
sodium.crypto_generichash_batch(encrypt, inputs[0], handshakeHash);
sodium.crypto_generichash_batch(decrypt, inputs[1], handshakeHash);
sodium.randombytes_buf(initial);
counter.set(initial);
}
_open(cb) {
if (this._rawStream === null || this._handshake === null && this._encrypt === null) {
this._startDone = cb;
return;
}
this._rawStream.on("data", this._onrawdata.bind(this));
this._rawStream.on("end", this._onrawend.bind(this));
this._rawStream.on("drain", this._onrawdrain.bind(this));
if (this.enableSend) this._rawStream.on("message", this._onmessage.bind(this));
if (this._encrypt !== null) {
this._resolveOpened(true);
return cb(null);
}
this._handshakeDone = cb;
if (this.isInitiator) this._onhandshakert(this._handshake.send());
}
_predestroy() {
if (this.rawStream) {
const error = getStreamError(this);
this.rawStream.destroy(error);
}
if (this._startDone !== null) {
const done = this._startDone;
this._startDone = null;
done(new Error("Stream destroyed"));
}
if (this._handshakeDone !== null) {
const done = this._handshakeDone;
this._handshakeDone = null;
done(new Error("Stream destroyed"));
}
if (this._drainDone !== null) {
const done = this._drainDone;
this._drainDone = null;
done(new Error("Stream destroyed"));
}
}
_write(data, cb) {
let wrapped = this._outgoingWrapped;
if (data !== this._outgoingPlain) {
wrapped = b4a4.allocUnsafe(data.byteLength + 3 + ABYTES);
wrapped.set(data, 4);
} else {
this._outgoingWrapped = this._outgoingPlain = null;
}
if (wrapped.byteLength - 3 > MAX_ATOMIC_WRITE) {
return cb(
new Error(
"Message is too large for an atomic write. Max size is " + MAX_ATOMIC_WRITE + " bytes."
)
);
}
this.rawBytesWritten += wrapped.byteLength;
writeUint24le(wrapped.byteLength - 3, wrapped);
this._encrypt.next(wrapped.subarray(4, 4 + data.byteLength), wrapped.subarray(3));
if (this._keepAliveTimer !== null) this._keepAliveTimer.refresh();
if (this._rawStream.write(wrapped) === false) {
this._drainDone = cb;
} else {
cb(null);
}
}
_final(cb) {
this._clearKeepAlive();
this._ended--;
this._rawStream.end();
cb(null);
}
_resolveOpened(val) {
if (this._openedDone === null) return;
const opened = this._openedDone;
this._openedDone = null;
opened(val);
if (!val) return;
this.connected = true;
this.emit("connect");
}
_clearTimeout() {
if (this._timeoutTimer === null) return;
this._timeoutTimer.destroy();
this._timeoutTimer = null;
this.timeout = 0;
}
_clearKeepAlive() {
if (this._keepAliveTimer === null) return;
this._keepAliveTimer.destroy();
this._keepAliveTimer = null;
this.keepAlive = 0;
}
_destroy(cb) {
this._clearKeepAlive();
this._clearTimeout();
this._resolveOpened(false);
cb(null);
}
_boxMessage(buffer) {
const MB = sodium.crypto_secretbox_MACBYTES;
const NB = sodium.crypto_secretbox_NONCEBYTES;
const counter = this._sendState.subarray(64, 72);
sodium.sodium_increment(counter);
if (b4a4.equals(counter, this._sendState.subarray(72))) {
this.destroy(new Error("udp send nonce exchausted"));
return;
}
const secret = this._sendState.subarray(0, 32);
const envelope = b4a4.allocUnsafe(8 + MB + buffer.byteLength);
const nonce = envelope.subarray(0, NB);
const ciphertext = envelope.subarray(8);
b4a4.fill(nonce, 0);
nonce.set(counter);
sodium.crypto_secretbox_easy(ciphertext, buffer, nonce, secret);
return envelope;
}
send(buffer) {
if (!this._sendState) return;
if (!this.rawStream?.send) return;
const message = this._boxMessage(buffer);
return this.rawStream.send(message);
}
trySend(buffer) {
if (!this._sendState) return;
if (!this.rawStream?.trySend) return;
const message = this._boxMessage(buffer);
this.rawStream.trySend(message);
}
_onmessage(buffer) {
if (!this._sendState) return;
const MB = sodium.crypto_secretbox_MACBYTES;
const NB = sodium.crypto_secretbox_NONCEBYTES;
if (buffer.byteLength < NB) return;
const nonce = b4a4.allocUnsafe(NB);
b4a4.fill(nonce, 0);
nonce.set(buffer.subarray(0, 8));
const secret = this._sendState.subarray(32, 64);
const ciphertext = buffer.subarray(8);
const plain = buffer.subarray(8, buffer.byteLength - MB);
if (ciphertext.byteLength < MB) return;
const success = sodium.crypto_secretbox_open_easy(plain, ciphertext, nonce, secret);
if (success) this.emit("message", plain);
}
alloc(len) {
const buf = b4a4.allocUnsafe(len + 3 + ABYTES);
this._outgoingWrapped = buf;
this._outgoingPlain = buf.subarray(4, buf.byteLength - ABYTES + 1);
return this._outgoingPlain;
}
toJSON() {
return {
isInitiator: this.isInitiator,
publicKey: this.publicKey && b4a4.toString(this.publicKey, "hex"),
remotePublicKey: this.remotePublicKey && b4a4.toString(this.remotePublicKey, "hex"),
connected: this.connected,
destroying: this.destroying,
destroyed: this.destroyed,
rawStream: this.rawStream && this.rawStream.toJSON ? this.rawStream.toJSON() : null
};
}
};
function writeUint24le(n, buf) {
buf[0] = n & 255;
buf[1] = n >>> 8 & 255;
buf[2] = n >>> 16 & 255;
}
function streamId(handshakeHash, isInitiator, out = b4a4.allocUnsafe(32)) {
sodium.crypto_generichash(out, isInitiator ? NS_INITIATOR : NS_RESPONDER, handshakeHash);
return out;
}
function toBuffer(data) {
return typeof data === "string" ? b4a4.from(data) : data;
}
function destroyTimeout() {
this.destroy(new Error("Stream timed out"));
}
function sendKeepAlive() {
const empty = this.alloc(0);
this.write(empty);
}
}
});
// node_modules/flat-tree/index.js
var require_flat_tree = __commonJS({
"node_modules/flat-tree/index.js"(exports2) {
exports2.fullRoots = function(index, result) {
if (index & 1) throw new Error("You can only look up roots for depth(0) blocks");
if (!result) result = [];
index /= 2;
let offset = 0;
let factor = 1;
while (true) {
if (!index) return result;
while (factor * 2 <= index) factor *= 2;
result.push(offset + factor - 1);
offset = offset + 2 * factor;
index -= factor;
factor = 1;
}
};
exports2.futureRoots = function(index, result) {
if (index & 1) throw new Error("You can only look up future roots for depth(0) blocks");
if (!result) result = [];
let factor = 1;
while (factor * 2 <= index) factor *= 2;
if (factor * 2 - 2 === index) return result;
let pos = factor / 2 - 1;
while (pos + factor / 2 - 1 !== index) {
pos += factor;
while (pos + factor / 2 - 1 > index) {
factor /= 2;
pos -= factor / 2;
}
result.push(pos - factor / 2);
}
return result;
};
exports2.patch = function(from, to) {
if (from === 0 || from >= to) return [];
const roots = exports2.fullRoots(from);
const target = exports2.fullRoots(to);
let i = 0;
for (; i < target.length; i++) {
if (i >= roots.length || roots[i] !== target[i]) break;
}
const patch = [];
if (i < roots.length) {
let prev = roots.length - 1;
const ite = exports2.iterator(roots[prev--]);
while (ite.index !== target[i]) {
ite.sibling();
if (prev >= 0 && ite.index === roots[prev]) {
prev--;
} else {
patch.push(ite.index);
}
patch.push(ite.parent());
}
i++;
}
for (; i < target.length; i++) patch.push(target[i]);
return patch;
};
exports2.depth = function(index) {
let depth = 0;
index += 1;
while (!(index & 1)) {
depth++;
index = rightShift(index);
}
return depth;
};
exports2.sibling = function(index, depth) {
if (!depth) depth = exports2.depth(index);
const offset = exports2.offset(index, depth);
return exports2.index(depth, offset & 1 ? offset - 1 : offset + 1);
};
exports2.parent = function(index, depth) {
if (!depth) depth = exports2.depth(index);
const offset = exports2.offset(index, depth);
return exports2.index(depth + 1, rightShift(offset));
};
exports2.leftChild = function(index, depth) {
if (!(index & 1)) return -1;
if (!depth) depth = exports2.depth(index);
return exports2.index(depth - 1, exports2.offset(index, depth) * 2);
};
exports2.rightChild = function(index, depth) {
if (!(index & 1)) return -1;
if (!depth) depth = exports2.depth(index);
return exports2.index(depth - 1, 1 + exports2.offset(index, depth) * 2);
};
exports2.children = function(index, depth) {
if (!(index & 1)) return null;
if (!depth) depth = exports2.depth(index);
const offset = exports2.offset(index, depth) * 2;
return [
exports2.index(depth - 1, offset),
exports2.index(depth - 1, offset + 1)
];
};
exports2.leftSpan = function(index, depth) {
if (!(index & 1)) return index;
if (!depth) depth = exports2.depth(index);
return exports2.offset(index, depth) * twoPow(depth + 1);
};
exports2.rightSpan = function(index, depth) {
if (!(index & 1)) return index;
if (!depth) depth = exports2.depth(index);
return (exports2.offset(index, depth) + 1) * twoPow(depth + 1) - 2;
};
exports2.nextLeaf = function(index) {
let factor = 1;
let r = index;
while ((r & 1) === 1) {
r = (r - 1) / 2;
factor *= 2;
}
return index + factor + 1;
};
exports2.count = function(index, depth) {
if (!(index & 1)) return 1;
if (!depth) depth = exports2.depth(index);
return twoPow(depth + 1) - 1;
};
exports2.countLeaves = function(index) {
return (exports2.count(index) + 1) / 2;
};
exports2.spans = function(index, depth) {
if (!(index & 1)) return [index, index];
if (!depth) depth = exports2.depth(index);
const offset = exports2.offset(index, depth);
const width = twoPow(depth + 1);
return [offset * width, (offset + 1) * width - 2];
};
exports2.index = function(depth, offset) {
return (1 + 2 * offset) * twoPow(depth) - 1;
};
exports2.offset = function(index, depth) {
if (!(index & 1)) return index / 2;
if (!depth) depth = exports2.depth(index);
return ((index + 1) / twoPow(depth) - 1) / 2;
};
exports2.iterator = function(index) {
const ite = new Iterator();
ite.seek(index || 0);
return ite;
};
function twoPow(n) {
return n < 31 ? 1 << n : (1 << 30) * (1 << n - 30);
}
function rightShift(n) {
return (n - (n & 1)) / 2;
}
function Iterator() {
this.index = 0;
this.offset = 0;
this.factor = 0;
}
Iterator.prototype.seek = function(index) {
this.index = index;
if (this.index & 1) {
this.offset = exports2.offset(index);
this.factor = twoPow(exports2.depth(index) + 1);
} else {
this.offset = index / 2;
this.factor = 2;
}
};
Iterator.prototype.isLeft = function() {
return (this.offset & 1) === 0;
};
Iterator.prototype.isRight = function() {
return (this.offset & 1) === 1;
};
Iterator.prototype.isRoot = function(length) {
const currentLength = 1 + (this.index + this.factor / 2 - 1) / 2;
if (length < currentLength) return false;
const factor = this.factor * 2;
const index = this.offset & 1 ? this.index - this.factor / 2 : this.index + this.factor / 2;
const parentLength = 1 + (index + factor / 2 - 1) / 2;
return parentLength > length;
};
Iterator.prototype.contains = function(index) {
return index > this.index ? index < this.index + this.factor / 2 : index < this.index ? index > this.index - this.factor / 2 : true;
};
Iterator.prototype.prev = function() {
if (!this.offset) return this.index;
this.offset--;
this.index -= this.factor;
return this.index;
};
Iterator.prototype.next = function() {
this.offset++;
this.index += this.factor;
return this.index;
};
Iterator.prototype.count = function() {
if (!(this.index & 1)) return 1;
return this.factor - 1;
};
Iterator.prototype.countLeaves = function() {
return (this.count() + 1) / 2;
};
Iterator.prototype.sibling = function() {
return this.isLeft() ? this.next() : this.prev();
};
Iterator.prototype.parent = function() {
if (this.offset & 1) {
this.index -= this.factor / 2;
this.offset = (this.offset - 1) / 2;
} else {
this.index += this.factor / 2;
this.offset /= 2;
}
this.factor *= 2;
return this.index;
};
Iterator.prototype.leftSpan = function() {
this.index = this.index - this.factor / 2 + 1;
this.offset = this.index / 2;
this.factor = 2;
return this.index;
};
Iterator.prototype.peekLeftSpan = function() {
return this.index - this.factor / 2 + 1;
};
Iterator.prototype.rightSpan = function() {
this.index = this.index + this.factor / 2 - 1;
this.offset = this.index / 2;
this.factor = 2;
return this.index;
};
Iterator.prototype.peekRightSpan = function() {
return this.index + this.factor / 2 - 1;
};
Iterator.prototype.leftChild = function() {
if (this.factor === 2) return this.index;
this.factor /= 2;
this.index -= this.factor / 2;
this.offset *= 2;
return this.index;
};
Iterator.prototype.rightChild = function() {
if (this.factor === 2) return this.index;
this.factor /= 2;
this.index += this.factor / 2;
this.offset = 2 * this.offset + 1;
return this.index;
};
Iterator.prototype.nextTree = function() {
this.index = this.index + this.factor / 2 + 1;
this.offset = this.index / 2;
this.factor = 2;
return this.index;
};
Iterator.prototype.prevTree = function() {
if (!this.offset) {
this.index = 0;
this.factor = 2;
} else {
this.index = this.index - this.factor / 2 - 1;
this.offset = this.index / 2;
this.factor = 2;
}
return this.index;
};
Iterator.prototype.fullRoot = function(index) {
if (index <= this.index || (this.index & 1) > 0) return false;
while (index > this.index + this.factor + this.factor / 2) {
this.index += this.factor / 2;
this.factor *= 2;
this.offset /= 2;
}
return true;
};
}
});
// node_modules/hypercore/lib/feature-flags.js
var require_feature_flags = __commonJS({
"node_modules/hypercore/lib/feature-flags.js"(exports2, module2) {
module2.exports = {
SMALL_WANTS: 1
};
}
});
// node_modules/hypercore/lib/wants.js
var require_wants = __commonJS({
"node_modules/hypercore/lib/wants.js"(exports2) {
var COMPAT = true;
var BATCH_UINTS = COMPAT ? 65536 : 128;
var BATCH_BYTES = BATCH_UINTS * 4;
var BATCH = BATCH_BYTES * 8;
var MAX_REMOTE_BATCHES = 4;
var MAX_RANGE = 8 * 256 * 1024;
var MIN_RANGE = 32;
var MAX = 512;
var MAX_ANY = 16;
var LocalWants = class {
constructor(peer) {
this.destroyed = false;
this.peer = peer;
this.wants = /* @__PURE__ */ new Map();
this.free = /* @__PURE__ */ new Set();
this.any = null;
}
add(index, handle) {
const b = (index - (index & BATCH - 1)) / BATCH;
return this.addBatch(b, handle);
}
addAnyRange(start, length, handle) {
if (this.destroyed) return null;
if (this.any === null) this.any = [];
if (COMPAT) {
let r = start & BATCH - 1;
start -= r;
length += r;
r = length & BATCH - 1;
if (r) length = length - r + BATCH;
}
for (let i = 0; i < this.any.length; i++) {
const w2 = this.any[i];
if (w2.start === start && w2.length === length) {
w2.handles.add(handle);
handle.addWant(w2);
return null;
}
}
const w = { wants: this, start, length, any: true, handles: /* @__PURE__ */ new Set([handle]) };
this.any.push(w);
handle.addWant(w);
return { start, length, any: !COMPAT };
}
removeAnyRange(start, length, handle) {
if (this.any === null) return null;
for (let i = 0; i < this.any.length; i++) {
const w = this.any[i];
if (w.start !== start || w.length !== length) continue;
w.handles.delete(handle);
handle.removeWant(w);
if (w.handles.size > 0) return null;
const head = this.any.pop();
if (head !== w) this.any[i] = head;
return { start, length, any: !COMPAT };
}
return null;
}
addBatch(index, handle) {
if (this.destroyed) return null;
let w = this.wants.get(index);
if (w) {
const size = w.handles.size;
w.handles.add(handle);
if (w.handles.size !== size) {
handle.addWant(w);
}
return null;
}
w = { wants: this, start: index, length: 0, any: false, handles: /* @__PURE__ */ new Set([handle]) };
if (this.free.has(index)) {
this.free.delete(index);
this.wants.set(index, w);
handle.addWant(w);
return null;
}
let unwant = null;
if (this.wants.size + this.free.size === MAX) {
if (this.free.size === 0) {
return null;
}
unwant = this._unwant();
}
this.wants.set(index, w);
handle.addWant(w);
return {
want: { start: index * BATCH, length: BATCH, any: false },
unwant
};
}
remove(index, handle) {
const b = (index - (index & BATCH - 1)) / BATCH;
return this.removeBatch(b, handle);
}
removeBatch(index, handle) {
if (this.destroyed) return false;
const w = this.wants.get(index);
if (!w) {
return false;
}
w.handles.delete(handle);
handle.removeWant(w);
if (w.handles.size === 0) {
this.free.add(index);
this.wants.delete(index);
return this.free.size === 1 && this.wants.size === MAX - 1;
}
return false;
}
destroy() {
if (this.destroyed) return;
this.destroyed = true;
for (const w of this.wants.values()) {
for (const handle of w.handles) {
handle.removeWant(w);
}
}
this.wants.clear();
}
_unwant() {
for (const index of this.free) {
this.free.delete(index);
return { start: index * BATCH, length: BATCH, any: false };
}
return null;
}
};
var RemoteWants = class {
constructor() {
this.any = null;
this.all = false;
this.size = 0;
this.batches = [];
}
hasAny(start, length) {
for (let i = 0; i < this.any.length; i++) {
const a = this.any[i];
const e = start + length;
const end = a.start + a.length;
if (a.start <= start && start < end) return true;
if (a.start < e && e <= end) return true;
}
return this.all;
}
hasRange(start, length) {
if (this.any !== null && this.hasAny(start, length)) return true;
if (length === 1) return this.has(start);
let smallest = -1;
for (let i = 0; i < this.batches.length; i++) {
const b = this.batches[i];
if (b.length < smallest || smallest === -1) smallest = b.length;
}
if (smallest === -1) return this.all;
const r = start & smallest - 1;
const end = start + length;
let max = 3;
for (let i = start - r; i < end; i += smallest) {
if (max-- === 0) return true;
if (this.has(i)) return true;
}
return this.all;
}
has(index) {
for (let i = 0; i < this.batches.length; i++) {
const b = this.batches[i];
const block = (index - (index & b.length - 1)) / b.length;
if (b.ranges.has(block)) return true;
}
return this.all;
}
add(range) {
if (range.any) {
if (this.any === null) this.any = [];
if (this.any.length < MAX_ANY) this.any.push(range);
else this.all = true;
return true;
}
if (range.length > MAX_RANGE) return false;
if (!validateBatchRange(range)) {
this.all = true;
return true;
}
if (this.size >= MAX) {
this.all = true;
return true;
}
for (let i = 0; i < this.batches.length; i++) {
const b = this.batches[i];
if (b.length === range.length) {
b.ranges.add(range.start / range.length);
this.size++;
return true;
}
}
if (this.batches.length >= MAX_REMOTE_BATCHES) {
this.all = true;
return true;
}
this.batches.push({
length: range.length,
ranges: /* @__PURE__ */ new Set([range.start / range.length])
});
this.size++;
return true;
}
remove(range) {
if (range.any) {
if (this.any === null) return false;
for (let i = 0; i < this.any.length; i++) {
const a = this.any[i];
if (a.start === range.start && a.length === range.length) {
const head = this.any.pop();
if (head !== a) this.any[i] = head;
return true;
}
}
return false;
}
if (!validateBatchRange(range)) return false;
for (let i = 0; i < this.batches.length; i++) {
const b = this.batches[i];
if (b.length !== range.length) continue;
const size = b.ranges.size;
b.ranges.delete(range.start / range.length);
if (b.ranges.size !== size) this.size--;
if (b.ranges.size === 0) {
const head = this.batches.pop();
if (head !== b) this.batches[i] = head;
}
return true;
}
return false;
}
};
function UPDATE_COMPAT(isCompat) {
COMPAT = isCompat;
BATCH_UINTS = COMPAT ? 65536 : 128;
BATCH_BYTES = BATCH_UINTS * 4;
BATCH = BATCH_BYTES * 8;
exports2.WANT_BATCH = BATCH;
}
exports2.LocalWants = LocalWants;
exports2.RemoteWants = RemoteWants;
exports2.WANT_BATCH = BATCH;
exports2.UPDATE_COMPAT = UPDATE_COMPAT;
function validateBatchRange(range) {
if (range.length > MAX_RANGE || range.length < MIN_RANGE) {
return false;
}
if ((range.length & range.length - 1) !== 0) {
return false;
}
if (range.start & range.length - 1) {
return false;
}
return true;
}
}
});
// node_modules/big-sparse-array/index.js
var require_big_sparse_array = __commonJS({
"node_modules/big-sparse-array/index.js"(exports2, module2) {
var FACTOR = new Uint16Array(8);
function factor4096(i, n) {
while (n > 0) {
const f = i & 4095;
FACTOR[--n] = f;
i = (i - f) / 4096;
}
return FACTOR;
}
module2.exports = class BigSparseArray {
constructor() {
this.tiny = new TinyArray();
this.maxLength = 4096;
this.factor = 1;
}
set(index, val) {
if (val !== void 0) {
while (index >= this.maxLength) {
this.maxLength *= 4096;
this.factor++;
if (!this.tiny.isEmptyish()) {
const t = new TinyArray();
t.set(0, this.tiny);
this.tiny = t;
}
}
}
const f = factor4096(index, this.factor);
const last = this.factor - 1;
let tiny = this.tiny;
for (let i = 0; i < last; i++) {
const next = tiny.get(f[i]);
if (next === void 0) {
if (val === void 0) return;
tiny = tiny.set(f[i], new TinyArray());
} else {
tiny = next;
}
}
return tiny.set(f[last], val);
}
get(index) {
if (index >= this.maxLength) return;
const f = factor4096(index, this.factor);
const last = this.factor - 1;
let tiny = this.tiny;
for (let i = 0; i < last; i++) {
tiny = tiny.get(f[i]);
if (tiny === void 0) return;
}
return tiny.get(f[last]);
}
};
var TinyArray = class {
constructor() {
this.s = 0;
this.b = new Array(1);
this.f = new Uint16Array(1);
}
isEmptyish() {
return this.b.length === 1 && this.b[0] === void 0;
}
get(i) {
if (this.s === 12) return this.b[i];
const f = i >>> this.s;
const r = i & this.b.length - 1;
return this.f[r] === f ? this.b[r] : void 0;
}
set(i, v) {
while (this.s !== 12) {
const f = i >>> this.s;
const r = i & this.b.length - 1;
const o = this.b[r];
if (o === void 0 || f === this.f[r]) {
this.b[r] = v;
this.f[r] = f;
return v;
}
this.grow();
}
this.b[i] = v;
return v;
}
grow() {
const os = this.s;
const ob = this.b;
const of = this.f;
this.s += 4;
this.b = new Array(this.b.length << 4);
this.f = this.s === 12 ? null : new Uint8Array(this.b.length);
const m = this.b.length - 1;
for (let or = 0; or < ob.length; or++) {
if (ob[or] === void 0) continue;
const i = of[or] << os | or;
const f = i >>> this.s;
const r = i & m;
this.b[r] = ob[or];
if (this.s !== 12) this.f[r] = f;
}
}
};
}
});
// node_modules/simdle-universal/scalar.js
var require_scalar = __commonJS({
"node_modules/simdle-universal/scalar.js"(exports2) {
var clz = exports2.clz = function clz2(n) {
return Math.clz32(n);
};
exports2.clo = function clo(n) {
return clz(~n);
};
var ctz = exports2.ctz = function ctz2(n) {
return 32 - (n === 0 ? 0 : clz(n & -n) + 1);
};
exports2.cto = function cto(n) {
return ctz(~n);
};
exports2.cnt = function cnt(n) {
n = n - (n >>> 1 & 1431655765);
n = (n & 858993459) + (n >>> 2 & 858993459);
n = n + (n >>> 4) & 252645135;
n = n * 16843009 >>> 24;
return n;
};
}
});
// node_modules/simdle-universal/fallback.js
var require_fallback = __commonJS({
"node_modules/simdle-universal/fallback.js"(exports2) {
var b4a4 = require_b4a();
var scalar = require_scalar();
function view(buf, n) {
if (n === buf.BYTES_PER_ELEMENT) return buf;
let TypedArray;
if (n === 1) TypedArray = Uint8Array;
else if (n === 2) TypedArray = Uint16Array;
else TypedArray = Uint32Array;
return new TypedArray(buf.buffer, buf.byteOffset, buf.byteLength / n);
}
function unary(u8, u16 = u8, u32 = u16) {
return function unary2(buf, result = b4a4.allocUnsafe(buf.byteLength)) {
if (buf.byteLength % 16 !== 0) {
throw new Error("Buffer length must be a multiple of 16");
}
if (buf.byteLength !== result.byteLength) {
throw new Error("Length of result buffer is insufficient");
}
const n = buf.BYTES_PER_ELEMENT;
if (n === 1) u8(buf, view(result, n));
else if (n === 2) u16(buf, view(result, n));
else u32(buf, view(result, n));
return result;
};
}
function binary(u8, u16 = u8, u32 = u16) {
return function binary2(a, b, result = b4a4.allocUnsafe(a.byteLength)) {
if (a.byteLength % 16 !== 0) {
throw new Error("Buffer length must be a multiple of 16");
}
if (a.byteLength !== b.byteLength || a.byteLength !== result.byteLength) {
throw new Error("Buffers must be the same length");
}
const n = a.BYTES_PER_ELEMENT;
if (n === 1) u8(a, b, view(result, n));
else if (n === 2) u16(a, b, view(result, n));
else u32(a, b, view(result, n));
return result;
};
}
function reduce(u8, u16 = u8, u32 = u16) {
return function reduce2(buf) {
if (buf.byteLength % 16 !== 0) {
throw new Error("Buffer length must be a multiple of 16");
}
const n = buf.BYTES_PER_ELEMENT;
if (n === 1) return u8(buf);
if (n === 2) return u16(buf);
return u32(buf);
};
}
exports2.allo = function allo(buf) {
if (buf.byteLength % 16 !== 0) {
throw new Error("Buffer length must be a multiple of 16");
}
const m = 2 ** (buf.BYTES_PER_ELEMENT * 8) - 1;
for (let i = 0, n = buf.length; i < n; i++) {
if (buf[i] !== m) return false;
}
return true;
};
exports2.allz = function allz(buf) {
if (buf.byteLength % 16 !== 0) {
throw new Error("Buffer length must be a multiple of 16");
}
for (let i = 0, n = buf.length; i < n; i++) {
if (buf[i] !== 0) return false;
}
return true;
};
exports2.and = binary(
(a, b, result) => {
for (let i = 0, n = result.length; i < n; i++) {
result[i] = a[i] & b[i];
}
}
);
exports2.clear = binary(
(a, b, result) => {
for (let i = 0, n = result.length; i < n; i++) {
result[i] = a[i] & ~b[i];
}
}
);
exports2.clo = unary(
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = 24 - scalar.clo(buf[i]);
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = 16 - scalar.clo(buf[i]);
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = scalar.clo(buf[i]);
}
}
);
exports2.clz = unary(
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = 24 - scalar.clz(buf[i]);
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = 16 - scalar.clz(buf[i]);
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = scalar.clz(buf[i]);
}
}
);
exports2.cnt = unary(
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = scalar.cnt(buf[i]) & 255;
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = scalar.cnt(buf[i]) & 65535;
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = scalar.cnt(buf[i]);
}
}
);
exports2.cto = unary(
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = Math.min(scalar.cto(buf[i]), 8);
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = Math.min(scalar.cto(buf[i]), 16);
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = scalar.cto(buf[i]);
}
}
);
exports2.ctz = unary(
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = Math.min(scalar.ctz(buf[i]), 8);
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = Math.min(scalar.ctz(buf[i]), 16);
}
},
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = scalar.ctz(buf[i]);
}
}
);
exports2.not = unary(
(buf, result) => {
for (let i = 0, n = buf.length; i < n; i++) {
result[i] = ~buf[i];
}
}
);
exports2.or = binary(
(a, b, result) => {
for (let i = 0, n = result.length; i < n; i++) {
result[i] = a[i] | b[i];
}
}
);
exports2.sum = reduce(
(buf) => {
let result = 0n;
for (let i = 0, n = buf.length; i < n; i++) {
result += BigInt(buf[i]);
}
return result;
}
);
exports2.xor = binary(
(a, b, result) => {
for (let i = 0, n = result.length; i < n; i++) {
result[i] = a[i] ^ b[i];
}
}
);
}
});
// node_modules/simdle-universal/index.js
var require_simdle_universal = __commonJS({
"node_modules/simdle-universal/index.js"(exports2, module2) {
try {
module2.exports = require("simdle-native");
} catch {
module2.exports = require_fallback();
}
}
});
// node_modules/quickbit-universal/fallback.js
var require_fallback2 = __commonJS({
"node_modules/quickbit-universal/fallback.js"(exports2) {
var simdle = require_simdle_universal();
var INDEX_LEN = (16 + 128 * 16) * 2;
var get = exports2.get = function get2(field, bit) {
const n = field.byteLength * 8;
if (bit < 0) bit += n;
if (bit < 0 || bit >= n) return false;
const m = field.BYTES_PER_ELEMENT * 8;
const offset = bit & m - 1;
const i = (bit - offset) / m;
return (field[i] & 1 << offset) !== 0;
};
var set = exports2.set = function set2(field, bit, value = true) {
const n = field.byteLength * 8;
if (bit < 0) bit += n;
if (bit < 0 || bit >= n) return false;
const m = field.BYTES_PER_ELEMENT * 8;
const offset = bit & m - 1;
const i = (bit - offset) / m;
const mask = 1 << offset;
if (value) {
if ((field[i] & mask) !== 0) return false;
} else {
if ((field[i] & mask) === 0) return false;
}
field[i] ^= mask;
return true;
};
exports2.fill = function fill(field, value, start = 0, end = field.byteLength * 8) {
const n = field.byteLength * 8;
if (start < 0) start += n;
if (end < 0) end += n;
if (start < 0 || start >= field.byteLength * 8 || start >= end) return field;
const m = field.BYTES_PER_ELEMENT * 8;
let i, j;
{
const offset = start & m - 1;
i = (start - offset) / m;
if (offset !== 0) {
let shift = m - offset;
if (end - start < shift) shift = end - start;
const mask = (1 << shift) - 1 << offset;
if (value) field[i] |= mask;
else field[i] &= ~mask;
i++;
}
}
{
const offset = end & m - 1;
j = (end - offset) / m;
if (offset !== 0 && j >= i) {
const mask = (1 << offset) - 1;
if (value) field[j] |= mask;
else field[j] &= ~mask;
}
}
if (i < j) field.fill(value ? 2 ** m - 1 : 0, i, j);
return field;
};
exports2.clear = function clear(field, ...chunks) {
const n = field.byteLength;
for (const chunk of chunks) {
if (chunk.offset >= n) continue;
const m = chunk.field.byteLength;
let i = chunk.offset;
let j = 0;
while (((i & 15) !== 0 || (j & 15) !== 0) && i < n && j < m) {
field[i] = field[i] & ~chunk.field[j];
i++;
j++;
}
if (i + 15 < n && j + 15 < m) {
const len = Math.min(n - (n & 15) - i, m - (m & 15) - j);
simdle.clear(field.subarray(i, i + len), chunk.field.subarray(j, j + len), field.subarray(i, i + len));
}
while (i < n && j < m) {
field[i] = field[i] & ~chunk.field[j];
i++;
j++;
}
}
};
function bitOffset(bit, offset) {
return !bit ? offset : INDEX_LEN * 8 / 2 + offset;
}
function byteOffset(bit, offset) {
return !bit ? offset : INDEX_LEN / 2 + offset;
}
exports2.findFirst = function findFirst2(field, value, position = 0) {
const n = field.byteLength * 8;
if (position < 0) position += n;
if (position < 0) position = 0;
if (position >= n) return -1;
value = !!value;
for (let i = position; i < n; i++) {
if (get(field, i) === value) return i;
}
return -1;
};
exports2.findLast = function findLast2(field, value, position = field.byteLength * 8 - 1) {
const n = field.byteLength * 8;
if (position < 0) position += n;
if (position < 0) return -1;
if (position >= n) position = n - 1;
value = !!value;
for (let i = position; i >= 0; i--) {
if (get(field, i) === value) return i;
}
return -1;
};
var Index = exports2.Index = class Index {
static from(fieldOrChunks, byteLength = -1) {
if (Array.isArray(fieldOrChunks)) {
return new SparseIndex(fieldOrChunks, byteLength);
} else {
return new DenseIndex(fieldOrChunks, byteLength);
}
}
constructor(byteLength) {
this._byteLength = byteLength;
this.handle = new Uint32Array(INDEX_LEN / 4);
}
get byteLength() {
return this._byteLength;
}
skipFirst(value, position = 0) {
const n = this.byteLength * 8;
if (position < 0) position += n;
if (position < 0) position = 0;
if (position >= n) return n - 1;
let i = Math.floor(position / 16384);
if (i > 127) return position;
while (i <= 127 && get(this.handle, bitOffset(value, i))) {
i++;
}
if (i === 128) return n - 1;
let k = i * 16384;
let j = 0;
if (position > k) j = Math.floor((position - k) / 128);
while (j <= 127 && get(this.handle, bitOffset(value, i * 128 + j + 128))) {
j++;
k += 128;
}
if (j === 128 && i !== 127) return this.skipFirst(value, (i + 1) * 16384);
if (k > position) position = k;
return position < n ? position : n - 1;
}
skipLast(value, position = this.byteLength * 8 - 1) {
const n = this.byteLength * 8;
if (position < 0) position += n;
if (position < 0) return 0;
if (position >= n) position = n - 1;
let i = Math.floor(position / 16384);
if (i > 127) return position;
while (i >= 0 && get(this.handle, bitOffset(value, i))) {
i--;
}
if (i === -1) return 0;
let k = (i + 1) * 16384 - 1;
let j = 127;
if (position < k) j = 128 - Math.ceil((k - position) / 128);
while (j >= 0 && get(this.handle, bitOffset(value, i * 128 + j + 128))) {
j--;
k -= 128;
}
if (j === -1 && i !== 0) return this.skipLast(value, i * 16384 - 1);
if (k < position) position = k;
return position;
}
};
var DenseIndex = class extends Index {
constructor(field, byteLength) {
super(byteLength);
this.field = field;
const m = field.BYTES_PER_ELEMENT;
for (let i = 0; i < 128; i++) {
for (let j = 0; j < 128; j++) {
const offset = (i * 128 + j) * 16;
let allz = true;
let allo = false;
if (offset + 16 <= this.field.byteLength) {
const vec = this.field.subarray(offset / m, (offset + 16) / m);
allz = simdle.allz(vec);
allo = simdle.allo(vec);
}
const k = i * 128 + 128 + j;
set(this.handle, bitOffset(false, k), allz);
set(this.handle, bitOffset(true, k), allo);
}
{
const offset = byteOffset(false, i * 16 + 16) / 4;
const allo = simdle.allo(this.handle.subarray(offset, offset + 4));
set(this.handle, bitOffset(false, i), allo);
}
{
const offset = byteOffset(true, i * 16 + 16) / 4;
const allo = simdle.allo(this.handle.subarray(offset, offset + 4));
set(this.handle, bitOffset(true, i), allo);
}
}
}
get byteLength() {
if (this._byteLength !== -1) return this._byteLength;
return this.field.byteLength;
}
update(bit) {
const n = this.byteLength * 8;
if (bit < 0) bit += n;
if (bit < 0 || bit >= n) return false;
const m = this.field.BYTES_PER_ELEMENT;
const i = Math.floor(bit / 16384);
const j = Math.floor(bit / 128);
const offset = j * 16 / m;
const vec = this.field.subarray(offset, offset + 16 / m);
const allz = simdle.allz(vec);
const allo = simdle.allo(vec);
let changed = false;
if (set(this.handle, bitOffset(false, 128 + j), allz)) {
changed = true;
const offset2 = byteOffset(false, i * 16 + 16) / 4;
const allo2 = simdle.allo(this.handle.subarray(offset2, offset2 + 4));
set(this.handle, bitOffset(false, i), allo2);
}
if (set(this.handle, bitOffset(true, 128 + j), allo)) {
changed = true;
const offset2 = byteOffset(true, i * 16 + 16) / 4;
const allo2 = simdle.allo(this.handle.subarray(offset2, offset2 + 4));
set(this.handle, bitOffset(true, i), allo2);
}
return changed;
}
};
function selectChunk(chunks, offset) {
for (let i = 0; i < chunks.length; i++) {
const next = chunks[i];
const start = next.offset;
const end = next.offset + next.field.byteLength;
if (offset >= start && offset + 16 <= end) {
return next;
}
}
return null;
}
var SparseIndex = class extends Index {
constructor(chunks, byteLength) {
super(byteLength);
this.chunks = chunks;
for (let i = 0; i < 128; i++) {
for (let j = 0; j < 128; j++) {
const offset = (i * 128 + j) * 16;
let allz = true;
let allo = false;
const chunk = selectChunk(this.chunks, offset);
if (chunk !== null) {
const m = chunk.field.BYTES_PER_ELEMENT;
const vec = chunk.field.subarray((offset - chunk.offset) / m, (offset - chunk.offset + 16) / m);
allz = simdle.allz(vec);
allo = simdle.allo(vec);
}
const k = i * 128 + 128 + j;
set(this.handle, bitOffset(false, k), allz);
set(this.handle, bitOffset(true, k), allo);
}
{
const offset = byteOffset(false, i * 16 + 16) / 4;
const allo = simdle.allo(this.handle.subarray(offset, offset + 4));
set(this.handle, bitOffset(false, i), allo);
}
{
const offset = byteOffset(true, i * 16 + 16) / 4;
const allo = simdle.allo(this.handle.subarray(offset, offset + 4));
set(this.handle, bitOffset(true, i), allo);
}
}
}
get byteLength() {
if (this._byteLength !== -1) return this._byteLength;
const last = this.chunks[this.chunks.length - 1];
return last ? last.offset + last.field.byteLength : 0;
}
update(bit) {
const n = this.byteLength * 8;
if (bit < 0) bit += n;
if (bit < 0 || bit >= n) return false;
const i = Math.floor(bit / 16384);
const j = Math.floor(bit / 128);
const offset = j * 16;
const chunk = selectChunk(this.chunks, offset);
if (chunk === null) return false;
const m = chunk.field.BYTES_PER_ELEMENT;
const vec = chunk.field.subarray((offset - chunk.offset) / m, (offset - chunk.offset + 16) / m);
const allz = simdle.allz(vec);
const allo = simdle.allo(vec);
let changed = false;
if (set(this.handle, bitOffset(false, 128 + j), allz)) {
changed = true;
const offset2 = byteOffset(false, i * 16 + 16) / 4;
const allo2 = simdle.allo(this.handle.subarray(offset2, offset2 + 4));
set(this.handle, bitOffset(false, i), allo2);
}
if (set(this.handle, bitOffset(true, 128 + j), allo)) {
changed = true;
const offset2 = byteOffset(true, i * 16 + 16) / 4;
const allo2 = simdle.allo(this.handle.subarray(offset2, offset2 + 4));
set(this.handle, bitOffset(true, i), allo2);
}
return changed;
}
};
}
});
// node_modules/quickbit-universal/index.js
var require_quickbit_universal = __commonJS({
"node_modules/quickbit-universal/index.js"(exports2, module2) {
var fallback = require_fallback2();
try {
const native = require("quickbit-native");
exports2.get = fallback.get;
exports2.set = fallback.set;
exports2.fill = fallback.fill;
exports2.clear = native.clear;
exports2.findFirst = native.findFirst;
exports2.findLast = native.findLast;
exports2.Index = native.Index;
} catch {
module2.exports = fallback;
}
}
});
// node_modules/hypercore/lib/compat.js
var require_compat = __commonJS({
"node_modules/hypercore/lib/compat.js"(exports2) {
var quickbit = require_quickbit_universal();
if (typeof quickbit.findFirst !== "function" || typeof quickbit.findLast !== "function" || typeof quickbit.clear !== "function") {
quickbit = require_fallback2();
}
exports2.quickbit = quickbit;
}
});
// node_modules/hypercore/lib/mark-bitfield.js
var require_mark_bitfield = __commonJS({
"node_modules/hypercore/lib/mark-bitfield.js"(exports2, module2) {
var BigSparseArray = require_big_sparse_array();
var { Transform } = require_streamx();
var quickbit = require_compat().quickbit;
var b4a4 = require_b4a();
var BITS_PER_PAGE = 32768;
var BYTES_PER_PAGE = BITS_PER_PAGE / 8;
var MarkPage = class {
constructor() {
this.bitfield = null;
this.loaded = new Promise((resolve) => {
this.load = resolve;
});
}
setBitfield(bitfield) {
this.bitfield = bitfield;
this.load();
}
get(index) {
return quickbit.get(this.bitfield, index);
}
set(index, val) {
quickbit.set(this.bitfield, index, val);
}
};
module2.exports = class MarkBitfield {
static BITS_PER_PAGE = BITS_PER_PAGE;
static BYTES_PER_PAGE = BYTES_PER_PAGE;
constructor(storage) {
this.storage = storage;
this._pages = new BigSparseArray();
}
async loadPage(pageIndex) {
const p = this._pages.set(pageIndex, new MarkPage());
const rx = this.storage.read();
const pageBuf = rx.getMark(pageIndex);
rx.tryFlush();
const bitfield = await pageBuf ?? b4a4.alloc(BYTES_PER_PAGE);
await p.setBitfield(bitfield);
return p;
}
async get(index) {
const j = index & BITS_PER_PAGE - 1;
const i = (index - j) / BITS_PER_PAGE;
let p = this._pages.get(i);
if (!p) p = await this.loadPage(i);
return p.get(j);
}
async set(index, val) {
const j = index & BITS_PER_PAGE - 1;
const i = (index - j) / BITS_PER_PAGE;
let p = this._pages.get(i);
if (!p && val) p = await this.loadPage(i);
if (p) {
await p.loaded;
p.set(j, val);
const tx = this.storage.write();
tx.putMark(i, p.bitfield);
await tx.flush();
}
}
async clear() {
const tx = this.storage.write();
tx.deleteMarkRange(0, -1);
await tx.flush();
this._pages = new BigSparseArray();
}
createMarkStream({ reverse = false } = {}) {
return this.storage.createMarkStream({ reverse }).pipe(
new Transform({
transform({ index, page }, cb) {
let bitIndex = reverse ? quickbit.findLast(page, true, BITS_PER_PAGE) : quickbit.findFirst(page, true, 0);
while (bitIndex !== -1) {
const blockIndex = index * BITS_PER_PAGE + bitIndex;
this.push(blockIndex);
if (bitIndex === 0 && reverse) break;
bitIndex = reverse ? quickbit.findLast(page, true, bitIndex - 1) : quickbit.findFirst(page, true, bitIndex + 1);
}
cb(null);
}
})
);
}
};
}
});
// node_modules/hypercore/lib/inspect.js
var require_inspect = __commonJS({
"node_modules/hypercore/lib/inspect.js"(exports2, module2) {
var b4a4 = require_b4a();
module2.exports = function(core, depth, opts) {
let indent = "";
if (typeof opts.indentationLvl === "number") {
while (indent.length < opts.indentationLvl) indent += " ";
}
let peers = "";
const min = Math.min(core.peers.length, 5);
for (let i = 0; i < min; i++) {
const peer = core.peers[i];
peers += `${indent} Peer(
`;
peers += `${indent} remotePublicKey: ${opts.stylize(toHex(peer.remotePublicKey), "string")}
`;
peers += `${indent} remoteLength: ${opts.stylize(peer.remoteLength, "number")}
`;
peers += `${indent} remoteFork: ${opts.stylize(peer.remoteFork, "number")}
`;
peers += `${indent} remoteCanUpgrade: ${opts.stylize(peer.remoteCanUpgrade, "boolean")}
`;
peers += `${indent} )
`;
}
if (core.peers.length > 5) {
peers += `${indent} ... and ${core.peers.length - 5} more
`;
}
if (peers) peers = `[
${peers}${indent} ]`;
else peers = `[ ${opts.stylize(0, "number")} ]`;
return `${core.constructor.name}(
${indent} id: ${opts.stylize(core.id, "string")}
${indent} key: ${opts.stylize(toHex(core.key), "string")}
${indent} discoveryKey: ${opts.stylize(toHex(core.discoveryKey), "string")}
${indent} opened: ${opts.stylize(core.opened, "boolean")}
${indent} closed: ${opts.stylize(core.closed, "boolean")}
${indent} snapshotted: ${opts.stylize(core.snapshotted, "boolean")}
${indent} writable: ${opts.stylize(core.writable, "boolean")}
${indent} length: ${opts.stylize(core.length, "number")}
${indent} fork: ${opts.stylize(core.fork, "number")}
${indent} sessions: [ ${opts.stylize(core.sessions.length, "number")} ]
${indent} activeRequests: [ ${opts.stylize(core.activeRequests.length, "number")} ]
${indent} peers: ${peers}
${indent})`;
};
function toHex(buf) {
return buf && b4a4.toString(buf, "hex");
}
}
});
// node_modules/hypercore/lib/mutex.js
var require_mutex = __commonJS({
"node_modules/hypercore/lib/mutex.js"(exports2, module2) {
module2.exports = class Mutex {
constructor() {
this.locked = false;
this.destroyed = false;
this._destroying = null;
this._destroyError = null;
this._queue = [];
this._enqueue = (resolve, reject) => this._queue.push([resolve, reject]);
}
idle() {
return this._queue.length === 0 && this.locked === false;
}
lock() {
if (this.destroyed) {
return Promise.reject(this._destroyError || new Error("Mutex has been destroyed"));
}
if (this.locked) return new Promise(this._enqueue);
this.locked = true;
return Promise.resolve();
}
unlock() {
if (!this._queue.length) {
this.locked = false;
return;
}
this._queue.shift()[0]();
}
destroy(err) {
if (!this._destroying) {
this._destroying = this.locked ? this.lock().catch(() => {
}) : Promise.resolve();
}
this.destroyed = true;
if (err) this._destroyError = err;
if (err) {
while (this._queue.length) this._queue.shift()[1](err);
}
return this._destroying;
}
};
}
});
// node_modules/hypercore/lib/caps.js
var require_caps = __commonJS({
"node_modules/hypercore/lib/caps.js"(exports2) {
var crypto = require_hypercore_crypto();
var sodium = require_sodium_universal();
var b4a4 = require_b4a();
var c4 = require_compact_encoding();
var [
TREE,
REPLICATE_INITIATOR,
REPLICATE_RESPONDER,
MANIFEST,
DEFAULT_NAMESPACE,
DEFAULT_ENCRYPTION
] = crypto.namespace("hypercore", 6);
exports2.MANIFEST = MANIFEST;
exports2.DEFAULT_NAMESPACE = DEFAULT_NAMESPACE;
exports2.DEFAULT_ENCRYPTION = DEFAULT_ENCRYPTION;
exports2.replicate = function(isInitiator, key, handshakeHash) {
const out = b4a4.allocUnsafe(32);
sodium.crypto_generichash_batch(
out,
[isInitiator ? REPLICATE_INITIATOR : REPLICATE_RESPONDER, key],
handshakeHash
);
return out;
};
exports2.treeSignable = function(manifestHash, treeHash, length, fork) {
const state = { start: 0, end: 112, buffer: b4a4.allocUnsafe(112) };
c4.fixed32.encode(state, TREE);
c4.fixed32.encode(state, manifestHash);
c4.fixed32.encode(state, treeHash);
c4.uint64.encode(state, length);
c4.uint64.encode(state, fork);
return state.buffer;
};
exports2.treeSignableCompat = function(hash, length, fork, noHeader) {
const end = noHeader ? 48 : 80;
const state = { start: 0, end, buffer: b4a4.allocUnsafe(end) };
if (!noHeader) c4.fixed32.encode(state, TREE);
c4.fixed32.encode(state, hash);
c4.uint64.encode(state, length);
c4.uint64.encode(state, fork);
return state.buffer;
};
}
});
// node_modules/hypercore/lib/merkle-tree.js
var require_merkle_tree = __commonJS({
"node_modules/hypercore/lib/merkle-tree.js"(exports2, module2) {
var flat = require_flat_tree();
var crypto = require_hypercore_crypto();
var b4a4 = require_b4a();
var unslab = require_unslab();
var caps = require_caps();
var {
INVALID_PROOF,
INVALID_CHECKSUM,
INVALID_OPERATION,
BAD_ARGUMENT,
ASSERTION
} = require_hypercore_errors();
var NodeQueue = class {
constructor(nodes, extra = null) {
this.i = 0;
this.nodes = nodes;
this.extra = extra;
this.length = nodes.length + (this.extra === null ? 0 : 1);
}
shift(index) {
if (this.extra !== null && this.extra.index === index) {
const node2 = this.extra;
this.extra = null;
this.length--;
return node2;
}
if (this.i >= this.nodes.length) {
throw INVALID_OPERATION("Expected node " + index + ", got (nil)");
}
const node = this.nodes[this.i++];
if (node.index !== index) {
throw INVALID_OPERATION("Expected node " + index + ", got node " + node.index);
}
this.length--;
return node;
}
};
var MerkleTreeBatch = class _MerkleTreeBatch {
constructor(session) {
this.fork = session.fork;
this.roots = [...session.roots];
this.length = session.length;
this.signature = session.signature;
this.ancestors = session.length;
this.byteLength = session.byteLength;
this.prologue = session.prologue;
this.hashCached = null;
this.committed = false;
this.truncated = false;
this.treeLength = session.length;
this.treeFork = session.fork;
this.storage = session.storage;
this.session = session;
this.nodes = [];
this.upgraded = false;
}
checkout(length, additionalRoots) {
const roots = [];
let r = 0;
const head = 2 * length - 2;
const gaps = /* @__PURE__ */ new Set();
const all = /* @__PURE__ */ new Map();
if (additionalRoots) {
for (const node of additionalRoots) all.set(node.index, node);
}
for (const node of this.nodes) all.set(node.index, node);
for (const index of flat.fullRoots(head + 2)) {
const left = flat.leftSpan(index);
if (left !== 0) gaps.add(left - 1);
if (r < this.roots.length && this.roots[r].index === index) {
roots.push(this.roots[r++]);
continue;
}
const node = all.get(index);
if (!node) throw new BAD_ARGUMENT("root missing for given length");
roots.push(node);
}
this.roots = roots;
this.length = length;
this.byteLength = totalSize(roots);
this.hashCached = null;
this.signature = null;
for (let i = 0; i < this.nodes.length; i++) {
const index = this.nodes[i].index;
if (index <= head && !gaps.has(index)) continue;
const last = this.nodes.pop();
if (i < this.nodes.length) this.nodes[i--] = last;
}
}
prune(length) {
if (length === 0) return;
const head = 2 * length - 2;
const gaps = /* @__PURE__ */ new Set();
for (const index of flat.fullRoots(head + 2)) {
const left = flat.leftSpan(index);
if (left !== 0) gaps.add(left - 1);
}
for (let i = 0; i < this.nodes.length; i++) {
const index = this.nodes[i].index;
if (index > head || gaps.has(index)) continue;
const last = this.nodes.pop();
if (i < this.nodes.length) this.nodes[i--] = last;
}
}
clone() {
const b = new _MerkleTreeBatch(this.session);
b.fork = this.fork;
b.roots = [...this.roots];
b.length = this.length;
b.byteLength = this.byteLength;
b.signature = this.signature;
b.treeLength = this.treeLength;
b.treeFork = this.treeFork;
b.tree = this.tree;
b.nodes = [...this.nodes];
b.upgraded = this.upgraded;
return b;
}
hash() {
if (this.hashCached === null) this.hashCached = unslab(crypto.tree(this.roots));
return this.hashCached;
}
signable(manifestHash) {
return caps.treeSignable(manifestHash, this.hash(), this.length, this.fork);
}
signableCompat(noHeader) {
return caps.treeSignableCompat(this.hash(), this.length, this.fork, noHeader);
}
get(index) {
if (index >= this.length * 2) {
return null;
}
for (const n of this.nodes) {
if (n.index === index) return n;
}
return getTreeNodeFromStorage(this.session.storage, index);
}
// deprecated, use sssion proof instead
proof(batch, { block, hash, seek, upgrade }) {
return generateProof(this.session, batch, block, hash, seek, upgrade);
}
verifyUpgrade(proof) {
const unverified = verifyTree(proof, this.nodes);
if (!proof.upgrade) throw INVALID_OPERATION("Expected upgrade proof");
return verifyUpgrade(proof, unverified, this);
}
addNodesUnsafe(nodes) {
for (let i = 0; i < nodes.length; i++) {
this.nodes.push(nodes[i]);
}
}
append(buf) {
const head = this.length * 2;
const ite = flat.iterator(head);
const node = blockNode(head, buf);
this.appendRoot(node, ite);
}
appendRoot(node, ite) {
node = unslabNode(node);
this.hashCached = null;
this.upgraded = true;
this.length += ite.factor / 2;
this.byteLength += node.size;
this.roots.push(node);
this.nodes.push(node);
while (this.roots.length > 1) {
const a = this.roots[this.roots.length - 1];
const b = this.roots[this.roots.length - 2];
if (ite.sibling() !== b.index) {
ite.sibling();
break;
}
const node2 = unslabNode(parentNode(ite.parent(), a, b));
this.nodes.push(node2);
this.roots.pop();
this.roots.pop();
this.roots.push(node2);
}
}
commitable() {
return this.treeFork === this.session.fork && (this.upgraded ? this.treeLength === this.session.length : this.treeLength <= this.session.length);
}
commit(tx) {
if (tx === void 0) throw INVALID_OPERATION("No database batch was passed");
if (this.session.core._repairMode) {
throw ASSERTION("Cannot commit while repair mode is on");
}
if (!this.commitable()) {
throw INVALID_OPERATION("Tree was modified during batch, refusing to commit");
}
if (this.upgraded) this._commitUpgrade(tx);
for (let i = 0; i < this.nodes.length; i++) {
const node = this.nodes[i];
tx.putTreeNode(node);
}
this.committed = true;
return this;
}
_commitUpgrade(tx) {
if (this.ancestors < this.treeLength) {
tx.deleteTreeNodeRange(this.ancestors * 2, this.treeLength * 2);
if (this.ancestors > 0) {
const head = this.ancestors * 2;
const ite = flat.iterator(head - 2);
while (true) {
if (ite.contains(head) && ite.index < head) {
tx.deleteTreeNode(ite.index);
}
if (ite.offset === 0) break;
ite.parent();
}
this.truncated = true;
}
}
}
seek(bytes, padding) {
return new ByteSeeker(this, this, bytes, padding);
}
byteRange(index) {
const rx = this.storage.read();
const range = getByteRange(this, index, rx);
rx.tryFlush();
return range;
}
byteOffset(index) {
if (index === 2 * this.length) return this.byteLength;
const rx = this.storage.read();
const offset = getByteOffset(this, index, rx);
rx.tryFlush();
return offset;
}
async downgrade() {
if (!this.upgraded) return true;
const rx = this.storage.read();
const nodePromises = [];
for (const r of this.roots) {
nodePromises.push(rx.getTreeNode(r.index));
}
rx.tryFlush();
const nodes = await Promise.all(nodePromises);
for (let i = 0; i < this.roots.length; i++) {
const root = this.roots[i];
const node = nodes[i];
if (!node) return false;
if (!b4a4.equals(node.hash, root.hash)) return false;
}
this.upgraded = false;
return true;
}
async restore(length) {
if (length === this.length) return this;
const roots = unslabNodes(await MerkleTree.getRootsFromStorage(this.storage, length));
this.roots = roots;
this.length = length;
this.byteLength = totalSize(roots);
this.ancestors = length;
for (const node of roots) this.byteLength += node.size;
return this;
}
};
var ReorgBatch = class extends MerkleTreeBatch {
constructor(session) {
super(session);
this.roots = [];
this.length = 0;
this.byteLength = 0;
this.diff = null;
this.ancestors = 0;
this.upgraded = true;
this.want = {
nodes: 0,
start: 0,
end: 0
};
}
get finished() {
return this.want === null;
}
update(proof) {
if (this.want === null) return true;
const nodes = [];
const root = verifyTree(proof, nodes);
if (root === null || !b4a4.equals(root.hash, this.diff.hash)) return false;
this.nodes.push(...nodes);
return this._update(nodes);
}
async _update(nodes) {
const n = /* @__PURE__ */ new Map();
for (const node of nodes) n.set(node.index, node);
let diff = null;
const ite = flat.iterator(this.diff.index);
const startingDiff = this.diff;
while ((ite.index & 1) !== 0) {
const left = n.get(ite.leftChild());
if (!left) break;
const existing = await getTreeNodeFromStorage(this.session.storage, left.index);
if (!existing || !b4a4.equals(existing.hash, left.hash)) {
diff = left;
} else {
diff = n.get(ite.sibling());
}
}
if ((this.diff.index & 1) === 0) return true;
if (diff === null) return false;
if (startingDiff !== this.diff) return false;
return this._updateDiffRoot(diff);
}
_updateDiffRoot(diff) {
if (this.want === null) return true;
const spans = flat.spans(diff.index);
const start = spans[0] / 2;
const end = Math.min(this.treeLength, spans[1] / 2 + 1);
const len = end - start;
this.ancestors = start;
this.diff = diff;
if ((diff.index & 1) === 0 || this.want.start >= this.treeLength || len <= 0) {
this.want = null;
return true;
}
this.want.start = start;
this.want.end = end;
this.want.nodes = log2(spans[1] - spans[0] + 2) - 1;
return false;
}
};
var ByteSeeker = class {
constructor(session, bytes, padding = 0) {
this.session = session;
this.bytes = bytes;
this.padding = padding;
const size = session.byteLength - session.length * padding;
this.start = bytes >= size ? session.length : 0;
this.end = bytes < size ? session.length : 0;
}
async _seek(bytes) {
if (!bytes) return [0, 0];
for (const node of this.session.roots) {
const size = getUnpaddedSize(node, this.padding, null);
if (bytes === size) return [flat.rightSpan(node.index) + 2, 0];
if (bytes > size) {
bytes -= size;
continue;
}
const ite = flat.iterator(node.index);
while ((ite.index & 1) !== 0) {
const l = await getTreeNodeFromStorage(this.session.storage, ite.leftChild());
if (l) {
const size2 = getUnpaddedSize(l, this.padding, ite);
if (size2 === bytes) return [ite.rightSpan() + 2, 0];
if (size2 > bytes) continue;
bytes -= size2;
ite.sibling();
} else {
ite.parent();
return [ite.index, bytes];
}
}
return [ite.index, bytes];
}
return null;
}
async update() {
const res = await this._seek(this.bytes);
if (!res) return null;
if ((res[0] & 1) === 0) return [res[0] / 2, res[1]];
const span = flat.spans(res[0]);
this.start = span[0] / 2;
this.end = span[1] / 2 + 1;
return null;
}
};
var TreeProof = class {
constructor(session, block, hash, seek, upgrade) {
this.fork = session.fork;
this.signature = session.signature;
this.block = block;
this.hash = hash;
this.seek = seek;
this.upgrade = upgrade;
this.pending = {
node: null,
seek: null,
upgrade: null,
additionalUpgrade: null
};
}
async settle() {
const result = {
fork: this.fork,
block: null,
hash: null,
seek: null,
upgrade: null,
manifest: null
};
const [pNode, pSeek, pUpgrade, pAdditional] = await settleProof(this.pending);
if (this.block) {
if (pNode === null) throw INVALID_OPERATION("Invalid block request");
result.block = {
index: this.block.index,
value: null,
// populated upstream, alloc it here for simplicity
nodes: pNode
};
} else if (this.hash) {
if (pNode === null) throw INVALID_OPERATION("Invalid block request");
result.hash = {
index: this.hash.index,
nodes: pNode
};
}
if (this.seek && pSeek !== null) {
result.seek = {
bytes: this.seek.bytes,
nodes: pSeek
};
}
if (this.upgrade) {
result.upgrade = {
start: this.upgrade.start,
length: this.upgrade.length,
nodes: pUpgrade,
additionalNodes: pAdditional || [],
signature: this.signature
};
}
return result;
}
};
var MerkleTree = class _MerkleTree {
static hash(s) {
return unslab(crypto.tree(s.roots));
}
static signable(s, namespace) {
return caps.treeSignable(namespace, _MerkleTree.hash(s), s.length, s.fork);
}
static size(roots) {
return totalSize(roots);
}
static span(roots) {
return totalSpan(roots);
}
static getRoots(session, length) {
return _MerkleTree.getRootsFromStorage(session.storage, length);
}
static getRootsFromStorage(storage, length) {
const indexes2 = flat.fullRoots(2 * length);
const roots = new Array(indexes2.length);
const rx = storage.read();
for (let i = 0; i < indexes2.length; i++) {
roots[i] = getTreeNodeOrError(rx, indexes2[i]);
}
rx.tryFlush();
return Promise.all(roots);
}
static async upgradeable(session, length) {
const indexes2 = flat.fullRoots(2 * length);
const roots = new Array(indexes2.length);
const rx = session.storage.read();
for (let i = 0; i < indexes2.length; i++) {
roots[i] = rx.getTreeNode(indexes2[i]);
}
rx.tryFlush();
for (const node of await Promise.all(roots)) {
if (node === null) return false;
}
return true;
}
static seek(session, bytes, padding) {
return new ByteSeeker(session, bytes, padding);
}
static get(session, index) {
return getTreeNodeFromStorage(session.storage, index);
}
static async truncate(session, length, batch, fork = batch.fork) {
const head = length * 2;
const fullRoots = flat.fullRoots(head);
for (let i = 0; i < fullRoots.length; i++) {
const root = fullRoots[i];
if (i < batch.roots.length && batch.roots[i].index === root) continue;
while (batch.roots.length > i) batch.roots.pop();
batch.roots.push(unslabNode(await getTreeNodeFromStorageOrError(session.storage, root)));
}
while (batch.roots.length > fullRoots.length) {
batch.roots.pop();
}
batch.fork = fork;
batch.length = length;
batch.ancestors = length;
batch.byteLength = totalSize(batch.roots);
batch.upgraded = true;
return batch;
}
static async reorg(session, proof, batch) {
let unverified = null;
if (proof.block || proof.hash || proof.seek) {
unverified = verifyTree(proof, batch.nodes);
}
if (!verifyUpgrade(proof, unverified, batch)) {
throw INVALID_PROOF("Fork proof not verifiable");
}
for (const root of batch.roots) {
const existing = await getTreeNodeFromStorage(session.storage, root.index);
if (existing && b4a4.equals(existing.hash, root.hash)) continue;
batch._updateDiffRoot(root);
break;
}
if (batch.diff !== null) {
await batch._update(batch.nodes);
} else {
batch.want = null;
batch.ancestors = batch.length;
}
return batch;
}
static verifyFullyRemote(session, proof) {
const batch = new MerkleTreeBatch(session);
batch.fork = proof.fork;
batch.roots = [];
batch.length = 0;
batch.ancestors = 0;
batch.byteLength = 0;
let unverified = verifyTree(proof, batch.nodes);
if (proof.upgrade) {
if (verifyUpgrade(proof, unverified, batch)) {
unverified = null;
}
}
return batch;
}
static async verify(session, proof) {
const batch = new MerkleTreeBatch(session);
let unverified = verifyTree(proof, batch.nodes);
if (proof.upgrade) {
if (verifyUpgrade(proof, unverified, batch)) {
unverified = null;
}
}
if (unverified) {
const verified = await getTreeNodeFromStorageOrError(session.storage, unverified.index);
if (!b4a4.equals(verified.hash, unverified.hash)) {
throw INVALID_CHECKSUM("Invalid checksum at node " + unverified.index);
}
}
return batch;
}
static proof(session, rx, { block, hash, seek, upgrade }) {
return generateProof(session, rx, block, hash, seek, upgrade);
}
static maxMissingNodes(index, length) {
const head = 2 * length;
const ite = flat.iterator(index);
const iteRightSpan = ite.index + ite.factor / 2 - 1;
if (iteRightSpan >= head) return 0;
for (const r of flat.fullRoots(head)) {
if (r === index) return 0;
}
ite.parent();
let cnt = 0;
while (!ite.contains(head)) {
cnt++;
ite.parent();
}
return cnt;
}
static async missingNodes(session, index, length) {
const head = 2 * length;
const ite = flat.iterator(index);
const iteRightSpan = ite.index + ite.factor / 2 - 1;
if (iteRightSpan >= head) return 0;
let cnt = 0;
while (!ite.contains(head) && !await hasTreeNode(session.storage, ite.index)) {
cnt++;
if (cnt >= 1024) {
throw ASSERTION("Bad arguments to missingNodes index=" + index + " at length=" + length);
}
ite.parent();
}
return cnt;
}
static byteOffset(session, index) {
return getByteOffsetSession(session, index, null);
}
static byteRange(session, index) {
const rx = session.storage.read();
const offset = getByteOffsetSession(session, index, rx);
const size = getNodeSize(index, rx);
rx.tryFlush();
return Promise.all([offset, size]);
}
static upgradeLength(proof) {
const extra = proof.additionalNodes;
if (extra.length) {
const last = extra[extra.length - 1];
const index = flat.rightSpan(last.index);
return index / 2 + 1;
}
return proof.start + proof.length;
}
};
module2.exports = {
MerkleTreeBatch,
ReorgBatch,
MerkleTree
};
async function getNodeSize(index, rx) {
return (await getTreeNodeOrError(rx, index)).size;
}
async function getByteOffsetSession(session, index, rx) {
if (index === 2 * session.length) return session.byteLength;
const treeNodes = rx === null ? await getByteOffsetBatchFlush(session.roots, index, session.storage.read()) : await getByteOffsetBatch(session.roots, index, rx);
let offset = 0;
for (const node of treeNodes) offset += node.size;
return offset;
}
async function getByteOffset(tree, index, rx) {
if (index === 2 * tree.length) return tree.byteLength;
const treeNodes = await getByteOffsetBatch(tree.roots, index, rx);
let offset = 0;
for (const node of treeNodes) offset += node.size;
return offset;
}
function getByteOffsetBatchFlush(roots, index, rx) {
const treeNodes = getByteOffsetBatch(roots, index, rx);
rx.tryFlush();
return treeNodes;
}
function getByteOffsetBatch(roots, index, rx) {
if ((index & 1) === 1) index = flat.leftSpan(index);
let head = 0;
let cnt = 0;
const promises = [];
for (const node of roots) {
head += 2 * (node.index - head + 1);
if (index >= head) {
promises.push(node.size);
continue;
}
const ite = flat.iterator(node.index);
while (ite.index !== index) {
if (++cnt >= 1024) throw ASSERTION("Bad getByteOffsetSession index=" + index);
if (index < ite.index) {
ite.leftChild();
} else {
promises.push(getTreeNodeOrError(rx, ite.leftChild()));
ite.sibling();
}
}
return Promise.all(promises);
}
throw ASSERTION("Failed to find offset");
}
function getByteRange(tree, index, rx) {
const head = 2 * tree.length;
if (((index & 1) === 0 ? index : flat.rightSpan(index)) >= head) {
throw BAD_ARGUMENT("Index is out of bounds");
}
const offset = getByteOffset(tree, index, rx);
const size = getNodeSize(index, rx);
return Promise.all([offset, size]);
}
function verifyTree({ block, hash, seek }, nodes) {
const untrustedNode = block ? { index: 2 * block.index, value: block.value, nodes: block.nodes } : hash ? { index: hash.index, value: null, nodes: hash.nodes } : null;
if (untrustedNode === null && (!seek || !seek.nodes.length)) return null;
let root = null;
if (seek && seek.nodes.length) {
const ite2 = flat.iterator(seek.nodes[0].index);
const q2 = new NodeQueue(seek.nodes);
root = q2.shift(ite2.index);
nodes.push(root);
while (q2.length > 0) {
const node = q2.shift(ite2.sibling());
root = parentNode(ite2.parent(), root, node);
nodes.push(node);
nodes.push(root);
}
}
if (untrustedNode === null) return root;
const ite = flat.iterator(untrustedNode.index);
const blockHash = untrustedNode.value && blockNode(ite.index, untrustedNode.value);
const q = new NodeQueue(untrustedNode.nodes, root);
root = blockHash || q.shift(ite.index);
nodes.push(root);
while (q.length > 0) {
const node = q.shift(ite.sibling());
root = parentNode(ite.parent(), root, node);
nodes.push(node);
nodes.push(root);
}
return root;
}
function verifyUpgrade({ fork, upgrade }, blockRoot, batch) {
const prologue = batch.prologue;
if (prologue) {
const { start, length } = upgrade;
if (start < prologue.length && (start !== 0 || length < prologue.length)) {
throw INVALID_PROOF("Upgrade does not satisfy prologue");
}
}
const q = new NodeQueue(upgrade.nodes, blockRoot);
let grow = batch.roots.length > 0;
let i = 0;
const to = 2 * (upgrade.start + upgrade.length);
const ite = flat.iterator(0);
for (; ite.fullRoot(to); ite.nextTree()) {
if (i < batch.roots.length && batch.roots[i].index === ite.index) {
i++;
continue;
}
if (grow) {
grow = false;
const root = ite.index;
if (i < batch.roots.length) {
ite.seek(batch.roots[batch.roots.length - 1].index);
while (ite.index !== root) {
batch.appendRoot(q.shift(ite.sibling()), ite);
}
continue;
}
}
batch.appendRoot(q.shift(ite.index), ite);
}
if (prologue && batch.length === prologue.length) {
if (!b4a4.equals(prologue.hash, batch.hash())) {
throw INVALID_PROOF("Invalid hash");
}
}
const extra = upgrade.additionalNodes;
ite.seek(batch.roots[batch.roots.length - 1].index);
i = 0;
while (i < extra.length && extra[i].index === ite.sibling()) {
batch.appendRoot(extra[i++], ite);
}
while (i < extra.length) {
const node = extra[i++];
while (node.index !== ite.index) {
if (ite.factor === 2) throw INVALID_OPERATION("Unexpected node: " + node.index);
ite.leftChild();
}
batch.appendRoot(node, ite);
ite.sibling();
}
batch.signature = unslab(upgrade.signature);
batch.fork = fork;
return q.extra === null;
}
async function seekFromHead(session, head, bytes, padding) {
const roots = flat.fullRoots(head);
for (let i = 0; i < roots.length; i++) {
const root = roots[i];
const node = await getTreeNodeFromStorage(session.storage, root);
const size = getUnpaddedSize(node, padding, null);
if (bytes === size) return root;
if (bytes > size) {
bytes -= size;
continue;
}
return seekTrustedTree(session, root, bytes, padding);
}
return head;
}
async function seekTrustedTree(session, root, bytes, padding) {
if (!bytes) return root;
const ite = flat.iterator(root);
let cnt = 0;
while ((ite.index & 1) !== 0) {
if (++cnt >= 1024) throw ASSERTION("Bad seekTrusted bytes=" + bytes + ", paddding=" + padding);
const l = await getTreeNodeFromStorage(session.storage, ite.leftChild());
if (l) {
const size = getUnpaddedSize(l, padding, ite);
if (size === bytes) return ite.index;
if (size > bytes) continue;
bytes -= size;
ite.sibling();
} else {
ite.parent();
return ite.index;
}
}
return ite.index;
}
async function seekUntrustedTree(session, root, bytes, padding) {
const offset = await getByteOffsetSession(session, root, null) - (padding ? padding * flat.leftSpan(root) / 2 : 0);
if (offset > bytes) throw INVALID_OPERATION("Invalid seek");
if (offset === bytes) return root;
bytes -= offset;
const node = await getTreeNodeFromStorageOrError(session.storage, root);
if (getUnpaddedSize(node, padding, null) <= bytes) throw INVALID_OPERATION("Invalid seek");
return seekTrustedTree(session, root, bytes, padding);
}
function seekProof(session, rx, seekRoot, root, p) {
const ite = flat.iterator(seekRoot);
let cnt = 0;
p.seek = [];
p.seek.push(getTreeNodeOrError(rx, ite.index));
while (ite.index !== root) {
if (++cnt >= 1024) throw ASSERTION("Bad seekProof seekRoot=" + seekRoot + ", root=" + root);
ite.sibling();
p.seek.push(getTreeNodeOrError(rx, ite.index));
ite.parent();
}
}
function blockAndSeekProof(session, rx, node, seek, seekRoot, root, p) {
if (!node) return seekProof(session, rx, seekRoot, root, p);
const ite = flat.iterator(node.index);
let cnt = 0;
p.node = [];
if (!node.value) p.node.push(getTreeNodeOrError(rx, ite.index));
while (ite.index !== root) {
if (++cnt >= 1024) {
throw ASSERTION("Bad blockAndSeekProof seekRoot=" + seekRoot + ", root=" + root);
}
ite.sibling();
if (seek && ite.contains(seekRoot) && ite.index !== seekRoot) {
seekProof(session, rx, seekRoot, ite.index, p);
} else {
p.node.push(getTreeNodeOrError(rx, ite.index));
}
ite.parent();
}
}
function upgradeProof(session, rx, node, seek, from, to, subTree, p) {
if (from === 0) p.upgrade = [];
for (const ite = flat.iterator(0); ite.fullRoot(to); ite.nextTree()) {
if (ite.index + ite.factor / 2 < from) continue;
if (p.upgrade === null && ite.contains(from - 2)) {
p.upgrade = [];
const root = ite.index;
const target = from - 2;
let cnt = 0;
ite.seek(target);
while (ite.index !== root) {
if (++cnt >= 1024) throw ASSERTION("Bad upgradeProof target=" + target + ", root=" + root);
ite.sibling();
if (ite.index > target) {
if (p.node === null && p.seek === null && ite.contains(subTree)) {
blockAndSeekProof(session, rx, node, seek, subTree, ite.index, p);
} else {
p.upgrade.push(getTreeNodeOrError(rx, ite.index));
}
}
ite.parent();
}
continue;
}
if (p.upgrade === null) {
p.upgrade = [];
}
if (p.node === null && p.seek === null && ite.contains(subTree)) {
blockAndSeekProof(session, rx, node, seek, subTree, ite.index, p);
continue;
}
p.upgrade.push(getTreeNodeOrError(rx, ite.index));
}
}
function additionalUpgradeProof(session, rx, from, to, p) {
if (from === 0) p.additionalUpgrade = [];
for (const ite = flat.iterator(0); ite.fullRoot(to); ite.nextTree()) {
if (ite.index + ite.factor / 2 < from) continue;
if (p.additionalUpgrade === null && ite.contains(from - 2)) {
p.additionalUpgrade = [];
const root = ite.index;
const target = from - 2;
let cnt = 0;
ite.seek(target);
while (ite.index !== root) {
if (++cnt >= 1024) {
throw ASSERTION(
"Bad arguments to additionalUpgradeProof root=" + root + " target=" + target
);
}
ite.sibling();
if (ite.index > target) {
p.additionalUpgrade.push(getTreeNodeOrError(rx, ite.index));
}
ite.parent();
}
continue;
}
if (p.additionalUpgrade === null) {
p.additionalUpgrade = [];
}
p.additionalUpgrade.push(getTreeNodeOrError(rx, ite.index));
}
}
function nodesToRoot(index, nodes, head) {
const ite = flat.iterator(index);
for (let i = 0; i < nodes; i++) {
ite.parent();
if (ite.contains(head)) throw INVALID_OPERATION("Nodes is out of bounds");
}
return ite.index;
}
function totalSize(nodes) {
let s = 0;
for (const node of nodes) s += node.size;
return s;
}
function totalSpan(nodes) {
let s = 0;
for (const node of nodes) s += 2 * (node.index - s + 1);
return s;
}
function blockNode(index, value) {
return { index, size: value.byteLength, hash: crypto.data(value) };
}
function parentNode(index, a, b) {
return { index, size: a.size + b.size, hash: crypto.parent(a, b) };
}
function log2(n) {
let res = 1;
while (n > 2) {
n /= 2;
res++;
}
return res;
}
function normalizeIndexed(block, hash) {
if (block) {
return {
value: true,
index: block.index * 2,
nodes: block.nodes,
lastIndex: block.index
};
}
if (hash) {
return {
value: false,
index: hash.index,
nodes: hash.nodes,
lastIndex: flat.rightSpan(hash.index) / 2
};
}
return null;
}
async function getTreeNodeOrError(rx, index) {
const node = await rx.getTreeNode(index);
if (node === null) {
throw INVALID_OPERATION("Expected tree node " + index + " from storage, got (nil)");
}
return node;
}
function getTreeNodeFromStorageOrError(storage, index) {
const rx = storage.read();
const p = getTreeNodeOrError(rx, index);
rx.tryFlush();
return p;
}
function getTreeNodeFromStorage(storage, index) {
const rx = storage.read();
const node = rx.getTreeNode(index);
rx.tryFlush();
return node;
}
function hasTreeNode(storage, index) {
const rx = storage.read();
const has = rx.hasTreeNode(index);
rx.tryFlush();
return has;
}
async function settleProof(p) {
const result = [
p.node && Promise.all(p.node),
p.seek && Promise.all(p.seek),
p.upgrade && Promise.all(p.upgrade),
p.additionalUpgrade && Promise.all(p.additionalUpgrade)
];
try {
return await Promise.all(result);
} catch (err) {
if (p.node) await Promise.allSettled(p.node);
if (p.seek) await Promise.allSettled(p.seek);
if (p.upgrade) await Promise.allSettled(p.upgrade);
if (p.additionalUpgrade) await Promise.allSettled(p.additionalUpgrade);
throw err;
}
}
async function generateProof(session, rx, block, hash, seek, upgrade) {
if (session.prologue && upgrade) {
upgrade.start = upgrade.start < session.prologue.length ? 0 : upgrade.start;
upgrade.length = upgrade.start < session.prologue.length ? session.prologue.length : upgrade.length;
}
const head = 2 * session.length;
const from = upgrade ? upgrade.start * 2 : 0;
const to = upgrade ? from + upgrade.length * 2 : head;
const node = normalizeIndexed(block, hash);
if (head === 0) return new TreeProof(session, null, null, null, null);
if (from >= to || to > head) {
throw INVALID_OPERATION("Invalid upgrade");
}
if (seek && upgrade && node !== null && node.index >= from) {
throw INVALID_OPERATION("Cannot both do a seek and block/hash request when upgrading");
}
let subTree = head;
const p = new TreeProof(session, block, hash, seek, upgrade);
if (node !== null && (!upgrade || node.lastIndex < upgrade.start)) {
subTree = nodesToRoot(node.index, node.nodes, to);
const seekRoot = seek ? await seekUntrustedTree(session, subTree, seek.bytes, seek.padding) : head;
blockAndSeekProof(session, rx, node, seek, seekRoot, subTree, p.pending);
} else if ((node || seek) && upgrade) {
subTree = seek ? await seekFromHead(session, to, seek.bytes, seek.padding) : node.index;
}
if (upgrade) {
upgradeProof(session, rx, node, seek, from, to, subTree, p.pending);
if (head > to) additionalUpgradeProof(session, rx, to, head, p.pending);
}
return p;
}
function getUnpaddedSize(node, padding, ite) {
return padding === 0 ? node.size : node.size - padding * (ite ? ite.countLeaves() : flat.countLeaves(node.index));
}
function unslabNodes(nodes) {
for (const node of nodes) unslabNode(node);
return nodes;
}
function unslabNode(node) {
if (node === null) return node;
node.hash = unslab(node.hash);
return node;
}
}
});
// node_modules/hypercore/lib/bit-interlude.js
var require_bit_interlude = __commonJS({
"node_modules/hypercore/lib/bit-interlude.js"(exports2, module2) {
var b4a4 = require_b4a();
var quickbit = require_compat().quickbit;
module2.exports = class BitInterlude {
constructor() {
this.ranges = [];
}
contiguousLength(from) {
for (const r of this.ranges) {
if (r.start > from) break;
if (!r.value && r.start <= from) return r.start;
}
while (this.get(from) === true) from++;
return from;
}
get(index) {
let start = 0;
let end = this.ranges.length;
while (start < end) {
const mid = start + end >> 1;
const r = this.ranges[mid];
if (index < r.start) {
end = mid;
continue;
}
if (index >= r.end) {
if (mid === start) break;
start = mid;
continue;
}
return r.value;
}
return false;
}
setRange(start, end, value) {
if (start === end) return;
let r = null;
for (let i = 0; i < this.ranges.length; i++) {
r = this.ranges[i];
if (r.start <= start && end <= r.end) {
if (value === r.value) return;
const ranges = mergeRanges(r, { start, end, value });
this.ranges.splice(i, 1, ...ranges);
return;
}
if (start > r.end) {
continue;
}
if (end >= r.start && end <= r.end) {
r.start = r.value === value ? start : end;
if (r.value !== value) this.ranges.splice(i, 0, { start, end, value });
return;
}
if (start >= r.start && start <= r.end) {
if (r.value !== value) {
r.end = start;
if (this.ranges.length - 1 > i) {
const next = this.ranges[i + 1];
if (next.value === value) continue;
if (next.start < end) next.start = end;
}
this.ranges.splice(++i, 0, { start, end, value });
return;
}
start = r.start;
}
let remove = 0;
for (let j = i; j < this.ranges.length; j++) {
const n = this.ranges[j];
if (n.start > end || n.value !== value) break;
if (n.start <= end && n.end > end) end = n.end;
remove++;
}
this.ranges.splice(i, remove, { start, end, value });
return;
}
if (r !== null) {
if (start <= r.end && end > r.end) {
r.end = end;
return;
}
if (r.end > start) return;
}
this.ranges.push({ start, end, value });
}
flush(tx, bitfield) {
if (!this.ranges.length) return [];
let index = this.ranges[0].start;
const final = this.ranges[this.ranges.length - 1].end;
let i = 0;
while (index < final) {
const page = bitfield.getBitfield(index);
const pageIndex = page ? page.index : bitfield.getPageIndex(index);
const buf = b4a4.allocUnsafe(bitfield.getPageByteLength());
if (page) {
const src = page.bitfield;
buf.set(b4a4.from(src.buffer, src.byteOffset, src.byteLength), 0);
} else {
b4a4.fill(buf, 0);
}
const last = (pageIndex + 1) * (buf.byteLength << 3);
const offset = pageIndex * (buf.byteLength << 3);
let hasValue = false;
while (i < this.ranges.length) {
const { start, end, value } = this.ranges[i];
if (!hasValue && value) hasValue = true;
const from = start < index ? index : start;
const to = end < last ? end : last;
quickbit.fill(buf, value, from - offset, to - offset);
index = to;
if (to === last) break;
i++;
}
if (page || hasValue) tx.putBitfieldPage(pageIndex, buf);
}
return this.ranges;
}
};
function mergeRanges(a, b) {
const ranges = [];
if (a.start < b.start) ranges.push({ start: a.start, end: b.start, value: a.value });
ranges.push({ start: b.start, end: b.end, value: b.value });
if (b.end < a.end) ranges.push({ start: b.end, end: a.end, value: a.value });
return ranges;
}
}
});
// node_modules/hypercore/lib/bitfield.js
var require_bitfield = __commonJS({
"node_modules/hypercore/lib/bitfield.js"(exports2, module2) {
var BigSparseArray = require_big_sparse_array();
var b4a4 = require_b4a();
var quickbit = require_compat().quickbit;
var BITS_PER_PAGE = 32768;
var BYTES_PER_PAGE = BITS_PER_PAGE / 8;
var WORDS_PER_PAGE = BYTES_PER_PAGE / 4;
var BITS_PER_SEGMENT = 2097152;
var BYTES_PER_SEGMENT = BITS_PER_SEGMENT / 8;
var WORDS_PER_SEGMENT = BYTES_PER_SEGMENT / 4;
var INITIAL_WORDS_PER_SEGMENT = 1024;
var PAGES_PER_SEGMENT = BITS_PER_SEGMENT / BITS_PER_PAGE;
var SEGMENT_GROWTH_FACTOR = 4;
var BitfieldPage = class {
constructor(index, segment) {
this.index = index;
this.offset = index * BYTES_PER_PAGE - segment.offset;
this.bitfield = null;
this.segment = segment;
segment.add(this);
}
get tree() {
return this.segment.tree;
}
get(index, dirty) {
return quickbit.get(this.bitfield, index);
}
set(index, val) {
if (quickbit.set(this.bitfield, index, val)) {
this.tree.update(this.offset * 8 + index);
}
}
setRange(start, end, val) {
quickbit.fill(this.bitfield, val, start, end);
let i = Math.floor(start / 128);
const n = i + Math.ceil((end - start) / 128);
while (i <= n) this.tree.update(this.offset * 8 + i++ * 128);
}
findFirst(val, position) {
return quickbit.findFirst(this.bitfield, val, position);
}
findLast(val, position) {
return quickbit.findLast(this.bitfield, val, position);
}
count(start, length, val) {
const end = start + length;
let i = start;
let c4 = 0;
while (length > 0) {
const l = this.findFirst(val, i);
if (l === -1 || l >= end) return c4;
const h = this.findFirst(!val, l + 1);
if (h === -1 || h >= end) return c4 + end - l;
c4 += h - l;
length -= h - i;
i = h;
}
return c4;
}
};
var BitfieldSegment = class {
constructor(index, bitfield) {
this.index = index;
this.offset = index * BYTES_PER_SEGMENT;
this.tree = quickbit.Index.from(bitfield, BYTES_PER_SEGMENT);
this.pages = new Array(PAGES_PER_SEGMENT);
}
get bitfield() {
return this.tree.field;
}
add(page) {
const i = page.index - this.index * PAGES_PER_SEGMENT;
this.pages[i] = page;
const start = i * WORDS_PER_PAGE;
const end = start + WORDS_PER_PAGE;
if (end >= this.bitfield.length) this.reallocate(end);
page.bitfield = this.bitfield.subarray(start, end);
}
reallocate(length) {
let target = this.bitfield.length;
while (target < length) target *= SEGMENT_GROWTH_FACTOR;
const bitfield = new Uint32Array(target);
bitfield.set(this.bitfield);
this.tree = quickbit.Index.from(bitfield, BYTES_PER_SEGMENT);
for (let i = 0; i < this.pages.length; i++) {
const page = this.pages[i];
if (!page) continue;
const start = i * WORDS_PER_PAGE;
const end = start + WORDS_PER_PAGE;
page.bitfield = bitfield.subarray(start, end);
}
}
findFirst(val, position) {
position = this.tree.skipFirst(!val, position);
let j = position & BITS_PER_PAGE - 1;
let i = (position - j) / BITS_PER_PAGE;
if (i >= PAGES_PER_SEGMENT) return -1;
while (i < this.pages.length) {
const p = this.pages[i];
let index = -1;
if (p) index = p.findFirst(val, j);
else if (!val) index = j;
if (index !== -1) return i * BITS_PER_PAGE + index;
j = 0;
i++;
}
return -1;
}
findLast(val, position) {
position = this.tree.skipLast(!val, position);
let j = position & BITS_PER_PAGE - 1;
let i = (position - j) / BITS_PER_PAGE;
if (i >= PAGES_PER_SEGMENT) return -1;
while (i >= 0) {
const p = this.pages[i];
let index = -1;
if (p) index = p.findLast(val, j);
else if (!val) index = j;
if (index !== -1) return i * BITS_PER_PAGE + index;
j = BITS_PER_PAGE - 1;
i--;
}
return -1;
}
};
module2.exports = class Bitfield {
static BITS_PER_PAGE = BITS_PER_PAGE;
static BYTES_PER_PAGE = BYTES_PER_PAGE;
constructor(buffer) {
this.resumed = !!(buffer && buffer.byteLength >= 0);
this._pages = new BigSparseArray();
this._segments = new BigSparseArray();
const view = this.resumed ? new Uint32Array(buffer.buffer, buffer.byteOffset, Math.floor(buffer.byteLength / 4)) : new Uint32Array(INITIAL_WORDS_PER_SEGMENT);
for (let i = 0; i < view.length; i += WORDS_PER_SEGMENT) {
let bitfield = view.subarray(i, i + WORDS_PER_SEGMENT);
let length = WORDS_PER_SEGMENT;
if (i === 0) {
length = INITIAL_WORDS_PER_SEGMENT;
while (length < bitfield.length) length *= SEGMENT_GROWTH_FACTOR;
}
if (bitfield.length !== length) {
const copy = new Uint32Array(length);
copy.set(bitfield, 0);
bitfield = copy;
}
const segment = new BitfieldSegment(i / WORDS_PER_SEGMENT, bitfield);
this._segments.set(segment.index, segment);
for (let j = 0; j < bitfield.length; j += WORDS_PER_PAGE) {
const page = new BitfieldPage((i + j) / WORDS_PER_PAGE, segment);
this._pages.set(page.index, page);
}
}
}
static from(bitfield) {
return new Bitfield(bitfield.toBuffer(bitfield._pages.maxLength * BITS_PER_PAGE));
}
toBuffer(length) {
const pages = Math.ceil(length / BITS_PER_PAGE);
const buffer = b4a4.allocUnsafe(pages * BYTES_PER_PAGE);
for (let i = 0; i < pages; i++) {
const page = this._pages.get(i);
const offset = i * BYTES_PER_PAGE;
if (page) {
const buf = b4a4.from(
page.bitfield.buffer,
page.bitfield.byteOffset,
page.bitfield.byteLength
);
buffer.set(buf, offset);
} else {
buffer.fill(0, offset, offset + BYTES_PER_PAGE);
}
}
return buffer;
}
getBitfield(index) {
const i = this.getPageIndex(index);
const p = this._pages.get(i);
return p || null;
}
merge(bitfield, length) {
let i = 0;
while (i < length) {
const start = bitfield.firstSet(i);
if (start === -1) break;
i = bitfield.firstUnset(start);
if (i === -1 || i > length) i = length;
this.setRange(start, i, true);
if (i >= length) break;
}
}
get(index) {
const j = index & BITS_PER_PAGE - 1;
const i = (index - j) / BITS_PER_PAGE;
const p = this._pages.get(i);
return p ? p.get(j) : false;
}
getPageByteLength() {
return BYTES_PER_PAGE;
}
getPageIndex(index) {
const j = index & BITS_PER_PAGE - 1;
return (index - j) / BITS_PER_PAGE;
}
getPage(index, create) {
const i = this.getPageIndex(index);
let p = this._pages.get(i);
if (p) return p;
if (!create) return null;
const k = Math.floor(i / PAGES_PER_SEGMENT);
const s = this._segments.get(k) || this._segments.set(
k,
new BitfieldSegment(
k,
new Uint32Array(k === 0 ? INITIAL_WORDS_PER_SEGMENT : WORDS_PER_SEGMENT)
)
);
p = this._pages.set(i, new BitfieldPage(i, s));
return p;
}
set(index, val) {
const j = index & BITS_PER_PAGE - 1;
const i = (index - j) / BITS_PER_PAGE;
let p = this._pages.get(i);
if (!p && val) {
const k = Math.floor(i / PAGES_PER_SEGMENT);
const s = this._segments.get(k) || this._segments.set(
k,
new BitfieldSegment(
k,
new Uint32Array(k === 0 ? INITIAL_WORDS_PER_SEGMENT : WORDS_PER_SEGMENT)
)
);
p = this._pages.set(i, new BitfieldPage(i, s));
}
if (p) p.set(j, val);
}
setRange(start, end, val) {
let j = start & BITS_PER_PAGE - 1;
let i = (start - j) / BITS_PER_PAGE;
while (start < end) {
let p = this._pages.get(i);
if (!p && val) {
const k = Math.floor(i / PAGES_PER_SEGMENT);
const s = this._segments.get(k) || this._segments.set(
k,
new BitfieldSegment(
k,
new Uint32Array(k === 0 ? INITIAL_WORDS_PER_SEGMENT : WORDS_PER_SEGMENT)
)
);
p = this._pages.set(i, new BitfieldPage(i, s));
}
const offset = i * BITS_PER_PAGE;
const last = Math.min(end - offset, BITS_PER_PAGE);
const range = last - j;
if (p) p.setRange(j, last, val);
j = 0;
i++;
start += range;
}
}
findFirst(val, position) {
let j = position & BITS_PER_SEGMENT - 1;
let i = (position - j) / BITS_PER_SEGMENT;
while (i < this._segments.maxLength) {
const s = this._segments.get(i);
let index = -1;
if (s) index = s.findFirst(val, j);
else if (!val) index = j;
if (index !== -1) return i * BITS_PER_SEGMENT + index;
j = 0;
i++;
}
return val ? -1 : this._segments.maxLength * BITS_PER_SEGMENT;
}
firstSet(position) {
return this.findFirst(true, position);
}
firstUnset(position) {
return this.findFirst(false, position);
}
findLast(val, position) {
let j = position & BITS_PER_SEGMENT - 1;
let i = (position - j) / BITS_PER_SEGMENT;
while (i >= 0) {
const s = this._segments.get(i);
let index = -1;
if (s) index = s.findLast(val, j);
else if (!val) index = j;
if (index !== -1) return i * BITS_PER_SEGMENT + index;
j = BITS_PER_SEGMENT - 1;
i--;
}
return -1;
}
lastSet(position) {
return this.findLast(true, position);
}
lastUnset(position) {
return this.findLast(false, position);
}
hasUnset(start, length) {
const end = start + length;
let j = start & BITS_PER_SEGMENT - 1;
let i = (start - j) / BITS_PER_SEGMENT;
while (i < this._segments.maxLength) {
const s = this._segments.get(i);
const index = s ? s.findFirst(false, j) : j;
if (index !== -1) return i * BITS_PER_SEGMENT + index < end;
j = 0;
i++;
if (i * BITS_PER_SEGMENT >= end) return false;
}
return true;
}
hasSet(start, length) {
const end = start + length;
let j = start & BITS_PER_SEGMENT - 1;
let i = (start - j) / BITS_PER_SEGMENT;
while (i < this._segments.maxLength) {
const s = this._segments.get(i);
let index = -1;
if (s) index = s.findFirst(true, j);
if (index !== -1) return i * BITS_PER_SEGMENT + index < end;
j = 0;
i++;
if (i * BITS_PER_SEGMENT >= end) return false;
}
return false;
}
count(start, length, val) {
let j = start & BITS_PER_PAGE - 1;
let i = (start - j) / BITS_PER_PAGE;
let c4 = 0;
while (length > 0) {
const p = this._pages.get(i);
const end = Math.min(j + length, BITS_PER_PAGE);
const range = end - j;
if (p) c4 += p.count(j, range, val);
else if (!val) c4 += range;
j = 0;
i++;
length -= range;
}
return c4;
}
countSet(start, length) {
return this.count(start, length, true);
}
countUnset(start, length) {
return this.count(start, length, false);
}
*want(start, length) {
if (start & 31) {
const d = start & 31;
start -= d;
length += d;
}
let j = start & BITS_PER_SEGMENT - 1;
let i = (start - j) / BITS_PER_SEGMENT;
while (length > 0) {
const s = this._segments.get(i);
if (s) {
let end = Math.min(j + length, BITS_PER_SEGMENT);
if (end & 31) end += 32 - (end & 31);
yield {
start: i * BITS_PER_SEGMENT + j,
bitfield: s.bitfield.subarray(j / 32, end / 32)
};
}
j = 0;
i++;
length -= BITS_PER_SEGMENT;
}
}
clear(tx) {
return tx.deleteBitfieldPageRange(0, -1);
}
onupdate(ranges) {
for (const { start, end, value } of ranges) {
this.setRange(start, end, value);
}
}
static async open(storage, length) {
if (length === 0) return new Bitfield(storage, null);
const pages = Math.ceil(length / BITS_PER_PAGE);
const buffer = b4a4.alloc(pages * BYTES_PER_PAGE);
const stream = storage.createBitfieldStream({ lt: pages });
for await (const { index, page } of stream) {
buffer.set(page, index * BYTES_PER_PAGE);
}
return new Bitfield(buffer);
}
};
}
});
// node_modules/hypercore/lib/remote-bitfield.js
var require_remote_bitfield = __commonJS({
"node_modules/hypercore/lib/remote-bitfield.js"(exports2, module2) {
var BigSparseArray = require_big_sparse_array();
var quickbit = require_compat().quickbit;
var BITS_PER_PAGE = 32768;
var BYTES_PER_PAGE = BITS_PER_PAGE / 8;
var WORDS_PER_PAGE = BYTES_PER_PAGE / 4;
var BITS_PER_SEGMENT = 2097152;
var BYTES_PER_SEGMENT = BITS_PER_SEGMENT / 8;
var PAGES_PER_SEGMENT = BITS_PER_SEGMENT / BITS_PER_PAGE;
var RemoteBitfieldPage = class {
constructor(index, bitfield, segment) {
this.index = index;
this.offset = index * BYTES_PER_PAGE - segment.offset;
this.bitfield = bitfield;
this.segment = segment;
segment.add(this);
}
get tree() {
return this.segment.tree;
}
get(index) {
return quickbit.get(this.bitfield, index);
}
set(index, val) {
if (quickbit.set(this.bitfield, index, val)) {
this.tree.update(this.offset * 8 + index);
}
}
setRange(start, end, val) {
quickbit.fill(this.bitfield, val, start, end);
let i = Math.floor(start / 128);
const n = i + Math.ceil((end - start) / 128);
while (i <= n) this.tree.update(this.offset * 8 + i++ * 128);
}
findFirst(val, position) {
return quickbit.findFirst(this.bitfield, val, position);
}
findLast(val, position) {
return quickbit.findLast(this.bitfield, val, position);
}
insert(start, bitfield) {
this.bitfield.set(bitfield, start / 32);
this.segment.refresh();
}
clear(start, bitfield) {
quickbit.clear(this.bitfield, { field: bitfield, offset: start });
}
};
var RemoteBitfieldSegment = class {
constructor(index) {
this.index = index;
this.offset = index * BYTES_PER_SEGMENT;
this.tree = quickbit.Index.from([], BYTES_PER_SEGMENT);
this.pages = new Array(PAGES_PER_SEGMENT);
this.pagesLength = 0;
}
get chunks() {
return this.tree.chunks;
}
refresh() {
this.tree = quickbit.Index.from(this.tree.chunks, BYTES_PER_SEGMENT);
}
add(page) {
const pageIndex = page.index - this.index * PAGES_PER_SEGMENT;
if (pageIndex >= this.pagesLength) this.pagesLength = pageIndex + 1;
this.pages[pageIndex] = page;
const chunk = { field: page.bitfield, offset: page.offset };
this.chunks.push(chunk);
for (let i = this.chunks.length - 2; i >= 0; i--) {
const prev = this.chunks[i];
if (prev.offset <= chunk.offset) break;
this.chunks[i] = chunk;
this.chunks[i + 1] = prev;
}
}
findFirst(val, position) {
position = this.tree.skipFirst(!val, position);
let j = position & BITS_PER_PAGE - 1;
let i = (position - j) / BITS_PER_PAGE;
if (i >= PAGES_PER_SEGMENT) return -1;
while (i < this.pagesLength) {
const p = this.pages[i];
let index = -1;
if (p) index = p.findFirst(val, j);
else if (!val) index = j;
if (index !== -1) return i * BITS_PER_PAGE + index;
j = 0;
i++;
}
return val || this.pagesLength === PAGES_PER_SEGMENT ? -1 : this.pagesLength * BITS_PER_PAGE;
}
findLast(val, position) {
position = this.tree.skipLast(!val, position);
let j = position & BITS_PER_PAGE - 1;
let i = (position - j) / BITS_PER_PAGE;
if (i >= PAGES_PER_SEGMENT) return -1;
while (i >= 0) {
const p = this.pages[i];
let index = -1;
if (p) index = p.findLast(val, j);
else if (!val) index = j;
if (index !== -1) return i * BITS_PER_PAGE + index;
j = BITS_PER_PAGE - 1;
i--;
}
return -1;
}
};
module2.exports = class RemoteBitfield {
static BITS_PER_PAGE = BITS_PER_PAGE;
static BITS_PER_SEGMENT = BITS_PER_SEGMENT;
constructor() {
this._pages = new BigSparseArray();
this._segments = new BigSparseArray();
this._maxSegments = 0;
}
getBitfield(index) {
const j = index & BITS_PER_PAGE - 1;
const i = (index - j) / BITS_PER_PAGE;
const p = this._pages.get(i);
return p || null;
}
get(index) {
const j = index & BITS_PER_PAGE - 1;
const i = (index - j) / BITS_PER_PAGE;
const p = this._pages.get(i);
return p ? p.get(j) : false;
}
set(index, val) {
const j = index & BITS_PER_PAGE - 1;
const i = (index - j) / BITS_PER_PAGE;
let p = this._pages.get(i);
if (!p && val) {
const k = Math.floor(i / PAGES_PER_SEGMENT);
const s = this._segments.get(k) || this._segments.set(k, new RemoteBitfieldSegment(k));
if (this._maxSegments <= k) this._maxSegments = k + 1;
p = this._pages.set(i, new RemoteBitfieldPage(i, new Uint32Array(WORDS_PER_PAGE), s));
}
if (p) p.set(j, val);
}
setRange(start, end, val) {
let j = start & BITS_PER_PAGE - 1;
let i = (start - j) / BITS_PER_PAGE;
while (start < end) {
let p = this._pages.get(i);
if (!p && val) {
const k = Math.floor(i / PAGES_PER_SEGMENT);
const s = this._segments.get(k) || this._segments.set(k, new RemoteBitfieldSegment(k));
if (this._maxSegments <= k) this._maxSegments = k + 1;
p = this._pages.set(i, new RemoteBitfieldPage(i, new Uint32Array(WORDS_PER_PAGE), s));
}
const offset = i * BITS_PER_PAGE;
const last = Math.min(end - offset, BITS_PER_PAGE);
const range = last - j;
if (p) p.setRange(j, last, val);
j = 0;
i++;
start += range;
}
}
findFirst(val, position) {
let j = position & BITS_PER_SEGMENT - 1;
let i = (position - j) / BITS_PER_SEGMENT;
while (i < this._maxSegments) {
const s = this._segments.get(i);
let index = -1;
if (s) index = s.findFirst(val, j);
else if (!val) index = j;
if (index !== -1) return i * BITS_PER_SEGMENT + index;
j = 0;
i++;
}
return val ? -1 : Math.max(position, this._maxSegments * BITS_PER_SEGMENT);
}
firstSet(position) {
return this.findFirst(true, position);
}
firstUnset(position) {
return this.findFirst(false, position);
}
findLast(val, position) {
let j = position & BITS_PER_SEGMENT - 1;
let i = (position - j) / BITS_PER_SEGMENT;
while (i >= 0) {
const s = this._segments.get(i);
let index = -1;
if (s) index = s.findLast(val, j);
else if (!val) index = j;
if (index !== -1) return i * BITS_PER_SEGMENT + index;
j = BITS_PER_SEGMENT - 1;
i--;
}
return -1;
}
lastSet(position) {
return this.findLast(true, position);
}
lastUnset(position) {
return this.findLast(false, position);
}
insert(start, bitfield) {
if (start % 32 !== 0) return false;
let length = bitfield.byteLength * 8;
let j = start & BITS_PER_PAGE - 1;
let i = (start - j) / BITS_PER_PAGE;
while (length > 0) {
let p = this._pages.get(i);
if (!p) {
const k = Math.floor(i / PAGES_PER_SEGMENT);
const s = this._segments.get(k) || this._segments.set(k, new RemoteBitfieldSegment(k));
if (this._maxSegments <= k) this._maxSegments = k + 1;
p = this._pages.set(i, new RemoteBitfieldPage(i, new Uint32Array(WORDS_PER_PAGE), s));
}
const end = Math.min(j + length, BITS_PER_PAGE);
const range = end - j;
p.insert(j, bitfield.subarray(0, range / 32));
bitfield = bitfield.subarray(range / 32);
j = 0;
i++;
length -= range;
}
return true;
}
clear(start, bitfield) {
if (start % 32 !== 0) return false;
let length = bitfield.byteLength * 8;
let j = start & BITS_PER_PAGE - 1;
let i = (start - j) / BITS_PER_PAGE;
while (length > 0) {
let p = this._pages.get(i);
if (!p) {
const k = Math.floor(i / PAGES_PER_SEGMENT);
const s = this._segments.get(k) || this._segments.set(k, new RemoteBitfieldSegment(k));
if (this._maxSegments <= k) this._maxSegments = k + 1;
p = this._pages.set(i, new RemoteBitfieldPage(i, new Uint32Array(WORDS_PER_PAGE), s));
}
const end = Math.min(j + length, BITS_PER_PAGE);
const range = end - j;
p.clear(j, bitfield.subarray(0, range / 32));
bitfield = bitfield.subarray(range / 32);
j = 0;
i++;
length -= range;
}
return true;
}
};
}
});
// node_modules/hypercore/lib/messages.js
var require_messages2 = __commonJS({
"node_modules/hypercore/lib/messages.js"(exports2) {
var c4 = require_compact_encoding();
var b4a4 = require_b4a();
var { DEFAULT_NAMESPACE } = require_caps();
var { INVALID_OPLOG_VERSION } = require_hypercore_errors();
var unslab = require_unslab();
var EMPTY = b4a4.alloc(0);
var MANIFEST_PATCH = 1;
var MANIFEST_PROLOGUE = 2;
var MANIFEST_LINKED = 4;
var MANIFEST_USER_DATA = 8;
var hashes = {
preencode(state, m) {
state.end++;
},
encode(state, m) {
if (m === "blake2b") {
c4.uint.encode(state, 0);
return;
}
throw new Error("Unknown hash: " + m);
},
decode(state) {
const n = c4.uint.decode(state);
if (n === 0) return "blake2b";
throw new Error("Unknown hash id: " + n);
}
};
var signatures = {
preencode(state, m) {
state.end++;
},
encode(state, m) {
if (m === "ed25519") {
c4.uint.encode(state, 0);
return;
}
throw new Error("Unknown signature: " + m);
},
decode(state) {
const n = c4.uint.decode(state);
if (n === 0) return "ed25519";
throw new Error("Unknown signature id: " + n);
}
};
var signer = {
preencode(state, m) {
signatures.preencode(state, m.signature);
c4.fixed32.preencode(state, m.namespace);
c4.fixed32.preencode(state, m.publicKey);
},
encode(state, m) {
signatures.encode(state, m.signature);
c4.fixed32.encode(state, m.namespace);
c4.fixed32.encode(state, m.publicKey);
},
decode(state) {
return {
signature: signatures.decode(state),
namespace: c4.fixed32.decode(state),
publicKey: c4.fixed32.decode(state)
};
}
};
var signerArray = c4.array(signer);
var prologue = {
preencode(state, p) {
c4.fixed32.preencode(state, p.hash);
c4.uint.preencode(state, p.length);
},
encode(state, p) {
c4.fixed32.encode(state, p.hash);
c4.uint.encode(state, p.length);
},
decode(state) {
return {
hash: c4.fixed32.decode(state),
length: c4.uint.decode(state)
};
}
};
var manifestv0 = {
preencode(state, m) {
hashes.preencode(state, m.hash);
state.end++;
if (m.prologue && m.signers.length === 0) {
c4.fixed32.preencode(state, m.prologue.hash);
return;
}
if (m.quorum === 1 && m.signers.length === 1 && !m.allowPatch) {
signer.preencode(state, m.signers[0]);
} else {
state.end++;
c4.uint.preencode(state, m.quorum);
signerArray.preencode(state, m.signers);
}
},
encode(state, m) {
hashes.encode(state, m.hash);
if (m.prologue && m.signers.length === 0) {
c4.uint.encode(state, 0);
c4.fixed32.encode(state, m.prologue.hash);
return;
}
if (m.quorum === 1 && m.signers.length === 1 && !m.allowPatch) {
c4.uint.encode(state, 1);
signer.encode(state, m.signers[0]);
} else {
c4.uint.encode(state, 2);
c4.uint.encode(state, m.allowPatch ? 1 : 0);
c4.uint.encode(state, m.quorum);
signerArray.encode(state, m.signers);
}
},
decode(state) {
const hash = hashes.decode(state);
const type = c4.uint.decode(state);
if (type > 2) throw new Error("Unknown type: " + type);
if (type === 0) {
return {
version: 0,
hash,
allowPatch: false,
quorum: 0,
signers: [],
prologue: {
hash: c4.fixed32.decode(state),
length: 0
},
linked: null,
userData: null
};
}
if (type === 1) {
return {
version: 0,
hash,
allowPatch: false,
quorum: 1,
signers: [signer.decode(state)],
prologue: null,
linked: null,
userData: null
};
}
const flags = c4.uint.decode(state);
return {
version: 0,
hash,
allowPatch: (flags & 1) !== 0,
quorum: c4.uint.decode(state),
signers: signerArray.decode(state),
prologue: null,
linked: null,
userData: null
};
}
};
var fixed32Array = c4.array(c4.fixed32);
var manifest = exports2.manifest = {
preencode(state, m) {
state.end++;
if (m.version === 0) return manifestv0.preencode(state, m);
state.end++;
hashes.preencode(state, m.hash);
c4.uint.preencode(state, m.quorum);
signerArray.preencode(state, m.signers);
if (m.prologue) prologue.preencode(state, m.prologue);
if (m.linked) fixed32Array.preencode(state, m.linked);
if (m.userData) c4.buffer.preencode(state, m.userData);
},
encode(state, m) {
c4.uint.encode(state, m.version);
if (m.version === 0) return manifestv0.encode(state, m);
let flags = 0;
if (m.allowPatch) flags |= MANIFEST_PATCH;
if (m.prologue) flags |= MANIFEST_PROLOGUE;
if (m.linked) flags |= MANIFEST_LINKED;
if (m.userData) flags |= MANIFEST_USER_DATA;
c4.uint.encode(state, flags);
hashes.encode(state, m.hash);
c4.uint.encode(state, m.quorum);
signerArray.encode(state, m.signers);
if (m.prologue) prologue.encode(state, m.prologue);
if (m.linked) fixed32Array.encode(state, m.linked);
if (m.userData) c4.buffer.encode(state, m.userData);
},
decode(state) {
const version3 = c4.uint.decode(state);
if (version3 === 0) return manifestv0.decode(state);
if (version3 > 2) throw new Error("Unknown version: " + version3);
const flags = c4.uint.decode(state);
const hash = hashes.decode(state);
const quorum = c4.uint.decode(state);
const signers = signerArray.decode(state);
const hasPatch = (flags & MANIFEST_PATCH) !== 0;
const hasPrologue = (flags & MANIFEST_PROLOGUE) !== 0;
const hasLinked = (flags & MANIFEST_LINKED) !== 0;
const hasUserData = (flags & MANIFEST_USER_DATA) !== 0;
return {
version: version3,
hash,
allowPatch: hasPatch,
quorum,
signers,
prologue: hasPrologue ? prologue.decode(state) : null,
linked: hasLinked ? fixed32Array.decode(state) : null,
userData: hasUserData ? c4.buffer.decode(state) : null
};
}
};
var node = {
preencode(state, n) {
c4.uint.preencode(state, n.index);
c4.uint.preencode(state, n.size);
c4.fixed32.preencode(state, n.hash);
},
encode(state, n) {
c4.uint.encode(state, n.index);
c4.uint.encode(state, n.size);
c4.fixed32.encode(state, n.hash);
},
decode(state) {
return {
index: c4.uint.decode(state),
size: c4.uint.decode(state),
hash: c4.fixed32.decode(state)
};
}
};
var nodeArray = c4.array(node);
var wire = exports2.wire = {};
wire.handshake = {
preencode(state, m) {
c4.uint.preencode(state, 1);
c4.fixed32.preencode(state, m.capability);
},
encode(state, m) {
c4.uint.encode(state, m.seeks ? 1 : 0);
c4.fixed32.encode(state, m.capability);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
seeks: (flags & 1) !== 0,
capability: unslab(c4.fixed32.decode(state))
};
}
};
var requestBlock = {
preencode(state, b) {
c4.uint.preencode(state, b.index);
c4.uint.preencode(state, b.nodes);
},
encode(state, b) {
c4.uint.encode(state, b.index);
c4.uint.encode(state, b.nodes);
},
decode(state) {
return {
index: c4.uint.decode(state),
nodes: c4.uint.decode(state)
};
}
};
var requestSeek = {
preencode(state, s) {
c4.uint.preencode(state, s.bytes);
c4.uint.preencode(state, s.padding);
},
encode(state, s) {
c4.uint.encode(state, s.bytes);
c4.uint.encode(state, s.padding);
},
decode(state) {
return {
bytes: c4.uint.decode(state),
padding: c4.uint.decode(state)
};
}
};
var requestUpgrade = {
preencode(state, u) {
c4.uint.preencode(state, u.start);
c4.uint.preencode(state, u.length);
},
encode(state, u) {
c4.uint.encode(state, u.start);
c4.uint.encode(state, u.length);
},
decode(state) {
return {
start: c4.uint.decode(state),
length: c4.uint.decode(state)
};
}
};
wire.request = {
preencode(state, m) {
state.end++;
c4.uint.preencode(state, m.id);
c4.uint.preencode(state, m.fork);
if (m.block) requestBlock.preencode(state, m.block);
if (m.hash) requestBlock.preencode(state, m.hash);
if (m.seek) requestSeek.preencode(state, m.seek);
if (m.upgrade) requestUpgrade.preencode(state, m.upgrade);
if (m.priority) c4.uint.preencode(state, m.priority);
},
encode(state, m) {
const flags = (m.block ? 1 : 0) | (m.hash ? 2 : 0) | (m.seek ? 4 : 0) | (m.upgrade ? 8 : 0) | (m.manifest ? 16 : 0) | (m.priority ? 32 : 0);
c4.uint.encode(state, flags);
c4.uint.encode(state, m.id);
c4.uint.encode(state, m.fork);
if (m.block) requestBlock.encode(state, m.block);
if (m.hash) requestBlock.encode(state, m.hash);
if (m.seek) requestSeek.encode(state, m.seek);
if (m.upgrade) requestUpgrade.encode(state, m.upgrade);
if (m.priority) c4.uint.encode(state, m.priority);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
id: c4.uint.decode(state),
fork: c4.uint.decode(state),
block: flags & 1 ? requestBlock.decode(state) : null,
hash: flags & 2 ? requestBlock.decode(state) : null,
seek: flags & 4 ? requestSeek.decode(state) : null,
upgrade: flags & 8 ? requestUpgrade.decode(state) : null,
manifest: (flags & 16) !== 0,
priority: flags & 32 ? c4.uint.decode(state) : 0
};
}
};
wire.cancel = {
preencode(state, m) {
c4.uint.preencode(state, m.request);
},
encode(state, m) {
c4.uint.encode(state, m.request);
},
decode(state, m) {
return {
request: c4.uint.decode(state)
};
}
};
var dataUpgrade = {
preencode(state, u) {
c4.uint.preencode(state, u.start);
c4.uint.preencode(state, u.length);
nodeArray.preencode(state, u.nodes);
nodeArray.preencode(state, u.additionalNodes);
c4.buffer.preencode(state, u.signature);
},
encode(state, u) {
c4.uint.encode(state, u.start);
c4.uint.encode(state, u.length);
nodeArray.encode(state, u.nodes);
nodeArray.encode(state, u.additionalNodes);
c4.buffer.encode(state, u.signature);
},
decode(state) {
return {
start: c4.uint.decode(state),
length: c4.uint.decode(state),
nodes: nodeArray.decode(state),
additionalNodes: nodeArray.decode(state),
signature: c4.buffer.decode(state)
};
}
};
var dataSeek = {
preencode(state, s) {
c4.uint.preencode(state, s.bytes);
nodeArray.preencode(state, s.nodes);
},
encode(state, s) {
c4.uint.encode(state, s.bytes);
nodeArray.encode(state, s.nodes);
},
decode(state) {
return {
bytes: c4.uint.decode(state),
nodes: nodeArray.decode(state)
};
}
};
var dataBlock = {
preencode(state, b) {
c4.uint.preencode(state, b.index);
c4.buffer.preencode(state, b.value);
nodeArray.preencode(state, b.nodes);
},
encode(state, b) {
c4.uint.encode(state, b.index);
c4.buffer.encode(state, b.value);
nodeArray.encode(state, b.nodes);
},
decode(state) {
return {
index: c4.uint.decode(state),
value: c4.buffer.decode(state) || EMPTY,
nodes: nodeArray.decode(state)
};
}
};
var dataHash = {
preencode(state, b) {
c4.uint.preencode(state, b.index);
nodeArray.preencode(state, b.nodes);
},
encode(state, b) {
c4.uint.encode(state, b.index);
nodeArray.encode(state, b.nodes);
},
decode(state) {
return {
index: c4.uint.decode(state),
nodes: nodeArray.decode(state)
};
}
};
wire.data = {
preencode(state, m) {
state.end++;
c4.uint.preencode(state, m.request);
c4.uint.preencode(state, m.fork);
if (m.block) dataBlock.preencode(state, m.block);
if (m.hash) dataHash.preencode(state, m.hash);
if (m.seek) dataSeek.preencode(state, m.seek);
if (m.upgrade) dataUpgrade.preencode(state, m.upgrade);
if (m.manifest) manifest.preencode(state, m.manifest);
},
encode(state, m) {
const flags = (m.block ? 1 : 0) | (m.hash ? 2 : 0) | (m.seek ? 4 : 0) | (m.upgrade ? 8 : 0) | (m.manifest ? 16 : 0);
c4.uint.encode(state, flags);
c4.uint.encode(state, m.request);
c4.uint.encode(state, m.fork);
if (m.block) dataBlock.encode(state, m.block);
if (m.hash) dataHash.encode(state, m.hash);
if (m.seek) dataSeek.encode(state, m.seek);
if (m.upgrade) dataUpgrade.encode(state, m.upgrade);
if (m.manifest) manifest.encode(state, m.manifest);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
request: c4.uint.decode(state),
fork: c4.uint.decode(state),
block: flags & 1 ? dataBlock.decode(state) : null,
hash: flags & 2 ? dataHash.decode(state) : null,
seek: flags & 4 ? dataSeek.decode(state) : null,
upgrade: flags & 8 ? dataUpgrade.decode(state) : null,
manifest: flags & 16 ? manifest.decode(state) : null
};
}
};
wire.noData = {
preencode(state, m) {
c4.uint.preencode(state, m.request);
c4.uint.preencode(state, m.reason ? 1 : 0);
if (m.reason) c4.uint.preencode(state, m.reason);
},
encode(state, m) {
c4.uint.encode(state, m.request);
c4.uint.encode(state, m.reason ? 1 : 0);
if (m.reason) c4.uint.encode(state, m.reason);
},
decode(state, m) {
const request = c4.uint.decode(state);
const flags = state.start < state.end ? c4.uint.decode(state) : 0;
return {
request,
reason: flags & 1 ? c4.uint.decode(state) : 0
};
}
};
wire.want = {
preencode(state, m) {
c4.uint.preencode(state, m.start);
c4.uint.preencode(state, m.length);
const flags = m.any ? 1 : 0;
if (flags !== 0) c4.uint.preencode(state, flags);
},
encode(state, m) {
c4.uint.encode(state, m.start);
c4.uint.encode(state, m.length);
const flags = m.any ? 1 : 0;
if (flags !== 0) c4.uint.encode(state, flags);
},
decode(state) {
const start = c4.uint.decode(state);
const length = c4.uint.decode(state);
const flags = state.start < state.end ? c4.uint.decode(state) : 0;
return {
start,
length,
any: (flags & 1) !== 0
};
}
};
wire.unwant = {
preencode(state, m) {
c4.uint.preencode(state, m.start);
c4.uint.preencode(state, m.length);
const flags = m.any ? 1 : 0;
if (flags !== 0) c4.uint.preencode(state, flags);
},
encode(state, m) {
c4.uint.encode(state, m.start);
c4.uint.encode(state, m.length);
const flags = m.any ? 1 : 0;
if (flags !== 0) c4.uint.encode(state, flags);
},
decode(state, m) {
const start = c4.uint.decode(state);
const length = c4.uint.decode(state);
const flags = state.start < state.end ? c4.uint.decode(state) : 0;
return {
start,
length,
any: (flags & 1) !== 0
};
}
};
wire.range = {
preencode(state, m) {
state.end++;
c4.uint.preencode(state, m.start);
if (m.length !== 1) c4.uint.preencode(state, m.length);
},
encode(state, m) {
c4.uint.encode(state, (m.drop ? 1 : 0) | (m.length === 1 ? 2 : 0));
c4.uint.encode(state, m.start);
if (m.length !== 1) c4.uint.encode(state, m.length);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
drop: (flags & 1) !== 0,
start: c4.uint.decode(state),
length: (flags & 2) !== 0 ? 1 : c4.uint.decode(state)
};
}
};
wire.bitfield = {
preencode(state, m) {
c4.uint.preencode(state, m.start);
c4.uint32array.preencode(state, m.bitfield);
},
encode(state, m) {
c4.uint.encode(state, m.start);
c4.uint32array.encode(state, m.bitfield);
},
decode(state, m) {
return {
start: c4.uint.decode(state),
bitfield: c4.uint32array.decode(state)
};
}
};
wire.sync = {
preencode(state, m) {
state.end++;
c4.uint.preencode(state, m.fork);
c4.uint.preencode(state, m.length);
c4.uint.preencode(state, m.remoteLength);
},
encode(state, m) {
c4.uint.encode(
state,
(m.canUpgrade ? 1 : 0) | (m.uploading ? 2 : 0) | (m.downloading ? 4 : 0) | (m.hasManifest ? 8 : 0) | (m.allowPush ? 16 : 0)
);
c4.uint.encode(state, m.fork);
c4.uint.encode(state, m.length);
c4.uint.encode(state, m.remoteLength);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
fork: c4.uint.decode(state),
length: c4.uint.decode(state),
remoteLength: c4.uint.decode(state),
canUpgrade: (flags & 1) !== 0,
uploading: (flags & 2) !== 0,
downloading: (flags & 4) !== 0,
hasManifest: (flags & 8) !== 0,
allowPush: (flags & 16) !== 0
};
}
};
wire.reorgHint = {
preencode(state, m) {
c4.uint.preencode(state, m.from);
c4.uint.preencode(state, m.to);
c4.uint.preencode(state, m.ancestors);
},
encode(state, m) {
c4.uint.encode(state, m.from);
c4.uint.encode(state, m.to);
c4.uint.encode(state, m.ancestors);
},
decode(state) {
return {
from: c4.uint.encode(state),
to: c4.uint.encode(state),
ancestors: c4.uint.encode(state)
};
}
};
wire.extension = {
preencode(state, m) {
c4.string.preencode(state, m.name);
c4.raw.preencode(state, m.message);
},
encode(state, m) {
c4.string.encode(state, m.name);
c4.raw.encode(state, m.message);
},
decode(state) {
return {
name: c4.string.decode(state),
message: c4.raw.decode(state)
};
}
};
var keyValue = {
preencode(state, p) {
c4.string.preencode(state, p.key);
c4.buffer.preencode(state, p.value);
},
encode(state, p) {
c4.string.encode(state, p.key);
c4.buffer.encode(state, p.value);
},
decode(state) {
return {
key: c4.string.decode(state),
value: c4.buffer.decode(state)
};
}
};
var treeUpgrade = {
preencode(state, u) {
c4.uint.preencode(state, u.fork);
c4.uint.preencode(state, u.ancestors);
c4.uint.preencode(state, u.length);
c4.buffer.preencode(state, u.signature);
},
encode(state, u) {
c4.uint.encode(state, u.fork);
c4.uint.encode(state, u.ancestors);
c4.uint.encode(state, u.length);
c4.buffer.encode(state, u.signature);
},
decode(state) {
return {
fork: c4.uint.decode(state),
ancestors: c4.uint.decode(state),
length: c4.uint.decode(state),
signature: c4.buffer.decode(state)
};
}
};
var bitfieldUpdate = {
// TODO: can maybe be folded into a HAVE later on with the most recent spec
preencode(state, b) {
state.end++;
c4.uint.preencode(state, b.start);
c4.uint.preencode(state, b.length);
},
encode(state, b) {
state.buffer[state.start++] = b.drop ? 1 : 0;
c4.uint.encode(state, b.start);
c4.uint.encode(state, b.length);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
drop: (flags & 1) !== 0,
start: c4.uint.decode(state),
length: c4.uint.decode(state)
};
}
};
var oplog = exports2.oplog = {};
oplog.entry = {
preencode(state, m) {
state.end++;
if (m.userData) keyValue.preencode(state, m.userData);
if (m.treeNodes) nodeArray.preencode(state, m.treeNodes);
if (m.treeUpgrade) treeUpgrade.preencode(state, m.treeUpgrade);
if (m.bitfield) bitfieldUpdate.preencode(state, m.bitfield);
},
encode(state, m) {
const s = state.start++;
let flags = 0;
if (m.userData) {
flags |= 1;
keyValue.encode(state, m.userData);
}
if (m.treeNodes) {
flags |= 2;
nodeArray.encode(state, m.treeNodes);
}
if (m.treeUpgrade) {
flags |= 4;
treeUpgrade.encode(state, m.treeUpgrade);
}
if (m.bitfield) {
flags |= 8;
bitfieldUpdate.encode(state, m.bitfield);
}
state.buffer[s] = flags;
},
decode(state) {
const flags = c4.uint.decode(state);
return {
userData: (flags & 1) !== 0 ? keyValue.decode(state) : null,
treeNodes: (flags & 2) !== 0 ? nodeArray.decode(state) : null,
treeUpgrade: (flags & 4) !== 0 ? treeUpgrade.decode(state) : null,
bitfield: (flags & 8) !== 0 ? bitfieldUpdate.decode(state) : null
};
}
};
var keyPair = {
preencode(state, kp) {
c4.buffer.preencode(state, kp.publicKey);
c4.buffer.preencode(state, kp.secretKey);
},
encode(state, kp) {
c4.buffer.encode(state, kp.publicKey);
c4.buffer.encode(state, kp.secretKey);
},
decode(state) {
return {
publicKey: c4.buffer.decode(state),
secretKey: c4.buffer.decode(state)
};
}
};
var reorgHint = {
preencode(state, r) {
c4.uint.preencode(state, r.from);
c4.uint.preencode(state, r.to);
c4.uint.preencode(state, r.ancestors);
},
encode(state, r) {
c4.uint.encode(state, r.from);
c4.uint.encode(state, r.to);
c4.uint.encode(state, r.ancestors);
},
decode(state) {
return {
from: c4.uint.decode(state),
to: c4.uint.decode(state),
ancestors: c4.uint.decode(state)
};
}
};
var reorgHintArray = c4.array(reorgHint);
var hints = {
preencode(state, h) {
reorgHintArray.preencode(state, h.reorgs);
c4.uint.preencode(state, h.contiguousLength);
},
encode(state, h) {
reorgHintArray.encode(state, h.reorgs);
c4.uint.encode(state, h.contiguousLength);
},
decode(state) {
return {
reorgs: reorgHintArray.decode(state),
contiguousLength: state.start < state.end ? c4.uint.decode(state) : 0
};
}
};
var treeHeader = {
preencode(state, t) {
c4.uint.preencode(state, t.fork);
c4.uint.preencode(state, t.length);
c4.buffer.preencode(state, t.rootHash);
c4.buffer.preencode(state, t.signature);
},
encode(state, t) {
c4.uint.encode(state, t.fork);
c4.uint.encode(state, t.length);
c4.buffer.encode(state, t.rootHash);
c4.buffer.encode(state, t.signature);
},
decode(state) {
return {
fork: c4.uint.decode(state),
length: c4.uint.decode(state),
rootHash: c4.buffer.decode(state),
signature: c4.buffer.decode(state)
};
}
};
var types = {
preencode(state, t) {
c4.string.preencode(state, t.tree);
c4.string.preencode(state, t.bitfield);
c4.string.preencode(state, t.signer);
},
encode(state, t) {
c4.string.encode(state, t.tree);
c4.string.encode(state, t.bitfield);
c4.string.encode(state, t.signer);
},
decode(state) {
return {
tree: c4.string.decode(state),
bitfield: c4.string.decode(state),
signer: c4.string.decode(state)
};
}
};
var externalHeader = {
preencode(state, m) {
c4.uint.preencode(state, m.start);
c4.uint.preencode(state, m.length);
},
encode(state, m) {
c4.uint.encode(state, m.start);
c4.uint.encode(state, m.length);
},
decode(state) {
return {
start: c4.uint.decode(state),
length: c4.uint.decode(state)
};
}
};
var keyValueArray = c4.array(keyValue);
oplog.header = {
preencode(state, h) {
state.end += 2;
if (h.external) {
externalHeader.preencode(state, h.external);
return;
}
c4.fixed32.preencode(state, h.key);
if (h.manifest) manifest.preencode(state, h.manifest);
if (h.keyPair) keyPair.preencode(state, h.keyPair);
keyValueArray.preencode(state, h.userData);
treeHeader.preencode(state, h.tree);
hints.preencode(state, h.hints);
},
encode(state, h) {
c4.uint.encode(state, 1);
if (h.external) {
c4.uint.encode(state, 1);
externalHeader.encode(state, h.external);
return;
}
c4.uint.encode(state, (h.manifest ? 2 : 0) | (h.keyPair ? 4 : 0));
c4.fixed32.encode(state, h.key);
if (h.manifest) manifest.encode(state, h.manifest);
if (h.keyPair) keyPair.encode(state, h.keyPair);
keyValueArray.encode(state, h.userData);
treeHeader.encode(state, h.tree);
hints.encode(state, h.hints);
},
decode(state) {
const version3 = c4.uint.decode(state);
if (version3 > 1) {
throw INVALID_OPLOG_VERSION("Invalid header version. Expected <= 1, got " + version3);
}
if (version3 === 0) {
const old = {
types: types.decode(state),
userData: keyValueArray.decode(state),
tree: treeHeader.decode(state),
signer: keyPair.decode(state),
hints: hints.decode(state)
};
return {
external: null,
key: old.signer.publicKey,
manifest: {
version: 0,
hash: old.types.tree,
allowPatch: false,
quorum: 1,
signers: [
{
signature: old.types.signer,
namespace: DEFAULT_NAMESPACE,
publicKey: old.signer.publicKey
}
],
prologue: null,
linked: null,
userData: null
},
keyPair: old.signer.secretKey ? old.signer : null,
userData: old.userData,
tree: old.tree,
hints: old.hints
};
}
const flags = c4.uint.decode(state);
if (flags & 1) {
return {
external: externalHeader.decode(state),
key: null,
manifest: null,
keyPair: null,
userData: null,
tree: null,
hints: null
};
}
return {
external: null,
key: c4.fixed32.decode(state),
manifest: (flags & 2) !== 0 ? manifest.decode(state) : null,
keyPair: (flags & 4) !== 0 ? keyPair.decode(state) : null,
userData: keyValueArray.decode(state),
tree: treeHeader.decode(state),
hints: hints.decode(state)
};
}
};
var uintArray = c4.array(c4.uint);
var multisigInput = {
preencode(state, inp) {
c4.uint.preencode(state, inp.signer);
c4.fixed64.preencode(state, inp.signature);
c4.uint.preencode(state, inp.patch);
},
encode(state, inp) {
c4.uint.encode(state, inp.signer);
c4.fixed64.encode(state, inp.signature);
c4.uint.encode(state, inp.patch);
},
decode(state) {
return {
signer: c4.uint.decode(state),
signature: c4.fixed64.decode(state),
patch: c4.uint.decode(state)
};
}
};
var patchEncodingv0 = {
preencode(state, n) {
c4.uint.preencode(state, n.start);
c4.uint.preencode(state, n.length);
uintArray.preencode(state, n.nodes);
},
encode(state, n) {
c4.uint.encode(state, n.start);
c4.uint.encode(state, n.length);
uintArray.encode(state, n.nodes);
},
decode(state) {
return {
start: c4.uint.decode(state),
length: c4.uint.decode(state),
nodes: uintArray.decode(state)
};
}
};
var multisigInputv0 = {
preencode(state, n) {
state.end++;
c4.uint.preencode(state, n.signer);
c4.fixed64.preencode(state, n.signature);
if (n.patch) patchEncodingv0.preencode(state, n.patch);
},
encode(state, n) {
c4.uint.encode(state, n.patch ? 1 : 0);
c4.uint.encode(state, n.signer);
c4.fixed64.encode(state, n.signature);
if (n.patch) patchEncodingv0.encode(state, n.patch);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
signer: c4.uint.decode(state),
signature: c4.fixed64.decode(state),
patch: flags & 1 ? patchEncodingv0.decode(state) : null
};
}
};
var multisigInputArrayv0 = c4.array(multisigInputv0);
var multisigInputArray = c4.array(multisigInput);
var compactNode = {
preencode(state, n) {
c4.uint.preencode(state, n.index);
c4.uint.preencode(state, n.size);
c4.fixed32.preencode(state, n.hash);
},
encode(state, n) {
c4.uint.encode(state, n.index);
c4.uint.encode(state, n.size);
c4.fixed32.encode(state, n.hash);
},
decode(state) {
return {
index: c4.uint.decode(state),
size: c4.uint.decode(state),
hash: c4.fixed32.decode(state)
};
}
};
var compactNodeArray = c4.array(compactNode);
exports2.multiSignaturev0 = {
preencode(state, s) {
multisigInputArrayv0.preencode(state, s.proofs);
compactNodeArray.preencode(state, s.patch);
},
encode(state, s) {
multisigInputArrayv0.encode(state, s.proofs);
compactNodeArray.encode(state, s.patch);
},
decode(state) {
return {
proofs: multisigInputArrayv0.decode(state),
patch: compactNodeArray.decode(state)
};
}
};
exports2.multiSignature = {
preencode(state, s) {
multisigInputArray.preencode(state, s.proofs);
compactNodeArray.preencode(state, s.patch);
},
encode(state, s) {
multisigInputArray.encode(state, s.proofs);
compactNodeArray.encode(state, s.patch);
},
decode(state) {
return {
proofs: multisigInputArray.decode(state),
patch: compactNodeArray.decode(state)
};
}
};
}
});
// node_modules/hypercore/lib/multisig.js
var require_multisig = __commonJS({
"node_modules/hypercore/lib/multisig.js"(exports2, module2) {
var c4 = require_compact_encoding();
var b4a4 = require_b4a();
var flat = require_flat_tree();
var { MerkleTree } = require_merkle_tree();
var { multiSignature, multiSignaturev0 } = require_messages2();
module2.exports = {
assemblev0,
assemble,
inflatev0,
inflate,
partialSignature,
signableLength
};
function inflatev0(data) {
return c4.decode(multiSignaturev0, data);
}
function inflate(data) {
return c4.decode(multiSignature, data);
}
async function partialSignature(core, signer, from, to = core.state.length, signature = core.state.signature) {
if (from > core.state.length) return null;
const nodes = to <= from ? null : await upgradeNodes(core, from, to);
if (signature.byteLength !== 64) {
signature = c4.decode(multiSignature, signature).proofs[0].signature;
}
return {
signer,
signature,
patch: nodes ? to - from : 0,
nodes
};
}
async function upgradeNodes(core, from, to) {
const rx = core.state.storage.read();
let p = null;
try {
p = await MerkleTree.proof(core.state, rx, { upgrade: { start: from, length: to - from } });
} catch (err) {
rx.destroy();
throw err;
}
rx.tryFlush();
return (await p.settle()).upgrade.nodes;
}
function signableLength(lengths, quorum) {
if (quorum <= 0) quorum = 1;
if (quorum > lengths.length) return 0;
return lengths.sort(cmp)[quorum - 1];
}
function cmp(a, b) {
return b - a;
}
function assemblev0(inputs) {
const proofs = [];
const patch = [];
for (const u of inputs) {
proofs.push(compressProof(u, patch));
}
return c4.encode(multiSignaturev0, { proofs, patch });
}
function assemble(inputs) {
const proofs = [];
const patch = [];
const seen = /* @__PURE__ */ new Set();
for (const u of inputs) {
if (u.nodes) {
for (const node of u.nodes) {
if (seen.has(node.index)) continue;
seen.add(node.index);
patch.push(node);
}
}
proofs.push({
signer: u.signer,
signature: u.signature,
patch: u.patch
});
}
return c4.encode(multiSignature, { proofs, patch });
}
function compareNode(a, b) {
if (a.index !== b.index) return false;
if (a.size !== b.size) return false;
return b4a4.equals(a.hash, b.hash);
}
function compressProof(proof, nodes) {
return {
signer: proof.signer,
signature: proof.signature,
patch: proof.patch ? compressUpgrade(proof, nodes) : null
};
}
function compressUpgrade(p, nodes) {
const u = {
start: flat.rightSpan(p.nodes[p.nodes.length - 1].index) / 2 + 1,
length: p.patch,
nodes: []
};
for (const node of p.nodes) {
let present = false;
for (let i = 0; i < nodes.length; i++) {
if (!compareNode(nodes[i], node)) continue;
u.nodes.push(i);
present = true;
break;
}
if (present) continue;
u.nodes.push(nodes.push(node) - 1);
}
return u;
}
}
});
// node_modules/hypercore/lib/verifier.js
var require_verifier = __commonJS({
"node_modules/hypercore/lib/verifier.js"(exports2, module2) {
var crypto = require_hypercore_crypto();
var b4a4 = require_b4a();
var c4 = require_compact_encoding();
var flat = require_flat_tree();
var { BAD_ARGUMENT } = require_hypercore_errors();
var unslab = require_unslab();
var m = require_messages2();
var multisig = require_multisig();
var caps = require_caps();
var Signer = class {
constructor(manifestHash2, version3, index, { signature = "ed25519", publicKey, namespace = caps.DEFAULT_NAMESPACE } = {}) {
if (!publicKey) throw BAD_ARGUMENT("public key is required for a signer");
if (signature !== "ed25519") throw BAD_ARGUMENT("Only Ed25519 signatures are supported");
this.manifestHash = manifestHash2;
this.version = version3;
this.signer = index;
this.signature = signature;
this.publicKey = publicKey;
this.namespace = namespace;
}
_ctx() {
return this.version === 0 ? this.namespace : this.manifestHash;
}
verify(batch, signature) {
return crypto.verify(batch.signable(this._ctx()), signature, this.publicKey);
}
sign(batch, keyPair) {
return crypto.sign(batch.signable(this._ctx()), keyPair.secretKey);
}
};
var CompatSigner = class extends Signer {
constructor(index, signer, legacy) {
super(null, 0, index, signer);
this.legacy = legacy;
}
verify(batch, signature) {
return crypto.verify(batch.signableCompat(this.legacy), signature, this.publicKey);
}
sign(batch, keyPair) {
return crypto.sign(batch.signableCompat(this.legacy), keyPair.secretKey);
}
};
module2.exports = class Verifier {
constructor(manifestHash2, manifest, { compat = isCompat(manifestHash2, manifest), legacy = false } = {}) {
const self = this;
this.manifestHash = manifestHash2;
this.compat = compat || manifest === null;
this.version = this.compat ? 0 : typeof manifest.version === "number" ? manifest.version : 1;
this.hash = manifest.hash || "blake2b";
this.allowPatch = !this.compat && !!manifest.allowPatch;
this.quorum = this.compat ? 1 : defaultQuorum(manifest);
this.signers = manifest.signers ? manifest.signers.map(createSigner) : [];
this.prologue = this.compat ? null : manifest.prologue || null;
function createSigner(signer, index) {
return self.compat ? new CompatSigner(index, signer, legacy) : new Signer(manifestHash2, self.version, index, signer);
}
}
_verifyCompat(batch, signature) {
if (!signature) return false;
if (this.compat || !this.allowPatch && this.signers.length === 1) {
return !!signature && this.signers[0].verify(batch, signature);
}
return this._verifyMulti(batch, signature);
}
_inflate(signature) {
if (this.version >= 1) return multisig.inflate(signature);
const { proofs, patch } = multisig.inflatev0(signature);
return {
proofs: proofs.map(proofToVersion1),
patch
};
}
_verifyMulti(batch, signature) {
if (!signature || this.quorum === 0) return false;
const { proofs, patch } = this._inflate(signature);
if (proofs.length < this.quorum) return false;
const tried = new Uint8Array(this.signers.length);
const nodes = this.allowPatch && patch.length ? toMap(patch) : null;
for (let i = 0; i < this.quorum; i++) {
const inp = proofs[i];
let tree = batch;
if (inp.patch && this.allowPatch) {
tree = batch.clone();
const upgrade = generateUpgrade(nodes, batch.length, inp.patch);
const proof = {
fork: tree.fork,
block: null,
hash: null,
seek: null,
upgrade,
manifest: null
};
try {
if (!tree.verifyUpgrade(proof)) return false;
} catch {
return false;
}
}
if (inp.signer >= this.signers.length || tried[inp.signer]) return false;
tried[inp.signer] = 1;
const s = this.signers[inp.signer];
if (!s.verify(tree, inp.signature)) return false;
}
return true;
}
verify(batch, signature) {
if (this.version === 0) {
return this._verifyCompat(batch, signature);
}
if (this.prologue !== null && batch.length <= this.prologue.length) {
return batch.length === this.prologue.length && b4a4.equals(batch.hash(), this.prologue.hash);
}
return this._verifyMulti(batch, signature);
}
// TODO: better api for this that is more ... multisig-ey
sign(batch, keyPair) {
if (!keyPair || !keyPair.secretKey) throw BAD_ARGUMENT("No key pair was passed");
for (const s of this.signers) {
if (b4a4.equals(s.publicKey, keyPair.publicKey)) {
const signature = s.sign(batch, keyPair);
if (this.signers.length !== 1 || this.version === 0) return signature;
return this.assemble([{ signer: 0, signature, patch: 0, nodes: null }]);
}
}
throw BAD_ARGUMENT("Public key is not a declared signer");
}
assemble(inputs) {
return this.version === 0 ? multisig.assemblev0(inputs) : multisig.assemble(inputs);
}
static manifestHash(manifest) {
return manifestHash(manifest);
}
static encodeManifest(manifest) {
return c4.encode(m.manifest, manifest);
}
static decodeManifest(manifest) {
return c4.decode(m.manifest, manifest);
}
static defaultSignerManifest(publicKey) {
return {
version: 1,
hash: "blake2b",
allowPatch: false,
quorum: 1,
signers: [
{
signature: "ed25519",
namespace: caps.DEFAULT_NAMESPACE,
publicKey
}
],
prologue: null,
linked: null,
userData: null
};
}
static fromManifest(manifest, opts) {
const m2 = this.createManifest(manifest);
return new this(manifestHash(m2), m2, opts);
}
static createManifest(inp) {
if (!inp) return null;
const manifest = {
version: getManifestVersion(inp),
// defaults to v1
hash: "blake2b",
allowPatch: !!inp.allowPatch,
quorum: defaultQuorum(inp),
signers: inp.signers ? inp.signers.map(parseSigner) : [],
prologue: null,
linked: null,
userData: inp.userData || null
};
if (inp.hash && inp.hash !== "blake2b") throw BAD_ARGUMENT("Only Blake2b hashes are supported");
if (inp.prologue) {
if (!(b4a4.isBuffer(inp.prologue.hash) && inp.prologue.hash.byteLength === 32) || !(inp.prologue.length >= 0)) {
throw BAD_ARGUMENT("Invalid prologue");
}
manifest.prologue = inp.prologue;
manifest.prologue.hash = unslab(manifest.prologue.hash);
}
if (manifest.userData !== null && manifest.version < 2) {
throw BAD_ARGUMENT("Invalid field: userData");
}
if (inp.linked && inp.linked.length) {
if (manifest.version < 2) throw BAD_ARGUMENT("Invalid field: linked");
for (const key of inp.linked) {
if (!(b4a4.isBuffer(key) && key.byteLength === 32)) {
throw BAD_ARGUMENT("Invalid key");
}
}
manifest.linked = inp.linked;
}
return manifest;
}
static isValidManifest(key, manifest) {
return b4a4.equals(key, manifestHash(manifest));
}
static isCompat(key, manifest) {
return isCompat(key, manifest);
}
static sign(manifest, batch, keyPair, opts) {
return Verifier.fromManifest(manifest, opts).sign(batch, keyPair);
}
};
function toMap(nodes) {
const m2 = /* @__PURE__ */ new Map();
for (const node of nodes) m2.set(node.index, node);
return m2;
}
function isCompat(key, manifest) {
return !!(manifest && manifest.signers.length === 1 && b4a4.equals(key, manifest.signers[0].publicKey));
}
function defaultQuorum(man) {
if (typeof man.quorum === "number") return man.quorum;
if (!man.signers || !man.signers.length) return 0;
return (man.signers.length >> 1) + 1;
}
function generateUpgrade(patch, start, length) {
const upgrade = { start, length, nodes: null, additionalNodes: [], signature: null };
const from = start * 2;
const to = from + length * 2;
for (const ite = flat.iterator(0); ite.fullRoot(to); ite.nextTree()) {
if (ite.index + ite.factor / 2 < from) continue;
if (upgrade.nodes === null && ite.contains(from - 2)) {
upgrade.nodes = [];
const root = ite.index;
const target = from - 2;
ite.seek(target);
while (ite.index !== root) {
ite.sibling();
if (ite.index > target) upgrade.nodes.push(patch.get(ite.index));
ite.parent();
}
continue;
}
if (upgrade.nodes === null) upgrade.nodes = [];
upgrade.nodes.push(patch.get(ite.index));
}
if (upgrade.nodes === null) upgrade.nodes = [];
return upgrade;
}
function parseSigner(signer) {
validateSigner(signer);
return {
signature: "ed25519",
namespace: unslab(signer.namespace || caps.DEFAULT_NAMESPACE),
publicKey: unslab(signer.publicKey)
};
}
function validateSigner(signer) {
if (!signer || !signer.publicKey) throw BAD_ARGUMENT("Signer missing public key");
if (signer.signature && signer.signature !== "ed25519") {
throw BAD_ARGUMENT("Only Ed25519 signatures are supported");
}
}
function manifestHash(manifest) {
const state = { start: 0, end: 32, buffer: null };
m.manifest.preencode(state, manifest);
state.buffer = b4a4.allocUnsafe(state.end);
c4.raw.encode(state, caps.MANIFEST);
m.manifest.encode(state, manifest);
return crypto.hash(state.buffer);
}
function proofToVersion1(proof) {
return {
signer: proof.signer,
signature: proof.signature,
patch: proof.patch ? proof.patch.length : 0
};
}
function getManifestVersion(inp) {
if (typeof inp.version === "number") return inp.version;
if (inp.linked && inp.linked.length) return 2;
if (inp.userData) return 2;
return 1;
}
}
});
// node_modules/hypercore/lib/audit.js
var require_audit = __commonJS({
"node_modules/hypercore/lib/audit.js"(exports2, module2) {
var crypto = require_hypercore_crypto();
var flat = require_flat_tree();
var b4a4 = require_b4a();
var { MerkleTree } = require_merkle_tree();
module2.exports = async function auditCore(core, { tree = true, blocks = true, bitfield = true, dryRun = false } = {}) {
const length = core.state.length;
const stats = {
treeNodes: 0,
blocks: 0,
bits: 0,
droppedTreeNodes: 0,
droppedBlocks: 0,
droppedBits: 0,
corrupt: false
};
if (tree) {
let tx = null;
const roots = await MerkleTree.getRootsFromStorage(core.state.storage, length);
const stack = [];
for (const r of roots) {
if (r === null) {
if (!dryRun) {
const storage = core.state.storage;
await storage.store.deleteCore(storage.core);
return null;
}
stats.corrupt = true;
}
stack.push(r);
}
stats.treeNodes += roots.length;
while (stack.length > 0) {
const node = stack.pop();
if ((node.index & 1) === 0) continue;
const [left, right] = flat.children(node.index);
const rx = core.state.storage.read();
const leftNodePromise = rx.getTreeNode(left);
const rightNodePromise = rx.getTreeNode(right);
rx.tryFlush();
const [leftNode, rightNode] = await Promise.all([leftNodePromise, rightNodePromise]);
if (isBadTree(node, leftNode, rightNode)) {
if (!tx && !stats.corrupt) tx = core.state.storage.write();
const [l, r] = flat.spans(node.index);
tx.deleteTreeNodeRange(l, r + 1);
stats.droppedTreeNodes++;
continue;
}
if (!leftNode) continue;
stats.treeNodes += 2;
stack.push(leftNode, rightNode);
}
if (tx && !dryRun) await tx.flush();
}
if (blocks) {
let tx = null;
for await (const block of core.state.storage.createBlockStream()) {
if (!core.bitfield.get(block.index)) {
if (!tx && !stats.corrupt) tx = core.state.storage.write();
tx.deleteBlock(block.index);
stats.droppedBlocks++;
}
const rx = core.state.storage.read();
const treeNodePromise = rx.getTreeNode(2 * block.index);
rx.tryFlush();
const treeNode = await treeNodePromise;
if (isBadBlock(treeNode, block.value)) {
if (!tx && !stats.corrupt) tx = core.state.storage.write();
tx.deleteBlock(block.index);
stats.droppedBlocks++;
continue;
}
stats.blocks++;
}
if (tx && !dryRun) await tx.flush();
}
if (bitfield) {
let tx = null;
for (const index of allBits(core.bitfield)) {
const rx = core.state.storage.read();
const blockPromise = rx.getBlock(index);
rx.tryFlush();
const block = await blockPromise;
if (!block) {
stats.droppedBits++;
if (dryRun) continue;
if (!tx && !stats.corrupt) tx = core.state.storage.write();
core.bitfield.set(index, false);
const page = core.bitfield.getBitfield(index);
if (page.bitfield) tx.putBitfieldPage(page.index, page.bitfield);
else tx.deleteBitfieldPage(page.index);
continue;
}
stats.bits++;
}
if (tx && !dryRun) await tx.flush();
}
return stats;
};
function isBadBlock(node, block) {
if (!node) return true;
const hash = crypto.data(block);
return !b4a4.equals(hash, node.hash) || node.size !== block.byteLength;
}
function isBadTree(parent, left, right) {
if (!left && !right) return false;
if (!left || !right) return true;
const hash = crypto.parent(left, right);
return !b4a4.equals(hash, parent.hash) || parent.size !== left.size + right.size;
}
function* allBits(bitfield) {
let i = 0;
if (bitfield.get(0)) yield 0;
while (true) {
i = bitfield.findFirst(true, i + 1);
if (i === -1) break;
yield i;
}
}
}
});
// node_modules/hypercore/lib/copy-prologue.js
var require_copy_prologue = __commonJS({
"node_modules/hypercore/lib/copy-prologue.js"(exports2, module2) {
var crypto = require_hypercore_crypto();
var flat = require_flat_tree();
var b4a4 = require_b4a();
var quickbit = require_quickbit_universal();
var Bitfield = require_bitfield();
var MAX_BATCH_USED = 4 * 1024 * 1024;
var MIN_BATCH_USED = 512 * 1024;
module2.exports = copyPrologue;
async function copyPrologue(src, dst) {
const prologue = dst.header.manifest.prologue;
if (src.length < prologue.length || prologue.length === 0) return;
const stack = [];
const roots = flat.fullRoots(prologue.length * 2);
const batch = { roots, first: true, last: false, contig: 0, used: 0, tree: [], blocks: [] };
for (let i = 0; i < roots.length; i++) {
const node = roots[i];
batch.tree.push(node);
stack.push(node);
}
let lastPage = -1;
let lastBlock = -1;
for await (const data of src.storage.createBlockStream({
gte: 0,
lt: prologue.length,
reverse: true
})) {
if (walkTree(stack, data.index * 2, batch) === false) {
throw new Error("Missing block or tree node for " + data.index);
}
batch.contig = data.index + 1 === lastBlock ? batch.contig + 1 : 1;
lastBlock = data.index;
const page = getBitfieldPage(data.index);
batch.blocks.push(data);
if (lastPage !== page) batch.used += 4096;
batch.used += Math.max(data.value.byteLength, 128);
if (batch.used >= MIN_BATCH_USED && page !== lastPage || batch.used >= MAX_BATCH_USED) {
await flushBatch(prologue, src, dst, batch);
}
lastPage = page;
}
if (lastBlock !== 0) batch.contig = 0;
batch.last = true;
await flushBatch(prologue, src, dst, batch);
}
async function flushBatch(prologue, src, dst, batch) {
const nodePromises = [];
const srcReader = src.storage.read();
for (const index of batch.tree) {
nodePromises.push(srcReader.getTreeNode(index));
}
srcReader.tryFlush();
const nodes = await Promise.all(nodePromises);
const pagePromises = [];
const dstReader = dst.storage.read();
const headPromise = batch.first ? dstReader.getHead() : null;
if (headPromise) headPromise.catch(noop);
let lastPage = -1;
for (const { index } of batch.blocks) {
const page = getBitfieldPage(index);
if (page === lastPage) continue;
lastPage = page;
pagePromises.push(dstReader.getBitfieldPage(page));
}
dstReader.tryFlush();
const pages = await Promise.all(pagePromises);
const head = headPromise === null ? null : await headPromise;
const userData = [];
if (batch.first) {
const roots = nodes.slice(0, batch.roots.length);
for (const node of roots) {
if (!node) throw new Error("Missing nodes for prologue hash");
}
const treeHash = crypto.tree(roots);
if (!b4a4.equals(treeHash, prologue.hash)) throw new Error("Prologue does not match source");
}
if (batch.first) {
for await (const data of src.storage.createUserDataStream()) userData.push(data);
}
for (let i = 0; i < pages.length; i++) {
if (!pages[i]) pages[i] = b4a4.alloc(4096);
}
const tx = dst.storage.write();
for (const node of nodes) tx.putTreeNode(node);
lastPage = -1;
let pageIndex = -1;
for (const { index, value } of batch.blocks) {
const page = getBitfieldPage(index);
if (page !== lastPage) {
lastPage = page;
pageIndex++;
tx.putBitfieldPage(pageIndex, pages[pageIndex]);
}
const pageBuffer = pages[pageIndex];
quickbit.set(pageBuffer, getBitfieldOffset(index), true);
tx.putBlock(index, value);
}
for (const { key, value } of userData) {
tx.putUserData(key, value);
}
let upgraded = batch.first && !head;
if (upgraded) {
tx.setHead(prologueToTree(prologue));
}
await tx.flush();
if (upgraded) {
const roots = nodes.slice(0, batch.roots.length);
dst.state.setRoots(roots);
dst.header.tree = prologueToTree(prologue);
}
if (userData.length > 0) {
dst.header.userData = userData.concat(dst.header.userData);
}
if (batch.contig) {
dst.header.hints.contiguousLength = batch.contig;
}
let start = 0;
let length = 0;
for (const { index } of batch.blocks) {
if (start === 0 || start - 1 === index) {
length++;
} else {
if (length > 0) signalReplicator(dst, upgraded, start, length);
upgraded = false;
length = 1;
}
start = index;
dst.bitfield.set(index, true);
}
if (length > 0) signalReplicator(dst, upgraded, start, length);
batch.tree = [];
batch.blocks = [];
batch.first = false;
batch.used = 0;
}
function signalReplicator(core, upgraded, start, length) {
if (upgraded) {
core.replicator.cork();
core.replicator.onhave(start, length, false);
core.replicator.onupgrade();
core.replicator.uncork();
} else {
core.replicator.onhave(start, length, false);
}
}
function prologueToTree(prologue) {
return {
fork: 0,
length: prologue.length,
rootHash: prologue.hash,
signature: null
};
}
function getBitfieldPage(index) {
return Math.floor(index / Bitfield.BITS_PER_PAGE);
}
function getBitfieldOffset(index) {
return index & Bitfield.BITS_PER_PAGE - 1;
}
function walkTree(stack, target, batch) {
while (stack.length > 0) {
const node = stack.pop();
if ((node & 1) === 0) {
if (node === target) return true;
continue;
}
const ite = flat.iterator(node);
if (!ite.contains(target)) continue;
while ((ite.index & 1) !== 0) {
const left = ite.leftChild();
const right = ite.sibling();
batch.tree.push(left, right);
if (ite.contains(target)) stack.push(left);
else ite.sibling();
}
if (ite.index === target) return true;
}
return false;
}
function noop() {
}
}
});
// node_modules/hypercore/lib/session-state.js
var require_session_state = __commonJS({
"node_modules/hypercore/lib/session-state.js"(exports2, module2) {
var crypto = require_hypercore_crypto();
var b4a4 = require_b4a();
var assert2 = require_nanoassert();
var flat = require_flat_tree();
var quickbit = require_quickbit_universal();
var HypercoreStorage = require("hypercore-storage");
var {
INVALID_OPERATION,
INVALID_SIGNATURE,
ASSERTION,
SESSION_CLOSED,
SESSION_NOT_WRITABLE
} = require_hypercore_errors();
var Mutex = require_mutex();
var Bitfield = require_bitfield();
var { MerkleTree, MerkleTreeBatch } = require_merkle_tree();
var SessionState = class _SessionState {
constructor(core, parent, storage, treeInfo, name) {
this.core = core;
this.index = this.core.sessionStates.push(this) - 1;
this.storage = storage;
this.name = name;
this.sessions = [];
this.lingers = null;
this.parent = parent;
this.atomized = null;
this.mutex = new Mutex();
this.roots = treeInfo.roots.length ? treeInfo.roots : [];
this.fork = treeInfo.fork || 0;
this.length = this.roots.length ? MerkleTree.span(this.roots) / 2 : treeInfo.length;
this.byteLength = MerkleTree.size(this.roots);
this.prologue = treeInfo.prologue || null;
this.signature = treeInfo.signature || null;
this.snapshotCompatLength = this.isSnapshot() ? Math.min(this.length, this.core.state.length) : -1;
this.lastTruncation = null;
this.active = 0;
this._activeTx = null;
this._pendingBitfield = null;
this.ref();
}
static RECOVERY_PEERS = null;
isSnapshot() {
return this.storage.snapshotted;
}
isDefault() {
return this.core.state === this || this.isAtomicDefault();
}
isAtomicDefault() {
return !!this.storage.atom && !!this.parent && this.parent.isDefault();
}
createTreeBatch() {
return new MerkleTreeBatch(this);
}
addSession(s) {
if (s._stateIndex !== -1) return;
s._stateIndex = this.sessions.push(s) - 1;
if (s.weak === false) this.core.activeSessions++;
}
removeSession(s) {
if (s._stateIndex === -1) return;
const head = this.sessions.pop();
if (head !== s) this.sessions[head._stateIndex = s._stateIndex] = head;
s._stateIndex = -1;
if (s.weak === false) this.core.activeSessions--;
this.core.checkIfIdle();
}
flushedLength() {
if (this.isDefault() || this.isSnapshot()) return this.length;
const deps = this.storage.dependencies;
if (deps.length) return deps[deps.length - 1].length;
return 0;
}
signedLength() {
const l = Math.min(this.flushedLength(), this.core.state.length);
return this.isSnapshot() && l > this.snapshotCompatLength ? this.snapshotCompatLength : l;
}
unref() {
if (--this.active > 0) return;
this.close().catch(noop);
}
ref() {
this.active++;
return this;
}
hash() {
return MerkleTree.hash(this);
}
setRoots(roots) {
this.roots = roots;
this.length = MerkleTree.span(roots) / 2;
this.byteLength = MerkleTree.size(roots);
}
get encryptionFork() {
return this.core.header.tree.fork;
}
async _updateSnapshotStorage(storage) {
if (!this.atomized || !this.atomized.flushing) return this.treeInfo();
while (this.atomized.flushing) await this.atomized.flushed();
let rx = storage.read();
const headPromise = rx.getHead();
const authPromise = rx.getAuth();
const depPromise = rx.getDependency();
rx.tryFlush();
const [head, auth, dep] = await Promise.all([headPromise, authPromise, depPromise]);
storage.setDependencyHead(dep);
const fork = head ? head.fork : 0;
const length = head ? head.length : 0;
rx = storage.read();
const rootPromises = [];
for (const r of flat.fullRoots(length * 2)) {
rootPromises.push(rx.getTreeNode(r));
}
rx.tryFlush();
const roots = await Promise.all(rootPromises);
for (const root of roots) {
if (root === null) {
throw new Error(
"Bad snapshot from atomized session, id = " + this.core.id + " length = " + length + " fork = " + fork
);
}
}
return {
fork,
roots,
length,
prologue: auth.manifest && auth.manifest.prologue,
signature: head && head.signature
};
}
treeInfo() {
return {
fork: this.fork,
roots: this.roots.slice(),
length: this.length,
prologue: this.prologue,
signature: this.signature
};
}
async close() {
if (this.index === -1) return;
this.active = 0;
this.mutex.destroy(new Error("Closed")).catch(noop);
if (this.parent && this.parent.atomized) this.parent.atomized = null;
const closing = this.storage.close();
const head = this.core.sessionStates.pop();
if (head !== this) this.core.sessionStates[head.index = this.index] = head;
this.index = -1;
this.core.checkIfIdle();
if (this.lingers !== null) {
for (const storage of this.lingers) await storage.close();
}
return closing;
}
async snapshot() {
const storage = this.storage.snapshot();
const treeInfo = await this._updateSnapshotStorage(storage);
return new _SessionState(this.core, null, storage, treeInfo, this.name);
}
updateDependency(tx, length) {
const dependency = updateDependency(this, length, false);
if (dependency) tx.setDependency(dependency);
return dependency;
}
_clearActiveBatch() {
this._activeTx = null;
}
createWriteBatch() {
assert2(!this._activeTx && !this.storage.snapshotted);
this._activeTx = this.storage.write();
return this._activeTx;
}
_unlock() {
this._clearActiveBatch();
this.mutex.unlock();
this.core.checkIfIdle();
}
async flush() {
const tx = this._activeTx;
this._activeTx = null;
try {
if (!await tx.flush()) return false;
} finally {
this._clearActiveBatch();
}
this.lastTruncation = null;
return true;
}
_precommit(state) {
assert2(
state.parent === this && state.storage.core.dataPointer === this.storage.core.dataPointer,
"Atomic state must flush to parent"
);
}
async _commit() {
await this.mutex.lock();
try {
const bitfield = this._pendingBitfield;
this._pendingBitfield = null;
this.lastTruncation = null;
await this.parent._oncommit(this, bitfield);
} finally {
this.mutex.unlock();
}
}
async _oncommit(src, bitfield) {
await this.mutex.lock();
try {
const currLength = this.length;
const rx = this.storage.read();
const dependencyPromise = rx.getDependency();
rx.tryFlush();
const dependency = await dependencyPromise;
this.fork = src.fork;
this.length = src.length;
this.byteLength = src.byteLength;
this.roots = src.roots.slice();
this.signature = src.signature;
const tree = {
fork: this.fork,
length: this.length,
rootHash: this.hash(),
signature: this.signature
};
if (dependency) this.storage.setDependencyHead(dependency);
const b = bitfield;
if (b && b.truncated && b.start < currLength) {
this.ontruncate(tree, b.start, currLength, true);
if (!b || b.appends === 0) return;
}
const append = b ? { start: b.start, length: b.appends, drop: false } : null;
this.onappend(tree, append, true);
if (this.core.hintsChanged && this.isDefault()) await this.core.flushHints();
} finally {
this._unlock();
}
}
async setUserData(key, value) {
await this.mutex.lock();
try {
const tx = this.createWriteBatch();
tx.putUserData(key, value);
return await this.flush();
} finally {
this._unlock();
}
}
async _verifyBlock(batch, bitfield, value, manifest, from) {
await this.mutex.lock();
try {
if (batch.upgraded && batch.length <= this.length) {
await batch.downgrade();
}
if (!batch.commitable()) {
return false;
}
if (this.core.preupdate !== null) {
await this.core.preupdate(batch, this.core.header.key);
}
const tx = this.createWriteBatch();
if (bitfield) {
tx.putBlock(bitfield.start, value);
}
if (bitfield && this.isDefault()) {
await storeBitfieldRange(this.storage, tx, bitfield.start, bitfield.start + 1, true);
}
if (manifest) this.core._setManifest(tx, manifest, null);
assert2(batch.commitable(), "Should still be commitable");
batch.commit(tx);
const head = {
fork: batch.fork,
length: batch.length,
rootHash: batch.hash(),
signature: batch.signature
};
if (batch.upgraded) tx.setHead(head);
const flushed = await this.flush();
if (batch.upgraded) {
this.roots = batch.roots;
this.length = batch.length;
this.byteLength = batch.byteLength;
this.fork = batch.fork;
this.signature = batch.signature;
this.onappend(head, bitfield, flushed);
}
if (this.core.hintsChanged && this.isDefault()) await this.core.flushHints();
} finally {
this._unlock();
}
return true;
}
async truncate(length, fork, { signature, keyPair } = {}) {
if (!keyPair && this.isDefault()) keyPair = this.core.header.keyPair;
await this.mutex.lock();
try {
if (this.prologue && length < this.prologue.length) {
throw INVALID_OPERATION("Truncation breaks prologue", this.core.discoveryKey);
}
if (length > this.length) {
throw INVALID_OPERATION(
"Not a truncation, " + length + " must be less or equal to " + this.length,
this.core.discoveryKey
);
}
const batch = this.createTreeBatch();
await MerkleTree.truncate(this, length, batch, fork);
if (!signature && keyPair && length > 0) signature = this.core.verifier.sign(batch, keyPair);
if (signature) batch.signature = signature;
const tx = this.createWriteBatch();
if (this.core.verifier === null && keyPair) this.core._setManifest(tx, null, keyPair);
const { dependency, tree, roots } = await this._truncate(tx, batch);
for (const sessionState of this.core.sessionStates) {
if (sessionState.isSnapshot() && sessionState.name === this.name && length < sessionState.snapshotCompatLength) {
sessionState.snapshotCompatLength = length;
}
}
const flushed = await this.flush();
this.fork = tree.fork;
this.length = tree.length;
this.byteLength = MerkleTree.size(roots);
this.roots = roots;
this.signature = tree.signature;
if (dependency) this.storage.setDependencyHead(dependency);
this.ontruncate(tree, tree.length, batch.treeLength, flushed);
if (this.core.hintsChanged && this.isDefault()) await this.core.flushHints();
} finally {
this._unlock();
}
}
async reorg(batch) {
await this.mutex.lock();
const storage = this.createWriteBatch();
try {
if (!batch.commitable()) return false;
const { dependency, tree } = await this._truncate(storage, batch);
const flushed = await this.flush();
this.fork = batch.fork;
this.length = batch.length;
this.byteLength = batch.byteLength;
this.roots = batch.roots;
this.signature = batch.signature;
if (dependency) this.storage.setDependencyHead(dependency);
this.ontruncate(tree, batch.ancestors, batch.treeLength, flushed);
if (this.core.hintsChanged && this.isDefault()) await this.core.flushHints();
} finally {
this._unlock();
}
}
async _truncate(storage, batch) {
storage.deleteBlockRange(batch.ancestors, batch.treeLength);
assert2(batch.commitable(), "Batch must be commitable");
const tree = {
fork: batch.fork,
length: batch.length,
rootHash: batch.hash(),
signature: batch.signature
};
storage.setHead(tree);
batch.commit(storage);
const truncated = batch.length < this.flushedLength();
const dependency = truncated ? updateDependency(this, batch.length, true) : null;
if (dependency) storage.setDependency(dependency);
if (this.isDefault()) {
await storeBitfieldRange(this.storage, storage, batch.ancestors, batch.treeLength, false);
if (batch.ancestors < this.core.header.hints.contiguousLength) {
this.core.header.hints.remoteContiguousLength = Math.min(
batch.length,
this.core.header.hints.remoteContiguousLength
);
storage.setHints({
contiguousLength: batch.ancestors,
remoteContiguousLength: this.core.header.hints.remoteContiguousLength
});
}
}
return { dependency, tree, roots: batch.roots };
}
async clear(start, end, cleared) {
await this.mutex.lock();
try {
const tx = this.createWriteBatch();
const ite = flat.iterator(start * 2);
while (!isRootIndex(ite.index, this.roots)) {
const a = ite.index;
const b = ite.sibling();
ite.parent();
const [left, right] = flat.spans(b);
const s = left / 2;
const e = right / 2 + 1;
const has = s <= start && e <= end ? false : this.core.bitfield.hasSet(s, e - s);
if (has) break;
tx.deleteTreeNode(a);
tx.deleteTreeNode(b);
}
if (this.isDefault()) {
await storeBitfieldRange(this.storage, tx, start, end, false);
if (start < this.core.header.hints.contiguousLength) {
tx.setHints({
contiguousLength: start,
remoteContiguousLength: this.core.header.hints.remoteContiguousLength
});
}
}
if (end - start === 1) tx.deleteBlock(start);
else tx.deleteBlockRange(start, end);
const dependency = start < this.flushedLength() ? updateDependency(this, start, true) : null;
const flushed = await this.flush();
if (dependency) this.storage.setDependencyHead(dependency);
if (this.isDefault() && flushed) {
const length = end - start;
this.core.updateContiguousLength({ start, length, drop: true });
this.core._setBitfieldRanges(start, end, false);
this.core.replicator.onhave(start, length, true);
if (this.core.hintsChanged) await this.core.flushHints();
}
} finally {
this._unlock();
}
}
// simple tool to wait for other peers to catch us up
async waitForRecovery() {
const length = this.length;
const replicator = this.core.replicator;
while (!this.closing) {
let peers = getRecoveryPeers(replicator.peers);
if (peers.length < 1) {
await new Promise((resolve) => setTimeout(resolve, 5e3));
continue;
}
let restart = false;
for (let i = 0; i < 32; i++) {
await new Promise((resolve) => setTimeout(resolve, 250));
peers = getRecoveryPeers(replicator.peers);
if (this.closing || !validateRecoveryPeers(peers, this.length)) {
restart = true;
break;
}
}
if (restart) continue;
if (this.length !== length) {
throw SESSION_NOT_WRITABLE("core recovered during append");
}
this.core.header.hints.recovering = 0;
this.core.hintsChanged = true;
await this.mutex.lock();
try {
await this.core.flushHints();
return;
} finally {
this.mutex.unlock();
}
}
throw SESSION_CLOSED("Cannot recover a closed session", this.discoveryKey);
}
async append(values, { signature, keyPair, preappend, postappend, maxLength = -1 } = {}) {
if (!keyPair && this.isDefault()) keyPair = this.core.header.keyPair;
if (this.isDefault() && this.core.header.hints.recovering) await this.waitForRecovery();
await this.mutex.lock();
try {
if (maxLength >= 0 && this.length + values.length > maxLength) {
return { length: this.length, byteLength: this.byteLength };
}
const tx = this.createWriteBatch();
if (this.core.verifier === null && keyPair) this.core._setManifest(tx, null, keyPair);
if (preappend) await preappend(values);
if (!values.length) {
await this.flush();
return { length: this.length, byteLength: this.byteLength };
}
const batch = this.createTreeBatch();
for (const val of values) batch.append(val);
if (this.prologue && batch.length < this.prologue.length) {
throw INVALID_OPERATION("Append is not consistent with prologue", this.core.discoveryKey);
}
if (!signature && keyPair) signature = this.core.verifier.sign(batch, keyPair);
if (signature) batch.signature = signature;
batch.commit(tx);
const tree = {
fork: batch.fork,
length: batch.length,
rootHash: batch.hash(),
signature: batch.signature
};
tx.setHead(tree);
if (this.isDefault()) {
await storeBitfieldRange(this.storage, tx, batch.ancestors, batch.length, true);
if (this.length === this.core.header.hints.contiguousLength) {
tx.setHints({
contiguousLength: this.length + values.length,
remoteContiguousLength: this.core.header.hints.remoteContiguousLength
});
}
}
for (let i = 0; i < values.length; i++) {
tx.putBlock(this.length + i, values[i]);
}
const bitfield = {
drop: false,
start: batch.ancestors,
length: values.length
};
const flushed = await this.flush();
this.fork = batch.fork;
this.roots = batch.roots;
this.length = batch.length;
this.byteLength = batch.byteLength;
this.signature = batch.signature;
if (postappend) await postappend(values);
this.onappend(tree, bitfield, flushed);
if (this.core.hintsChanged && this.isDefault()) await this.core.flushHints();
return { length: this.length, byteLength: this.byteLength };
} finally {
this._unlock();
}
}
onappend(tree, bitfield, flushed) {
if (!flushed) this._updateBitfield(bitfield);
else if (this.isDefault()) this.core.onappend(tree, bitfield);
for (let i = this.sessions.length - 1; i >= 0; i--) {
this.sessions[i].emit("append");
}
}
ontruncate(tree, to, from, flushed) {
const bitfield = { start: to, length: from - to, drop: true };
this.lastTruncation = { from, to };
if (!flushed) this._updateBitfield(bitfield);
else if (this.isDefault()) this.core.ontruncate(tree, bitfield);
for (const sessionState of this.core.sessionStates) {
if (sessionState.isSnapshot() && sessionState.name === this.name && to < sessionState.snapshotCompatLength) {
sessionState.snapshotCompatLength = to;
}
}
for (let i = this.sessions.length - 1; i >= 0; i--) {
this.sessions[i].emit("truncate", to, tree.fork);
}
}
_updateBitfield(bitfield, flushed) {
if (!bitfield) return;
const p = this._pendingBitfield;
const b = bitfield;
if (b.drop) {
if (p && b.start + b.length !== p.start + p.appends) {
throw INVALID_OPERATION("Atomic truncations must be contiguous", this.core.discoveryKey);
}
if (p === null || b.start < p.start) {
this._pendingBitfield = { truncated: true, start: b.start, appends: 0 };
return;
}
p.appends = b.start - p.start;
if (p.appends === 0) this._pendingBitfield = null;
return;
}
if (p === null) {
this._pendingBitfield = { truncated: false, start: b.start, appends: b.length };
return;
}
if (b.start !== p.start + p.appends) {
throw INVALID_OPERATION("Atomic operations must be contiguous", this.core.discoveryKey);
}
p.appends += b.length;
}
async catchup(length) {
assert2(!this.isDefault(), "Cannot catchup signed state");
await this.mutex.lock();
try {
const origLength = this.length;
let sharedLength = 0;
for (let i = this.storage.dependencies.length - 1; i >= 0; i--) {
const dep2 = this.storage.dependencies[i];
if (dep2.dataPointer === this.core.state.storage.core.dataPointer) {
sharedLength = dep2.length;
break;
}
}
const tx = this.createWriteBatch();
const rx = this.core.state.storage.read();
const rootPromises = [];
for (const root of flat.fullRoots(length * 2)) {
rootPromises.push(rx.getTreeNode(root));
}
rx.tryFlush();
const roots = await Promise.all(rootPromises);
const truncating = sharedLength < origLength;
for (const node of roots) {
if (node === null) {
throw INVALID_OPERATION(
"Invalid catchup length, tree nodes not available",
this.core.discoveryKey
);
}
}
const fork = truncating ? this.fork + 1 : this.fork;
tx.deleteBlockRange(0, -1);
tx.deleteTreeNodeRange(0, -1);
tx.deleteBitfieldPageRange(0, -1);
const tree = {
fork,
length,
rootHash: crypto.tree(roots),
signature: null
};
tx.setHead(tree);
const dep = updateDependency(this, sharedLength, true);
dep.length = length;
tx.setDependency(dep);
const flushed = await this.flush();
this.storage.setDependencyHead(dep);
this.fork = tree.fork;
this.roots = roots;
this.length = tree.length;
this.byteLength = MerkleTree.size(roots);
if (truncating) this.ontruncate(tree, sharedLength, origLength, flushed);
if (sharedLength < length) this.onappend(tree, null, flushed);
if (this.core.hintsChanged && this.isDefault()) await this.core.flushHints();
} finally {
this._unlock();
}
}
async _overwrite(source, fork, length, treeLength, signature) {
const blockPromises = [];
const treePromises = [];
const rootPromises = [];
const rx = source.storage.read();
for (const root of flat.fullRoots(length * 2)) {
rootPromises.push(rx.getTreeNode(root));
}
for (const index of flat.patch(treeLength * 2, length * 2)) {
treePromises.push(rx.getTreeNode(index));
}
for (let i = treeLength; i < length; i++) {
treePromises.push(rx.getTreeNode(i * 2));
treePromises.push(rx.getTreeNode(i * 2 + 1));
blockPromises.push(rx.getBlock(i));
}
rx.tryFlush();
const blocks = await Promise.all(blockPromises);
const nodes = await Promise.all(treePromises);
const roots = await Promise.all(rootPromises);
if (this.core.destroyed) throw new Error("Core destroyed");
if (signature) {
const batch = this.createTreeBatch();
batch.roots = roots;
batch.length = length;
if (!this.core.verifier.verify(batch, signature)) {
throw INVALID_SIGNATURE(
"Signature is not valid over committed tree",
this.core.discoveryKey
);
}
}
const tx = this.createWriteBatch();
if (treeLength < this.length) {
tx.deleteBlockRange(treeLength, this.length);
}
for (const root of roots) tx.putTreeNode(root);
for (const node of nodes) {
if (node !== null) tx.putTreeNode(node);
}
for (let i = 0; i < blocks.length; i++) {
assert2(blocks[i] !== null, "has block");
tx.putBlock(i + treeLength, blocks[i]);
}
const totalLength = Math.max(length, this.length);
if (totalLength > treeLength) {
const firstPage = getBitfieldPage(treeLength);
const lastPage = getBitfieldPage(totalLength - 1);
const srx = this.storage.read();
const bitfieldPagePromise = srx.getBitfieldPage(firstPage);
srx.tryFlush();
const bitfieldPage = await bitfieldPagePromise;
let index = treeLength;
for (let i = firstPage; i <= lastPage; i++) {
const page = b4a4.alloc(Bitfield.BYTES_PER_PAGE);
tx.putBitfieldPage(i, page);
if (i === firstPage && bitfieldPage) page.set(bitfieldPage);
if (index < length) {
index = fillBitfieldPage(page, index, length, i, true);
if (index < length) continue;
}
if (index < this.length) {
index = fillBitfieldPage(page, index, this.length, i, false);
}
}
}
const tree = {
fork,
length,
rootHash: crypto.tree(roots),
signature
};
const upgraded = treeLength < this.length || this.length < length || tree.fork !== this.fork;
if (upgraded) tx.setHead(tree);
const flushed = await this.flush();
this.fork = tree.fork;
this.roots = roots;
this.length = length;
this.byteLength = MerkleTree.size(roots);
this.signature = signature;
return { tree, flushed };
}
static isParent(state, parent) {
if (state.parent && state.parent === parent) return true;
return HypercoreStorage.isParentStorage(state.storage, parent.storage);
}
async commit(state, { signature, keyPair, length = state.length, treeLength = -1 } = {}) {
assert2(
this.isDefault() || this.parent && this.parent.isDefault(),
"Can only commit into default state"
);
assert2(_SessionState.isParent(state, this), "Cannot commit across cores");
if (this.core._repairMode) {
throw ASSERTION("Cannot commit while repair mode is on");
}
if (this.core.header.hints.recovering) await this.waitForRecovery();
let srcLocked = false;
await this.mutex.lock();
try {
await state.mutex.lock();
srcLocked = true;
if (treeLength === -1) treeLength = state.flushedLength();
if (!await this.core._validateCommit(state, treeLength)) return null;
if (this.length > length) return null;
if (this.length < length && !signature) {
if (!keyPair) keyPair = this.core.header.keyPair;
const batch = state.createTreeBatch();
if (length !== batch.length) await batch.restore(length);
signature = this.core.verifier.sign(batch, keyPair);
}
const { tree, flushed } = await this._overwrite(
state,
this.fork,
length,
treeLength,
signature
);
if (treeLength < length) {
const tx = state.createWriteBatch();
tx.deleteBlockRange(treeLength, length);
const dependency = state.updateDependency(tx, length);
await state.flush(tx);
if (dependency) state.storage.setDependencyHead(dependency);
}
const bitfield = { start: treeLength, length: length - treeLength, drop: false };
this.onappend(tree, bitfield, flushed);
return {
length: this.length,
byteLength: this.byteLength
};
} finally {
if (srcLocked) state._unlock();
this._unlock();
}
}
async _getTreeHeadAt(length) {
if (length === null) return this.treeInfo();
const head = getDefaultTree();
head.length = length;
const roots = await MerkleTree.getRootsFromStorage(this.storage, length);
const rootHash = crypto.tree(roots);
head.fork = this.fork;
head.rootHash = rootHash;
if (length === this.length) head.signature = this.signature;
return head;
}
_moveToCore(core, truncated, appended) {
const head = this.core.sessionStates.pop();
if (head !== this) this.core.sessionStates[head.index = this.index] = head;
this.core = core;
this.index = this.core.sessionStates.push(this) - 1;
for (let i = this.sessions.length - 1; i >= 0; i--) {
const s = this.sessions[i];
const manifest = s.manifest;
s.transferSession(this.core);
if (!manifest && s.manifest) s.emit("manifest");
if (truncated) s.emit("truncate", truncated.to, truncated.fork);
if (appended) s.emit("append");
}
}
async moveTo(core, length) {
const state = core.state;
await this.mutex.lock();
try {
const treeLength = this.length;
let truncated = null;
let appended = false;
if (!this.isSnapshot()) {
if (this.lingers === null) this.lingers = [];
this.lingers.push(this.storage);
const resumed = await state.storage.resumeSession(this.name);
const truncation = length < this.length ? await truncateAndFlush(this, length) : null;
const treeInfo = truncation ? truncation.tree : resumed ? null : await state._getTreeHeadAt(this.length);
const fork = truncation ? this.fork + 1 : this.fork;
let storage = null;
if (resumed) {
storage = resumed;
} else {
treeInfo.fork = fork;
storage = await state.storage.createSession(this.name, treeInfo);
}
const roots = await MerkleTree.getRootsFromStorage(storage, length);
this.storage = storage;
this.prologue = state.prologue;
this.fork = fork;
this.length = length;
this.byteLength = MerkleTree.size(roots);
this.roots = roots;
if (truncation) {
const { dependency } = truncation;
if (dependency) this.storage.setDependencyHead(dependency);
truncated = { to: treeLength, fork };
}
if (this.length > treeLength) {
appended = true;
}
}
for (let i = this.core.sessionStates.length - 1; i >= 0; i--) {
const state2 = this.core.sessionStates[i];
if (state2 === this) continue;
if (state2.name === this.name) state2._moveToCore(core.core);
}
this._moveToCore(core.core, truncated, appended);
} finally {
this._unlock();
}
}
async createSession(name, overwrite, atom) {
await this.mutex.lock();
try {
let storage = null;
let treeInfo = null;
if (!atom && !overwrite && this.storage) {
storage = await this.storage.resumeSession(name);
if (storage !== null) treeInfo = await getCoreHead(storage) || getDefaultTree();
}
const length = treeInfo ? treeInfo.length : this.length;
if (storage === null) {
treeInfo = await this._getTreeHeadAt(length);
if (atom) {
storage = await this.storage.createAtomicSession(atom, treeInfo);
} else {
storage = await this.storage.createSession(name, treeInfo);
}
}
if (this.atomized && atom) {
throw new Error("Session already atomized");
}
const head = {
fork: this.fork,
roots: length === this.length ? this.roots.slice() : await MerkleTree.getRootsFromStorage(storage, length),
length,
prologue: this.prologue,
signature: length === this.length ? this.signature : null
};
const state = new _SessionState(
this.core,
atom ? this : null,
storage,
head,
atom ? this.name : name
);
if (atom) {
this.atomized = atom;
atom.preflush(this._precommit.bind(this, state));
atom.onflush(state._commit.bind(state));
}
return state;
} finally {
this._unlock();
}
}
};
module2.exports = SessionState;
function noop() {
}
function getBitfieldPage(index) {
return Math.floor(index / Bitfield.BITS_PER_PAGE);
}
function fillBitfieldPage(page, start, end, pageIndex, value) {
const offset = pageIndex * Bitfield.BITS_PER_PAGE;
const max = offset + Bitfield.BITS_PER_PAGE;
const index = max < end ? max : end;
const from = start - offset;
const to = index - offset;
quickbit.fill(page, value, from, to);
return index;
}
async function storeBitfieldRange(storage, tx, from, to, value) {
if (from >= to) return;
const firstPage = getBitfieldPage(from);
const lastPage = getBitfieldPage(to - 1);
let index = from;
const rx = storage.read();
const promises = [];
for (let i = firstPage; i <= lastPage; i++) {
promises.push(rx.getBitfieldPage(i));
}
rx.tryFlush();
const pages = await Promise.all(promises);
const cnt = lastPage - firstPage + 1;
for (let i = 0; i < cnt; i++) {
const pageIndex = i + firstPage;
if (!pages[i]) pages[i] = b4a4.alloc(Bitfield.BYTES_PER_PAGE);
index = fillBitfieldPage(pages[i], index, to, pageIndex, value);
tx.putBitfieldPage(pageIndex, pages[i]);
}
}
async function truncateAndFlush(s, length) {
const batch = s.createTreeBatch();
await MerkleTree.truncate(s, length, batch, s.fork);
const tx = s.createWriteBatch();
const info = await s._truncate(tx, batch);
const flushed = await s.flush();
return {
tree: info.tree,
roots: info.roots,
dependency: info.dependency,
flushed
};
}
function updateDependency(state, length, truncated) {
const i = state.storage.findDependencyIndex(length, truncated);
if (i === -1) return null;
return {
dataPointer: state.storage.dependencies[i].dataPointer,
length
};
}
function getDefaultTree() {
return {
fork: 0,
length: 0,
rootHash: null,
signature: null
};
}
function getCoreHead(storage) {
const b = storage.read();
const p = b.getHead();
b.tryFlush();
return p;
}
function isRootIndex(index, roots) {
for (const node of roots) {
if (node.index === index) return true;
}
return false;
}
function getRecoveryPeers(peers) {
if (!SessionState.RECOVERY_PEERS) return peers;
const actual = [];
for (const p of peers) {
for (const r of SessionState.RECOVERY_PEERS) {
if (b4a4.equals(p.remotePublicKey, r)) {
actual.push(p);
break;
}
}
}
return actual;
}
function validateRecoveryPeers(peers, length) {
if (peers.length < 1) return false;
for (const p of peers) {
if (p.remoteLength > length) return false;
if (p.remoteLength === 0 && !p.remoteSynced) return false;
}
return true;
}
}
});
// node_modules/random-array-iterator/index.js
var require_random_array_iterator = __commonJS({
"node_modules/random-array-iterator/index.js"(exports2, module2) {
module2.exports = class RandomArrayIterator {
constructor(values) {
this.values = values;
this.start = 0;
this.length = this.values.length;
}
next() {
if (this.length === 0) {
if (this.start === 0) return { done: true, value: void 0 };
this.length = this.start;
this.start = 0;
}
const i = this.start + (Math.random() * this.length | 0);
const j = this.start + --this.length;
const value = this.values[i];
this.values[i] = this.values[j];
this.values[j] = value;
return { done: false, value };
}
dequeue() {
this.values[this.start + this.length] = this.values[this.values.length - 1];
this.values.pop();
}
requeue() {
const i = this.start + this.length;
const value = this.values[i];
this.values[i] = this.values[this.start];
this.values[this.start++] = value;
}
restart() {
this.start = 0;
this.length = this.values.length;
return this;
}
[Symbol.iterator]() {
return this;
}
};
}
});
// node_modules/hypercore/lib/receiver-queue.js
var require_receiver_queue = __commonJS({
"node_modules/hypercore/lib/receiver-queue.js"(exports2, module2) {
var FIFO = require_fast_fifo();
module2.exports = class ReceiverQueue {
constructor() {
this.queue = new FIFO();
this.priority = [];
this.requests = /* @__PURE__ */ new Map();
this.length = 0;
}
push(req) {
if (req.priority > 0) this.priority.push(req);
else this.queue.push(req);
this.requests.set(req.id, req);
this.length++;
}
shift() {
while (this.priority.length > 0) {
const msg = this.priority.pop();
const req = this._processRequest(msg);
if (req !== null) return req;
}
while (this.queue.length > 0) {
const msg = this.queue.shift();
const req = this._processRequest(msg);
if (req !== null) return req;
}
return null;
}
_processRequest(req) {
if (req.block || req.hash || req.seek || req.upgrade || req.manifest) {
this.requests.delete(req.id);
this.length--;
return req;
}
return null;
}
clear() {
this.queue.clear();
this.priority = [];
this.length = 0;
this.requests.clear();
}
delete(id) {
const req = this.requests.get(id);
if (!req) return;
req.block = null;
req.hash = null;
req.seek = null;
req.upgrade = null;
req.manifest = false;
this.requests.delete(id);
this.length--;
if (this.length === 0) {
this.queue.clear();
this.priority = [];
}
}
};
}
});
// node_modules/hypercore/lib/hotswap-queue.js
var require_hotswap_queue = __commonJS({
"node_modules/hypercore/lib/hotswap-queue.js"(exports2, module2) {
var TICKS = 16;
module2.exports = class HotswapQueue {
constructor() {
this.priorities = [[], [], []];
}
*pick(peer) {
for (let i = 0; i < this.priorities.length; i++) {
let ticks = (this.priorities.length - i) * TICKS;
const queue = this.priorities[i];
for (let j = 0; j < queue.length; j++) {
const r = j + Math.floor(Math.random() * queue.length - j);
const a = queue[j];
const b = queue[r];
if (r !== j) {
queue[b.hotswap.index = j] = b;
queue[a.hotswap.index = r] = a;
}
if (hasInflight(b, peer)) continue;
yield b;
if (--ticks <= 0) break;
}
}
}
add(block) {
if (block.hotswap !== null) this.remove(block);
if (block.inflight.length === 0 || block.inflight.length >= 3) return;
const queue = this.priorities[block.inflight.length - 1];
const index = queue.push(block) - 1;
block.hotswap = { ref: this, queue, index };
}
remove(block) {
const hotswap = block.hotswap;
if (hotswap === null) return;
block.hotswap = null;
const head = hotswap.queue.pop();
if (head === block) return;
hotswap.queue[head.hotswap.index = hotswap.index] = head;
}
};
function hasInflight(block, peer) {
for (let j = 0; j < block.inflight.length; j++) {
if (block.inflight[j].peer === peer) return true;
}
return false;
}
}
});
// node_modules/hypercore/lib/replicator.js
var require_replicator = __commonJS({
"node_modules/hypercore/lib/replicator.js"(exports2, module2) {
var b4a4 = require_b4a();
var safetyCatch = require_safety_catch();
var RandomIterator = require_random_array_iterator();
var flatTree = require_flat_tree();
var Mutex = require_mutex();
var ReceiverQueue = require_receiver_queue();
var HotswapQueue = require_hotswap_queue();
var RemoteBitfield = require_remote_bitfield();
var { MerkleTree } = require_merkle_tree();
var w = require_wants();
var { LocalWants, RemoteWants } = w;
var {
REQUEST_CANCELLED,
REQUEST_TIMEOUT,
INVALID_CAPABILITY,
SNAPSHOT_NOT_AVAILABLE,
ASSERTION
} = require_hypercore_errors();
var m = require_messages2();
var caps = require_caps();
var DEFAULT_MAX_INFLIGHT = [16, 512];
var SCALE_LATENCY = 50;
var NOT_DOWNLOADING_SLACK = 2e4 + Math.random() * 2e4 | 0;
var MAX_PEERS_UPGRADE = 3;
var LAST_BLOCKS = 256;
var MAX_RANGES = 64;
var NOT_AVAILABLE = 1;
var INVALID_REQUEST = 2;
var MAX_INVALID_REQUESTS = 64;
var MAX_BACKOFFS = MAX_INVALID_REQUESTS / 2;
var PRIORITY = {
NORMAL: 0,
HIGH: 1,
VERY_HIGH: 2,
CANCELLED: 255
// reserved to mark cancellation
};
var Attachable = class {
constructor(replicator) {
this.replicator = replicator;
this.resolved = false;
this.processing = false;
this.refs = [];
this.wants = null;
}
addWant(w2) {
if (this.wants === null) this.wants = /* @__PURE__ */ new Set();
this.wants.add(w2);
}
removeWant(w2) {
if (this.wants === null) return;
this.wants.delete(w2);
}
attach(session) {
const r = {
context: this,
session,
sindex: 0,
rindex: 0,
snapshot: true,
resolve: null,
reject: null,
promise: null,
timeout: null
};
r.sindex = session.push(r) - 1;
r.rindex = this.refs.push(r) - 1;
r.promise = new Promise((resolve, reject) => {
r.resolve = resolve;
r.reject = reject;
});
return r;
}
detach(r, err = null) {
if (r.context !== this) return false;
this._detach(r);
this._cancel(r, err);
this.gc();
return true;
}
_detach(r) {
const rh = this.refs.pop();
const sh = r.session.pop();
if (r.rindex < this.refs.length) this.refs[rh.rindex = r.rindex] = rh;
if (r.sindex < r.session.length) r.session[sh.sindex = r.sindex] = sh;
destroyRequestTimeout(r);
r.context = null;
return r;
}
gc() {
if (this.refs.length > 0 || this.processing) return;
this._unref();
if (this.wants === null) return;
const wants = this.wants;
this.wants = null;
let update = null;
for (const w2 of wants) {
if (w2.any) {
const removed = w2.wants.removeAnyRange(w2.start, w2.length, this);
if (!removed) continue;
if (update === null) update = /* @__PURE__ */ new Set();
update.add(w2.wants.peer);
w2.wants.peer.wireUnwant.send(removed);
continue;
}
if (w2.wants.removeBatch(w2.start, this)) {
if (update === null) update = /* @__PURE__ */ new Set();
update.add(w2.wants.peer);
}
}
if (update === null) return;
for (const peer of update) {
this.replicator.updatePeer(peer);
}
}
processed() {
this.processing = false;
this.gc();
}
_cancel(r, err) {
r.reject(err || REQUEST_CANCELLED());
}
_unref() {
}
resolve(val) {
this.resolved = true;
while (this.refs.length > 0) {
this._detach(this.refs[this.refs.length - 1]).resolve(val);
}
this.gc();
}
reject(err) {
this.resolved = true;
while (this.refs.length > 0) {
this._detach(this.refs[this.refs.length - 1]).reject(err);
}
this.gc();
}
setTimeout(r, ms) {
destroyRequestTimeout(r);
r.timeout = setTimeout(onrequesttimeout, ms, r);
}
};
var BlockRequest = class extends Attachable {
constructor(replicator, tracker, index, priority, force) {
super(replicator);
this.index = index;
this.priority = priority;
this.inflight = [];
this.queued = false;
this.hotswap = null;
this.tracker = tracker;
this.force = force;
}
_unref() {
if (this.resolved) return;
this.queued = false;
for (const req of this.inflight) {
req.peer._cancelRequest(req);
}
this.tracker.remove(this.index);
removeHotswap(this);
}
};
var RangeBatchRequest = class extends Attachable {
constructor(replicator, batch) {
super(replicator);
this.batch = batch;
this.index = 0;
}
};
var RangeRequest = class extends Attachable {
constructor(replicator, ranges, start, end, linear, ifAvailable, blocks) {
super(replicator);
this.start = start;
this.end = end;
this.linear = linear;
this.ifAvailable = ifAvailable;
this.blocks = blocks;
this.ranges = ranges;
this.batches = [];
ranges.push(this);
if (this.end === -1) {
this.replicator._alwaysLatestBlock++;
}
this.userStart = start;
this.userEnd = end;
}
addBatch(batch) {
for (let i = 0; i < this.batches.length; i++) {
const b2 = this.batches[i];
if (b2.batch === batch) return false;
}
const b = new RangeBatchRequest(this.replicator, batch);
b.index = this.batches.length;
this.batches.push(b);
return true;
}
removeBatch(batch) {
const head = this.batches.pop();
if (head !== batch) {
head.index = batch.index;
this.batches[head.index] = head;
}
batch.gc();
}
_unref() {
const rangeIndex = this.ranges.indexOf(this);
if (rangeIndex === -1) return;
const h = this.ranges.pop();
if (h !== this) {
this.ranges[rangeIndex] = h;
}
if (this.end === -1) {
this.replicator._alwaysLatestBlock--;
}
while (this.batches.length) {
this.batches.pop().gc();
}
}
_cancel(r) {
r.resolve(false);
}
};
var UpgradeRequest = class extends Attachable {
constructor(replicator, fork, length) {
super(replicator);
this.fork = fork;
this.length = length;
this.inflight = [];
}
_unref() {
if (this.resolved) return;
if (this.replicator.eagerUpgrade === true || this.inflight.length > 0) return;
this.replicator._upgrade = null;
}
_cancel(r) {
r.resolve(false);
}
};
var SeekRequest = class extends Attachable {
constructor(replicator, seeks, seeker) {
super(replicator);
this.seeker = seeker;
this.inflight = [];
this.seeks = seeks;
}
_unref() {
if (this.resolved) return;
if (this.inflight.length > 0) return;
const i = this.seeks.indexOf(this);
if (i === -1) return;
const h = this.seeks.pop();
if (i < this.seeks.length) this.seeks[i] = h;
}
};
var ForkRequest = class extends Attachable {
constructor(replicator, fork) {
super(replicator);
this.fork = fork;
this.inflight = [];
this.batch = null;
}
};
var InflightTracker = class {
constructor() {
this._requests = [];
this._free = [];
this._active = 0;
}
get idle() {
return this._active === 0;
}
*[Symbol.iterator]() {
for (const req of this._requests) {
if (req !== null) yield req;
}
}
add(req) {
const id = this._free.length ? this._free.pop() : this._requests.push(null);
req.id = id;
this._requests[id - 1] = req;
this._active++;
return req;
}
get(id) {
return id <= this._requests.length ? this._requests[id - 1] : null;
}
remove(id, roundtrip) {
if (id > this._requests.length) return;
if (this._requests[id - 1]) this._active--;
this._requests[id - 1] = null;
if (roundtrip === true) this._free.push(id);
}
reusable(id) {
this._free.push(id);
}
};
var BlockTracker = class {
constructor(replicator) {
this._replicator = replicator;
this._map = /* @__PURE__ */ new Map();
}
[Symbol.iterator]() {
return this._map.values();
}
isEmpty() {
return this._map.size === 0;
}
has(index) {
return this._map.has(index);
}
get(index) {
return this._map.get(index) || null;
}
add(index, priority, force) {
let b = this._map.get(index);
if (b) return b;
b = new BlockRequest(this._replicator, this, index, priority, force);
this._map.set(index, b);
return b;
}
remove(index) {
const b = this.get(index);
this._map.delete(index);
return b;
}
};
var RoundtripQueue = class {
constructor() {
this.queue = [];
this.tick = 0;
}
clear() {
const ids = new Array(this.queue.length);
for (let i = 0; i < ids.length; i++) {
ids[i] = this.queue[i][1];
}
this.queue = [];
return ids;
}
add(id) {
this.queue.push([++this.tick, id]);
}
flush(tick) {
let flushed = null;
for (let i = 0; i < this.queue.length; i++) {
if (this.queue[i][0] > tick) break;
if (flushed === null) flushed = [];
flushed.push(this.queue[i][1]);
}
if (flushed !== null) this.queue.splice(0, flushed.length);
return flushed;
}
};
var ProofRequest = class {
constructor(msg, proof, block, manifest) {
this.msg = msg;
this.proof = proof;
this.block = block;
this.manifest = manifest;
}
async fulfill() {
if (this.proof === null) return null;
const [proof, block] = await Promise.all([this.proof.settle(), this.block]);
if (this.manifest) proof.manifest = this.manifest;
if (!block && proof.block) return null;
if (block) proof.block.value = block;
return proof;
}
};
var Peer = class {
constructor(replicator, protomux, channel, inflightRange) {
this.core = replicator.core;
this.replicator = replicator;
this.stream = protomux.stream;
this.protomux = protomux;
this.remotePublicKey = this.stream.remotePublicKey;
this.remoteSupportsSeeks = false;
this.inflightRange = inflightRange;
this.fullyDownloadedSignaled = 0;
this.paused = false;
this.removed = false;
this.channel = channel;
this.channel.userData = this;
this.wireSync = this.channel.messages[0];
this.wireRequest = this.channel.messages[1];
this.wireCancel = this.channel.messages[2];
this.wireData = this.channel.messages[3];
this.wireNoData = this.channel.messages[4];
this.wireWant = this.channel.messages[5];
this.wireUnwant = this.channel.messages[6];
this.wireBitfield = this.channel.messages[7];
this.wireRange = this.channel.messages[8];
this.wireExtension = this.channel.messages[9];
this.stats = {
wireSync: { tx: 0, rx: 0 },
wireRequest: { tx: 0, rx: 0 },
wireCancel: { tx: 0, rx: 0 },
wireData: { tx: 0, rx: 0 },
wireWant: { tx: 0, rx: 0 },
wireUnwant: { tx: 0, rx: 0 },
wireBitfield: { tx: 0, rx: 0 },
wireRange: { tx: 0, rx: 0 },
wireExtension: { tx: 0, rx: 0 },
hotswaps: 0,
invalidData: 0,
invalidRequests: 0,
backoffs: 0,
notAvailableBackoffs: 0
};
this.receiverQueue = new ReceiverQueue();
this.receiverBusy = false;
this.roundtripQueue = null;
this.inflight = 0;
this.dataProcessing = 0;
this.canUpgrade = true;
this.needsSync = false;
this.syncsProcessing = 0;
this.lastUpgradableLength = 0;
this.lastUpgradableFork = 0;
this._remoteContiguousLength = 0;
this.remoteOpened = false;
this.remoteBitfield = new RemoteBitfield();
this.missingBlocks = new RemoteBitfield();
this.pushedLength = 0;
this.remoteFork = 0;
this.remoteLength = 0;
this.remoteCanUpgrade = false;
this.remoteUploading = true;
this.remoteDownloading = true;
this.remoteSynced = false;
this.remoteHasManifest = false;
this.remoteAllowPush = false;
this.remoteRequests = /* @__PURE__ */ new Map();
this.segmentsWanted = /* @__PURE__ */ new Set();
this.broadcastedNonSparse = false;
this.wants = new LocalWants(this);
this.remoteWants = new RemoteWants(this);
this.lengthAcked = 0;
this.extensions = /* @__PURE__ */ new Map();
this.lastExtensionSent = "";
this.lastExtensionRecv = "";
replicator._ifAvailable++;
replicator._active++;
}
get remoteContiguousLength() {
return this.remoteBitfield.findFirst(false, this._remoteContiguousLength);
}
getMaxInflight() {
const stream = this.stream.rawStream;
if (!stream.udx) return Math.min(this.inflightRange[1], this.inflightRange[0] * 3);
const scale = stream.rtt <= SCALE_LATENCY ? 1 : stream.rtt / SCALE_LATENCY * Math.min(1, 2 / this.replicator.peers.length);
return Math.max(
this.inflightRange[0],
Math.round(Math.min(this.inflightRange[1], this.inflightRange[0] * scale))
);
}
getMaxHotswapInflight() {
const inf = this.getMaxInflight();
return Math.max(16, inf / 2);
}
signalUpgrade() {
if (this._shouldUpdateCanUpgrade() === true) this._updateCanUpgradeAndSync();
else this.sendSync();
}
_markInflight(index) {
this.missingBlocks.set(index, false);
}
broadcastRange(start, length, drop) {
if (!this.isActive()) return;
if (drop) this._unclearLocalRange(start, length);
else this._clearLocalRange(start, length);
const fullyContig = this.core.header.hints.contiguousLength === this.core.state.length;
if (start + LAST_BLOCKS < this.core.state.length && !drop && !fullyContig) {
if (!this.remoteWants.hasRange(start, length)) return;
}
let force = false;
if (fullyContig && !drop) {
start = 0;
length = this.core.state.length;
if (this.fullyDownloadedSignaled < length) {
this.fullyDownloadedSignaled = length;
force = true;
}
}
if (!force && !drop) {
if (this._remoteContiguousLength >= start + length) return;
if (length === 1) {
if (this.remoteBitfield.get(start)) return;
} else {
if (this.remoteBitfield.firstUnset(start) >= start + length) return;
}
}
this.wireRange.send({
drop,
start,
length
});
incrementTx(this.stats.wireRange, this.replicator.stats.wireRange);
}
extension(name, message) {
this.wireExtension.send({ name: name === this.lastExtensionSent ? "" : name, message });
incrementTx(this.stats.wireExtension, this.replicator.stats.wireExtension);
this.lastExtensionSent = name;
}
onextension(message) {
const name = message.name || this.lastExtensionRecv;
this.lastExtensionRecv = name;
const ext = this.extensions.get(name);
if (ext) {
ext._onmessage({ start: 0, end: message.message.byteLength, buffer: message.message }, this);
}
}
sendSync() {
if (this.core._repairMode) return;
if (this.syncsProcessing !== 0) {
this.needsSync = true;
return;
}
if (this.core.state.fork !== this.remoteFork) {
this.canUpgrade = false;
}
this.needsSync = false;
this.wireSync.send({
fork: this.core.state.fork,
length: this.core.state.length,
remoteLength: this.core.state.fork === this.remoteFork ? this.remoteLength : 0,
canUpgrade: this.canUpgrade,
uploading: true,
downloading: this.replicator.isDownloading(),
hasManifest: !!this.core.header.manifest && this.core.compat === false,
allowPush: this.replicator.isAllowingPush()
});
incrementTx(this.stats.wireSync, this.replicator.stats.wireSync);
}
onopen({ seeks, capability }) {
const expected = caps.replicate(
this.stream.isInitiator === false,
this.core.key,
this.stream.handshakeHash
);
if (b4a4.equals(capability, expected) !== true) {
throw INVALID_CAPABILITY("Remote sent an invalid replication capability");
}
if (this.remoteOpened === true) return;
this.remoteOpened = true;
this.remoteSupportsSeeks = seeks;
this.protomux.cork();
this.sendSync();
const contig = Math.min(this.core.state.length, this.core.header.hints.contiguousLength);
if (contig > 0) {
this.broadcastRange(0, contig, false);
if (contig === this.core.state.length) {
this.broadcastedNonSparse = true;
}
}
this.replicator._ifAvailable--;
this.replicator._addPeer(this);
this.protomux.uncork();
this.core.checkIfIdle();
}
onclose(isRemote) {
const reopen = isRemote === true && this.remoteOpened === true && this.remoteDownloading === false && this.remoteUploading === true && this.replicator.downloading === true;
if (this.remoteOpened === false) {
this.replicator._ifAvailable--;
this.replicator.updateAll();
return;
}
this.remoteOpened = false;
this.removed = true;
this.remoteRequests.clear();
this.receiverQueue.clear();
if (this.roundtripQueue !== null) {
for (const id of this.roundtripQueue.clear()) this.replicator._inflight.reusable(id);
}
this.replicator._removePeer(this);
if (reopen) {
this.replicator._makePeer(this.protomux);
}
}
closeIfIdle() {
if (this.remoteDownloading === false && this.replicator.isDownloading() === false) {
this.channel.close();
return true;
}
return false;
}
async onsync(msg) {
const {
fork,
length,
remoteLength,
canUpgrade,
uploading,
downloading,
hasManifest,
allowPush
} = msg;
const lengthChanged = length !== this.remoteLength;
const sameFork = fork === this.core.state.fork;
this.remoteSynced = true;
this.remoteFork = fork;
this.remoteLength = length;
this.remoteCanUpgrade = canUpgrade;
this.remoteUploading = uploading;
this.remoteDownloading = downloading;
this.remoteHasManifest = hasManifest;
this.remoteAllowPush = allowPush;
if (this.closeIfIdle()) return;
this.lengthAcked = sameFork ? remoteLength : 0;
this.syncsProcessing++;
this.replicator._updateFork(this);
if (this.remoteLength > this.core.state.length && this.lengthAcked === this.core.state.length) {
if (this.replicator._addUpgradeMaybe() !== null) this._update();
}
const upgrade = lengthChanged === false || sameFork === false ? this.canUpgrade && sameFork : await this._canUpgrade(length, fork);
if (length === this.remoteLength && fork === this.core.state.fork) {
this.canUpgrade = upgrade;
if (upgrade) {
this.lastUpgradableFork = fork;
this.lastUpgradableLength = length;
}
}
if (--this.syncsProcessing !== 0) return;
if (this.needsSync === true || this.core.state.fork === this.remoteFork && this.core.state.length > this.remoteLength) {
this.signalUpgrade();
}
this._update();
}
_shouldUpdateCanUpgrade() {
return this.core.state.fork === this.remoteFork && this.core.state.length > this.remoteLength && this.canUpgrade === false && this.syncsProcessing === 0;
}
async _updateCanUpgradeAndSync() {
const { length, fork } = this.core.state;
const remoteLength = this.remoteLength;
const remoteFork = this.remoteFork;
const canUpgrade = await this._canUpgrade(this.remoteLength, this.remoteFork);
if (this.syncsProcessing > 0 || length !== this.core.state.length || fork !== this.core.state.fork) {
return;
}
if (remoteLength !== this.remoteLength || remoteFork !== this.remoteFork) {
return;
}
if (canUpgrade === this.canUpgrade) {
return;
}
this.canUpgrade = canUpgrade;
if (canUpgrade) {
this.lastUpgradableLength = this.remoteLength;
this.lastUpgradableFork = this.remoteFork;
}
this.sendSync();
}
// Safe to call in the background - never fails
async _canUpgrade(remoteLength, remoteFork) {
if (remoteFork !== this.core.state.fork) return false;
if (remoteLength === 0) return true;
if (remoteLength >= this.core.state.length) return false;
try {
const canUpgrade = await MerkleTree.upgradeable(this.core.state, remoteLength);
if (remoteFork !== this.core.state.fork) return false;
return canUpgrade;
} catch {
return false;
}
}
async _getProof(batch, msg, pushing) {
let block = null;
if (msg.block) {
const index = msg.block.index;
if (!pushing && (msg.fork !== this.core.state.fork || !this.core.bitfield.get(index))) {
return new ProofRequest(msg, null, null, null);
}
block = batch.getBlock(index);
block.catch(noop);
}
const manifest = msg.manifest && !this.core.compat ? this.core.header.manifest : null;
try {
const proof = await MerkleTree.proof(this.core.state, batch, msg);
return new ProofRequest(msg, proof, block, manifest);
} catch (err) {
batch.destroy();
this.replicator._oninvalidrequest(err, msg, this);
if (this.stats.invalidRequests >= MAX_INVALID_REQUESTS) throw err;
await backoff(this.stats.invalidRequests);
return null;
}
}
async onrequest(msg) {
const size = this.remoteRequests.size;
this.remoteRequests.set(msg.id, msg);
if (size === this.remoteRequests.size) {
this._cancel(msg.id);
this.remoteRequests.set(msg.id, msg);
}
if (!this.protomux.drained || this.receiverQueue.length) {
this.receiverQueue.push(msg);
return;
}
if (this.replicator.destroyed) return;
await this._handleRequest(msg);
}
oncancel(msg) {
this._cancel(msg.request);
}
_cancel(id) {
this.remoteRequests.delete(id);
this.receiverQueue.delete(id);
}
ondrain() {
return this._handleRequests();
}
async _handleRequests() {
if (this.receiverBusy || this.replicator.destroyed) return;
this.receiverBusy = true;
this.protomux.cork();
while (this.remoteOpened && this.protomux.drained && this.receiverQueue.length > 0 && !this.removed) {
const msg = this.receiverQueue.shift();
await this._handleRequest(msg);
}
this.protomux.uncork();
this.receiverBusy = false;
}
async push(index) {
if (!this.remoteAllowPush) return;
if (!this.remoteDownloading) return;
if (this.core.state.length <= index) return;
if (this.core.state.fork !== this.remoteFork) return;
if (this.remoteBitfield.get(index)) return;
const msg = {
id: 0,
fork: this.core.state.fork,
block: null,
hash: null,
seek: null,
upgrade: null,
manifest: this.remoteLength === 0,
priority: 0
};
await this.replicator._txLock.lock();
try {
const remoteLength = Math.max(this.remoteLength, this.pushedLength);
msg.block = {
index,
nodes: MerkleTree.maxMissingNodes(2 * index, remoteLength)
};
if (index >= remoteLength) {
msg.upgrade = {
start: remoteLength,
length: this.core.state.length - remoteLength
};
}
let req = null;
const batch = this.core.storage.read();
try {
req = await this._getProof(batch, msg, true);
} catch (err) {
this.replicator._oninvalidrequest(err, msg, this);
return;
}
if (req === null) return;
batch.tryFlush();
await this._fulfillRequest(req, true);
} finally {
this.replicator._txLock.unlock();
}
}
async _handleRequest(msg) {
const locked = !!msg.upgrade && this.remoteAllowPush;
if (locked) {
await this.replicator._txLock.lock();
const end = msg.upgrade.start + msg.upgrade.length;
if (this.pushedLength < end) {
msg.upgrade.start = this.pushedLength;
msg.upgrade.length = end - this.pushedLength;
}
}
try {
const batch = this.core.storage.read();
const req = msg.fork === this.core.state.fork ? await this._getProof(batch, msg, false) : new ProofRequest(msg, null, null, null);
if (req === null) {
this.wireNoData.send({ request: msg.id, reason: INVALID_REQUEST });
return;
}
batch.tryFlush();
await this._fulfillRequest(req, false);
} finally {
if (locked) this.replicator._txLock.unlock();
}
}
async _fulfillRequest(req, pushing) {
if (this.core._repairMode) {
if (this.remoteRequests.get(req.msg.id) !== req.msg) {
return;
}
this.remoteRequests.delete(req.msg.id);
req.fulfill().catch(safetyCatch);
return;
}
const proof = await req.fulfill();
if (!pushing) {
if (this.remoteRequests.get(req.msg.id) !== req.msg) {
return;
}
this.remoteRequests.delete(req.msg.id);
} else if (!this.remoteAllowPush) {
return;
}
if (!this.isActive() && proof.block !== null) {
return;
}
if (proof === null) {
if (req.msg.manifest && this.core.header.manifest) {
const manifest = this.core.header.manifest;
this.wireData.send({
request: req.msg.id,
fork: this.core.state.fork,
block: null,
hash: null,
seek: null,
upgrade: null,
manifest
});
incrementTx(this.stats.wireData, this.replicator.stats.wireData);
return;
}
this.wireNoData.send({ request: req.msg.id, reason: NOT_AVAILABLE });
return;
}
if (proof.block !== null) {
this.replicator._onupload(proof.block.index, proof.block.value.byteLength, this);
}
if (proof.upgrade) {
const remoteLength = MerkleTree.upgradeLength(proof.upgrade);
if (remoteLength > this.pushedLength) this.pushedLength = remoteLength;
}
this.wireData.send({
request: req.msg.id,
fork: req.msg.fork,
block: proof.block,
hash: proof.hash,
seek: proof.seek,
upgrade: proof.upgrade,
manifest: proof.manifest
});
incrementTx(this.stats.wireData, this.replicator.stats.wireData);
}
_cancelRequest(req) {
if (req.priority === PRIORITY.CANCELLED) return;
req.priority = PRIORITY.CANCELLED;
this.inflight--;
this.replicator._requestDone(req.id, false);
if (isBlockRequest(req)) this.replicator._unmarkInflight(req.block.index);
if (isUpgradeRequest(req)) this.replicator._clearInflightUpgrade(req);
if (this.roundtripQueue === null) this.roundtripQueue = new RoundtripQueue();
this.roundtripQueue.add(req.id);
this.wireCancel.send({ request: req.id });
incrementTx(this.stats.wireCancel, this.replicator.stats.wireCancel);
}
_checkIfConflict() {
this.paused = true;
const length = Math.min(this.core.state.length, this.remoteLength);
if (length === 0) return;
this.wireRequest.send({
id: 0,
// TODO: use an more explicit id for this eventually...
fork: this.remoteFork,
block: null,
hash: null,
seek: null,
upgrade: {
start: 0,
length
}
});
incrementTx(this.stats.wireRequest, this.replicator.stats.wireRequest);
}
_unmarkInflightBlockRequest(req, data) {
if (isBlockRequest(req)) this.replicator._unmarkInflight(req.block.index);
else if (data.block && !req) this.replicator._unmarkInflight(data.block.index);
}
async ondata(data) {
if (data.request !== 0 && !data.upgrade) return this._handleData(data);
await this.replicator._rxLock.lock();
try {
await this._handleData(data);
} finally {
this.replicator._rxLock.unlock();
}
}
async _handleData(data) {
if (data.request === 0 && data.upgrade && data.upgrade.start === 0) {
if (await this.core.checkConflict(data, this)) return;
this.paused = false;
}
const req = data.request > 0 ? this.replicator._inflight.get(data.request) : null;
const reorg = data.fork > this.core.state.fork;
if (req === null && reorg === false && !this.replicator.allowPush) {
return;
}
if (this.core._repairMode) {
this.replicator._onnodata(this, req, NOT_AVAILABLE);
return;
}
if (req === null && reorg === false && data.block) {
this.replicator._markInflight(data.block.index);
}
if (req !== null) {
if (req.peer !== this) return;
this._onrequestroundtrip(req);
}
try {
if (reorg === true) return await this.replicator._onreorgdata(this, req, data);
} catch (err) {
safetyCatch(err);
this._unmarkInflightBlockRequest(req, data);
this.paused = true;
this.replicator._oninvaliddata(err, req, data, this);
return;
}
this.dataProcessing++;
if (isBlockRequest(req)) this.replicator._markProcessing(req.block.index);
try {
if (!this.replicator._matchingRequest(req, data) || !await this.core.verify(data, this)) {
this.replicator._onnodata(this, req, 0);
return;
}
} catch (err) {
safetyCatch(err);
this._unmarkInflightBlockRequest(req, data);
if (err.code === "WRITE_FAILED") {
this.paused = true;
return;
}
if (this.core.closed && !isCriticalError(err)) return;
if (err.code !== "INVALID_OPERATION") {
this._checkIfConflict();
}
if (!this.replicator.allowPush) {
this.paused = true;
}
this.replicator._onnodata(this, req, 0);
this.replicator._oninvaliddata(err, req, data, this);
return;
} finally {
if (isBlockRequest(req)) this.replicator._markProcessed(req.block.index);
this.dataProcessing--;
}
this.replicator._ondata(this, req, data);
if (this._shouldUpdateCanUpgrade() === true) {
this._updateCanUpgradeAndSync();
}
}
onnodata({ request, reason }) {
const req = request > 0 ? this.replicator._inflight.get(request) : null;
if (req === null || req.peer !== this) {
this.replicator.updateAll();
return;
}
this._onrequestroundtrip(req);
this.replicator._onnodata(this, req, reason);
}
_onrequestroundtrip(req) {
if (req.priority === PRIORITY.CANCELLED) return;
req.priority = PRIORITY.CANCELLED;
this.inflight--;
this.replicator._requestDone(req.id, true);
if (this.roundtripQueue === null) return;
const flushed = this.roundtripQueue.flush(req.rt);
if (flushed === null) return;
for (const id of flushed) this.replicator._inflight.reusable(id);
}
onwant(range) {
if (!this.remoteWants.add(range)) return;
this.replicator._onwant(this, range.start, range.length, range.any);
}
onunwant(range) {
this.remoteWants.remove(range);
}
onbitfield({ start, bitfield }) {
if (start < this._remoteContiguousLength) this._remoteContiguousLength = start;
this.remoteBitfield.insert(start, bitfield);
this.missingBlocks.insert(start, bitfield);
this._clearLocalRange(start, bitfield.byteLength * 8);
this._update();
}
_clearLocalRange(start, length) {
const bitfield = this.core.skipBitfield === null ? this.core.bitfield : this.core.skipBitfield;
if (length === 1) {
this.missingBlocks.set(start, this._remoteHasBlock(start) && !bitfield.get(start));
return;
}
const contig = Math.min(this.core.state.length, this.core.header.hints.contiguousLength);
if (start + length < contig) {
this.missingBlocks.setRange(start, contig, false);
return;
}
const rem = start & 32767;
if (rem > 0) {
start -= rem;
length += rem;
}
const end = start + Math.min(length, this.core.state.length);
while (start < end) {
const local = bitfield.getBitfield(start);
if (local && local.bitfield) {
this.missingBlocks.clear(start, local.bitfield);
}
start += 32768;
}
}
_resetMissingBlock(index) {
const bitfield = this.core.skipBitfield === null ? this.core.bitfield : this.core.skipBitfield;
this.missingBlocks.set(index, this._remoteHasBlock(index) && !bitfield.get(index));
}
_unclearLocalRange(start, length) {
if (length === 1) {
this._resetMissingBlock(start);
return;
}
const rem = start & RemoteBitfield.BITS_PER_SEGMENT - 1;
if (rem > 0) {
start -= rem;
length += rem;
}
const fixedStart = start;
const end = start + Math.min(length, this.remoteLength);
while (start < end) {
const remote = this.remoteBitfield.getBitfield(start);
if (remote && remote.bitfield) {
this.missingBlocks.insert(start, remote.bitfield);
}
start += RemoteBitfield.BITS_PER_SEGMENT;
}
this._clearLocalRange(fixedStart, length);
}
async onrange({ drop, start, length }) {
const has = drop === false;
if (drop === true && start < this._remoteContiguousLength) {
this._remoteContiguousLength = start;
}
if (start === 0 && drop === false) {
if (length > this._remoteContiguousLength) {
this._remoteContiguousLength = length;
if (this.remoteFork === this.core.state.fork && length > this.core.header.hints.remoteContiguousLength) {
this.core.updateRemoteContiguousLength(length);
}
}
} else if (length === 1) {
const bitfield = this.core.skipBitfield === null ? this.core.bitfield : this.core.skipBitfield;
this.remoteBitfield.set(start, has);
this.missingBlocks.set(start, has && !bitfield.get(start));
} else {
const rangeStart = this.remoteBitfield.findFirst(!has, start);
const rangeEnd = length + start;
if (rangeStart !== -1 && rangeStart < rangeEnd) {
this.remoteBitfield.setRange(rangeStart, rangeEnd, has);
this.missingBlocks.setRange(rangeStart, rangeEnd, has);
if (has) this._clearLocalRange(rangeStart, rangeEnd - rangeStart);
}
}
if (this.core.hintsChanged) await this.core.flushHints();
if (drop === false) this._update();
this.core.emitRemoteContiguousLength();
}
onreorghint() {
}
_update() {
this.replicator.updatePeer(this);
}
async _onconflict() {
this.protomux.cork();
if (this.remoteLength > 0 && this.core.state.fork === this.remoteFork) {
await this.onrequest({
id: 0,
fork: this.core.state.fork,
block: null,
hash: null,
seek: null,
upgrade: {
start: 0,
length: Math.min(this.core.state.length, this.remoteLength)
}
});
}
this.channel.close();
this.protomux.uncork();
}
_makeRequest(needsUpgrade, priority, minLength) {
if (needsUpgrade === true && this.replicator._shouldUpgrade(this) === false) {
return null;
}
if (this.remoteLength < minLength) {
return null;
}
if (needsUpgrade === false && this.replicator._autoUpgrade(this) === true) {
needsUpgrade = true;
}
return {
peer: this,
rt: this.roundtripQueue === null ? 0 : this.roundtripQueue.tick,
id: 0,
fork: this.remoteFork,
block: null,
hash: null,
seek: null,
upgrade: needsUpgrade === false ? null : { start: this.core.state.length, length: this.remoteLength - this.core.state.length },
// remote manifest check can be removed eventually...
manifest: this.core.header.manifest === null && this.remoteHasManifest === true,
priority,
timestamp: Date.now(),
elapsed: 0
};
}
_requestManifest() {
const req = this._makeRequest(false, 0, 0);
if (req === null) return;
this._send(req);
}
_includeLastBlock() {
if (this.replicator._alwaysLatestBlock === 0) return null;
const index = this.remoteLength - 1;
if (index < this.core.state.length) return null;
if (!this._remoteHasBlock(index)) return null;
if (!this._canRequest(index, false)) return null;
const b = this.replicator._blocks.add(index, PRIORITY.NORMAL, false);
return b;
}
_requestUpgrade(u) {
if (this.replicator.pushOnly) return false;
const req = this._makeRequest(true, 0, 0);
if (req === null) return false;
const b = this._includeLastBlock();
if (b) this._sendBlockRequest(req, b);
else this._send(req);
return true;
}
_requestSeek(s) {
if (this.replicator._updatesPending > 0) return false;
if (this.replicator.pushOnly) return false;
const { length, fork } = this.core.state;
if (fork !== this.remoteFork) return false;
if (s.seeker.start >= length) {
const req = this._makeRequest(true, 0, 0);
if (req === null) return false;
req.seek = this.remoteSupportsSeeks ? { bytes: s.seeker.bytes, padding: s.seeker.padding } : null;
s.inflight.push(req);
this._send(req);
return true;
}
const len = s.seeker.end - s.seeker.start;
const off = s.seeker.start + Math.floor(Math.random() * len);
for (let i = 0; i < len; i++) {
let index = off + i;
if (index > s.seeker.end) index -= len;
if (this._remoteHasBlock(index) === false) continue;
if (this.core.bitfield.get(index) === true) continue;
if (!this._canRequest(index, false)) continue;
const b = this.replicator._blocks.get(index);
if (b !== null && b.inflight.length > 0) continue;
const h = this.replicator._hashes.add(index, PRIORITY.NORMAL, false);
if (h.inflight.length > 0) continue;
const req = this._makeRequest(false, h.priority, index + 1);
if (req === null) continue;
const nodes = flatTree.depth(s.seeker.start + s.seeker.end - 1);
req.hash = { index: 2 * index, nodes };
req.seek = this.remoteSupportsSeeks ? { bytes: s.seeker.bytes, padding: s.seeker.padding } : null;
s.inflight.push(req);
h.inflight.push(req);
this._send(req);
return true;
}
this._maybeWantAnyRange(s.seeker.start, len, s);
return false;
}
_canRequest(index, force) {
if (!(index >= 0)) throw ASSERTION("bad index to _canRequest: " + index);
if (!force && this.replicator.pushOnly) {
return false;
}
if (this.remoteLength >= this.core.state.length) {
return true;
}
if (index < this.lastUpgradableLength && this.lastUpgradableFork === this.core.state.fork) {
return true;
}
if (this.canUpgrade && this.syncsProcessing === 0) {
return true;
}
return false;
}
_remoteHasBlock(index) {
return index < this._remoteContiguousLength || this.remoteBitfield.get(index) === true;
}
_sendBlockRequest(req, b) {
if (this.core._repairMode) return;
req.block = { index: b.index, nodes: 0 };
this.replicator._markInflight(b.index);
b.inflight.push(req);
this.replicator.hotswaps.add(b);
this._send(req);
}
_requestBlock(b) {
const { length, fork } = this.core.state;
if (this._remoteHasBlock(b.index) === false || fork !== this.remoteFork) {
if (!this.core.bitfield.get(b.index)) this._maybeWant(b.index, b);
return false;
}
if (!this._canRequest(b.index, b.force)) return false;
const req = this._makeRequest(b.index >= length, b.priority, b.index + 1);
if (req === null) return false;
this._sendBlockRequest(req, b);
return true;
}
_maybeWant(index, handle) {
if (index < this.remoteContiguousLength) return;
const res = this.wants.add(index, handle);
if (!res) return;
const batch = res.want && res.unwant;
if (batch) this.protomux.cork();
if (res.unwant) {
this.wireUnwant.send(res.unwant);
incrementTx(this.stats.wireUnwant, this.replicator.stats.wireUnwant);
}
if (res.want) {
this.wireWant.send(res.want);
incrementTx(this.stats.wireWant, this.replicator.stats.wireWant);
}
if (batch) this.protomux.uncork();
}
_maybeWantAnyRange(start, length, handle) {
if (handle.wants) {
for (const w2 of handle.wants) {
if ((w2.start !== start || w2.length !== length) && w2.any) {
const req2 = this.wants.removeAnyRange(w2.start, w2.length, handle);
if (req2) this.wireUnwant.send(req2);
}
}
}
if (start + length <= this.remoteContiguousLength) return;
const req = this.wants.addAnyRange(start, length, handle);
if (req) this.wireWant.send(req);
}
_requestRangeBlock(index, length) {
if (this.core.bitfield.get(index) === true || !this._canRequest(index, false)) return false;
const b = this.replicator._blocks.add(index, PRIORITY.NORMAL, false);
if (b.inflight.length > 0) {
this.missingBlocks.set(index, false);
return false;
}
const req = this._makeRequest(index >= length, b.priority, index + 1);
if (req === null) {
b.gc();
return false;
}
this._sendBlockRequest(req, b);
if (b.queued) b.queued = false;
return true;
}
_findNext(i) {
if (i < this._remoteContiguousLength) {
if (this.core.skipBitfield === null) this.replicator._openSkipBitfield();
i = this.core.skipBitfield.findFirst(false, i);
if (i < this._remoteContiguousLength && i > -1) return i;
i = this._remoteContiguousLength;
}
return this.missingBlocks.findFirst(true, i);
}
_addRangeBatch(r, offset, end) {
const { WANT_BATCH } = w;
while (offset < end) {
const next = this.core.bitfield.findFirst(false, offset);
if (next === -1 || next >= end) return false;
const b = (next - (next & WANT_BATCH - 1)) / WANT_BATCH;
if (r.addBatch(b)) return true;
offset = (b + 1) * WANT_BATCH;
}
return false;
}
_populateRangeBatches(r) {
const { WANT_BATCH } = w;
for (let i = r.batches.length - 1; i >= 0; i--) {
const b = r.batches[i];
const minStart = b.batch * WANT_BATCH;
const maxEnd = minStart + WANT_BATCH;
const start = Math.max(r.start, minStart);
const end = Math.min(r.end === -1 ? maxEnd : r.end, maxEnd);
if (start < end && this.core.bitfield.hasUnset(start, end - start)) continue;
r.removeBatch(b);
}
while (r.batches.length < 3) {
const end = r.end === -1 ? this.core.state.length : r.end;
if (end <= r.start) return;
const len = end - r.start;
const off = r.start + (r.linear ? 0 : Math.floor(Math.random() * len));
if (!this._addRangeBatch(r, off, end) && !this._addRangeBatch(r, r.start, end)) break;
}
}
_requestRangeBatch(start, end, length) {
let tries = this.inflight;
do {
start = this._findNext(start);
if (start === -1 || start >= end) break;
if (this._requestRangeBlock(start, length)) return true;
start++;
} while (tries-- > 0);
return false;
}
_getValidEnd(maxEnd) {
const maxLocalLength = this.canUpgrade || this.remoteLength >= this.core.state.length ? this.core.state.length : this.core.state.fork === this.lastUpgradableFork ? Math.min(this.lastUpgradableLength, this.core.state.length) : 0;
return Math.min(
maxLocalLength,
Math.min(maxEnd === -1 ? this.remoteLength : maxEnd, this.remoteLength)
);
}
_requestRange(r) {
const { WANT_BATCH } = w;
if (this.syncsProcessing > 0) return false;
const { length, fork } = this.core.state;
if (r.blocks) {
for (let i = r.start; i < r.end; i++) {
const index = r.blocks[i];
const has = index < this._remoteContiguousLength || this.missingBlocks.get(index) === true;
if (has === true && this._requestRangeBlock(index, length)) return true;
this._maybeWant(index, r);
}
return false;
}
this._populateRangeBatches(r);
const end = this._getValidEnd(r.end);
if (end <= r.start || fork !== this.remoteFork) return false;
for (let i = 0; i < r.batches.length; i++) {
const b = r.batches[i];
const batchStart = Math.max(b.batch * WANT_BATCH, r.start);
const batchEnd = Math.min((b.batch + 1) * WANT_BATCH, end);
const len = batchEnd - batchStart;
const off = batchStart + (r.linear ? 0 : Math.floor(Math.random() * len));
if (this._requestRangeBatch(off, end, length) || this._requestRangeBatch(batchStart, off, length)) {
return true;
}
this._maybeWant(batchStart, b);
}
return false;
}
_requestForkProof(f) {
if (!this.remoteLength) return;
if (this.replicator.pushOnly) return;
const req = this._makeRequest(false, 0, 0);
if (req === null) return;
req.upgrade = { start: 0, length: this.remoteLength };
req.manifest = !this.core.header.manifest;
f.inflight.push(req);
this._send(req);
}
_requestForkRange(f) {
if (f.fork !== this.remoteFork || f.batch.want === null) return false;
if (this.replicator.pushOnly) return false;
const end = Math.min(f.batch.want.end, this.remoteLength);
if (end < f.batch.want.start) return false;
const len = end - f.batch.want.start;
const off = f.batch.want.start + Math.floor(Math.random() * len);
for (let i = 0; i < len; i++) {
let index = off + i;
if (index >= end) index -= len;
if (this._remoteHasBlock(index) === false) continue;
const req = this._makeRequest(false, 0, 0);
if (req === null) return false;
req.hash = { index: 2 * index, nodes: f.batch.want.nodes };
f.inflight.push(req);
this._send(req);
return true;
}
this._maybeWantAnyRange(f.batch.want.start, len, f);
return false;
}
isActive() {
if (this.paused || this.removed || this.core.header.frozen) return false;
return true;
}
async _send(req) {
const fork = this.core.state.fork;
this.inflight++;
this.replicator._inflight.add(req);
if (req.upgrade !== null && req.fork === fork) {
const u = this.replicator._addUpgrade();
u.inflight.push(req);
}
try {
if (req.block !== null && req.fork === fork) {
req.block.nodes = await MerkleTree.missingNodes(
this.core.state,
2 * req.block.index,
this.core.state.length
);
if (req.priority === PRIORITY.CANCELLED) return;
}
if (req.hash !== null && req.fork === fork && req.hash.nodes === 0) {
req.hash.nodes = await MerkleTree.missingNodes(
this.core.state,
req.hash.index,
this.core.state.length
);
if (req.priority === PRIORITY.CANCELLED) return;
if (req.hash.nodes === 0 && (req.hash.index & 1) === 0) {
this.inflight--;
this.replicator._resolveHashLocally(this, req);
return;
}
}
} catch (err) {
this.stream.destroy(err);
return;
}
this.wireRequest.send(req);
incrementTx(this.stats.wireRequest, this.replicator.stats.wireRequest);
}
};
module2.exports = class Replicator {
static Peer = Peer;
// hack to be able to access Peer from outside this module
constructor(core, {
notDownloadingLinger = NOT_DOWNLOADING_SLACK,
eagerUpgrade = true,
allowFork = true,
allowPush = false,
alwaysLatestBlock = false,
inflightRange = null
} = {}) {
this.core = core;
this.eagerUpgrade = eagerUpgrade;
this.allowFork = allowFork;
this.allowPush = allowPush;
this.ondownloading = null;
this.peers = [];
this.findingPeers = 0;
this.destroyed = false;
this.downloading = false;
this.pushOnly = false;
this.activeSessions = 0;
this.hotswaps = new HotswapQueue();
this.inflightRange = inflightRange || DEFAULT_MAX_INFLIGHT;
this.stats = {
wireSync: { tx: 0, rx: 0 },
wireRequest: { tx: 0, rx: 0 },
wireCancel: { tx: 0, rx: 0 },
wireData: { tx: 0, rx: 0 },
wireWant: { tx: 0, rx: 0 },
wireUnwant: { tx: 0, rx: 0 },
wireBitfield: { tx: 0, rx: 0 },
wireRange: { tx: 0, rx: 0 },
wireExtension: { tx: 0, rx: 0 },
hotswaps: 0,
invalidData: 0,
invalidRequests: 0,
backoffs: 0,
notAvailableBackoffs: 0
};
this._attached = /* @__PURE__ */ new Set();
this._inflight = new InflightTracker();
this._blocks = new BlockTracker(this);
this._hashes = new BlockTracker(this);
this._alwaysLatestBlock = alwaysLatestBlock ? 1 : 0;
this._queued = [];
this._seeks = [];
this._upgrade = null;
this._reorgs = [];
this._ranges = [];
this._rxLock = new Mutex();
this._txLock = new Mutex();
this._hadPeers = false;
this._active = 0;
this._ifAvailable = 0;
this._updatesPending = 0;
this._applyingReorg = null;
this._manifestPeer = null;
this._notDownloadingLinger = notDownloadingLinger;
this._notDownloadingTimer = null;
const self = this;
this._onstreamclose = onstreamclose;
function onstreamclose() {
self.detachFrom(this.userData);
}
}
setInflightRange(min, max) {
const def = this.inflightRange;
this.inflightRange = [min, max];
for (const peer of this.peers) {
if (peer.inflightRange !== def) continue;
peer.inflightRange = this.inflightRange;
}
}
updateActivity(inc, session) {
this.activeSessions += inc;
this.setDownloading(this.activeSessions !== 0, session);
}
isDownloading() {
return this.downloading || !this._inflight.idle;
}
async push(index) {
const all = [];
for (const peer of this.peers) {
all.push(peer.push(index));
}
await Promise.all(all);
}
setAllowPush(allowPush) {
if (allowPush === this.allowPush) return;
this.allowPush = allowPush;
for (const peer of this.peers) peer.sendSync();
}
isAllowingPush() {
if (!this.allowPush) return false;
if (this._notDownloadingTimer) return false;
return this.downloading;
}
setPushOnly(pushOnly) {
if (pushOnly === this.pushOnly) return;
this.pushOnly = pushOnly;
}
setDownloading(downloading) {
const allowPush = this.isAllowingPush();
const linger = this._notDownloadingLinger;
if (this._notDownloadingTimer) {
clearTimeout(this._notDownloadingTimer);
this._notDownloadingTimer = null;
}
if (this.destroyed) return;
if (downloading || linger === 0) {
if (!this._setDownloadingNow(downloading)) this.signalAllowPush(allowPush);
return;
}
this._notDownloadingTimer = setTimeout(setNotDownloadingLater, linger, this);
if (this._notDownloadingTimer.unref) this._notDownloadingTimer.unref();
this.signalAllowPush(allowPush);
}
signalAllowPush(allowPush) {
if (allowPush === this.isAllowingPush()) return;
for (const peer of this.peers) peer.signalUpgrade();
}
_setDownloadingNow(downloading) {
this._notDownloadingTimer = null;
if (this.downloading === downloading) return false;
this.downloading = downloading;
if (!downloading && this.isDownloading()) return false;
for (const peer of this.peers) peer.signalUpgrade();
if (downloading) {
for (const protomux of this._attached) {
if (!protomux.stream.handshakeHash) continue;
if (protomux.opened({ protocol: "hypercore/alpha", id: this.core.discoveryKey })) continue;
this._makePeer(protomux, true);
}
} else {
for (const peer of this.peers) peer.closeIfIdle();
}
if (this.ondownloading !== null && downloading) this.ondownloading();
return true;
}
cork() {
for (const peer of this.peers) peer.protomux.cork();
}
uncork() {
for (const peer of this.peers) peer.protomux.uncork();
}
// Called externally when a range of new blocks has been processed/removed
onhave(start, length, drop = false) {
for (const peer of this.peers) peer.broadcastRange(start, length, drop);
}
// Called externally when a truncation upgrade has been processed
ontruncate(newLength, truncated) {
const notify = [];
for (const blk of this._blocks) {
if (blk.index < newLength) continue;
notify.push(blk);
}
for (const blk of notify) {
for (const r of blk.refs) {
if (r.snapshot === false) continue;
blk.detach(r, SNAPSHOT_NOT_AVAILABLE());
}
}
for (const peer of this.peers) {
peer.fullyDownloadedSignaled = Math.min(newLength, peer.fullyDownloadedSignaled);
peer._unclearLocalRange(newLength, truncated);
}
}
// Called externally when a upgrade has been processed
onupgrade() {
for (const peer of this.peers) peer.signalUpgrade();
if (this._blocks.isEmpty() === false) this._resolveBlocksLocally();
if (this._upgrade !== null) this._resolveUpgradeRequest(null);
if (!this._blocks.isEmpty() || this._ranges.length !== 0 || this._seeks.length !== 0) {
this._updateNonPrimary(true);
}
}
// Called externally when a conflict has been detected and verified
async onconflict() {
const all = [];
for (const peer of this.peers) {
all.push(peer._onconflict());
}
await Promise.allSettled(all);
}
async applyPendingReorg() {
if (this._applyingReorg !== null) {
await this._applyingReorg;
return true;
}
for (let i = this._reorgs.length - 1; i >= 0; i--) {
const f = this._reorgs[i];
if (f.batch !== null && f.batch.finished) {
await this._applyReorg(f);
return true;
}
}
return false;
}
addUpgrade(session) {
if (this._upgrade !== null) {
const ref2 = this._upgrade.attach(session);
this._checkUpgradeIfAvailable();
return ref2;
}
const ref = this._addUpgrade().attach(session);
this.updateAll();
return ref;
}
addBlock(session, index, force) {
const b = this._blocks.add(index, PRIORITY.HIGH, force);
const ref = b.attach(session);
this._queueBlock(b);
this.updateAll();
return ref;
}
addSeek(session, seeker) {
const s = new SeekRequest(this, this._seeks, seeker);
const ref = s.attach(session);
this._seeks.push(s);
this.updateAll();
return ref;
}
addRange(session, {
start = 0,
end = -1,
length = toLength(start, end),
blocks = null,
linear = false,
ifAvailable = false
} = {}) {
if (blocks !== null) {
start = 0;
end = length = blocks.length;
}
const r = new RangeRequest(
this,
this._ranges,
start,
length === -1 ? -1 : start + length,
linear,
ifAvailable,
blocks
);
const ref = r.attach(session);
clampRange(this.core, r);
if (r.end !== -1 && r.start >= r.end) {
this._resolveRangeRequest(r);
return ref;
}
this.updateAll();
return ref;
}
cancel(ref) {
ref.context.detach(ref, null);
}
static clearRequests(session, err) {
if (session.length === 0) return;
const updated = /* @__PURE__ */ new Set();
while (session.length > 0) {
const ref = session[session.length - 1];
updated.add(ref.context.replicator);
ref.context.detach(ref, err);
}
for (const replicator of updated) {
replicator.updateAll();
}
}
clearRequests(session, err = null) {
let cleared = false;
while (session.length > 0) {
const ref = session[session.length - 1];
ref.context.detach(ref, err);
cleared = true;
}
if (cleared) this.updateAll();
}
_matchingRequest(req, data) {
if (this.allowPush) {
return true;
}
if (data.block !== null && (req.block === null || req.block.index !== data.block.index)) {
return false;
}
if (data.hash !== null && (req.hash === null || req.hash.index !== data.hash.index)) {
return false;
}
if (data.seek !== null && (req.seek === null || req.seek.bytes !== data.seek.bytes)) {
return false;
}
if (data.upgrade !== null && req.upgrade === null) {
return false;
}
return req.fork === data.fork;
}
_addUpgradeMaybe() {
return this.eagerUpgrade === true ? this._addUpgrade() : this._upgrade;
}
// TODO: this function is OVER called atm, at each updatePeer/updateAll
// instead its more efficient to only call it when the conditions in here change - ie on sync/add/remove peer
// Do this when we have more tests.
_checkUpgradeIfAvailable() {
if (this._ifAvailable > 0 && this.peers.length < MAX_PEERS_UPGRADE) return;
if (this._upgrade === null || this._upgrade.refs.length === 0) return;
if (this._hadPeers === false && this.findingPeers > 0) return;
const maxPeers = Math.min(this.peers.length, MAX_PEERS_UPGRADE);
for (let i = 0; i < maxPeers; i++) {
const peer = this.peers[i];
if (peer.remoteSynced === false) return;
if (this.core.state.length === 0 && peer.remoteLength > 0) return;
if (peer.remoteLength <= this._upgrade.length || peer.remoteFork !== this._upgrade.fork) {
continue;
}
if (peer.syncsProcessing > 0) return;
if (peer.lengthAcked !== this.core.state.length && peer.remoteFork === this.core.state.fork) {
return;
}
if (peer.remoteCanUpgrade === true) return;
}
if (this._applyingReorg !== null) return;
for (let i = 0; i < this._reorgs.length; i++) {
const r = this._reorgs[i];
if (r.inflight.length > 0) return;
}
if (this._upgrade.inflight.length > 0) return;
const u = this._upgrade;
this._upgrade = null;
u.resolve(false);
}
_addUpgrade() {
if (this._upgrade !== null) return this._upgrade;
this._upgrade = new UpgradeRequest(this, this.core.state.fork, this.core.state.length);
return this._upgrade;
}
_addReorg(fork, peer) {
if (this.allowFork === false) return null;
for (const f2 of this._reorgs) {
if (f2.fork > fork && f2.batch !== null) return null;
if (f2.fork === fork) return f2;
}
const f = new ForkRequest(this, fork);
this._reorgs.push(f);
let i = this._reorgs.length - 1;
while (i > 0 && this._reorgs[i - 1].fork > fork) {
this._reorgs[i] = this._reorgs[i - 1];
this._reorgs[--i] = f;
}
return f;
}
_shouldUpgrade(peer) {
if (this._upgrade !== null && this._upgrade.inflight.length > 0) return false;
return peer.remoteCanUpgrade === true && peer.remoteLength > this.core.state.length && peer.lengthAcked === this.core.state.length;
}
_autoUpgrade(peer) {
return this._upgrade !== null && peer.remoteFork === this.core.state.fork && this._shouldUpgrade(peer);
}
_addPeer(peer) {
this._hadPeers = true;
this.peers.push(peer);
this.updatePeer(peer);
this._onpeerupdate(true, peer);
}
_requestDone(id, roundtrip) {
this._inflight.remove(id, roundtrip);
if (this.isDownloading() === true) return;
for (const peer of this.peers) peer.signalUpgrade();
}
_removePeer(peer) {
this.peers.splice(this.peers.indexOf(peer), 1);
peer.wants.destroy();
if (this._manifestPeer === peer) this._manifestPeer = null;
for (const req of this._inflight) {
if (req.peer !== peer) continue;
this._inflight.remove(req.id, true);
this._clearRequest(peer, req);
}
this._onpeerupdate(false, peer);
this.updateAll();
}
_queueBlock(b) {
if (b.inflight.length > 0 || b.queued === true) return;
b.queued = true;
this._queued.push(b);
}
_resolveHashLocally(peer, req) {
this._requestDone(req.id, false);
this._resolveBlockRequest(this._hashes, req.hash.index / 2, null, req);
this.updatePeer(peer);
}
// Runs in the background - not allowed to throw
async _resolveBlocksLocally() {
const clear = [];
const blocks = [];
const reader = this.core.storage.read();
for (const b of this._blocks) {
if (this.core.bitfield.get(b.index) === false) continue;
blocks.push(this._resolveLocalBlock(b, reader, clear));
}
reader.tryFlush();
await Promise.all(blocks);
if (!clear.length) return;
for (const b of clear) {
this._blocks.remove(b.index);
removeHotswap(b);
}
}
async _resolveLocalBlock(b, reader, resolved) {
try {
b.resolve(await reader.getBlock(b.index));
} catch (err) {
b.reject(err);
return;
}
resolved.push(b);
}
_resolveBlockRequest(tracker, index, value, req) {
const b = tracker.remove(index);
if (b === null) return false;
removeInflight(b.inflight, req);
removeHotswap(b);
b.queued = false;
b.resolve(value);
if (b.inflight.length > 0) {
for (let i = b.inflight.length - 1; i >= 0; i--) {
const req2 = b.inflight[i];
req2.peer._cancelRequest(req2);
}
}
return true;
}
_resolveUpgradeRequest(req) {
if (req !== null) removeInflight(this._upgrade.inflight, req);
if (this.core.state.length === this._upgrade.length && this.core.state.fork === this._upgrade.fork) {
return false;
}
const u = this._upgrade;
this._upgrade = null;
u.resolve(true);
return true;
}
_resolveRangeRequest(req) {
req.resolve(true);
req.gc();
}
_clearInflightBlock(tracker, req) {
const isBlock = tracker === this._blocks;
const index = isBlock === true ? req.block.index : req.hash.index / 2;
const b = tracker.get(index);
if (b === null || removeInflight(b.inflight, req) === false) return;
if (removeHotswap(b) === true && b.inflight.length > 0) {
this.hotswaps.add(b);
}
if (b.refs.length > 0 && isBlock === true) {
this._queueBlock(b);
return;
}
b.gc();
}
_clearInflightUpgrade(req) {
if (this._upgrade === null || removeInflight(this._upgrade.inflight, req) === false) return;
this._upgrade.gc();
}
_clearInflightSeeks(req) {
for (const s of this._seeks) {
if (removeInflight(s.inflight, req) === false) continue;
s.gc();
}
}
_clearInflightReorgs(req) {
for (const r of this._reorgs) {
removeInflight(r.inflight, req);
}
}
_clearOldReorgs(fork) {
for (let i = 0; i < this._reorgs.length; i++) {
const f = this._reorgs[i];
if (f.fork >= fork) continue;
if (i === this._reorgs.length - 1) this._reorgs.pop();
else this._reorgs[i] = this._reorgs.pop();
i--;
}
}
// "slow" updates here - async but not allowed to ever throw
async _updateNonPrimary(updateAll) {
while (++this._updatesPending === 1) {
let len = Math.min(MAX_RANGES, this._ranges.length);
for (let i = 0; i < len; i++) {
const r = this._ranges[i];
clampRange(this.core, r);
if (r.end !== -1 && r.start >= r.end) {
this._resolveRangeRequest(r);
i--;
if (len > this._ranges.length) len--;
if (this._ranges.length === MAX_RANGES) updateAll = true;
}
}
for (let i = 0; i < this._seeks.length; i++) {
const s = this._seeks[i];
let err = null;
let res = null;
try {
res = await s.seeker.update();
} catch (error) {
err = error;
}
if (!res && !err) continue;
if (i < this._seeks.length - 1) this._seeks[i] = this._seeks.pop();
else this._seeks.pop();
i--;
if (err) s.reject(err);
else s.resolve(res);
}
if (--this._updatesPending === 0) break;
this._updatesPending = 0;
}
if (this._inflight.idle || updateAll) this.updateAll();
}
_maybeResolveIfAvailableRanges() {
if (this._ifAvailable > 0 || !this._inflight.idle || !this._ranges.length) return;
for (let i = 0; i < this.peers.length; i++) {
if (this.peers[i].dataProcessing > 0) return;
}
for (let i = 0; i < this._ranges.length; i++) {
const r = this._ranges[i];
if (r.ifAvailable) {
this._resolveRangeRequest(r);
i--;
}
}
}
_clearRequest(peer, req) {
if (req.block !== null) {
this._clearInflightBlock(this._blocks, req);
this._unmarkInflight(req.block.index);
}
if (req.hash !== null) {
this._clearInflightBlock(this._hashes, req);
}
if (req.upgrade !== null && this._upgrade !== null) {
this._clearInflightUpgrade(req);
}
if (this._seeks.length > 0) {
this._clearInflightSeeks(req);
}
if (this._reorgs.length > 0) {
this._clearInflightReorgs(req);
}
}
_onnodata(peer, req, reason) {
if (reason === NOT_AVAILABLE) {
peer.stats.notAvailableBackoffs++;
this.stats.notAvailableBackoffs++;
if (peer.stats.notAvailableBackoffs >= MAX_BACKOFFS) {
peer.paused = true;
}
}
if (reason === INVALID_REQUEST) {
peer.stats.backoffs++;
this.stats.backoffs++;
if (peer.stats.backoffs >= MAX_BACKOFFS) {
peer.paused = true;
}
}
if (req) {
this._clearRequest(peer, req);
}
this.updateAll();
}
_openSkipBitfield() {
const bitfield = this.core.openSkipBitfield();
for (const req of this._inflight) {
if (req.block) bitfield.set(req.block.index, true);
}
}
_markProcessing(index) {
const b = this._blocks.get(index);
if (b) {
b.processing = true;
return;
}
const h = this._hashes.get(index);
if (h) h.processing = true;
}
_markProcessed(index) {
const b = this._blocks.get(index);
if (b) return b.processed();
const h = this._hashes.get(index);
if (h) h.processed();
}
_markInflight(index) {
if (this.core.skipBitfield !== null) this.core.skipBitfield.set(index, true);
for (const peer of this.peers) peer._markInflight(index);
}
_unmarkInflight(index) {
if (this.core.skipBitfield !== null) {
this.core.skipBitfield.set(index, this.core.bitfield.get(index));
}
for (const peer of this.peers) peer._resetMissingBlock(index);
}
_ondata(peer, req, data) {
if (req) {
req.elapsed = Date.now() - req.timestamp;
}
if (data.block !== null) {
this._resolveBlockRequest(this._blocks, data.block.index, data.block.value, req);
this._ondownload(data.block.index, data.block.value.byteLength, peer, req);
}
if (data.hash !== null && (data.hash.index & 1) === 0) {
this._resolveBlockRequest(this._hashes, data.hash.index / 2, null, req);
}
if (this._upgrade !== null) {
this._resolveUpgradeRequest(req);
}
if (this._seeks.length > 0) {
this._clearInflightSeeks(req);
}
if (this._reorgs.length > 0) {
this._clearInflightReorgs(req);
}
if (this._manifestPeer === peer && this.core.header.manifest !== null) {
this._manifestPeer = null;
}
if (this._seeks.length > 0 || this._ranges.length > 0) {
this._updateNonPrimary(this._seeks.length > 0);
}
this.updatePeer(peer);
}
_onwant(peer, start, length, any) {
if (!peer.isActive()) return;
const contig = Math.min(this.core.state.length, this.core.header.hints.contiguousLength);
if (start + length < contig || this.core.state.length === contig || any && start < contig) {
peer.wireRange.send({
drop: false,
start: 0,
length: contig
});
incrementTx(peer.stats.wireRange, this.stats.wireRange);
return;
}
length = Math.min(length, this.core.state.length - start);
if (any) {
const bit = this.core.bitfield.firstSet(start);
if (bit > -1 && bit < start + length) {
peer.wireRange.send({
drop: false,
start: bit,
length: 1
});
}
return;
}
for (const msg of this.core.bitfield.want(start, length)) {
peer.wireBitfield.send(msg);
incrementTx(peer.stats.wireBitfield, this.stats.wireBitfield);
}
}
async _onreorgdata(peer, req, data) {
const newBatch = data.upgrade && await this.core.verifyReorg(data);
const f = this._addReorg(data.fork, peer);
if (f === null) {
this.updateAll();
return;
}
removeInflight(f.inflight, req);
if (f.batch) {
await f.batch.update(data);
} else if (data.upgrade) {
f.batch = newBatch;
this._clearOldReorgs(f.fork);
}
if (f.batch && f.batch.finished) {
if (this._addUpgradeMaybe() !== null) {
await this._applyReorg(f);
}
}
this.updateAll();
}
// Never throws, allowed to run in the background
async _applyReorg(f) {
const u = this._upgrade;
const old = this._reorgs;
this._reorgs = [];
this._applyingReorg = this.core.reorg(f.batch, null);
try {
await this._applyingReorg;
} catch (err) {
this._upgrade = null;
u.reject(err);
}
this._applyingReorg = null;
if (this._upgrade !== null) {
this._resolveUpgradeRequest(null);
}
for (const peer of this.peers) this._updateFork(peer);
for (const r of this._ranges) {
r.start = r.userStart;
r.end = r.userEnd;
}
for (const f2 of old) f2.resolve();
f.resolve();
this.updateAll();
}
_maybeUpdate() {
return this._upgrade !== null && this._upgrade.inflight.length === 0;
}
_maybeRequestManifest() {
return this.core.header.manifest === null && this._manifestPeer === null;
}
_updateFork(peer) {
if (this._applyingReorg !== null || this.allowFork === false || peer.remoteFork <= this.core.state.fork) {
return false;
}
const f = this._addReorg(peer.remoteFork, peer);
if (f !== null && f.batch === null && f.inflight.length === 0) {
return peer._requestForkProof(f);
}
return false;
}
_updateHotswap(peer) {
const maxHotswaps = peer.getMaxHotswapInflight();
if (!peer.isActive() || peer.inflight >= maxHotswaps) return;
for (const b of this.hotswaps.pick(peer)) {
if (peer._requestBlock(b) === false) continue;
peer.stats.hotswaps++;
peer.replicator.stats.hotswaps++;
if (peer.inflight >= maxHotswaps) break;
}
}
_updatePeer(peer) {
if (!peer.isActive() || peer.inflight >= peer.getMaxInflight() || !peer.remoteUploading) {
return false;
}
if (this._maybeRequestManifest() === true && peer.remoteLength === 0 && peer.remoteHasManifest === true) {
this._manifestPeer = peer;
peer._requestManifest();
}
for (const s of this._seeks) {
if (s.inflight.length > 0) continue;
if (peer._requestSeek(s) === true) {
return true;
}
}
const blks = new RandomIterator(this._queued);
for (const b of blks) {
if (b.queued === false || peer._requestBlock(b) === true) {
b.queued = false;
blks.dequeue();
return true;
}
}
return false;
}
_updatePeerNonPrimary(peer) {
if (!peer.isActive() || peer.inflight >= peer.getMaxInflight() || !peer.remoteUploading) {
return false;
}
const ranges = new RandomIterator(this._ranges);
let tried = 0;
for (const r of ranges) {
if (peer._requestRange(r) === true) {
return true;
}
if (++tried >= MAX_RANGES) break;
}
for (let i = this._reorgs.length - 1; i >= 0; i--) {
const f = this._reorgs[i];
if (f.batch !== null && f.inflight.length === 0 && peer._requestForkRange(f) === true) {
return true;
}
}
if (this._maybeUpdate() === true && peer._requestUpgrade(this._upgrade) === true) {
return true;
}
return false;
}
updatePeer(peer) {
if (this._applyingReorg !== null) return;
while (this._updatePeer(peer) === true) ;
while (this._updatePeerNonPrimary(peer) === true) ;
if (this.peers.length > 1 && this._blocks.isEmpty() === false) {
this._updateHotswap(peer);
}
this._checkUpgradeIfAvailable();
this._maybeResolveIfAvailableRanges();
}
updateAll() {
if (this._applyingReorg !== null) return;
const peers = new RandomIterator(this.peers);
for (const peer of peers) {
if (this._updatePeer(peer) === true) {
peers.requeue();
}
}
if (this._maybeUpdate() === false && this._ranges.length === 0 && this._reorgs.length === 0) {
this._checkUpgradeIfAvailable();
return;
}
for (const peer of peers.restart()) {
if (this._updatePeerNonPrimary(peer) === true) {
peers.requeue();
}
}
this._checkUpgradeIfAvailable();
this._maybeResolveIfAvailableRanges();
}
onpeerdestroy() {
if (--this._active === 0) this.core.checkIfIdle();
}
attached(protomux) {
return this._attached.has(protomux);
}
attachTo(protomux) {
if (this.core.closed) return;
const makePeer = this._makePeer.bind(this, protomux);
this._attached.add(protomux);
protomux.pair({ protocol: "hypercore/alpha", id: this.core.discoveryKey }, makePeer);
protomux.stream.setMaxListeners(0);
protomux.stream.on("close", this._onstreamclose);
this._ifAvailable++;
this._active++;
protomux.stream.opened.then((opened) => {
this._ifAvailable--;
this._active--;
if (opened && !this.destroyed) makePeer();
this._checkUpgradeIfAvailable();
this.core.checkIfIdle();
});
}
detachFrom(protomux) {
if (this._attached.delete(protomux)) {
protomux.stream.removeListener("close", this._onstreamclose);
protomux.unpair({ protocol: "hypercore/alpha", id: this.core.discoveryKey });
}
}
idle() {
return this.peers.length === 0 && this._active === 0;
}
close() {
const waiting = [];
for (const peer of this.peers) {
waiting.push(peer.channel.fullyClosed());
}
this.destroy();
return Promise.all(waiting);
}
destroy() {
if (this.destroyed) return;
this.destroyed = true;
if (this._notDownloadingTimer) {
clearTimeout(this._notDownloadingTimer);
this._notDownloadingTimer = null;
}
while (this.peers.length) {
const peer = this.peers[this.peers.length - 1];
this.detachFrom(peer.protomux);
peer.channel.close();
}
for (const protomux of this._attached) {
this.detachFrom(protomux);
}
}
_makePeer(protomux) {
const replicator = this;
if (protomux.opened({ protocol: "hypercore/alpha", id: this.core.discoveryKey })) {
return onnochannel();
}
const channel = protomux.createChannel({
userData: null,
protocol: "hypercore/alpha",
aliases: ["hypercore"],
id: this.core.discoveryKey,
handshake: m.wire.handshake,
messages: [
{ encoding: m.wire.sync, onmessage: onwiresync },
{ encoding: m.wire.request, onmessage: onwirerequest },
{ encoding: m.wire.cancel, onmessage: onwirecancel },
{ encoding: m.wire.data, onmessage: onwiredata },
{ encoding: m.wire.noData, onmessage: onwirenodata },
{ encoding: m.wire.want, onmessage: onwirewant },
{ encoding: m.wire.unwant, onmessage: onwireunwant },
{ encoding: m.wire.bitfield, onmessage: onwirebitfield },
{ encoding: m.wire.range, onmessage: onwirerange },
{ encoding: m.wire.extension, onmessage: onwireextension }
],
onopen: onwireopen,
onclose: onwireclose,
ondrain: onwiredrain,
ondestroy: onwiredestroy
});
if (channel === null) return onnochannel();
const peer = new Peer(replicator, protomux, channel, this.inflightRange);
const stream = protomux.stream;
peer.channel.open({
seeks: true,
capability: caps.replicate(stream.isInitiator, this.core.key, stream.handshakeHash)
});
return true;
function onnochannel() {
return false;
}
}
_onpeerupdate(added, peer) {
const name = added ? "peer-add" : "peer-remove";
const sessions = this.core.monitors;
for (let i = sessions.length - 1; i >= 0; i--) {
sessions[i].emit(name, peer);
if (added) {
for (const ext of sessions[i].extensions.values()) {
peer.extensions.set(ext.name, ext);
}
}
}
}
_ondownload(index, byteLength, from, req) {
const sessions = this.core.monitors;
for (let i = sessions.length - 1; i >= 0; i--) {
const s = sessions[i];
s.emit("download", index, byteLength - s.padding, from, req);
}
}
_onupload(index, byteLength, from) {
const sessions = this.core.monitors;
for (let i = sessions.length - 1; i >= 0; i--) {
const s = sessions[i];
s.emit("upload", index, byteLength - s.padding, from);
}
}
_oninvaliddata(err, req, res, from) {
const sessions = this.core.monitors;
this.stats.invalidData++;
from.stats.invalidData++;
for (let i = 0; i < sessions.length; i++) {
sessions[i].emit("verification-error", err, req, res, from);
}
}
_oninvalidrequest(err, req, from) {
const sessions = this.core.monitors;
from.stats.invalidRequests++;
this.stats.invalidRequests++;
for (let i = 0; i < sessions.length; i++) {
sessions[i].emit("invalid-request", err, req, from);
}
}
};
function removeHotswap(block) {
if (block.hotswap === null) return false;
block.hotswap.ref.remove(block);
return true;
}
function removeInflight(inf, req) {
const i = inf.indexOf(req);
if (i === -1) return false;
if (i < inf.length - 1) inf[i] = inf.pop();
else inf.pop();
return true;
}
function toLength(start, end) {
return end === -1 ? -1 : end < start ? 0 : end - start;
}
function clampRange(core, r) {
if (r.blocks === null) {
const start = core.bitfield.firstUnset(r.start);
if (r.end === -1) r.start = start === -1 ? core.state.length : start;
else if (start === -1 || start >= r.end) r.start = r.end;
else {
r.start = start;
const end = core.bitfield.lastUnset(r.end - 1);
if (end === -1 || start >= end + 1) r.end = r.start;
else r.end = end + 1;
}
} else {
while (r.start < r.end && core.bitfield.get(r.blocks[r.start])) r.start++;
while (r.start < r.end && core.bitfield.get(r.blocks[r.end - 1])) r.end--;
}
}
function onrequesttimeout(req) {
if (req.context) req.context.detach(req, REQUEST_TIMEOUT());
}
function destroyRequestTimeout(req) {
if (req.timeout !== null) {
clearTimeout(req.timeout);
req.timeout = null;
}
}
function isCriticalError(err) {
return err.name === "HypercoreError";
}
function onwireopen(m2, c4) {
return c4.userData.onopen(m2);
}
function onwireclose(isRemote, c4) {
return c4.userData.onclose(isRemote);
}
function onwiredestroy(c4) {
c4.userData.replicator.onpeerdestroy();
}
function onwiredrain(c4) {
return c4.userData.ondrain();
}
function onwiresync(m2, c4) {
incrementRx(c4.userData.stats.wireSync, c4.userData.replicator.stats.wireSync);
return c4.userData.onsync(m2);
}
function onwirerequest(m2, c4) {
incrementRx(c4.userData.stats.wireRequest, c4.userData.replicator.stats.wireRequest);
return c4.userData.onrequest(m2);
}
function onwirecancel(m2, c4) {
incrementRx(c4.userData.stats.wireCancel, c4.userData.replicator.stats.wireCancel);
return c4.userData.oncancel(m2);
}
function onwiredata(m2, c4) {
incrementRx(c4.userData.stats.wireData, c4.userData.replicator.stats.wireData);
return c4.userData.ondata(m2);
}
function onwirenodata(m2, c4) {
return c4.userData.onnodata(m2);
}
function onwirewant(m2, c4) {
incrementRx(c4.userData.stats.wireWant, c4.userData.replicator.stats.wireWant);
return c4.userData.onwant(m2);
}
function onwireunwant(m2, c4) {
return c4.userData.onunwant(m2);
}
function onwirebitfield(m2, c4) {
incrementRx(c4.userData.stats.wireBitfield, c4.userData.replicator.stats.wireBitfield);
return c4.userData.onbitfield(m2);
}
function onwirerange(m2, c4) {
incrementRx(c4.userData.stats.wireRange, c4.userData.replicator.stats.wireRange);
return c4.userData.onrange(m2);
}
function onwireextension(m2, c4) {
incrementRx(c4.userData.stats.wireExtension, c4.userData.replicator.stats.wireExtension);
return c4.userData.onextension(m2);
}
function setNotDownloadingLater(repl, session) {
repl._setDownloadingNow(false, session);
}
function isBlockRequest(req) {
return req !== null && req.block !== null;
}
function isUpgradeRequest(req) {
return req !== null && req.upgrade !== null;
}
function incrementTx(stats1, stats2) {
stats1.tx++;
stats2.tx++;
}
function incrementRx(stats1, stats2) {
stats1.rx++;
stats2.rx++;
}
function noop() {
}
function backoff(times) {
const sleep = times < 2 ? 200 : times < 5 ? 500 : times < 40 ? 1e3 : 5e3;
return new Promise((resolve) => setTimeout(resolve, sleep));
}
}
});
// node_modules/hypercore/lib/core.js
var require_core = __commonJS({
"node_modules/hypercore/lib/core.js"(exports2, module2) {
var crypto = require_hypercore_crypto();
var b4a4 = require_b4a();
var unslab = require_unslab();
var z322 = require_z32();
var Mutex = require_mutex();
var { MerkleTree, ReorgBatch } = require_merkle_tree();
var BitInterlude = require_bit_interlude();
var Bitfield = require_bitfield();
var RemoteBitfield = require_remote_bitfield();
var {
BAD_ARGUMENT,
STORAGE_EMPTY,
STORAGE_CONFLICT,
INVALID_SIGNATURE,
INVALID_CHECKSUM
} = require_hypercore_errors();
var Verifier = require_verifier();
var audit = require_audit();
var copyPrologue = require_copy_prologue();
var SessionState = require_session_state();
var Replicator = require_replicator();
module2.exports = class Core {
constructor(db, opts = {}) {
this.db = db;
this.storage = null;
this.replicator = new Replicator(this, opts);
this.sessionStates = [];
this.monitors = [];
this.activeSessions = 0;
this.gc = 0;
this.id = opts.key ? z322.encode(opts.key) : null;
this.key = opts.key || null;
this.discoveryKey = opts.discoveryKey || opts.key && crypto.discoveryKey(opts.key) || null;
this.manifest = null;
this.opening = null;
this.closing = null;
this.exclusive = null;
this.preupdate = null;
this.header = null;
this.compat = false;
this.bitfield = null;
this.verifier = null;
this.truncating = 0;
this.skipBitfield = null;
this.globalCache = opts.globalCache || null;
this.autoClose = opts.autoClose !== false;
this.onidle = noop;
this.state = null;
this.opened = false;
this.destroyed = false;
this.closed = false;
this.hintsChanged = false;
this.remoteContiguousLengthChanged = false;
this._bitfield = null;
this._verifies = null;
this._verifiesFlushed = null;
this._legacy = !!opts.legacy;
this._repairMode = false;
this.opening = this._open(opts);
this.opening.catch(noop);
}
static setRecoveryPeers(peers) {
SessionState.RECOVERY_PEERS = peers;
}
ready() {
return this.opening;
}
addMonitor(s) {
if (s._monitorIndex >= 0) return;
s._monitorIndex = this.monitors.push(s) - 1;
}
removeMonitor(s) {
if (s._monitorIndex < 0) return;
const head = this.monitors.pop();
if (head !== s) this.monitors[head._monitorIndex = s._monitorIndex] = head;
s._monitorIndex = -1;
}
emitRemoteContiguousLength() {
if (!this.remoteContiguousLengthChanged) return;
this.remoteContiguousLengthChanged = false;
const length = this.header.hints.remoteContiguousLength;
for (let i = this.monitors.length - 1; i >= 0; i--) {
this.monitors[i].emit("remote-contiguous-length", length);
}
}
emitManifest() {
for (let i = this.monitors.length - 1; i >= 0; i--) {
this.monitors[i].emit("manifest");
}
}
createUserDataStream(opts, session = this.state) {
return session.storage.createUserDataStream(opts);
}
allSessions() {
const sessions = [];
for (const state of this.sessionStates) {
if (state.sessions.length) sessions.push(...state.sessions);
}
return sessions;
}
hasSession() {
return this.activeSessions !== 0;
}
compact() {
const compacting = [];
for (const s of this.sessionStates) {
compacting.push(s.storage.compact());
}
return Promise.all(compacting);
}
checkIfIdle() {
if (!this.opened || this.destroyed === true || this.hasSession() === true) return;
if (this.replicator.idle() === false) return;
if (this.state === null || this.state.mutex.idle() === false) return;
this.onidle();
}
async lockExclusive() {
if (this.exclusive === null) this.exclusive = new Mutex();
await this.exclusive.lock();
}
unlockExclusive() {
if (this.exclusive !== null) this.exclusive.unlock();
}
async _open(opts) {
try {
await this._tryOpen(opts);
} catch (err) {
this.onidle();
throw err;
}
this.opened = true;
}
async _tryOpen(opts) {
if (opts.preopen) await opts.preopen;
let storage = await this.db.resumeCore(this.discoveryKey);
let overwrite = opts.overwrite === true;
const force = opts.force === true;
const createIfMissing = opts.createIfMissing !== false;
const legacy = !!opts.legacy;
let compat = opts.compat === true || opts.compat !== false && !opts.manifest;
let header = storage ? parseHeader(await getCoreInfo(storage)) : null;
const hadManifest = !!header && !!header.manifest && !!header.key;
const hadKeyPair = !!header && !!header.keyPair;
if (force && opts.key && header && !b4a4.equals(header.key, opts.key)) {
overwrite = true;
}
if (!header && opts.discoveryKey && !(opts.key || opts.manifest)) {
throw STORAGE_EMPTY("No Hypercore is stored here", this.discoveryKey);
}
if (!header || overwrite) {
if (!createIfMissing) {
throw STORAGE_EMPTY("No Hypercore is stored here", this.discoveryKey);
}
if (compat) {
if (opts.key && opts.keyPair && !b4a4.equals(opts.key, opts.keyPair.publicKey)) {
throw BAD_ARGUMENT("Key must match publicKey when in compat mode", this.discoveryKey);
}
}
const keyPair = opts.keyPair || (opts.key ? null : crypto.keyPair());
const defaultManifest = !opts.manifest && (!!opts.compat || !opts.key || !!(keyPair && b4a4.equals(opts.key, keyPair.publicKey)));
const manifest = defaultManifest ? Verifier.defaultSignerManifest(opts.key || keyPair.publicKey) : Verifier.createManifest(opts.manifest);
header = {
key: opts.key || (compat ? manifest.signers[0].publicKey : Verifier.manifestHash(manifest)),
manifest,
keyPair: keyPair ? { publicKey: keyPair.publicKey, secretKey: keyPair.secretKey || null } : null,
frozen: false,
tree: {
fork: 0,
length: 0,
rootHash: null,
signature: null
},
hints: {
reorgs: [],
contiguousLength: 0,
remoteContiguousLength: 0,
recovering: 0
}
};
const discoveryKey = opts.discoveryKey || crypto.discoveryKey(header.key);
storage = await this.db.createCore({
key: header.key,
manifest,
keyPair,
frozen: false,
discoveryKey,
userData: opts.userData || [],
alias: opts.alias || null
});
}
header.key = unslab(header.key);
if (header.tree) {
header.tree.rootHash = unslab(header.tree.rootHash);
header.tree.signature = unslab(header.tree.signature);
}
if (header.keyPair) {
header.keyPair.publicKey = unslab(header.keyPair.publicKey);
header.keyPair.secretKey = unslab(header.keyPair.secretKey);
}
if (header.keyPair) {
header.keyPair.publicKey = unslab(header.keyPair.publicKey);
header.keyPair.secretKey = unslab(header.keyPair.secretKey);
}
if (opts.manifest) {
if (!opts.key && !Verifier.isValidManifest(header.key, Verifier.createManifest(opts.manifest))) {
throw STORAGE_CONFLICT("Manifest does not hash to provided key", this.discoveryKey);
}
if (!header.manifest) header.manifest = opts.manifest;
}
if (opts.key && !b4a4.equals(header.key, opts.key)) {
throw STORAGE_CONFLICT("Another Hypercore is stored here", this.discoveryKey);
}
if (compat && header.manifest && !Verifier.isCompat(header.key, header.manifest)) {
compat = false;
} else if (!compat && header.manifest && Verifier.isCompat(header.key, header.manifest)) {
compat = true;
}
const prologue = header.manifest ? header.manifest.prologue : null;
const bitfield = await Bitfield.open(storage, header.tree.length);
const treeInfo = {
fork: header.tree.fork,
length: header.tree.length,
signature: header.tree.signature,
roots: await maybeGetRootsFromStorage(storage, header.tree.length),
prologue
};
this._repairMode = !treeInfo.roots.length && treeInfo.length && !overwrite;
if (this._repairMode) {
this.replicator.setPushOnly(true);
}
if (overwrite) {
const tx = storage.write();
tx.deleteTreeNodeRange(0, -1);
tx.deleteBlockRange(0, -1);
bitfield.clear(tx);
await tx.flush();
}
const len = bitfield.findFirst(false, header.hints.contiguousLength);
if (header.hints.contiguousLength !== len && !storage.readOnly) {
header.hints.contiguousLength = len;
const tx = storage.write();
tx.setHints(header.hints);
await tx.flush();
}
if (header.manifest) {
header.manifest = Verifier.createManifest(header.manifest);
if (!hadManifest || header.keyPair && !hadKeyPair) {
const tx = storage.write();
tx.setAuth({
key: header.key,
discoveryKey: crypto.discoveryKey(header.key),
manifest: header.manifest,
keyPair: header.keyPair
});
await tx.flush();
}
}
const verifier = header.manifest ? new Verifier(header.key, header.manifest, { crypto, legacy }) : null;
this.storage = storage;
this.header = header;
this.compat = compat;
this.bitfield = bitfield;
this.verifier = verifier;
this.state = new SessionState(this, null, storage, treeInfo, null);
if (this.key === null) this.key = this.header.key;
if (this.discoveryKey === null) this.discoveryKey = crypto.discoveryKey(this.key);
if (this.id === null) this.id = z322.encode(this.key);
if (this.manifest === null) this.manifest = this.header.manifest;
}
async audit(opts) {
await this.state.mutex.lock();
try {
return await audit(this, opts);
} finally {
this.state._unlock();
}
}
async setManifest(manifest) {
await this.state.mutex.lock();
try {
if (manifest && this.header.manifest === null) {
if (!Verifier.isValidManifest(this.header.key, manifest)) {
throw INVALID_CHECKSUM("Manifest hash does not match", this.discoveryKey);
}
const tx = this.state.createWriteBatch();
this._setManifest(tx, Verifier.createManifest(manifest), null);
await this.state.flush();
}
} finally {
this.state._unlock();
}
}
_setManifest(tx, manifest, keyPair) {
if (!manifest && b4a4.equals(keyPair.publicKey, this.header.key)) {
manifest = Verifier.defaultSignerManifest(this.header.key);
}
if (!manifest) return;
const verifier = new Verifier(this.header.key, manifest, { legacy: this._legacy });
if (verifier.prologue) this.state.prologue = Object.assign({}, verifier.prologue);
this.manifest = this.header.manifest = manifest;
tx.setAuth({
key: this.header.key,
discoveryKey: this.discoveryKey,
manifest,
keyPair: this.header.keyPair
// TODO: encryptionKey?
});
this.compat = verifier.compat;
this.verifier = verifier;
this.replicator.onupgrade();
this.emitManifest();
}
async copyPrologue(src) {
await this.state.mutex.lock();
try {
await src.mutex.lock();
} catch (err) {
this.state.mutex.unlock();
throw err;
}
try {
await copyPrologue(src, this);
} finally {
src.mutex.unlock();
this.state.mutex.unlock();
this.checkIfIdle();
}
}
flushed() {
return this.state.flushed();
}
async _validateCommit(state, treeLength) {
if (this.state.length > state.length) {
return false;
}
if (this.state.length > treeLength) {
for (const root of this.state.roots) {
const batchRoot = await MerkleTree.get(state, root.index);
if (batchRoot.size !== root.size || !b4a4.equals(batchRoot.hash, root.hash)) {
return false;
}
}
}
if (this.verifier === null) {
return false;
}
return true;
}
_verifyBatchUpgrade(batch, manifest) {
if (!this.header.manifest) {
if (!manifest) manifest = Verifier.defaultSignerManifest(this.header.key);
if (!manifest || !(Verifier.isValidManifest(this.header.key, manifest) || Verifier.isCompat(this.header.key, manifest))) {
throw INVALID_SIGNATURE("Proof contains an invalid manifest", this.discoveryKey);
}
}
const verifier = this.verifier || new Verifier(this.header.key, Verifier.createManifest(manifest), { legacy: this._legacy });
if (!verifier.verify(batch, batch.signature)) {
throw INVALID_SIGNATURE("Proof contains an invalid signature", this.discoveryKey);
}
return manifest;
}
async _verifyExclusive({ batch, bitfield, value, manifest }) {
manifest = this._verifyBatchUpgrade(batch, manifest);
if (!await this.state._verifyBlock(
batch,
bitfield,
value,
this.header.manifest ? null : manifest
)) {
return false;
}
if (!batch.upgraded && bitfield) {
this.replicator.onhave(bitfield.start, bitfield.length, bitfield.drop);
}
return true;
}
async _verifyShared() {
if (!this._verifies.length) return false;
await this.state.mutex.lock();
const tx = this.state.createWriteBatch();
const verifies = this._verifies;
this._verifies = null;
this._verified = null;
try {
for (const { batch, bitfield, value } of verifies) {
if (!batch.commitable()) continue;
if (bitfield) {
tx.putBlock(bitfield.start, value);
}
}
const bits = new BitInterlude();
for (let i = 0; i < verifies.length; i++) {
const { batch, bitfield, manifest } = verifies[i];
if (!batch.commitable()) {
verifies[i] = null;
continue;
}
if (bitfield) {
bits.setRange(bitfield.start, bitfield.start + 1, true);
}
if (manifest && this.header.manifest === null) {
if (!Verifier.isValidManifest(this.header.key, manifest)) {
throw INVALID_CHECKSUM("Manifest hash does not match", this.discoveryKey);
}
this._setManifest(tx, manifest, null);
}
if (batch.commitable()) batch.commit(tx);
}
const ranges = bits.flush(tx, this.bitfield);
await this.state.flush();
for (const { start, end, value } of ranges) {
this._setBitfieldRanges(start, end, value);
}
for (let i = 0; i < verifies.length; i++) {
const bitfield = verifies[i] && verifies[i].bitfield;
if (bitfield) {
this.updateContiguousLength(bitfield);
this.replicator.onhave(bitfield.start, bitfield.length, bitfield.drop);
}
}
if (this.hintsChanged) await this.flushHints();
} finally {
this.state._clearActiveBatch();
this.state.mutex.unlock();
}
return verifies[0] !== null;
}
async flushHints() {
if (!this.hintsChanged) return;
this.hintsChanged = false;
const tx = this.state.storage.write();
tx.setHints({
contiguousLength: this.header.hints.contiguousLength,
remoteContiguousLength: this.header.hints.remoteContiguousLength,
recovering: this.header.hints.recovering
});
await tx.flush();
}
async checkConflict(proof, from) {
if (this.state.length < proof.upgrade.length || proof.fork !== this.state.fork) {
return false;
}
if (!this.header.manifest) {
return false;
}
const batch = MerkleTree.verifyFullyRemote(this.state, proof);
try {
this._verifyBatchUpgrade(batch, proof.manifest);
} catch {
return true;
}
const roots = await maybeGetRootsFromStorage(this.storage, proof.upgrade.length);
const remoteTreeHash = crypto.tree(proof.upgrade.nodes);
const localTreeHash = crypto.tree(roots);
try {
const rx = this.state.storage.read();
const treeProofPromise = MerkleTree.proof(this.state, rx, {
block: null,
hash: null,
seek: null,
upgrade: {
start: 0,
length: proof.upgrade.length
}
});
rx.tryFlush();
const treeProof = await treeProofPromise;
const verifyBatch = MerkleTree.verifyFullyRemote(this.state, await treeProof.settle());
this._verifyBatchUpgrade(verifyBatch, this.header.manifest);
} catch (err) {
if (err.code !== "INVALID_OPERATION") return true;
return !await this._repairTreeNodes(proof);
}
if (b4a4.equals(localTreeHash, remoteTreeHash)) return false;
await this.state.mutex.lock();
try {
const tx = this.state.createWriteBatch();
this.header.frozen = true;
tx.setAuth({
key: this.header.key,
discoveryKey: this.discoveryKey,
manifest: this.header.manifest,
keyPair: this.header.keyPair,
frozen: true
});
await this.state.flush();
} finally {
this.state.mutex.unlock();
}
const id = b4a4.toString(this.discoveryKey, "hex");
console.log(
"[hypercore] conflict detected in " + id + " (writable=" + !!this.header.keyPair + ",quorum=" + this.header.manifest.quorum + ")"
);
await this._onconflict(proof);
return true;
}
async _repairTreeNodes(proof) {
if (!this._repairMode) return false;
await this.state.mutex.lock();
for (let i = this.monitors.length - 1; i >= 0; i--) {
this.monitors[i].emit("repairing", proof);
}
try {
const batch = MerkleTree.verifyFullyRemote(this.state, proof);
this._verifyBatchUpgrade(batch, proof.manifest);
} catch {
this.state.mutex.unlock();
for (let i = this.monitors.length - 1; i >= 0; i--) {
this.monitors[i].emit("repair-failed");
}
return false;
}
const atom = this.storage.createAtom();
const atomized = this.storage.atomize(atom);
const tx = atomized.write();
for (const node of proof.upgrade.nodes) {
tx.putTreeNode(node);
}
await tx.flush();
try {
const rx = atomized.read();
const treeProofPromise = MerkleTree.proof(this.state, rx, {
block: null,
hash: null,
seek: null,
upgrade: {
start: 0,
length: proof.upgrade.length
}
});
rx.tryFlush();
const treeProof = await treeProofPromise;
const verifyBatch = MerkleTree.verifyFullyRemote(this.state, await treeProof.settle());
this._verifyBatchUpgrade(verifyBatch, this.header.manifest);
} catch (err) {
this.state.mutex.unlock();
for (let i = this.monitors.length - 1; i >= 0; i--) {
this.monitors[i].emit("repair-failed");
}
return false;
}
await atom.flush();
for (let i = this.monitors.length - 1; i >= 0; i--) {
this.monitors[i].emit("repaired", proof);
}
this.replicator.setPushOnly(false);
this.state.mutex.unlock();
return true;
}
async verifyReorg(proof) {
const batch = new ReorgBatch(this.state);
await MerkleTree.reorg(this.state, proof, batch);
const manifest = this._verifyBatchUpgrade(batch, proof.manifest);
if (manifest && !this.header.manifest) {
await this.state.mutex.lock();
try {
if (manifest && this.header.manifest === null) {
const tx = this.state.createWriteBatch();
this._setManifest(tx, Verifier.createManifest(manifest), null);
await this.state.flush();
}
} finally {
this.state._unlock();
}
}
return batch;
}
async verify(proof, from) {
if (proof.fork !== this.state.fork) return false;
const batch = await MerkleTree.verify(this.state, proof);
if (batch.upgraded && batch.length <= this.state.length) {
await batch.downgrade();
}
if (!batch.commitable()) {
return false;
}
const value = proof.block && proof.block.value || null;
const op = {
batch,
bitfield: value && { drop: false, start: proof.block.index, length: 1 },
value,
manifest: proof.manifest,
from
};
if (batch.upgraded) {
return this._verifyExclusive(op);
}
if (this._verifies !== null) {
const verifies = this._verifies;
const i = verifies.push(op);
await this._verified;
return verifies[i] !== null;
}
this._verifies = [op];
this._verified = this._verifyShared();
return this._verified;
}
async reorg(batch) {
if (!batch.commitable()) return false;
this.truncating++;
try {
await this.state.reorg(batch);
} finally {
this.truncating--;
}
return true;
}
openSkipBitfield() {
if (this.skipBitfield !== null) return this.skipBitfield;
this.skipBitfield = new RemoteBitfield();
const buf = this.bitfield.toBuffer(this.state.length);
const bitfield = new Uint32Array(buf.buffer, buf.byteOffset, buf.byteLength / 4);
this.skipBitfield.insert(0, bitfield);
return this.skipBitfield;
}
_setBitfieldRanges(start, end, value) {
this.bitfield.setRange(start, end, value);
if (this.skipBitfield !== null) this.skipBitfield.setRange(start, end, value);
}
close() {
if (!this.closing) this.closing = this._close();
return this.closing;
}
updateContiguousLength(bitfield) {
const contig = updateContigBatch(this.header.hints.contiguousLength, bitfield, this.bitfield);
if (contig.length !== -1 && contig.length !== this.header.hints.contiguousLength) {
this.header.hints.contiguousLength = contig.length;
this.hintsChanged = true;
}
}
updateRemoteContiguousLength(length) {
this.header.hints.remoteContiguousLength = length;
this.hintsChanged = true;
this.remoteContiguousLengthChanged = true;
}
onappend(tree, bitfield) {
this.header.tree = tree;
if (!bitfield) {
this.replicator.onupgrade();
return;
}
this.replicator.cork();
const { start, length, drop } = bitfield;
this._setBitfieldRanges(start, start + length, true);
this.updateContiguousLength({ start, length, drop: false });
this.replicator.onupgrade();
this.replicator.onhave(start, length, drop);
this.replicator.uncork();
}
ontruncate(tree, { start, length }) {
if (tree) this.header.tree = tree;
this.replicator.cork();
this.replicator.ontruncate(start, length);
this.replicator.onhave(start, length, true);
this.replicator.onupgrade();
this.replicator.uncork();
for (const sessionState of this.sessionStates) {
if (start < sessionState.snapshotCompatLength) sessionState.snapshotCompatLength = start;
}
this._setBitfieldRanges(start, start + length, false);
this.updateContiguousLength({ start, length, drop: true });
}
async _onconflict(proof) {
await this.replicator.onconflict();
for (let i = this.monitors.length - 1; i >= 0; i--) {
const s = this.monitors[i];
s.emit("conflict", proof.upgrade.length, proof.fork, proof);
}
const err = new Error("Two conflicting signatures exist for length " + proof.upgrade.length);
await this.closeAllSessions(err);
}
async closeAllSessions(err) {
const sessions = this.allSessions();
const all = [];
for (const s of sessions) all.push(s.close({ error: err, force: false }));
await Promise.allSettled(all);
}
async destroy() {
if (this.destroyed === true) return;
this.destroyed = true;
if (this.hasSession() === true) throw new Error("Cannot destroy while sessions are open");
const weakSessions = this.allSessions();
if (this.replicator) this.replicator.destroy();
if (this.state) await this.state.close();
for (const s of weakSessions) s.close().catch(noop);
}
async _close() {
if (this.opened === false) await this.opening;
if (this.hasSession() === true) throw new Error("Cannot close while sessions are open");
if (this.replicator) await this.replicator.close();
await this.destroy();
if (this.autoClose) await this.storage.store.close();
this.closed = true;
}
};
function updateContigBatch(start, upd, bitfield) {
const end = upd.start + upd.length;
let c4 = start;
if (upd.drop) {
if (c4 > upd.start) {
c4 = upd.start;
}
} else {
if (c4 <= end && c4 >= upd.start) {
c4 = end;
while (bitfield.get(c4)) c4++;
}
}
if (c4 === start) {
return {
length: -1
};
}
if (c4 > start) {
return {
length: c4
};
}
return {
length: c4
};
}
function getDefaultTree() {
return {
fork: 0,
length: 0,
rootHash: null,
signature: null
};
}
function parseHeader(info) {
if (!info) return null;
return {
key: info.key,
manifest: info.manifest,
external: null,
keyPair: info.keyPair,
tree: info.head || getDefaultTree(),
hints: {
reorgs: [],
contiguousLength: info.hints ? info.hints.contiguousLength : 0,
remoteContiguousLength: info.hints ? info.hints.remoteContiguousLength : 0,
recovering: info.hints ? info.hints.recovering : 0
}
};
}
async function maybeGetRootsFromStorage(storage, length) {
try {
return length ? await MerkleTree.getRootsFromStorage(storage, length) : [];
} catch (err) {
if (err.code !== "INVALID_OPERATION") throw err;
return [];
}
}
function noop() {
}
async function getCoreInfo(storage) {
const r = storage.read();
const auth = r.getAuth();
const head = r.getHead();
const hints = r.getHints();
r.tryFlush();
const [authInfo, headInfo, hintsInfo] = await Promise.all([auth, head, hints]);
return {
...authInfo,
head: headInfo,
hints: hintsInfo
};
}
}
});
// node_modules/hypercore/lib/info.js
var require_info = __commonJS({
"node_modules/hypercore/lib/info.js"(exports2, module2) {
module2.exports = class Info {
constructor(opts = {}) {
this.key = opts.key;
this.discoveryKey = opts.discoveryKey;
this.length = opts.length || 0;
this.contiguousLength = opts.contiguousLength || 0;
this.byteLength = opts.byteLength || 0;
this.fork = opts.fork || 0;
this.padding = opts.padding || 0;
this.storage = opts.storage || null;
}
static async from(session, opts = {}) {
return new Info({
key: session.key,
discoveryKey: session.discoveryKey,
length: session.length,
contiguousLength: session.contiguousLength,
byteLength: session.byteLength,
fork: session.fork,
padding: session.padding,
storage: opts.storage ? await this.storage(session) : null
});
}
static async storage(session) {
const { oplog, tree, blocks, bitfield } = session.core;
try {
return {
oplog: await Info.bytesUsed(oplog.storage),
tree: await Info.bytesUsed(tree.storage),
blocks: await Info.bytesUsed(blocks.storage),
bitfield: await Info.bytesUsed(bitfield.storage)
};
} catch {
return null;
}
}
static bytesUsed(file) {
return new Promise((resolve, reject) => {
file.stat((err, st) => {
if (err) {
resolve(0);
} else if (typeof st.blocks !== "number") {
reject(new Error("cannot determine bytes used"));
} else {
resolve(st.blocks * 512);
}
});
});
}
};
}
});
// node_modules/hypercore/lib/download.js
var require_download = __commonJS({
"node_modules/hypercore/lib/download.js"(exports2, module2) {
module2.exports = class Download {
constructor(session, range) {
this.session = session;
this.range = range;
this.request = null;
this.opened = false;
this.opening = this._open();
this.opening.catch(noop);
}
ready() {
return this.opening;
}
async _open() {
if (this.session.opened === false) await this.session.opening;
this._download();
this.opened = true;
}
async done() {
await this.ready();
try {
return await this.request.promise;
} catch (err) {
if (isSessionMoved(err)) return this._download();
throw err;
}
}
_download() {
const activeRequests = this.range && this.range.activeRequests || this.session.activeRequests;
this.request = this.session.core.replicator.addRange(activeRequests, this.range);
this.request.promise.catch(noop);
return this.request.promise;
}
/**
* Deprecated. Use `range.done()`.
*/
downloaded() {
return this.done();
}
destroy() {
this._destroyBackground().catch(noop);
}
async _destroyBackground() {
if (this.opened === false) await this.ready();
if (this.request.context) this.request.context.detach(this.request);
}
};
function noop() {
}
function isSessionMoved(err) {
return err.code === "SESSION_MOVED";
}
}
});
// node_modules/hypercore/lib/default-encryption.js
var require_default_encryption = __commonJS({
"node_modules/hypercore/lib/default-encryption.js"(exports2, module2) {
var sodium = require_sodium_universal();
var c4 = require_compact_encoding();
var b4a4 = require_b4a();
var { DEFAULT_ENCRYPTION } = require_caps();
var nonce = b4a4.alloc(sodium.crypto_stream_NONCEBYTES);
module2.exports = class DefaultEncryption {
static PADDING = 8;
constructor(encryptionKey, hypercoreKey, opts = {}) {
this.key = encryptionKey;
this.compat = opts.compat === true;
const keys = DefaultEncryption.deriveKeys(encryptionKey, hypercoreKey, opts);
this.blockKey = keys.block;
this.blindingKey = keys.blinding;
}
static deriveKeys(encryptionKey, hypercoreKey, { block = false, compat = false } = {}) {
const subKeys = b4a4.alloc(2 * sodium.crypto_stream_KEYBYTES);
const blockKey = block ? encryptionKey : subKeys.subarray(0, sodium.crypto_stream_KEYBYTES);
const blindingKey = subKeys.subarray(sodium.crypto_stream_KEYBYTES);
if (!block) {
if (compat) {
sodium.crypto_generichash_batch(blockKey, [encryptionKey], hypercoreKey);
} else {
sodium.crypto_generichash_batch(blockKey, [DEFAULT_ENCRYPTION, hypercoreKey, encryptionKey]);
}
}
sodium.crypto_generichash(blindingKey, blockKey);
return {
blinding: blindingKey,
block: blockKey
};
}
static blockEncryptionKey(hypercoreKey, encryptionKey) {
const blockKey = b4a4.alloc(sodium.crypto_stream_KEYBYTES);
sodium.crypto_generichash_batch(blockKey, [DEFAULT_ENCRYPTION, hypercoreKey, encryptionKey]);
return blockKey;
}
static encrypt(index, block, fork, blockKey, blindingKey) {
const padding = block.subarray(0, DefaultEncryption.PADDING);
block = block.subarray(DefaultEncryption.PADDING);
c4.uint64.encode({ start: 0, end: 8, buffer: padding }, fork);
c4.uint64.encode({ start: 0, end: 8, buffer: nonce }, index);
nonce.fill(0, 8, 8 + padding.byteLength);
sodium.crypto_stream_xor(padding, padding, nonce, blindingKey);
nonce.set(padding, 8);
sodium.crypto_stream_xor(block, block, nonce, blockKey);
}
static decrypt(index, block, blockKey) {
const padding = block.subarray(0, DefaultEncryption.PADDING);
block = block.subarray(DefaultEncryption.PADDING);
c4.uint64.encode({ start: 0, end: 8, buffer: nonce }, index);
nonce.set(padding, 8);
sodium.crypto_stream_xor(block, block, nonce, blockKey);
}
encrypt(index, block, fork, core) {
if (core.compat !== this.compat) this._reload(core);
return DefaultEncryption.encrypt(index, block, fork, this.blockKey, this.blindingKey);
}
decrypt(index, block, core) {
if (core.compat !== this.compat) this._reload(core);
return DefaultEncryption.decrypt(index, block, this.blockKey);
}
padding() {
return DefaultEncryption.PADDING;
}
_reload(core) {
const block = b4a4.equals(this.key, this.blockKey);
const keys = DefaultEncryption.deriveKeys(this.key, core.key, { block, compat: core.compat });
this.blockKey = keys.blockKey;
this.blindingKey = keys.blindingKey;
}
};
}
});
// node_modules/hypercore/lib/streams.js
var require_streams = __commonJS({
"node_modules/hypercore/lib/streams.js"(exports2) {
var { Writable, Readable } = require_streamx();
var ReadStream = class extends Readable {
constructor(core, opts = {}) {
super();
this.core = core;
this.start = opts.start || 0;
this.end = typeof opts.end === "number" ? opts.end : -1;
this.snapshot = !opts.live && opts.snapshot !== false;
this.live = this.end === -1 ? !!opts.live : false;
this.wait = typeof opts.wait === "boolean" ? opts.wait : this.core.wait;
this.timeout = opts.timeout || core.timeout;
}
_open(cb) {
this._openP().then(cb, cb);
}
_read(cb) {
this._readP().then(cb, cb);
}
async _openP() {
if (this.end === -1) await this.core.update();
else await this.core.ready();
if (this.snapshot && this.end === -1) this.end = this.core.length;
}
async _readP() {
const end = this.live ? -1 : this.end === -1 ? this.core.length : this.end;
if (end >= 0 && this.start >= end) {
this.push(null);
return;
}
this.push(await this.core.get(this.start++, { wait: this.wait, timeout: this.timeout }));
}
};
exports2.ReadStream = ReadStream;
var WriteStream = class extends Writable {
constructor(core) {
super();
this.core = core;
}
_writev(batch, cb) {
this._writevP(batch).then(cb, cb);
}
async _writevP(batch) {
await this.core.append(batch);
}
};
exports2.WriteStream = WriteStream;
var ByteStream = class extends Readable {
constructor(core, opts = {}) {
super();
this._core = core;
this._index = 0;
this._range = null;
this._byteOffset = opts.byteOffset || 0;
this._byteLength = typeof opts.byteLength === "number" ? opts.byteLength : -1;
this._prefetch = typeof opts.prefetch === "number" ? opts.prefetch : 32;
this._applyOffset = this._byteOffset > 0;
}
_open(cb) {
this._openp().then(cb, cb);
}
_read(cb) {
this._readp().then(cb, cb);
}
async _openp() {
if (this._byteLength === -1) {
await this._core.update();
this._byteLength = Math.max(this._core.byteLength - this._byteOffset, 0);
}
}
async _readp() {
let data = null;
if (this._byteLength === 0) {
this.push(null);
return;
}
let relativeOffset = 0;
if (this._applyOffset) {
this._applyOffset = false;
const [block, byteOffset] = await this._core.seek(this._byteOffset);
this._index = block;
relativeOffset = byteOffset;
}
this._predownload(this._index + 1);
data = await this._core.get(this._index++, { valueEncoding: "binary" });
if (relativeOffset > 0) data = data.subarray(relativeOffset);
if (data.byteLength > this._byteLength) data = data.subarray(0, this._byteLength);
this._byteLength -= data.byteLength;
this.push(data);
if (this._byteLength === 0) this.push(null);
}
_predownload(index) {
if (this._range) this._range.destroy();
this._range = this._core.download({ start: index, end: index + this._prefetch, linear: true });
}
_destroy(cb) {
if (this._range) this._range.destroy();
cb(null);
}
};
exports2.ByteStream = ByteStream;
}
});
// node_modules/hypercore/lib/fully-remote-proof.js
var require_fully_remote_proof = __commonJS({
"node_modules/hypercore/lib/fully-remote-proof.js"(exports2, module2) {
var { MerkleTree } = require_merkle_tree();
var messages = require_messages2();
var b4a4 = require_b4a();
var c4 = require_compact_encoding();
var crypto = require_hypercore_crypto();
var flat = require_flat_tree();
var SlimSession = class {
constructor(storage, auth, head, roots) {
this.fork = head ? head.fork : 0;
this.roots = roots;
this.length = head ? head.length : 0;
this.signature = head ? head.signature : null;
this.ancestors = this.length;
this.byteLength = 0;
this.prologue = auth.manifest.prologue;
this.storage = storage;
for (let i = 0; i < roots.length; i++) this.byteLength += roots[i].size;
}
};
module2.exports = { verify, proof };
async function verify(storage, buffer, { referrer = null } = {}) {
const state = { buffer, start: 0, end: buffer.byteLength };
const discoveryKey = c4.fixed32.decode(state);
const proof2 = messages.wire.data.decode(state);
const result = {
key: null,
discoveryKey,
newer: true,
length: 0,
proof: proof2,
block: null
};
const core = await storage.resumeCore(discoveryKey);
if (core === null) return null;
let rx = core.read();
const authPromise = rx.getAuth();
const headPromise = rx.getHead();
const referrerPromise = rx.getUserData("referrer");
rx.tryFlush();
const [auth, head, ref] = await Promise.all([authPromise, headPromise, referrerPromise]);
if (auth === null) return null;
if (referrer && (!ref || !b4a4.equals(ref, referrer))) return null;
rx = core.read();
const rootPromises = [];
for (const index of flat.fullRoots(head ? 2 * head.length : 0)) {
rootPromises.push(rx.getTreeNode(index));
}
rx.tryFlush();
let roots = await Promise.all(rootPromises);
if (roots.some(isNull)) roots = [];
const length = head ? head.length : 0;
if (!auth.manifest || !auth.manifest.signers.length) return null;
const batch = await MerkleTree.verifyFullyRemote(new SlimSession(core, auth, head, roots), proof2);
const publicKey = auth.manifest.signers[0].publicKey;
let signable = null;
let signature = null;
if (auth.manifest.version === 0) {
signable = batch.signable(auth.manifest.signers[0].namespace);
signature = batch.signature;
} else {
if (batch.signature[0] !== 1) return null;
if (batch.signature[1] !== 0) return null;
signable = batch.signable(auth.key);
signature = batch.signature.subarray(2, 66);
}
if (!crypto.verify(signable, signature, publicKey)) {
return null;
}
result.key = auth.key;
result.discoveryKey = discoveryKey;
result.newer = batch.length > length;
result.length = batch.length;
result.block = proof2.block;
return result;
}
async function proof(sender, { index, block = null, upgrade = null } = {}) {
const proof2 = await sender.proof({
block: block ? { index, nodes: 0 } : null,
upgrade: upgrade ? upgrade : { start: 0, length: sender.length }
});
if (block) proof2.block.value = block;
proof2.manifest = sender.core.header.manifest;
const state = { buffer: null, start: 0, end: 0 };
const data = { request: 0, ...proof2 };
c4.fixed32.preencode(state, sender.discoveryKey);
messages.wire.data.preencode(state, data);
state.buffer = b4a4.allocUnsafe(state.end);
c4.fixed32.encode(state, sender.discoveryKey);
messages.wire.data.encode(state, data);
return state.buffer;
}
function isNull(x) {
return x === null;
}
}
});
// node_modules/hypercore/index.js
var require_hypercore = __commonJS({
"node_modules/hypercore/index.js"(exports2, module2) {
var { EventEmitter } = require_bare_events();
var isOptions = require_is_options();
var crypto = require_hypercore_crypto();
var CoreStorage = require("hypercore-storage");
var c4 = require_compact_encoding();
var b4a4 = require_b4a();
var NoiseSecretStream = require_secret_stream();
var Protomux = require_protomux();
var id = require_hypercore_id_encoding();
var safetyCatch = require_safety_catch();
var unslab = require_unslab();
var flat = require_flat_tree();
var assert2 = require_nanoassert();
var { SMALL_WANTS } = require_feature_flags();
var { UPDATE_COMPAT } = require_wants();
var MarkBitfield = require_mark_bitfield();
var inspect = require_inspect();
var Core = require_core();
var Info = require_info();
var Download = require_download();
var DefaultEncryption = require_default_encryption();
var caps = require_caps();
var Replicator = require_replicator();
var { manifestHash, createManifest } = require_verifier();
var { ReadStream, WriteStream, ByteStream } = require_streams();
var { MerkleTree } = require_merkle_tree();
var { proof, verify } = require_fully_remote_proof();
var {
ASSERTION,
BAD_ARGUMENT,
SESSION_CLOSED,
SESSION_MOVED,
SESSION_NOT_WRITABLE,
SNAPSHOT_NOT_AVAILABLE,
DECODING_ERROR
} = require_hypercore_errors();
var MAX_SUGGESTED_BLOCK_SIZE = 15 * 1024 * 1024;
var Hypercore = class _Hypercore extends EventEmitter {
constructor(storage, key, opts) {
super();
if (isOptions(storage) && !storage.db) {
opts = storage;
storage = null;
key = opts.key || null;
} else if (isOptions(key)) {
opts = key;
key = opts.key || null;
}
if (key && typeof key === "string") key = id.decode(key);
if (!opts) opts = {};
if (!storage) storage = opts.storage;
this.core = null;
this.state = null;
this.encryption = null;
this.extensions = /* @__PURE__ */ new Map();
this.valueEncoding = null;
this.encodeBatch = null;
this.activeRequests = [];
this.sessions = null;
this.ongc = null;
this.keyPair = opts.keyPair || null;
this.readable = true;
this.writable = false;
this.exclusive = false;
this.opened = false;
this.closed = false;
this.weak = !!opts.weak;
this.snapshotted = !!opts.snapshot;
this.onseq = opts.onseq || null;
this.onwait = opts.onwait || null;
this.wait = opts.wait !== false;
this.timeout = opts.timeout || 0;
this.preload = null;
this.closing = null;
this.opening = null;
this._readonly = opts.writable === false;
this._preappend = preappend.bind(this);
this._snapshot = null;
this._findingPeers = 0;
this._active = opts.weak ? !!opts.active : opts.active !== false;
this.waits = 0;
this._marking = false;
this._marks = null;
this._sessionIndex = -1;
this._stateIndex = -1;
this._monitorIndex = -1;
this.opening = this._open(storage, key, opts);
this.opening.catch(safetyCatch);
this.on("newListener", maybeAddMonitor);
}
[/* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom")](depth, opts) {
return inspect(this, depth, opts);
}
static MAX_SUGGESTED_BLOCK_SIZE = MAX_SUGGESTED_BLOCK_SIZE;
static DefaultEncryption = DefaultEncryption;
static SMALL_WANTS = SMALL_WANTS;
static enable(flag) {
const enableCompat = (flag & SMALL_WANTS) === 0;
UPDATE_COMPAT(enableCompat);
}
static setRecoveryPeers(peers) {
Core.setRecoveryPeers(peers);
}
static key(manifest, { compat, version: version3, namespace } = {}) {
if (b4a4.isBuffer(manifest)) {
manifest = { version: version3, signers: [{ publicKey: manifest, namespace }] };
}
return compat ? manifest.signers[0].publicKey : manifestHash(createManifest(manifest));
}
static discoveryKey(key) {
return crypto.discoveryKey(key);
}
static blockEncryptionKey(key, encryptionKey) {
return DefaultEncryption.blockEncryptionKey(key, encryptionKey);
}
static getProtocolMuxer(stream) {
return stream.noiseStream.userData;
}
static createCore(storage, opts) {
return new Core(_Hypercore.defaultStorage(storage), { autoClose: false, ...opts });
}
static createProtocolStream(isInitiator, opts = {}) {
let outerStream = Protomux.isProtomux(isInitiator) ? isInitiator.stream : isStream(isInitiator) ? isInitiator : opts.stream;
let noiseStream = null;
if (outerStream) {
noiseStream = outerStream.noiseStream;
} else {
noiseStream = new NoiseSecretStream(isInitiator, null, opts);
outerStream = noiseStream.rawStream;
}
if (!noiseStream) throw BAD_ARGUMENT("Invalid stream", this.discoveryKey);
if (!noiseStream.userData) {
const protocol = Protomux.from(noiseStream);
if (opts.keepAlive !== false && noiseStream.keepAlive === 0) {
noiseStream.setKeepAlive(5e3);
}
noiseStream.userData = protocol;
}
if (opts.ondiscoverykey) {
const ondiscoverykey = createDiscoveryKeyHandler(opts.ondiscoverykey);
noiseStream.userData.pair({ protocol: "hypercore/alpha" }, ondiscoverykey);
}
return outerStream;
}
static defaultStorage(storage, opts = {}) {
if (CoreStorage.isCoreStorage(storage)) return storage;
const directory = storage;
return new CoreStorage(directory, opts);
}
static clearRequests(session, err) {
return Replicator.clearRequests(session, err);
}
static async treeHashFromStorage(session, length = session.length) {
const roots = await MerkleTree.getRoots(session.state, length);
return crypto.tree(roots);
}
snapshot(opts) {
return this.session({ ...opts, snapshot: true });
}
compact() {
return this.core.compact();
}
session(opts = {}) {
if (this.closing) {
throw SESSION_CLOSED("Cannot make sessions on a closing core", this.discoveryKey);
}
if (opts.checkout !== void 0 && !opts.name && !opts.atom) {
throw ASSERTION("Checkouts are only supported on atoms or named sessions", this.discoveryKey);
}
const wait = opts.wait === false ? false : this.wait;
const writable = opts.writable === void 0 ? !this._readonly : opts.writable === true;
const onwait = opts.onwait === void 0 ? this.onwait : opts.onwait;
const onseq = opts.onseq === void 0 ? this.onseq : opts.onseq;
const timeout = opts.timeout === void 0 ? this.timeout : opts.timeout;
const weak = opts.weak === void 0 ? this.weak : opts.weak;
const marking = this._marking;
const marks = this._marks;
const Clz = opts.class || _Hypercore;
const s = new Clz(null, this.key, {
...opts,
wait,
onwait,
onseq,
timeout,
writable,
weak,
parent: this
});
s._marking = marking;
s._marks = marks;
return s;
}
async setEncryptionKey(key, opts) {
if (!this.opened) await this.opening;
const encryption = this._getEncryptionProvider({ key, block: !!(opts && opts.block) });
return this.setEncryption(encryption);
}
async setEncryption(encryption) {
if (!this.opened) await this.opening;
if (encryption === null) {
this.encryption = encryption;
return;
}
if (!isEncryptionProvider(encryption)) {
throw ASSERTION("Provider does not satisfy HypercoreEncryption interface", this.discoveryKey);
}
this.encryption = encryption;
}
setKeyPair(keyPair) {
this.keyPair = keyPair;
}
setActive(bool) {
const active = !!bool;
if (active === this._active || this.closing) return;
this._active = active;
if (!this.opened) return;
this.core.replicator.updateActivity(this._active ? 1 : -1);
}
async _open(storage, key, opts) {
const preload = opts.preload || opts.parent && opts.parent.preload;
if (preload) {
this.sessions = [];
this.preload = preload;
opts = { ...opts, ...await this.preload };
this.preload = null;
}
const parent = opts.parent || null;
const core = opts.core || parent && parent.core;
const sessions = opts.sessions || parent && parent.sessions;
const ongc = opts.ongc || parent && parent.ongc;
if (core) this.core = core;
if (ongc) this.ongc = ongc;
if (sessions) this.sessions = sessions;
if (this.sessions === null) this.sessions = [];
this._sessionIndex = this.sessions.push(this) - 1;
if (this.core === null) initOnce(this, storage, key, opts);
if (this._monitorIndex === -2) this.core.addMonitor(this);
try {
await this._openSession(opts);
} catch (err) {
if (this.core.autoClose && this.core.hasSession() === false) await this.core.close();
if (this.exclusive) this.core.unlockExclusive();
this.core.removeMonitor(this);
this._removeSession();
if (this.state !== null) this.state.removeSession(this);
this.closed = true;
this.emit("close");
throw err;
}
if (this.core._repairMode) {
const recoverTreeNodeFromPeersBound = this.recoverTreeNodeFromPeers.bind(this);
this.once("repaired", () => {
this.off("peer-add", recoverTreeNodeFromPeersBound);
});
this.on("peer-add", recoverTreeNodeFromPeersBound);
}
this.emit("ready");
if (this.core.closing) this.close().catch(safetyCatch);
}
_removeSession() {
if (this._sessionIndex === -1) return;
const head = this.sessions.pop();
if (head !== this) this.sessions[head._sessionIndex = this._sessionIndex] = head;
this._sessionIndex = -1;
if (this.ongc !== null) this.ongc(this);
}
async _openSession(opts) {
if (this.core.opened === false) await this.core.ready();
if (this.keyPair === null) this.keyPair = opts.keyPair || this.core.header.keyPair;
const parent = opts.parent || null;
if (parent && parent.encryption) this.encryption = parent.encryption;
const e = getEncryptionOption(opts);
if (!this.encryption) this.encryption = this._getEncryptionProvider(e);
this.writable = this._isWritable();
if (opts.valueEncoding) {
this.valueEncoding = c4.from(opts.valueEncoding);
}
if (opts.encodeBatch) {
this.encodeBatch = opts.encodeBatch;
}
if (opts.pushOnly === true) {
this.core.replicator.setPushOnly(true);
}
if (parent) {
if (parent._stateIndex === -1) await parent.ready();
if (!this.keyPair) this.keyPair = parent.keyPair;
const ps = parent.state;
if (ps) {
const shouldSnapshot = this.snapshotted && !ps.isSnapshot();
this.state = shouldSnapshot ? await ps.snapshot() : ps.ref();
}
if (this.snapshotted && this.core && !this._snapshot) {
this._updateSnapshot();
}
}
if (opts.exclusive && opts.writable !== false) {
this.exclusive = true;
await this.core.lockExclusive();
}
const parentState = parent ? parent.state : this.core.state;
const checkout = opts.checkout === void 0 ? -1 : opts.checkout;
const state = this.state;
if (opts.atom) {
this.state = await parentState.createSession(null, false, opts.atom);
if (state) state.unref();
} else if (opts.name) {
this.state = await parentState.createSession(opts.name, !!opts.overwrite, null);
if (state) state.unref();
}
if (this.state && checkout !== -1) {
if (!opts.name && !opts.atom) {
throw ASSERTION("Checkouts must be named or atomized", this.discoveryKey);
}
if (checkout > this.state.length) {
throw ASSERTION(
`Invalid checkout ${checkout} for ${opts.name}, length is ${this.state.length}`,
this.discoveryKey
);
}
if (this.state.prologue && checkout < this.state.prologue.length) {
throw ASSERTION(
`Invalid checkout ${checkout} for ${opts.name}, prologue length is ${this.state.prologue.length}`,
this.discoveryKey
);
}
if (checkout < this.state.length) await this.state.truncate(checkout, this.fork);
}
if (this.state === null) {
this.state = this.core.state.ref();
}
this.writable = this._isWritable();
if (this.snapshotted && this.core) this._updateSnapshot();
this.state.addSession(this);
this.core = this.state.core;
if (opts.userData) {
const tx = this.state.storage.write();
for (const [key, value] of Object.entries(opts.userData)) {
tx.putUserData(key, value);
}
await tx.flush();
}
if (opts.manifest && !this.core.header.manifest) {
await this.core.setManifest(createManifest(opts.manifest));
}
this.core.replicator.updateActivity(this._active ? 1 : 0);
this.opened = true;
}
get replicator() {
return this.core === null ? null : this.core.replicator;
}
_getSnapshot() {
return {
length: this.state.length,
byteLength: this.state.byteLength,
fork: this.state.fork
};
}
_updateSnapshot() {
const prev = this._snapshot;
const next = this._snapshot = this._getSnapshot();
if (!prev) return true;
return prev.length !== next.length || prev.fork !== next.fork;
}
_isWritable() {
if (this._readonly) return false;
if (this.state && !this.state.isDefault()) return true;
return !!(this.keyPair && this.keyPair.secretKey);
}
close({ error } = {}) {
if (this.closing) return this.closing;
this.closing = this._close(error || null);
return this.closing;
}
clearRequests(activeRequests, error) {
if (!activeRequests.length) return;
if (this.core) this.core.replicator.clearRequests(activeRequests, error);
}
async _close(error) {
if (this.opened === false) {
try {
await this.opening;
} catch (err) {
if (!this.closed) throw err;
}
}
if (this.closed === true) return;
this.core.removeMonitor(this);
this.state.removeSession(this);
this._removeSession();
this.readable = false;
this.writable = false;
this.opened = false;
const gc = [];
for (const ext of this.extensions.values()) {
if (ext.session === this) gc.push(ext);
}
for (const ext of gc) ext.destroy();
this.core.replicator.findingPeers -= this._findingPeers;
this.core.replicator.clearRequests(this.activeRequests, error);
this.core.replicator.updateActivity(this._active ? -1 : 0);
this._findingPeers = 0;
this.state.unref();
if (this.exclusive) this.core.unlockExclusive();
if (this.core.hasSession()) {
this.closed = true;
this.emit("close");
return;
}
if (this.core.autoClose) await this.core.close();
this.closed = true;
this.emit("close");
}
async commit(session, opts) {
await this.ready();
await session.ready();
return this.state.commit(session.state, { keyPair: this.keyPair, ...opts });
}
replicate(isInitiator, opts = {}) {
if (Protomux.isProtomux(isInitiator)) return this._attachToMuxer(isInitiator);
if (isStream(isInitiator) && this._isAttached(isInitiator)) return isInitiator;
const protocolStream = _Hypercore.createProtocolStream(isInitiator, opts);
const noiseStream = protocolStream.noiseStream;
const protocol = noiseStream.userData;
this._attachToMuxer(protocol);
return protocolStream;
}
_isAttached(stream) {
return stream.userData && this.core && this.core.replicator && this.core.replicator.attached(stream.userData);
}
_attachToMuxer(mux) {
if (this.opened) {
this.core.replicator.attachTo(mux);
} else {
this.opening.then(() => this.core.replicator.attachTo(mux), mux.destroy.bind(mux));
}
return mux;
}
get id() {
return this.core === null ? null : this.core.id;
}
get key() {
return this.core === null ? null : this.core.key;
}
get discoveryKey() {
return this.core === null ? null : this.core.discoveryKey;
}
get manifest() {
return this.core === null ? null : this.core.manifest;
}
get length() {
if (this._snapshot) return this._snapshot.length;
return this.opened === false ? 0 : this.state.length;
}
get signedLength() {
return this.opened === false ? 0 : this.state.signedLength();
}
/**
* Deprecated. Use `const { byteLength } = await core.info()`.
*/
get byteLength() {
if (this.opened === false) return 0;
if (this._snapshot) return this._snapshot.byteLength;
return this.state.byteLength - this.state.length * this.padding;
}
get remoteContiguousLength() {
if (this.opened === false) return 0;
return Math.min(this.core.state.length, this.core.header.hints.remoteContiguousLength);
}
get contiguousLength() {
if (this.opened === false) return 0;
return Math.min(this.core.state.length, this.core.header.hints.contiguousLength);
}
get contiguousByteLength() {
return 0;
}
get fork() {
if (this.opened === false) return 0;
return this.state.fork;
}
get padding() {
if (this.encryption && this.key && this.manifest) {
return this.encryption.padding(this.core, this.length);
}
return 0;
}
get peers() {
return this.opened === false ? [] : this.core.replicator.peers;
}
get globalCache() {
return this.opened === false ? null : this.core.globalCache;
}
get recovering() {
return this.opened === false ? 0 : this.core.header.hints.recovering;
}
ready() {
return this.opening;
}
async recover() {
if (this.opened === false) await this.opening;
return this.state.waitForRecovery();
}
async setUserData(key, value) {
if (this.opened === false) await this.opening;
const existing = await this.getUserData(key);
if (existing && b4a4.isBuffer(value) && b4a4.equals(existing, value)) return;
await this.state.setUserData(key, value);
}
async getUserData(key) {
if (this.opened === false) await this.opening;
const batch = this.state.storage.read();
const p = batch.getUserData(key);
batch.tryFlush();
return p;
}
transferSession(core) {
if (this.weak === false) {
this.core.activeSessions--;
core.activeSessions++;
}
if (this._monitorIndex >= 0) {
this.core.removeMonitor(this);
core.addMonitor(this);
}
const old = this.core;
this.core = core;
old.replicator.clearRequests(this.activeRequests, SESSION_MOVED());
this.emit("migrate", this.key);
}
findingPeers() {
this._findingPeers++;
if (this.core !== null && !this.closing) this.core.replicator.findingPeers++;
let once = true;
return () => {
if (this.closing || !once) return;
once = false;
this._findingPeers--;
if (this.core !== null && --this.core.replicator.findingPeers === 0) {
this.core.replicator.updateAll();
}
};
}
async info(opts) {
if (this.opened === false) await this.opening;
return Info.from(this, opts);
}
async update(opts) {
if (this.opened === false) await this.opening;
if (this.closing !== null) return false;
if (this.snapshotted) return false;
if (this.writable && (!opts || opts.force !== true)) return false;
const remoteWait = this._shouldWait(opts, this.core.replicator.findingPeers > 0);
let upgraded = false;
if (await this.core.replicator.applyPendingReorg()) {
upgraded = true;
}
if (!upgraded && remoteWait) {
const activeRequests = opts && opts.activeRequests || this.activeRequests;
const req = this.core.replicator.addUpgrade(activeRequests);
try {
upgraded = await req.promise;
} catch (err) {
if (isSessionMoved(err)) return this.update(opts);
throw err;
}
}
if (!upgraded) return false;
return true;
}
async seek(bytes, opts) {
if (this.opened === false) await this.opening;
if (!isValidIndex(bytes)) throw ASSERTION("seek is invalid", this.discoveryKey);
const activeRequests = opts && opts.activeRequests || this.activeRequests;
if (this.encryption && !this.core.manifest) {
const req2 = this.replicator.addUpgrade(activeRequests);
try {
await req2.promise;
} catch (err) {
if (isSessionMoved(err)) return this.seek(bytes, opts);
throw err;
}
}
const s = MerkleTree.seek(this.state, bytes, this.padding);
const offset = await s.update();
if (offset) return offset;
if (this.closing !== null) {
throw SESSION_CLOSED("cannot seek on a closed session", this.discoveryKey);
}
if (!this._shouldWait(opts, this.wait)) return null;
const req = this.core.replicator.addSeek(activeRequests, s);
const timeout = opts && opts.timeout !== void 0 ? opts.timeout : this.timeout;
if (timeout) req.context.setTimeout(req, timeout);
try {
return await req.promise;
} catch (err) {
if (isSessionMoved(err)) return this.seek(bytes, opts);
throw err;
}
}
async has(start, end = start + 1) {
if (this.opened === false) await this.opening;
if (!isValidIndex(start) || !isValidIndex(end)) {
throw ASSERTION("has range is invalid", this.discoveryKey);
}
if (this.state.isDefault()) {
if (end === start + 1) return this.core.bitfield.get(start);
const i = this.core.bitfield.firstUnset(start);
return i === -1 || i >= end;
}
if (end === start + 1) {
const rx = this.state.storage.read();
const block = rx.getBlock(start);
rx.tryFlush();
return await block !== null;
}
let count = 0;
const stream = this.state.storage.createBlockStream({ gte: start, lt: end });
for await (const block of stream) {
if (block === null) return false;
count++;
}
return count === end - start;
}
async get(index, opts) {
if (this.opened === false) await this.opening;
if (!isValidIndex(index)) throw ASSERTION("block index is invalid", this.discoveryKey);
if (this.closing !== null) {
throw SESSION_CLOSED("cannot get on a closed session", this.discoveryKey);
}
const encoding = opts && opts.valueEncoding && c4.from(opts.valueEncoding) || this.valueEncoding;
if (this.onseq !== null) this.onseq(index, this);
if (this._marking) await this.markBlock(index);
const req = this._get(index, opts);
let block = await req;
if (!block) return null;
if (opts && opts.raw) return block;
if (this.encryption && (!opts || opts.decrypt !== false)) {
block = b4a4.from(block);
await this.encryption.decrypt(index, block, this.core);
}
return this._decode(encoding, block, index);
}
async clear(start, end = start + 1, opts) {
if (this.opened === false) await this.opening;
if (this.closing !== null) {
throw SESSION_CLOSED("cannot clear on a closed session", this.discoveryKey);
}
if (typeof end === "object") {
opts = end;
end = start + 1;
}
if (!isValidIndex(start) || !isValidIndex(end)) {
throw ASSERTION("clear range is invalid", this.discoveryKey);
}
const cleared = opts && opts.diff ? { blocks: 0 } : null;
if (start >= end) return cleared;
if (start >= this.length) return cleared;
await this.state.clear(start, end, cleared);
return cleared;
}
async purge() {
await this._closeAllSessions(null);
await this.core.purge();
}
async _get(index, opts) {
const block = await readBlock(this.state.storage.read(), index);
if (block !== null) return block;
if (this.closing !== null) {
throw SESSION_CLOSED("cannot get on a closed session", this.discoveryKey);
}
if (this._snapshot !== null) {
checkSnapshot(this, index);
const coreBlock = await readBlock(this.core.state.storage.read(), index);
checkSnapshot(this, index);
if (coreBlock !== null) return coreBlock;
}
if (this.core.bitfield.get(index)) {
const coreBlock = await readBlock(this.state.storage.read(), index);
if (coreBlock !== null) return coreBlock;
}
if (!this._shouldWait(opts, this.wait)) return null;
this.waits++;
if (opts && opts.onwait) opts.onwait(index, this);
if (this.onwait) this.onwait(index, this);
const activeRequests = opts && opts.activeRequests || this.activeRequests;
const force = opts ? opts.force === true : false;
const req = this.core.replicator.addBlock(activeRequests, index, force);
req.snapshot = index < this.length;
const timeout = opts && opts.timeout !== void 0 ? opts.timeout : this.timeout;
if (timeout) req.context.setTimeout(req, timeout);
let replicatedBlock = null;
try {
replicatedBlock = await req.promise;
} catch (err) {
if (isSessionMoved(err)) return this._get(index, opts);
throw err;
}
if (this._snapshot !== null) checkSnapshot(this, index);
return maybeUnslab(replicatedBlock);
}
_shouldWait(opts, defaultValue) {
if (opts) {
if (opts.wait === false) return false;
if (opts.wait === true) return true;
}
return defaultValue;
}
_setupMarks() {
if (this._marks === null) {
const storage = this.snapshotted ? this.core.state.storage : this.state.storage;
this._marks = new MarkBitfield(storage);
}
}
async markBlock(start, end = start + 1) {
if (this.opened === false) await this.opening;
this._setupMarks();
const setPromises = [];
for (let i = start; i < end; i++) {
setPromises.push(this._marks.set(i, true));
}
return Promise.all(setPromises);
}
async clearMarkings() {
if (this.opened === false) await this.opening;
this._setupMarks();
await this._marks.clear();
this._marks = null;
}
async startMarking() {
if (this._marking) {
throw ASSERTION("Hypercore cannot be gc'ed when already in gc mode", this.discoveryKey);
}
if (this.state && this.state.name) {
throw ASSERTION("Hypercore cannot be gc'ed when a named session", this.discoveryKey);
}
if (this.state && this.state.storage.atom) {
throw ASSERTION("Hypercore cannot be gc'ed when an atomic session", this.discoveryKey);
}
if (this.opened === false) await this.opening;
await this.clearMarkings();
this._marking = true;
}
async sweep({ batchSize = 1e3 } = {}) {
if (this.opened === false) await this.opening;
assert2(!this.snapshotted, "Cannot sweep a snapshot");
this._setupMarks();
let clearing = [];
let prevIndex = this.length;
for await (const index of this._marks.createMarkStream({ reverse: true })) {
if (index + 1 === prevIndex) {
prevIndex = index;
continue;
}
clearing.push(this.clear(index + 1, prevIndex));
if (clearing.length >= batchSize) {
await Promise.all(clearing);
clearing = [];
}
prevIndex = index;
}
if (prevIndex > 0) clearing.push(this.clear(0, prevIndex));
await Promise.all(clearing);
this._marking = false;
await this.clearMarkings();
}
createReadStream(opts) {
return new ReadStream(this, opts);
}
createWriteStream() {
return new WriteStream(this);
}
createByteStream(opts) {
return new ByteStream(this, opts);
}
download(range) {
return new Download(this, range);
}
// TODO: get rid of this / deprecate it?
undownload(range) {
range.destroy(null);
}
// TODO: get rid of this / deprecate it?
cancel(request) {
}
async truncate(newLength = 0, opts = {}) {
if (this.opened === false) await this.opening;
if (this.closing) throw SESSION_CLOSED("Cannot append to a closed session", this.discoveryKey);
const {
fork = this.state.fork + 1,
keyPair = this.keyPair,
signature = null
} = typeof opts === "number" ? { fork: opts } : opts;
const isDefault = this.state === this.core.state;
const writable = !this._readonly && !!(signature || keyPair && keyPair.secretKey);
if (isDefault && writable === false && (newLength > 0 || fork !== this.state.fork)) {
throw SESSION_NOT_WRITABLE("cannot append to a non-writable core", this.discoveryKey);
}
await this.state.truncate(newLength, fork, { keyPair, signature });
if (this.state === this.core.state) this.core.replicator.updateAll();
}
async append(blocks, opts = {}) {
if (this.opened === false) await this.opening;
if (this.closing) throw SESSION_CLOSED("Cannot append to a closed session", this.discoveryKey);
const isDefault = this.state === this.core.state;
const defaultKeyPair = this.state.name === null ? this.keyPair : null;
const { keyPair = defaultKeyPair, signature = null, maxLength, postappend = null } = opts;
const writable = !isDefault || !!signature || !!(keyPair && keyPair.secretKey) || opts.writable === true;
if (this._readonly || writable === false) {
throw SESSION_NOT_WRITABLE("cannot append to a readonly core", this.discoveryKey);
}
blocks = Array.isArray(blocks) ? blocks : [blocks];
const preappend2 = this.encryption && this._preappend;
const buffers = this.encodeBatch !== null ? this.encodeBatch(blocks) : new Array(blocks.length);
if (this.encodeBatch === null) {
for (let i = 0; i < blocks.length; i++) {
buffers[i] = this._encode(this.valueEncoding, blocks[i]);
}
}
for (const b of buffers) {
if (b.byteLength > MAX_SUGGESTED_BLOCK_SIZE) {
throw BAD_ARGUMENT(
"Appended block exceeds the maximum suggested block size",
this.discoveryKey
);
}
}
return this.state.append(buffers, { keyPair, signature, preappend: preappend2, postappend, maxLength });
}
async signable(length = -1, fork = -1) {
if (this.opened === false) await this.opening;
if (length === -1) length = this.length;
if (fork === -1) fork = this.fork;
return caps.treeSignable(this.key, await this.treeHash(length), length, fork);
}
async treeHash(length = -1) {
if (this.opened === false) await this.opening;
if (length === -1) length = this.length;
if (length > 0 && !await this.has(length - 1)) await this.get(length - 1);
const roots = await MerkleTree.getRoots(this.state, length);
return crypto.tree(roots);
}
async missingNodes(index) {
if (this.opened === false) await this.opening;
return await MerkleTree.missingNodes(this.core.state, 2 * index, this.core.state.length);
}
async proof(opts) {
if (this.opened === false) await this.opening;
const rx = this.state.storage.read();
const proofPromise = MerkleTree.proof(this.state, rx, opts);
const blockPromise = opts && opts.block ? rx.getBlock(opts.block.index) : null;
rx.tryFlush();
const [proof2, block] = await Promise.all([proofPromise, blockPromise]);
const settled = await proof2.settle();
if (block) settled.block.value = block;
return settled;
}
async applyProof(proof2, from) {
if (this.opened === false) await this.opening;
return this.core.verify(proof2, from);
}
async verifyFullyRemote(proof2) {
if (this.opened === false) await this.opening;
const batch = await MerkleTree.verifyFullyRemote(this.state, proof2);
await this.core._verifyBatchUpgrade(batch, proof2.manifest);
return batch;
}
generateRemoteProofForTreeNode(treeNodeIndex) {
const blockProofIndex = flat.rightSpan(treeNodeIndex) / 2;
return proof(this, {
index: blockProofIndex,
// + 1 to length so the block is included
upgrade: { start: 0, length: blockProofIndex + 1 }
});
}
async recoverFromRemoteProof(remoteProof) {
this.core.replicator.setPushOnly(true);
this.core._repairMode = true;
await this.core.state.mutex.lock();
try {
const p = await verify(this.core.db, remoteProof);
if (!p) return false;
const tx = this.core.storage.write();
for (const node of p.proof.upgrade.nodes) {
tx.putTreeNode(node);
}
await tx.flush();
const succeed = p.proof.upgrade.nodes.length !== 0;
if (succeed) {
this.core.replicator.setPushOnly(false);
}
return succeed;
} finally {
this.core.state.mutex.unlock();
}
}
recoverTreeNodeFromPeers() {
this.core.replicator.setPushOnly(true);
for (const peer of this.core.replicator.peers) {
const req = {
id: 0,
fork: this.fork,
upgrade: {
start: 0,
length: this.length
}
};
peer.wireRequest.send(req);
}
}
registerExtension(name, handlers = {}) {
if (this.extensions.has(name)) {
const ext2 = this.extensions.get(name);
ext2.handlers = handlers;
ext2.encoding = c4.from(handlers.encoding || c4.buffer);
ext2.session = this;
return ext2;
}
const ext = {
name,
handlers,
encoding: c4.from(handlers.encoding || c4.buffer),
session: this,
send(message, peer) {
const buffer = c4.encode(this.encoding, message);
peer.extension(name, buffer);
},
broadcast(message) {
const buffer = c4.encode(this.encoding, message);
for (const peer of this.session.peers) {
peer.extension(name, buffer);
}
},
destroy() {
for (const peer of this.session.peers) {
if (peer.extensions.get(name) === ext) peer.extensions.delete(name);
}
this.session.extensions.delete(name);
},
_onmessage(state, peer) {
const m = this.encoding.decode(state);
if (this.handlers.onmessage) this.handlers.onmessage(m, peer);
}
};
this.extensions.set(name, ext);
if (this.core === null) this._monitorIndex = -2;
else this.core.addMonitor(this);
for (const peer of this.peers) {
peer.extensions.set(name, ext);
}
return ext;
}
_encode(enc, val) {
const state = { start: this.padding, end: this.padding, buffer: null };
if (b4a4.isBuffer(val)) {
if (state.start === 0) return val;
state.end += val.byteLength;
} else if (enc) {
enc.preencode(state, val);
} else {
val = b4a4.from(val);
if (state.start === 0) return val;
state.end += val.byteLength;
}
state.buffer = b4a4.allocUnsafe(state.end);
if (enc) enc.encode(state, val);
else state.buffer.set(val, state.start);
return state.buffer;
}
_decode(enc, block, index) {
if (this.encryption) block = block.subarray(this.encryption.padding(this.core, index));
try {
if (enc) return c4.decode(enc, block);
} catch (err) {
throw DECODING_ERROR(err.message, this.discoveryKey);
}
return block;
}
_getEncryptionProvider(e) {
if (isEncryptionProvider(e)) return e;
if (!e || !e.key) return null;
return new DefaultEncryption(e.key, this.key, { block: e.block, compat: this.core.compat });
}
};
module2.exports = Hypercore;
function isStream(s) {
return typeof s === "object" && s && typeof s.pipe === "function";
}
async function preappend(blocks) {
const offset = this.state.length;
const fork = this.state.encryptionFork;
for (let i = 0; i < blocks.length; i++) {
await this.encryption.encrypt(offset + i, blocks[i], fork, this.core);
}
}
function isValidIndex(index) {
return index === 0 || index > 0;
}
function maybeUnslab(block) {
return block !== null && 2 * block.byteLength < block.buffer.byteLength ? unslab(block) : block;
}
function checkSnapshot(snapshot, index) {
if (index >= snapshot.state.snapshotCompatLength) {
throw SNAPSHOT_NOT_AVAILABLE(
`snapshot at index ${index} not available (max compat length ${snapshot.state.snapshotCompatLength})`,
snapshot.discoveryKey
);
}
}
function readBlock(rx, index) {
const promise = rx.getBlock(index);
rx.tryFlush();
return promise;
}
function initOnce(session, storage, key, opts) {
if (storage === null) storage = opts.storage || null;
if (key === null) key = opts.key || null;
session.core = new Core(Hypercore.defaultStorage(storage), {
preopen: opts.preopen,
eagerUpgrade: opts.eagerUpgrade !== false,
notDownloadingLinger: opts.notDownloadingLinger,
allowFork: opts.allowFork !== false,
allowPush: !!opts.allowPush,
pushOnly: !!opts.pushOnly,
alwaysLatestBlock: !!opts.allowLatestBlock,
inflightRange: opts.inflightRange,
compat: opts.compat === true,
force: opts.force,
createIfMissing: opts.createIfMissing,
discoveryKey: opts.discoveryKey,
overwrite: opts.overwrite,
key,
keyPair: opts.keyPair,
legacy: opts.legacy,
manifest: opts.manifest,
globalCache: opts.globalCache || null
// session is a temp option, not to be relied on unless you know what you are doing (no semver guarantees)
});
}
function maybeAddMonitor(name) {
if (name === "append" || name === "truncate") return;
if (this._monitorIndex >= 0 || this.closing) return;
if (this.core === null) {
this._monitorIndex = -2;
} else {
this.core.addMonitor(this);
}
}
function isSessionMoved(err) {
return err.code === "SESSION_MOVED";
}
function getEncryptionOption(opts) {
if (opts.encryptionKey) return { key: opts.encryptionKey, block: !!opts.isBlockKey };
if (!opts.encryption) return null;
return b4a4.isBuffer(opts.encryption) ? { key: opts.encryption } : opts.encryption;
}
function isEncryptionProvider(e) {
return e && isFunction(e.padding) && isFunction(e.encrypt) && isFunction(e.decrypt);
}
function isFunction(fn) {
return !!fn && typeof fn === "function";
}
function createDiscoveryKeyHandler(fn) {
return ondiscoverykey;
function ondiscoverykey(id2) {
if (!id2 || id2.byteLength !== 32) throw BAD_ARGUMENT("Invalid discovery key");
return fn(id2);
}
}
}
});
// node_modules/encryption-encoding/spec/hyperschema/index.js
var require_hyperschema2 = __commonJS({
"node_modules/encryption-encoding/spec/hyperschema/index.js"(exports2, module2) {
var { c: c4 } = require_runtime();
var VERSION3 = 1;
var version3 = VERSION3;
var encoding03 = {
preencode(state, m) {
c4.uint.preencode(state, m.type);
c4.buffer.preencode(state, m.value);
},
encode(state, m) {
c4.uint.encode(state, m.type);
c4.buffer.encode(state, m.value);
},
decode(state) {
const r0 = c4.uint.decode(state);
const r1 = c4.buffer.decode(state);
return {
type: r0,
value: r1
};
}
};
function setVersion3(v) {
version3 = v;
}
function encode2(name, value, v = VERSION3) {
version3 = v;
return c4.encode(getEncoding3(name), value);
}
function decode2(name, buffer, v = VERSION3) {
version3 = v;
return c4.decode(getEncoding3(name), buffer);
}
function getEnum(name) {
switch (name) {
default:
throw new Error("Enum not found " + name);
}
}
function getEncoding3(name) {
switch (name) {
case "@encryption/encrypted-data":
return encoding03;
default:
throw new Error("Encoder not found " + name);
}
}
function getStruct(name, v = VERSION3) {
const enc = getEncoding3(name);
return {
preencode(state, m) {
version3 = v;
enc.preencode(state, m);
},
encode(state, m) {
version3 = v;
enc.encode(state, m);
},
decode(state) {
version3 = v;
return enc.decode(state);
}
};
}
var resolveStruct = getStruct;
module2.exports = {
resolveStruct,
getStruct,
getEnum,
getEncoding: getEncoding3,
encode: encode2,
decode: decode2,
setVersion: setVersion3,
version: version3
};
}
});
// node_modules/encryption-encoding/index.js
var require_encryption_encoding = __commonJS({
"node_modules/encryption-encoding/index.js"(exports2, module2) {
var { encode: encode2, decode: decode2 } = require_hyperschema2();
async function encrypt(data, cb) {
const result = await cb(data);
return encode2("@encryption/encrypted-data", result);
}
async function decrypt(data, cb) {
const decoded = decode2("@encryption/encrypted-data", data);
const decrypted = await cb(decoded);
return decrypted;
}
module2.exports = { encrypt, decrypt };
}
});
// node_modules/index-encoder/index.js
var require_index_encoder = __commonJS({
"node_modules/index-encoder/index.js"(exports2, module2) {
var b4a4 = require_b4a();
var EMPTY = b4a4.alloc(0);
var MAX = b4a4.from([255]);
var BUFFER = {};
BUFFER.preencode = function(state, buf) {
if (buf === null) buf = EMPTY;
let i = 0;
let extra = 3;
while ((i = b4a4.indexOf(buf, 0, i)) > -1) {
i++;
extra++;
}
state.end += buf.byteLength + extra;
};
BUFFER.encode = function(state, buf) {
if (buf === null) buf = EMPTY;
state.buffer[state.start++] = 0;
let prev = 0;
let i = 0;
while ((i = b4a4.indexOf(buf, 0, i)) > -1) {
const slice2 = buf.subarray(prev, ++i);
state.buffer.set(slice2, state.start);
state.start += slice2.byteLength;
state.buffer[state.start++] = 2;
prev = i;
}
const slice = buf.subarray(prev);
state.buffer.set(slice, state.start);
state.start += slice.byteLength;
state.buffer[state.start++] = 0;
state.buffer[state.start++] = 1;
};
BUFFER.decode = function(state) {
if (state.start >= state.end) throw new Error("Out of bounds");
if (state.buffer[state.start++] !== 0) {
throw new Error("Invalid start of string");
}
let escaped = null;
let prev = state.start;
let i = state.start;
while ((i = b4a4.indexOf(state.buffer, 0, i)) > -1) {
const next = ++i < state.end ? state.buffer[i] : 0;
i++;
if (next === 1) {
break;
}
if (next === 2) {
if (escaped === null) escaped = [];
escaped.push(state.buffer.subarray(prev, i - 1));
prev = i;
continue;
}
throw new Error("Unknown value in terminator");
}
if (i === -1) {
throw new Error("No terminator found");
}
state.start = i;
const last = state.buffer.subarray(prev, i - 2);
if (escaped === null) return last;
escaped.push(last);
return b4a4.concat(escaped);
};
var STRING = {};
STRING.preencode = function(state, str) {
BUFFER.preencode(state, b4a4.from(str || ""));
};
STRING.encode = function(state, str) {
BUFFER.encode(state, b4a4.from(str || ""));
};
STRING.decode = function(state, str) {
return b4a4.toString(BUFFER.decode(state));
};
var UINT = {};
UINT.preencode = function(state, n) {
state.end += n <= 251 ? 1 : n <= 65535 ? 3 : n <= 4294967295 ? 5 : n === Infinity ? 1 : 9;
};
UINT.encode = function(state, n) {
if (n === Infinity) {
state.buffer[state.start++] = 255;
return;
}
if (n <= 251) {
state.buffer[state.start++] = n;
return;
}
if (n <= 65535) {
state.buffer[state.start++] = 252;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n;
return;
}
if (n <= 4294967295) {
state.buffer[state.start++] = 253;
encodeUint32(state, n);
return;
}
if (Number.isSafeInteger(n)) {
state.buffer[state.start++] = 254;
const r = Math.floor(n / 4294967296);
encodeUint32(state, r);
encodeUint32(state, n);
return;
}
throw new Error("Invalid number " + n);
};
UINT.decode = function(state) {
if (state.start >= state.end) throw new Error("Out of bounds");
const a = state.buffer[state.start++];
if (a <= 251) return a;
if (a === 252) {
if (state.end - state.start < 2) throw new Error("Out of bounds");
return state.buffer[state.start++] * 256 + state.buffer[state.start++];
}
if (a === 253) {
return decodeUint32(state);
}
if (a === 254) {
return decodeUint32(state) * 4294967296 + decodeUint32(state);
}
return Infinity;
};
var INT = {};
INT.preencode = function(state, n) {
if (n >= -255 && n < 0) {
state.end += 2;
return;
}
n = Math.abs(n);
state.end += n <= 246 ? 1 : n <= 65535 ? 3 : n <= 4294967295 ? 5 : n === Infinity ? 1 : 9;
};
INT.encode = function(state, n) {
if (n === Infinity) {
state.buffer[state.start++] = 255;
return;
}
if (n === -Infinity) {
state.buffer[state.start++] = 0;
return;
}
if (n < -4294967295) {
if (!Number.isSafeInteger(n)) throw new Error("Invalid number " + n);
state.buffer[state.start++] = 1;
const r = Math.floor(-n / 4294967296);
encodeUint32(state, -r + 4294967295);
encodeUint32(state, -(-n % 4294967296) + 4294967295);
return;
}
if (n < -65535) {
state.buffer[state.start++] = 2;
n += 4294967295;
encodeUint32(state, n);
return;
}
if (n < -255) {
state.buffer[state.start++] = 3;
n += 65535;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n;
return;
}
if (n < 0) {
state.buffer[state.start++] = 4;
n += 255;
state.buffer[state.start++] = n;
return;
}
if (n <= 246) {
state.buffer[state.start++] = n + 5;
return;
}
if (n <= 65535) {
state.buffer[state.start++] = 252;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n;
return;
}
if (n <= 4294967295) {
state.buffer[state.start++] = 253;
encodeUint32(state, n);
return;
}
if (Number.isSafeInteger(n)) {
state.buffer[state.start++] = 254;
const r = Math.floor(n / 4294967296);
encodeUint32(state, r);
encodeUint32(state, n);
return;
}
throw new Error("Invalid number " + n);
};
INT.decode = function(state) {
if (state.start >= state.end) throw new Error("Out of bounds");
const a = state.buffer[state.start++];
if (a === 0) return -Infinity;
if (a === 1) {
return (decodeUint32(state) - 4294967295) * 4294967296 + decodeUint32(state) - 4294967295;
}
if (a === 2) {
return decodeUint32(state) - 4294967295;
}
if (a === 3) {
if (state.end - state.start < 2) throw new Error("Out of bounds");
return state.buffer[state.start++] * 256 + state.buffer[state.start++] - 65535;
}
if (a === 4) return state.buffer[state.start++] - 255;
if (a <= 251) return a - 5;
if (a === 252) {
if (state.end - state.start < 2) throw new Error("Out of bounds");
return state.buffer[state.start++] * 256 + state.buffer[state.start++];
}
if (a === 253) {
return decodeUint32(state);
}
if (a === 254) {
return decodeUint32(state) * 4294967296 + decodeUint32(state);
}
return Infinity;
};
var DATE = {};
DATE.preencode = (state, d) => INT.preencode(state, d.getTime());
DATE.encode = (state, d) => INT.encode(state, d.getTime());
DATE.decode = (state) => new Date(INT.decode(state));
var BOOL = {};
BOOL.preencode = (state, b) => UINT.preencode(state, b ? 1 : 0);
BOOL.encode = (state, b) => UINT.encode(state, b ? 1 : 0);
BOOL.decode = (state) => !!UINT.decode(state);
module2.exports = class IndexEncoder {
constructor(encodings, { prefix = -1 } = {}) {
this.encodings = encodings;
this.prefix = prefix;
}
static BUFFER = BUFFER;
static STRING = STRING;
static UINT = UINT;
static INT = INT;
static DATE = DATE;
static BOOL = BOOL;
static lookup(c4) {
switch (c4) {
case "uint":
return UINT;
case "uint8":
return UINT;
case "uint16":
return UINT;
case "uint24":
return UINT;
case "uint32":
return UINT;
case "uint40":
return UINT;
case "uint48":
return UINT;
case "uint56":
return UINT;
case "uint64":
return UINT;
case "int":
return INT;
case "int8":
return INT;
case "int16":
return INT;
case "int24":
return INT;
case "int32":
return INT;
case "int40":
return INT;
case "int48":
return INT;
case "int56":
return INT;
case "int64":
return INT;
case "string":
return STRING;
case "utf8":
return STRING;
case "ascii":
return STRING;
case "hex":
return STRING;
case "base64":
return STRING;
case "fixed32":
return BUFFER;
case "fixed64":
return BUFFER;
case "buffer":
return BUFFER;
case "date":
return DATE;
case "bool":
return BOOL;
}
throw new Error("Unknown type");
}
encode(keys) {
return this._encode(keys, false);
}
_encode(keys, terminate) {
if (b4a4.isBuffer(keys)) return keys;
const state = { start: 0, end: 0, buffer: null };
if (this.prefix !== -1) UINT.preencode(state, this.prefix);
for (let i = 0; i < keys.length; i++) {
this.encodings[i].preencode(state, keys[i]);
}
if (terminate && keys.length < this.encodings.length) {
state.end++;
}
state.buffer = b4a4.allocUnsafe(state.end);
if (this.prefix !== -1) UINT.encode(state, this.prefix);
for (let i = 0; i < keys.length; i++) {
this.encodings[i].encode(state, keys[i]);
}
if (terminate && keys.length < this.encodings.length) {
state.buffer[state.start++] = MAX[0];
}
return state.buffer;
}
decode(buffer) {
const state = { start: 0, end: buffer.byteLength, buffer };
const result = [];
if (this.prefix !== -1) UINT.decode(state);
for (const enc of this.encodings) {
const key = state.start < state.end ? enc.decode(state) : enc === UINT ? 0 : null;
result.push(key);
}
return result;
}
encodeRange({ gt, gte, lt, lte }) {
const range = {
gt: gt && this._encode(gt, true),
gte: gte && this._encode(gte, false),
lt: lt && this._encode(lt, false),
lte: lte && this._encode(lte, true)
};
if (this.prefix !== -1) {
if (!gt && !gte) range.gte = encodeUint(this.prefix);
if (!lt && !lte) range.lt = encodeUint(this.prefix + 1);
}
return range;
}
};
function encodeUint(n) {
const state = { start: 0, end: 0, buffer: null };
UINT.preencode(state, n);
state.buffer = b4a4.allocUnsafe(state.end);
UINT.encode(state, n);
return state.buffer;
}
function encodeUint32(state, n) {
state.buffer[state.start++] = n >>> 24;
state.buffer[state.start++] = n >>> 16;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n;
}
function decodeUint32(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
return state.buffer[state.start++] * 16777216 + state.buffer[state.start++] * 65536 + state.buffer[state.start++] * 256 + state.buffer[state.start++];
}
}
});
// node_modules/autobase/encoding/legacy.js
var require_legacy = __commonJS({
"node_modules/autobase/encoding/legacy.js"(exports2, module2) {
var c4 = require_compact_encoding();
var IndexEncoder2 = require_index_encoder();
var Checkout = {
preencode(state, m) {
c4.fixed32.preencode(state, m.key);
c4.uint.preencode(state, m.length);
},
encode(state, m) {
c4.fixed32.encode(state, m.key);
c4.uint.encode(state, m.length);
},
decode(state) {
return {
key: c4.fixed32.decode(state),
length: c4.uint.decode(state)
};
}
};
var Clock = c4.array(Checkout);
var IndexCheckpoint = {
preencode(state, m) {
c4.fixed64.preencode(state, m.signature);
c4.uint.preencode(state, m.length);
},
encode(state, m) {
c4.fixed64.encode(state, m.signature);
c4.uint.encode(state, m.length);
},
decode(state) {
return {
signature: c4.fixed64.decode(state),
length: c4.uint.decode(state)
};
}
};
var KeyV0 = {
preencode(state, m) {
c4.fixed32.preencode(state, m.key);
},
encode(state, m) {
c4.fixed32.encode(state, m.key);
},
decode(state) {
return {
key: c4.fixed32.decode(state),
length: -1
};
}
};
var KeysV0 = c4.array(KeyV0);
var WakeupV0 = {
preencode(state, m) {
c4.uint.preencode(state, 0);
c4.uint.preencode(state, m.type);
if (m.type === 1) {
KeysV0.preencode(state, m.writers);
}
},
encode(state, m) {
c4.uint.encode(state, 0);
c4.uint.encode(state, m.type);
if (m.type === 1) {
KeysV0.encode(state, m.writers);
}
},
decode(state) {
const v = c4.uint.decode(state);
if (v !== 0) throw new Error("Unsupported version: " + v);
const type = c4.uint.decode(state);
const m = { version: 0, type, writers: null };
if (m.type === 1) {
m.writers = KeysV0.decode(state);
}
return m;
}
};
var Wakeup = {
preencode(state, m) {
if (m.version === 0) return WakeupV0.preencode(state, m);
c4.uint.preencode(state, 1);
c4.uint.preencode(state, m.type);
if (m.type === 1) {
Clock.preencode(state, m.writers);
}
},
encode(state, m) {
if (m.version === 0) return WakeupV0.encode(state, m);
c4.uint.encode(state, 1);
c4.uint.encode(state, m.type);
if (m.type === 1) {
Clock.encode(state, m.writers);
}
},
decode(state) {
const start = state.start;
const v = c4.uint.decode(state);
if (v > 1) throw new Error("Unsupported version: " + v);
if (v === 0) {
state.start = start;
return WakeupV0.decode(state);
}
const type = c4.uint.decode(state);
const m = { version: 1, type, writers: null };
if (m.type === 1) {
m.writers = Clock.decode(state);
}
return m;
}
};
var BootRecordV0 = {
preencode() {
throw new Error("version 0 records cannot be encoded");
},
encode() {
throw new Error("version 0 records cannot be encoded");
},
decode(state) {
const indexed = Checkout.decode(state);
const heads = Clock.decode(state);
return {
version: 0,
key: indexed.key,
systemLength: indexed.length,
indexersUpdated: false,
fastForwarding: false,
recoveries: 1,
migrating: false,
heads
};
}
};
var Checkpointer = {
preencode(state, idx) {
c4.uint.preencode(state, idx.checkpointer);
if (idx.checkpoint !== null) IndexCheckpoint.preencode(state, idx.checkpoint);
},
encode(state, idx) {
c4.uint.encode(state, idx.checkpointer);
if (idx.checkpoint !== null) IndexCheckpoint.encode(state, idx.checkpoint);
},
decode(state) {
const checkpointer = c4.uint.decode(state);
const checkpoint = checkpointer ? null : IndexCheckpoint.decode(state);
return {
checkpointer,
checkpoint
};
}
};
var CheckpointerArray = c4.array(Checkpointer);
var Indexer = {
preencode(state, m) {
c4.uint.preencode(state, m.signature);
c4.fixed32.preencode(state, m.namespace);
c4.fixed32.preencode(state, m.publicKey);
},
encode(state, m) {
c4.uint.encode(state, m.signature);
c4.fixed32.encode(state, m.namespace);
c4.fixed32.encode(state, m.publicKey);
},
decode(state) {
return {
signature: c4.uint.decode(state),
namespace: c4.fixed32.decode(state),
publicKey: c4.fixed32.decode(state)
};
}
};
var Indexers = c4.array(Indexer);
var DigestV0 = {
preencode(state, m) {
c4.uint.preencode(state, m.pointer);
if (m.pointer === 0) {
Indexers.preencode(state, m.indexers);
}
},
encode(state, m) {
c4.uint.encode(state, m.pointer);
if (m.pointer === 0) {
Indexers.encode(state, m.indexers);
}
},
decode(state) {
const pointer = c4.uint.decode(state);
return {
pointer,
indexers: pointer === 0 ? Indexers.decode(state) : null
};
}
};
var Digest = {
preencode(state, m) {
c4.uint.preencode(state, m.pointer);
if (m.pointer === 0) {
c4.fixed32.preencode(state, m.key);
}
},
encode(state, m) {
c4.uint.encode(state, m.pointer);
if (m.pointer === 0) {
c4.fixed32.encode(state, m.key);
}
},
decode(state) {
const pointer = c4.uint.decode(state);
return {
pointer,
key: pointer === 0 ? c4.fixed32.decode(state) : null
};
}
};
var Node = {
preencode(state, m) {
Clock.preencode(state, m.heads);
c4.uint.preencode(state, m.batch);
c4.buffer.preencode(state, m.value);
},
encode(state, m) {
Clock.encode(state, m.heads);
c4.uint.encode(state, m.batch);
c4.buffer.encode(state, m.value);
},
decode(state, m) {
return {
heads: Clock.decode(state),
batch: c4.uint.decode(state),
value: c4.buffer.decode(state)
};
}
};
var Additional = {
preencode(state, m) {
c4.uint.preencode(state, m.pointer);
if (m.pointer === 0) {
AdditionalData.preencode(state, m.data);
}
},
encode(state, m) {
c4.uint.encode(state, m.pointer);
if (m.pointer === 0) {
AdditionalData.encode(state, m.data);
}
},
decode(state) {
const pointer = c4.uint.decode(state);
return {
pointer,
data: pointer === 0 ? AdditionalData.decode(state) : null
};
}
};
var AdditionalData = {
preencode(state, m) {
c4.uint.preencode(state, 0);
},
encode(state, m) {
c4.uint.encode(state, 0);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
encryptionId: flags & 1 ? c4.fixed32.decode(state) : null,
// to help validate the encryption key used
abi: flags & 2 ? c4.uint.decode(state) : 0
};
}
};
var OplogMessageV1 = {
preencode(state, m) {
throw new Error("Encoding not supported");
},
encode(state, m) {
throw new Error("Encoding not supported");
},
decode(state) {
const maxSupportedVersion = c4.uint.decode(state);
const flags = c4.uint.decode(state);
const isCheckpointer = (flags & 1) !== 0;
const chk = isCheckpointer ? CheckpointerArray.decode(state) : null;
const digest = isCheckpointer ? Digest.decode(state) : null;
const node = Node.decode(state);
return {
version: 1,
maxSupportedVersion,
digest,
checkpoint: chk ? { system: chk[0], encryption: null, user: chk.slice(1) } : null,
optimistic: (flags & 2) !== 0,
node
};
}
};
var OplogMessageV0 = {
preencode(state, m) {
throw new Error("Encoding not supported");
},
encode(state, m) {
throw new Error("Encoding not supported");
},
decode(state) {
const flags = c4.uint.decode(state);
const isCheckpointer = (flags & 1) !== 0;
if (isCheckpointer) DigestV0.decode(state);
const chk = isCheckpointer ? CheckpointerArray.decode(state) : null;
const node = Node.decode(state);
Additional.decode(state);
const maxSupportedVersion = state.start < state.end ? c4.uint.decode(state) : 0;
return {
version: 0,
maxSupportedVersion,
digest: null,
checkpoint: chk ? { system: chk[0], encryption: null, user: chk.slice(1) } : null,
optimistic: null,
node
};
}
};
var LINEARIZER_PREFIX = 1;
var LinearizerKey = {
preencode(state, seq) {
IndexEncoder2.UINT.preencode(state, LINEARIZER_PREFIX);
IndexEncoder2.UINT.preencode(state, seq);
},
encode(state, seq) {
IndexEncoder2.UINT.encode(state, LINEARIZER_PREFIX);
IndexEncoder2.UINT.encode(state, seq);
},
decode(state) {
IndexEncoder2.UINT.decode(state);
return IndexEncoder2.UINT.decode(state);
}
};
function infoLegacyMap(info) {
return {
version: info.version,
members: info.members,
pendingIndexers: info.pendingIndexers,
indexers: info.indexers,
heads: info.heads,
views: info.views,
encryptionLength: 0,
entropy: null
};
}
module2.exports = {
Wakeup,
BootRecordV0,
OplogMessageV0,
OplogMessageV1,
LinearizerKey,
infoLegacyMap
};
}
});
// node_modules/autobase/encoding/spec/autobase/index.js
var require_autobase = __commonJS({
"node_modules/autobase/encoding/spec/autobase/index.js"(exports2, module2) {
var { c: c4 } = require_runtime();
var external0 = require_legacy();
var VERSION3 = 1;
var version3 = VERSION3;
var encoding03 = {
preencode(state, m) {
c4.fixed32.preencode(state, m.key);
c4.uint.preencode(state, m.length);
},
encode(state, m) {
c4.fixed32.encode(state, m.key);
c4.uint.encode(state, m.length);
},
decode(state) {
const r0 = c4.fixed32.decode(state);
const r1 = c4.uint.decode(state);
return {
key: r0,
length: r1
};
}
};
var encoding110 = c4.array(encoding03);
var encoding23 = {
preencode(state, m) {
c4.fixed64.preencode(state, m.signature);
c4.uint.preencode(state, m.length);
},
encode(state, m) {
c4.fixed64.encode(state, m.signature);
c4.uint.encode(state, m.length);
},
decode(state) {
const r0 = c4.fixed64.decode(state);
const r1 = c4.uint.decode(state);
return {
signature: r0,
length: r1
};
}
};
var encoding33 = external0.Wakeup;
var encoding43 = external0.BootRecordV0;
var encoding53 = {
preencode(state, m) {
c4.fixed32.preencode(state, m.key);
c4.uint.preencode(state, m.systemLength);
state.end++;
if (m.recoveries) c4.uint.preencode(state, m.recoveries);
},
encode(state, m) {
const flags = (m.indexersUpdated ? 1 : 0) | (m.fastForwarding ? 2 : 0) | (m.recoveries ? 4 : 0);
c4.fixed32.encode(state, m.key);
c4.uint.encode(state, m.systemLength);
c4.uint.encode(state, flags);
if (m.recoveries) c4.uint.encode(state, m.recoveries);
},
decode(state, version4) {
if (version4 === void 0) version4 = c4.uint.decode(state);
const r0 = c4.fixed32.decode(state);
const r1 = c4.uint.decode(state);
const flags = c4.uint.decode(state);
return {
version: version4,
key: r0,
systemLength: r1,
indexersUpdated: (flags & 1) !== 0,
fastForwarding: (flags & 2) !== 0,
recoveries: (flags & 4) !== 0 ? c4.uint.decode(state) : 0
};
}
};
var encoding63 = {
preencode(state, m) {
c4.uint.preencode(state, m.version);
switch (m.version) {
case 0:
encoding43.preencode(state, m);
break;
case 1:
case 2:
case 3:
encoding53.preencode(state, m);
break;
default:
throw new Error("Unsupported version");
}
},
encode(state, m) {
c4.uint.encode(state, m.version);
switch (m.version) {
case 0:
encoding43.encode(state, m);
break;
case 1:
case 2:
case 3:
encoding53.encode(state, m);
break;
default:
throw new Error("Unsupported version");
}
},
decode(state) {
const version4 = c4.uint.decode(state);
switch (version4) {
case 0: {
const decoded = encoding43.decode(state, version4);
return decoded;
}
case 1:
case 2:
case 3: {
const decoded = encoding53.decode(state, version4);
return decoded;
}
default:
throw new Error("Unsupported version");
}
}
};
var encoding73 = {
preencode(state, m) {
state.end++;
if (m.checkpointer) c4.uint.preencode(state, m.checkpointer);
if (m.checkpoint) encoding23.preencode(state, m.checkpoint);
},
encode(state, m) {
const flags = (m.checkpointer ? 1 : 0) | (m.checkpoint ? 2 : 0);
c4.uint.encode(state, flags);
if (m.checkpointer) c4.uint.encode(state, m.checkpointer);
if (m.checkpoint) encoding23.encode(state, m.checkpoint);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
checkpointer: (flags & 1) !== 0 ? c4.uint.decode(state) : 0,
checkpoint: (flags & 2) !== 0 ? encoding23.decode(state) : null
};
}
};
var encoding8_2 = c4.array(encoding73);
var encoding83 = {
preencode(state, m) {
state.end++;
if (m.system) encoding73.preencode(state, m.system);
if (m.encryption) encoding73.preencode(state, m.encryption);
if (m.user) encoding8_2.preencode(state, m.user);
},
encode(state, m) {
const flags = (m.system ? 1 : 0) | (m.encryption ? 2 : 0) | (m.user ? 4 : 0);
c4.uint.encode(state, flags);
if (m.system) encoding73.encode(state, m.system);
if (m.encryption) encoding73.encode(state, m.encryption);
if (m.user) encoding8_2.encode(state, m.user);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
system: (flags & 1) !== 0 ? encoding73.decode(state) : null,
encryption: (flags & 2) !== 0 ? encoding73.decode(state) : null,
user: (flags & 4) !== 0 ? encoding8_2.decode(state) : null
};
}
};
var encoding93 = {
preencode(state, m) {
state.end++;
if (m.pointer) c4.uint.preencode(state, m.pointer);
if (m.key) c4.fixed32.preencode(state, m.key);
},
encode(state, m) {
const flags = (m.pointer ? 1 : 0) | (m.key ? 2 : 0);
c4.uint.encode(state, flags);
if (m.pointer) c4.uint.encode(state, m.pointer);
if (m.key) c4.fixed32.encode(state, m.key);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
pointer: (flags & 1) !== 0 ? c4.uint.decode(state) : 0,
key: (flags & 2) !== 0 ? c4.fixed32.decode(state) : null
};
}
};
var encoding103 = {
preencode(state, m) {
encoding110.preencode(state, m.heads);
c4.uint.preencode(state, m.batch);
c4.buffer.preencode(state, m.value);
},
encode(state, m) {
encoding110.encode(state, m.heads);
c4.uint.encode(state, m.batch);
c4.buffer.encode(state, m.value);
},
decode(state) {
const r0 = encoding110.decode(state);
const r1 = c4.uint.decode(state);
const r2 = c4.buffer.decode(state);
return {
heads: r0,
batch: r1,
value: r2
};
}
};
var encoding11_0 = c4.array(c4.uint);
var encoding11_1 = encoding11_0;
var encoding113 = {
preencode(state, m) {
encoding11_0.preencode(state, m.system);
encoding11_1.preencode(state, m.encryption);
encoding11_2.preencode(state, m.user);
},
encode(state, m) {
encoding11_0.encode(state, m.system);
encoding11_1.encode(state, m.encryption);
encoding11_2.encode(state, m.user);
},
decode(state) {
const r0 = encoding11_0.decode(state);
const r1 = encoding11_1.decode(state);
const r2 = encoding11_2.decode(state);
return {
system: r0,
encryption: r1,
user: r2
};
}
};
var encoding123 = external0.OplogMessageV0;
var encoding133 = external0.OplogMessageV1;
var encoding14_1 = c4.frame(encoding83);
var encoding14_2 = c4.frame(encoding93);
var encoding14_4 = c4.frame(encoding113);
var encoding143 = {
preencode(state, m) {
encoding103.preencode(state, m.node);
state.end++;
if (m.checkpoint) encoding14_1.preencode(state, m.checkpoint);
if (m.digest) encoding14_2.preencode(state, m.digest);
if (m.trace) encoding14_4.preencode(state, m.trace);
},
encode(state, m) {
const flags = (m.checkpoint ? 1 : 0) | (m.digest ? 2 : 0) | (m.optimistic ? 4 : 0) | (m.trace ? 8 : 0);
encoding103.encode(state, m.node);
c4.uint.encode(state, flags);
if (m.checkpoint) encoding14_1.encode(state, m.checkpoint);
if (m.digest) encoding14_2.encode(state, m.digest);
if (m.trace) encoding14_4.encode(state, m.trace);
},
decode(state, version4) {
if (version4 === void 0) version4 = c4.uint.decode(state);
const r0 = encoding103.decode(state);
const flags = c4.uint.decode(state);
return {
version: version4,
node: r0,
checkpoint: (flags & 1) !== 0 ? encoding14_1.decode(state) : null,
digest: (flags & 2) !== 0 ? encoding14_2.decode(state) : null,
optimistic: (flags & 4) !== 0,
trace: (flags & 8) !== 0 ? encoding14_4.decode(state) : null
};
}
};
var encoding153 = {
preencode(state, m) {
c4.uint.preencode(state, m.version);
switch (m.version) {
case 0:
encoding123.preencode(state, m);
break;
case 1:
encoding133.preencode(state, m);
break;
case 2:
encoding143.preencode(state, m);
break;
default:
throw new Error("Unsupported version");
}
},
encode(state, m) {
c4.uint.encode(state, m.version);
switch (m.version) {
case 0:
encoding123.encode(state, m);
break;
case 1:
encoding133.encode(state, m);
break;
case 2:
encoding143.encode(state, m);
break;
default:
throw new Error("Unsupported version");
}
},
decode(state) {
const version4 = c4.uint.decode(state);
switch (version4) {
case 0: {
const decoded = encoding123.decode(state, version4);
return decoded;
}
case 1: {
const decoded = encoding133.decode(state, version4);
return decoded;
}
case 2: {
const decoded = encoding143.decode(state, version4);
return decoded;
}
default:
throw new Error("Unsupported version");
}
}
};
var encoding16_1 = c4.array(c4.fixed32);
var encoding163 = {
preencode(state, m) {
c4.uint.preencode(state, m.members);
encoding16_1.preencode(state, m.pendingIndexers);
encoding110.preencode(state, m.indexers);
encoding110.preencode(state, m.heads);
encoding110.preencode(state, m.views);
},
encode(state, m) {
c4.uint.encode(state, m.members);
encoding16_1.encode(state, m.pendingIndexers);
encoding110.encode(state, m.indexers);
encoding110.encode(state, m.heads);
encoding110.encode(state, m.views);
},
decode(state, version4) {
if (version4 === void 0) version4 = c4.uint.decode(state);
const r0 = c4.uint.decode(state);
const r1 = encoding16_1.decode(state);
const r2 = encoding110.decode(state);
const r3 = encoding110.decode(state);
const r4 = encoding110.decode(state);
return {
version: version4,
members: r0,
pendingIndexers: r1,
indexers: r2,
heads: r3,
views: r4
};
}
};
var encoding17_1 = encoding16_1;
var encoding172 = {
preencode(state, m) {
c4.uint.preencode(state, m.members);
encoding17_1.preencode(state, m.pendingIndexers);
encoding110.preencode(state, m.indexers);
encoding110.preencode(state, m.heads);
encoding110.preencode(state, m.views);
c4.uint.preencode(state, m.encryptionLength);
state.end++;
if (m.entropy) c4.fixed32.preencode(state, m.entropy);
},
encode(state, m) {
const flags = m.entropy ? 1 : 0;
c4.uint.encode(state, m.members);
encoding17_1.encode(state, m.pendingIndexers);
encoding110.encode(state, m.indexers);
encoding110.encode(state, m.heads);
encoding110.encode(state, m.views);
c4.uint.encode(state, m.encryptionLength);
c4.uint.encode(state, flags);
if (m.entropy) c4.fixed32.encode(state, m.entropy);
},
decode(state, version4) {
if (version4 === void 0) version4 = c4.uint.decode(state);
const r0 = c4.uint.decode(state);
const r1 = encoding17_1.decode(state);
const r2 = encoding110.decode(state);
const r3 = encoding110.decode(state);
const r4 = encoding110.decode(state);
const r5 = c4.uint.decode(state);
const flags = c4.uint.decode(state);
return {
version: version4,
members: r0,
pendingIndexers: r1,
indexers: r2,
heads: r3,
views: r4,
encryptionLength: r5,
entropy: (flags & 1) !== 0 ? c4.fixed32.decode(state) : null
};
}
};
var encoding182 = {
preencode(state, m) {
c4.uint.preencode(state, m.version);
switch (m.version) {
case 0:
case 1:
encoding163.preencode(state, m);
break;
case 2:
encoding172.preencode(state, m);
break;
default:
throw new Error("Unsupported version");
}
},
encode(state, m) {
c4.uint.encode(state, m.version);
switch (m.version) {
case 0:
case 1:
encoding163.encode(state, m);
break;
case 2:
encoding172.encode(state, m);
break;
default:
throw new Error("Unsupported version");
}
},
decode(state) {
const version4 = c4.uint.decode(state);
switch (version4) {
case 0:
case 1: {
const decoded = encoding163.decode(state, version4);
const map = external0.infoLegacyMap;
return map(decoded);
}
case 2: {
const decoded = encoding172.decode(state, version4);
return decoded;
}
default:
throw new Error("Unsupported version");
}
}
};
var encoding192 = {
preencode(state, m) {
state.end++;
c4.uint.preencode(state, m.length);
},
encode(state, m) {
const flags = (m.isIndexer ? 1 : 0) | (m.isRemoved ? 2 : 0);
c4.uint.encode(state, flags);
c4.uint.encode(state, m.length);
},
decode(state) {
const flags = c4.uint.decode(state);
return {
isIndexer: (flags & 1) !== 0,
isRemoved: (flags & 2) !== 0,
length: c4.uint.decode(state)
};
}
};
var encoding202 = external0.LinearizerKey;
var encoding212 = {
preencode(state, m) {
c4.fixed32.preencode(state, m.key);
c4.uint.preencode(state, m.length);
c4.uint.preencode(state, m.batch);
c4.uint.preencode(state, m.systemLength);
state.end++;
},
encode(state, m) {
const flags = m.indexers ? 1 : 0;
c4.fixed32.encode(state, m.key);
c4.uint.encode(state, m.length);
c4.uint.encode(state, m.batch);
c4.uint.encode(state, m.systemLength);
c4.uint.encode(state, flags);
},
decode(state) {
const r0 = c4.fixed32.decode(state);
const r1 = c4.uint.decode(state);
const r2 = c4.uint.decode(state);
const r3 = c4.uint.decode(state);
const flags = c4.uint.decode(state);
return {
key: r0,
length: r1,
batch: r2,
systemLength: r3,
indexers: (flags & 1) !== 0
};
}
};
var encoding222 = {
preencode(state, m) {
c4.uint.preencode(state, m.type);
c4.buffer.preencode(state, m.payload);
},
encode(state, m) {
c4.uint.encode(state, m.type);
c4.buffer.encode(state, m.payload);
},
decode(state) {
const r0 = c4.uint.decode(state);
const r1 = c4.buffer.decode(state);
return {
type: r0,
payload: r1
};
}
};
var encoding232 = {
preencode(state, m) {
c4.uint.preencode(state, m.version);
state.end++;
if (m.legacyBlocks) c4.uint.preencode(state, m.legacyBlocks);
if (m.namespace) c4.fixed32.preencode(state, m.namespace);
},
encode(state, m) {
const flags = (m.legacyBlocks ? 1 : 0) | (m.namespace ? 2 : 0);
c4.uint.encode(state, m.version);
c4.uint.encode(state, flags);
if (m.legacyBlocks) c4.uint.encode(state, m.legacyBlocks);
if (m.namespace) c4.fixed32.encode(state, m.namespace);
},
decode(state) {
const r0 = c4.uint.decode(state);
const flags = c4.uint.decode(state);
return {
version: r0,
legacyBlocks: (flags & 1) !== 0 ? c4.uint.decode(state) : 0,
namespace: (flags & 2) !== 0 ? c4.fixed32.decode(state) : null
};
}
};
var encoding24_1 = encoding11_0;
var encoding24 = {
preencode(state, m) {
c4.uint.preencode(state, m.view);
encoding24_1.preencode(state, m.blocks);
},
encode(state, m) {
c4.uint.encode(state, m.view);
encoding24_1.encode(state, m.blocks);
},
decode(state) {
const r0 = c4.uint.decode(state);
const r1 = encoding24_1.decode(state);
return {
view: r0,
blocks: r1
};
}
};
var encoding11_2 = c4.array(encoding24);
function setVersion3(v) {
version3 = v;
}
function encode2(name, value, v = VERSION3) {
version3 = v;
return c4.encode(getEncoding3(name), value);
}
function decode2(name, buffer, v = VERSION3) {
version3 = v;
return c4.decode(getEncoding3(name), buffer);
}
function getEnum(name) {
switch (name) {
default:
throw new Error("Enum not found " + name);
}
}
function getEncoding3(name) {
switch (name) {
case "@autobase/checkout":
return encoding03;
case "@autobase/clock":
return encoding110;
case "@autobase/index-checkpoint":
return encoding23;
case "@autobase/wakeup":
return encoding33;
case "@autobase/boot-record-v0":
return encoding43;
case "@autobase/boot-record-raw":
return encoding53;
case "@autobase/boot-record":
return encoding63;
case "@autobase/checkpointer":
return encoding73;
case "@autobase/checkpoint":
return encoding83;
case "@autobase/digest":
return encoding93;
case "@autobase/node":
return encoding103;
case "@autobase/trace":
return encoding113;
case "@autobase/oplog-message-v0":
return encoding123;
case "@autobase/oplog-message-v1":
return encoding133;
case "@autobase/oplog-message-v2":
return encoding143;
case "@autobase/oplog-message":
return encoding153;
case "@autobase/info-v1":
return encoding163;
case "@autobase/info-v2":
return encoding172;
case "@autobase/info":
return encoding182;
case "@autobase/member":
return encoding192;
case "@autobase/linearizer-key":
return encoding202;
case "@autobase/linearizer-update":
return encoding212;
case "@autobase/encryption-descriptor":
return encoding222;
case "@autobase/manifest-data":
return encoding232;
case "@autobase/user-view-trace":
return encoding24;
default:
throw new Error("Encoder not found " + name);
}
}
function getStruct(name, v = VERSION3) {
const enc = getEncoding3(name);
return {
preencode(state, m) {
version3 = v;
enc.preencode(state, m);
},
encode(state, m) {
version3 = v;
enc.encode(state, m);
},
decode(state) {
version3 = v;
return enc.decode(state);
}
};
}
var resolveStruct = getStruct;
module2.exports = {
resolveStruct,
getStruct,
getEnum,
getEncoding: getEncoding3,
encode: encode2,
decode: decode2,
setVersion: setVersion3,
version: version3
};
}
});
// node_modules/autobase/lib/messages.js
var require_messages3 = __commonJS({
"node_modules/autobase/lib/messages.js"(exports2, module2) {
var schema = require_autobase();
module2.exports = {
Wakeup: schema.resolveStruct("@autobase/wakeup"),
Clock: schema.resolveStruct("@autobase/clock"),
Checkout: schema.resolveStruct("@autobase/checkout"),
BootRecord: schema.resolveStruct("@autobase/boot-record"),
OplogMessage: schema.resolveStruct("@autobase/oplog-message"),
Checkpoint: schema.resolveStruct("@autobase/checkpoint"),
Info: schema.resolveStruct("@autobase/info"),
Member: schema.resolveStruct("@autobase/member"),
ManifestData: schema.resolveStruct("@autobase/manifest-data"),
LINEARIZER_PREFIX: 1,
LinearizerKey: schema.resolveStruct("@autobase/linearizer-key"),
LinearizerUpdate: schema.resolveStruct("@autobase/linearizer-update"),
EncryptionDescriptor: schema.resolveStruct("@autobase/encryption-descriptor")
};
}
});
// node_modules/autobase/lib/local-state.js
var require_local_state = __commonJS({
"node_modules/autobase/lib/local-state.js"(exports2, module2) {
var c4 = require_compact_encoding();
var b4a4 = require_b4a();
var messages = require_messages3();
var GTE = b4a4.from([messages.LINEARIZER_PREFIX]);
var LT = b4a4.from([messages.LINEARIZER_PREFIX + 1]);
module2.exports = class LocalState {
constructor(core) {
this.core = core;
this.tx = null;
}
static clear(core) {
const tx = core.state.storage.write();
tx.deleteLocalRange(GTE, LT);
return tx.flush();
}
static async moveTo(src, dst) {
const boot = await src.getUserData("autobase/boot");
const tx = dst.state.storage.write();
tx.deleteLocalRange(GTE, LT);
for await (const data of src.state.storage.createLocalStream({ gte: GTE, lt: LT })) {
tx.putLocal(data.key, data.value);
}
tx.putUserData("autobase/boot", boot);
await tx.flush();
}
setBootRecord(boot) {
if (this.tx === null) this.tx = this.core.state.storage.write();
this.tx.putUserData("autobase/boot", c4.encode(messages.BootRecord, boot));
}
async listUpdates() {
const updates = [];
for await (const data of this.core.state.storage.createLocalStream({ gte: GTE, lt: LT })) {
const update = c4.decode(messages.LinearizerUpdate, data.value);
const seq = c4.decode(messages.LinearizerKey, data.key);
update.seq = seq;
updates.push(update);
}
return updates;
}
clearUpdates() {
if (this.tx === null) this.tx = this.core.state.storage.write();
this.tx.deleteLocalRange(GTE, LT);
}
deleteUpdate(update) {
if (this.tx === null) this.tx = this.core.state.storage.write();
this.tx.deleteLocal(c4.encode(messages.LinearizerKey, update.seq));
}
insertUpdate(update) {
if (this.tx === null) this.tx = this.core.state.storage.write();
this.tx.putLocal(
c4.encode(messages.LinearizerKey, update.seq),
c4.encode(messages.LinearizerUpdate, update)
);
}
flush() {
if (!this.tx) return Promise.resolve();
const flushing = this.tx.flush();
this.tx = null;
return flushing;
}
};
}
});
// node_modules/tiny-buffer-map/index.js
var require_tiny_buffer_map = __commonJS({
"node_modules/tiny-buffer-map/index.js"(exports2, module2) {
var b4a4 = require_b4a();
module2.exports = class BufferMap {
constructor(other) {
this.m = other ? new Map([...other.m]) : /* @__PURE__ */ new Map();
}
get size() {
return this.m.size;
}
get(key) {
if (b4a4.isBuffer(key)) key = b4a4.toString(key, "hex");
return this.m.get(key);
}
set(key, value) {
if (b4a4.isBuffer(key)) key = b4a4.toString(key, "hex");
return this.m.set(key, value);
}
delete(key) {
if (b4a4.isBuffer(key)) key = b4a4.toString(key, "hex");
return this.m.delete(key);
}
has(key) {
if (b4a4.isBuffer(key)) key = b4a4.toString(key, "hex");
return this.m.has(key);
}
*[Symbol.iterator]() {
for (const [key, value] of this.m) {
yield [b4a4.from(key, "hex"), value];
}
}
*keys() {
for (const key of this.m.keys()) {
yield b4a4.from(key, "hex");
}
}
values() {
return this.m.values();
}
clear() {
return this.m.clear();
}
};
}
});
// node_modules/autobase/lib/clock.js
var require_clock = __commonJS({
"node_modules/autobase/lib/clock.js"(exports2, module2) {
var BufferMap = require_tiny_buffer_map();
module2.exports = class Clock {
constructor() {
this.seen = new BufferMap();
}
get size() {
return this.seen.size;
}
has(key) {
return this.seen.has(key);
}
includes(key, length) {
return this.seen.has(key) && this.seen.get(key) >= length;
}
get(key) {
return this.seen.get(key) || 0;
}
set(key, len) {
this.seen.set(key, len);
return len;
}
add(clock) {
for (const [key, l] of clock) {
if (this.get(key) < l) this.set(key, l);
}
}
[Symbol.iterator]() {
return this.seen[Symbol.iterator]();
}
};
}
});
// node_modules/autobase/lib/consensus.js
var require_consensus = __commonJS({
"node_modules/autobase/lib/consensus.js"(exports2, module2) {
var BufferMap = require_tiny_buffer_map();
var Clock = require_clock();
var UNSEEN = 0;
var NEWER = 1;
var ACKED = 2;
module2.exports = class Consensus {
constructor(indexers) {
this.merges = /* @__PURE__ */ new Set();
this.majority = (indexers.length >>> 1) + 1;
this.indexers = indexers;
this.removed = new Clock();
this.updated = false;
this.writers = new BufferMap();
for (const idx of this.indexers) {
this.writers.set(idx.core.key, idx);
}
}
addHead(node) {
if (!node.writer.isActiveIndexer) return;
if (this._isMerge(node)) this.merges.add(node);
this.updated = true;
return node;
}
/* Indexer Only DAG methods */
_tails(node, tails) {
const tailSet = /* @__PURE__ */ new Set();
for (const t of tails) {
if (node.clock.includes(t.writer.core.key, t.length)) tailSet.add(t);
}
return tailSet;
}
_tailsAndMerges(node, tails) {
const all = this._tails(node, tails);
for (const m of this.merges) {
if (m !== node && node.clock.includes(m.writer.core.key, m.length)) {
all.add(m);
}
}
return all;
}
_isMerge(node) {
if (!node.writer.isActiveIndexer) return false;
const deps = [];
for (const idx of this.indexers) {
let seq = node.clock.get(idx.core.key) - 1;
if (idx === node.writer) seq--;
const head = idx.get(seq);
if (!head || this.removed.includes(head.writer.core.key, head.length)) continue;
let isDep = true;
for (let i = 0; i < deps.length; i++) {
const d = deps[i];
if (d === head) continue;
if (d.clock.includes(head.writer.core.key, head.length)) {
isDep = false;
break;
}
if (head.clock.includes(d.writer.core.key, d.length)) {
const popped = deps.pop();
if (d === popped) continue;
deps[i--] = popped;
}
}
if (isDep) deps.push(head);
}
return deps.length > 1;
}
_indexerTails() {
const tails = /* @__PURE__ */ new Set();
for (const idx of this.indexers) {
const length = this.removed.has(idx.core.key) ? this.removed.get(idx.core.key) : idx.indexed;
const head = idx.get(length);
if (!head || this.removed.includes(head.writer.core.key, head.length)) continue;
let isTail = true;
for (const t of tails) {
if (head.clock.includes(t.writer.core.key, t.length)) {
isTail = false;
break;
}
if (t.clock.includes(head.writer.core.key, head.length)) {
tails.delete(t);
}
}
if (isTail) tails.add(head);
}
return tails;
}
// parent is newer if for any node in parent's view,
// either node can see object or object can see node
_strictlyNewer(object, parent) {
if (!parent.clock.includes(object.writer.core.key, object.length)) return false;
for (const [key, latest] of parent.clock) {
const oldest = this.removed.get(key);
if (latest <= oldest) continue;
let length = object.clock.get(key);
if (length <= oldest) length = oldest;
if (latest < length) return false;
if (latest === length) continue;
const writer = this.writers.get(key);
const next = writer && writer.get(length >= writer.indexed ? length : writer.indexed);
if (!next) continue;
if (next.clock.includes(object.writer.core.key, object.length)) continue;
if (latest < next.length) continue;
return false;
}
return true;
}
_acks(target) {
const acks = target.writer.isActiveIndexer ? [target] : [];
for (const idx of this.indexers) {
if (idx === target.writer) continue;
let next = target.clock.get(idx.core.key);
if (next < idx.nodes.offset) next = idx.nodes.offset;
const nextIndexNode = idx.get(next >= idx.indexed ? next : idx.indexed);
if (!nextIndexNode) continue;
if (!nextIndexNode.clock.includes(target.writer.core.key, target.length)) continue;
if (!this._strictlyNewer(target, nextIndexNode)) continue;
acks.push(nextIndexNode);
}
return acks;
}
acksFromNode(target, view) {
const acks = /* @__PURE__ */ new Set();
if (!view || !view.clock.includes(target.writer.core.key, target.length)) return acks;
acks.add(view.writer);
for (const idx of this.indexers) {
if (idx === view.writer) continue;
const length = view.clock.get(idx.core.key);
if (!length) continue;
if (target.clock.includes(idx.core.key, length)) continue;
const head = idx.get(length - 1);
if (!head) continue;
if (head.clock.includes(target.writer.core.key, target.length)) {
acks.add(idx);
}
}
return acks;
}
_ackedAt(acks, parent) {
let seen = 0;
let missing = acks.length;
for (const node of acks) {
missing--;
if (!parent.clock.includes(node.writer.core.key, node.length)) {
if (seen + missing < this.majority) return false;
continue;
}
if (++seen >= this.majority) return true;
}
return false;
}
confirms(indexer, target, acks, length) {
if (!length || this.removed.get(indexer.core.key) >= length) return UNSEEN;
let jump = true;
let newer = true;
for (let i = length - 1; i >= 0; i--) {
const head = indexer.get(i);
if (head === null) return UNSEEN;
let seen = 0;
for (const node of acks) {
if (!head.clock.includes(node.writer.core.key, node.length)) continue;
if (++seen >= this.majority) break;
}
if (!newer && seen < this.majority) {
break;
}
if (!this._strictlyNewer(target, head)) {
if (jump) {
jump = false;
let t = length - 1;
let b = 0;
while (t > b) {
const mid = t + b >>> 1;
const node = indexer.get(mid);
if (node === null || !node.clock.includes(target.writer.core.key, target.length) || this._strictlyNewer(target, node)) {
b = mid + 1;
} else {
t = mid - 1;
}
}
if (b + 1 < i) i = b + 2;
}
newer = false;
continue;
} else if (seen < this.majority) {
return NEWER;
}
return ACKED;
}
return UNSEEN;
}
_isConfirmed(target, parent = null) {
const acks = this._acks(target);
const confs = /* @__PURE__ */ new Set();
if (acks.length < this.majority) return false;
let allNewer = true;
for (const indexer of this.indexers) {
const length = parent ? parent.writer === indexer ? parent.length - 1 : parent.clock.get(indexer.core.key) : indexer.length;
const result = this.confirms(indexer, target, acks, length);
if (result === ACKED) {
confs.add(indexer);
if (confs.size >= this.majority) {
return true;
}
}
if (result === UNSEEN) allNewer = false;
}
if (parent) return this._isConfirmableAt(target, parent, acks, confs);
return allNewer;
}
_isConfirmableAt(target, parent, acks, confs) {
if (!this._ackedAt(acks, parent)) return false;
let potential = confs.size;
for (const indexer of this.indexers) {
if (confs.has(indexer)) continue;
const length = parent.clock.get(indexer.core.key);
const isSeen = target.clock.includes(indexer.core.key, length);
if (!isSeen) {
const head = indexer.get(length - 1);
if (head && !this.removed.includes(head.writer.core.key, head.length) && !this._strictlyNewer(target, head)) {
continue;
}
}
if (++potential >= this.majority) return true;
}
return false;
}
// this can get called multiple times for same node
remove(node) {
this.merges.delete(node);
this.removed.set(node.writer.core.key, node.length);
return node;
}
shift() {
if (!this.updated) return [];
const tails = this._indexerTails();
for (const tail of tails) {
if (this._isConfirmed(tail)) {
return [this.remove(tail)];
}
}
for (const merge of this.merges) {
if (this._isConfirmed(merge)) {
return this._yieldNext(merge, tails);
}
}
this.updated = false;
return [];
}
// yields next indexer node
_yieldNext(node, tails) {
while (!tails.has(node)) {
let next = null;
for (const t of this._tailsAndMerges(node, tails)) {
if (this._isConfirmed(t, node)) {
next = t;
break;
}
}
if (next) {
node = next;
continue;
}
const tailSet = [];
for (const t of this._tails(node, tails)) {
tailSet.push(this.remove(t));
}
return tailSet;
}
return [this.remove(node)];
}
shouldAck(writer) {
for (const t of this._indexerTails()) {
if (t.writer === writer) continue;
if (this._shouldAckNode(t, writer)) return true;
}
return false;
}
_shouldAckNode(target, writer) {
const head = writer.head();
const next = target.clock.get(writer.core.key);
const nextIndexNode = writer.get(next >= writer.indexed ? next : writer.indexed);
if (!nextIndexNode && writer !== target.writer) return true;
if (nextIndexNode) {
if (!nextIndexNode.clock.includes(target.writer.core.key, target.length)) {
return !head.clock.includes(target.writer.core.key, target.length);
}
if (!this._strictlyNewer(target, nextIndexNode)) return false;
}
const acks = this._acks(target);
if (acks.length >= this.majority) {
return this.confirms(writer, target, acks, writer.length) === UNSEEN;
}
return false;
}
};
}
});
// node_modules/autobase/lib/topolist.js
var require_topolist = __commonJS({
"node_modules/autobase/lib/topolist.js"(exports2, module2) {
var b4a4 = require_b4a();
var assert2 = require_nanoassert();
module2.exports = class TopoList {
constructor() {
this.tip = [];
this.undo = 0;
this.shared = 0;
}
static compare(a, b) {
return cmp(a, b);
}
static add(node, indexed, offset) {
addSorted(node, indexed, offset);
}
mark() {
this.shared = this.tip.length;
this.undo = 0;
}
// todo: bump to new api that just tracks undo
flush(indexed = []) {
if (indexed.length) this._applyIndexed(indexed);
const u = {
shared: this.shared,
undo: this.undo,
length: indexed.length + this.tip.length,
indexed,
tip: this.tip
};
this.mark();
return u;
}
print() {
return this.tip.map((n) => n.writer.core.key.toString() + n.length);
}
_applyIndexed(nodes) {
assert2(nodes.length <= this.tip.length, "Indexed batch cannot exceed tip");
let shared = 0;
for (; shared < nodes.length; shared++) {
if (this.tip[shared] !== nodes[shared]) break;
}
if (shared < nodes.length) this._track(shared);
const tip = [];
for (let i = shared; i < this.tip.length; i++) {
const node = this.tip[i];
if (node.yielded) continue;
const s = addSorted(node, tip, 0);
if (s === tip.length - 1) continue;
this._track(shared + s);
}
this.tip = tip;
}
add(node) {
const shared = addSorted(node, this.tip, 0);
this._track(shared);
}
_track(shared) {
if (shared < this.shared) {
this.undo += this.shared - shared;
this.shared = shared;
}
}
};
function hasOptimisticDeps(node) {
for (const d of node.dependencies) {
if (d.optimistic) return true;
}
return false;
}
function getOptimisticDeps(node, list) {
const deps = /* @__PURE__ */ new Set();
const stack = [node];
while (stack.length > 0) {
const next = stack.pop();
if (deps.has(next)) continue;
if (next.optimistic && next !== node) deps.add(next);
for (const d of next.dependencies) {
if (d.optimistic) stack.push(d);
}
}
const result = [];
for (let i = list.length - 1; deps.size !== result.length && i >= 0; i--) {
const n = list[i];
if (deps.has(n)) result.push(n);
}
return result.reverse();
}
function addSortedOptimistic(node, list, offset) {
const opt = getOptimisticDeps(node, list);
const pos = new Uint32Array(opt.length);
for (let i = 0; i < opt.length; i++) {
const n = opt[i];
pos[i] = n.index;
moveDown(n, list, offset);
}
moveDownAndUp(node, list, offset);
for (let i = opt.length - 1; i >= 0; i--) {
moveOptimisticUp(opt[i], list, offset);
}
let shared = node.index;
for (let i = 0; i < opt.length; i++) {
const idx = pos[i];
const n = opt[i];
if (idx === n.index) continue;
if (idx < shared) shared = idx;
if (n.index < shared) shared = n.index;
}
return shared;
}
function addSorted(node, list, offset) {
list.push(node);
node.index = list.length - 1;
if (hasOptimisticDeps(node)) return addSortedOptimistic(node, list, offset);
moveDownAndUp(node, list, offset);
return node.index;
}
function moveDown(node, list, offset) {
while (node.index > offset) {
const prev = list[node.index - 1];
if (links(node, prev)) break;
list[prev.index = node.index] = prev;
list[--node.index] = node;
}
}
function moveOptimisticUp(node, list, offset) {
while (node.index < list.length - 1) {
const next = list[node.index + 1];
if (links(next, node)) break;
list[next.index = node.index] = next;
list[++node.index] = node;
}
while (node.index > offset) {
const prev = list[node.index - 1];
if (!prev.optimistic) break;
const c4 = cmp(prev, node);
if (c4 <= 0) break;
list[prev.index = node.index] = prev;
list[--node.index] = node;
}
}
function moveNonOptimisticUp(node, list, offset) {
while (node.index < list.length - 1) {
const next = list[node.index + 1];
const c4 = cmpNonOptimistic(node, next, list);
if (c4 <= 0) break;
list[next.index = node.index] = next;
list[++node.index] = node;
}
}
function moveDownAndUp(node, list, offset) {
moveDown(node, list, offset);
if (node.optimistic) moveOptimisticUp(node, list, offset);
else moveNonOptimisticUp(node, list, offset);
}
function links(a, b) {
if (b.dependents.has(a)) return true;
return a.length > 0 && b.length === a.length - 1 && a.writer === b.writer;
}
function cmpNonOptimistic(a, b, list) {
if (!b.optimistic) return cmp(a, b);
for (let i = b.index + 1; i < list.length; i++) {
const node = list[i];
if (!node.optimistic) return cmp(a, node);
}
return -1;
}
function cmp(a, b) {
return links(b, a) ? -1 : cmpUnlinked(a, b);
}
function cmpUnlinked(a, b) {
const c4 = b4a4.compare(a.writer.core.key, b.writer.core.key);
return c4 === 0 ? a.length < b.length ? -1 : 1 : c4;
}
}
});
// node_modules/autobase/lib/linearizer.js
var require_linearizer = __commonJS({
"node_modules/autobase/lib/linearizer.js"(exports2, module2) {
var b4a4 = require_b4a();
var assert2 = require_nanoassert();
var Clock = require_clock();
var Consensus = require_consensus();
var Topolist = require_topolist();
var Node = class {
constructor(writer, length, value, heads, batch, dependencies, optimistic, trace) {
this.writer = writer;
this.length = length;
this.value = value;
this.heads = heads;
this.actualHeads = heads.slice(0);
this.dependents = /* @__PURE__ */ new Set();
this.dependencies = dependencies;
this.index = 0;
this.optimistic = optimistic && batch === 1 && !!value;
this.batch = batch;
this.dropped = 0;
this.trace = trace;
this.clock = new Clock();
this.yielded = false;
this.yielding = false;
}
isTail() {
return this.dependencies.size === this.dropped;
}
causalDependencies(idx) {
const order = [this];
const stack = [this];
let visited = null;
while (stack.length > 0) {
const node = stack.pop();
for (const dep of node.dependencies) {
if (!dep.writer.isRemoved || dep.writer.isActiveIndexer) continue;
if (visited === null) visited = /* @__PURE__ */ new Set();
if (visited.has(dep)) continue;
visited.add(dep);
stack.push(dep);
order.push(dep);
}
}
return order;
}
clear() {
this.clock = null;
this.dependents = null;
return this;
}
reset() {
this.yielded = false;
this.yielding = false;
for (const dep of this.dependents) dep.dependencies.add(this);
this.dependents.clear();
}
active() {
for (const dep of this.dependencies) {
if (dep.yielded) {
this.dependencies.delete(dep);
} else {
dep.dependents.add(this);
this.clock.add(dep.clock);
}
}
if (this.writer.isActiveIndexer) this.clock.set(this.writer.core.key, this.length);
}
tieBreak(node) {
return tieBreak(this, node);
}
hasDependency(dep) {
for (const h of this.actualHeads) {
if (sameNode(h, dep)) return true;
}
return false;
}
get ref() {
return this.writer.core.key.toString("hex").slice(0, 2) + ":" + this.length;
}
};
module2.exports = class Linearizer {
constructor(indexers, { heads = [], writers = /* @__PURE__ */ new Map() } = {}) {
this.heads = /* @__PURE__ */ new Set();
this.tails = /* @__PURE__ */ new Set();
this.tip = new Topolist();
this.size = 0;
this.updated = false;
this.indexersUpdated = false;
this.writers = writers;
this.consensus = new Consensus(indexers);
this._initialHeads = heads.slice(0);
this._strictlyAdded = null;
for (const { key, length } of heads) {
this.consensus.removed.set(key, length);
}
}
get indexers() {
return this.consensus.indexers;
}
static createNode(writer, length, value, heads, batch, dependencies, optimistic, trace) {
return new Node(writer, length, value, heads, batch, dependencies, optimistic, trace);
}
// returns the global links of the dag, use this to link against the current state of the dag
// TODO: rename to heads() and move the sets to _ props
getHeads() {
const heads = this._initialHeads.slice(0);
for (const node of this.heads) heads.push({ key: node.writer.core.key, length: node.length });
return heads;
}
// TODO: might contain dups atm, nbd for how we use it, returns an array of writers you can "pull"
// to get the full dag view at any time
getBootstrapWriters() {
const writers = [];
for (const head of this.heads) writers.push(head.writer);
for (let i = 0; i < this.consensus.indexers.length; i++)
writers.push(this.consensus.indexers[i]);
return writers;
}
addHead(node) {
node.active();
if (this._initialHeads.length > 0) this._updateInitialHeads(node);
if (node.isTail()) {
this.tails.add(node);
}
for (const head of this.heads) {
if (node.hasDependency(head)) {
this.heads.delete(head);
}
}
this.tip.add(node);
if (node.writer.isActiveIndexer) this.consensus.addHead(node);
this.size++;
this.heads.add(node);
this.updated = true;
return node;
}
update() {
if (!this.updated) return null;
this.updated = false;
const indexed = [];
while (true) {
const nodes = this.consensus.shift();
if (!nodes.length) break;
this._yield(nodes, indexed);
}
return this.tip.flush(indexed);
}
_updateInitialHeads(node) {
for (const head of node.actualHeads) {
for (let i = 0; i < this._initialHeads.length; i++) {
const { key, length } = this._initialHeads[i];
if (length !== head.length || !b4a4.equals(key, head.key)) continue;
this._initialHeads.splice(i--, 1);
}
}
}
/* Ack methods */
shouldAck(writer, pending = false) {
if (!writer || !writer.isActiveIndexer) return false;
for (const w of this.indexers) {
if (w.length !== w.available) return false;
}
let isHead = false;
for (const head of this.heads) {
if (!head.writer.isActiveIndexer) return true;
if (head.writer === writer) isHead = true;
}
if (this.heads.size === 1 && isHead) {
return false;
}
const visited = /* @__PURE__ */ new Set();
let valueCheck = false;
for (const tail of this.tails) {
if (pending || this._nonNull(tail, visited)) {
valueCheck = true;
break;
}
}
if (!valueCheck) return false;
if (this.consensus.shouldAck(writer)) return true;
return this._shouldAckHeads(writer, pending);
}
// check if there is any value above this node
_nonNull(target, visited) {
const stack = [target];
while (stack.length) {
const node = stack.pop();
if (visited.has(node)) continue;
if (node.value !== null) return true;
visited.add(node);
for (const dep of node.dependents) {
stack.push(dep);
}
}
return false;
}
// ack if any head is closer to confirming a value
_shouldAckHeads(writer, pending) {
const prev = writer.head();
for (const head of this.heads) {
if (head.writer === writer) continue;
const stack = [head];
const visited = /* @__PURE__ */ new Set();
while (stack.length) {
const node = stack.pop();
if (visited.has(node)) continue;
visited.add(node);
if (pending || node.value !== null) {
const acks = this.consensus.acksFromNode(node, head);
const prevAcks = this.consensus.acksFromNode(node, prev);
if (acks.size > prevAcks.size) return true;
for (const idx of acks) {
if (!prevAcks.has(idx)) return true;
}
if (prevAcks.size && acks.size) continue;
}
stack.push(...node.dependencies);
}
}
return false;
}
/* Full DAG methods */
_yield(nodes, indexed = []) {
const offset = indexed.length;
const tails = [];
while (nodes.length) {
const node = nodes.pop();
if (node.yielding) continue;
node.yielding = true;
if (node.isTail()) tails.push(node);
nodes.push(...node.dependencies);
}
while (tails.length) {
let tail = tails.pop();
for (tail of this._removeBatch(tail)) {
Topolist.add(tail, indexed, offset);
}
for (const dep of tail.dependents) {
if (dep.isTail() && dep.yielding) tails.push(dep);
}
}
return indexed;
}
_isFutureTail(node) {
let dropped = node.dropped;
for (const dep of node.dependencies) {
if (dep.yielded) continue;
if (dropped === 0) return false;
dropped--;
}
return true;
}
_removeNode(node) {
this.tails.delete(node);
this.heads.delete(node);
this.consensus.remove(node);
for (const d of node.dependents) {
if (d.yielding && d.dependencies.has(node))
d.dropped++;
else d.dependencies.delete(node);
if (this._isFutureTail(d)) this.tails.add(d);
}
node.yielded = true;
this.size--;
if (this.heads.size === 0) {
this._initialHeads.push({ key: node.writer.core.key, length: node.length });
}
return node;
}
_removeBatch(node) {
const batch = [this._removeNode(node)];
while (node.batch !== 1) {
if (node.dependents.size === 0) {
const next = node.writer.get(node.length);
if (next && next.batch === node.batch - 1) node.dependents.add(next);
}
assert2(node.dependents.size === 1, "Batch is linked partially, which is not allowed");
node = getFirst(node.dependents);
batch.push(this._removeNode(node));
}
return batch;
}
};
function tieBreak(a, b) {
return Topolist.compare(a, b) < 0;
}
function getFirst(set) {
return set[Symbol.iterator]().next().value;
}
function sameNode(a, b) {
return b4a4.equals(a.key, b.writer.core.key) && a.length === b.length;
}
}
});
// node_modules/sub-encoder/index.js
var require_sub_encoder = __commonJS({
"node_modules/sub-encoder/index.js"(exports2, module2) {
var codecs = require_codecs();
var b = require_b4a();
var SEP = b.alloc(1);
var SEP_BUMPED = b.from([1]);
var EMPTY = b.alloc(0);
module2.exports = class SubEncoder {
constructor(prefix, encoding, parent = null) {
this.userEncoding = codecs(encoding);
this.prefix = prefix != null ? createPrefix(prefix, parent) : null;
this.lt = this.prefix && b.concat([this.prefix.subarray(0, this.prefix.byteLength - 1), SEP_BUMPED]);
}
_encodeRangeUser(r) {
if (this.userEncoding.encodeRange) return this.userEncoding.encodeRange(r);
const res = {};
if (r.gt != null) res.gt = this.userEncoding.encode(r.gt);
if (r.gte != null) res.gte = this.userEncoding.encode(r.gte);
if (r.lte != null) res.lte = this.userEncoding.encode(r.lte);
if (r.lt != null) res.lt = this.userEncoding.encode(r.lt);
return res;
}
_addPrefix(key) {
return this.prefix ? b.concat([this.prefix, key]) : key;
}
encode(key) {
return this._addPrefix(this.userEncoding.encode(key));
}
encodeRange(range) {
const r = this._encodeRangeUser(range);
if (r.gt) r.gt = this._addPrefix(r.gt);
else if (r.gte) r.gte = this._addPrefix(r.gte);
else if (this.prefix) r.gte = this.prefix;
if (r.lt) r.lt = this._addPrefix(r.lt);
else if (r.lte) r.lte = this._addPrefix(r.lte);
else if (this.prefix) r.lt = this.lt;
return r;
}
decode(key) {
return this.userEncoding.decode(this.prefix ? key.subarray(this.prefix.byteLength) : key);
}
sub(prefix, encoding) {
return new SubEncoder(prefix || EMPTY, compat(encoding), this.prefix);
}
};
function createPrefix(prefix, parent) {
prefix = typeof prefix === "string" ? b.from(prefix) : prefix;
if (prefix && parent) return b.concat([parent, prefix, SEP]);
if (prefix) return b.concat([prefix, SEP]);
if (parent) return b.concat([parent, SEP]);
return SEP;
}
function compat(enc) {
if (enc && enc.keyEncoding) return enc.keyEncoding;
return enc;
}
}
});
// node_modules/autobase/lib/caps.js
var require_caps2 = __commonJS({
"node_modules/autobase/lib/caps.js"(exports2, module2) {
var crypto = require_hypercore_crypto();
var OPLOG_VERSION = 2;
var DEFAULT_AUTOBASE_VERSION = 1;
var MAX_AUTOBASE_VERSION = 2;
var BOOT_RECORD_VERSION = 3;
var [NS_SIGNER_NAMESPACE, NS_VIEW_BLOCK_KEY, NS_HASH_KEY, NS_ENCRYPTION] = crypto.namespace(
"autobase",
4
);
module2.exports = {
OPLOG_VERSION,
DEFAULT_AUTOBASE_VERSION,
MAX_AUTOBASE_VERSION,
BOOT_RECORD_VERSION,
NS_SIGNER_NAMESPACE,
NS_VIEW_BLOCK_KEY,
NS_HASH_KEY,
NS_ENCRYPTION
};
}
});
// node_modules/autobase/lib/system.js
var require_system = __commonJS({
"node_modules/autobase/lib/system.js"(exports2, module2) {
var Hyperbee = require_hyperbee();
var SubEncoder = require_sub_encoder();
var ReadyResource = require_ready_resource();
var b4a4 = require_b4a();
var c4 = require_compact_encoding();
var crypto = require_hypercore_crypto();
var { Info, Member } = require_messages3();
var { DEFAULT_AUTOBASE_VERSION } = require_caps2();
var subs = new SubEncoder();
var DIGEST = subs.sub(b4a4.from([0]));
var MEMBERS = subs.sub(b4a4.from([1]));
var INFO_KEY = DIGEST.encode("info");
var [GENESIS_ENTROPY, NS_ENTROPY] = crypto.namespace("autobase/entropy", 2);
module2.exports = class SystemView extends ReadyResource {
constructor(core, { checkout = 0, empty = false } = {}) {
super();
this.core = core;
this.db = new Hyperbee(core, {
keyEncoding: "binary",
extension: false,
checkout,
sessions: typeof core.session === "function"
});
this.version = DEFAULT_AUTOBASE_VERSION;
this.members = 0;
this.pendingIndexers = [];
this.indexers = [];
this.heads = [];
this.views = [];
this.encryptionLength = 0;
this.entropy = null;
this.indexerUpdate = false;
this._empty = empty;
this._fork = 0;
this._length = 0;
this._changes = [];
this._indexerMap = /* @__PURE__ */ new Map();
this._clockUpdates = /* @__PURE__ */ new Map();
}
static GENESIS_ENTROPY = GENESIS_ENTROPY;
static async getIndexedInfo(core, length) {
const sys = new this(core.session());
try {
return await sys.getIndexedInfo(length);
} finally {
await sys.close();
}
}
static async *flushes(core, { reverse, lt = core.length, gte = 0, wait = true } = {}) {
if (lt <= 0) return;
await core.get(lt - 1);
const sys = new SystemView(core);
try {
for await (const data of sys.db.createHistoryStream({ lt, gte, wait, reverse: true })) {
if (!b4a4.equals(data.key, INFO_KEY)) continue;
const info = c4.decode(Info, data.value);
yield { length: data.seq + 1, info };
}
} finally {
await sys.close();
}
}
get bootstrapping() {
return this.members === 0;
}
async checkout(length) {
const checkout = new SystemView(this.core.session(), {
checkout: length,
empty: length === 0
});
await checkout.ready();
return checkout;
}
async _open() {
const info = this._empty ? null : await this.db.get("info", {
valueEncoding: Info,
keyEncoding: DIGEST,
update: false,
wait: false
});
await this._reset(info);
}
async _close() {
await this.db.close();
}
async getIndexedInfo(length = this.core.signedLength) {
if (this.opened === false) await this.ready();
if (length === this.core.length) {
return {
version: this.version,
members: this.members,
pendingIndexers: this.pendingIndexers,
indexers: this.indexers,
heads: this.heads,
views: this.views,
encryptionLength: this.encryptionLength,
entropy: this.entropy
};
}
const node = length === 0 ? null : await this.db.getBySeq(length - 1);
if (node === null) {
return {
version: DEFAULT_AUTOBASE_VERSION,
members: 0,
pendingIndexers: [],
indexers: [],
heads: [],
views: [],
encryptionLength: 0,
entropy: null
};
}
return c4.decode(Info, node.value);
}
static sameIndexers(a, b) {
if (a.length !== b.length) return false;
for (let i = 0; i < a.length; i++) {
if (!b4a4.equals(a[i].key, b[i].core.key)) return false;
}
return true;
}
sameIndexers(indexers) {
return SystemView.sameIndexers(this.indexers, indexers);
}
async history(since) {
const checkout = this.db.checkout(since);
const seen = /* @__PURE__ */ new Map();
const nodes = [];
const updates = [];
const checkoutNode = since === 0 ? null : await this.db.getBySeq(since - 1);
let prevInfo = checkoutNode === null ? null : c4.decode(Info, checkoutNode.value);
let updateBatch = 0;
for await (const data of this.db.createHistoryStream({ gte: since })) {
if (b4a4.equals(data.key, INFO_KEY)) {
const info = c4.decode(Info, data.value);
updates.push({
batch: updateBatch,
indexers: prevInfo === null || !sameIndexers(info, prevInfo),
systemLength: data.seq + 1
});
prevInfo = info;
updateBatch = 0;
continue;
}
const key = data.key.subarray(2);
const hex = b4a4.toString(key, "hex");
const len = c4.decode(Member, data.value).length;
if (!seen.has(hex)) {
const node = await checkout.get(data.key);
if (node === null) {
seen.set(hex, 0);
} else {
const { length } = c4.decode(Member, node.value);
seen.set(hex, length);
}
}
const prev = seen.get(hex);
const batch = len - prev;
seen.set(hex, len);
if (batch === 0) continue;
updateBatch += batch;
if (nodes.length > 0) {
const top = nodes[nodes.length - 1];
if (b4a4.equals(top.key, key)) {
top.length = len;
top.batch += batch;
continue;
}
}
nodes.push({
key,
length: len,
batch
});
}
await checkout.close();
return { updates, nodes };
}
async update() {
if (this.opened === false) await this.ready();
if (this._fork === this.core.fork && this._length === this.core.length) return false;
await this._reset(
this._empty ? null : await this.db.get("info", { valueEncoding: Info, keyEncoding: DIGEST })
);
return true;
}
async _reset(info) {
this.version = info === null ? DEFAULT_AUTOBASE_VERSION : info.value.version;
this.members = info === null ? 0 : info.value.members;
this.pendingIndexers = info === null ? [] : info.value.pendingIndexers;
this.indexers = info === null ? [] : info.value.indexers;
this.heads = info === null ? [] : info.value.heads;
this.views = info === null ? [] : info.value.views;
this.encryptionLength = info === null ? 0 : info.value.encryptionLength;
this.entropy = info === null ? null : info.value.entropy;
this.indexerUpdate = false;
this._indexerMap.clear();
this._clockUpdates.clear();
this._length = this.core.length;
this._fork = this.core.fork;
this._changes = [];
for (const idx of this.indexers) {
this._indexerMap.set(b4a4.toString(idx.key, "hex"), idx);
}
}
// helper used by apply-state
flushLength() {
const header = this.core.length ? 0 : 1;
let updates = this._changes.length + this._clockUpdates.size;
for (const { key } of this._changes) {
const hex = b4a4.toString(key, "hex");
if (this._clockUpdates.has(hex)) updates--;
}
return header + this.core.length + updates + 1;
}
async flush(views) {
const batch = this.db.batch({ update: false });
for (let i = 0; i < this._changes.length; i++) {
const c5 = this._changes[i];
if (this._clockUpdates.has(b4a4.toString(c5.key, "hex"))) continue;
await batch.put(c5.key, c5.value, { valueEncoding: Member, keyEncoding: MEMBERS });
}
for (const [hex, length] of this._clockUpdates) {
const isIndexer = this._indexerMap.get(hex) !== void 0;
const key = b4a4.from(hex, "hex");
const info2 = await this._get(key, 0);
const value = { isIndexer, isRemoved: info2 ? info2.isRemoved : true, length };
await batch.put(key, value, { valueEncoding: Member, keyEncoding: MEMBERS });
}
if (this.indexerUpdate) {
this._refreshEntropy(this.core.length + batch.length + 1);
}
this._clockUpdates.clear();
let maxIndex = -1;
for (const view of views) {
if (view.mappedIndex > maxIndex) maxIndex = view.mappedIndex;
}
while (this.views.length > maxIndex + 1) this.views.pop();
for (const view of views) {
const length = view.core ? view.core.length : view.length;
if (!length) continue;
const v = { key: view.key, length };
if (view.mappedIndex !== -1) {
this.views[view.mappedIndex] = v;
} else {
view.mappedIndex = this.views.push(v) - 1;
}
}
const info = {
version: this.version,
members: this.members,
pendingIndexers: this.pendingIndexers,
indexers: this.indexers,
heads: this.heads,
views: this.views,
encryptionLength: this.encryptionLength,
entropy: this.entropy
};
await batch.put("info", info, { valueEncoding: Info, keyEncoding: DIGEST });
await batch.flush();
this._length = this.core.length;
this._changes = [];
if (this.indexerUpdate) this.indexerUpdate = false;
}
getEntropy(indexers, length) {
return generateEntropy(indexers, length, this.entropy);
}
_refreshEntropy(length) {
if (this.version < 2) return;
this.entropy = this.getEntropy(this.indexers, length);
}
checkpoint() {
return {
version: this.version,
members: this.members,
pendingIndexers: this.pendingIndexers.slice(0),
indexers: cloneNodes(this.indexers),
heads: cloneNodes(this.heads),
views: cloneNodes(this.views),
indexerUpdate: this.indexerUpdate,
encryptionLength: this.encryptionLength,
entropy: this.entropy ? b4a4.from(this.entropy) : null,
changes: this._changes.slice(0),
clockUpdates: new Map([...this._clockUpdates])
};
}
applyCheckpoint(checkpoint) {
this.version = checkpoint.version;
this.members = checkpoint.members;
this.pendingIndexers = checkpoint.pendingIndexers;
this.indexers = checkpoint.indexers;
this.heads = checkpoint.heads;
this.views = checkpoint.views;
this.indexerUpdate = checkpoint.indexerUpdate;
this.encryptionLength = checkpoint.encryptionLength;
this.entropy = checkpoint.entropy;
this._changes = checkpoint.changes;
this._clockUpdates = checkpoint.clockUpdates;
this._indexerMap = /* @__PURE__ */ new Map();
for (const idx of this.indexers) {
this._indexerMap.set(b4a4.toString(idx.key, "hex"), idx);
}
}
addHead(node) {
const h = { key: node.writer.core.key, length: node.length };
for (let i = 0; i < this.heads.length; i++) {
const head = this.heads[i];
if (!hasDependency(node, head)) {
if (!b4a4.equals(node.writer.core.key, head.key)) continue;
if (head.length > h.length) return false;
}
const popped = this.heads.pop();
if (popped !== head) this.heads[i--] = popped;
}
this.heads.push(h);
const hex = b4a4.toString(h.key, "hex");
this._clockUpdates.set(hex, h.length);
if (this.pendingIndexers.length > 0) {
for (let i = 0; i < this.pendingIndexers.length; i++) {
if (!b4a4.equals(this.pendingIndexers[i], h.key)) continue;
this._updateIndexer(h.key, h.length, true, i);
return true;
}
}
const idx = this._indexerMap.get(hex);
if (idx !== void 0) {
idx.length = h.length;
}
return false;
}
_updateIndexer(key, length, isIndexer, i) {
const hex = b4a4.toString(key, "hex");
if (!isIndexer) {
const existing = this._indexerMap.get(hex);
if (existing) {
this.indexerUpdate = true;
this.indexers.splice(this.indexers.indexOf(existing), 1);
this._indexerMap.delete(hex);
}
return;
}
for (; i < this.pendingIndexers.length; i++) {
if (b4a4.equals(this.pendingIndexers[i], key)) {
break;
}
}
if (length === 0) {
if (i >= this.pendingIndexers.length) this.pendingIndexers.push(key);
return;
}
if (i < this.pendingIndexers.length) {
const top = this.pendingIndexers.pop();
if (i < this.pendingIndexers.length) this.pendingIndexers[i] = top;
}
const idx = this._indexerMap.get(hex);
if (idx === void 0) {
const newIdx = { key, length };
this._indexerMap.set(hex, newIdx);
this.indexers.push(newIdx);
if (!this.bootstrapping) this.indexerUpdate = true;
} else {
idx.length = length;
}
}
_seenLength(key) {
return this._clockUpdates.get(b4a4.toString(key, "hex")) || 0;
}
async ack(key) {
const value = await this._get(key, 0);
const length = this._seenLength(key);
if (value && value.length === length) return;
const isIndexer = value ? value.isIndexer : false;
const isRemoved = value ? value.isRemoved : true;
this._changes.push({ key, value: { isIndexer, isRemoved, length } });
}
async add(key, { isIndexer = false, length = this._seenLength(key) } = {}) {
let value = null;
let found = false;
let changed = true;
for (let i = this._changes.length - 1; i >= 0; i--) {
const c5 = this._changes[i];
if (b4a4.equals(key, c5.key)) {
value = c5.value;
found = true;
break;
}
}
if (!found) {
const node = await this.db.get(key, { valueEncoding: Member, keyEncoding: MEMBERS });
if (node) {
value = node.value;
found = true;
}
}
let wasTracked = false;
let wasIndexer = false;
if (found) {
if (!value.isRemoved) wasTracked = true;
if (value.isIndexer) wasIndexer = true;
if (length < value.length) length = value.length;
if (value.length === length && value.isIndexer === isIndexer && value.isRemoved === false)
changed = false;
}
if (changed) {
this._changes.push({ key, value: { isIndexer, isRemoved: false, length } });
}
if (!wasTracked) this.members++;
if (wasIndexer || isIndexer) this._updateIndexer(key, length, isIndexer, 0);
}
async remove(key) {
let isIndexer = false;
for (const idx of this.indexers) {
isIndexer = b4a4.equals(idx.key, key);
if (isIndexer) break;
}
if (isIndexer) this._updateIndexer(key, null, false, 0);
let value = null;
let found = false;
for (let i = this._changes.length - 1; i >= 0; i--) {
const c5 = this._changes[i];
if (b4a4.equals(key, c5.key)) {
value = c5.value;
found = true;
break;
}
}
if (!found) {
const node = await this.db.get(key, { valueEncoding: Member, keyEncoding: MEMBERS });
if (node) {
value = node.value;
found = true;
}
}
const changed = !found || !value.isRemoved;
const wasTracked = found && !value.isRemoved;
const length = found ? value.length : 0;
if (changed) {
this._changes.push({ key, value: { isIndexer: false, isRemoved: true, length } });
}
if (wasTracked) this.members--;
return isIndexer;
}
async linkable(key, length) {
const len = this._seenLength(key);
if (len > 0) return length > len;
const info = await this._get(key, 0);
const prevLength = info ? info.length : 0;
return length > prevLength;
}
async has(key, opts) {
return await this.get(key, opts) !== null;
}
async _get(key, timeout) {
let value = null;
let found = false;
for (let i = this._changes.length - 1; i >= 0; i--) {
const c5 = this._changes[i];
if (b4a4.equals(key, c5.key)) {
value = c5.value;
found = true;
break;
}
}
if (!found) {
const node = await this.db.get(key, { timeout, valueEncoding: Member, keyEncoding: MEMBERS });
if (node) {
value = node.value;
found = true;
}
}
return found ? value : null;
}
async get(key, opts = {}) {
if (this._empty) return null;
let value = await this._get(key, opts.timeout || 0);
if (opts.unflushed) {
const hex = b4a4.toString(key, "hex");
for (let i = this._changes.length - 1; i >= 0; i--) {
const c5 = this._changes[i];
if (b4a4.equals(c5.key, key)) value = c5.value;
}
if (this._clockUpdates.has(hex)) value.length = this._clockUpdates.get(hex);
}
return opts.onlyActive !== false || !value.isRemoved ? value : null;
}
async hasLocal(key) {
if (this._empty) return false;
try {
const node = await this.db.get(key, {
valueEncoding: Member,
keyEncoding: MEMBERS,
update: false,
wait: false
});
return node !== null;
} catch {
return false;
}
}
async getLocalLength(key) {
if (this._empty) return 0;
try {
const node = await this.db.get(key, {
valueEncoding: Member,
keyEncoding: MEMBERS,
update: false,
wait: false
});
return node === null ? 0 : node.value.length;
} catch {
return 0;
}
}
list() {
return this.db.createReadStream({
valueEncoding: Member,
keyEncoding: MEMBERS
});
}
async isIndexed(key, length) {
const co = this.db.checkout(this.core.indexedLength);
try {
const node = await co.get(key, { valueEncoding: Member, keyEncoding: MEMBERS });
return node !== null && node.value.length >= length;
} finally {
await co.close();
}
}
async fork(indexers, manifests, encryptionLength, views) {
this.indexers = [];
this.pendingIndexers = [];
this.views = views;
if (this.version < 2) this.version = 2;
for (const { key } of indexers) {
const { length } = await this.get(key);
this.indexers.push({ key, length });
}
this._refreshEntropy(this.core.length);
const blocks = [];
let truncate = this.core.length - 1;
for await (const data of this.db.createHistoryStream({ lt: truncate, reverse: true })) {
if (b4a4.equals(data.key, INFO_KEY)) {
truncate = data.seq + 1;
break;
}
blocks.push(data);
}
await this.core.truncate(truncate, this.core.fork);
const batch = this.db.batch({ update: false });
await batch.ready();
for (const { key, value } of blocks) {
await batch.put(key, value);
}
const info = {
version: this.version,
members: this.members,
pendingIndexers: this.pendingIndexers,
indexers: this.indexers,
heads: this.heads,
views: this.views,
encryptionLength,
entropy: this.entropy
};
await batch.put("info", info, { valueEncoding: Info, keyEncoding: DIGEST });
await batch.flush();
await this._reset(await this.db.get("info", { valueEncoding: Info, keyEncoding: DIGEST }));
return truncate;
}
};
function hasDependency(node, dep) {
for (const h of node.actualHeads) {
if (sameNode(h, dep)) return true;
}
return false;
}
function sameNode(a, b) {
return b4a4.equals(a.key, b.key) && a.length === b.length;
}
function sameIndexers(a, b) {
if (a.views.length > 0 && b.views.length > 0) return b4a4.equals(a.views[0].key, b.views[0].key);
if (a.indexers.length !== b.indexers.length) return false;
for (let i = 0; i < a.indexers.length; i++) {
if (!b4a4.equals(a.indexers[i].key, b.indexers[i].key)) return false;
}
return true;
}
function cloneNodes(arr) {
const c5 = [];
for (let i = 0; i < arr.length; i++) {
c5.push({ key: arr[i].key, length: arr[i].length });
}
return c5;
}
function generateEntropy(indexers, length, entropy) {
const buffer = b4a4.alloc(8 + 32 + indexers.length * 32);
const state = { start: 0, end: buffer.byteLength, buffer };
c4.uint64.encode(state, length);
c4.fixed32.encode(state, entropy || GENESIS_ENTROPY);
for (const { key } of indexers) c4.fixed32.encode(state, key);
return crypto.hash([NS_ENTROPY, buffer]);
}
}
});
// node_modules/autobase/lib/encryption.js
var require_encryption = __commonJS({
"node_modules/autobase/lib/encryption.js"(exports2, module2) {
var HypercoreEncryption = require_default_encryption();
var sodium = require_sodium_universal();
var crypto = require_hypercore_crypto();
var c4 = require_compact_encoding();
var b4a4 = require_b4a();
var rrp = require_resolve_reject_promise();
var ReadyResource = require_ready_resource();
var SystemView = require_system();
var { EncryptionDescriptor, ManifestData } = require_messages3();
var { NS_VIEW_BLOCK_KEY, NS_HASH_KEY, NS_ENCRYPTION } = require_caps2();
var nonce = b4a4.alloc(sodium.crypto_stream_NONCEBYTES);
var hash = nonce.subarray(0, sodium.crypto_generichash_BYTES_MIN);
var AutobaseEncryption = class _AutobaseEncryption {
static PADDING = 8;
constructor(encryption) {
this.encryption = encryption;
this.compat = null;
this.keys = null;
this.keysById = /* @__PURE__ */ new Map();
}
get id() {
return this.keys ? this.keys.id : 0;
}
padding() {
return _AutobaseEncryption.PADDING;
}
isCompat() {
return false;
}
load(keys) {
if (this.keys === null) this.keys = keys;
}
async update(ctx) {
if (this.id !== 0 && this.id === this.encryption.id) return;
const keys = await this.get(this.encryption.id, ctx);
if (keys) this.keys = keys;
}
async get(id, ctx) {
if (this.keysById.has(id)) return this.keysById.get(id);
const keys = await this.getKeys(id, ctx);
this.keysById.set(id, keys);
return keys;
}
async getKeys(id, ctx) {
const entropy = await this.encryption.get(id);
if (!entropy) return null;
const block = this.blockKey(entropy, ctx);
const hash2 = crypto.hash([NS_HASH_KEY, block]);
return {
id,
block,
hash: hash2
};
}
blockKey(entropy, ctx) {
return this.encryption.blockKey(entropy, ctx);
}
async _ensureCompat(ctx) {
if (!this.compat) this.compat = this.compatKeys(ctx);
}
compatKeys() {
throw new Error("Compatibility method is not specified");
}
async encrypt(index, block, fork, ctx) {
if (this.isCompat(ctx, index)) {
this._ensureCompat(ctx);
return HypercoreEncryption.encrypt(
index,
block,
fork,
this.compat.block,
this.compat.blinding
);
}
await this.update(ctx);
encryptBlock(index, block, this.keys.id, this.keys.block, this.keys.hash);
}
async decrypt(index, block, ctx) {
if (this.isCompat(ctx, index)) {
this._ensureCompat(ctx);
return HypercoreEncryption.decrypt(index, block, this.compat.block);
}
const padding = block.subarray(0, _AutobaseEncryption.PADDING);
block = block.subarray(_AutobaseEncryption.PADDING);
const type = padding[0];
switch (type) {
case 0:
return block;
// unencrypted
case 1:
break;
default:
throw new Error("Unrecognised encryption type");
}
const id = c4.uint32.decode({ start: 4, end: 8, buffer: padding });
const keys = await this.get(id, ctx);
c4.uint64.encode({ start: 0, end: 8, buffer: nonce }, index);
nonce.set(padding, 8, 16);
decrypt(block, nonce, keys.block);
}
};
var ViewEncryption = class extends AutobaseEncryption {
constructor(encryption, name) {
super(encryption);
this.name = name;
}
isCompat(ctx, index) {
if (ctx.manifest.version <= 1) return true;
if (!ctx.manifest.userData) return false;
const { legacyBlocks } = c4.decode(ManifestData, ctx.manifest.userData);
return index < legacyBlocks;
}
compatKeys() {
const { bootstrap, encryptionKey } = this.encryption.base;
const block = getCompatBlockKey(bootstrap, encryptionKey, this.name);
return {
block,
blinding: crypto.hash(block)
};
}
blockKey(entropy) {
return getCompatBlockKey(this.encryption.base.bootstrap, entropy, this.name);
}
};
var WriterEncryption = class extends AutobaseEncryption {
isCompat(ctx) {
return ctx.manifest.version <= 1;
}
compatKeys(ctx) {
return HypercoreEncryption.deriveKeys(this.encryption.base.encryptionKey, ctx.key);
}
blockKey(entropy, ctx) {
if (ctx.manifest.userData) {
const userData = c4.decode(ManifestData, ctx.manifest.userData);
if (userData.namespace !== null) {
return this.encryption.blockKey(entropy, { key: userData.namespace });
}
}
return this.encryption.blockKey(entropy, ctx);
}
};
var EncryptionView = class _EncryptionView extends ReadyResource {
constructor(base, core) {
super();
this.base = base;
this.core = core || null;
this.sessions = /* @__PURE__ */ new Map();
this._initialising = null;
}
async _open() {
await this.initialised();
await this.core.ready();
}
initialised() {
if (this.core !== null) return this.core.ready();
if (this._initialising) return this._initialising;
this._initialising = rrp();
return this._initialising.promise;
}
_close() {
if (this._initialising) {
this._initialising.reject(new Error("Encryption closed"));
this._initialising = null;
}
if (this.core) return this.core.close();
}
get bootstrapped() {
return !!(this.core && this.core.length > 0);
}
get id() {
return this.core ? this.core.length : 0;
}
_createPayload(key) {
return key;
}
async reload(core) {
if (this.core) await this.core.close();
this.core = core;
await this.core.ready();
if (this._initialising) {
this._initialising.resolve();
this._initialising = null;
}
}
unpack(type, payload) {
if (type > 0) throw new Error("Unsupported version");
return payload;
}
async update(key) {
const payload = await this._createPayload(key);
const desc = { type: 0, payload };
await this.core.append(c4.encode(EncryptionDescriptor, desc));
}
async _preload() {
await this.ready();
return this.id();
}
getViewEncryption(name) {
if (this.sessions.has(name)) return this.sessions.get(name);
const encryption = new ViewEncryption(this, name);
this.sessions.set(name, encryption);
return encryption;
}
getWriterEncryption() {
return new WriterEncryption(this);
}
async encryptAnchor(block, namespace) {
const entropy = await this.get(this.id);
if (!entropy) return null;
const blockKey = this.blockKey(entropy, { key: namespace });
const hashKey = crypto.hash([NS_HASH_KEY, block]);
encryptBlock(0, block, this.id, blockKey, hashKey);
}
blockKey(entropy, ctx) {
return getBlockKey(this.base.bootstrap, this.base.encryptionKey, entropy, ctx.key);
}
async get(encryptionId) {
if (encryptionId === 0) return SystemView.GENESIS_ENTROPY;
if (!this.core) await this.initialised();
const index = encryptionId - 1;
const desc = await this.core.get(index);
const { type, payload } = c4.decode(EncryptionDescriptor, desc);
const key = this.unpack(type, payload);
return key;
}
getSystemEncryption() {
return this.getViewEncryption("_system");
}
static namespace(entropy) {
return crypto.hash([NS_ENCRYPTION, entropy]);
}
static getBlockKey(bootstrap, encryptionKey, entropy, hypercoreKey) {
return getBlockKey(bootstrap, encryptionKey, entropy, hypercoreKey);
}
static getSystemEncryption(base, core) {
const view = new _EncryptionView(base, core);
return view.getSystemEncryption();
}
static async setSystemEncryption(base, core, opts) {
if (base.encryptionKey === null) return null;
await core.ready();
if (core.manifest.version === 1) {
const key = getCompatBlockKey(base.bootstrap, base.encryptionKey, "_system");
return core.setEncryptionKey(key, { block: true });
}
if (!core.manifest.linked.length) {
throw new Error("System manifest does not link encryption view");
}
const enc = base.store.get({ key: core.manifest.linked[0], active: false });
const encryption = _EncryptionView.getSystemEncryption(base, enc);
await core.setEncryption(encryption, opts);
return enc;
}
};
module2.exports = {
AutobaseEncryption,
EncryptionView
};
function encrypt(block, nonce2, key) {
sodium.crypto_stream_xor(block, block, nonce2, key);
}
function decrypt(block, nonce2, key) {
return encrypt(block, nonce2, key);
}
function getBlockKey(bootstrap, encryptionKey, entropy, hypercoreKey) {
return encryptionKey && crypto.hash([NS_VIEW_BLOCK_KEY, bootstrap, encryptionKey, entropy, hypercoreKey]);
}
function getCompatBlockKey(bootstrap, encryptionKey, name) {
if (typeof name === "string") return getCompatBlockKey(bootstrap, encryptionKey, b4a4.from(name));
return encryptionKey && crypto.hash([NS_VIEW_BLOCK_KEY, bootstrap, encryptionKey, name]);
}
function blockhash(block, padding, hashKey) {
sodium.crypto_generichash(hash, block, hashKey);
padding.set(hash.subarray(0, 8));
hash.fill(0);
}
function encryptBlock(index, block, id, blockKey, hashKey) {
const padding = block.subarray(0, AutobaseEncryption.PADDING);
block = block.subarray(AutobaseEncryption.PADDING);
blockhash(block, padding, hashKey);
c4.uint32.encode({ start: 4, end: 8, buffer: padding }, id);
c4.uint64.encode({ start: 0, end: 8, buffer: nonce }, index);
padding[0] = 1;
nonce.set(padding, 8, 16);
encrypt(block, nonce, blockKey);
}
}
});
// node_modules/autobase/lib/updates.js
var require_updates = __commonJS({
"node_modules/autobase/lib/updates.js"(exports2, module2) {
module2.exports = class UpdateChanges {
constructor(base) {
this.base = base;
this.byName = /* @__PURE__ */ new Map();
this.tracking = null;
}
get discoveryKey() {
return this.base.discoveryKey;
}
get key() {
return this.base.key;
}
get id() {
return this.base.id;
}
get system() {
return this.base.system;
}
track(state) {
this.tracking = [];
this.byName.clear();
if (!state) return;
for (const v of state.views) {
if (v.ref) this._add(v.ref);
}
this._add(state.systemView.ref);
this._add(state.encryptionView.ref);
}
_add(ref) {
const from = ref.batch.length;
const inf = { ref, from };
ref.shared = from;
this.tracking.push(inf);
}
finalise() {
if (this.tracking === null) return;
for (const { ref, from } of this.tracking) {
const core = ref.atomicBatch || ref.batch;
this.byName.set(ref.name, {
from,
to: core.length,
shared: ref.shared
});
}
this.tracking = null;
}
get(name) {
return this.byName.get(name);
}
};
}
});
// node_modules/autobase/lib/timer.js
var require_timer = __commonJS({
"node_modules/autobase/lib/timer.js"(exports2, module2) {
var safetyCatch = require_safety_catch();
var MAX_WAIT = 2 * 60 * 1e3;
var DEFAULT_INTERVAL = 10 * 1e3;
module2.exports = class Timer {
constructor(handler, interval, opts = {}) {
this.handler = handler || noop;
this.interval = interval || DEFAULT_INTERVAL;
this.limit = opts.limit || MAX_WAIT;
this._executing = null;
this._limit = random2over1(this.limit);
this._timer = null;
this._resolve = null;
this._start = 0;
this._stopped = false;
this._asap = false;
this._standalone = /* @__PURE__ */ new Set();
this._unref = opts.unref !== false;
this._timerCallback = this._executeBackground.bind(this);
}
_executeBackground() {
this._executing = this._execute();
this._executing.catch(safetyCatch);
}
async _execute() {
this._asap = false;
await this.handler();
this._start = 0;
this._executing = null;
this.bump();
}
bump() {
if (this._stopped || this._executing || this._asap) return;
if (!this._start) this._start = Date.now();
else if (Date.now() - this._start > this._limit) return;
const interval = random2over1(this.interval);
clearTimeout(this._timer);
this._timer = setTimeout(this._timerCallback, interval);
if (this._unref && this._timer.unref) this._timer.unref();
}
async trigger() {
if (this._stopped) return;
if (this._executing) await this._executing;
if (this._stopped) return;
clearTimeout(this._timer);
this._timer = null;
this._executeBackground();
await this._executing;
}
async flush() {
if (this._executing) await this._executing;
}
// business-as-usual
bau() {
if (!this._asap) return;
this._asap = false;
this.bump();
}
asap() {
if (this._asap) return;
this._asap = true;
const interval = Math.floor(Math.random() * this.interval / 3);
clearTimeout(this._timer);
this._timer = setTimeout(this._timerCallback, interval);
if (this._unref && this._timer.unref) this._timer.unref();
}
stop() {
if (this._timer) clearTimeout(this._timer);
this._timer = null;
this._start = 0;
this._asap = false;
this._stopped = true;
for (const { timer, resolve } of this._standalone) {
clearTimeout(timer);
resolve();
}
this._standalone.clear();
}
asapStandalone() {
const interval = Math.floor(Math.random() * this.interval / 3);
return new Promise((resolve) => {
const ref = { timer: null, resolve };
ref.timer = setTimeout(resolveStandalone, interval, ref, this._standalone);
if (ref.timer.unref) ref.timer.unref();
this._standalone.add(ref);
});
}
unref() {
if (this._timer && this._timer.unref) this._timer.unref();
}
};
function resolveStandalone(ref, set) {
set.delete(ref);
ref.resolve();
}
function random2over1(n) {
return Math.floor(n + Math.random() * n);
}
function noop() {
}
}
});
// node_modules/autobase/lib/node-buffer.js
var require_node_buffer = __commonJS({
"node_modules/autobase/lib/node-buffer.js"(exports2, module2) {
var DEFAULT_SIZE = 32;
module2.exports = class NodeBuffer {
constructor(offset, hwm) {
this.hwm = hwm || DEFAULT_SIZE;
this.defaultHwm = this.hwm;
this.mask = this.hwm - 1;
this.top = 0;
this.btm = 0;
this.buffer = new Array(this.hwm);
this.offset = offset || 0;
this.length = this.offset;
}
get size() {
return this.length - this.offset;
}
isEmpty() {
return this.length === this.offset;
}
isFull() {
return this.size === this.buffer.length;
}
grow() {
this.hwm <<= 1;
const size = this.size;
const buffer = new Array(this.hwm);
const mask = this.hwm - 1;
for (let i = 0; i < size; i++) {
buffer[i] = this.buffer[this.btm + i & this.mask];
}
this.mask = mask;
this.top = size;
this.btm = 0;
this.buffer = buffer;
}
push(data) {
if (this.isFull()) this.grow();
this.buffer[this.top] = data;
this.top = this.top + 1 & this.mask;
return this.length++;
}
shift() {
if (this.isEmpty()) return null;
const last = this.buffer[this.btm];
this.buffer[this.btm] = void 0;
this.btm = this.btm + 1 & this.mask;
this.offset++;
if (this.isEmpty() && this.hwm !== this.defaultHwm) {
this.buffer = new Array(this.defaultHwm);
this.hwm = this.buffer.length;
this.mask = this.hwm - 1;
this.top = this.btm = 0;
}
return last;
}
get(seq) {
if (seq < this.offset || seq >= this.length) return null;
return this.buffer[this.btm + (seq - this.offset) & this.mask];
}
};
}
});
// node_modules/autobase/lib/writer.js
var require_writer = __commonJS({
"node_modules/autobase/lib/writer.js"(exports2, module2) {
var c4 = require_compact_encoding();
var b4a4 = require_b4a();
var ReadyResource = require_ready_resource();
var assert2 = require_nanoassert();
var SignalPromise = require_signal_promise();
var Linearizer = require_linearizer();
var NodeBuffer = require_node_buffer();
var MAX_PRELOAD = 4;
var MAX_PREFETCH = 256;
module2.exports = class Writer extends ReadyResource {
constructor(base, core, length, isRemoved) {
super();
this.base = base;
this.core = core;
this.isRemoved = isRemoved;
this.updated = false;
this.range = null;
this.nodes = new NodeBuffer(length);
this.node = null;
this.isActive = false;
this.isCurrentlyCoupled = false;
this.isCoupled = false;
this.isBootstrap = false;
this.isActiveIndexer = false;
this.available = length;
this.length = length;
this.seenLength = 0;
this.recover = false;
this.frozen = false;
this.syncSignal = null;
}
_pause() {
if (!this.range) return;
this.range.destroy();
this.range = null;
}
_resume() {
if (this.range) {
if (this.range.range.end === this.nodes.length + MAX_PREFETCH) return;
this.range.destroy();
}
this.range = this.core.download({
start: this.nodes.length,
end: this.nodes.length + MAX_PREFETCH,
linear: true
});
}
_updateCoupling() {
if (!this.base._coupler || this.isCoupled === this.isCurrentlyCoupled) return;
if (this.isCurrentlyCoupled) this.base._coupler.remove(this.core);
else this.base._coupler.add(this.core);
this.isCurrentlyCoupled = this.isCoupled;
}
_removeCouple() {
if (this.base._coupler && !this.isCoupled && this.isCurrentlyCoupled) {
this.isCurrentlyCoupled = false;
this.base._coupler.remove(this.core);
}
}
updateActivity() {
if (!this.core.opened) return;
if (this.seenLength > this.core.length || this.length < this.core.length || this.isBootstrap) {
this.isActive = true;
this.core.setActive(true);
} else if (this.length === this.core.length) {
this.isActive = false;
this.core.setActive(false);
}
this._updateCoupling();
if (this.core.writable) return;
if (this.base.isFastForwarding() || !this.isActive) {
this._pause();
} else {
this._resume();
}
}
setBootstrap(bool) {
this.isBootstrap = bool;
this.updateActivity();
}
seen(length) {
if (length > this.seenLength) this.seenLength = length;
this.updateActivity();
}
waitForSynced() {
if (this.core.length === this.length) return Promise.resolve();
if (this.syncSignal === null) this.syncSignal = new SignalPromise();
return this.syncSignal.wait();
}
async _open() {
await this.core.ready();
await this.core.setUserData("referrer", this.base.key);
if (this.base.closing) return;
this.recover = autoRecover(this.core);
await this.base._wakeup.add(this.core.core);
this.updateActivity();
if (this.core.length > this.length) this.base._queueBump();
this.base.emit("writer", this);
}
_close() {
if (this.syncSignal !== null) this.syncSignal.notify();
return this.core.close();
}
get indexed() {
return this.nodes.offset;
}
idle() {
return this.length === this.available && this.length === this.core.length && this.core.opened;
}
flushed() {
return this.seenLength <= this.length && this.length === this.available && this.length === this.core.length && this.shiftable() === false && !this.core.core.upgrading && this.core.opened;
}
compare(writer) {
return b4a4.compare(this.core.key, writer.core.key);
}
head() {
return this.nodes.get(this.length - 1);
}
advance() {
if (this.syncSignal !== null && this.length + 1 === this.core.length) this.syncSignal.notify();
return this.length < this.available ? this.nodes.get(this.length++) : null;
}
shiftable() {
return this.length > this.nodes.offset;
}
shift() {
if (this.shiftable() === false) return false;
let node = this._shiftAndClear();
while (node.batch > 1) node = this._shiftAndClear();
return true;
}
get(seq) {
return seq < this.length ? this.nodes.get(seq) : null;
}
append(value, heads, batch, dependencies, optimistic) {
const node = Linearizer.createNode(
this,
this.nodes.length + 1,
value,
heads,
batch,
dependencies,
optimistic
);
node.actualHeads = node.heads.slice(0);
this.nodes.push(node);
this.available++;
this.length++;
return node;
}
async update(boot) {
if (this.opened === false) await this.ready();
if (this.frozen) return false;
const preload = boot ? 1 : MAX_PRELOAD;
while (this.available - this.length < preload) {
if (this.nodes.length === this.core.length || this.core.length === 0) break;
if (this.node === null && !await this._loadNextNode()) break;
if (!await this._ensureNodeDependencies(boot)) break;
if (this.recover) this.node.value = null;
this.nodes.push(this.node);
if (this.node.batch === 1) this.available = this.nodes.length;
this.node = null;
}
this.updateActivity();
return this.length < this.available;
}
_shiftAndClear() {
const node = this.nodes.shift();
node.clear();
return node;
}
async _loadNextNode() {
const seq = this.nodes.length;
if (!await this.core.has(seq)) return false;
try {
const { node, optimistic, trace } = await this.core.get(seq, { wait: false });
const value = node.value == null ? null : c4.decode(this.base.valueEncoding, node.value);
this.node = Linearizer.createNode(
this,
seq + 1,
value,
node.heads,
node.batch,
/* @__PURE__ */ new Set(),
optimistic,
trace
);
return true;
} catch (err) {
this.frozen = true;
throw err;
}
}
async _ensureNodeDependencies(boot) {
while (this.node.dependencies.size < this.node.heads.length) {
const rawHead = this.node.heads[this.node.dependencies.size];
const headWriter = await this.base._getWriterByKey(
rawHead.key,
-1,
rawHead.length,
true,
false,
boot
);
if (headWriter !== this && (headWriter === null || headWriter.length < rawHead.length)) {
if (!boot) this.base._ensureWakeup(headWriter);
return false;
}
let headNode = headWriter.nodes.get(rawHead.length - 1);
if (!headNode) {
for (const node of this.base.linearizer.heads) {
if (!compareHead(node, rawHead)) continue;
headNode = node;
break;
}
}
assert2(!this.node.dependencies.has(headNode), "Corrupted DAG");
if (headNode === null) {
this.node.heads.splice(this.node.dependencies.size, 1);
continue;
}
this.node.dependencies.add(headNode);
}
const offset = this.node.length - 1;
if (offset > this.indexed) {
this.node.dependencies.add(this.nodes.get(offset - 1));
}
return true;
}
};
function compareHead(node, head) {
if (node.length !== head.length) return false;
return b4a4.equals(node.writer.core.key, head.key);
}
function autoRecover(core) {
assert2(core.opened);
switch (core.id) {
case "ghrpexaboutdm46ombqho7mroxknassnntrxx3cubfux4qi6w6hy":
case "qoaanao71s4he1rcd197d336qepykk4467geo1uq8cwnzmpb786o":
case "fomhdxgn4j4tzjqy6y7iskhffimzokt7kraddyd8orcht3r8q61o":
case "d8f5taxxrit51apftoi38e5b86hb98cgfd7dfp3uo1uoh95qt49o":
case "objyf75uggsqpjcut69xdgj46ks8r71jjrq7oxdfsz95sstchkno":
return true;
}
return false;
}
}
});
// node_modules/autobase/lib/values.js
var require_values = __commonJS({
"node_modules/autobase/lib/values.js"(exports2, module2) {
var crypto = require_hypercore_crypto();
var c4 = require_compact_encoding();
var b4a4 = require_b4a();
var { OPLOG_VERSION } = require_caps2();
var { OplogMessage } = require_messages3();
var { EncryptionView } = require_encryption();
module2.exports = {
encodeValue,
decodeValue
};
function encodeValue(value, opts = {}) {
const state = { start: 0, end: 0, buffer: null };
const message = {
version: opts.version || OPLOG_VERSION,
digest: null,
checkpoint: null,
optimistic: !!opts.optimistic,
node: {
heads: opts.heads || [],
batch: 1,
value
}
};
OplogMessage.preencode(state, message);
if (opts.padding) {
state.start = opts.padding;
state.end += opts.padding;
}
state.buffer = b4a4.alloc(state.end);
OplogMessage.encode(state, message);
if (!opts.encrypted) return state.buffer;
if (!opts.optimistic) {
throw new Error("Encoding an encrypted value is not supported");
}
const padding = b4a4.alloc(16);
crypto.hash(state.buffer, padding);
padding[0] = 0;
return b4a4.concat([padding.subarray(0, 8), state.buffer]);
}
async function decodeValue(value, { autobase, encryptionKey, key, manifest, index = 0 } = {}) {
if (encryptionKey) {
const e = new EncryptionView({ encryptionKey, bootstrap: autobase });
const w = e.getWriterEncryption();
await w.decrypt(index, value, { key, manifest });
value = value.subarray(8);
}
const op = c4.decode(OplogMessage, value);
return op.node.value;
}
}
});
// node_modules/autobase/lib/active-writers.js
var require_active_writers = __commonJS({
"node_modules/autobase/lib/active-writers.js"(exports2, module2) {
var b4a4 = require_b4a();
module2.exports = class ActiveWriters {
constructor() {
this.map = /* @__PURE__ */ new Map();
}
get size() {
return this.map.size;
}
[Symbol.iterator]() {
return this.map.values();
}
get(key) {
return this.map.get(b4a4.toString(key, "hex")) || null;
}
has(key) {
return this.get(key) !== null;
}
add(writer) {
this.map.set(b4a4.toString(writer.core.key, "hex"), writer);
}
delete(writer) {
this.map.delete(b4a4.toString(writer.core.key, "hex"));
}
updateActivity() {
for (const w of this.map.values()) w.updateActivity();
}
clear() {
const p = [];
for (const w of this.map.values()) p.push(w.close());
this.map.clear();
return Promise.all(p);
}
};
}
});
// node_modules/autobase/lib/wakeup.js
var require_wakeup = __commonJS({
"node_modules/autobase/lib/wakeup.js"(exports2, module2) {
var b4a4 = require_b4a();
var c4 = require_compact_encoding();
var safetyCatch = require_safety_catch();
var ReadyResource = require_ready_resource();
var WakeupEntry = {
preencode(state, m) {
c4.fixed32.preencode(state, m.key);
c4.uint.preencode(state, m.length);
},
encode(state, m) {
c4.fixed32.encode(state, m.key);
c4.uint.encode(state, m.length);
},
decode(state) {
return {
key: c4.fixed32.decode(state),
length: c4.uint.decode(state)
};
}
};
module2.exports = class AutoWakeup extends ReadyResource {
constructor(base) {
super();
this.base = base;
this.flushing = null;
this._rootStore = this.base.store;
this._addBound = this.add.bind(this);
this._preupdateBound = this._preupdate.bind(this);
this._needsFlush = false;
this._map = /* @__PURE__ */ new Map();
}
[Symbol.iterator]() {
return this._map.values();
}
async _preupdate(batch, key) {
this.queue(key, batch.length);
await this.flush();
this.base._onwakeup();
}
async _save() {
const slab = b4a4.allocUnsafe(8 + this._map.size * 40);
const state = { start: 0, end: 0, buffer: slab };
c4.uint.encode(state, this._map.size);
for (const m of this._map.values()) WakeupEntry.encode(state, m);
await this.base.local.setUserData("autobase/wakeup", slab.subarray(0, state.start));
}
async _load() {
const buffer = await this.base.local.getUserData("autobase/wakeup");
if (!buffer) return;
const state = { start: 0, end: buffer.byteLength, buffer };
let len = c4.uint.decode(state);
while (len-- > 0) {
const m = WakeupEntry.decode(state);
this._map.set(b4a4.toString(m.key, "hex"), m);
}
}
async _open() {
await this._load();
this._rootStore.watch(this._addBound);
for (const core of this._rootStore.cores) {
if (core.opened === false) await core.ready().catch(noop);
if (!core.closing) this.add(core);
}
}
async _close() {
this._rootStore.unwatch(this._addBound);
for (const core of this._rootStore.cores) {
if (core.opened && !core.closing) this.remove(core);
}
this._map.clear();
while (this.flushing) {
try {
await this.flushing;
} catch {
}
}
}
queue(key, length) {
const hex = b4a4.toString(key, "hex");
const m = this._map.get(hex);
if (m && m.length > length) {
return false;
}
this._needsFlush = true;
this._map.set(hex, { key, length });
return true;
}
unqueue(key, length) {
const hex = b4a4.toString(key, "hex");
const m = this._map.get(hex);
if (!m) return true;
if (m.length > length) return false;
this._needsFlush = true;
this._map.delete(hex);
return true;
}
async flush() {
if (this.closing) throw new Error("Closing");
if (this.flushing) await this.flushing;
if (this.flushing) return this.flushing;
if (this._needsFlush === false) return;
this._needsFlush = false;
try {
this.flushing = this._save();
return await this.flushing;
} finally {
this.flushing = null;
}
}
add(core) {
return this._add(core).catch(safetyCatch);
}
remove(core) {
return this._remove(core);
}
async _add(core) {
if (core.opened === false) await core.ready();
if (core.closing) return false;
if (core === this.base.local.core) return false;
const rx = core.storage.read();
const referrerPromise = rx.getUserData("referrer");
const viewPromise = rx.getUserData("autobase/view");
rx.tryFlush();
const [referrer, view] = await Promise.all([referrerPromise, viewPromise]);
if (view) return false;
if (referrer === null || !b4a4.equals(referrer, this.base.key)) return false;
core.preupdate = this._preupdateBound;
return true;
}
_remove(core) {
if (core.preupdate !== this._preupdateBound) return false;
core.preupdate = null;
return true;
}
};
function noop() {
}
}
});
// node_modules/autobase/lib/fast-forward.js
var require_fast_forward = __commonJS({
"node_modules/autobase/lib/fast-forward.js"(exports2, module2) {
var rrp = require_resolve_reject_promise();
var safetyCatch = require_safety_catch();
var SystemView = require_system();
var { EncryptionView } = require_encryption();
var DEFAULT_OP_TIMEOUT = 5e3;
var DEFAULT_MIN_FF = 16;
module2.exports = class FastForward {
constructor(base, key, {
timeout = DEFAULT_OP_TIMEOUT,
verified = true,
minimum = DEFAULT_MIN_FF,
force = false,
length = 0
} = {}) {
this.base = base;
this.key = key;
this.timeout = timeout;
this.force = force;
this.core = base.store.get({ key, active: true, encryption: null });
this.length = length;
this.views = [];
this.encryption = null;
this.entropy = null;
this.indexers = [];
this.minimum = minimum;
this.verified = verified;
this.waiting = /* @__PURE__ */ new Set();
this.cores = [this.core];
this.system = null;
this.destroyed = false;
this.upgrading = null;
this.failed = false;
}
static MINIMUM = DEFAULT_MIN_FF;
async upgrade() {
try {
if (!this.upgrading) this.upgrading = this._upgrade();
if (!await this.upgrading) return null;
return {
length: this.length,
force: this.force,
key: this.key,
indexers: this.indexers,
views: this.views,
entropy: this.entropy,
manifestVersion: this.core.manifest.version,
minimum: this.minimum
};
} catch (err) {
safetyCatch(err);
this.failed = true;
return null;
} finally {
await this.close();
}
}
_waitForAppend(core) {
if (core.length > 0) return Promise.resolve();
const promise = rrp();
const timeout = setTimeout(this.close.bind(this), this.timeout);
const wait = { promise, timeout };
this.waiting.add(wait);
core.once("append", () => {
this.waiting.delete(wait);
clearTimeout(timeout);
promise.resolve();
});
return promise.promise;
}
_minLength() {
return this.base.core.length + this.minimum;
}
async _upgrade() {
await this.core.ready();
if (!this.verified) await this._waitForAppend(this.core);
if (this.destroyed) return false;
if (this.core.manifest.linked) {
const appends = [];
for (const key of this.core.manifest.linked) {
const core = this.base.store.get({ key, active: true });
this.cores.push(core);
await core.ready();
appends.push(this._waitForAppend(core));
}
await Promise.all(appends);
}
if (this.length === 0) this.length = this.core.length;
if (!this.force && this.length < this._minLength()) return false;
if (this.length === 0) return false;
await this.core.get(this.length - 1, { timeout: this.timeout });
await this.base.ready();
if (this.destroyed) return false;
if (this.base.encryptionKey && !await this._ensureEncryption()) return false;
if (this.destroyed) return false;
this.system = new SystemView(this.core, { checkout: this.length });
await this.system.ready();
if (this.destroyed) return false;
this.entropy = this.system.entropy;
if (this.core.manifest.version >= 2) {
const linked = this.core.manifest.linked;
if (this.system.encryptionLength === 0 || linked === null || !linked.length) {
return false;
}
this.views.push({
key: linked[0],
length: this.system.encryptionLength
});
}
const promises = [];
promises.push(this.system.get(this.base.local.key, { timeout: this.timeout }));
if (this.encryption && this.encryption.core) {
promises.push(
this.encryption.core.get(this.system.encryptionLength - 1, { timeout: this.timeout })
);
}
for (const v of this.system.views) {
this.views.push(v);
const core = this.base.store.get({ key: v.key, active: true });
this.cores.push(core);
if (!v.length) continue;
promises.push(core.get(v.length - 1, { timeout: this.timeout }));
}
for (const idx of this.system.indexers) {
this.indexers.push(idx);
if (idx.length === 0) continue;
const core = this.base.store.get({ key: idx.key, active: true });
this.cores.push(core);
promises.push(core.get(idx.length - 1, { timeout: this.timeout }));
promises.push(this.system.get(idx.key, { timeout: this.timeout }));
}
for (const head of this.system.heads) {
promises.push(this.system.get(head.key, { timeout: this.timeout }));
}
await Promise.all(promises);
if (this.destroyed) return false;
return true;
}
async _ensureEncryption() {
if (this.core.encryption !== null) return true;
const encCore = this.core.manifest.version <= 1 ? null : this.cores[1];
this.encryption = new EncryptionView(this.base, encCore);
const encryption = this.encryption.getViewEncryption("_system");
await this.core.setEncryption(encryption);
return true;
}
async close() {
this.destroyed = true;
for (const { promise, timeout } of this.waiting) {
clearTimeout(timeout);
promise.resolve();
}
if (this.system) await this.system.close();
if (this.encryption) await this.encryption.close();
for (const core of this.cores) await core.close();
await this.core.close();
}
};
}
});
// node_modules/autobase/lib/store.js
var require_store = __commonJS({
"node_modules/autobase/lib/store.js"(exports2, module2) {
var b4a4 = require_b4a();
var c4 = require_compact_encoding();
var crypto = require_hypercore_crypto();
var Hypercore = require_hypercore();
var messages = require_messages3();
var DEFAULT_MANIFEST_VERSION = 1;
var INDEX_VERSION = 1;
var MAX_TRACE_PER_VIEW = 256;
var EMPTY = b4a4.alloc(0);
var [NS_SIGNER_NAMESPACE] = crypto.namespace("autobase", 1);
var ViewCore = class {
constructor(name, core, base) {
this.name = name;
this.core = null;
this.batch = null;
this.atomicBatch = null;
this.moveTo = null;
this.tracer = new Tracer();
this.shared = 0;
this.ontruncate = (length) => {
this.shared = Math.min(this.shared, length);
};
this.migrated(base, core);
}
getCore() {
return this.atomicBatch || this.batch || this.core;
}
migrated(base, core) {
this.core = core;
if (this.name === "_system") {
const ff = base._queueFastForward.bind(base);
this.core.on("append", ff);
this.core.ready().then(ff, ff);
}
}
async matchesKey(key) {
if (!this.core.opened) await this.core.ready();
return b4a4.equals(this.core.key, key);
}
async matchesNamespace(target) {
if (!this.core.opened) await this.core.ready();
if (this.core.manifest && this.core.manifest.signers.length > 0) {
const ns = this.core.manifest.signers[0].namespace;
if (b4a4.equals(ns, target)) return true;
}
return false;
}
getNextKey() {
return this.moveTo ? this.moveTo[0].key : null;
}
async commit(atom, length, signature) {
await this.core.commit(this._getAtomicBatch(atom), { length, signature });
}
async release() {
if (!this.atomicBatch) return;
await this.atomicBatch.ready();
while (this.atomicBatch.state.sessions.length) {
await this.atomicBatch.state.sessions[0].close();
}
await this.atomicBatch.close();
this.atomicBatch = null;
}
_getAtomicBatch(atom) {
if (this.atomicBatch === null) {
this.atomicBatch = this.batch.session({ atom, writable: true });
this.atomicBatch.on("truncate", this.ontruncate);
}
return this.atomicBatch;
}
async catchup(atom, length) {
await this.release();
const batch = this._getAtomicBatch(atom);
await batch.ready();
await batch.state.catchup(length);
}
createSession(atom, valueEncoding) {
if (this.batch === null) {
this.batch = this.core.session({ name: "batch", writable: true });
this.batch.on("truncate", this.ontruncate);
}
const s = atom ? this._getAtomicBatch(atom).session({
valueEncoding,
writable: true,
onseq: this.tracer.onseq.bind(this.tracer)
}) : this.batch.session({ valueEncoding, writable: false });
return s;
}
};
var Tracer = class {
constructor() {
this.enabled = false;
this.seen = /* @__PURE__ */ new Set();
}
start() {
this.enabled = true;
this.seen.clear();
}
end() {
this.enabled = false;
return [...this.seen.values()];
}
onseq(seq, core) {
if (!this.enabled) return;
if (this.seen.size >= MAX_TRACE_PER_VIEW) return;
if (seq >= core.signedLength) return;
this.seen.add(seq);
}
};
var AutoStore = class _AutoStore {
constructor(base, byName) {
this.base = base;
this.store = base.store;
this.byName = byName || /* @__PURE__ */ new Map();
this.opened = [];
this.atom = null;
this.local = null;
}
async close() {
if (this.local) await this.local.close();
for (const v of this.byName.values()) {
await v.release();
}
if (this.atom) return;
for (const v of this.byName.values()) {
if (v.core) await v.core.close();
if (v.batch) await v.batch.close();
}
}
async export() {
const views = [];
for (const [name, value] of this.byName) {
const core = await this.store.storage.export(value.core.discoveryKey, { batches: true });
views.push({ name, core });
}
return views;
}
atomize() {
const store = new _AutoStore(this.base, this.byName);
store.atom = this.store.storage.createAtom();
return store;
}
async updateLocal() {
if (!this.local) return;
await this.local.close();
this.local = null;
}
flush() {
return this.atom ? this.atom.flush() : Promise.resolve();
}
get(opts, moreOpts) {
if (typeof opts === "string") opts = { name: opts };
if (moreOpts) opts = { ...opts, ...moreOpts };
const { name, valueEncoding = null } = opts;
if (!name) throw new Error("name is required");
return this.getViewByName(name).createSession(this.atom, valueEncoding);
}
getViewByName(name) {
let view = this.byName.get(name);
if (!view) {
const preload = this._preload(name);
const core = this.base.store.get({ preload });
view = new ViewCore(name, core, this.base);
this.byName.set(name, view);
}
if (this.opened.indexOf(view) === -1) {
this.opened.push(view);
}
return view;
}
getLocal() {
if (this.local !== null) return this.local;
this.local = this.base.local.session({
atom: this.atom,
valueEncoding: messages.OplogMessage,
encryption: this.base.getWriterEncryption(this.base.local.key),
active: false
});
return this.local;
}
getViews() {
return [...this.byName.values()];
}
getViewCount() {
return this.byName.size;
}
getSystemView() {
return this.getViewByName("_system");
}
getSystemCore() {
return this.getSystemView().core;
}
getEncryption(name) {
if (!this.base.encryptionKey) return null;
if (name === "_encryption") return null;
return this.base.encryption.getViewEncryption(name);
}
async getIndexerManifests(entries) {
const manifests = [];
for (const { key } of entries) {
const core = this.store.get({ key, active: false });
await core.ready();
if (!core.manifest) continue;
manifests.push(core.manifest);
await core.close();
}
return manifests;
}
getViewCore(indexerManifests, name, prologue, manifestVersion, entropy, linked, manifestData) {
const manifest = this._createManifest(
indexerManifests,
name,
prologue,
manifestVersion,
entropy,
linked,
manifestData
);
return this.base.store.get({
manifest,
exclusive: false,
encryption: this.getEncryption(name)
});
}
listViews() {
const views = [];
for (const [name, ref] of this.byName) {
const core = ref.batch || ref.core;
views.push({ name, key: core.key, length: core.length, signedLength: core.signedLength });
}
return views;
}
createAnchorCore(prologue, manifestData) {
const manifest = {
version: 2,
hash: "blake2b",
prologue,
allowPatch: false,
quorum: 0,
signers: [],
userData: manifestData,
linked: null
};
const core = this.store.get({
manifest,
active: false
});
return core;
}
async createView(indexerManifests, name, prologue, manifestVersion, entropy, linked, manifestData) {
const manifest = this._createManifest(
indexerManifests,
name,
prologue,
manifestVersion,
entropy,
linked,
manifestData
);
const core = this.store.get({
key: Hypercore.key(manifest),
manifest,
active: false
});
await core.ready();
const key = core.key;
await core.close();
return key;
}
async _preload(name) {
await Promise.resolve();
if (!this.base.opening) throw new Error("Autobase failed to open");
await this.base._preopen;
const boot = await this.base._getSystemInfo() || {
key: this.getBootstrapSystemKey(),
indexers: [],
views: [],
entropy: null
};
const indexerManifests = await this.getIndexerManifests(boot.indexers);
if (boot.indexers.length === 0) {
return this._freshCorePreload(indexerManifests, name, boot.entropy);
}
if (name === "_system") {
return {
key: boot.key,
exclusive: false,
encryption: this.getEncryption(name)
};
}
if (name === "_encryption") {
const core = this.getSystemCore();
await core.ready();
if (!core.manifest.linked) {
return this._freshCorePreload(indexerManifests, name, boot.entropy);
}
return {
key: core.manifest.linked[0],
exclusive: false,
encryption: null
};
}
const v = await this.findViewByName(indexerManifests, boot.views, name, boot.entropy);
if (v === null) {
return this._freshCorePreload(indexerManifests, name, boot.entropy);
}
return {
key: v.key,
exclusive: false,
encryption: this.getEncryption(name)
};
}
_freshCorePreload(indexerManifests, name, entropy) {
if (name === "_system") return this._freshSystemPreload(indexerManifests, entropy);
return {
manifest: this._createManifest(
indexerManifests,
name,
null,
DEFAULT_MANIFEST_VERSION,
entropy,
[],
null
),
exclusive: true,
encryption: this.getEncryption(name)
};
}
_freshSystemPreload(indexerManifests, entropy) {
return {
manifest: this._createSystemManifest(
indexerManifests,
null,
DEFAULT_MANIFEST_VERSION,
entropy,
null
),
exclusive: true,
encryption: this.getEncryption("_system")
};
}
_deriveStaticHash(name) {
return crypto.hash([this.base.key, b4a4.from(name)]);
}
_deriveNamespace(name, entropy) {
const encryptionId = crypto.hash(this.base.encryptionKey || EMPTY);
const version3 = c4.encode(c4.uint, INDEX_VERSION);
const bootstrap = this.base.key;
return crypto.hash([
NS_SIGNER_NAMESPACE,
version3,
bootstrap,
encryptionId,
entropy,
b4a4.from(name)
]);
}
async _getCoreManifest(key) {
const core = this.store.get({ key, active: false });
await core.ready();
const manifest = core.manifest;
await core.close();
return manifest;
}
getBootstrapSystemKey() {
return Hypercore.key(this._createSystemManifest([], null, DEFAULT_MANIFEST_VERSION, null));
}
async findViewByKey(key, indexers, manifestVersion, entropy) {
for (const v of this.byName.values()) {
if (await v.matchesKey(key)) return v;
}
const manifest = await this._getCoreManifest(key);
const target = manifest && manifest.signers.length ? manifest.signers[0].namespace : null;
if (target) {
for (const v of this.byName.values()) {
if (await v.matchesNamespace(target)) return v;
}
}
const indexerManifests = await this.getIndexerManifests(indexers);
if (entropy === null) {
entropy = indexerManifests[0].signers[0].namespace;
}
if (target) {
for (const v of this.byName.values()) {
const namespace = this._deriveNamespace(v.name, entropy);
if (b4a4.equals(namespace, target)) return v;
}
}
for (const v of this.byName.values()) {
const manifestData = v.core ? v.core.manifest.userData : null;
const manifest2 = this._createManifest(
indexerManifests,
v.name,
null,
manifestVersion,
entropy,
[],
manifestData
);
const manifestKey = Hypercore.key(manifest2);
if (!b4a4.equals(manifestKey, key)) continue;
const core = this.store.get({ key: manifestKey, manifest: manifest2, active: false });
await core.ready();
await core.close();
return v;
}
return null;
}
async findViewByName(indexerManifests, views, name, entropy) {
if (indexerManifests.length === 0) return null;
if (entropy === null) entropy = indexerManifests[0].signers[0].namespace;
const namespace = this._deriveNamespace(name, entropy);
for (const v of views) {
const manifest = await this._getCoreManifest(v.key);
if (manifest.signers.length === 0) continue;
const signer = manifest.signers[0];
if (b4a4.equals(signer.namespace, namespace)) return v;
}
return null;
}
_createManifest(indexerManifests, name, prologue, version3, entropy, linked, manifestData) {
if (!indexerManifests.length) {
prologue = {
hash: this._deriveStaticHash(name),
length: 0
};
} else if (prologue && prologue.length === 0) {
prologue = null;
}
const signers = [];
if (indexerManifests.length && entropy === null) {
entropy = indexerManifests[0].signers[0].namespace;
}
for (const manifest of indexerManifests) {
const signer = manifest.signers[0];
signers.push({
namespace: this._deriveNamespace(name, entropy),
signature: "ed25519",
publicKey: signer.publicKey
});
}
return {
version: version3,
hash: "blake2b",
prologue,
allowPatch: true,
quorum: Math.min(signers.length, (signers.length >> 1) + 1),
signers,
userData: manifestData,
linked: version3 > 1 ? linked : null
};
}
_createSystemManifest(indexerManifests, prologue, version3, entropy, manifestData) {
if (prologue !== null) throw new Error("Can only derive fresh system core");
const linked = [];
if (version3 > DEFAULT_MANIFEST_VERSION) {
const encManifest = this._createManifest(
indexerManifests,
"_encryption",
null,
version3,
entropy,
[],
manifestData
);
linked.push(Hypercore.key(encManifest));
}
return this._createManifest(
indexerManifests,
"_system",
null,
version3,
entropy,
linked,
manifestData
);
}
};
module2.exports = AutoStore;
}
});
// node_modules/autobase/lib/apply-calls.js
var require_apply_calls = __commonJS({
"node_modules/autobase/lib/apply-calls.js"(exports2, module2) {
var PublicApplyCalls = class {
constructor(base) {
this.base = base;
this.internal = false;
}
get discoveryKey() {
return this.base.discoveryKey;
}
get key() {
return this.base.key;
}
get id() {
return this.base.id;
}
async addWriter() {
throw new Error("Not allowed on the public view");
}
async ackWriter() {
throw new Error("Not allowed on the public view");
}
async removeWriter() {
throw new Error("Not allowed on the public view");
}
preferFastForward() {
throw new Error("Not allowed on the public view");
}
interrupt() {
throw new Error("Not allowed on the public view");
}
removeable() {
throw new Error("Not allowed on the public view");
}
fork() {
throw new Error("Not allowed on the public view");
}
anchor() {
throw new Error("Not allowed on the public view");
}
};
var PrivateApplyCalls = class extends PublicApplyCalls {
constructor(state) {
super(state.base);
this.state = state;
this.internal = true;
}
get system() {
return this.state.system;
}
async addWriter(key, { indexer = true, isIndexer = indexer } = {}) {
await this.state.system.add(key, { isIndexer });
await this.base._addWriter(key, this.state.system);
}
async ackWriter(key) {
await this.state.system.ack(key);
}
async removeWriter(key) {
if (!this.state.removeable(key)) {
throw new Error("Not allowed to remove the last indexer");
}
await this.state.system.remove(key);
this.base._removeWriter(key);
}
preferFastForward() {
this.base._preferFastForward();
}
interrupt(reason) {
this.base._interrupt(reason);
}
removeable(key) {
return this.state.removeable(key);
}
async fork(indexerKeys, system) {
if (!await this.state.validateFork(indexerKeys, system)) return false;
const indexers = indexerKeys.map(toIndexer);
this.state.pendingFork = { indexers, length: system.length };
return true;
}
async createAnchor() {
return await this.state.createAnchor();
}
};
module2.exports = { PublicApplyCalls, PrivateApplyCalls };
function toIndexer(key) {
return { key, length: 0 };
}
}
});
// node_modules/autobase/lib/fork.js
var require_fork = __commonJS({
"node_modules/autobase/lib/fork.js"(exports2, module2) {
var c4 = require_compact_encoding();
var SystemView = require_system();
var { EncryptionView } = require_encryption();
var { ManifestData } = require_messages3();
module2.exports = class Fork {
constructor(base, store, state, fork) {
this.base = base;
this.store = store;
this.state = state;
this.indexers = fork.indexers;
this.length = fork.length;
this.system = null;
this.encryption = null;
this.manifests = null;
this.cores = [];
}
async upgrade() {
try {
await this._upgrade();
return true;
} catch {
return false;
} finally {
await this.close();
}
}
async _upgrade() {
this.manifests = await this.store.getIndexerManifests(this.indexers);
this.system = new SystemView(await this._get("_system", this.length));
this.encryption = new EncryptionView(this, await this._get("_encryption", -1));
await this.system.ready();
await this.encryption.ready();
this.entropy = this.system.getEntropy(this.indexers, this.length);
this.manifestVersion = Math.max(this.system.core.manifest.version, 2);
const views = [];
for (const view of this.state.views) {
const v = this.getViewFromSystem(view, this.system);
const indexedLength = v ? v.length : 0;
const session = await this._get(view.name, indexedLength);
await session.ready();
const next = await this.createView(view.name, session, null);
await next.ready();
await this._migrate(view.ref, next, view.core, indexedLength);
views.push({ key: next.key, length: indexedLength });
}
const entropy = EncryptionView.namespace(this.entropy);
await this.encryption.update(entropy);
const system = this.store.getViewByName("_system");
const encryption = this.store.getViewByName("_encryption");
const enc = await this.createView("_encryption", this.encryption.core, null);
await enc.ready();
await this._migrate(encryption, enc, this.encryption.core, this.encryption.core.length);
await this.system.fork(this.indexers, this.manifests, this.encryption.core.length, views);
const sys = await this.createView("_system", this.system.core, [enc.key]);
await sys.ready();
await this._migrate(system, sys, this.system.core, this.system.core.length);
}
async createView(name, core, linked) {
const prologue = await getPrologue(core);
const manifestData = this._manifestData(core);
return this.store.getViewCore(
this.manifests,
name,
prologue,
this.manifestVersion,
this.entropy,
linked,
manifestData
);
}
async _get(name, length) {
const core = this.store.get({ name });
this.cores.push(core);
if (length !== -1) await core.truncate(length);
return core;
}
getViewFromSystem(view) {
if (view.mappedIndex === -1 || view.mappedIndex >= this.system.views.length) return null;
return this.system.views[view.mappedIndex];
}
_manifestData(session) {
if (session.manifest.version > 1) return session.manifest.userData;
return c4.encode(ManifestData, { version: 0, legacyBlocks: session.length });
}
async _migrate(ref, next, source, length) {
if (length > 0) {
await next.core.copyPrologue(source.state);
}
const batch = next.session({ name: "batch", overwrite: true, checkout: length });
await batch.ready();
if (source !== null) {
while (batch.length < source.length) {
await batch.append(await source.get(batch.length));
}
}
ref.moveTo = [batch, next];
}
async close() {
this.destroyed = true;
if (this.system) await this.system.close();
if (this.encryption) await this.encryption.close();
for (const core of this.cores) await core.close();
}
};
async function getPrologue(core) {
if (!core.length) return null;
return {
hash: await core.treeHash(),
length: core.length
};
}
}
});
// node_modules/autobase/lib/apply-state.js
var require_apply_state = __commonJS({
"node_modules/autobase/lib/apply-state.js"(exports2, module2) {
var ReadyResource = require_ready_resource();
var assert2 = require_nanoassert();
var c4 = require_compact_encoding();
var crypto = require_hypercore_crypto();
var b4a4 = require_b4a();
var safetyCatch = require_safety_catch();
var Hypercore = require_hypercore();
var { partialSignature } = require_multisig();
var SystemView = require_system();
var { AutobaseEncryption, EncryptionView } = require_encryption();
var UpdateChanges = require_updates();
var messages = require_messages3();
var { PrivateApplyCalls } = require_apply_calls();
var { encodeValue } = require_values();
var Fork = require_fork();
var LocalState = require_local_state();
var { OPLOG_VERSION, BOOT_RECORD_VERSION } = require_caps2();
var SHOULD_SIGN_THRESHOLD = 0;
var CheckpointCore = class {
constructor(view, core, signer, paused) {
this.view = view;
this.core = core;
this.signer = signer;
this.length = 0;
this.digest = null;
this.signatures = { system: null, encryption: null, user: [] };
this.closed = false;
this.paused = paused;
}
pause() {
this.paused = true;
}
resume() {
if (!this.paused) return;
this.paused = false;
this.updateBackground();
}
async update() {
if (await this.updateCheckpoints()) await this.view.maybeSigned();
}
async updateCheckpoints() {
if (this.core.length <= this.length || this.closed || this.paused) return false;
const length = this.core.length;
const value = await this.core.get(length - 1);
if (length <= this.length || this.closed || !value.digest || this.paused) return false;
const [digest, checkpoints] = await Promise.all([
this._inflateDigest(length, value.digest),
this._inflateAllCheckpoints(length, value.checkpoint)
]);
if (length <= this.length || this.closed || !digest || !checkpoints || this.paused) return false;
for (let i = 0; i < checkpoints.length; i++) {
if (checkpoints[i] === null) return false;
}
this.length = length;
this.digest = digest;
this.signatures = checkpoints;
return true;
}
updateBackground() {
return this.update().catch(safetyCatch);
}
updateInternalSignatures(length, signatures) {
this.signatures.system = updateSignature(length, signatures.system, this.signatures.system);
this.signatures.encryption = updateSignature(
length,
signatures.encryption,
this.signatures.encryption
);
}
updateUserSignatures(length, signatures) {
this.signatures.user = updateSignatures(length, signatures, this.signatures.user);
}
makeCheckpoints(length) {
return {
system: makeCheckpoint(length, this.signatures.system),
encryption: makeCheckpoint(length, this.signatures.encryption),
user: makeCheckpoints(length, this.signatures.user)
};
}
makeDigest(length, key) {
if (this.digest && (this.digest.key === key || b4a4.equals(this.digest.key, key))) {
return { key: null, pointer: length - this.digest.at };
}
this.digest = { key, at: length };
return { key, pointer: 0 };
}
async ready() {
await this.core.ready();
this.core.on("append", this.updateBackground.bind(this));
if (this.core.writable) await this.updateCheckpoints();
this.updateBackground();
}
signedLength() {
return this.signatures.system ? this.signatures.system.length : 0;
}
close() {
this.closed = true;
return this.core.close();
}
async _inflateDigest(length, dig) {
if (!dig) return null;
if (dig.pointer === 0) {
return { key: dig.key, at: length };
}
const len = length - dig.pointer;
if (this.digest && len === this.digest.at) return this.digest;
if (len <= 0) return null;
const { digest } = await this.core.get(len - 1);
if (!digest || !digest.key) return null;
return { key: digest.key, at: len };
}
_sameSignatures(b, a) {
return sameSignature(a.system, b.system) && sameSignature(a.encryption, b.encryption) && sameSignatures(a.user, b.user);
}
async _inflateAllCheckpoints(length, checkpoints) {
if (!checkpoints) return { system: null, encryption: null, user: [] };
if (this._sameSignatures(checkpoints, this.signatures)) return this.signatures;
const system = this._inflateSystemCheckpoint(checkpoints.system, length);
const encryption = this._inflateEncryptionCheckpoint(checkpoints.encryption, length);
const user = checkpoints.user ? new Array(checkpoints.user.length) : [];
for (let i = 0; i < user.length; i++) {
const chk = checkpoints.user[i];
user[i] = this._inflateUserCheckpoint(chk, i, length);
}
const [systemCheckpoint, encryptionCheckpoint, userCheckpoints] = await Promise.all([
system,
encryption,
Promise.all(user)
]);
return {
system: systemCheckpoint,
encryption: encryptionCheckpoint,
user: userCheckpoints
};
}
async _inflateSystemCheckpoint(chk, coreLength) {
if (chk.checkpoint) {
const { signature: signature2, length: length2 } = chk.checkpoint;
return { signature: signature2, length: length2, at: coreLength };
}
const len = coreLength - chk.checkpointer;
if (this.signatures.system && this.signatures.system.at === len) {
return this.signatures.system;
}
if (len <= 0) return null;
const { checkpoint } = await this.core.get(len - 1);
if (!checkpoint || !checkpoint.system || !checkpoint.system.checkpoint) return null;
const { signature, length } = checkpoint.system.checkpoint;
return { signature, length, at: len };
}
async _inflateEncryptionCheckpoint(chk, coreLength) {
if (!chk) return { length: 0, signature: null, at: 0 };
if (chk.checkpoint) {
const { signature: signature2, length: length2 } = chk.checkpoint;
return { signature: signature2, length: length2, at: coreLength };
}
const len = coreLength - chk.checkpointer;
if (this.signatures.encryption && this.signatures.encryption.at === len) {
return this.signatures.encryption;
}
if (len <= 0) return null;
const { checkpoint } = await this.core.get(len - 1);
if (!checkpoint || !checkpoint.encryption || !checkpoint.encryption.checkpoint) return null;
const { signature, length } = checkpoint.encryption.checkpoint;
return { signature, length, at: len };
}
async _inflateUserCheckpoint(chk, i, coreLength) {
if (chk.checkpoint) {
const { signature: signature2, length: length2 } = chk.checkpoint;
return { signature: signature2, length: length2, at: coreLength };
}
const len = coreLength - chk.checkpointer;
if (i < this.signatures.user.length && this.signatures.user[i].at === len) {
return this.signatures.user[i];
}
if (len <= 0) return null;
const { checkpoint } = await this.core.get(len - 1);
if (!checkpoint || i >= checkpoint.user.length || !checkpoint.user[i].checkpoint) return null;
const { signature, length } = checkpoint.user[i].checkpoint;
return { signature, length, at: len };
}
};
module2.exports = class ApplyState extends ReadyResource {
constructor(base) {
super();
this.base = base;
this.encryption = this.base.encryption;
this.valueEncoding = base.valueEncoding;
this.store = base._viewStore.atomize();
this.key = null;
this.system = null;
this.view = null;
this.views = [];
this.systemView = null;
this.encryptionView = null;
this.hostcalls = null;
this.changes = base._hasUpdate ? new UpdateChanges(base) : null;
this.updates = [];
this.local = null;
this.localState = null;
this.fastForwarding = false;
this.indexersUpdated = false;
this.quorum = 0;
this.needsIndexedLengthUpdate = false;
this.interrupted = false;
this.applying = null;
this.applyBatch = null;
this.localCheckpoint = null;
this.localIndexer = false;
this.systemUpgrade = null;
this.checkpoints = [];
this.pendingViews = null;
this.pendingFork = null;
this.dirty = false;
}
shouldFlush() {
return this.dirty;
}
async shouldWrite() {
if (!this.localIndexer || !this.localCheckpoint || !this.localCheckpoint.core.opened) {
return false;
}
const info = await this.system.getIndexedInfo(this.indexedLength);
if (!info.views.length) return false;
const { encryption, user } = this.localCheckpoint.signatures;
if (info.views.length > user.length) return true;
for (let i = 0; i < info.views.length; i++) {
if (user[i].length + SHOULD_SIGN_THRESHOLD < info.views[i].length) return true;
}
if (info.encryptionLength !== 0) {
if (!encryption || encryption.length < info.encryptionLength) return true;
}
return false;
}
get indexedLength() {
return this.systemView ? this.systemView.indexedLength : 0;
}
get systemRef() {
return this.systemView ? this.systemView.ref : null;
}
async validateFork(indexerKeys, system) {
if (!b4a4.equals(system.key, this.system.core.key)) return false;
if (this.pendingIndexedLength() < system.length) return false;
for (const key of indexerKeys) {
const info = await this.system.get(key);
if (!info || !info.length || info.isRemoved) return false;
}
return true;
}
async shouldMigrate() {
if (!this.fastForwarding && !this.indexersUpdated) return false;
if (this.system.indexers.length === 0) return false;
if (!this.system.core.manifest || !this.system.core.manifest.signers) return true;
if (this.system.indexers.length !== this.system.core.manifest.signers.length) {
return true;
}
const manifests = await this.store.getIndexerManifests(this.system.indexers);
for (let i = 0; i < this.system.core.manifest.signers.length; i++) {
const { publicKey } = this.system.core.manifest.signers[i];
if (!b4a4.equals(publicKey, manifests[i].signers[0].publicKey)) return true;
}
return false;
}
isLocalPendingIndexer() {
if (this.system.pendingIndexers.length === 0) return false;
const key = this.base.local.key;
for (const k of this.system.pendingIndexers) {
if (b4a4.equals(k, key)) return !b4a4.equals(this.base.key, key) && this.base.local.length === 0;
}
return false;
}
removeable(key) {
if (this.system.indexers.length !== 1) return true;
return !b4a4.equals(this.system.indexers[0].key, key);
}
isLocalIndexer() {
return !!this.localCheckpoint;
}
_createCheckpointCore(key, active, signer, paused) {
const encryption = this.base.getWriterEncryption(key);
const session = this.base.store.get({
key,
valueEncoding: messages.OplogMessage,
encryption,
active
});
return new CheckpointCore(this, session, signer, paused);
}
async _openInternalView(name, indexedLength) {
const core = this.store.get({ name });
await core.ready();
await core.setUserData("referrer", this.base.key);
await core.setUserData("autobase/view", b4a4.from(name));
const ref = this.store.getViewByName(name);
return { ref, core, indexedLength };
}
async _open() {
try {
await this._boot();
} catch (err) {
if (isViewCorruption(err)) {
for (const v of this.store.opened) {
await v.core.ready();
await v.core.state.storage.deleteSessions();
}
if (this.systemView) {
const core = this.systemView.ref.core;
await core.ready();
await core.state.storage.deleteSessions();
}
if (this.encryptionView) {
const core = this.encryptionView.ref.core;
await core.ready();
await core.state.storage.deleteSessions();
}
await LocalState.clear(this.base.local);
}
await this._free();
throw err;
}
}
async _boot() {
const boot = await this.base._getBootRecord();
this.systemView = await this._openInternalView("_system", boot.systemLength);
this.encryptionView = await this._openInternalView("_encryption", -1);
const sysCore = this.systemView.core;
if (sysCore.manifest.version >= 2) {
if (this.encryption !== null) await this.encryption.reload(this.encryptionView.core);
}
const system = new SystemView(sysCore);
await system.ready();
this.store.opened = [];
this.hostcalls = new PrivateApplyCalls(this);
const view = this.base._hasOpen ? this.base._handlers.open(this.store, this.hostcalls) : null;
this.view = view;
this.system = system;
for (const v of this.store.opened) await v.atomicBatch.ready();
this.key = system.core.key;
this.fastForwarding = boot.fastForwarding;
this.indexersUpdated = boot.indexersUpdated;
this.quorum = sysCore.manifest ? sysCore.manifest.quorum : 0;
const added = /* @__PURE__ */ new Set();
for (let i = 0; i < system.views.length; i++) {
const { key, length } = system.views[i];
const v = await this.store.findViewByKey(
key,
system.indexers,
sysCore.manifest.version,
system.entropy
);
if (v === null) {
this.views.push({ name: null, key, length, core: null, ref: null, mappedIndex: i });
continue;
}
await v.atomicBatch.ready();
await v.core.setUserData("referrer", this.base.key);
await v.core.setUserData("autobase/view", b4a4.from(v.name));
this.views.push({ name: v.name, key, length, core: v.atomicBatch, ref: v, mappedIndex: i });
added.add(v);
}
for (const v of this.store.opened) {
if (added.has(v)) continue;
const core = v.atomicBatch;
this.views.push({
name: v.name,
key: core.key,
length: core.length,
core,
ref: v,
mappedIndex: -1
});
}
this.local = this.store.getLocal();
await this.local.ready();
this.localState = new LocalState(this.local);
let isLocalIndexer = false;
const paused = this.base.isFastForwarding();
const inf = await this.system.getIndexedInfo();
for (let i = 0; i < inf.indexers.length; i++) {
const idx = inf.indexers[i];
const chk = this._createCheckpointCore(idx.key, true, i, paused);
await chk.ready();
this.checkpoints.push(chk);
if (b4a4.equals(idx.key, this.base.local.key)) isLocalIndexer = true;
}
const shouldSign = this.quorum > 0 && isLocalIndexer;
if (shouldSign) {
this.localIndexer = true;
await this._startLocalCheckpoint();
}
await this._refreshWriters();
this.maybeSigned().catch(noop);
}
async _startLocalCheckpoint() {
for (const chk of this.checkpoints) {
if (chk.core.id === this.base.local.id) {
this.localCheckpoint = chk;
return;
}
}
this.localCheckpoint = this._createCheckpointCore(this.base.local.key, false, 0, false);
await this.localCheckpoint.ready();
}
interrupt() {
this.interrupted = true;
this.pause();
}
pause() {
for (const chk of this.checkpoints) {
if (chk !== this.localCheckpoint) chk.pause();
}
}
resume() {
for (const chk of this.checkpoints) {
if (chk !== this.localCheckpoint) chk.resume();
}
}
_checkSystemUpgrade() {
if (this.systemUpgrade) return;
const tally = /* @__PURE__ */ new Map();
for (const chk of this.checkpoints) {
if (chk.signedLength() <= this.system.core.signedLength) continue;
if (!chk.digest) continue;
const id = b4a4.toString(chk.digest.key, "hex");
const cnt = (tally.get(id) || 0) + 1;
if (cnt >= this.quorum) {
this.systemUpgrade = chk.digest.key;
this.base._queueStaticFastForward(this.systemUpgrade);
return;
}
tally.set(id, cnt);
}
}
mapIndexToView(index) {
for (const { mappedIndex, ref } of this.views) {
if (mappedIndex === index) return ref;
}
}
async maybeSigned() {
if (this.opened === false) await this.ready();
if (this.interrupted) return;
const thres = this.checkpoints.length - this.quorum;
if (thres < 0 || this.checkpoints.length <= thres) return;
this.checkpoints.sort(cmpCheckpoints);
const signableLength = this.checkpoints[thres].signedLength();
if (signableLength <= this.system.core.signedLength) return;
const expected = this.system.core.key;
if (signableLength > this.indexedLength) {
if (!b4a4.equals(expected, this.checkpoints[thres].digest.key)) this._checkSystemUpgrade();
this.needsIndexedLengthUpdate = true;
return;
}
for (let i = thres; i < this.checkpoints.length; i++) {
const chk2 = this.checkpoints[i];
if (!b4a4.equals(expected, chk2.digest.key)) {
this._checkSystemUpgrade();
return;
}
if (!chk2.signatures.system || chk2.signatures.system.length > this.indexedLength) {
this.needsIndexedLengthUpdate = true;
return;
}
}
this.needsIndexedLengthUpdate = false;
const chk = [];
for (let i = thres; i < this.checkpoints.length; i++) {
chk.push({ signer: this.checkpoints[i].signer, signatures: this.checkpoints[i].signatures });
}
const { system } = this.checkpoints[thres].signatures;
await this._assembleMultisig(system.length, chk);
}
async _assembleMultisig(signableLength, checkpoints) {
const views = new Array(this.views.length + 2);
const sys = await this.system.getIndexedInfo(signableLength);
if (this.interrupted) return;
if (this.pendingViews && this.pendingViews[0].length >= signableLength) {
return;
}
views[0] = createCheckpointSignature(signableLength, this.systemView, checkpoints.length);
if (sys.encryptionLength) {
views[1] = createCheckpointSignature(
sys.encryptionLength,
this.encryptionView,
checkpoints.length
);
}
const offset = 2;
for (let i = offset; i < views.length; i++) {
const view = this.views[i - offset];
const core = view.core;
const v = this.getViewFromSystem(view, sys);
const length = v ? v.length : 0;
if (!core || length <= core.signedLength) continue;
const viewIndex = view.mappedIndex + offset;
views[viewIndex] = createCheckpointSignature(length, view, checkpoints.length);
}
for (let i = 0; i < checkpoints.length; i++) {
addCheckpointSignatures(views, checkpoints, i);
}
const promises = [];
for (const view of views) {
if (!view) continue;
for (let i = 0; i < view.signatures.length; i++) {
promises.push(setPartialSignature(view, i));
}
}
await Promise.all(promises);
for (const v of views) {
if (!v) continue;
for (let i = 0; i < v.signatures.length; i++) {
if (!v.partials[i]) return;
}
}
if (this.interrupted) return;
if (this.pendingViews && this.pendingViews[0].length >= signableLength) {
return;
}
if (!views[0]) return;
this.pendingViews = views;
this.dirty = true;
this.base._queueBump();
}
_close() {
if (this.interrupted) return;
return this._free();
}
async _free() {
this.interrupted = true;
if (this.applying) this._postApply();
for (const chk of this.checkpoints) await chk.close();
if (this.localCheckpoint) await this.localCheckpoint.close();
if (this.view && this.base._hasClose) await this.base._handlers.close(this.view);
if (this.system) await this.system.close();
const promises = [];
for (const v of this.views) {
if (v.ref) promises.push(v.ref.release());
}
if (this.systemView) promises.push(this.systemView.ref.release());
if (this.encryptionView) promises.push(this.encryptionView.ref.release());
await Promise.all(promises);
await this.store.close();
}
_pushUpdate(u) {
u.version = 1;
u.seq = this.updates.length === 0 ? 0 : this.updates[this.updates.length - 1].seq + 1;
u.systemLength = this.systemView.core.length;
this.updates.push(u);
this.localState.insertUpdate(u);
}
async catchup(linearizer) {
if (!this.opened) await this.ready();
if (!this.system.heads.length) return true;
const writers = /* @__PURE__ */ new Map();
const updates = await this.localState.listUpdates();
const sys = await this.system.checkout(this.indexedLength);
for (const node of updates) {
const hex = b4a4.toString(node.key, "hex");
let w = writers.get(hex);
if (w === void 0) {
w = await this.base._getWriterByKey(node.key, -1, 0, true, false, sys);
writers.set(hex, w);
}
if (w.length >= node.length) {
this.base._warn(new Error("Update expects writer to be consumed here"));
return false;
}
while (w.length < node.length) {
await w.update(sys);
const next = w.advance();
if (!next) {
this.base._warn(new Error("Node must exist for catchup"));
return false;
}
linearizer.addHead(next);
}
}
await sys.close();
this.updates = updates;
if (this.indexersUpdated) {
this.indexersUpdated = false;
await this.truncate(this.indexedLength);
await this._rollbackViews();
if (this.tx === null) this.tx = this.local.state.storage.write();
while (this.updates.length > 0 && this.updates[this.updates.length - 1].systemLength >= this.indexedLength) {
const u = this.updates.pop();
this.localState.deleteUpdate(u);
}
} else {
linearizer.update();
}
await this._refreshWriters();
return true;
}
async getIndexedSystem() {
if (this.opened === false) await this.ready();
const indexedLength = this.pendingFork ? this.pendingFork.length : this.indexedLength;
const sys = await this.system.checkout(indexedLength);
await sys.ready();
return sys;
}
getViewFromSystem(view, sys = this.system) {
if (view.mappedIndex === -1 || view.mappedIndex >= sys.views.length) return null;
return sys.views[view.mappedIndex];
}
async recoverAt() {
if (!this.systemRef) await this.ready();
await this.systemRef.core.ready();
const lt = this.systemRef.core.core.state.length;
for await (const { length, info } of SystemView.flushes(this.systemRef.core.session(), {
reverse: true,
lt
})) {
let consistent = true;
for (let i = 0; i < info.views.length; i++) {
if (i >= this.views.length) continue;
if (!b4a4.equals(info.views[i].key, this.views[i].key)) continue;
if (info.views[i].length > this.views[i].core.core.state.length) {
consistent = false;
break;
}
}
if (consistent) {
return {
length,
force: true,
key: this.system.core.key,
indexers: info.indexers,
views: info.views
};
}
}
return null;
}
bootstrap() {
return this.system.add(this.base.key, { isIndexer: true, isPending: false });
}
async undo(popped) {
if (!popped) return;
let indexersUpdated = false;
while (popped > 0) {
const u2 = this.updates.pop();
this.localState.deleteUpdate(u2);
popped -= u2.batch;
if (u2.indexers) indexersUpdated = true;
}
const u = this.updates.length === 0 ? null : this.updates[this.updates.length - 1];
const systemLength = u ? u.systemLength : this.indexedLength;
await this.truncate(systemLength);
if (indexersUpdated) await this._rollbackViews();
}
async truncate(systemLength) {
if (this.opened === false) await this.ready();
if (systemLength === this.system.core.length) return;
await this.system.core.truncate(systemLength);
const migrated = await this.system.update();
if (this.encryptionView.core.length !== this.system.encryptionLength) {
await this.encryptionView.core.truncate(this.system.encryptionLength);
}
for (const view of this.views) {
if (!view.core) continue;
const v = this.getViewFromSystem(view);
if (v && view.core.length === v.length) continue;
if (v === null) view.mappedIndex = -1;
await view.core.truncate(v ? v.length : 0);
}
if (!migrated) return;
await this._refreshWriters();
await this._rollbackViews();
}
async _refreshWriters() {
for (const w of this.base.activeWriters) {
const data = await this.system.get(w.core.key);
const bootstrapper = this.system.core.length === 0 && b4a4.equals(w.core.key, this.base.key);
const isRemoved = data ? data.isRemoved : !bootstrapper;
w.isRemoved = isRemoved;
}
}
async _updateSystem() {
if (!await this.system.update()) return;
await this._refreshWriters();
await this._rollbackViews();
}
async _signViewCore(core, length) {
const s = await core.signable(length, 0);
const signature = crypto.sign(s, this.base.local.keyPair.secretKey);
return { signature, length };
}
async _signInternalViewCores(sys) {
return {
system: await this._signViewCore(this.systemView.core, this.systemView.indexedLength),
encryption: await this._signViewCore(this.encryptionView.core, sys.encryptionLength)
};
}
async _signUserViewCores(sys) {
const promises = new Array(sys.views.length);
for (let i = 0; i < this.views.length; i++) {
const view = this.views[i];
const v = this.getViewFromSystem(view, sys);
const indexedLength = v ? v.length : 0;
if (!indexedLength) continue;
const viewIndex = view.mappedIndex;
promises[viewIndex] = this._signViewCore(view.ref.atomicBatch, indexedLength);
}
return Promise.all(promises);
}
async finalize(key) {
this.localState.setBootRecord({
version: BOOT_RECORD_VERSION,
key,
systemLength: this.systemView.indexedLength,
indexersUpdated: true,
fastForwarding: false,
recoveries: this.base.recoveries
});
await this.localState.flush();
await this.store.flush();
await this.close();
}
async _flush(localNodes) {
if (localNodes) await this._appendLocalNodes(localNodes);
if (this.localCheckpoint) {
await this.store.flush();
await this.localCheckpoint.update();
}
this.localState.setBootRecord({
version: BOOT_RECORD_VERSION,
key: this.key,
systemLength: this.systemView.indexedLength,
indexersUpdated: false,
fastForwarding: false,
recoveries: this.base.recoveries
});
await this.localState.flush();
if (this.pendingViews) {
const views = this.pendingViews;
this.pendingViews = null;
for (let i = views.length - 1; i >= 0; i--) {
const v = views[i];
if (!v || v.length <= v.core.signedLength) continue;
const signature = v.core.core.verifier.assemble(v.partials);
try {
await v.ref.commit(this.store.atom, v.length, signature);
} catch (err) {
if (isAssertion(err)) {
throw err;
}
if (!this.base.closing) this.base._warn(err);
break;
}
}
}
await this.store.flush();
this.fastForwarding = false;
if (this.pendingViews === null) this.dirty = false;
}
_indexUpdates(indexed) {
let shift = 0;
while (indexed > 0) indexed -= this.updates[shift++].batch;
const last = this.updates[shift - 1];
this.systemView.indexedLength = last.systemLength;
for (let i = 0; i < shift; i++) this.localState.deleteUpdate(this.updates[i]);
this.updates.splice(0, shift);
if (!this.needsIndexedLengthUpdate) return;
this.maybeSigned().catch(noop);
}
pendingIndexedLength() {
let indexed = this.applying.indexed.length;
if (!this.applying || !this.updates.length || !indexed) return this.indexedLength;
let pos = 0;
while (indexed > 0 && pos < this.updates.length) {
indexed -= this.updates[pos++].batch;
}
const last = this.updates[pos - 1];
return last.systemLength;
}
async _assertNode(node, batch) {
const v = await this.system.get(node.writer.core.key) || { length: 0, isRemoved: false };
const expected = v.length + batch;
if (node.length === expected) return;
console.trace(
"INVALID_INSERTION",
"length=",
node.length,
"key=",
node.writer.core.key,
"local=",
node.writer.core.writable,
"batch=",
batch,
"dag=",
v
);
process.exit(1);
}
_postApply() {
this.applyBatch = this.applying = null;
this.base._postApply();
}
async _optimisticApply(u, node, indexed) {
const checkpoint = this.system.checkpoint();
this.system.addHead(node);
const applyBatch = [];
const key = node.writer.core.key;
applyBatch.push({
indexed,
optimistic: true,
from: node.writer.core,
length: node.length,
value: node.value,
heads: node.actualHeads
});
const pre = await this.system.get(key);
const preLength = pre ? pre.length : 0;
let failed = false;
this.applying = u;
this.applyBatch = applyBatch;
try {
await this.base._handlers.apply(applyBatch, this.view, this.hostcalls);
} catch (err) {
if (this.base.closing) throw err;
failed = true;
}
this._postApply();
if (!failed) {
const post = await this.system.get(key);
if (!post || preLength === post.length) failed = true;
}
if (!failed) {
await this._refreshWriters();
return true;
}
this.system.applyCheckpoint(checkpoint);
if (this.encryptionView.core.length !== this.system.encryptionLength) {
await this.encryptionView.core.truncate(this.system.encryptionLength);
}
for (const view of this.views) {
const viewLength = view.core ? view.core.length : view.length;
const viewLookup = this.getViewFromSystem(view);
const viewSystemLength = viewLookup ? viewLookup.length : 0;
if (viewSystemLength === viewLength) continue;
await view.core.truncate(viewSystemLength);
}
await this._refreshWriters();
await this._rollbackViews();
return false;
}
_startTrace(node) {
this.systemRef.tracer.start();
this.encryptionView.ref.tracer.start();
for (let i = 0; i < this.views.length; i++) this.views[i].ref.tracer.start();
}
_endTrace(node) {
const trace = {
system: this.systemRef.tracer.end(),
encryption: this.encryptionView.ref.tracer.end(),
user: []
};
for (let i = 0; i < this.views.length; i++) {
const blocks = this.views[i].ref.tracer.end();
if (blocks.length) trace.user.push({ view: i, blocks });
}
if (trace.system.length || trace.encryption.length || trace.user.length) node.trace = trace;
}
async update(u, localNodes) {
if (this.changes !== null) this.changes.track(this);
let batch = 0;
let applyBatch = [];
let indexersUpdated = 0;
let j = 0;
let i = 0;
let forkedAt = -1;
while (i < Math.min(u.indexed.length, u.shared)) {
const node = u.indexed[i++];
if (node.batch > 1) continue;
this.base._shiftWriter(node.writer);
const update = this.updates[j++];
if (update.indexers) {
indexersUpdated = i;
break;
}
}
if (u.undo) await this.undo(u.undo);
if (this.system.bootstrapping) await this.bootstrap();
await this._updateSystem();
const warmupSystemView = [];
const warmupEncryptionView = [];
const warmupUserView = new Array(this.views.length);
for (let k = u.shared; k < u.length; k++) {
const indexed = k < u.indexed.length;
const node = indexed ? u.indexed[k] : u.tip[k - u.indexed.length];
if (!node.trace) continue;
if (node.trace.system.length) warmupSystemView.push(...node.trace.system);
if (node.trace.encryption.length) warmupEncryptionView.push(...node.trace.encryption);
for (const trace of node.trace.user) {
if (trace.view >= this.views.length) {
console.warn(
"Oplog block trace contains OOB view index",
"trace view",
trace.view,
"views.length",
this.views.length
);
continue;
}
warmupUserView[trace.view] = warmupUserView[trace.view] || [];
warmupUserView[trace.view].push(...trace.blocks);
}
}
if (warmupSystemView.length) this.systemView.core.download({ blocks: warmupSystemView });
if (warmupEncryptionView.length)
this.encryptionView.core.download({ blocks: warmupEncryptionView });
for (let k = 0; k < warmupUserView.length; k++) {
const blocks = warmupUserView[k];
if (!blocks) continue;
const view = this.views[k];
view.core.download({ blocks });
}
for (i = u.shared; i < u.length; i++) {
if (this.base.backoff !== null && this.base.backoff.backoff()) await this.base.backoff.wait();
const indexed = i < u.indexed.length;
const node = indexed ? u.indexed[i] : u.tip[i - u.indexed.length];
batch++;
if (node.writer.core.writable) this._startTrace(node);
const optimist = node.writer.isRemoved && node.optimistic && batch === 1 && this.base._hasOptimisticApply === true && await this._optimisticApply(u, node, indexed);
if (!optimist) {
if (node.writer.isRemoved && !node.writer.isActiveIndexer) {
if (node.batch > 1) continue;
const u2 = {
seq: 0,
key: node.writer.core.key,
length: node.length,
batch,
systemLength: 0,
indexers: false
};
this._pushUpdate(u2);
batch = 0;
assert2(applyBatch.length === 0, "Apply batch should not have been modified");
continue;
}
const deps = node.causalDependencies();
for (let i2 = deps.length - 1; i2 >= 1; i2--) {
const d = deps[i2];
if (await this.system.linkable(d.writer.core.key, d.length)) {
this.system.addHead(deps[i2]);
}
}
this.system.addHead(deps[0]);
if (node.value !== null && !node.writer.isRemoved) {
applyBatch.push({
indexed,
optimistic: false,
from: node.writer.core,
length: node.length,
value: node.value,
heads: node.actualHeads
});
}
if (node.batch > 1) continue;
if (applyBatch.length && this.base._hasApply === true) {
this.applying = u;
this.applyBatch = applyBatch;
await this.base._handlers.apply(applyBatch, this.view, this.hostcalls);
if (forkedAt === -1 && this.pendingFork) forkedAt = i;
this._postApply();
}
}
const update = {
seq: 0,
key: node.writer.core.key,
length: node.length,
batch,
systemLength: 0,
indexers: false
};
update.indexers = !!this.system.indexerUpdate;
if (this.system.indexerUpdate) await this._generateNextViews();
await this.system.flush(this.views);
await this.system.update();
if (node.writer.core.writable) this._endTrace(node);
batch = 0;
applyBatch = [];
this._pushUpdate(update);
if (!indexed || indexersUpdated) continue;
this.base._shiftWriter(node.writer);
if (update.indexers) {
indexersUpdated = i + 1;
}
}
if (this.pendingFork) {
const pending = this.pendingFork;
if (pending.length > this.indexedLength) this._indexUpdates(u.indexed.length);
const fork = new Fork(this.base, this.store, this, pending);
const forked = await fork.upgrade();
if (!forked) throw new Error("Fork failed");
await this._flush(localNodes);
return {
reboot: true,
migrated: false
};
}
if (u.indexed.length) {
this._indexUpdates(indexersUpdated || u.indexed.length);
}
const migrated = indexersUpdated !== 0;
if (migrated) this.key = await this.base._premigrate();
if (this.changes !== null) {
this.changes.finalise();
await this.base._handlers.update(this.view, this.changes);
}
await this._flush(localNodes);
return {
reboot: migrated,
migrated
};
}
flush() {
return this._flush(null);
}
async _appendLocalNodes(localNodes) {
if (localNodes.length === 0) return;
const blocks = new Array(localNodes.length);
const local = this.local;
if (!local.opened) await local.ready();
for (let i = 0; i < blocks.length; i++) {
const { value, heads, batch, optimistic, trace } = localNodes[i];
blocks[i] = {
version: OPLOG_VERSION,
maxSupportedVersion: this.base.maxSupportedVersion,
checkpoint: null,
digest: null,
optimistic,
node: {
heads,
batch,
value: value === null ? null : c4.encode(this.base.valueEncoding, value)
},
trace
};
}
if (this.localIndexer) {
const signedLength = this.localCheckpoint.signedLength();
const local2 = this.local;
let signedAt = 0;
let internalSignatures = null;
let signatures = null;
if (this.indexedLength > signedLength) {
const sys = await this.system.getIndexedInfo(this.indexedLength);
internalSignatures = await this._signInternalViewCores(sys);
signatures = await this._signUserViewCores(sys);
signedAt = local2.length + blocks.length;
}
for (let i = 0; i < blocks.length; i++) {
const length = local2.length + i + 1;
if (length === signedAt) {
this.localCheckpoint.updateInternalSignatures(length, internalSignatures);
this.localCheckpoint.updateUserSignatures(length, signatures);
}
const blk = blocks[i];
blk.checkpoint = this.localCheckpoint.makeCheckpoints(length);
blk.digest = this.localCheckpoint.makeDigest(length, this.key);
}
} else {
if (!this.localCheckpoint) await this._startLocalCheckpoint();
for (let i = 0; i < blocks.length; i++) {
const length = local.length + i + 1;
blocks[i].digest = this.localCheckpoint.makeDigest(length, this.key);
}
}
await local.append(blocks);
}
async _rollbackViews() {
for (const view of this.views) {
const v = this.getViewFromSystem(view);
if (v) {
view.key = v.key;
} else {
await this._resetView(view);
}
}
}
async createAnchor() {
const node = this.applyBatch[this.applyBatch.length - 1];
const key = node.from.key;
const length = node.length;
const info = await this.system.get(key, { unflushed: true });
if (!info || info.length < length) throw new Error("Anchor node is not in system");
const state = { start: 0, end: 40, buffer: b4a4.alloc(40) };
c4.fixed32.encode(state, key);
c4.uint64.encode(state, length);
const namespace = crypto.hash(state.buffer);
const manifestData = c4.encode(messages.ManifestData, { version: 0, legacyBlocks: 0, namespace });
const padding = this.encryption ? AutobaseEncryption.PADDING : 0;
const block = encodeValue(null, { heads: [{ key, length }], padding });
if (this.encryption) await this.encryption.encryptAnchor(block, namespace);
const root = { index: 0, size: block.byteLength, hash: crypto.data(block) };
const hash = crypto.tree([root]);
const prologue = { hash, length: 1 };
const core = this.store.createAnchorCore(prologue, manifestData);
await core.ready();
if (core.length === 0) await core.append(block, { writable: true, maxLength: 1 });
await this.system.add(core.key, { isIndexer: false, length: 0 });
await this.base._addWriter(core.key, this.system);
const anchor = { key: core.key, length: core.length };
await core.close();
await this.base.hintWakeup(anchor);
return anchor;
}
async _resetView(view) {
const manifests = await this.store.getIndexerManifests(this.system.indexers);
const manifestData = view.core ? view.core.manifest.userData : null;
view.key = await this.store.createView(
manifests,
view.name,
null,
this.system.core.manifest.version,
this.system.entropy,
null,
manifestData
);
view.length = 0;
}
async _generateNextViews() {
const sys = this.system;
const manifests = await this.store.getIndexerManifests(sys.indexers);
const entropy = sys.version < 2 ? null : sys.getEntropy(sys.indexers, sys.flushLength());
for (const v of this.views) {
const manifestData = v.core ? v.core.manifest.userData : null;
const prologue = await getPrologue(v);
const key = await this.store.createView(
manifests,
v.name,
prologue,
sys.core.manifest.version,
entropy,
null,
manifestData
);
v.key = key;
}
}
};
async function getPrologue(view) {
const length = view.core ? view.core.length : view.length;
if (!length) return null;
const hash = await view.core.treeHash(length);
return {
hash,
length
};
}
function noop() {
}
function cmpCheckpoints(a, b) {
return a.signedLength() - b.signedLength();
}
function sameSignature(a, b) {
if (!a || !b) return a === b;
return a.length === b.length;
}
function sameSignatures(a, b) {
if (!a || !b) return a === b;
if (a.length !== b.length) return false;
for (let i = 0; i < a.length; i++) {
if (a[i].length !== b[i].length) return false;
}
return true;
}
function createCheckpointSignature(length, view, checkpoints) {
return {
length,
core: view.core,
ref: view.ref,
signatures: new Array(checkpoints),
partials: new Array(checkpoints)
};
}
function addCheckpointSignatures(pending, checkpoints, index) {
const { signer, signatures } = checkpoints[index];
pending[0].signatures[index] = {
signature: signatures.system.signature,
length: signatures.system.length,
signer
};
if (pending[1]) {
pending[1].signatures[index] = {
signature: signatures.encryption.signature,
length: signatures.encryption.length,
signer
};
}
for (let i = 2; i < pending.length; i++) {
if (!pending[i]) continue;
const { length, signature } = signatures.user[i - 2];
pending[i].signatures[index] = {
signature,
length,
signer
};
}
}
async function setPartialSignature(view, index) {
const sig = view.signatures[index];
if (sig.length < view.length && sig.length > 0) await view.core.get(sig.length - 1);
view.partials[index] = await partialSignature(
view.core,
sig.signer,
view.length,
sig.length,
sig.signature
);
}
function updateSignature(length, sig, existing) {
return sig ? { signature: sig.signature, length: sig.length, at: length } : existing;
}
function updateSignatures(length, signatures, existing) {
const updated = new Array(signatures.length);
for (let i = 0; i < updated.length; i++) {
updated[i] = updateSignature(length, signatures[i], i < existing.length ? existing[i] : null);
}
return updated;
}
function makeCheckpoint(length, chk) {
if (!chk) return null;
const checkpointer = length - chk.at;
return {
checkpointer,
checkpoint: checkpointer === 0 ? { signature: chk.signature, length: chk.length } : null
};
}
function makeCheckpoints(length, signatures) {
if (!signatures.length) return null;
const checkpoints = new Array(signatures.length);
for (let i = 0; i < signatures.length; i++) {
checkpoints[i] = makeCheckpoint(length, signatures[i]);
}
return checkpoints;
}
function isViewCorruption(err) {
return err.code === "INVALID_OPERATION";
}
function isAssertion(err) {
return err.code === "ERR_ASSERTION" || err.name === "AssertionError";
}
}
});
// node_modules/autobase/lib/append-batch.js
var require_append_batch = __commonJS({
"node_modules/autobase/lib/append-batch.js"(exports2, module2) {
var SignalPromise = require_signal_promise();
module2.exports = class AppendBatch {
constructor(base) {
this.base = base;
this.blocks = [];
this.closed = false;
this.flushing = false;
this._flushed = null;
}
async _acquire() {
while (this.base.activeBatch !== null && this.base.activeBatch !== this)
await this.base.activeBatch.flushed();
this.base.activeBatch = this;
}
async append(value) {
if (this.base.opened === false) await this.base.ready();
if (this.base._advancing !== null) await this.base._advancing;
if (this.closed) throw new Error("Batch is closed");
if (this.base.activeBatch !== this) await this._acquire();
if (this.closed) throw new Error("Batch is closed");
this.blocks.push(value);
return this.base.local.length + this.blocks.length;
}
async flush() {
if (this.closed) throw new Error("Batch is closed");
if (this.flushing) return this.flushed();
this.flushing = true;
if (this.blocks.length) await this.base._appendBatch(this.blocks);
return this.close();
}
flushed() {
if (this.closed) return Promise.resolve();
if (this._flushed) return this._flushed.wait();
this._flushed = new SignalPromise();
return this._flushed.wait();
}
close() {
if (this.base.activeBatch !== this) return;
this.base.activeBatch = null;
this.closed = true;
if (this._flushed) this._flushed.notify(null);
}
};
}
});
// node_modules/autobase/lib/boot.js
var require_boot = __commonJS({
"node_modules/autobase/lib/boot.js"(exports2, module2) {
var c4 = require_compact_encoding();
var encryptionEncoding = require_encryption_encoding();
var messages = require_messages3();
module2.exports = async function boot(corestore, key, { encrypt, encryptionKey, keyPair, exclusive = true, blindEncryption } = {}) {
const result = {
key: null,
local: null,
bootstrap: null,
encryptionKey: null,
boot: null
};
const manifest = keyPair ? { version: corestore.manifestVersion, signers: [{ publicKey: keyPair.publicKey }] } : null;
if (key) {
result.key = key;
const bootstrap = corestore.get({ key, active: false, valueEncoding: messages.OplogMessage });
await bootstrap.ready();
const localKey = await bootstrap.getUserData("autobase/local");
if (keyPair) {
result.local = corestore.get({
keyPair,
active: false,
exclusive,
valueEncoding: messages.OplogMessage,
manifest
});
} else {
if (bootstrap.writable && !localKey) {
result.local = bootstrap.session({
active: false,
exclusive,
valueEncoding: messages.OplogMessage
});
} else {
const local = localKey ? corestore.get({
key: localKey,
active: false,
exclusive,
valueEncoding: messages.OplogMessage
}) : corestore.get({
name: "local",
active: false,
exclusive,
valueEncoding: messages.OplogMessage
});
await local.ready();
result.local = local;
}
}
result.bootstrap = bootstrap;
} else {
result.local = keyPair ? corestore.get({
keyPair,
manifest,
active: false,
exclusive,
valueEncoding: messages.OplogMessage
}) : corestore.get({
name: "local",
active: false,
exclusive,
valueEncoding: messages.OplogMessage
});
await result.local.ready();
const key2 = await result.local.getUserData("referrer");
if (key2) {
result.key = key2;
result.bootstrap = corestore.get({ key: key2, active: false, valueEncoding: messages.OplogMessage });
await result.bootstrap.ready();
} else {
result.key = result.local.key;
result.bootstrap = result.local.session({
active: false,
valueEncoding: messages.OplogMessage
});
await result.bootstrap.setUserData("autobase/local", result.local.key);
}
}
if (key || keyPair) {
await result.bootstrap.setUserData("referrer", result.key);
await result.bootstrap.setUserData("autobase/local", result.local.key);
await result.local.setUserData("referrer", result.key);
}
const [encryptionKeyBuffer, encryptionKeyEncryptedBuffer, pointer] = await Promise.all([
result.local.getUserData("autobase/encryption"),
result.local.getUserData("autobase/blind-encryption"),
result.local.getUserData("autobase/boot")
]);
if (pointer) {
result.boot = c4.decode(messages.BootRecord, pointer);
}
if (encryptionKeyBuffer) {
if (blindEncryption) {
const encrypted = await encryptionEncoding.encrypt(
encryptionKeyBuffer,
blindEncryption.encrypt
);
await result.local.setUserData("autobase/blind-encryption", encrypted);
await result.local.setUserData("autobase/encryption", null);
}
result.encryptionKey = encryptionKeyBuffer;
}
if (encryptionKeyEncryptedBuffer) {
const { value, rotated } = await encryptionEncoding.decrypt(
encryptionKeyEncryptedBuffer,
blindEncryption.decrypt
);
if (rotated) {
const encrypted = await encryptionEncoding.encrypt(value, blindEncryption.encrypt);
await result.local.setUserData("autobase/blind-encryption", encrypted);
}
result.encryptionKey = value;
}
if (!result.encryptionKey && (encryptionKey || encrypt)) {
if (!encryptionKey) {
encryptionKey = (await corestore.createKeyPair("autobase/encryption")).secretKey.subarray(
0,
32
);
}
if (blindEncryption) {
const encrypted = await encryptionEncoding.encrypt(encryptionKey, blindEncryption.encrypt);
await result.local.setUserData("autobase/blind-encryption", encrypted);
} else {
await result.bootstrap.setUserData("autobase/encryption", encryptionKey);
await result.local.setUserData("autobase/encryption", encryptionKey);
}
result.encryptionKey = encryptionKey;
}
return result;
};
}
});
// node_modules/autobase/index.js
var require_autobase2 = __commonJS({
"node_modules/autobase/index.js"(exports2, module2) {
var b4a4 = require_b4a();
var ReadyResource = require_ready_resource();
var debounceify = require_debounceify();
var c4 = require_compact_encoding();
var safetyCatch = require_safety_catch();
var hypercoreId = require_hypercore_id_encoding();
var assert2 = require_nanoassert();
var SignalPromise = require_signal_promise();
var CoreCoupler = require_core_coupler();
var ProtomuxWakeup = require_protomux_wakeup();
var rrp = require_resolve_reject_promise();
var Hypercore = require_hypercore();
var ScopeLock = require_scope_lock();
var encryptionEncoding = require_encryption_encoding();
var LocalState = require_local_state();
var Linearizer = require_linearizer();
var SystemView = require_system();
var { EncryptionView } = require_encryption();
var UpdateChanges = require_updates();
var messages = require_messages3();
var Timer = require_timer();
var Writer = require_writer();
var { encodeValue, decodeValue } = require_values();
var ActiveWriters = require_active_writers();
var AutoWakeup = require_wakeup();
var FastForward = require_fast_forward();
var AutoStore = require_store();
var ApplyState = require_apply_state();
var AppendBatch = require_append_batch();
var { PublicApplyCalls } = require_apply_calls();
var boot = require_boot();
var { MAX_AUTOBASE_VERSION, BOOT_RECORD_VERSION } = require_caps2();
var inspect = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
var INTERRUPT = new Error("Apply interrupted");
var BINARY_ENCODING = c4.from("binary");
var RECOVERIES = 3;
var DEFAULT_ACK_INTERVAL = 1e4;
var DEFAULT_ACK_THRESHOLD = 4;
var REMOTE_ADD_BATCH = 64;
var REMOTE_ADD_BATCH_SANITY = 4096;
var MIN_FF_WAIT = 3e5;
var WakeupHandler = class {
constructor(base, discoveryKey) {
this.active = true;
this.discoveryKey = discoveryKey;
this.base = base;
}
onpeeractive(peer, session) {
this.base._bumpWakeupPeer(peer);
}
onlookup(req, peer, session) {
const wakeup = this.base._getWakeup();
if (wakeup.length === 0) return;
session.announce(peer, wakeup);
}
onannounce(wakeup, peer, session) {
if (this.base.isFastForwarding()) {
this.base._needsWakeupRequest = true;
return;
}
this.base.hintWakeup(wakeup);
}
};
module2.exports = class Autobase extends ReadyResource {
constructor(store, bootstrap, handlers = {}) {
if (Array.isArray(bootstrap)) bootstrap = bootstrap[0];
if (bootstrap && typeof bootstrap !== "string" && !b4a4.isBuffer(bootstrap)) {
handlers = bootstrap;
bootstrap = null;
}
super();
const key = bootstrap ? toKey(bootstrap) : null;
this.id = null;
this.key = key;
this.discoveryKey = null;
this.backoff = handlers.backoff || null;
this.keyPair = null;
this.valueEncoding = c4.from(handlers.valueEncoding || "binary");
this.store = store;
this.globalCache = store.globalCache || null;
this.migrated = false;
this.encrypted = handlers.encrypted || !!handlers.encryptionKey;
this.encrypt = !!handlers.encrypt;
this.encryptionKey = null;
this.encryption = null;
this.blindEncryption = handlers.blindEncryption || null;
this.activeBatch = null;
this.local = null;
this.localWriter = null;
this.isIndexer = false;
this.activeWriters = new ActiveWriters();
this.linearizer = null;
this.updating = false;
this.nukeTip = !!handlers.nukeTip;
this.wakeupOwner = !handlers.wakeup;
this.wakeupCapability = null;
this.wakeupProtocol = handlers.wakeup || new ProtomuxWakeup();
this.wakeupSession = null;
this._primaryBootstrap = null;
this.fastForwardEnabled = handlers.fastForward !== false;
this.fastForwarding = null;
this.fastForwardTo = null;
this.fastForwardFailedAt = 0;
this.fastForwardMinimum = FastForward.MINIMUM;
this.bigBatches = !!handlers.bigBatches;
this._bootstrapWriters = [];
this._bootstrapWritersChanged = false;
this._flushSignal = new SignalPromise();
this._flushing = 0;
this._checkWriters = [];
this._optimistic = -1;
this._appended = 0;
this._appending = null;
this._wakeup = new AutoWakeup(this);
this._wakeupHints = /* @__PURE__ */ new Map();
this._wakeupPeerBound = this._wakeupPeer.bind(this);
this._coupler = null;
this._updateLocalCore = null;
this._lock = new ScopeLock();
this._needsWakeupRequest = false;
this._needsWakeup = true;
this._needsWakeupHeads = true;
this._updates = [];
this._handlers = handlers || {};
this._warn = emitWarning.bind(this);
this._lastError = null;
this._draining = false;
this._writable = null;
this._advancing = null;
this._interrupting = false;
this._caughtup = false;
this.paused = false;
this._bump = debounceify(() => {
this._advancing = this._advance();
return this._advancing;
});
this._onremotewriterchangeBound = this._onremotewriterchange.bind(this);
this._onlocalwriterchangeBound = this._onlocalwriterchange.bind(this);
this._preopen = null;
this._hasOpen = !!this._handlers.open;
this._hasApply = !!this._handlers.apply;
this._hasOptimisticApply = !!this._handlers.optimistic;
this._hasUpdate = !!this._handlers.update;
this._hasClose = !!this._handlers.close;
this._viewStore = new AutoStore(this);
this._applyState = null;
this.view = null;
this.core = null;
this.version = -1;
this.interrupted = null;
this.recoveries = RECOVERIES;
const { ackInterval = DEFAULT_ACK_INTERVAL, ackThreshold = DEFAULT_ACK_THRESHOLD } = handlers;
this._ackInterval = ackInterval;
this._ackThreshold = ackThreshold;
this._ackTickThreshold = ackThreshold;
this._ackTick = 0;
this._ackTimer = null;
this._acking = false;
this._waiting = new SignalPromise();
this.view = this._hasOpen ? this._handlers.open(this._viewStore, new PublicApplyCalls(this)) : null;
this.core = this._viewStore.get({ name: "_system" });
if (this.fastForwardEnabled && isObject2(handlers.fastForward)) {
this._runFastForward(
new FastForward(this, handlers.fastForward.key, { verified: false })
).catch(noop);
}
this.ready().catch(safetyCatch);
}
[inspect](depth, opts) {
let indent = "";
if (typeof opts.indentationLvl === "number") {
while (indent.length < opts.indentationLvl) indent += " ";
}
return indent + "Autobase { ... }";
}
// just compat, use .key
get bootstrap() {
return this.key;
}
// TODO: compat, will be removed
get bootstraps() {
return [this.bootstrap];
}
get appending() {
return this._appending !== null && this._appending.length > 0;
}
get writable() {
return this.localWriter !== null && !this.localWriter.isRemoved;
}
get ackable() {
return this.localWriter !== null && this.localWriter.isActiveIndexer;
}
get signedLength() {
return this.core.signedLength;
}
get indexedLength() {
return this._applyState ? this._applyState.indexedLength : 0;
}
get length() {
return this.core.length;
}
get flushing() {
return this._flushing > 0;
}
hash() {
return this.core.treeHash();
}
// deprecated, use .core.key
getSystemKey() {
return this.core.key;
}
get system() {
return this._applyState && this._applyState.system;
}
// deprecated
async getIndexedInfo() {
if (this.opened === false) await this.ready();
return this._applyState && this._applyState.system.getIndexedInfo(this._applyState.indexedLength);
}
_isActiveIndexer() {
return this.localWriter ? this.localWriter.isActiveIndexer : false;
}
replicate(isInitiator, opts) {
const stream = this.store.replicate(isInitiator, opts);
this.wakeupProtocol.addStream(stream);
return stream;
}
heads() {
if (!this._applyState || !this._applyState.opened) return [];
const nodes = new Array(this._applyState.system.heads.length);
for (let i = 0; i < this._applyState.system.heads.length; i++)
nodes[i] = this._applyState.system.heads[i];
return nodes.sort(compareNodes);
}
async export() {
const exporting = [this.store.storage.export(this.local.discoveryKey), this._viewStore.export()];
const [local, views] = await Promise.all(exporting);
return {
local,
views
};
}
hintWakeup(hints) {
if (!Array.isArray(hints)) hints = [hints];
for (const { key, length } of hints) {
const hex = b4a4.toString(key, "hex");
const prev = this._wakeupHints.get(hex);
if (!prev || length === -1 || prev < length) this._wakeupHints.set(hex, length);
}
this._queueBump();
}
setBigBatches(bool = true) {
this.bigBatches = bool;
}
_queueBump() {
this._bump().catch(safetyCatch);
}
async _runPreOpen() {
if (this._handlers.wait) await this._handlers.wait();
await this.store.ready();
this.keyPair = await this._handlers.keyPair || null;
if (this._handlers.encryptionKey !== null) {
this.encryptionKey = await this._handlers.encryptionKey;
}
const result = await boot(this.store, this.key, {
encryptionKey: this.encryptionKey,
encrypt: this.encrypt,
keyPair: this.keyPair,
blindEncryption: this.blindEncryption
});
this._primaryBootstrap = result.bootstrap;
this.local = result.local;
this.key = result.bootstrap.key;
this.discoveryKey = result.bootstrap.discoveryKey;
this.id = result.bootstrap.id;
this.encryptionKey = result.encryptionKey;
if (this.encrypted) {
assert2(this.encryptionKey !== null, "Encryption key is expected");
}
if (this.encryptionKey) {
this.encryption = new EncryptionView(this, null);
this.local.setEncryption(this.getWriterEncryption());
this._primaryBootstrap.setEncryption(this.getWriterEncryption());
}
if (this.nukeTip) await this._nukeTip();
this.local.on("append", this._onlocalwriterchangeBound);
this.wakeupCapability = await this._handlers.wakeupCapability || {
key: this.key,
discoveryKey: this.discoveryKey
};
this.setWakeup(this.wakeupCapability.key, this.wakeupCapability.discoveryKey);
}
async _nukeTipBatch(key, length) {
const core = this.store.get({ key, active: false });
await core.ready();
const batch = core.session({ name: "batch" });
await batch.ready();
if (batch.length > length) await batch.truncate(length);
await batch.close();
await core.close();
}
// TODO: not atomic atm, so more of a (very useful) debug helper
async _nukeTip() {
const pointer = await this.local.getUserData("autobase/boot");
if (!pointer) return;
const boot2 = c4.decode(messages.BootRecord, pointer);
await LocalState.clear(this.local);
await this._nukeTipBatch(boot2.key, boot2.systemLength);
const core = this.store.get({ key: boot2.key, active: false, encryption: null });
const encCore = await EncryptionView.setSystemEncryption(this, core);
const batch = core.session({ name: "batch" });
await batch.ready();
const info = await SystemView.getIndexedInfo(batch, boot2.systemLength);
await batch.close();
for (const view of info.views) {
await this._nukeTipBatch(view.key, view.length);
}
if (boot2.heads) this.hintWakeup(boot2.heads);
if (this.local.length) this.hintWakeup([{ key: this.local.key, length: this.local.length }]);
await core.close();
if (encCore) await encCore.close();
}
_bumpWakeupPeer(peer) {
if (this._coupler) this._coupler.update(peer.stream);
}
async _rotateLocalWriter(newLocal) {
assert2(!this.appending, "Cannot rotate a newLocal writer if an append is in progress");
const oldLocal = this.local;
if (this._applyState) await this._applyState.close();
this.local = newLocal;
this.local.on("append", this._onlocalwriterchangeBound);
this.localWriter = null;
this._updateLocalCore = null;
const store = this._viewStore.atomize();
const local = store.getLocal();
await local.ready();
await LocalState.moveTo(oldLocal, local);
await local.setUserData("referrer", this.key);
if (this.encryptionKey) {
if (this.blindEncryption) {
const encrypted = await encryptionEncoding.encrypt(
this.encryptionKey,
this.blindEncryption.encrypt
);
await local.setUserData("autobase/blind-encryption", encrypted);
} else {
await local.setUserData("autobase/encryption", this.encryptionKey);
}
}
await store.flush();
await store.close();
await this._primaryBootstrap.setUserData("autobase/local", local.key);
await this._clearWriters();
await oldLocal.close();
await this._viewStore.updateLocal();
await this._clearWriters();
this._applyState = new ApplyState(this);
await this._applyState.ready();
await this._makeLinearizerFromViewState();
this._caughtup = false;
this._rebooted();
this.emit("rotate-local-writer");
}
async setLocal(key, { keyPair } = {}) {
if (!this.opened) await this.ready();
const manifest = keyPair ? { version: this.store.manifestVersion, signers: [{ publicKey: keyPair.publicKey }] } : null;
if (!key) key = Hypercore.key(manifest);
if (b4a4.equals(key, this.local.key)) return;
const encryption = this.encryptionKey ? this.getWriterEncryption() : null;
const local = this.store.get({
key,
manifest,
active: false,
exclusive: true,
encryption,
valueEncoding: messages.OplogMessage
});
await local.ready();
this._updateLocalCore = local;
let runs = 0;
while (!this._interrupting && this.appending && runs++ < 16) await this.update();
await this._bump();
}
setWakeup(cap, discoveryKey) {
if (this.wakeupSession) this.wakeupSession.destroy();
if (!discoveryKey && b4a4.equals(cap, this.key)) discoveryKey = this.discoveryKey;
this.wakeupSession = this.wakeupProtocol.session(
cap,
new WakeupHandler(this, discoveryKey || null)
);
for (const peer of this.wakeupSession.peers) {
if (peer.active) this._bumpWakeupPeer(peer);
}
}
async _getMigrationPointer(key, length) {
const core = this.store.get({ key, active: false, encryption: null });
const encCore = await EncryptionView.setSystemEncryption(this, core);
const min = core.manifest && core.manifest.prologue ? core.manifest.prologue.length : 0;
for (let i = length - 1; i >= min; i--) {
if (!await core.has(i)) continue;
const sys = new SystemView(core, { checkout: i + 1 });
await sys.ready();
let good = true;
for (const v of sys.views) {
const vc = this.store.get({ key: v.key, active: false });
await vc.ready();
if (vc.length < v.length) good = false;
await vc.close();
}
await sys.close();
if (!good) continue;
return i + 1;
}
await core.close();
if (encCore) await encCore.close();
return min;
}
// migrating from 6 -> latest
async _migrate6(key, length) {
const core = this.store.get({ key, active: false });
await core.ready();
const batch = core.session({ name: "batch", overwrite: true, checkout: length });
await batch.ready();
await batch.close();
await core.close();
}
// called by view-store for bootstrapping
async _getSystemInfo() {
const boot2 = await this._getBootRecord();
if (!boot2.key) return null;
const migrated = !!boot2.heads;
const indexedLength = boot2.systemLength;
if (migrated) {
await this._migrate6(boot2.key, indexedLength);
}
const core = this.store.get({ key: boot2.key, encryption: null, active: false });
await core.ready();
const batch = core.session({ name: "batch" });
const encCore = await EncryptionView.setSystemEncryption(this, batch);
await batch.ready();
if (encCore) await encCore.ready();
const info = await SystemView.getIndexedInfo(batch, indexedLength);
if (encCore) await encCore.close();
await batch.close();
await core.close();
if (info.version > MAX_AUTOBASE_VERSION) {
throw new Error("Autobase upgrade required.");
}
if (migrated) {
this.migrated = true;
for (const view of info.views) {
await this._migrate6(view.key, view.length);
}
if (boot2.heads) this.hintWakeup(boot2.heads);
if (this.local.length) this.hintWakeup([{ key: this.local.key, length: this.local.length }]);
}
return {
key: boot2.key,
indexers: info.indexers,
views: info.views,
entropy: info.entropy
};
}
// called by the apply state for bootstrapping
async _getBootRecord() {
await this._preopen;
const pointer = await this.local.getUserData("autobase/boot");
const boot2 = pointer ? c4.decode(messages.BootRecord, pointer) : {
version: BOOT_RECORD_VERSION,
key: null,
systemLength: 0,
indexersUpdated: false,
fastForwarding: false,
recoveries: RECOVERIES,
heads: null
};
if (boot2.heads) {
const len = await this._getMigrationPointer(boot2.key, boot2.systemLength);
if (len !== boot2.systemLength)
this._warn(
new Error(
"Invalid pointer in migration, correcting (" + len + " vs " + boot2.systemLength + ")"
)
);
boot2.systemLength = len;
}
return boot2;
}
static async getBootRecord(store, key) {
const result = await boot(store, key, { exclusive: false });
await result.bootstrap.close();
await result.local.close();
return result.boot;
}
_interrupt(reason) {
assert2(!!this._applyState.applying, "Interrupt is only allowed in apply");
this._interrupting = true;
if (reason) this.interrupted = reason;
throw INTERRUPT;
}
async flush() {
if (this._flushing === 0) return;
return this._flushSignal.wait();
}
async advance() {
if (this.opened === false) await this.ready();
await this._advancing;
}
recouple() {
if (this._coupler) this._coupler.destroy();
const core = this._viewStore.getSystemCore();
this._coupler = new CoreCoupler(core, this._wakeupPeerBound);
}
_updateBootstrapWriters() {
const writers = this.linearizer.getBootstrapWriters();
for (const writer of this._bootstrapWriters) {
writer.isBootstrap = false;
writer.isCoupled = false;
}
for (const writer of writers) {
writer.isCoupled = true;
writer.setBootstrap(true);
}
for (const writer of this._bootstrapWriters) {
if (writer.isBootstrap === false) writer.setBootstrap(false);
}
this._bootstrapWriters = writers;
this._bootstrapWritersChanged = false;
}
async _openLinearizer() {
if (this._applyState.system.bootstrapping) {
await this._makeLinearizer(null);
this._bootstrapLinearizer();
return;
}
await this._makeLinearizerFromViewState();
}
async _catchupApplyState() {
if (await this._applyState.shouldMigrate()) {
await this._migrate();
} else if (!await this._applyState.catchup(this.linearizer)) {
return false;
}
this._caughtup = true;
return true;
}
async _open() {
this._preopen = this._runPreOpen();
await this._preopen;
if (this.closing) return;
this._applyState = new ApplyState(this);
try {
await this._applyState.ready();
} catch (err) {
if (this.closing) return;
try {
await this._applyState.close();
} catch {
}
try {
await this.core.ready();
} catch {
}
this._applyState = null;
if (this.closing) return;
throw err;
}
try {
await this._openLinearizer();
await this.core.ready();
await this._wakeup.ready();
} catch (err) {
if (this.closing) return;
throw err;
}
if (this.core.length - this._applyState.indexedLength > this._ackTickThreshold) {
this._ackTick = this._ackTickThreshold;
}
if (this.localWriter && this._ackInterval) {
this._startAckTimer();
}
this._updateBootstrapWriters();
this.recouple();
this._queueFastForward();
this._queueBump();
}
async _close() {
await this.flush();
this._interrupting = true;
await Promise.resolve();
if (this.wakeupSession) this.wakeupSession.destroy();
if (this.wakeupOwner) this.wakeupProtocol.destroy();
if (this.fastForwarding) await this.fastForwarding.close();
if (this._coupler) this._coupler.destroy();
this._coupler = null;
this._waiting.notify(null);
await this.activeWriters.clear();
const closing = this._advancing ? this._advancing.catch(safetyCatch) : null;
await this._clearWriters();
if (this._primaryBootstrap) await this._primaryBootstrap.close();
await this.local.close();
if (this._ackTimer) {
this._ackTimer.stop();
await this._ackTimer.flush();
}
await this._wakeup.close();
if (this._hasClose) await this._handlers.close(this.view);
if (this._applyState) await this._applyState.close();
await this._viewStore.close();
await this.core.close();
await this.store.close();
if (this._writable) this._writable.resolve(false);
await closing;
}
getLastError() {
return this._lastError;
}
_onError(err) {
if (this.closing) return;
this._lastError = err;
if (err === INTERRUPT) {
this.emit("interrupt", this.interrupted);
this.emit("update");
return;
}
this.close().catch(safetyCatch);
if (ReadyResource.listenerCount(this, "error") === 0) {
crashSoon(err);
return;
}
this.emit("error", err);
}
async _closeWriter(w) {
this.activeWriters.delete(w);
await w.close();
}
async _gcWriters() {
if (this._checkWriters.length === 0) return;
while (this._checkWriters.length > 0) {
const w = this._checkWriters.pop();
w.updateActivity();
if (!w.flushed()) continue;
const unqueued = this._wakeup.unqueue(w.core.key, w.core.length);
if (!unqueued || w.isActiveIndexer) continue;
if (this.localWriter === w) continue;
await this._closeWriter(w);
}
await this._wakeup.flush();
}
_startAckTimer() {
if (this._ackTimer) return;
this._ackTimer = new Timer(this._backgroundAck.bind(this), this._ackInterval);
this._bumpAckTimer();
}
_bumpAckTimer() {
if (!this._ackTimer) return;
this._ackTimer.bump();
}
async update() {
if (this.opened === false) await this.ready();
try {
await this._bump();
if (this._acking) await this._bump();
} catch (err) {
if (this._interrupting) return;
throw err;
}
}
// runs in bg, not allowed to throw
// TODO: refactor so this only moves the writer affected to a updated set
async _onremotewriterchange() {
this._bumpAckTimer();
try {
await this._bump();
} catch {
}
}
_onlocalwriterchange() {
if (!this.localWriter || this.localWriter.isRemoved) this._queueBump();
}
_onwakeup() {
this._needsWakeup = true;
this._queueBump();
}
isFastForwarding() {
if (this.fastForwardTo !== null) return true;
return this.fastForwardEnabled && this.fastForwarding !== null;
}
_backgroundAck() {
return this.ack(true);
}
async ack(bg = false) {
if (this.opened === false) await this.ready();
if (this.localWriter === null || this._acking || this._interrupting || this._appending !== null)
return;
if (this._applyState === null) {
try {
await this._bump();
} catch {
}
if (this._applyState === null || this._interrupting) return;
}
const applyState = this._applyState;
if (applyState.opened === false) await applyState.ready();
const isPendingIndexer = applyState.isLocalPendingIndexer();
if (!isPendingIndexer && this.isFastForwarding() || this._interrupting) return;
const isIndexer = applyState.isLocalIndexer() || isPendingIndexer;
if (!isIndexer) return;
this._acking = true;
try {
await this._bump();
} catch (err) {
if (!this._interrupting) throw err;
}
if (this._interrupting || !this.localWriter || this.localWriter.closed) {
this._acking = false;
return;
}
if (this._ackTimer && bg) await this._ackTimer.asapStandalone();
if (this._interrupting || applyState.closing) {
this._acking = false;
return;
}
const alwaysWrite = isPendingIndexer || await applyState.shouldWrite();
if (this._interrupting || applyState.closing) {
this._acking = false;
return;
}
const hasPendingIndexers = applyState.system.indexers.length > this.linearizer.indexers.length;
if (alwaysWrite || this.linearizer.shouldAck(this.localWriter, hasPendingIndexers)) {
try {
if (this.localWriter && !this.localWriter.closed) await this.append(null);
} catch (err) {
if (!this._interrupting) throw err;
}
}
if (!this._interrupting) {
this._updateAckThreshold();
this._bumpAckTimer();
}
this._acking = false;
}
views() {
if (this._applyState) return this._applyState.store.listViews();
return this._viewStore.listViews();
}
batch() {
return new AppendBatch(this);
}
async append(value, opts) {
if (this.opened === false) await this.ready();
if (this._advancing !== null) await this._advancing;
while (this.activeBatch) await this.activeBatch.flushed();
return this._appendBatch(value, opts);
}
async _appendBatch(value, opts) {
if (this._interrupting) throw new Error("Autobase is closing");
if (value && this.valueEncoding !== BINARY_ENCODING)
value = normalize(this.valueEncoding, value);
const optimistic = !!opts && !!opts.optimistic && !!value;
if (!optimistic && (this.localWriter === null || this.localWriter.isRemoved && value !== null)) {
throw new Error("Not writable");
}
if (this._appending === null) this._appending = [];
let len = 0;
if (Array.isArray(value)) {
for (const v of value) len = this._append(v);
} else {
len = this._append(value);
}
const localLength = this.local.length;
if (optimistic) this._optimistic = this._appending.length - 1;
const target = this._appended + this._appending.length;
if (this._advancing) await this._advancing;
let runs = 0;
while (this._appended < target && !this._interrupting) {
await this._bump();
if (runs++ >= 16 && this.localWriter && this.localWriter.idle()) break;
}
if (this._advancing) await this._advancing;
if (this._interrupting) throw new Error("Autobase is closing");
return localLength + len;
}
_append(value) {
if (this._appending.length > 0) {
if (value === null) return this._appending.length;
if (this._appending[this._appending.length - 1] === null) {
this._appending.pop();
}
}
return this._appending.push(value);
}
static decodeValue(value, opts) {
return decodeValue(value, opts);
}
static encodeValue(value, opts) {
return encodeValue(value, opts);
}
static async getLocalKey(store, opts = {}) {
const core = opts.keyPair ? store.get({ ...opts, active: false }) : store.get({ ...opts, name: "local", active: false });
await core.ready();
const key = core.key;
await core.close();
return key;
}
static getLocalCore(store, handlers, encryptionKey) {
const encryption = !encryptionKey ? null : { key: encryptionKey };
const opts = {
...handlers,
compat: false,
active: false,
exclusive: true,
valueEncoding: messages.OplogMessage,
encryption
};
return opts.keyPair ? store.get(opts) : store.get({ ...opts, name: "local" });
}
static async getUserData(core) {
const view = await core.getUserData("autobase/view");
return {
referrer: await core.getUserData("referrer"),
view: view ? b4a4.toString(view) : null
};
}
static async isAutobase(core, opts = {}) {
const block = await core.get(0, opts);
if (!block) throw new Error("Core is empty.");
if (!b4a4.isBuffer(block)) return isAutobaseMessage(block);
try {
const m = c4.decode(messages.OplogMessage, block);
return isAutobaseMessage(m);
} catch {
return false;
}
}
// no guarantees where the user data is stored, just that its associated with the base
async setUserData(key, val) {
await this._preopen;
const core = this._primaryBootstrap === null ? this.local : this._primaryBootstrap;
await core.setUserData(key, val);
}
async getUserData(key) {
await this._preopen;
const core = this._primaryBootstrap === null ? this.local : this._primaryBootstrap;
return await core.getUserData(key);
}
_needsLocalWriter() {
return this.localWriter === null || this.localWriter.closed;
}
// no guarantees about writer.isActiveIndexer property here
async _getWriterByKey(key, len, seen, allowGC, isAdded, system) {
assert2(this._draining === true || this.opening && !this.opened || this._optimistic > -1);
await this._lock.lock();
if (this._interrupting) {
this._lock.unlock();
throw new Error("Autobase is closing");
}
try {
let w = this.activeWriters.get(key);
const alreadyActive = !!w;
const sys = system || this._applyState.system;
const writerInfo = await sys.get(key);
if (len === -1) {
if (!allowGC && writerInfo === null) {
if (w) w.isRemoved = !isAdded;
return null;
}
len = writerInfo === null ? 0 : writerInfo.length;
}
const isActive = writerInfo !== null && (isAdded || !writerInfo.isRemoved);
const isRemoved = !isActive;
if (w) {
w.isRemoved = isRemoved;
} else {
w = this._makeWriter(key, len, isActive, isRemoved);
if (!w) return null;
}
if (isRemoved && sys.bootstrapping && b4a4.equals(w.core.key, this.key)) {
w.isRemoved = false;
}
if (this._isLocalCore(w.core) && this._needsLocalWriter()) {
this._setLocalWriter(w);
}
w.seen(seen);
if (alreadyActive) return w;
await w.ready();
if (this._isLocalCore(w.core) && this._needsLocalWriter()) {
this._setLocalWriter(w);
}
if (allowGC && w.flushed()) {
this._wakeup.unqueue(key, len);
if (w !== this.localWriter) {
await w.close();
return w;
}
}
this.activeWriters.add(w);
this._checkWriters.push(w);
assert2(w.opened);
assert2(!w.closed);
w.updateActivity();
return w;
} finally {
this._lock.unlock();
}
}
_updateAll() {
const p = [];
for (const w of this.activeWriters) p.push(w.update(null).catch(safetyCatch));
return Promise.all(p);
}
getWriterEncryption() {
if (!this.encryptionKey) return null;
return this.encryption.getWriterEncryption();
}
_makeWriterCore(key) {
if (this.closing) throw new Error("Autobase is closing");
if (this._interrupting) throw INTERRUPT();
const local = b4a4.equals(key, this.local.key);
const encryption = this.getWriterEncryption();
const core = local ? this.local.session({ valueEncoding: messages.OplogMessage, encryption, active: false }) : this.store.get({
key,
compat: false,
writable: false,
valueEncoding: messages.OplogMessage,
encryption,
active: false
});
return core;
}
_makeWriter(key, length, isActive, isRemoved) {
const core = this._makeWriterCore(key);
const w = new Writer(this, core, length, isRemoved);
if (this._isLocalCore(core)) {
if (isActive) this._setLocalWriter(w);
return w;
}
core.on("append", this._onremotewriterchangeBound);
core.on("download", this._onremotewriterchangeBound);
core.on("manifest", this._onremotewriterchangeBound);
return w;
}
_updateLinearizer(indexers, heads) {
for (const w of this.activeWriters) w.isActiveIndexer = false;
if (this.localWriter) this.localWriter.isActiveIndexer = false;
for (const writer of indexers) writer.isActiveIndexer = true;
if (this._isActiveIndexer() && !this.isIndexer) {
this._setLocalIndexer();
} else if (!this._isActiveIndexer() && this.isIndexer) {
this._clearLocalIndexer();
}
this.linearizer = new Linearizer(indexers, { heads, writers: this.activeWriters });
this._updateAckThreshold();
}
async _updateLocalWriter(sys) {
if (this.localWriter !== null && !this.localWriter.closed) return;
await this._getWriterByKey(this.local.key, -1, 0, true, false, sys);
}
async _bootstrapLinearizer() {
const bootstrap = this._makeWriter(this.key, 0, true, false);
this.activeWriters.add(bootstrap);
this._checkWriters.push(bootstrap);
await bootstrap.ready();
this._ensureWakeup(bootstrap);
this._updateLinearizer([bootstrap], []);
}
async _makeLinearizer(sys) {
if (sys === null) {
return this._bootstrapLinearizer();
}
if (this.opened || await sys.hasLocal(this.local.key)) {
await this._updateLocalWriter(sys);
}
const indexers = [];
for (const head of sys.indexers) {
const writer = await this._getWriterByKey(head.key, head.length, 0, false, false, sys);
indexers.push(writer);
}
if (!this._isActiveIndexer()) {
for (const key of sys.pendingIndexers) {
if (b4a4.equals(key, this.local.key)) {
this._setLocalIndexer();
break;
}
}
}
this._updateLinearizer(indexers, sys.heads);
for (const { key, length } of sys.heads) {
await this._getWriterByKey(key, length, 0, false, false, sys);
}
}
async _clearWriters() {
await this.activeWriters.clear();
if (this.localWriter !== null) await this.localWriter.close();
this._checkWriters = [];
}
async _moveTo() {
assert2(this._applyState.closed);
for (const ref of this._viewStore.byName.values()) {
if (!ref.moveTo) continue;
const [batch, next] = ref.moveTo;
ref.moveTo = null;
await ref.batch.state.moveTo(batch, batch.length);
await batch.close();
ref.migrated(this, next);
}
}
async _makeLinearizerFromViewState() {
const sys = await this._applyState.getIndexedSystem();
await this._makeLinearizer(sys);
await sys.close();
}
async _runForceFastForward() {
await this.core.ready();
if (this.closing) return;
const rec = this._applyState ? await this._applyState.recoverAt() : null;
await this._runFastForward(
new FastForward(this, this.core.key, { force: true, length: rec ? rec.length : 0 })
);
}
// general repair method for trying to recover
async repair() {
await this.forceFastForward();
}
async forceFastForward() {
if (this.isFastForwarding()) return;
await this._runForceFastForward();
await this.update();
}
async _applyFastForward() {
if (!this.fastForwardTo.force && this.fastForwardTo.length < this.core.length + this.fastForwardTo.minimum) {
this.fastForwardTo = null;
this._updateActivity();
return;
}
const changes = this._hasUpdate ? new UpdateChanges(this) : null;
if (changes) changes.track(this._applyState);
if (this._applyState) await this._applyState.close();
const { key, length, views, indexers, manifestVersion, entropy } = this.fastForwardTo;
const from = this.core.signedLength;
const ffed = /* @__PURE__ */ new Set();
this._flushing++;
try {
const store = this._viewStore.atomize();
const systemRef = await this._viewStore.findViewByKey(key, indexers, manifestVersion, entropy);
const migrated = !b4a4.equals(key, systemRef.core.key);
ffed.add(systemRef);
if (migrated) {
await this._applyFastForwardMigration(systemRef, { key, length });
} else {
await systemRef.catchup(store.atom, length);
}
for (const v of views) {
const ref = await this._viewStore.findViewByKey(v.key, indexers, manifestVersion, entropy);
if (!ref) continue;
const migrated2 = !b4a4.equals(ref.core.key, v.key);
ffed.add(ref);
if (migrated2) {
await this._applyFastForwardMigration(ref, v);
} else {
await ref.catchup(store.atom, v.length);
}
}
if (ffed.size !== store.getViewCount()) {
for (const ref of store.getViews()) {
if (ffed.has(ref)) continue;
await ref.catchup(store.atom, 0);
}
}
if (migrated) {
const manifests = await this._viewStore.getIndexerManifests(indexers);
for (const [name, ref] of this._viewStore.byName) {
if (ffed.has(ref)) continue;
await this._migrateView(manifests, null, name, 0, manifestVersion, entropy, [], null);
}
}
const value = c4.encode(messages.BootRecord, {
version: BOOT_RECORD_VERSION,
key,
systemLength: length,
indexersUpdated: false,
fastForwarding: true,
recoveries: RECOVERIES
});
const local = store.getLocal();
await local.ready();
await local.setUserData("autobase/boot", value);
await LocalState.clear(local);
await store.flush();
await store.close();
} finally {
if (--this._flushing === 0) this._flushSignal.notify();
}
for (const ref of this._viewStore.byName.values()) await ref.release();
this.recoveries = RECOVERIES;
this.fastForwardTo = null;
this._queueFastForward();
await this._clearWriters();
await this._moveTo();
const to = this.core.signedLength;
if (changes) changes.finalise();
this._applyState = new ApplyState(this);
await this._applyState.ready();
if (changes) await this._handlers.update(this._applyState.view, changes);
if (await this._applyState.shouldMigrate()) {
await this._migrate();
} else {
await this._makeLinearizerFromViewState();
await this._applyState.catchup(this.linearizer);
}
if (!this.localWriter || this.localWriter.closed) {
await this._updateLocalWriter(this._applyState.system);
}
this._caughtup = true;
this._rebooted();
this.emit("fast-forward", to, from);
}
// TODO: not atomic in regards to the ff, fix that
async _applyFastForwardMigration(ref, v) {
await ref.batch.ready();
const next = this.store.get(v.key);
await next.ready();
const prologue = next.manifest && next.manifest.prologue;
if (prologue && prologue.length > 0 && ref.core.length >= prologue.length) {
try {
await next.core.copyPrologue(ref.core.state);
} catch {
}
}
const batch = next.session({ name: "batch", overwrite: true, checkout: v.length });
await batch.ready();
ref.moveTo = [batch, next];
}
async _migrateView(indexerManifests, source, name, indexedLength, manifestVersion, entropy, linked, manifestData) {
const ref = this._viewStore.byName.get(name);
await ref.batch.ready();
const prologue = indexedLength === 0 ? null : { length: indexedLength, hash: await source.treeHash(indexedLength) };
if (manifestData === null && ref.core.manifest.userData !== null) {
manifestData = ref.core.manifest.userData;
}
const next = this._viewStore.getViewCore(
indexerManifests,
name,
prologue,
manifestVersion,
entropy,
linked,
manifestData
);
await next.ready();
if (indexedLength > 0) {
await next.core.copyPrologue(source.state);
}
const batch = next.session({ name: "batch", overwrite: true, checkout: indexedLength });
await batch.ready();
if (source !== null) {
while (batch.length < source.length) {
await batch.append(await source.get(batch.length));
}
}
ref.moveTo = [batch, next];
return ref;
}
async _premigrate() {
this._flushing++;
try {
const length = this._applyState.indexedLength;
const system = this._applyState.system;
const info = await system.getIndexedInfo(length);
const indexerManifests = await this._viewStore.getIndexerManifests(info.indexers);
const { views, systemView, encryptionView } = this._applyState;
const manifestVersion = this._applyState.system.core.manifest.version;
for (const view of views) {
const v = this._applyState.getViewFromSystem(view, info);
const indexedLength = v ? v.length : 0;
const ref2 = this._viewStore.getViewByName(view.name);
const source2 = ref2.getCore();
await source2.ready();
await this._migrateView(
indexerManifests,
source2,
view.name,
indexedLength,
manifestVersion,
info.entropy,
null,
null
);
}
const source = encryptionView.ref.getCore();
await source.ready();
const enc = await this._migrateView(
indexerManifests,
source,
"_encryption",
info.encryptionLength,
manifestVersion,
info.entropy,
null,
null
);
const linked = [enc.core.key];
const sysCore = systemView.ref.getCore();
const ref = await this._migrateView(
indexerManifests,
sysCore,
"_system",
length,
manifestVersion,
info.entropy,
linked,
null,
null
);
const sysKey = ref.getNextKey();
if (sysKey === null) {
throw new Error("Migration failed, expected core to be moved");
}
return sysKey;
} finally {
if (--this._flushing === 0) this._flushSignal.notify();
}
}
async _migrate() {
return this._reboot(await this._premigrate());
}
async _reboot(key) {
await this._clearWriters();
await this._makeLinearizerFromViewState();
await this._applyState.finalize(key);
await this._moveTo();
this._applyState = new ApplyState(this);
await this._applyState.ready();
await this._applyState.catchup(this.linearizer);
this._queueFastForward();
this._rebooted();
}
_rebooted() {
this.recouple();
this._updateActivity();
this.emit("reboot");
this._bootstrapWritersChanged = true;
this._needsWakeup = true;
this.updating = true;
this._queueBump();
}
_setLocalWriter(w) {
this.localWriter = w;
if (this._ackInterval) this._startAckTimer();
}
_unsetLocalWriter() {
if (!this.localWriter) return;
this._closeWriter(this.localWriter);
if (this.localWriter.isActiveIndexer) this._clearLocalIndexer();
this.localWriter = null;
}
_setLocalIndexer() {
assert2(this.localWriter !== null);
this.isIndexer = true;
this.emit("is-indexer");
}
_clearLocalIndexer() {
assert2(this.localWriter !== null);
if (this._ackTimer) this._ackTimer.stop();
this.isIndexer = false;
this._ackTimer = null;
this.emit("is-non-indexer");
}
_isLocalCore(core) {
return core.writable && core.id === this.local.id;
}
_addLocalHeads() {
if (!this.localWriter || this.localWriter.closed) return null;
if (!this.localWriter.idle()) return null;
const length = this._optimistic === -1 ? this._appending.length : this._optimistic || 1;
const nodes = new Array(length);
for (let i = 0; i < length; i++) {
const heads = this.linearizer.getHeads();
const deps = new Set(this.linearizer.heads);
const batch = length - i;
const value = this._appending[i];
const node = this.localWriter.append(value, heads, batch, deps, this._optimistic === 0);
this.linearizer.addHead(node);
nodes[i] = node;
}
return nodes;
}
_flushLocalHeads(length) {
this._appending = length === this._appending.length ? null : this._appending.slice(length);
this._appended += length;
if (this._optimistic > -1 && this._optimistic < length) this._optimistic = -1;
}
async _addRemoteHeads() {
let added = 0;
while (added < REMOTE_ADD_BATCH || this.bigBatches && !this._indexersIdle() && added < REMOTE_ADD_BATCH_SANITY) {
await this._updateAll();
let advanced = 0;
for (const w of this.activeWriters) {
let node = w.advance();
if (node === null) continue;
advanced += node.batch;
while (true) {
this.linearizer.addHead(node);
if (node.batch === 1) break;
node = w.advance();
}
}
if (advanced === 0) {
if (this.bigBatches && !this._indexersIdle() && await this._waitForIndexers()) continue;
break;
}
added += advanced;
}
return added;
}
async _waitForIndexers() {
const promises = [];
for (const w of this.linearizer.indexers) {
if (w.idle()) continue;
if (await w.core.has(w.length)) continue;
promises.push(w.core.get(w.length, { timeout: 3e3 }));
}
for (const result of await Promise.allSettled(promises)) {
if (result.status !== "rejected") return true;
}
return false;
}
_indexersIdle() {
for (const w of this.linearizer.indexers) {
if (!w.idle()) return false;
}
return true;
}
async _drain() {
const writable = this.writable;
while (!this._interrupting && !this.paused) {
if (this.local.recovering) {
try {
await this.local.recover();
} catch {
await this._runForceFastForward();
}
continue;
}
if (this.fastForwardTo !== null) {
await this._applyFastForward();
continue;
}
if (this._caughtup === false) {
if (!await this._catchupApplyState()) {
await this._runForceFastForward();
}
continue;
}
const remoteAdded = await this._addRemoteHeads();
const localNodes = this._appending !== null ? this._addLocalHeads() : null;
if (this._interrupting) return;
if (remoteAdded > 0 || localNodes !== null) {
this.updating = true;
}
const u = this.linearizer.update();
const update = u ? await this._applyState.update(u, localNodes) : { reboot: false, migrated: false };
if (localNodes) this._flushLocalHeads(localNodes.length);
if (!update.reboot) {
if (this._applyState.shouldFlush()) {
await this._applyState.flush();
this.updating = true;
}
if (this._checkWriters.length > 0) {
await this._gcWriters();
continue;
}
if (remoteAdded >= REMOTE_ADD_BATCH) continue;
break;
}
await this._gcWriters();
await this._reboot(this._applyState.key);
}
if (writable !== this.writable) {
if (this.writable && this._writable) this._writable.resolve(true);
this.emit(writable ? "unwritable" : "writable");
}
}
_wakeupPeer(stream) {
if (!this.wakeupSession) return;
const wakeup = this._getWakeup();
if (wakeup.length === 0) return;
this.wakeupSession.announceByStream(stream, wakeup);
}
_getWakeup() {
const writers = [];
for (const w of this.activeWriters) {
if (w.isActiveIndexer || w.flushed()) continue;
writers.push({ key: w.core.key, length: w.length });
}
return writers;
}
async _wakeupWriter(key, length) {
this._ensureWakeup(await this._getWriterByKey(key, -1, length, true, false, null));
}
// ensure wakeup on an existing writer (the writer calls this in addition to above)
_ensureWakeup(w) {
if (w === null || w.isBootstrap === true) return;
w.setBootstrap(true);
this._bootstrapWriters.push(w);
this._bootstrapWritersChanged = true;
}
async _drainWakeup() {
const promises = [];
if (this._needsWakeup) {
for (const { key, length } of this._wakeup) {
const w = this.activeWriters.get(key);
if (w) {
if (w.length < length) w.seen(length);
continue;
}
promises.push(this._applyState.system.get(key));
}
if (this._needsWakeupHeads) {
for (const { key } of await this._applyState.system.heads) {
if (this.activeWriters.has(key)) continue;
promises.push(this._applyState.system.get(key));
}
}
}
for (const [hex, length] of this._wakeupHints) {
const key = b4a4.from(hex, "hex");
if (length !== -1) {
const w = this.activeWriters.get(key);
if (w) {
if (w.length < length) w.seen(length);
continue;
}
}
promises.push(this._applyState.system.get(key));
}
await Promise.allSettled(promises);
if (this._needsWakeup === true) {
this._needsWakeup = false;
for (const { key, length } of this._wakeup) {
if (this.activeWriters.has(key)) continue;
await this._wakeupWriter(key, length);
}
if (this._needsWakeupHeads === true) {
this._needsWakeupHeads = false;
for (const { key } of await this._applyState.system.heads) {
if (this.activeWriters.has(key)) continue;
await this._wakeupWriter(key, 0);
}
}
}
for (const [hex, length] of this._wakeupHints) {
const key = b4a4.from(hex, "hex");
if (this.activeWriters.has(key)) continue;
if (length !== -1) {
const info = await this._applyState.system.get(key);
if (info && length <= info.length) continue;
}
await this._wakeupWriter(key, length === -1 ? 0 : length);
}
this._wakeupHints.clear();
}
pause() {
this.paused = true;
}
resume() {
this.paused = false;
this._queueBump();
}
waitForWritable() {
if (this.writable) return Promise.resolve(true);
if (!this._writable) this._writable = rrp();
return this._writable.promise;
}
async _drainWithInterupt() {
while (true) {
try {
await this._drain();
return;
} catch (err) {
if (this.closing || !this.fastForwardTo) throw err;
if (Date.now() - this.fastForwardFailedAt < MIN_FF_WAIT) throw err;
this.fastForwardFailedAt = Date.now();
}
}
}
async _advance() {
if (this.opened === false) await this.ready();
if (this.paused || this._interrupting) return;
this._draining = true;
if (this._updateLocalCore !== null) {
await this._rotateLocalWriter(this._updateLocalCore);
}
const local = this.local.length;
try {
await this._drainWithInterupt();
if (this._caughtup && (this._needsWakeup === true || this._wakeupHints.size > 0))
await this._drainWakeup();
if (!this.localWriter || this.localWriter.closed) {
await this._updateLocalWriter(this._applyState.system);
}
this._draining = false;
} catch (err) {
this._onError(err);
return;
}
if (this._interrupting) return;
if (this.localWriter && !this.localWriter.closed) {
if (this._applyState.isLocalPendingIndexer()) this.ack().catch(noop);
else if (this._triggerAckAsap()) this._ackTimer.asap();
}
if (this.updating === true || this._bootstrapWritersChanged === true) {
this._updateBootstrapWriters();
}
if (this.updating === true) {
this.updating = false;
if (local !== this.local.length) this._resetAckTick();
else this._ackTick++;
if (!this._interrupting) this.emit("update");
this._waiting.notify(null);
}
if (!this._interrupting) await this._gcWriters();
}
_triggerAckAsap() {
if (!this._ackTimer) return false;
if (this._ackTickThreshold && !this._acking && this._ackTick >= this._ackTickThreshold) {
if (this._ackTimer) {
for (const w of this.linearizer.indexers) {
if (w.core.length > w.length) return false;
}
}
return true;
}
return false;
}
_queueFastForward() {
if (!this.core.opened) return;
const latestSignedLength = this.core.core.state.length;
if (!this.fastForwardEnabled || this.fastForwarding !== null || this._interrupting) return;
if (latestSignedLength - this.core.length < this.fastForwardMinimum) return;
if (this.fastForwardTo !== null) return;
if (Date.now() - this.fastForwardFailedAt < MIN_FF_WAIT) return;
this._runFastForward(
new FastForward(this, this.core.key, { minimum: this.fastForwardMinimum })
).catch(noop);
}
_queueStaticFastForward(key) {
if (!this.fastForwardEnabled || this.fastForwarding !== null || this._interrupting) return;
if (this.fastForwardTo !== null) return;
if (Date.now() - this.fastForwardFailedAt < MIN_FF_WAIT) return;
this._runFastForward(new FastForward(this, key, { verified: false })).catch(noop);
}
_updateActivity() {
this.activeWriters.updateActivity();
if (this._applyState) {
if (this.isFastForwarding()) this._applyState.pause();
else this._applyState.resume();
}
if (this._needsWakeupRequest && !this.isFastForwarding() && this.wakeupSession) {
this._needsWakeupRequest = false;
this.wakeupSession.broadcastLookup({});
}
}
_preferFastForward() {
this.fastForwardMinimum = 1;
this._queueFastForward();
}
_postApply() {
this.fastForwardMinimum = FastForward.MINIMUM;
}
async _runFastForward(ff) {
this.fastForwarding = ff;
this._updateActivity();
const result = await ff.upgrade();
await ff.close();
if (this.fastForwarding === ff) this.fastForwarding = null;
if (!result) {
if (ff.failed) this.fastForwardFailedAt = Date.now();
else this._queueFastForward();
this._updateActivity();
return;
}
this.fastForwardFailedAt = 0;
this.fastForwardTo = result;
if (this._applyState && this._applyState.applying && this.fastForwardMinimum === 1) {
await this._applyState.close();
}
this._bumpAckTimer();
this._queueBump();
}
// triggered from apply
async _addWriter(key, sys) {
assert2(!!this._applyState.applying, "System changes are only allowed in apply");
const writer = await this._getWriterByKey(key, -1, 0, false, true, sys) || this._makeWriter(key, 0, true, false);
await writer.ready();
if (!this.activeWriters.has(key)) {
this.activeWriters.add(writer);
this._checkWriters.push(writer);
this._ensureWakeup(writer);
}
this._queueBump();
}
// triggered from apply
_removeWriter(key) {
const w = this.activeWriters.get(key);
if (w) w.isRemoved = true;
this._queueBump();
}
removeable(key) {
return this._applyState ? this._applyState.removeable(key) : false;
}
_updateAckThreshold() {
if (this._ackThreshold === 0) return;
if (this._ackTimer) this._ackTimer.bau();
this._ackTick = 0;
this._ackTickThreshold = random2over1(this.linearizer.indexers.length * this._ackThreshold);
}
_resetAckTick() {
this._ackTick = 0;
if (this._ackTimer) this._ackTimer.bau();
}
_shiftWriter(w) {
w.shift();
if (w.flushed()) this._checkWriters.push(w);
}
};
function toKey(k) {
return b4a4.isBuffer(k) ? k : hypercoreId.decode(k);
}
function isAutobaseMessage(msg) {
return msg.checkpoint ? msg.checkpoint.length > 0 : msg.checkpoint === null;
}
function compareNodes(a, b) {
return b4a4.compare(a.key, b.key);
}
function random2over1(n) {
return Math.floor(n + Math.random() * n);
}
function noop() {
}
function crashSoon(err) {
queueMicrotask(() => {
throw err;
});
throw err;
}
function isObject2(obj) {
return typeof obj === "object" && obj !== null;
}
function emitWarning(err) {
safetyCatch(err);
this.emit("warning", err);
}
function normalize(valueEncoding, value) {
const state = { buffer: null, start: 0, end: 0 };
valueEncoding.preencode(state, value);
state.buffer = b4a4.allocUnsafe(state.end);
valueEncoding.encode(state, value);
state.start = 0;
return valueEncoding.decode(state);
}
}
});
// node_modules/hyperdispatch/node_modules/compact-encoding/endian.js
var require_endian2 = __commonJS({
"node_modules/hyperdispatch/node_modules/compact-encoding/endian.js"(exports2) {
var LE = exports2.LE = new Uint8Array(new Uint16Array([255]).buffer)[0] === 255;
exports2.BE = !LE;
}
});
// node_modules/hyperdispatch/node_modules/compact-encoding/raw.js
var require_raw2 = __commonJS({
"node_modules/hyperdispatch/node_modules/compact-encoding/raw.js"(exports2, module2) {
var b4a4 = require_b4a();
var { BE } = require_endian2();
exports2 = module2.exports = {
preencode(state, b) {
state.end += b.byteLength;
},
encode(state, b) {
state.buffer.set(b, state.start);
state.start += b.byteLength;
},
decode(state) {
const b = state.buffer.subarray(state.start, state.end);
state.start = state.end;
return b;
}
};
var buffer = exports2.buffer = {
preencode(state, b) {
uint8array.preencode(state, b);
},
encode(state, b) {
uint8array.encode(state, b);
},
decode(state) {
const b = state.buffer.subarray(state.start);
state.start = state.end;
return b;
}
};
exports2.binary = {
...buffer,
preencode(state, b) {
if (typeof b === "string") utf8.preencode(state, b);
else buffer.preencode(state, b);
},
encode(state, b) {
if (typeof b === "string") utf8.encode(state, b);
else buffer.encode(state, b);
}
};
exports2.arraybuffer = {
preencode(state, b) {
state.end += b.byteLength;
},
encode(state, b) {
const view = new Uint8Array(b);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
const b = new ArrayBuffer(state.end - state.start);
const view = new Uint8Array(b);
view.set(state.buffer.subarray(state.start));
state.start = state.end;
return b;
}
};
function typedarray(TypedArray, swap) {
const n = TypedArray.BYTES_PER_ELEMENT;
return {
preencode(state, b) {
state.end += b.byteLength;
},
encode(state, b) {
const view = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
if (BE && swap) swap(view);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
let b = state.buffer.subarray(state.start);
if (b.byteOffset % n !== 0) b = new Uint8Array(b);
if (BE && swap) swap(b);
state.start = state.end;
return new TypedArray(b.buffer, b.byteOffset, b.byteLength / n);
}
};
}
var uint8array = exports2.uint8array = typedarray(Uint8Array);
exports2.uint16array = typedarray(Uint16Array, b4a4.swap16);
exports2.uint32array = typedarray(Uint32Array, b4a4.swap32);
exports2.int8array = typedarray(Int8Array);
exports2.int16array = typedarray(Int16Array, b4a4.swap16);
exports2.int32array = typedarray(Int32Array, b4a4.swap32);
exports2.biguint64array = typedarray(BigUint64Array, b4a4.swap64);
exports2.bigint64array = typedarray(BigInt64Array, b4a4.swap64);
exports2.float32array = typedarray(Float32Array, b4a4.swap32);
exports2.float64array = typedarray(Float64Array, b4a4.swap64);
function string(encoding) {
return {
preencode(state, s) {
state.end += b4a4.byteLength(s, encoding);
},
encode(state, s) {
state.start += b4a4.write(state.buffer, s, state.start, encoding);
},
decode(state) {
const s = b4a4.toString(state.buffer, encoding, state.start);
state.start = state.end;
return s;
}
};
}
var utf8 = exports2.string = exports2.utf8 = string("utf-8");
exports2.ascii = string("ascii");
exports2.hex = string("hex");
exports2.base64 = string("base64");
exports2.ucs2 = exports2.utf16le = string("utf16le");
exports2.array = function array(enc) {
return {
preencode(state, list) {
for (const value of list) enc.preencode(state, value);
},
encode(state, list) {
for (const value of list) enc.encode(state, value);
},
decode(state) {
const arr = [];
while (state.start < state.end) arr.push(enc.decode(state));
return arr;
}
};
};
exports2.json = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v));
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v));
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
exports2.ndjson = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v) + "\n");
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v) + "\n");
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
}
});
// node_modules/hyperdispatch/node_modules/compact-encoding/lexint.js
var require_lexint2 = __commonJS({
"node_modules/hyperdispatch/node_modules/compact-encoding/lexint.js"(exports2, module2) {
module2.exports = {
preencode,
encode: encode2,
decode: decode2
};
function preencode(state, num) {
if (num < 251) {
state.end++;
} else if (num < 256) {
state.end += 2;
} else if (num < 65536) {
state.end += 3;
} else if (num < 16777216) {
state.end += 4;
} else if (num < 4294967296) {
state.end += 5;
} else {
state.end++;
const exp = Math.floor(Math.log(num) / Math.log(2)) - 32;
preencode(state, exp);
state.end += 6;
}
}
function encode2(state, num) {
const max = 251;
const x = num - max;
if (num < max) {
state.buffer[state.start++] = num;
} else if (num < 256) {
state.buffer[state.start++] = max;
state.buffer[state.start++] = x;
} else if (num < 65536) {
state.buffer[state.start++] = max + 1;
state.buffer[state.start++] = x >> 8 & 255;
state.buffer[state.start++] = x & 255;
} else if (num < 16777216) {
state.buffer[state.start++] = max + 2;
state.buffer[state.start++] = x >> 16;
state.buffer[state.start++] = x >> 8 & 255;
state.buffer[state.start++] = x & 255;
} else if (num < 4294967296) {
state.buffer[state.start++] = max + 3;
state.buffer[state.start++] = x >> 24;
state.buffer[state.start++] = x >> 16 & 255;
state.buffer[state.start++] = x >> 8 & 255;
state.buffer[state.start++] = x & 255;
} else {
const exp = Math.floor(Math.log(x) / Math.log(2)) - 32;
state.buffer[state.start++] = 255;
encode2(state, exp);
const rem = x / Math.pow(2, exp - 11);
for (let i = 5; i >= 0; i--) {
state.buffer[state.start++] = rem / Math.pow(2, 8 * i) & 255;
}
}
}
function decode2(state) {
const max = 251;
if (state.end - state.start < 1) throw new Error("Out of bounds");
const flag = state.buffer[state.start++];
if (flag < max) return flag;
if (state.end - state.start < flag - max + 1) {
throw new Error("Out of bounds.");
}
if (flag < 252) {
return state.buffer[state.start++] + max;
}
if (flag < 253) {
return (state.buffer[state.start++] << 8) + state.buffer[state.start++] + max;
}
if (flag < 254) {
return (state.buffer[state.start++] << 16) + (state.buffer[state.start++] << 8) + state.buffer[state.start++] + max;
}
if (flag < 255) {
return state.buffer[state.start++] * 16777216 + (state.buffer[state.start++] << 16) + (state.buffer[state.start++] << 8) + state.buffer[state.start++] + max;
}
const exp = decode2(state);
if (state.end - state.start < 6) throw new Error("Out of bounds");
let rem = 0;
for (let i = 5; i >= 0; i--) {
rem += state.buffer[state.start++] * Math.pow(2, 8 * i);
}
return rem * Math.pow(2, exp - 11) + max;
}
}
});
// node_modules/hyperdispatch/node_modules/compact-encoding/index.js
var require_compact_encoding2 = __commonJS({
"node_modules/hyperdispatch/node_modules/compact-encoding/index.js"(exports2) {
var b4a4 = require_b4a();
var { BE } = require_endian2();
exports2.state = function(start = 0, end = 0, buffer2 = null) {
return { start, end, buffer: buffer2 };
};
var raw = exports2.raw = require_raw2();
var uint = exports2.uint = {
preencode(state, n) {
state.end += n <= 252 ? 1 : n <= 65535 ? 3 : n <= 4294967295 ? 5 : 9;
},
encode(state, n) {
if (n <= 252) uint8.encode(state, n);
else if (n <= 65535) {
state.buffer[state.start++] = 253;
uint16.encode(state, n);
} else if (n <= 4294967295) {
state.buffer[state.start++] = 254;
uint32.encode(state, n);
} else {
state.buffer[state.start++] = 255;
uint64.encode(state, n);
}
},
decode(state) {
const a = uint8.decode(state);
if (a <= 252) return a;
if (a === 253) return uint16.decode(state);
if (a === 254) return uint32.decode(state);
return uint64.decode(state);
}
};
var uint8 = exports2.uint8 = {
preencode(state, n) {
state.end += 1;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
},
decode(state) {
if (state.start >= state.end) throw new Error("Out of bounds");
return state.buffer[state.start++];
}
};
var uint16 = exports2.uint16 = {
preencode(state, n) {
state.end += 2;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
state.buffer[state.start++] = n >>> 8;
},
decode(state) {
if (state.end - state.start < 2) throw new Error("Out of bounds");
return state.buffer[state.start++] + state.buffer[state.start++] * 256;
}
};
var uint24 = exports2.uint24 = {
preencode(state, n) {
state.end += 3;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n >>> 16;
},
decode(state) {
if (state.end - state.start < 3) throw new Error("Out of bounds");
return state.buffer[state.start++] + state.buffer[state.start++] * 256 + state.buffer[state.start++] * 65536;
}
};
var uint32 = exports2.uint32 = {
preencode(state, n) {
state.end += 4;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n >>> 16;
state.buffer[state.start++] = n >>> 24;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
return state.buffer[state.start++] + state.buffer[state.start++] * 256 + state.buffer[state.start++] * 65536 + state.buffer[state.start++] * 16777216;
}
};
var uint32be = exports2.uint32be = {
preencode(state, n) {
state.end += 4;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n >>> 24;
state.buffer[state.start++] = n >>> 16;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
return state.buffer[state.start++] * 16777216 + state.buffer[state.start++] * 65536 + state.buffer[state.start++] * 256 + state.buffer[state.start++];
}
};
var uint40 = exports2.uint40 = {
preencode(state, n) {
state.end += 5;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 256);
uint8.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 5) throw new Error("Out of bounds");
return uint8.decode(state) + 256 * uint32.decode(state);
}
};
var uint48 = exports2.uint48 = {
preencode(state, n) {
state.end += 6;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 65536);
uint16.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 6) throw new Error("Out of bounds");
return uint16.decode(state) + 65536 * uint32.decode(state);
}
};
var uint56 = exports2.uint56 = {
preencode(state, n) {
state.end += 7;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 16777216);
uint24.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 7) throw new Error("Out of bounds");
return uint24.decode(state) + 16777216 * uint32.decode(state);
}
};
var uint64 = exports2.uint64 = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 4294967296);
uint32.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
return uint32.decode(state) + 4294967296 * uint32.decode(state);
}
};
exports2.uint64be = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 4294967296);
uint32be.encode(state, r);
uint32be.encode(state, n);
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
return 4294967296 * uint32be.decode(state) + uint32be.decode(state);
}
};
var int = exports2.int = zigZagInt(uint);
exports2.int8 = zigZagInt(uint8);
exports2.int16 = zigZagInt(uint16);
exports2.int24 = zigZagInt(uint24);
exports2.int32 = zigZagInt(uint32);
exports2.int40 = zigZagInt(uint40);
exports2.int48 = zigZagInt(uint48);
exports2.int56 = zigZagInt(uint56);
exports2.int64 = zigZagInt(uint64);
var biguint64 = exports2.biguint64 = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
view.setBigUint64(0, n, true);
state.start += 8;
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
const n = view.getBigUint64(0, true);
state.start += 8;
return n;
}
};
exports2.bigint64 = zigZagBigInt(biguint64);
var biguint = exports2.biguint = {
preencode(state, n) {
let len = 0;
for (let m = n; m; m = m >> 64n) len++;
uint.preencode(state, len);
state.end += 8 * len;
},
encode(state, n) {
let len = 0;
for (let m = n; m; m = m >> 64n) len++;
uint.encode(state, len);
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8 * len
);
for (let m = n, i = 0; m; m = m >> 64n, i += 8) {
view.setBigUint64(i, BigInt.asUintN(64, m), true);
}
state.start += 8 * len;
},
decode(state) {
const len = uint.decode(state);
if (state.end - state.start < 8 * len) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8 * len
);
let n = 0n;
for (let i = len - 1; i >= 0; i--)
n = (n << 64n) + view.getBigUint64(i * 8, true);
state.start += 8 * len;
return n;
}
};
exports2.bigint = zigZagBigInt(biguint);
exports2.lexint = require_lexint2();
exports2.float32 = {
preencode(state, n) {
state.end += 4;
},
encode(state, n) {
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
4
);
view.setFloat32(0, n, true);
state.start += 4;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
4
);
const float = view.getFloat32(0, true);
state.start += 4;
return float;
}
};
exports2.float64 = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
view.setFloat64(0, n, true);
state.start += 8;
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
const float = view.getFloat64(0, true);
state.start += 8;
return float;
}
};
var buffer = exports2.buffer = {
preencode(state, b) {
uint8array.preencode(state, b);
},
encode(state, b) {
uint8array.encode(state, b);
},
decode(state) {
const len = uint.decode(state);
if (state.end - state.start < len) throw new Error("Out of bounds");
return state.buffer.subarray(state.start, state.start += len);
}
};
exports2.optionalBuffer = {
preencode(state, b) {
if (b) uint8array.preencode(state, b);
else state.end++;
},
encode(state, b) {
if (b) uint8array.encode(state, b);
else state.buffer[state.start++] = 0;
},
decode(state) {
const len = uint.decode(state);
if (len === 0) return null;
if (state.end - state.start < len) throw new Error("Out of bounds");
return state.buffer.subarray(state.start, state.start += len);
}
};
exports2.binary = {
...buffer,
preencode(state, b) {
if (typeof b === "string") utf8.preencode(state, b);
else buffer.preencode(state, b);
},
encode(state, b) {
if (typeof b === "string") utf8.encode(state, b);
else buffer.encode(state, b);
}
};
exports2.arraybuffer = {
preencode(state, b) {
uint.preencode(state, b.byteLength);
state.end += b.byteLength;
},
encode(state, b) {
uint.encode(state, b.byteLength);
const view = new Uint8Array(b);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
const len = uint.decode(state);
const b = new ArrayBuffer(len);
const view = new Uint8Array(b);
view.set(state.buffer.subarray(state.start, state.start += len));
return b;
}
};
function typedarray(TypedArray, swap) {
const n = TypedArray.BYTES_PER_ELEMENT;
return {
preencode(state, b) {
uint.preencode(state, b.length);
state.end += b.byteLength;
},
encode(state, b) {
uint.encode(state, b.length);
const view = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
if (BE && swap) swap(view);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
const len = uint.decode(state);
let b = state.buffer.subarray(state.start, state.start += len * n);
if (b.byteLength !== len * n) throw new Error("Out of bounds");
if (b.byteOffset % n !== 0) b = new Uint8Array(b);
if (BE && swap) swap(b);
return new TypedArray(b.buffer, b.byteOffset, b.byteLength / n);
}
};
}
var uint8array = exports2.uint8array = typedarray(Uint8Array);
exports2.uint16array = typedarray(Uint16Array, b4a4.swap16);
exports2.uint32array = typedarray(Uint32Array, b4a4.swap32);
exports2.int8array = typedarray(Int8Array);
exports2.int16array = typedarray(Int16Array, b4a4.swap16);
exports2.int32array = typedarray(Int32Array, b4a4.swap32);
exports2.biguint64array = typedarray(BigUint64Array, b4a4.swap64);
exports2.bigint64array = typedarray(BigInt64Array, b4a4.swap64);
exports2.float32array = typedarray(Float32Array, b4a4.swap32);
exports2.float64array = typedarray(Float64Array, b4a4.swap64);
function string(encoding) {
return {
preencode(state, s) {
const len = b4a4.byteLength(s, encoding);
uint.preencode(state, len);
state.end += len;
},
encode(state, s) {
const len = b4a4.byteLength(s, encoding);
uint.encode(state, len);
b4a4.write(state.buffer, s, state.start, encoding);
state.start += len;
},
decode(state) {
const len = uint.decode(state);
if (state.end - state.start < len) throw new Error("Out of bounds");
return b4a4.toString(
state.buffer,
encoding,
state.start,
state.start += len
);
},
fixed(n) {
return {
preencode(state) {
state.end += n;
},
encode(state, s) {
b4a4.write(state.buffer, s, state.start, n, encoding);
state.start += n;
},
decode(state) {
if (state.end - state.start < n) throw new Error("Out of bounds");
return b4a4.toString(
state.buffer,
encoding,
state.start,
state.start += n
);
}
};
}
};
}
var utf8 = exports2.string = exports2.utf8 = string("utf-8");
exports2.ascii = string("ascii");
exports2.hex = string("hex");
exports2.base64 = string("base64");
exports2.ucs2 = exports2.utf16le = string("utf16le");
exports2.bool = {
preencode(state, b) {
state.end++;
},
encode(state, b) {
state.buffer[state.start++] = b ? 1 : 0;
},
decode(state) {
if (state.start >= state.end) throw Error("Out of bounds");
return state.buffer[state.start++] === 1;
}
};
var fixed = exports2.fixed = function fixed2(n) {
return {
preencode(state, s) {
if (s.byteLength !== n) throw new Error("Incorrect buffer size");
state.end += n;
},
encode(state, s) {
state.buffer.set(s, state.start);
state.start += n;
},
decode(state) {
if (state.end - state.start < n) throw new Error("Out of bounds");
return state.buffer.subarray(state.start, state.start += n);
}
};
};
exports2.fixed32 = fixed(32);
exports2.fixed64 = fixed(64);
exports2.array = function array(enc) {
return {
preencode(state, list) {
uint.preencode(state, list.length);
for (let i = 0; i < list.length; i++) enc.preencode(state, list[i]);
},
encode(state, list) {
uint.encode(state, list.length);
for (let i = 0; i < list.length; i++) enc.encode(state, list[i]);
},
decode(state) {
const len = uint.decode(state);
if (len > 1048576) throw new Error("Array is too big");
const arr = new Array(len);
for (let i = 0; i < len; i++) arr[i] = enc.decode(state);
return arr;
}
};
};
exports2.frame = function frame(enc) {
const dummy = exports2.state();
return {
preencode(state, m) {
const end = state.end;
enc.preencode(state, m);
uint.preencode(state, state.end - end);
},
encode(state, m) {
dummy.end = 0;
enc.preencode(dummy, m);
uint.encode(state, dummy.end);
enc.encode(state, m);
},
decode(state) {
const end = state.end;
const len = uint.decode(state);
state.end = state.start + len;
const m = enc.decode(state);
state.start = state.end;
state.end = end;
return m;
}
};
};
exports2.date = {
preencode(state, d) {
int.preencode(state, d.getTime());
},
encode(state, d) {
int.encode(state, d.getTime());
},
decode(state, d) {
return new Date(int.decode(state));
}
};
exports2.json = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v));
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v));
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
exports2.ndjson = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v) + "\n");
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v) + "\n");
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
exports2.none = {
preencode(state, n) {
},
encode(state, n) {
},
decode(state) {
return null;
}
};
var anyArray = {
preencode(state, arr) {
uint.preencode(state, arr.length);
for (let i = 0; i < arr.length; i++) {
any.preencode(state, arr[i]);
}
},
encode(state, arr) {
uint.encode(state, arr.length);
for (let i = 0; i < arr.length; i++) {
any.encode(state, arr[i]);
}
},
decode(state) {
const arr = [];
let len = uint.decode(state);
while (len-- > 0) {
arr.push(any.decode(state));
}
return arr;
}
};
var anyObject = {
preencode(state, o) {
const keys = Object.keys(o);
uint.preencode(state, keys.length);
for (const key of keys) {
utf8.preencode(state, key);
any.preencode(state, o[key]);
}
},
encode(state, o) {
const keys = Object.keys(o);
uint.encode(state, keys.length);
for (const key of keys) {
utf8.encode(state, key);
any.encode(state, o[key]);
}
},
decode(state) {
let len = uint.decode(state);
const o = {};
while (len-- > 0) {
const key = utf8.decode(state);
o[key] = any.decode(state);
}
return o;
}
};
var anyTypes = [
exports2.none,
exports2.bool,
exports2.string,
exports2.buffer,
exports2.uint,
exports2.int,
exports2.float64,
anyArray,
anyObject,
exports2.date
];
var any = exports2.any = {
preencode(state, o) {
const t = getType(o);
uint.preencode(state, t);
anyTypes[t].preencode(state, o);
},
encode(state, o) {
const t = getType(o);
uint.encode(state, t);
anyTypes[t].encode(state, o);
},
decode(state) {
const t = uint.decode(state);
if (t >= anyTypes.length) throw new Error("Unknown type: " + t);
return anyTypes[t].decode(state);
}
};
var port = exports2.port = uint16;
var address = (host, family) => {
return {
preencode(state, m) {
host.preencode(state, m.host);
port.preencode(state, m.port);
},
encode(state, m) {
host.encode(state, m.host);
port.encode(state, m.port);
},
decode(state) {
return {
host: host.decode(state),
family,
port: port.decode(state)
};
}
};
};
var ipv4 = exports2.ipv4 = {
preencode(state) {
state.end += 4;
},
encode(state, string2) {
const start = state.start;
const end = start + 4;
let i = 0;
while (i < string2.length) {
let n = 0;
let c4;
while (i < string2.length && (c4 = string2.charCodeAt(i++)) !== /* . */
46) {
n = n * 10 + (c4 - /* 0 */
48);
}
state.buffer[state.start++] = n;
}
state.start = end;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
return state.buffer[state.start++] + "." + state.buffer[state.start++] + "." + state.buffer[state.start++] + "." + state.buffer[state.start++];
}
};
exports2.ipv4Address = address(ipv4, 4);
var ipv6 = exports2.ipv6 = {
preencode(state) {
state.end += 16;
},
encode(state, string2) {
const start = state.start;
const end = start + 16;
let i = 0;
let split2 = null;
while (i < string2.length) {
let n = 0;
let c4;
while (i < string2.length && (c4 = string2.charCodeAt(i++)) !== /* : */
58) {
if (c4 >= 48 && c4 <= 57) n = n * 16 + (c4 - /* 0 */
48);
else if (c4 >= 65 && c4 <= 70) n = n * 16 + (c4 - /* A */
65 + 10);
else if (c4 >= 97 && c4 <= 102) n = n * 16 + (c4 - /* a */
97 + 10);
}
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n;
if (i < string2.length && string2.charCodeAt(i) === /* : */
58) {
i++;
split2 = state.start;
}
}
if (split2 !== null) {
const offset = end - state.start;
state.buffer.copyWithin(split2 + offset, split2).fill(0, split2, split2 + offset);
}
state.start = end;
},
decode(state) {
if (state.end - state.start < 16) throw new Error("Out of bounds");
return (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16);
}
};
exports2.ipv6Address = address(ipv6, 6);
var ip = exports2.ip = {
preencode(state, string2) {
const family = string2.includes(":") ? 6 : 4;
uint8.preencode(state, family);
if (family === 4) ipv4.preencode(state);
else ipv6.preencode(state);
},
encode(state, string2) {
const family = string2.includes(":") ? 6 : 4;
uint8.encode(state, family);
if (family === 4) ipv4.encode(state, string2);
else ipv6.encode(state, string2);
},
decode(state) {
const family = uint8.decode(state);
if (family === 4) return ipv4.decode(state);
else return ipv6.decode(state);
}
};
exports2.ipAddress = {
preencode(state, m) {
ip.preencode(state, m.host);
port.preencode(state, m.port);
},
encode(state, m) {
ip.encode(state, m.host);
port.encode(state, m.port);
},
decode(state) {
const family = uint8.decode(state);
return {
host: family === 4 ? ipv4.decode(state) : ipv6.decode(state),
family,
port: port.decode(state)
};
}
};
var record = exports2.record = function(keyEncoding, valueEncoding) {
return {
preencode(state, v) {
const keys = Object.keys(v);
uint.preencode(state, keys.length);
for (const k of keys) {
keyEncoding.preencode(state, k);
valueEncoding.preencode(state, v[k]);
}
},
encode(state, v) {
const keys = Object.keys(v);
uint.encode(state, keys.length);
for (const k of keys) {
keyEncoding.encode(state, k);
valueEncoding.encode(state, v[k]);
}
},
decode(state) {
const out = /* @__PURE__ */ Object.create(null);
const keys = uint.decode(state);
for (let i = 0; i < keys; i++) {
out[keyEncoding.decode(state)] = valueEncoding.decode(state);
}
return out;
}
};
};
exports2.stringRecord = record(utf8, utf8);
function getType(o) {
if (o === null || o === void 0) return 0;
if (typeof o === "boolean") return 1;
if (typeof o === "string") return 2;
if (b4a4.isBuffer(o)) return 3;
if (typeof o === "number") {
if (Number.isInteger(o)) return o >= 0 ? 4 : 5;
return 6;
}
if (Array.isArray(o)) return 7;
if (o instanceof Date) return 9;
if (typeof o === "object") return 8;
throw new Error("Unsupported type for " + o);
}
exports2.from = function from(enc) {
if (typeof enc === "string") return fromNamed(enc);
if (enc.preencode) return enc;
if (enc.encodingLength) return fromAbstractEncoder(enc);
return fromCodec(enc);
};
function fromNamed(enc) {
switch (enc) {
case "ascii":
return raw.ascii;
case "utf-8":
case "utf8":
return raw.utf8;
case "hex":
return raw.hex;
case "base64":
return raw.base64;
case "utf16-le":
case "utf16le":
case "ucs-2":
case "ucs2":
return raw.ucs2;
case "ndjson":
return raw.ndjson;
case "json":
return raw.json;
case "binary":
default:
return raw.binary;
}
}
function fromCodec(enc) {
let tmpM = null;
let tmpBuf = null;
return {
preencode(state, m) {
tmpM = m;
tmpBuf = enc.encode(m);
state.end += tmpBuf.byteLength;
},
encode(state, m) {
raw.encode(state, m === tmpM ? tmpBuf : enc.encode(m));
tmpM = tmpBuf = null;
},
decode(state) {
return enc.decode(raw.decode(state));
}
};
}
function fromAbstractEncoder(enc) {
return {
preencode(state, m) {
state.end += enc.encodingLength(m);
},
encode(state, m) {
enc.encode(m, state.buffer, state.start);
state.start += enc.encode.bytes;
},
decode(state) {
const m = enc.decode(state.buffer, state.start, state.end);
state.start += enc.decode.bytes;
return m;
}
};
}
exports2.encode = function encode2(enc, m) {
const state = exports2.state();
enc.preencode(state, m);
state.buffer = b4a4.allocUnsafe(state.end);
enc.encode(state, m);
return state.buffer;
};
exports2.decode = function decode2(enc, buffer2) {
return enc.decode(exports2.state(0, buffer2.byteLength, buffer2));
};
function zigZagInt(enc) {
return {
preencode(state, n) {
enc.preencode(state, zigZagEncodeInt(n));
},
encode(state, n) {
enc.encode(state, zigZagEncodeInt(n));
},
decode(state) {
return zigZagDecodeInt(enc.decode(state));
}
};
}
function zigZagDecodeInt(n) {
return n === 0 ? n : (n & 1) === 0 ? n / 2 : -(n + 1) / 2;
}
function zigZagEncodeInt(n) {
return n < 0 ? 2 * -n - 1 : n === 0 ? 0 : 2 * n;
}
function zigZagBigInt(enc) {
return {
preencode(state, n) {
enc.preencode(state, zigZagEncodeBigInt(n));
},
encode(state, n) {
enc.encode(state, zigZagEncodeBigInt(n));
},
decode(state) {
return zigZagDecodeBigInt(enc.decode(state));
}
};
}
function zigZagDecodeBigInt(n) {
return n === 0n ? n : (n & 1n) === 0n ? n / 2n : -(n + 1n) / 2n;
}
function zigZagEncodeBigInt(n) {
return n < 0n ? 2n * -n - 1n : n === 0n ? 0n : 2n * n;
}
function validateUint(n) {
if (n >= 0 === false)
throw new Error("uint must be positive");
if (n > Number.MAX_SAFE_INTEGER)
throw new Error(
"integer is greater than the maximum safe integer, use biguint/bigint"
);
}
}
});
// node_modules/hyperdispatch/lib/errors.js
var require_errors2 = __commonJS({
"node_modules/hyperdispatch/lib/errors.js"(exports2, module2) {
var ERRORS2 = {
NONEXISTENT_ROUTE: "NONEXISTENT_ROUTE",
HANDLER_NOT_FOUND_BY_ID: "HANDLER_NOT_FOUND_BY_ID",
ROUTE_NOT_FOUND_BY_NAME: "ROUTE_NOT_FOUND_BY_NAME"
};
var DispatchError2 = class _DispatchError extends Error {
constructor(code, message, fn = _DispatchError) {
super(message ? `${code}: ${message}` : code);
this.code = code;
this.isDispatchError = true;
if (Error.captureStackTrace) {
Error.captureStackTrace(this, fn);
}
}
static isDispatchError(err) {
return err?.isDispatchError === true;
}
static NONEXISTENT_ROUTE(name) {
return new _DispatchError(ERRORS2.NONEXISTENT_ROUTE, name, _DispatchError.NONEXISTENT_ROUTE);
}
static HANDLER_NOT_FOUND_BY_ID(id) {
return new _DispatchError(
ERRORS2.HANDLER_NOT_FOUND_BY_ID,
id,
_DispatchError.HANDLER_NOT_FOUND_BY_ID
);
}
static ROUTE_NOT_FOUND_BY_NAME(name) {
return new _DispatchError(
ERRORS2.ROUTE_NOT_FOUND_BY_NAME,
name,
_DispatchError.ROUTE_NOT_FOUND_BY_NAME
);
}
};
module2.exports = {
DispatchError: DispatchError2,
ERRORS: ERRORS2
};
}
});
// node_modules/ajv/dist/compile/codegen/code.js
var require_code = __commonJS({
"node_modules/ajv/dist/compile/codegen/code.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.regexpCode = exports2.getEsmExportName = exports2.getProperty = exports2.safeStringify = exports2.stringify = exports2.strConcat = exports2.addCodeArg = exports2.str = exports2._ = exports2.nil = exports2._Code = exports2.Name = exports2.IDENTIFIER = exports2._CodeOrName = void 0;
var _CodeOrName = class {
};
exports2._CodeOrName = _CodeOrName;
exports2.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
var Name = class extends _CodeOrName {
constructor(s) {
super();
if (!exports2.IDENTIFIER.test(s))
throw new Error("CodeGen: name must be a valid identifier");
this.str = s;
}
toString() {
return this.str;
}
emptyStr() {
return false;
}
get names() {
return { [this.str]: 1 };
}
};
exports2.Name = Name;
var _Code = class extends _CodeOrName {
constructor(code) {
super();
this._items = typeof code === "string" ? [code] : code;
}
toString() {
return this.str;
}
emptyStr() {
if (this._items.length > 1)
return false;
const item = this._items[0];
return item === "" || item === '""';
}
get str() {
var _a;
return (_a = this._str) !== null && _a !== void 0 ? _a : this._str = this._items.reduce((s, c4) => `${s}${c4}`, "");
}
get names() {
var _a;
return (_a = this._names) !== null && _a !== void 0 ? _a : this._names = this._items.reduce((names, c4) => {
if (c4 instanceof Name)
names[c4.str] = (names[c4.str] || 0) + 1;
return names;
}, {});
}
};
exports2._Code = _Code;
exports2.nil = new _Code("");
function _(strs, ...args) {
const code = [strs[0]];
let i = 0;
while (i < args.length) {
addCodeArg(code, args[i]);
code.push(strs[++i]);
}
return new _Code(code);
}
exports2._ = _;
var plus = new _Code("+");
function str(strs, ...args) {
const expr = [safeStringify(strs[0])];
let i = 0;
while (i < args.length) {
expr.push(plus);
addCodeArg(expr, args[i]);
expr.push(plus, safeStringify(strs[++i]));
}
optimize(expr);
return new _Code(expr);
}
exports2.str = str;
function addCodeArg(code, arg) {
if (arg instanceof _Code)
code.push(...arg._items);
else if (arg instanceof Name)
code.push(arg);
else
code.push(interpolate(arg));
}
exports2.addCodeArg = addCodeArg;
function optimize(expr) {
let i = 1;
while (i < expr.length - 1) {
if (expr[i] === plus) {
const res = mergeExprItems(expr[i - 1], expr[i + 1]);
if (res !== void 0) {
expr.splice(i - 1, 3, res);
continue;
}
expr[i++] = "+";
}
i++;
}
}
function mergeExprItems(a, b) {
if (b === '""')
return a;
if (a === '""')
return b;
if (typeof a == "string") {
if (b instanceof Name || a[a.length - 1] !== '"')
return;
if (typeof b != "string")
return `${a.slice(0, -1)}${b}"`;
if (b[0] === '"')
return a.slice(0, -1) + b.slice(1);
return;
}
if (typeof b == "string" && b[0] === '"' && !(a instanceof Name))
return `"${a}${b.slice(1)}`;
return;
}
function strConcat(c1, c22) {
return c22.emptyStr() ? c1 : c1.emptyStr() ? c22 : str`${c1}${c22}`;
}
exports2.strConcat = strConcat;
function interpolate(x) {
return typeof x == "number" || typeof x == "boolean" || x === null ? x : safeStringify(Array.isArray(x) ? x.join(",") : x);
}
function stringify(x) {
return new _Code(safeStringify(x));
}
exports2.stringify = stringify;
function safeStringify(x) {
return JSON.stringify(x).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
}
exports2.safeStringify = safeStringify;
function getProperty(key) {
return typeof key == "string" && exports2.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _`[${key}]`;
}
exports2.getProperty = getProperty;
function getEsmExportName(key) {
if (typeof key == "string" && exports2.IDENTIFIER.test(key)) {
return new _Code(`${key}`);
}
throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`);
}
exports2.getEsmExportName = getEsmExportName;
function regexpCode(rx) {
return new _Code(rx.toString());
}
exports2.regexpCode = regexpCode;
}
});
// node_modules/ajv/dist/compile/codegen/scope.js
var require_scope = __commonJS({
"node_modules/ajv/dist/compile/codegen/scope.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.ValueScope = exports2.ValueScopeName = exports2.Scope = exports2.varKinds = exports2.UsedValueState = void 0;
var code_1 = require_code();
var ValueError = class extends Error {
constructor(name) {
super(`CodeGen: "code" for ${name} not defined`);
this.value = name.value;
}
};
var UsedValueState;
(function(UsedValueState2) {
UsedValueState2[UsedValueState2["Started"] = 0] = "Started";
UsedValueState2[UsedValueState2["Completed"] = 1] = "Completed";
})(UsedValueState || (exports2.UsedValueState = UsedValueState = {}));
exports2.varKinds = {
const: new code_1.Name("const"),
let: new code_1.Name("let"),
var: new code_1.Name("var")
};
var Scope = class {
constructor({ prefixes, parent } = {}) {
this._names = {};
this._prefixes = prefixes;
this._parent = parent;
}
toName(nameOrPrefix) {
return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix);
}
name(prefix) {
return new code_1.Name(this._newName(prefix));
}
_newName(prefix) {
const ng = this._names[prefix] || this._nameGroup(prefix);
return `${prefix}${ng.index++}`;
}
_nameGroup(prefix) {
var _a, _b;
if (((_b = (_a = this._parent) === null || _a === void 0 ? void 0 : _a._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || this._prefixes && !this._prefixes.has(prefix)) {
throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`);
}
return this._names[prefix] = { prefix, index: 0 };
}
};
exports2.Scope = Scope;
var ValueScopeName = class extends code_1.Name {
constructor(prefix, nameStr) {
super(nameStr);
this.prefix = prefix;
}
setValue(value, { property, itemIndex }) {
this.value = value;
this.scopePath = (0, code_1._)`.${new code_1.Name(property)}[${itemIndex}]`;
}
};
exports2.ValueScopeName = ValueScopeName;
var line = (0, code_1._)`\n`;
var ValueScope = class extends Scope {
constructor(opts) {
super(opts);
this._values = {};
this._scope = opts.scope;
this.opts = { ...opts, _n: opts.lines ? line : code_1.nil };
}
get() {
return this._scope;
}
name(prefix) {
return new ValueScopeName(prefix, this._newName(prefix));
}
value(nameOrPrefix, value) {
var _a;
if (value.ref === void 0)
throw new Error("CodeGen: ref must be passed in value");
const name = this.toName(nameOrPrefix);
const { prefix } = name;
const valueKey = (_a = value.key) !== null && _a !== void 0 ? _a : value.ref;
let vs = this._values[prefix];
if (vs) {
const _name = vs.get(valueKey);
if (_name)
return _name;
} else {
vs = this._values[prefix] = /* @__PURE__ */ new Map();
}
vs.set(valueKey, name);
const s = this._scope[prefix] || (this._scope[prefix] = []);
const itemIndex = s.length;
s[itemIndex] = value.ref;
name.setValue(value, { property: prefix, itemIndex });
return name;
}
getValue(prefix, keyOrRef) {
const vs = this._values[prefix];
if (!vs)
return;
return vs.get(keyOrRef);
}
scopeRefs(scopeName, values = this._values) {
return this._reduceValues(values, (name) => {
if (name.scopePath === void 0)
throw new Error(`CodeGen: name "${name}" has no value`);
return (0, code_1._)`${scopeName}${name.scopePath}`;
});
}
scopeCode(values = this._values, usedValues, getCode) {
return this._reduceValues(values, (name) => {
if (name.value === void 0)
throw new Error(`CodeGen: name "${name}" has no value`);
return name.value.code;
}, usedValues, getCode);
}
_reduceValues(values, valueCode, usedValues = {}, getCode) {
let code = code_1.nil;
for (const prefix in values) {
const vs = values[prefix];
if (!vs)
continue;
const nameSet = usedValues[prefix] = usedValues[prefix] || /* @__PURE__ */ new Map();
vs.forEach((name) => {
if (nameSet.has(name))
return;
nameSet.set(name, UsedValueState.Started);
let c4 = valueCode(name);
if (c4) {
const def = this.opts.es5 ? exports2.varKinds.var : exports2.varKinds.const;
code = (0, code_1._)`${code}${def} ${name} = ${c4};${this.opts._n}`;
} else if (c4 = getCode === null || getCode === void 0 ? void 0 : getCode(name)) {
code = (0, code_1._)`${code}${c4}${this.opts._n}`;
} else {
throw new ValueError(name);
}
nameSet.set(name, UsedValueState.Completed);
});
}
return code;
}
};
exports2.ValueScope = ValueScope;
}
});
// node_modules/ajv/dist/compile/codegen/index.js
var require_codegen = __commonJS({
"node_modules/ajv/dist/compile/codegen/index.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.or = exports2.and = exports2.not = exports2.CodeGen = exports2.operators = exports2.varKinds = exports2.ValueScopeName = exports2.ValueScope = exports2.Scope = exports2.Name = exports2.regexpCode = exports2.stringify = exports2.getProperty = exports2.nil = exports2.strConcat = exports2.str = exports2._ = void 0;
var code_1 = require_code();
var scope_1 = require_scope();
var code_2 = require_code();
Object.defineProperty(exports2, "_", { enumerable: true, get: function() {
return code_2._;
} });
Object.defineProperty(exports2, "str", { enumerable: true, get: function() {
return code_2.str;
} });
Object.defineProperty(exports2, "strConcat", { enumerable: true, get: function() {
return code_2.strConcat;
} });
Object.defineProperty(exports2, "nil", { enumerable: true, get: function() {
return code_2.nil;
} });
Object.defineProperty(exports2, "getProperty", { enumerable: true, get: function() {
return code_2.getProperty;
} });
Object.defineProperty(exports2, "stringify", { enumerable: true, get: function() {
return code_2.stringify;
} });
Object.defineProperty(exports2, "regexpCode", { enumerable: true, get: function() {
return code_2.regexpCode;
} });
Object.defineProperty(exports2, "Name", { enumerable: true, get: function() {
return code_2.Name;
} });
var scope_2 = require_scope();
Object.defineProperty(exports2, "Scope", { enumerable: true, get: function() {
return scope_2.Scope;
} });
Object.defineProperty(exports2, "ValueScope", { enumerable: true, get: function() {
return scope_2.ValueScope;
} });
Object.defineProperty(exports2, "ValueScopeName", { enumerable: true, get: function() {
return scope_2.ValueScopeName;
} });
Object.defineProperty(exports2, "varKinds", { enumerable: true, get: function() {
return scope_2.varKinds;
} });
exports2.operators = {
GT: new code_1._Code(">"),
GTE: new code_1._Code(">="),
LT: new code_1._Code("<"),
LTE: new code_1._Code("<="),
EQ: new code_1._Code("==="),
NEQ: new code_1._Code("!=="),
NOT: new code_1._Code("!"),
OR: new code_1._Code("||"),
AND: new code_1._Code("&&"),
ADD: new code_1._Code("+")
};
var Node = class {
optimizeNodes() {
return this;
}
optimizeNames(_names, _constants) {
return this;
}
};
var Def = class extends Node {
constructor(varKind, name, rhs) {
super();
this.varKind = varKind;
this.name = name;
this.rhs = rhs;
}
render({ es5, _n }) {
const varKind = es5 ? scope_1.varKinds.var : this.varKind;
const rhs = this.rhs === void 0 ? "" : ` = ${this.rhs}`;
return `${varKind} ${this.name}${rhs};` + _n;
}
optimizeNames(names, constants) {
if (!names[this.name.str])
return;
if (this.rhs)
this.rhs = optimizeExpr(this.rhs, names, constants);
return this;
}
get names() {
return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {};
}
};
var Assign = class extends Node {
constructor(lhs, rhs, sideEffects) {
super();
this.lhs = lhs;
this.rhs = rhs;
this.sideEffects = sideEffects;
}
render({ _n }) {
return `${this.lhs} = ${this.rhs};` + _n;
}
optimizeNames(names, constants) {
if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects)
return;
this.rhs = optimizeExpr(this.rhs, names, constants);
return this;
}
get names() {
const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names };
return addExprNames(names, this.rhs);
}
};
var AssignOp = class extends Assign {
constructor(lhs, op, rhs, sideEffects) {
super(lhs, rhs, sideEffects);
this.op = op;
}
render({ _n }) {
return `${this.lhs} ${this.op}= ${this.rhs};` + _n;
}
};
var Label = class extends Node {
constructor(label) {
super();
this.label = label;
this.names = {};
}
render({ _n }) {
return `${this.label}:` + _n;
}
};
var Break = class extends Node {
constructor(label) {
super();
this.label = label;
this.names = {};
}
render({ _n }) {
const label = this.label ? ` ${this.label}` : "";
return `break${label};` + _n;
}
};
var Throw = class extends Node {
constructor(error) {
super();
this.error = error;
}
render({ _n }) {
return `throw ${this.error};` + _n;
}
get names() {
return this.error.names;
}
};
var AnyCode = class extends Node {
constructor(code) {
super();
this.code = code;
}
render({ _n }) {
return `${this.code};` + _n;
}
optimizeNodes() {
return `${this.code}` ? this : void 0;
}
optimizeNames(names, constants) {
this.code = optimizeExpr(this.code, names, constants);
return this;
}
get names() {
return this.code instanceof code_1._CodeOrName ? this.code.names : {};
}
};
var ParentNode = class extends Node {
constructor(nodes = []) {
super();
this.nodes = nodes;
}
render(opts) {
return this.nodes.reduce((code, n) => code + n.render(opts), "");
}
optimizeNodes() {
const { nodes } = this;
let i = nodes.length;
while (i--) {
const n = nodes[i].optimizeNodes();
if (Array.isArray(n))
nodes.splice(i, 1, ...n);
else if (n)
nodes[i] = n;
else
nodes.splice(i, 1);
}
return nodes.length > 0 ? this : void 0;
}
optimizeNames(names, constants) {
const { nodes } = this;
let i = nodes.length;
while (i--) {
const n = nodes[i];
if (n.optimizeNames(names, constants))
continue;
subtractNames(names, n.names);
nodes.splice(i, 1);
}
return nodes.length > 0 ? this : void 0;
}
get names() {
return this.nodes.reduce((names, n) => addNames(names, n.names), {});
}
};
var BlockNode = class extends ParentNode {
render(opts) {
return "{" + opts._n + super.render(opts) + "}" + opts._n;
}
};
var Root = class extends ParentNode {
};
var Else = class extends BlockNode {
};
Else.kind = "else";
var If = class _If extends BlockNode {
constructor(condition, nodes) {
super(nodes);
this.condition = condition;
}
render(opts) {
let code = `if(${this.condition})` + super.render(opts);
if (this.else)
code += "else " + this.else.render(opts);
return code;
}
optimizeNodes() {
super.optimizeNodes();
const cond = this.condition;
if (cond === true)
return this.nodes;
let e = this.else;
if (e) {
const ns = e.optimizeNodes();
e = this.else = Array.isArray(ns) ? new Else(ns) : ns;
}
if (e) {
if (cond === false)
return e instanceof _If ? e : e.nodes;
if (this.nodes.length)
return this;
return new _If(not(cond), e instanceof _If ? [e] : e.nodes);
}
if (cond === false || !this.nodes.length)
return void 0;
return this;
}
optimizeNames(names, constants) {
var _a;
this.else = (_a = this.else) === null || _a === void 0 ? void 0 : _a.optimizeNames(names, constants);
if (!(super.optimizeNames(names, constants) || this.else))
return;
this.condition = optimizeExpr(this.condition, names, constants);
return this;
}
get names() {
const names = super.names;
addExprNames(names, this.condition);
if (this.else)
addNames(names, this.else.names);
return names;
}
};
If.kind = "if";
var For = class extends BlockNode {
};
For.kind = "for";
var ForLoop = class extends For {
constructor(iteration) {
super();
this.iteration = iteration;
}
render(opts) {
return `for(${this.iteration})` + super.render(opts);
}
optimizeNames(names, constants) {
if (!super.optimizeNames(names, constants))
return;
this.iteration = optimizeExpr(this.iteration, names, constants);
return this;
}
get names() {
return addNames(super.names, this.iteration.names);
}
};
var ForRange = class extends For {
constructor(varKind, name, from, to) {
super();
this.varKind = varKind;
this.name = name;
this.from = from;
this.to = to;
}
render(opts) {
const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind;
const { name, from, to } = this;
return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts);
}
get names() {
const names = addExprNames(super.names, this.from);
return addExprNames(names, this.to);
}
};
var ForIter = class extends For {
constructor(loop, varKind, name, iterable) {
super();
this.loop = loop;
this.varKind = varKind;
this.name = name;
this.iterable = iterable;
}
render(opts) {
return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts);
}
optimizeNames(names, constants) {
if (!super.optimizeNames(names, constants))
return;
this.iterable = optimizeExpr(this.iterable, names, constants);
return this;
}
get names() {
return addNames(super.names, this.iterable.names);
}
};
var Func = class extends BlockNode {
constructor(name, args, async) {
super();
this.name = name;
this.args = args;
this.async = async;
}
render(opts) {
const _async = this.async ? "async " : "";
return `${_async}function ${this.name}(${this.args})` + super.render(opts);
}
};
Func.kind = "func";
var Return = class extends ParentNode {
render(opts) {
return "return " + super.render(opts);
}
};
Return.kind = "return";
var Try = class extends BlockNode {
render(opts) {
let code = "try" + super.render(opts);
if (this.catch)
code += this.catch.render(opts);
if (this.finally)
code += this.finally.render(opts);
return code;
}
optimizeNodes() {
var _a, _b;
super.optimizeNodes();
(_a = this.catch) === null || _a === void 0 ? void 0 : _a.optimizeNodes();
(_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes();
return this;
}
optimizeNames(names, constants) {
var _a, _b;
super.optimizeNames(names, constants);
(_a = this.catch) === null || _a === void 0 ? void 0 : _a.optimizeNames(names, constants);
(_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants);
return this;
}
get names() {
const names = super.names;
if (this.catch)
addNames(names, this.catch.names);
if (this.finally)
addNames(names, this.finally.names);
return names;
}
};
var Catch = class extends BlockNode {
constructor(error) {
super();
this.error = error;
}
render(opts) {
return `catch(${this.error})` + super.render(opts);
}
};
Catch.kind = "catch";
var Finally = class extends BlockNode {
render(opts) {
return "finally" + super.render(opts);
}
};
Finally.kind = "finally";
var CodeGen = class {
constructor(extScope, opts = {}) {
this._values = {};
this._blockStarts = [];
this._constants = {};
this.opts = { ...opts, _n: opts.lines ? "\n" : "" };
this._extScope = extScope;
this._scope = new scope_1.Scope({ parent: extScope });
this._nodes = [new Root()];
}
toString() {
return this._root.render(this.opts);
}
// returns unique name in the internal scope
name(prefix) {
return this._scope.name(prefix);
}
// reserves unique name in the external scope
scopeName(prefix) {
return this._extScope.name(prefix);
}
// reserves unique name in the external scope and assigns value to it
scopeValue(prefixOrName, value) {
const name = this._extScope.value(prefixOrName, value);
const vs = this._values[name.prefix] || (this._values[name.prefix] = /* @__PURE__ */ new Set());
vs.add(name);
return name;
}
getScopeValue(prefix, keyOrRef) {
return this._extScope.getValue(prefix, keyOrRef);
}
// return code that assigns values in the external scope to the names that are used internally
// (same names that were returned by gen.scopeName or gen.scopeValue)
scopeRefs(scopeName) {
return this._extScope.scopeRefs(scopeName, this._values);
}
scopeCode() {
return this._extScope.scopeCode(this._values);
}
_def(varKind, nameOrPrefix, rhs, constant) {
const name = this._scope.toName(nameOrPrefix);
if (rhs !== void 0 && constant)
this._constants[name.str] = rhs;
this._leafNode(new Def(varKind, name, rhs));
return name;
}
// `const` declaration (`var` in es5 mode)
const(nameOrPrefix, rhs, _constant) {
return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant);
}
// `let` declaration with optional assignment (`var` in es5 mode)
let(nameOrPrefix, rhs, _constant) {
return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant);
}
// `var` declaration with optional assignment
var(nameOrPrefix, rhs, _constant) {
return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant);
}
// assignment code
assign(lhs, rhs, sideEffects) {
return this._leafNode(new Assign(lhs, rhs, sideEffects));
}
// `+=` code
add(lhs, rhs) {
return this._leafNode(new AssignOp(lhs, exports2.operators.ADD, rhs));
}
// appends passed SafeExpr to code or executes Block
code(c4) {
if (typeof c4 == "function")
c4();
else if (c4 !== code_1.nil)
this._leafNode(new AnyCode(c4));
return this;
}
// returns code for object literal for the passed argument list of key-value pairs
object(...keyValues) {
const code = ["{"];
for (const [key, value] of keyValues) {
if (code.length > 1)
code.push(",");
code.push(key);
if (key !== value || this.opts.es5) {
code.push(":");
(0, code_1.addCodeArg)(code, value);
}
}
code.push("}");
return new code_1._Code(code);
}
// `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed)
if(condition, thenBody, elseBody) {
this._blockNode(new If(condition));
if (thenBody && elseBody) {
this.code(thenBody).else().code(elseBody).endIf();
} else if (thenBody) {
this.code(thenBody).endIf();
} else if (elseBody) {
throw new Error('CodeGen: "else" body without "then" body');
}
return this;
}
// `else if` clause - invalid without `if` or after `else` clauses
elseIf(condition) {
return this._elseNode(new If(condition));
}
// `else` clause - only valid after `if` or `else if` clauses
else() {
return this._elseNode(new Else());
}
// end `if` statement (needed if gen.if was used only with condition)
endIf() {
return this._endBlockNode(If, Else);
}
_for(node, forBody) {
this._blockNode(node);
if (forBody)
this.code(forBody).endFor();
return this;
}
// a generic `for` clause (or statement if `forBody` is passed)
for(iteration, forBody) {
return this._for(new ForLoop(iteration), forBody);
}
// `for` statement for a range of values
forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) {
const name = this._scope.toName(nameOrPrefix);
return this._for(new ForRange(varKind, name, from, to), () => forBody(name));
}
// `for-of` statement (in es5 mode replace with a normal for loop)
forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) {
const name = this._scope.toName(nameOrPrefix);
if (this.opts.es5) {
const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable);
return this.forRange("_i", 0, (0, code_1._)`${arr}.length`, (i) => {
this.var(name, (0, code_1._)`${arr}[${i}]`);
forBody(name);
});
}
return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name));
}
// `for-in` statement.
// With option `ownProperties` replaced with a `for-of` loop for object keys
forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) {
if (this.opts.ownProperties) {
return this.forOf(nameOrPrefix, (0, code_1._)`Object.keys(${obj})`, forBody);
}
const name = this._scope.toName(nameOrPrefix);
return this._for(new ForIter("in", varKind, name, obj), () => forBody(name));
}
// end `for` loop
endFor() {
return this._endBlockNode(For);
}
// `label` statement
label(label) {
return this._leafNode(new Label(label));
}
// `break` statement
break(label) {
return this._leafNode(new Break(label));
}
// `return` statement
return(value) {
const node = new Return();
this._blockNode(node);
this.code(value);
if (node.nodes.length !== 1)
throw new Error('CodeGen: "return" should have one node');
return this._endBlockNode(Return);
}
// `try` statement
try(tryBody, catchCode, finallyCode) {
if (!catchCode && !finallyCode)
throw new Error('CodeGen: "try" without "catch" and "finally"');
const node = new Try();
this._blockNode(node);
this.code(tryBody);
if (catchCode) {
const error = this.name("e");
this._currNode = node.catch = new Catch(error);
catchCode(error);
}
if (finallyCode) {
this._currNode = node.finally = new Finally();
this.code(finallyCode);
}
return this._endBlockNode(Catch, Finally);
}
// `throw` statement
throw(error) {
return this._leafNode(new Throw(error));
}
// start self-balancing block
block(body, nodeCount) {
this._blockStarts.push(this._nodes.length);
if (body)
this.code(body).endBlock(nodeCount);
return this;
}
// end the current self-balancing block
endBlock(nodeCount) {
const len = this._blockStarts.pop();
if (len === void 0)
throw new Error("CodeGen: not in self-balancing block");
const toClose = this._nodes.length - len;
if (toClose < 0 || nodeCount !== void 0 && toClose !== nodeCount) {
throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`);
}
this._nodes.length = len;
return this;
}
// `function` heading (or definition if funcBody is passed)
func(name, args = code_1.nil, async, funcBody) {
this._blockNode(new Func(name, args, async));
if (funcBody)
this.code(funcBody).endFunc();
return this;
}
// end function definition
endFunc() {
return this._endBlockNode(Func);
}
optimize(n = 1) {
while (n-- > 0) {
this._root.optimizeNodes();
this._root.optimizeNames(this._root.names, this._constants);
}
}
_leafNode(node) {
this._currNode.nodes.push(node);
return this;
}
_blockNode(node) {
this._currNode.nodes.push(node);
this._nodes.push(node);
}
_endBlockNode(N1, N2) {
const n = this._currNode;
if (n instanceof N1 || N2 && n instanceof N2) {
this._nodes.pop();
return this;
}
throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`);
}
_elseNode(node) {
const n = this._currNode;
if (!(n instanceof If)) {
throw new Error('CodeGen: "else" without "if"');
}
this._currNode = n.else = node;
return this;
}
get _root() {
return this._nodes[0];
}
get _currNode() {
const ns = this._nodes;
return ns[ns.length - 1];
}
set _currNode(node) {
const ns = this._nodes;
ns[ns.length - 1] = node;
}
};
exports2.CodeGen = CodeGen;
function addNames(names, from) {
for (const n in from)
names[n] = (names[n] || 0) + (from[n] || 0);
return names;
}
function addExprNames(names, from) {
return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names;
}
function optimizeExpr(expr, names, constants) {
if (expr instanceof code_1.Name)
return replaceName(expr);
if (!canOptimize(expr))
return expr;
return new code_1._Code(expr._items.reduce((items, c4) => {
if (c4 instanceof code_1.Name)
c4 = replaceName(c4);
if (c4 instanceof code_1._Code)
items.push(...c4._items);
else
items.push(c4);
return items;
}, []));
function replaceName(n) {
const c4 = constants[n.str];
if (c4 === void 0 || names[n.str] !== 1)
return n;
delete names[n.str];
return c4;
}
function canOptimize(e) {
return e instanceof code_1._Code && e._items.some((c4) => c4 instanceof code_1.Name && names[c4.str] === 1 && constants[c4.str] !== void 0);
}
}
function subtractNames(names, from) {
for (const n in from)
names[n] = (names[n] || 0) - (from[n] || 0);
}
function not(x) {
return typeof x == "boolean" || typeof x == "number" || x === null ? !x : (0, code_1._)`!${par(x)}`;
}
exports2.not = not;
var andCode = mappend(exports2.operators.AND);
function and(...args) {
return args.reduce(andCode);
}
exports2.and = and;
var orCode = mappend(exports2.operators.OR);
function or(...args) {
return args.reduce(orCode);
}
exports2.or = or;
function mappend(op) {
return (x, y) => x === code_1.nil ? y : y === code_1.nil ? x : (0, code_1._)`${par(x)} ${op} ${par(y)}`;
}
function par(x) {
return x instanceof code_1.Name ? x : (0, code_1._)`(${x})`;
}
}
});
// node_modules/ajv/dist/compile/util.js
var require_util = __commonJS({
"node_modules/ajv/dist/compile/util.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.checkStrictMode = exports2.getErrorPath = exports2.Type = exports2.useFunc = exports2.setEvaluated = exports2.evaluatedPropsToName = exports2.mergeEvaluated = exports2.eachItem = exports2.unescapeJsonPointer = exports2.escapeJsonPointer = exports2.escapeFragment = exports2.unescapeFragment = exports2.schemaRefOrVal = exports2.schemaHasRulesButRef = exports2.schemaHasRules = exports2.checkUnknownRules = exports2.alwaysValidSchema = exports2.toHash = void 0;
var codegen_1 = require_codegen();
var code_1 = require_code();
function toHash(arr) {
const hash = {};
for (const item of arr)
hash[item] = true;
return hash;
}
exports2.toHash = toHash;
function alwaysValidSchema(it, schema) {
if (typeof schema == "boolean")
return schema;
if (Object.keys(schema).length === 0)
return true;
checkUnknownRules(it, schema);
return !schemaHasRules(schema, it.self.RULES.all);
}
exports2.alwaysValidSchema = alwaysValidSchema;
function checkUnknownRules(it, schema = it.schema) {
const { opts, self } = it;
if (!opts.strictSchema)
return;
if (typeof schema === "boolean")
return;
const rules = self.RULES.keywords;
for (const key in schema) {
if (!rules[key])
checkStrictMode(it, `unknown keyword: "${key}"`);
}
}
exports2.checkUnknownRules = checkUnknownRules;
function schemaHasRules(schema, rules) {
if (typeof schema == "boolean")
return !schema;
for (const key in schema)
if (rules[key])
return true;
return false;
}
exports2.schemaHasRules = schemaHasRules;
function schemaHasRulesButRef(schema, RULES) {
if (typeof schema == "boolean")
return !schema;
for (const key in schema)
if (key !== "$ref" && RULES.all[key])
return true;
return false;
}
exports2.schemaHasRulesButRef = schemaHasRulesButRef;
function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) {
if (!$data) {
if (typeof schema == "number" || typeof schema == "boolean")
return schema;
if (typeof schema == "string")
return (0, codegen_1._)`${schema}`;
}
return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`;
}
exports2.schemaRefOrVal = schemaRefOrVal;
function unescapeFragment(str) {
return unescapeJsonPointer(decodeURIComponent(str));
}
exports2.unescapeFragment = unescapeFragment;
function escapeFragment(str) {
return encodeURIComponent(escapeJsonPointer(str));
}
exports2.escapeFragment = escapeFragment;
function escapeJsonPointer(str) {
if (typeof str == "number")
return `${str}`;
return str.replace(/~/g, "~0").replace(/\//g, "~1");
}
exports2.escapeJsonPointer = escapeJsonPointer;
function unescapeJsonPointer(str) {
return str.replace(/~1/g, "/").replace(/~0/g, "~");
}
exports2.unescapeJsonPointer = unescapeJsonPointer;
function eachItem(xs, f) {
if (Array.isArray(xs)) {
for (const x of xs)
f(x);
} else {
f(xs);
}
}
exports2.eachItem = eachItem;
function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues, resultToName }) {
return (gen, from, to, toName) => {
const res = to === void 0 ? from : to instanceof codegen_1.Name ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) : from instanceof codegen_1.Name ? (mergeToName(gen, to, from), from) : mergeValues(from, to);
return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res;
};
}
exports2.mergeEvaluated = {
props: makeMergeEvaluated({
mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => {
gen.if((0, codegen_1._)`${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._)`${to} || {}`).code((0, codegen_1._)`Object.assign(${to}, ${from})`));
}),
mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => {
if (from === true) {
gen.assign(to, true);
} else {
gen.assign(to, (0, codegen_1._)`${to} || {}`);
setEvaluated(gen, to, from);
}
}),
mergeValues: (from, to) => from === true ? true : { ...from, ...to },
resultToName: evaluatedPropsToName
}),
items: makeMergeEvaluated({
mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)),
mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._)`${to} > ${from} ? ${to} : ${from}`)),
mergeValues: (from, to) => from === true ? true : Math.max(from, to),
resultToName: (gen, items) => gen.var("items", items)
})
};
function evaluatedPropsToName(gen, ps) {
if (ps === true)
return gen.var("props", true);
const props = gen.var("props", (0, codegen_1._)`{}`);
if (ps !== void 0)
setEvaluated(gen, props, ps);
return props;
}
exports2.evaluatedPropsToName = evaluatedPropsToName;
function setEvaluated(gen, props, ps) {
Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._)`${props}${(0, codegen_1.getProperty)(p)}`, true));
}
exports2.setEvaluated = setEvaluated;
var snippets = {};
function useFunc(gen, f) {
return gen.scopeValue("func", {
ref: f,
code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code))
});
}
exports2.useFunc = useFunc;
var Type;
(function(Type2) {
Type2[Type2["Num"] = 0] = "Num";
Type2[Type2["Str"] = 1] = "Str";
})(Type || (exports2.Type = Type = {}));
function getErrorPath(dataProp, dataPropType, jsPropertySyntax) {
if (dataProp instanceof codegen_1.Name) {
const isNumber = dataPropType === Type.Num;
return jsPropertySyntax ? isNumber ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`;
}
return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp);
}
exports2.getErrorPath = getErrorPath;
function checkStrictMode(it, msg, mode = it.opts.strictSchema) {
if (!mode)
return;
msg = `strict mode: ${msg}`;
if (mode === true)
throw new Error(msg);
it.self.logger.warn(msg);
}
exports2.checkStrictMode = checkStrictMode;
}
});
// node_modules/ajv/dist/compile/names.js
var require_names = __commonJS({
"node_modules/ajv/dist/compile/names.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var names = {
// validation function arguments
data: new codegen_1.Name("data"),
// data passed to validation function
// args passed from referencing schema
valCxt: new codegen_1.Name("valCxt"),
// validation/data context - should not be used directly, it is destructured to the names below
instancePath: new codegen_1.Name("instancePath"),
parentData: new codegen_1.Name("parentData"),
parentDataProperty: new codegen_1.Name("parentDataProperty"),
rootData: new codegen_1.Name("rootData"),
// root data - same as the data passed to the first/top validation function
dynamicAnchors: new codegen_1.Name("dynamicAnchors"),
// used to support recursiveRef and dynamicRef
// function scoped variables
vErrors: new codegen_1.Name("vErrors"),
// null or array of validation errors
errors: new codegen_1.Name("errors"),
// counter of validation errors
this: new codegen_1.Name("this"),
// "globals"
self: new codegen_1.Name("self"),
scope: new codegen_1.Name("scope"),
// JTD serialize/parse name for JSON string and position
json: new codegen_1.Name("json"),
jsonPos: new codegen_1.Name("jsonPos"),
jsonLen: new codegen_1.Name("jsonLen"),
jsonPart: new codegen_1.Name("jsonPart")
};
exports2.default = names;
}
});
// node_modules/ajv/dist/compile/errors.js
var require_errors3 = __commonJS({
"node_modules/ajv/dist/compile/errors.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.extendErrors = exports2.resetErrorsCount = exports2.reportExtraError = exports2.reportError = exports2.keyword$DataError = exports2.keywordError = void 0;
var codegen_1 = require_codegen();
var util_1 = require_util();
var names_1 = require_names();
exports2.keywordError = {
message: ({ keyword }) => (0, codegen_1.str)`must pass "${keyword}" keyword validation`
};
exports2.keyword$DataError = {
message: ({ keyword, schemaType }) => schemaType ? (0, codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)` : (0, codegen_1.str)`"${keyword}" keyword is invalid ($data)`
};
function reportError(cxt, error = exports2.keywordError, errorPaths, overrideAllErrors) {
const { it } = cxt;
const { gen, compositeRule, allErrors } = it;
const errObj = errorObjectCode(cxt, error, errorPaths);
if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : compositeRule || allErrors) {
addError(gen, errObj);
} else {
returnErrors(it, (0, codegen_1._)`[${errObj}]`);
}
}
exports2.reportError = reportError;
function reportExtraError(cxt, error = exports2.keywordError, errorPaths) {
const { it } = cxt;
const { gen, compositeRule, allErrors } = it;
const errObj = errorObjectCode(cxt, error, errorPaths);
addError(gen, errObj);
if (!(compositeRule || allErrors)) {
returnErrors(it, names_1.default.vErrors);
}
}
exports2.reportExtraError = reportExtraError;
function resetErrorsCount(gen, errsCount) {
gen.assign(names_1.default.errors, errsCount);
gen.if((0, codegen_1._)`${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._)`${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null)));
}
exports2.resetErrorsCount = resetErrorsCount;
function extendErrors({ gen, keyword, schemaValue, data, errsCount, it }) {
if (errsCount === void 0)
throw new Error("ajv implementation error");
const err = gen.name("err");
gen.forRange("i", errsCount, names_1.default.errors, (i) => {
gen.const(err, (0, codegen_1._)`${names_1.default.vErrors}[${i}]`);
gen.if((0, codegen_1._)`${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._)`${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath)));
gen.assign((0, codegen_1._)`${err}.schemaPath`, (0, codegen_1.str)`${it.errSchemaPath}/${keyword}`);
if (it.opts.verbose) {
gen.assign((0, codegen_1._)`${err}.schema`, schemaValue);
gen.assign((0, codegen_1._)`${err}.data`, data);
}
});
}
exports2.extendErrors = extendErrors;
function addError(gen, errObj) {
const err = gen.const("err", errObj);
gen.if((0, codegen_1._)`${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._)`[${err}]`), (0, codegen_1._)`${names_1.default.vErrors}.push(${err})`);
gen.code((0, codegen_1._)`${names_1.default.errors}++`);
}
function returnErrors(it, errs) {
const { gen, validateName, schemaEnv } = it;
if (schemaEnv.$async) {
gen.throw((0, codegen_1._)`new ${it.ValidationError}(${errs})`);
} else {
gen.assign((0, codegen_1._)`${validateName}.errors`, errs);
gen.return(false);
}
}
var E = {
keyword: new codegen_1.Name("keyword"),
schemaPath: new codegen_1.Name("schemaPath"),
// also used in JTD errors
params: new codegen_1.Name("params"),
propertyName: new codegen_1.Name("propertyName"),
message: new codegen_1.Name("message"),
schema: new codegen_1.Name("schema"),
parentSchema: new codegen_1.Name("parentSchema")
};
function errorObjectCode(cxt, error, errorPaths) {
const { createErrors } = cxt.it;
if (createErrors === false)
return (0, codegen_1._)`{}`;
return errorObject(cxt, error, errorPaths);
}
function errorObject(cxt, error, errorPaths = {}) {
const { gen, it } = cxt;
const keyValues = [
errorInstancePath(it, errorPaths),
errorSchemaPath(cxt, errorPaths)
];
extraErrorProps(cxt, error, keyValues);
return gen.object(...keyValues);
}
function errorInstancePath({ errorPath }, { instancePath }) {
const instPath = instancePath ? (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}` : errorPath;
return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)];
}
function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) {
let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str)`${errSchemaPath}/${keyword}`;
if (schemaPath) {
schPath = (0, codegen_1.str)`${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`;
}
return [E.schemaPath, schPath];
}
function extraErrorProps(cxt, { params, message }, keyValues) {
const { keyword, data, schemaValue, it } = cxt;
const { opts, propertyName, topSchemaRef, schemaPath } = it;
keyValues.push([E.keyword, keyword], [E.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._)`{}`]);
if (opts.messages) {
keyValues.push([E.message, typeof message == "function" ? message(cxt) : message]);
}
if (opts.verbose) {
keyValues.push([E.schema, schemaValue], [E.parentSchema, (0, codegen_1._)`${topSchemaRef}${schemaPath}`], [names_1.default.data, data]);
}
if (propertyName)
keyValues.push([E.propertyName, propertyName]);
}
}
});
// node_modules/ajv/dist/compile/validate/boolSchema.js
var require_boolSchema = __commonJS({
"node_modules/ajv/dist/compile/validate/boolSchema.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.boolOrEmptySchema = exports2.topBoolOrEmptySchema = void 0;
var errors_1 = require_errors3();
var codegen_1 = require_codegen();
var names_1 = require_names();
var boolError = {
message: "boolean schema is false"
};
function topBoolOrEmptySchema(it) {
const { gen, schema, validateName } = it;
if (schema === false) {
falseSchemaError(it, false);
} else if (typeof schema == "object" && schema.$async === true) {
gen.return(names_1.default.data);
} else {
gen.assign((0, codegen_1._)`${validateName}.errors`, null);
gen.return(true);
}
}
exports2.topBoolOrEmptySchema = topBoolOrEmptySchema;
function boolOrEmptySchema(it, valid) {
const { gen, schema } = it;
if (schema === false) {
gen.var(valid, false);
falseSchemaError(it);
} else {
gen.var(valid, true);
}
}
exports2.boolOrEmptySchema = boolOrEmptySchema;
function falseSchemaError(it, overrideAllErrors) {
const { gen, data } = it;
const cxt = {
gen,
keyword: "false schema",
data,
schema: false,
schemaCode: false,
schemaValue: false,
params: {},
it
};
(0, errors_1.reportError)(cxt, boolError, void 0, overrideAllErrors);
}
}
});
// node_modules/ajv/dist/compile/rules.js
var require_rules = __commonJS({
"node_modules/ajv/dist/compile/rules.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.getRules = exports2.isJSONType = void 0;
var _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"];
var jsonTypes = new Set(_jsonTypes);
function isJSONType(x) {
return typeof x == "string" && jsonTypes.has(x);
}
exports2.isJSONType = isJSONType;
function getRules() {
const groups = {
number: { type: "number", rules: [] },
string: { type: "string", rules: [] },
array: { type: "array", rules: [] },
object: { type: "object", rules: [] }
};
return {
types: { ...groups, integer: true, boolean: true, null: true },
rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object],
post: { rules: [] },
all: {},
keywords: {}
};
}
exports2.getRules = getRules;
}
});
// node_modules/ajv/dist/compile/validate/applicability.js
var require_applicability = __commonJS({
"node_modules/ajv/dist/compile/validate/applicability.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.shouldUseRule = exports2.shouldUseGroup = exports2.schemaHasRulesForType = void 0;
function schemaHasRulesForType({ schema, self }, type) {
const group = self.RULES.types[type];
return group && group !== true && shouldUseGroup(schema, group);
}
exports2.schemaHasRulesForType = schemaHasRulesForType;
function shouldUseGroup(schema, group) {
return group.rules.some((rule) => shouldUseRule(schema, rule));
}
exports2.shouldUseGroup = shouldUseGroup;
function shouldUseRule(schema, rule) {
var _a;
return schema[rule.keyword] !== void 0 || ((_a = rule.definition.implements) === null || _a === void 0 ? void 0 : _a.some((kwd) => schema[kwd] !== void 0));
}
exports2.shouldUseRule = shouldUseRule;
}
});
// node_modules/ajv/dist/compile/validate/dataType.js
var require_dataType = __commonJS({
"node_modules/ajv/dist/compile/validate/dataType.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.reportTypeError = exports2.checkDataTypes = exports2.checkDataType = exports2.coerceAndCheckDataType = exports2.getJSONTypes = exports2.getSchemaTypes = exports2.DataType = void 0;
var rules_1 = require_rules();
var applicability_1 = require_applicability();
var errors_1 = require_errors3();
var codegen_1 = require_codegen();
var util_1 = require_util();
var DataType;
(function(DataType2) {
DataType2[DataType2["Correct"] = 0] = "Correct";
DataType2[DataType2["Wrong"] = 1] = "Wrong";
})(DataType || (exports2.DataType = DataType = {}));
function getSchemaTypes(schema) {
const types = getJSONTypes(schema.type);
const hasNull = types.includes("null");
if (hasNull) {
if (schema.nullable === false)
throw new Error("type: null contradicts nullable: false");
} else {
if (!types.length && schema.nullable !== void 0) {
throw new Error('"nullable" cannot be used without "type"');
}
if (schema.nullable === true)
types.push("null");
}
return types;
}
exports2.getSchemaTypes = getSchemaTypes;
function getJSONTypes(ts) {
const types = Array.isArray(ts) ? ts : ts ? [ts] : [];
if (types.every(rules_1.isJSONType))
return types;
throw new Error("type must be JSONType or JSONType[]: " + types.join(","));
}
exports2.getJSONTypes = getJSONTypes;
function coerceAndCheckDataType(it, types) {
const { gen, data, opts } = it;
const coerceTo = coerceToTypes(types, opts.coerceTypes);
const checkTypes = types.length > 0 && !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0]));
if (checkTypes) {
const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong);
gen.if(wrongType, () => {
if (coerceTo.length)
coerceData(it, types, coerceTo);
else
reportTypeError(it);
});
}
return checkTypes;
}
exports2.coerceAndCheckDataType = coerceAndCheckDataType;
var COERCIBLE = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]);
function coerceToTypes(types, coerceTypes) {
return coerceTypes ? types.filter((t) => COERCIBLE.has(t) || coerceTypes === "array" && t === "array") : [];
}
function coerceData(it, types, coerceTo) {
const { gen, data, opts } = it;
const dataType = gen.let("dataType", (0, codegen_1._)`typeof ${data}`);
const coerced = gen.let("coerced", (0, codegen_1._)`undefined`);
if (opts.coerceTypes === "array") {
gen.if((0, codegen_1._)`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen.assign(data, (0, codegen_1._)`${data}[0]`).assign(dataType, (0, codegen_1._)`typeof ${data}`).if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data)));
}
gen.if((0, codegen_1._)`${coerced} !== undefined`);
for (const t of coerceTo) {
if (COERCIBLE.has(t) || t === "array" && opts.coerceTypes === "array") {
coerceSpecificType(t);
}
}
gen.else();
reportTypeError(it);
gen.endIf();
gen.if((0, codegen_1._)`${coerced} !== undefined`, () => {
gen.assign(data, coerced);
assignParentData(it, coerced);
});
function coerceSpecificType(t) {
switch (t) {
case "string":
gen.elseIf((0, codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced, (0, codegen_1._)`"" + ${data}`).elseIf((0, codegen_1._)`${data} === null`).assign(coerced, (0, codegen_1._)`""`);
return;
case "number":
gen.elseIf((0, codegen_1._)`${dataType} == "boolean" || ${data} === null
|| (${dataType} == "string" && ${data} && ${data} == +${data})`).assign(coerced, (0, codegen_1._)`+${data}`);
return;
case "integer":
gen.elseIf((0, codegen_1._)`${dataType} === "boolean" || ${data} === null
|| (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`).assign(coerced, (0, codegen_1._)`+${data}`);
return;
case "boolean":
gen.elseIf((0, codegen_1._)`${data} === "false" || ${data} === 0 || ${data} === null`).assign(coerced, false).elseIf((0, codegen_1._)`${data} === "true" || ${data} === 1`).assign(coerced, true);
return;
case "null":
gen.elseIf((0, codegen_1._)`${data} === "" || ${data} === 0 || ${data} === false`);
gen.assign(coerced, null);
return;
case "array":
gen.elseIf((0, codegen_1._)`${dataType} === "string" || ${dataType} === "number"
|| ${dataType} === "boolean" || ${data} === null`).assign(coerced, (0, codegen_1._)`[${data}]`);
}
}
}
function assignParentData({ gen, parentData, parentDataProperty }, expr) {
gen.if((0, codegen_1._)`${parentData} !== undefined`, () => gen.assign((0, codegen_1._)`${parentData}[${parentDataProperty}]`, expr));
}
function checkDataType(dataType, data, strictNums, correct = DataType.Correct) {
const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ;
let cond;
switch (dataType) {
case "null":
return (0, codegen_1._)`${data} ${EQ} null`;
case "array":
cond = (0, codegen_1._)`Array.isArray(${data})`;
break;
case "object":
cond = (0, codegen_1._)`${data} && typeof ${data} == "object" && !Array.isArray(${data})`;
break;
case "integer":
cond = numCond((0, codegen_1._)`!(${data} % 1) && !isNaN(${data})`);
break;
case "number":
cond = numCond();
break;
default:
return (0, codegen_1._)`typeof ${data} ${EQ} ${dataType}`;
}
return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond);
function numCond(_cond = codegen_1.nil) {
return (0, codegen_1.and)((0, codegen_1._)`typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._)`isFinite(${data})` : codegen_1.nil);
}
}
exports2.checkDataType = checkDataType;
function checkDataTypes(dataTypes, data, strictNums, correct) {
if (dataTypes.length === 1) {
return checkDataType(dataTypes[0], data, strictNums, correct);
}
let cond;
const types = (0, util_1.toHash)(dataTypes);
if (types.array && types.object) {
const notObj = (0, codegen_1._)`typeof ${data} != "object"`;
cond = types.null ? notObj : (0, codegen_1._)`!${data} || ${notObj}`;
delete types.null;
delete types.array;
delete types.object;
} else {
cond = codegen_1.nil;
}
if (types.number)
delete types.integer;
for (const t in types)
cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct));
return cond;
}
exports2.checkDataTypes = checkDataTypes;
var typeError = {
message: ({ schema }) => `must be ${schema}`,
params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._)`{type: ${schema}}` : (0, codegen_1._)`{type: ${schemaValue}}`
};
function reportTypeError(it) {
const cxt = getTypeErrorContext(it);
(0, errors_1.reportError)(cxt, typeError);
}
exports2.reportTypeError = reportTypeError;
function getTypeErrorContext(it) {
const { gen, data, schema } = it;
const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type");
return {
gen,
keyword: "type",
data,
schema: schema.type,
schemaCode,
schemaValue: schemaCode,
parentSchema: schema,
params: {},
it
};
}
}
});
// node_modules/ajv/dist/compile/validate/defaults.js
var require_defaults = __commonJS({
"node_modules/ajv/dist/compile/validate/defaults.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.assignDefaults = void 0;
var codegen_1 = require_codegen();
var util_1 = require_util();
function assignDefaults(it, ty) {
const { properties, items } = it.schema;
if (ty === "object" && properties) {
for (const key in properties) {
assignDefault(it, key, properties[key].default);
}
} else if (ty === "array" && Array.isArray(items)) {
items.forEach((sch, i) => assignDefault(it, i, sch.default));
}
}
exports2.assignDefaults = assignDefaults;
function assignDefault(it, prop, defaultValue) {
const { gen, compositeRule, data, opts } = it;
if (defaultValue === void 0)
return;
const childData = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(prop)}`;
if (compositeRule) {
(0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`);
return;
}
let condition = (0, codegen_1._)`${childData} === undefined`;
if (opts.useDefaults === "empty") {
condition = (0, codegen_1._)`${condition} || ${childData} === null || ${childData} === ""`;
}
gen.if(condition, (0, codegen_1._)`${childData} = ${(0, codegen_1.stringify)(defaultValue)}`);
}
}
});
// node_modules/ajv/dist/vocabularies/code.js
var require_code2 = __commonJS({
"node_modules/ajv/dist/vocabularies/code.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.validateUnion = exports2.validateArray = exports2.usePattern = exports2.callValidateCode = exports2.schemaProperties = exports2.allSchemaProperties = exports2.noPropertyInData = exports2.propertyInData = exports2.isOwnProperty = exports2.hasPropFunc = exports2.reportMissingProp = exports2.checkMissingProp = exports2.checkReportMissingProp = void 0;
var codegen_1 = require_codegen();
var util_1 = require_util();
var names_1 = require_names();
var util_2 = require_util();
function checkReportMissingProp(cxt, prop) {
const { gen, data, it } = cxt;
gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => {
cxt.setParams({ missingProperty: (0, codegen_1._)`${prop}` }, true);
cxt.error();
});
}
exports2.checkReportMissingProp = checkReportMissingProp;
function checkMissingProp({ gen, data, it: { opts } }, properties, missing) {
return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._)`${missing} = ${prop}`)));
}
exports2.checkMissingProp = checkMissingProp;
function reportMissingProp(cxt, missing) {
cxt.setParams({ missingProperty: missing }, true);
cxt.error();
}
exports2.reportMissingProp = reportMissingProp;
function hasPropFunc(gen) {
return gen.scopeValue("func", {
// eslint-disable-next-line @typescript-eslint/unbound-method
ref: Object.prototype.hasOwnProperty,
code: (0, codegen_1._)`Object.prototype.hasOwnProperty`
});
}
exports2.hasPropFunc = hasPropFunc;
function isOwnProperty(gen, data, property) {
return (0, codegen_1._)`${hasPropFunc(gen)}.call(${data}, ${property})`;
}
exports2.isOwnProperty = isOwnProperty;
function propertyInData(gen, data, property, ownProperties) {
const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} !== undefined`;
return ownProperties ? (0, codegen_1._)`${cond} && ${isOwnProperty(gen, data, property)}` : cond;
}
exports2.propertyInData = propertyInData;
function noPropertyInData(gen, data, property, ownProperties) {
const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} === undefined`;
return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond;
}
exports2.noPropertyInData = noPropertyInData;
function allSchemaProperties(schemaMap) {
return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : [];
}
exports2.allSchemaProperties = allSchemaProperties;
function schemaProperties(it, schemaMap) {
return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p]));
}
exports2.schemaProperties = schemaProperties;
function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) {
const dataAndSchema = passSchema ? (0, codegen_1._)`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data;
const valCxt = [
[names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)],
[names_1.default.parentData, it.parentData],
[names_1.default.parentDataProperty, it.parentDataProperty],
[names_1.default.rootData, names_1.default.rootData]
];
if (it.opts.dynamicRef)
valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]);
const args = (0, codegen_1._)`${dataAndSchema}, ${gen.object(...valCxt)}`;
return context !== codegen_1.nil ? (0, codegen_1._)`${func}.call(${context}, ${args})` : (0, codegen_1._)`${func}(${args})`;
}
exports2.callValidateCode = callValidateCode;
var newRegExp = (0, codegen_1._)`new RegExp`;
function usePattern({ gen, it: { opts } }, pattern) {
const u = opts.unicodeRegExp ? "u" : "";
const { regExp } = opts.code;
const rx = regExp(pattern, u);
return gen.scopeValue("pattern", {
key: rx.toString(),
ref: rx,
code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})`
});
}
exports2.usePattern = usePattern;
function validateArray(cxt) {
const { gen, data, keyword, it } = cxt;
const valid = gen.name("valid");
if (it.allErrors) {
const validArr = gen.let("valid", true);
validateItems(() => gen.assign(validArr, false));
return validArr;
}
gen.var(valid, true);
validateItems(() => gen.break());
return valid;
function validateItems(notValid) {
const len = gen.const("len", (0, codegen_1._)`${data}.length`);
gen.forRange("i", 0, len, (i) => {
cxt.subschema({
keyword,
dataProp: i,
dataPropType: util_1.Type.Num
}, valid);
gen.if((0, codegen_1.not)(valid), notValid);
});
}
}
exports2.validateArray = validateArray;
function validateUnion(cxt) {
const { gen, schema, keyword, it } = cxt;
if (!Array.isArray(schema))
throw new Error("ajv implementation error");
const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch));
if (alwaysValid && !it.opts.unevaluated)
return;
const valid = gen.let("valid", false);
const schValid = gen.name("_valid");
gen.block(() => schema.forEach((_sch, i) => {
const schCxt = cxt.subschema({
keyword,
schemaProp: i,
compositeRule: true
}, schValid);
gen.assign(valid, (0, codegen_1._)`${valid} || ${schValid}`);
const merged = cxt.mergeValidEvaluated(schCxt, schValid);
if (!merged)
gen.if((0, codegen_1.not)(valid));
}));
cxt.result(valid, () => cxt.reset(), () => cxt.error(true));
}
exports2.validateUnion = validateUnion;
}
});
// node_modules/ajv/dist/compile/validate/keyword.js
var require_keyword = __commonJS({
"node_modules/ajv/dist/compile/validate/keyword.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.validateKeywordUsage = exports2.validSchemaType = exports2.funcKeywordCode = exports2.macroKeywordCode = void 0;
var codegen_1 = require_codegen();
var names_1 = require_names();
var code_1 = require_code2();
var errors_1 = require_errors3();
function macroKeywordCode(cxt, def) {
const { gen, keyword, schema, parentSchema, it } = cxt;
const macroSchema = def.macro.call(it.self, schema, parentSchema, it);
const schemaRef = useKeyword(gen, keyword, macroSchema);
if (it.opts.validateSchema !== false)
it.self.validateSchema(macroSchema, true);
const valid = gen.name("valid");
cxt.subschema({
schema: macroSchema,
schemaPath: codegen_1.nil,
errSchemaPath: `${it.errSchemaPath}/${keyword}`,
topSchemaRef: schemaRef,
compositeRule: true
}, valid);
cxt.pass(valid, () => cxt.error(true));
}
exports2.macroKeywordCode = macroKeywordCode;
function funcKeywordCode(cxt, def) {
var _a;
const { gen, keyword, schema, parentSchema, $data, it } = cxt;
checkAsyncKeyword(it, def);
const validate = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate;
const validateRef = useKeyword(gen, keyword, validate);
const valid = gen.let("valid");
cxt.block$data(valid, validateKeyword);
cxt.ok((_a = def.valid) !== null && _a !== void 0 ? _a : valid);
function validateKeyword() {
if (def.errors === false) {
assignValid();
if (def.modifying)
modifyData(cxt);
reportErrs(() => cxt.error());
} else {
const ruleErrs = def.async ? validateAsync() : validateSync();
if (def.modifying)
modifyData(cxt);
reportErrs(() => addErrs(cxt, ruleErrs));
}
}
function validateAsync() {
const ruleErrs = gen.let("ruleErrs", null);
gen.try(() => assignValid((0, codegen_1._)`await `), (e) => gen.assign(valid, false).if((0, codegen_1._)`${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._)`${e}.errors`), () => gen.throw(e)));
return ruleErrs;
}
function validateSync() {
const validateErrs = (0, codegen_1._)`${validateRef}.errors`;
gen.assign(validateErrs, null);
assignValid(codegen_1.nil);
return validateErrs;
}
function assignValid(_await = def.async ? (0, codegen_1._)`await ` : codegen_1.nil) {
const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self;
const passSchema = !("compile" in def && !$data || def.schema === false);
gen.assign(valid, (0, codegen_1._)`${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying);
}
function reportErrs(errors) {
var _a2;
gen.if((0, codegen_1.not)((_a2 = def.valid) !== null && _a2 !== void 0 ? _a2 : valid), errors);
}
}
exports2.funcKeywordCode = funcKeywordCode;
function modifyData(cxt) {
const { gen, data, it } = cxt;
gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._)`${it.parentData}[${it.parentDataProperty}]`));
}
function addErrs(cxt, errs) {
const { gen } = cxt;
gen.if((0, codegen_1._)`Array.isArray(${errs})`, () => {
gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`).assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`);
(0, errors_1.extendErrors)(cxt);
}, () => cxt.error());
}
function checkAsyncKeyword({ schemaEnv }, def) {
if (def.async && !schemaEnv.$async)
throw new Error("async keyword in sync schema");
}
function useKeyword(gen, keyword, result) {
if (result === void 0)
throw new Error(`keyword "${keyword}" failed to compile`);
return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) });
}
function validSchemaType(schema, schemaType, allowUndefined = false) {
return !schemaType.length || schemaType.some((st) => st === "array" ? Array.isArray(schema) : st === "object" ? schema && typeof schema == "object" && !Array.isArray(schema) : typeof schema == st || allowUndefined && typeof schema == "undefined");
}
exports2.validSchemaType = validSchemaType;
function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) {
if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) {
throw new Error("ajv implementation error");
}
const deps = def.dependencies;
if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) {
throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`);
}
if (def.validateSchema) {
const valid = def.validateSchema(schema[keyword]);
if (!valid) {
const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` + self.errorsText(def.validateSchema.errors);
if (opts.validateSchema === "log")
self.logger.error(msg);
else
throw new Error(msg);
}
}
}
exports2.validateKeywordUsage = validateKeywordUsage;
}
});
// node_modules/ajv/dist/compile/validate/subschema.js
var require_subschema = __commonJS({
"node_modules/ajv/dist/compile/validate/subschema.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.extendSubschemaMode = exports2.extendSubschemaData = exports2.getSubschema = void 0;
var codegen_1 = require_codegen();
var util_1 = require_util();
function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) {
if (keyword !== void 0 && schema !== void 0) {
throw new Error('both "keyword" and "schema" passed, only one allowed');
}
if (keyword !== void 0) {
const sch = it.schema[keyword];
return schemaProp === void 0 ? {
schema: sch,
schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`,
errSchemaPath: `${it.errSchemaPath}/${keyword}`
} : {
schema: sch[schemaProp],
schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`,
errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}`
};
}
if (schema !== void 0) {
if (schemaPath === void 0 || errSchemaPath === void 0 || topSchemaRef === void 0) {
throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"');
}
return {
schema,
schemaPath,
topSchemaRef,
errSchemaPath
};
}
throw new Error('either "keyword" or "schema" must be passed');
}
exports2.getSubschema = getSubschema;
function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) {
if (data !== void 0 && dataProp !== void 0) {
throw new Error('both "data" and "dataProp" passed, only one allowed');
}
const { gen } = it;
if (dataProp !== void 0) {
const { errorPath, dataPathArr, opts } = it;
const nextData = gen.let("data", (0, codegen_1._)`${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true);
dataContextProps(nextData);
subschema.errorPath = (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`;
subschema.parentDataProperty = (0, codegen_1._)`${dataProp}`;
subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty];
}
if (data !== void 0) {
const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true);
dataContextProps(nextData);
if (propertyName !== void 0)
subschema.propertyName = propertyName;
}
if (dataTypes)
subschema.dataTypes = dataTypes;
function dataContextProps(_nextData) {
subschema.data = _nextData;
subschema.dataLevel = it.dataLevel + 1;
subschema.dataTypes = [];
it.definedProperties = /* @__PURE__ */ new Set();
subschema.parentData = it.data;
subschema.dataNames = [...it.dataNames, _nextData];
}
}
exports2.extendSubschemaData = extendSubschemaData;
function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) {
if (compositeRule !== void 0)
subschema.compositeRule = compositeRule;
if (createErrors !== void 0)
subschema.createErrors = createErrors;
if (allErrors !== void 0)
subschema.allErrors = allErrors;
subschema.jtdDiscriminator = jtdDiscriminator;
subschema.jtdMetadata = jtdMetadata;
}
exports2.extendSubschemaMode = extendSubschemaMode;
}
});
// node_modules/fast-deep-equal/index.js
var require_fast_deep_equal = __commonJS({
"node_modules/fast-deep-equal/index.js"(exports2, module2) {
"use strict";
module2.exports = function equal(a, b) {
if (a === b) return true;
if (a && b && typeof a == "object" && typeof b == "object") {
if (a.constructor !== b.constructor) return false;
var length, i, keys;
if (Array.isArray(a)) {
length = a.length;
if (length != b.length) return false;
for (i = length; i-- !== 0; )
if (!equal(a[i], b[i])) return false;
return true;
}
if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
keys = Object.keys(a);
length = keys.length;
if (length !== Object.keys(b).length) return false;
for (i = length; i-- !== 0; )
if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
for (i = length; i-- !== 0; ) {
var key = keys[i];
if (!equal(a[key], b[key])) return false;
}
return true;
}
return a !== a && b !== b;
};
}
});
// node_modules/json-schema-traverse/index.js
var require_json_schema_traverse = __commonJS({
"node_modules/json-schema-traverse/index.js"(exports2, module2) {
"use strict";
var traverse = module2.exports = function(schema, opts, cb) {
if (typeof opts == "function") {
cb = opts;
opts = {};
}
cb = opts.cb || cb;
var pre = typeof cb == "function" ? cb : cb.pre || function() {
};
var post = cb.post || function() {
};
_traverse(opts, pre, post, schema, "", schema);
};
traverse.keywords = {
additionalItems: true,
items: true,
contains: true,
additionalProperties: true,
propertyNames: true,
not: true,
if: true,
then: true,
else: true
};
traverse.arrayKeywords = {
items: true,
allOf: true,
anyOf: true,
oneOf: true
};
traverse.propsKeywords = {
$defs: true,
definitions: true,
properties: true,
patternProperties: true,
dependencies: true
};
traverse.skipKeywords = {
default: true,
enum: true,
const: true,
required: true,
maximum: true,
minimum: true,
exclusiveMaximum: true,
exclusiveMinimum: true,
multipleOf: true,
maxLength: true,
minLength: true,
pattern: true,
format: true,
maxItems: true,
minItems: true,
uniqueItems: true,
maxProperties: true,
minProperties: true
};
function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
if (schema && typeof schema == "object" && !Array.isArray(schema)) {
pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
for (var key in schema) {
var sch = schema[key];
if (Array.isArray(sch)) {
if (key in traverse.arrayKeywords) {
for (var i = 0; i < sch.length; i++)
_traverse(opts, pre, post, sch[i], jsonPtr + "/" + key + "/" + i, rootSchema, jsonPtr, key, schema, i);
}
} else if (key in traverse.propsKeywords) {
if (sch && typeof sch == "object") {
for (var prop in sch)
_traverse(opts, pre, post, sch[prop], jsonPtr + "/" + key + "/" + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop);
}
} else if (key in traverse.keywords || opts.allKeys && !(key in traverse.skipKeywords)) {
_traverse(opts, pre, post, sch, jsonPtr + "/" + key, rootSchema, jsonPtr, key, schema);
}
}
post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
}
}
function escapeJsonPtr(str) {
return str.replace(/~/g, "~0").replace(/\//g, "~1");
}
}
});
// node_modules/ajv/dist/compile/resolve.js
var require_resolve = __commonJS({
"node_modules/ajv/dist/compile/resolve.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.getSchemaRefs = exports2.resolveUrl = exports2.normalizeId = exports2._getFullPath = exports2.getFullPath = exports2.inlineRef = void 0;
var util_1 = require_util();
var equal = require_fast_deep_equal();
var traverse = require_json_schema_traverse();
var SIMPLE_INLINED = /* @__PURE__ */ new Set([
"type",
"format",
"pattern",
"maxLength",
"minLength",
"maxProperties",
"minProperties",
"maxItems",
"minItems",
"maximum",
"minimum",
"uniqueItems",
"multipleOf",
"required",
"enum",
"const"
]);
function inlineRef(schema, limit = true) {
if (typeof schema == "boolean")
return true;
if (limit === true)
return !hasRef(schema);
if (!limit)
return false;
return countKeys(schema) <= limit;
}
exports2.inlineRef = inlineRef;
var REF_KEYWORDS = /* @__PURE__ */ new Set([
"$ref",
"$recursiveRef",
"$recursiveAnchor",
"$dynamicRef",
"$dynamicAnchor"
]);
function hasRef(schema) {
for (const key in schema) {
if (REF_KEYWORDS.has(key))
return true;
const sch = schema[key];
if (Array.isArray(sch) && sch.some(hasRef))
return true;
if (typeof sch == "object" && hasRef(sch))
return true;
}
return false;
}
function countKeys(schema) {
let count = 0;
for (const key in schema) {
if (key === "$ref")
return Infinity;
count++;
if (SIMPLE_INLINED.has(key))
continue;
if (typeof schema[key] == "object") {
(0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch));
}
if (count === Infinity)
return Infinity;
}
return count;
}
function getFullPath(resolver, id = "", normalize) {
if (normalize !== false)
id = normalizeId(id);
const p = resolver.parse(id);
return _getFullPath(resolver, p);
}
exports2.getFullPath = getFullPath;
function _getFullPath(resolver, p) {
const serialized = resolver.serialize(p);
return serialized.split("#")[0] + "#";
}
exports2._getFullPath = _getFullPath;
var TRAILING_SLASH_HASH = /#\/?$/;
function normalizeId(id) {
return id ? id.replace(TRAILING_SLASH_HASH, "") : "";
}
exports2.normalizeId = normalizeId;
function resolveUrl(resolver, baseId, id) {
id = normalizeId(id);
return resolver.resolve(baseId, id);
}
exports2.resolveUrl = resolveUrl;
var ANCHOR = /^[a-z_][-a-z0-9._]*$/i;
function getSchemaRefs(schema, baseId) {
if (typeof schema == "boolean")
return {};
const { schemaId, uriResolver } = this.opts;
const schId = normalizeId(schema[schemaId] || baseId);
const baseIds = { "": schId };
const pathPrefix = getFullPath(uriResolver, schId, false);
const localRefs = {};
const schemaRefs = /* @__PURE__ */ new Set();
traverse(schema, { allKeys: true }, (sch, jsonPtr, _, parentJsonPtr) => {
if (parentJsonPtr === void 0)
return;
const fullPath = pathPrefix + jsonPtr;
let innerBaseId = baseIds[parentJsonPtr];
if (typeof sch[schemaId] == "string")
innerBaseId = addRef.call(this, sch[schemaId]);
addAnchor.call(this, sch.$anchor);
addAnchor.call(this, sch.$dynamicAnchor);
baseIds[jsonPtr] = innerBaseId;
function addRef(ref) {
const _resolve = this.opts.uriResolver.resolve;
ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref);
if (schemaRefs.has(ref))
throw ambiguos(ref);
schemaRefs.add(ref);
let schOrRef = this.refs[ref];
if (typeof schOrRef == "string")
schOrRef = this.refs[schOrRef];
if (typeof schOrRef == "object") {
checkAmbiguosRef(sch, schOrRef.schema, ref);
} else if (ref !== normalizeId(fullPath)) {
if (ref[0] === "#") {
checkAmbiguosRef(sch, localRefs[ref], ref);
localRefs[ref] = sch;
} else {
this.refs[ref] = fullPath;
}
}
return ref;
}
function addAnchor(anchor) {
if (typeof anchor == "string") {
if (!ANCHOR.test(anchor))
throw new Error(`invalid anchor "${anchor}"`);
addRef.call(this, `#${anchor}`);
}
}
});
return localRefs;
function checkAmbiguosRef(sch1, sch2, ref) {
if (sch2 !== void 0 && !equal(sch1, sch2))
throw ambiguos(ref);
}
function ambiguos(ref) {
return new Error(`reference "${ref}" resolves to more than one schema`);
}
}
exports2.getSchemaRefs = getSchemaRefs;
}
});
// node_modules/ajv/dist/compile/validate/index.js
var require_validate = __commonJS({
"node_modules/ajv/dist/compile/validate/index.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.getData = exports2.KeywordCxt = exports2.validateFunctionCode = void 0;
var boolSchema_1 = require_boolSchema();
var dataType_1 = require_dataType();
var applicability_1 = require_applicability();
var dataType_2 = require_dataType();
var defaults_1 = require_defaults();
var keyword_1 = require_keyword();
var subschema_1 = require_subschema();
var codegen_1 = require_codegen();
var names_1 = require_names();
var resolve_1 = require_resolve();
var util_1 = require_util();
var errors_1 = require_errors3();
function validateFunctionCode(it) {
if (isSchemaObj(it)) {
checkKeywords(it);
if (schemaCxtHasRules(it)) {
topSchemaObjCode(it);
return;
}
}
validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it));
}
exports2.validateFunctionCode = validateFunctionCode;
function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) {
if (opts.code.es5) {
gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => {
gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`);
destructureValCxtES5(gen, opts);
gen.code(body);
});
} else {
gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body));
}
}
function destructureValCxt(opts) {
return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`;
}
function destructureValCxtES5(gen, opts) {
gen.if(names_1.default.valCxt, () => {
gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`);
gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`);
gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`);
gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`);
if (opts.dynamicRef)
gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`);
}, () => {
gen.var(names_1.default.instancePath, (0, codegen_1._)`""`);
gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`);
gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`);
gen.var(names_1.default.rootData, names_1.default.data);
if (opts.dynamicRef)
gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`);
});
}
function topSchemaObjCode(it) {
const { schema, opts, gen } = it;
validateFunction(it, () => {
if (opts.$comment && schema.$comment)
commentKeyword(it);
checkNoDefault(it);
gen.let(names_1.default.vErrors, null);
gen.let(names_1.default.errors, 0);
if (opts.unevaluated)
resetEvaluated(it);
typeAndKeywords(it);
returnResults(it);
});
return;
}
function resetEvaluated(it) {
const { gen, validateName } = it;
it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`);
gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`));
gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`));
}
function funcSourceUrl(schema, opts) {
const schId = typeof schema == "object" && schema[opts.schemaId];
return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil;
}
function subschemaCode(it, valid) {
if (isSchemaObj(it)) {
checkKeywords(it);
if (schemaCxtHasRules(it)) {
subSchemaObjCode(it, valid);
return;
}
}
(0, boolSchema_1.boolOrEmptySchema)(it, valid);
}
function schemaCxtHasRules({ schema, self }) {
if (typeof schema == "boolean")
return !schema;
for (const key in schema)
if (self.RULES.all[key])
return true;
return false;
}
function isSchemaObj(it) {
return typeof it.schema != "boolean";
}
function subSchemaObjCode(it, valid) {
const { schema, gen, opts } = it;
if (opts.$comment && schema.$comment)
commentKeyword(it);
updateContext(it);
checkAsyncSchema(it);
const errsCount = gen.const("_errs", names_1.default.errors);
typeAndKeywords(it, errsCount);
gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`);
}
function checkKeywords(it) {
(0, util_1.checkUnknownRules)(it);
checkRefsAndKeywords(it);
}
function typeAndKeywords(it, errsCount) {
if (it.opts.jtd)
return schemaKeywords(it, [], false, errsCount);
const types = (0, dataType_1.getSchemaTypes)(it.schema);
const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types);
schemaKeywords(it, types, !checkedTypes, errsCount);
}
function checkRefsAndKeywords(it) {
const { schema, errSchemaPath, opts, self } = it;
if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) {
self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`);
}
}
function checkNoDefault(it) {
const { schema, opts } = it;
if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) {
(0, util_1.checkStrictMode)(it, "default is ignored in the schema root");
}
}
function updateContext(it) {
const schId = it.schema[it.opts.schemaId];
if (schId)
it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId);
}
function checkAsyncSchema(it) {
if (it.schema.$async && !it.schemaEnv.$async)
throw new Error("async schema in sync schema");
}
function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) {
const msg = schema.$comment;
if (opts.$comment === true) {
gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`);
} else if (typeof opts.$comment == "function") {
const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`;
const rootName = gen.scopeValue("root", { ref: schemaEnv.root });
gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`);
}
}
function returnResults(it) {
const { gen, schemaEnv, validateName, ValidationError, opts } = it;
if (schemaEnv.$async) {
gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`));
} else {
gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors);
if (opts.unevaluated)
assignEvaluated(it);
gen.return((0, codegen_1._)`${names_1.default.errors} === 0`);
}
}
function assignEvaluated({ gen, evaluated, props, items }) {
if (props instanceof codegen_1.Name)
gen.assign((0, codegen_1._)`${evaluated}.props`, props);
if (items instanceof codegen_1.Name)
gen.assign((0, codegen_1._)`${evaluated}.items`, items);
}
function schemaKeywords(it, types, typeErrors, errsCount) {
const { gen, schema, data, allErrors, opts, self } = it;
const { RULES } = self;
if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) {
gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition));
return;
}
if (!opts.jtd)
checkStrictTypes(it, types);
gen.block(() => {
for (const group of RULES.rules)
groupKeywords(group);
groupKeywords(RULES.post);
});
function groupKeywords(group) {
if (!(0, applicability_1.shouldUseGroup)(schema, group))
return;
if (group.type) {
gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers));
iterateKeywords(it, group);
if (types.length === 1 && types[0] === group.type && typeErrors) {
gen.else();
(0, dataType_2.reportTypeError)(it);
}
gen.endIf();
} else {
iterateKeywords(it, group);
}
if (!allErrors)
gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`);
}
}
function iterateKeywords(it, group) {
const { gen, schema, opts: { useDefaults } } = it;
if (useDefaults)
(0, defaults_1.assignDefaults)(it, group.type);
gen.block(() => {
for (const rule of group.rules) {
if ((0, applicability_1.shouldUseRule)(schema, rule)) {
keywordCode(it, rule.keyword, rule.definition, group.type);
}
}
});
}
function checkStrictTypes(it, types) {
if (it.schemaEnv.meta || !it.opts.strictTypes)
return;
checkContextTypes(it, types);
if (!it.opts.allowUnionTypes)
checkMultipleTypes(it, types);
checkKeywordTypes(it, it.dataTypes);
}
function checkContextTypes(it, types) {
if (!types.length)
return;
if (!it.dataTypes.length) {
it.dataTypes = types;
return;
}
types.forEach((t) => {
if (!includesType(it.dataTypes, t)) {
strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`);
}
});
narrowSchemaTypes(it, types);
}
function checkMultipleTypes(it, ts) {
if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) {
strictTypesError(it, "use allowUnionTypes to allow union type keyword");
}
}
function checkKeywordTypes(it, ts) {
const rules = it.self.RULES.all;
for (const keyword in rules) {
const rule = rules[keyword];
if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) {
const { type } = rule.definition;
if (type.length && !type.some((t) => hasApplicableType(ts, t))) {
strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`);
}
}
}
}
function hasApplicableType(schTs, kwdT) {
return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer");
}
function includesType(ts, t) {
return ts.includes(t) || t === "integer" && ts.includes("number");
}
function narrowSchemaTypes(it, withTypes) {
const ts = [];
for (const t of it.dataTypes) {
if (includesType(withTypes, t))
ts.push(t);
else if (withTypes.includes("integer") && t === "number")
ts.push("integer");
}
it.dataTypes = ts;
}
function strictTypesError(it, msg) {
const schemaPath = it.schemaEnv.baseId + it.errSchemaPath;
msg += ` at "${schemaPath}" (strictTypes)`;
(0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes);
}
var KeywordCxt = class {
constructor(it, def, keyword) {
(0, keyword_1.validateKeywordUsage)(it, def, keyword);
this.gen = it.gen;
this.allErrors = it.allErrors;
this.keyword = keyword;
this.data = it.data;
this.schema = it.schema[keyword];
this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data;
this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data);
this.schemaType = def.schemaType;
this.parentSchema = it.schema;
this.params = {};
this.it = it;
this.def = def;
if (this.$data) {
this.schemaCode = it.gen.const("vSchema", getData(this.$data, it));
} else {
this.schemaCode = this.schemaValue;
if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) {
throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`);
}
}
if ("code" in def ? def.trackErrors : def.errors !== false) {
this.errsCount = it.gen.const("_errs", names_1.default.errors);
}
}
result(condition, successAction, failAction) {
this.failResult((0, codegen_1.not)(condition), successAction, failAction);
}
failResult(condition, successAction, failAction) {
this.gen.if(condition);
if (failAction)
failAction();
else
this.error();
if (successAction) {
this.gen.else();
successAction();
if (this.allErrors)
this.gen.endIf();
} else {
if (this.allErrors)
this.gen.endIf();
else
this.gen.else();
}
}
pass(condition, failAction) {
this.failResult((0, codegen_1.not)(condition), void 0, failAction);
}
fail(condition) {
if (condition === void 0) {
this.error();
if (!this.allErrors)
this.gen.if(false);
return;
}
this.gen.if(condition);
this.error();
if (this.allErrors)
this.gen.endIf();
else
this.gen.else();
}
fail$data(condition) {
if (!this.$data)
return this.fail(condition);
const { schemaCode } = this;
this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`);
}
error(append, errorParams, errorPaths) {
if (errorParams) {
this.setParams(errorParams);
this._error(append, errorPaths);
this.setParams({});
return;
}
this._error(append, errorPaths);
}
_error(append, errorPaths) {
;
(append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths);
}
$dataError() {
(0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError);
}
reset() {
if (this.errsCount === void 0)
throw new Error('add "trackErrors" to keyword definition');
(0, errors_1.resetErrorsCount)(this.gen, this.errsCount);
}
ok(cond) {
if (!this.allErrors)
this.gen.if(cond);
}
setParams(obj, assign) {
if (assign)
Object.assign(this.params, obj);
else
this.params = obj;
}
block$data(valid, codeBlock, $dataValid = codegen_1.nil) {
this.gen.block(() => {
this.check$data(valid, $dataValid);
codeBlock();
});
}
check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) {
if (!this.$data)
return;
const { gen, schemaCode, schemaType, def } = this;
gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid));
if (valid !== codegen_1.nil)
gen.assign(valid, true);
if (schemaType.length || def.validateSchema) {
gen.elseIf(this.invalid$data());
this.$dataError();
if (valid !== codegen_1.nil)
gen.assign(valid, false);
}
gen.else();
}
invalid$data() {
const { gen, schemaCode, schemaType, def, it } = this;
return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema());
function wrong$DataType() {
if (schemaType.length) {
if (!(schemaCode instanceof codegen_1.Name))
throw new Error("ajv implementation error");
const st = Array.isArray(schemaType) ? schemaType : [schemaType];
return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`;
}
return codegen_1.nil;
}
function invalid$DataSchema() {
if (def.validateSchema) {
const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema });
return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`;
}
return codegen_1.nil;
}
}
subschema(appl, valid) {
const subschema = (0, subschema_1.getSubschema)(this.it, appl);
(0, subschema_1.extendSubschemaData)(subschema, this.it, appl);
(0, subschema_1.extendSubschemaMode)(subschema, appl);
const nextContext = { ...this.it, ...subschema, items: void 0, props: void 0 };
subschemaCode(nextContext, valid);
return nextContext;
}
mergeEvaluated(schemaCxt, toName) {
const { it, gen } = this;
if (!it.opts.unevaluated)
return;
if (it.props !== true && schemaCxt.props !== void 0) {
it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName);
}
if (it.items !== true && schemaCxt.items !== void 0) {
it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName);
}
}
mergeValidEvaluated(schemaCxt, valid) {
const { it, gen } = this;
if (it.opts.unevaluated && (it.props !== true || it.items !== true)) {
gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name));
return true;
}
}
};
exports2.KeywordCxt = KeywordCxt;
function keywordCode(it, keyword, def, ruleType) {
const cxt = new KeywordCxt(it, def, keyword);
if ("code" in def) {
def.code(cxt, ruleType);
} else if (cxt.$data && def.validate) {
(0, keyword_1.funcKeywordCode)(cxt, def);
} else if ("macro" in def) {
(0, keyword_1.macroKeywordCode)(cxt, def);
} else if (def.compile || def.validate) {
(0, keyword_1.funcKeywordCode)(cxt, def);
}
}
var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;
var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
function getData($data, { dataLevel, dataNames, dataPathArr }) {
let jsonPointer;
let data;
if ($data === "")
return names_1.default.rootData;
if ($data[0] === "/") {
if (!JSON_POINTER.test($data))
throw new Error(`Invalid JSON-pointer: ${$data}`);
jsonPointer = $data;
data = names_1.default.rootData;
} else {
const matches = RELATIVE_JSON_POINTER.exec($data);
if (!matches)
throw new Error(`Invalid JSON-pointer: ${$data}`);
const up = +matches[1];
jsonPointer = matches[2];
if (jsonPointer === "#") {
if (up >= dataLevel)
throw new Error(errorMsg("property/index", up));
return dataPathArr[dataLevel - up];
}
if (up > dataLevel)
throw new Error(errorMsg("data", up));
data = dataNames[dataLevel - up];
if (!jsonPointer)
return data;
}
let expr = data;
const segments = jsonPointer.split("/");
for (const segment of segments) {
if (segment) {
data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`;
expr = (0, codegen_1._)`${expr} && ${data}`;
}
}
return expr;
function errorMsg(pointerType, up) {
return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`;
}
}
exports2.getData = getData;
}
});
// node_modules/ajv/dist/runtime/validation_error.js
var require_validation_error = __commonJS({
"node_modules/ajv/dist/runtime/validation_error.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var ValidationError = class extends Error {
constructor(errors) {
super("validation failed");
this.errors = errors;
this.ajv = this.validation = true;
}
};
exports2.default = ValidationError;
}
});
// node_modules/ajv/dist/compile/ref_error.js
var require_ref_error = __commonJS({
"node_modules/ajv/dist/compile/ref_error.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var resolve_1 = require_resolve();
var MissingRefError = class extends Error {
constructor(resolver, baseId, ref, msg) {
super(msg || `can't resolve reference ${ref} from id ${baseId}`);
this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref);
this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef));
}
};
exports2.default = MissingRefError;
}
});
// node_modules/ajv/dist/compile/index.js
var require_compile = __commonJS({
"node_modules/ajv/dist/compile/index.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.resolveSchema = exports2.getCompilingSchema = exports2.resolveRef = exports2.compileSchema = exports2.SchemaEnv = void 0;
var codegen_1 = require_codegen();
var validation_error_1 = require_validation_error();
var names_1 = require_names();
var resolve_1 = require_resolve();
var util_1 = require_util();
var validate_1 = require_validate();
var SchemaEnv = class {
constructor(env) {
var _a;
this.refs = {};
this.dynamicAnchors = {};
let schema;
if (typeof env.schema == "object")
schema = env.schema;
this.schema = env.schema;
this.schemaId = env.schemaId;
this.root = env.root || this;
this.baseId = (_a = env.baseId) !== null && _a !== void 0 ? _a : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]);
this.schemaPath = env.schemaPath;
this.localRefs = env.localRefs;
this.meta = env.meta;
this.$async = schema === null || schema === void 0 ? void 0 : schema.$async;
this.refs = {};
}
};
exports2.SchemaEnv = SchemaEnv;
function compileSchema(sch) {
const _sch = getCompilingSchema.call(this, sch);
if (_sch)
return _sch;
const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId);
const { es5, lines } = this.opts.code;
const { ownProperties } = this.opts;
const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties });
let _ValidationError;
if (sch.$async) {
_ValidationError = gen.scopeValue("Error", {
ref: validation_error_1.default,
code: (0, codegen_1._)`require("ajv/dist/runtime/validation_error").default`
});
}
const validateName = gen.scopeName("validate");
sch.validateName = validateName;
const schemaCxt = {
gen,
allErrors: this.opts.allErrors,
data: names_1.default.data,
parentData: names_1.default.parentData,
parentDataProperty: names_1.default.parentDataProperty,
dataNames: [names_1.default.data],
dataPathArr: [codegen_1.nil],
// TODO can its length be used as dataLevel if nil is removed?
dataLevel: 0,
dataTypes: [],
definedProperties: /* @__PURE__ */ new Set(),
topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) } : { ref: sch.schema }),
validateName,
ValidationError: _ValidationError,
schema: sch.schema,
schemaEnv: sch,
rootId,
baseId: sch.baseId || rootId,
schemaPath: codegen_1.nil,
errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"),
errorPath: (0, codegen_1._)`""`,
opts: this.opts,
self: this
};
let sourceCode;
try {
this._compilations.add(sch);
(0, validate_1.validateFunctionCode)(schemaCxt);
gen.optimize(this.opts.code.optimize);
const validateCode = gen.toString();
sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`;
if (this.opts.code.process)
sourceCode = this.opts.code.process(sourceCode, sch);
const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode);
const validate = makeValidate(this, this.scope.get());
this.scope.value(validateName, { ref: validate });
validate.errors = null;
validate.schema = sch.schema;
validate.schemaEnv = sch;
if (sch.$async)
validate.$async = true;
if (this.opts.code.source === true) {
validate.source = { validateName, validateCode, scopeValues: gen._values };
}
if (this.opts.unevaluated) {
const { props, items } = schemaCxt;
validate.evaluated = {
props: props instanceof codegen_1.Name ? void 0 : props,
items: items instanceof codegen_1.Name ? void 0 : items,
dynamicProps: props instanceof codegen_1.Name,
dynamicItems: items instanceof codegen_1.Name
};
if (validate.source)
validate.source.evaluated = (0, codegen_1.stringify)(validate.evaluated);
}
sch.validate = validate;
return sch;
} catch (e) {
delete sch.validate;
delete sch.validateName;
if (sourceCode)
this.logger.error("Error compiling schema, function code:", sourceCode);
throw e;
} finally {
this._compilations.delete(sch);
}
}
exports2.compileSchema = compileSchema;
function resolveRef(root, baseId, ref) {
var _a;
ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref);
const schOrFunc = root.refs[ref];
if (schOrFunc)
return schOrFunc;
let _sch = resolve.call(this, root, ref);
if (_sch === void 0) {
const schema = (_a = root.localRefs) === null || _a === void 0 ? void 0 : _a[ref];
const { schemaId } = this.opts;
if (schema)
_sch = new SchemaEnv({ schema, schemaId, root, baseId });
}
if (_sch === void 0)
return;
return root.refs[ref] = inlineOrCompile.call(this, _sch);
}
exports2.resolveRef = resolveRef;
function inlineOrCompile(sch) {
if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs))
return sch.schema;
return sch.validate ? sch : compileSchema.call(this, sch);
}
function getCompilingSchema(schEnv) {
for (const sch of this._compilations) {
if (sameSchemaEnv(sch, schEnv))
return sch;
}
}
exports2.getCompilingSchema = getCompilingSchema;
function sameSchemaEnv(s1, s2) {
return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
}
function resolve(root, ref) {
let sch;
while (typeof (sch = this.refs[ref]) == "string")
ref = sch;
return sch || this.schemas[ref] || resolveSchema.call(this, root, ref);
}
function resolveSchema(root, ref) {
const p = this.opts.uriResolver.parse(ref);
const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p);
let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, void 0);
if (Object.keys(root.schema).length > 0 && refPath === baseId) {
return getJsonPointer.call(this, p, root);
}
const id = (0, resolve_1.normalizeId)(refPath);
const schOrRef = this.refs[id] || this.schemas[id];
if (typeof schOrRef == "string") {
const sch = resolveSchema.call(this, root, schOrRef);
if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object")
return;
return getJsonPointer.call(this, p, sch);
}
if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object")
return;
if (!schOrRef.validate)
compileSchema.call(this, schOrRef);
if (id === (0, resolve_1.normalizeId)(ref)) {
const { schema } = schOrRef;
const { schemaId } = this.opts;
const schId = schema[schemaId];
if (schId)
baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId);
return new SchemaEnv({ schema, schemaId, root, baseId });
}
return getJsonPointer.call(this, p, schOrRef);
}
exports2.resolveSchema = resolveSchema;
var PREVENT_SCOPE_CHANGE = /* @__PURE__ */ new Set([
"properties",
"patternProperties",
"enum",
"dependencies",
"definitions"
]);
function getJsonPointer(parsedRef, { baseId, schema, root }) {
var _a;
if (((_a = parsedRef.fragment) === null || _a === void 0 ? void 0 : _a[0]) !== "/")
return;
for (const part of parsedRef.fragment.slice(1).split("/")) {
if (typeof schema === "boolean")
return;
const partSchema = schema[(0, util_1.unescapeFragment)(part)];
if (partSchema === void 0)
return;
schema = partSchema;
const schId = typeof schema === "object" && schema[this.opts.schemaId];
if (!PREVENT_SCOPE_CHANGE.has(part) && schId) {
baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId);
}
}
let env;
if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) {
const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref);
env = resolveSchema.call(this, root, $ref);
}
const { schemaId } = this.opts;
env = env || new SchemaEnv({ schema, schemaId, root, baseId });
if (env.schema !== env.root.schema)
return env;
return void 0;
}
}
});
// node_modules/ajv/dist/refs/data.json
var require_data = __commonJS({
"node_modules/ajv/dist/refs/data.json"(exports2, module2) {
module2.exports = {
$id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",
description: "Meta-schema for $data reference (JSON AnySchema extension proposal)",
type: "object",
required: ["$data"],
properties: {
$data: {
type: "string",
anyOf: [{ format: "relative-json-pointer" }, { format: "json-pointer" }]
}
},
additionalProperties: false
};
}
});
// node_modules/fast-uri/lib/utils.js
var require_utils = __commonJS({
"node_modules/fast-uri/lib/utils.js"(exports2, module2) {
"use strict";
var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu);
var isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);
var isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu);
var isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu);
var isPathCharacter = RegExp.prototype.test.bind(/^[\da-z\-._~!$&'()*+,;=:@/]$/iu);
function stringArrayToHexStripped(input) {
let acc = "";
let code = 0;
let i = 0;
for (i = 0; i < input.length; i++) {
code = input[i].charCodeAt(0);
if (code === 48) {
continue;
}
if (!(code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102)) {
return "";
}
acc += input[i];
break;
}
for (i += 1; i < input.length; i++) {
code = input[i].charCodeAt(0);
if (!(code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102)) {
return "";
}
acc += input[i];
}
return acc;
}
var nonSimpleDomain = RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u);
function consumeIsZone(buffer) {
buffer.length = 0;
return true;
}
function consumeHextets(buffer, address, output) {
if (buffer.length) {
const hex = stringArrayToHexStripped(buffer);
if (hex !== "") {
address.push(hex);
} else {
output.error = true;
return false;
}
buffer.length = 0;
}
return true;
}
function getIPV6(input) {
let tokenCount = 0;
const output = { error: false, address: "", zone: "" };
const address = [];
const buffer = [];
let endipv6Encountered = false;
let endIpv6 = false;
let consume = consumeHextets;
for (let i = 0; i < input.length; i++) {
const cursor = input[i];
if (cursor === "[" || cursor === "]") {
continue;
}
if (cursor === ":") {
if (endipv6Encountered === true) {
endIpv6 = true;
}
if (!consume(buffer, address, output)) {
break;
}
if (++tokenCount > 7) {
output.error = true;
break;
}
if (i > 0 && input[i - 1] === ":") {
endipv6Encountered = true;
}
address.push(":");
continue;
} else if (cursor === "%") {
if (!consume(buffer, address, output)) {
break;
}
consume = consumeIsZone;
} else {
buffer.push(cursor);
continue;
}
}
if (buffer.length) {
if (consume === consumeIsZone) {
output.zone = buffer.join("");
} else if (endIpv6) {
address.push(buffer.join(""));
} else {
address.push(stringArrayToHexStripped(buffer));
}
}
output.address = address.join("");
return output;
}
function normalizeIPv6(host) {
if (findToken(host, ":") < 2) {
return { host, isIPV6: false };
}
const ipv6 = getIPV6(host);
if (!ipv6.error) {
let newHost = ipv6.address;
let escapedHost = ipv6.address;
if (ipv6.zone) {
newHost += "%" + ipv6.zone;
escapedHost += "%25" + ipv6.zone;
}
return { host: newHost, isIPV6: true, escapedHost };
} else {
return { host, isIPV6: false };
}
}
function findToken(str, token) {
let ind = 0;
for (let i = 0; i < str.length; i++) {
if (str[i] === token) ind++;
}
return ind;
}
function removeDotSegments(path) {
let input = path;
const output = [];
let nextSlash = -1;
let len = 0;
while (len = input.length) {
if (len === 1) {
if (input === ".") {
break;
} else if (input === "/") {
output.push("/");
break;
} else {
output.push(input);
break;
}
} else if (len === 2) {
if (input[0] === ".") {
if (input[1] === ".") {
break;
} else if (input[1] === "/") {
input = input.slice(2);
continue;
}
} else if (input[0] === "/") {
if (input[1] === "." || input[1] === "/") {
output.push("/");
break;
}
}
} else if (len === 3) {
if (input === "/..") {
if (output.length !== 0) {
output.pop();
}
output.push("/");
break;
}
}
if (input[0] === ".") {
if (input[1] === ".") {
if (input[2] === "/") {
input = input.slice(3);
continue;
}
} else if (input[1] === "/") {
input = input.slice(2);
continue;
}
} else if (input[0] === "/") {
if (input[1] === ".") {
if (input[2] === "/") {
input = input.slice(2);
continue;
} else if (input[2] === ".") {
if (input[3] === "/") {
input = input.slice(3);
if (output.length !== 0) {
output.pop();
}
continue;
}
}
}
}
if ((nextSlash = input.indexOf("/", 1)) === -1) {
output.push(input);
break;
} else {
output.push(input.slice(0, nextSlash));
input = input.slice(nextSlash);
}
}
return output.join("");
}
var HOST_DELIMS = { "@": "%40", "/": "%2F", "?": "%3F", "#": "%23", ":": "%3A" };
var HOST_DELIM_RE = /[@/?#:]/g;
var HOST_DELIM_NO_COLON_RE = /[@/?#]/g;
function reescapeHostDelimiters(host, isIP) {
const re = isIP ? HOST_DELIM_NO_COLON_RE : HOST_DELIM_RE;
re.lastIndex = 0;
return host.replace(re, (ch) => HOST_DELIMS[ch]);
}
function normalizePercentEncoding(input, decodeUnreserved = false) {
if (input.indexOf("%") === -1) {
return input;
}
let output = "";
for (let i = 0; i < input.length; i++) {
if (input[i] === "%" && i + 2 < input.length) {
const hex = input.slice(i + 1, i + 3);
if (isHexPair(hex)) {
const normalizedHex = hex.toUpperCase();
const decoded = String.fromCharCode(parseInt(normalizedHex, 16));
if (decodeUnreserved && isUnreserved(decoded)) {
output += decoded;
} else {
output += "%" + normalizedHex;
}
i += 2;
continue;
}
}
output += input[i];
}
return output;
}
function normalizePathEncoding(input) {
let output = "";
for (let i = 0; i < input.length; i++) {
if (input[i] === "%" && i + 2 < input.length) {
const hex = input.slice(i + 1, i + 3);
if (isHexPair(hex)) {
const normalizedHex = hex.toUpperCase();
const decoded = String.fromCharCode(parseInt(normalizedHex, 16));
if (decoded !== "." && isUnreserved(decoded)) {
output += decoded;
} else {
output += "%" + normalizedHex;
}
i += 2;
continue;
}
}
if (isPathCharacter(input[i])) {
output += input[i];
} else {
output += escape(input[i]);
}
}
return output;
}
function escapePreservingEscapes(input) {
let output = "";
for (let i = 0; i < input.length; i++) {
if (input[i] === "%" && i + 2 < input.length) {
const hex = input.slice(i + 1, i + 3);
if (isHexPair(hex)) {
output += "%" + hex.toUpperCase();
i += 2;
continue;
}
}
output += escape(input[i]);
}
return output;
}
function recomposeAuthority(component) {
const uriTokens = [];
if (component.userinfo !== void 0) {
uriTokens.push(component.userinfo);
uriTokens.push("@");
}
if (component.host !== void 0) {
let host = unescape(component.host);
if (!isIPv4(host)) {
const ipV6res = normalizeIPv6(host);
if (ipV6res.isIPV6 === true) {
host = `[${ipV6res.escapedHost}]`;
} else {
host = reescapeHostDelimiters(host, false);
}
}
uriTokens.push(host);
}
if (typeof component.port === "number" || typeof component.port === "string") {
uriTokens.push(":");
uriTokens.push(String(component.port));
}
return uriTokens.length ? uriTokens.join("") : void 0;
}
module2.exports = {
nonSimpleDomain,
recomposeAuthority,
reescapeHostDelimiters,
normalizePercentEncoding,
normalizePathEncoding,
escapePreservingEscapes,
removeDotSegments,
isIPv4,
isUUID,
normalizeIPv6,
stringArrayToHexStripped
};
}
});
// node_modules/fast-uri/lib/schemes.js
var require_schemes = __commonJS({
"node_modules/fast-uri/lib/schemes.js"(exports2, module2) {
"use strict";
var { isUUID } = require_utils();
var URN_REG = /([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu;
var supportedSchemeNames = (
/** @type {const} */
[
"http",
"https",
"ws",
"wss",
"urn",
"urn:uuid"
]
);
function isValidSchemeName(name) {
return supportedSchemeNames.indexOf(
/** @type {*} */
name
) !== -1;
}
function wsIsSecure(wsComponent) {
if (wsComponent.secure === true) {
return true;
} else if (wsComponent.secure === false) {
return false;
} else if (wsComponent.scheme) {
return wsComponent.scheme.length === 3 && (wsComponent.scheme[0] === "w" || wsComponent.scheme[0] === "W") && (wsComponent.scheme[1] === "s" || wsComponent.scheme[1] === "S") && (wsComponent.scheme[2] === "s" || wsComponent.scheme[2] === "S");
} else {
return false;
}
}
function httpParse(component) {
if (!component.host) {
component.error = component.error || "HTTP URIs must have a host.";
}
return component;
}
function httpSerialize(component) {
const secure = String(component.scheme).toLowerCase() === "https";
if (component.port === (secure ? 443 : 80) || component.port === "") {
component.port = void 0;
}
if (!component.path) {
component.path = "/";
}
return component;
}
function wsParse(wsComponent) {
wsComponent.secure = wsIsSecure(wsComponent);
wsComponent.resourceName = (wsComponent.path || "/") + (wsComponent.query ? "?" + wsComponent.query : "");
wsComponent.path = void 0;
wsComponent.query = void 0;
return wsComponent;
}
function wsSerialize(wsComponent) {
if (wsComponent.port === (wsIsSecure(wsComponent) ? 443 : 80) || wsComponent.port === "") {
wsComponent.port = void 0;
}
if (typeof wsComponent.secure === "boolean") {
wsComponent.scheme = wsComponent.secure ? "wss" : "ws";
wsComponent.secure = void 0;
}
if (wsComponent.resourceName) {
const [path, query] = wsComponent.resourceName.split("?");
wsComponent.path = path && path !== "/" ? path : void 0;
wsComponent.query = query;
wsComponent.resourceName = void 0;
}
wsComponent.fragment = void 0;
return wsComponent;
}
function urnParse(urnComponent, options) {
if (!urnComponent.path) {
urnComponent.error = "URN can not be parsed";
return urnComponent;
}
const matches = urnComponent.path.match(URN_REG);
if (matches) {
const scheme = options.scheme || urnComponent.scheme || "urn";
urnComponent.nid = matches[1].toLowerCase();
urnComponent.nss = matches[2];
const urnScheme = `${scheme}:${options.nid || urnComponent.nid}`;
const schemeHandler = getSchemeHandler(urnScheme);
urnComponent.path = void 0;
if (schemeHandler) {
urnComponent = schemeHandler.parse(urnComponent, options);
}
} else {
urnComponent.error = urnComponent.error || "URN can not be parsed.";
}
return urnComponent;
}
function urnSerialize(urnComponent, options) {
if (urnComponent.nid === void 0) {
throw new Error("URN without nid cannot be serialized");
}
const scheme = options.scheme || urnComponent.scheme || "urn";
const nid = urnComponent.nid.toLowerCase();
const urnScheme = `${scheme}:${options.nid || nid}`;
const schemeHandler = getSchemeHandler(urnScheme);
if (schemeHandler) {
urnComponent = schemeHandler.serialize(urnComponent, options);
}
const uriComponent = urnComponent;
const nss = urnComponent.nss;
uriComponent.path = `${nid || options.nid}:${nss}`;
options.skipEscape = true;
return uriComponent;
}
function urnuuidParse(urnComponent, options) {
const uuidComponent = urnComponent;
uuidComponent.uuid = uuidComponent.nss;
uuidComponent.nss = void 0;
if (!options.tolerant && (!uuidComponent.uuid || !isUUID(uuidComponent.uuid))) {
uuidComponent.error = uuidComponent.error || "UUID is not valid.";
}
return uuidComponent;
}
function urnuuidSerialize(uuidComponent) {
const urnComponent = uuidComponent;
urnComponent.nss = (uuidComponent.uuid || "").toLowerCase();
return urnComponent;
}
var http = (
/** @type {SchemeHandler} */
{
scheme: "http",
domainHost: true,
parse: httpParse,
serialize: httpSerialize
}
);
var https = (
/** @type {SchemeHandler} */
{
scheme: "https",
domainHost: http.domainHost,
parse: httpParse,
serialize: httpSerialize
}
);
var ws = (
/** @type {SchemeHandler} */
{
scheme: "ws",
domainHost: true,
parse: wsParse,
serialize: wsSerialize
}
);
var wss = (
/** @type {SchemeHandler} */
{
scheme: "wss",
domainHost: ws.domainHost,
parse: ws.parse,
serialize: ws.serialize
}
);
var urn = (
/** @type {SchemeHandler} */
{
scheme: "urn",
parse: urnParse,
serialize: urnSerialize,
skipNormalize: true
}
);
var urnuuid = (
/** @type {SchemeHandler} */
{
scheme: "urn:uuid",
parse: urnuuidParse,
serialize: urnuuidSerialize,
skipNormalize: true
}
);
var SCHEMES = (
/** @type {Record<SchemeName, SchemeHandler>} */
{
http,
https,
ws,
wss,
urn,
"urn:uuid": urnuuid
}
);
Object.setPrototypeOf(SCHEMES, null);
function getSchemeHandler(scheme) {
return scheme && (SCHEMES[
/** @type {SchemeName} */
scheme
] || SCHEMES[
/** @type {SchemeName} */
scheme.toLowerCase()
]) || void 0;
}
module2.exports = {
wsIsSecure,
SCHEMES,
isValidSchemeName,
getSchemeHandler
};
}
});
// node_modules/fast-uri/index.js
var require_fast_uri = __commonJS({
"node_modules/fast-uri/index.js"(exports2, module2) {
"use strict";
var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, escapePreservingEscapes, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
var { SCHEMES, getSchemeHandler } = require_schemes();
function normalize(uri, options) {
if (typeof uri === "string") {
uri = /** @type {T} */
normalizeString(uri, options);
} else if (typeof uri === "object") {
uri = /** @type {T} */
parse(serialize(uri, options), options);
}
return uri;
}
function resolve(baseURI, relativeURI, options) {
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
const resolved = resolveComponent(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true);
schemelessOptions.skipEscape = true;
return serialize(resolved, schemelessOptions);
}
function resolveComponent(base, relative, options, skipNormalization) {
const target = {};
if (!skipNormalization) {
base = parse(serialize(base, options), options);
relative = parse(serialize(relative, options), options);
}
options = options || {};
if (!options.tolerant && relative.scheme) {
target.scheme = relative.scheme;
target.userinfo = relative.userinfo;
target.host = relative.host;
target.port = relative.port;
target.path = removeDotSegments(relative.path || "");
target.query = relative.query;
} else {
if (relative.userinfo !== void 0 || relative.host !== void 0 || relative.port !== void 0) {
target.userinfo = relative.userinfo;
target.host = relative.host;
target.port = relative.port;
target.path = removeDotSegments(relative.path || "");
target.query = relative.query;
} else {
if (!relative.path) {
target.path = base.path;
if (relative.query !== void 0) {
target.query = relative.query;
} else {
target.query = base.query;
}
} else {
if (relative.path[0] === "/") {
target.path = removeDotSegments(relative.path);
} else {
if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) {
target.path = "/" + relative.path;
} else if (!base.path) {
target.path = relative.path;
} else {
target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
}
target.path = removeDotSegments(target.path);
}
target.query = relative.query;
}
target.userinfo = base.userinfo;
target.host = base.host;
target.port = base.port;
}
target.scheme = base.scheme;
}
target.fragment = relative.fragment;
return target;
}
function equal(uriA, uriB, options) {
const normalizedA = normalizeComparableURI(uriA, options);
const normalizedB = normalizeComparableURI(uriB, options);
return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA.toLowerCase() === normalizedB.toLowerCase();
}
function serialize(cmpts, opts) {
const component = {
host: cmpts.host,
scheme: cmpts.scheme,
userinfo: cmpts.userinfo,
port: cmpts.port,
path: cmpts.path,
query: cmpts.query,
nid: cmpts.nid,
nss: cmpts.nss,
uuid: cmpts.uuid,
fragment: cmpts.fragment,
reference: cmpts.reference,
resourceName: cmpts.resourceName,
secure: cmpts.secure,
error: ""
};
const options = Object.assign({}, opts);
const uriTokens = [];
const schemeHandler = getSchemeHandler(options.scheme || component.scheme);
if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
if (component.path !== void 0) {
if (!options.skipEscape) {
component.path = escapePreservingEscapes(component.path);
if (component.scheme !== void 0) {
component.path = component.path.split("%3A").join(":");
}
} else {
component.path = normalizePercentEncoding(component.path);
}
}
if (options.reference !== "suffix" && component.scheme) {
uriTokens.push(component.scheme, ":");
}
const authority = recomposeAuthority(component);
if (authority !== void 0) {
if (options.reference !== "suffix") {
uriTokens.push("//");
}
uriTokens.push(authority);
if (component.path && component.path[0] !== "/") {
uriTokens.push("/");
}
}
if (component.path !== void 0) {
let s = component.path;
if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
s = removeDotSegments(s);
}
if (authority === void 0 && s[0] === "/" && s[1] === "/") {
s = "/%2F" + s.slice(2);
}
uriTokens.push(s);
}
if (component.query !== void 0) {
uriTokens.push("?", component.query);
}
if (component.fragment !== void 0) {
uriTokens.push("#", component.fragment);
}
return uriTokens.join("");
}
var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;
function getParseError(parsed, matches) {
if (matches[2] !== void 0 && parsed.path && parsed.path[0] !== "/") {
return 'URI path must start with "/" when authority is present.';
}
if (typeof parsed.port === "number" && (parsed.port < 0 || parsed.port > 65535)) {
return "URI port is malformed.";
}
return void 0;
}
function parseWithStatus(uri, opts) {
const options = Object.assign({}, opts);
const parsed = {
scheme: void 0,
userinfo: void 0,
host: "",
port: void 0,
path: "",
query: void 0,
fragment: void 0
};
let malformedAuthorityOrPort = false;
let isIP = false;
if (options.reference === "suffix") {
if (options.scheme) {
uri = options.scheme + ":" + uri;
} else {
uri = "//" + uri;
}
}
const matches = uri.match(URI_PARSE);
if (matches) {
parsed.scheme = matches[1];
parsed.userinfo = matches[3];
parsed.host = matches[4];
parsed.port = parseInt(matches[5], 10);
parsed.path = matches[6] || "";
parsed.query = matches[7];
parsed.fragment = matches[8];
if (isNaN(parsed.port)) {
parsed.port = matches[5];
}
const parseError = getParseError(parsed, matches);
if (parseError !== void 0) {
parsed.error = parsed.error || parseError;
malformedAuthorityOrPort = true;
}
if (parsed.host) {
const ipv4result = isIPv4(parsed.host);
if (ipv4result === false) {
const ipv6result = normalizeIPv6(parsed.host);
parsed.host = ipv6result.host.toLowerCase();
isIP = ipv6result.isIPV6;
} else {
isIP = true;
}
}
if (parsed.scheme === void 0 && parsed.userinfo === void 0 && parsed.host === void 0 && parsed.port === void 0 && parsed.query === void 0 && !parsed.path) {
parsed.reference = "same-document";
} else if (parsed.scheme === void 0) {
parsed.reference = "relative";
} else if (parsed.fragment === void 0) {
parsed.reference = "absolute";
} else {
parsed.reference = "uri";
}
if (options.reference && options.reference !== "suffix" && options.reference !== parsed.reference) {
parsed.error = parsed.error || "URI is not a " + options.reference + " reference.";
}
const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme);
if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
if (parsed.host && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
try {
parsed.host = URL.domainToASCII(parsed.host.toLowerCase());
} catch (e) {
parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
}
}
}
if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
if (uri.indexOf("%") !== -1) {
if (parsed.scheme !== void 0) {
parsed.scheme = unescape(parsed.scheme);
}
if (parsed.host !== void 0) {
parsed.host = reescapeHostDelimiters(unescape(parsed.host), isIP);
}
}
if (parsed.path) {
parsed.path = normalizePathEncoding(parsed.path);
}
if (parsed.fragment) {
try {
parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment));
} catch {
parsed.error = parsed.error || "URI malformed";
}
}
}
if (schemeHandler && schemeHandler.parse) {
schemeHandler.parse(parsed, options);
}
} else {
parsed.error = parsed.error || "URI can not be parsed.";
}
return { parsed, malformedAuthorityOrPort };
}
function parse(uri, opts) {
return parseWithStatus(uri, opts).parsed;
}
function normalizeString(uri, opts) {
return normalizeStringWithStatus(uri, opts).normalized;
}
function normalizeStringWithStatus(uri, opts) {
const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts);
return {
normalized: malformedAuthorityOrPort ? uri : serialize(parsed, opts),
malformedAuthorityOrPort
};
}
function normalizeComparableURI(uri, opts) {
if (typeof uri === "string") {
const { normalized, malformedAuthorityOrPort } = normalizeStringWithStatus(uri, opts);
return malformedAuthorityOrPort ? void 0 : normalized;
}
if (typeof uri === "object") {
return serialize(uri, opts);
}
}
var fastUri = {
SCHEMES,
normalize,
resolve,
resolveComponent,
equal,
serialize,
parse
};
module2.exports = fastUri;
module2.exports.default = fastUri;
module2.exports.fastUri = fastUri;
}
});
// node_modules/ajv/dist/runtime/uri.js
var require_uri = __commonJS({
"node_modules/ajv/dist/runtime/uri.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var uri = require_fast_uri();
uri.code = 'require("ajv/dist/runtime/uri").default';
exports2.default = uri;
}
});
// node_modules/ajv/dist/core.js
var require_core2 = __commonJS({
"node_modules/ajv/dist/core.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.CodeGen = exports2.Name = exports2.nil = exports2.stringify = exports2.str = exports2._ = exports2.KeywordCxt = void 0;
var validate_1 = require_validate();
Object.defineProperty(exports2, "KeywordCxt", { enumerable: true, get: function() {
return validate_1.KeywordCxt;
} });
var codegen_1 = require_codegen();
Object.defineProperty(exports2, "_", { enumerable: true, get: function() {
return codegen_1._;
} });
Object.defineProperty(exports2, "str", { enumerable: true, get: function() {
return codegen_1.str;
} });
Object.defineProperty(exports2, "stringify", { enumerable: true, get: function() {
return codegen_1.stringify;
} });
Object.defineProperty(exports2, "nil", { enumerable: true, get: function() {
return codegen_1.nil;
} });
Object.defineProperty(exports2, "Name", { enumerable: true, get: function() {
return codegen_1.Name;
} });
Object.defineProperty(exports2, "CodeGen", { enumerable: true, get: function() {
return codegen_1.CodeGen;
} });
var validation_error_1 = require_validation_error();
var ref_error_1 = require_ref_error();
var rules_1 = require_rules();
var compile_1 = require_compile();
var codegen_2 = require_codegen();
var resolve_1 = require_resolve();
var dataType_1 = require_dataType();
var util_1 = require_util();
var $dataRefSchema = require_data();
var uri_1 = require_uri();
var defaultRegExp = (str, flags) => new RegExp(str, flags);
defaultRegExp.code = "new RegExp";
var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"];
var EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([
"validate",
"serialize",
"parse",
"wrapper",
"root",
"schema",
"keyword",
"pattern",
"formats",
"validate$data",
"func",
"obj",
"Error"
]);
var removedOptions = {
errorDataPath: "",
format: "`validateFormats: false` can be used instead.",
nullable: '"nullable" keyword is supported by default.',
jsonPointers: "Deprecated jsPropertySyntax can be used instead.",
extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.",
missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.",
processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`",
sourceCode: "Use option `code: {source: true}`",
strictDefaults: "It is default now, see option `strict`.",
strictKeywords: "It is default now, see option `strict`.",
uniqueItems: '"uniqueItems" keyword is always validated.',
unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).",
cache: "Map is used as cache, schema object as key.",
serialize: "Map is used as cache, schema object as key.",
ajvErrors: "It is default now."
};
var deprecatedOptions = {
ignoreKeywordsWithRef: "",
jsPropertySyntax: "",
unicode: '"minLength"/"maxLength" account for unicode characters by default.'
};
var MAX_EXPRESSION = 200;
function requiredOptions(o) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
const s = o.strict;
const _optz = (_a = o.code) === null || _a === void 0 ? void 0 : _a.optimize;
const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0;
const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp;
const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default;
return {
strictSchema: (_f = (_e = o.strictSchema) !== null && _e !== void 0 ? _e : s) !== null && _f !== void 0 ? _f : true,
strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true,
strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log",
strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log",
strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false,
code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp },
loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION,
loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION,
meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true,
messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true,
inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true,
schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id",
addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true,
validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true,
validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true,
unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true,
int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true,
uriResolver
};
}
var Ajv2 = class {
constructor(opts = {}) {
this.schemas = {};
this.refs = {};
this.formats = /* @__PURE__ */ Object.create(null);
this._compilations = /* @__PURE__ */ new Set();
this._loading = {};
this._cache = /* @__PURE__ */ new Map();
opts = this.opts = { ...opts, ...requiredOptions(opts) };
const { es5, lines } = this.opts.code;
this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines });
this.logger = getLogger(opts.logger);
const formatOpt = opts.validateFormats;
opts.validateFormats = false;
this.RULES = (0, rules_1.getRules)();
checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED");
checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn");
this._metaOpts = getMetaSchemaOptions.call(this);
if (opts.formats)
addInitialFormats.call(this);
this._addVocabularies();
this._addDefaultMetaSchema();
if (opts.keywords)
addInitialKeywords.call(this, opts.keywords);
if (typeof opts.meta == "object")
this.addMetaSchema(opts.meta);
addInitialSchemas.call(this);
opts.validateFormats = formatOpt;
}
_addVocabularies() {
this.addKeyword("$async");
}
_addDefaultMetaSchema() {
const { $data, meta, schemaId } = this.opts;
let _dataRefSchema = $dataRefSchema;
if (schemaId === "id") {
_dataRefSchema = { ...$dataRefSchema };
_dataRefSchema.id = _dataRefSchema.$id;
delete _dataRefSchema.$id;
}
if (meta && $data)
this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false);
}
defaultMeta() {
const { meta, schemaId } = this.opts;
return this.opts.defaultMeta = typeof meta == "object" ? meta[schemaId] || meta : void 0;
}
validate(schemaKeyRef, data) {
let v;
if (typeof schemaKeyRef == "string") {
v = this.getSchema(schemaKeyRef);
if (!v)
throw new Error(`no schema with key or ref "${schemaKeyRef}"`);
} else {
v = this.compile(schemaKeyRef);
}
const valid = v(data);
if (!("$async" in v))
this.errors = v.errors;
return valid;
}
compile(schema, _meta) {
const sch = this._addSchema(schema, _meta);
return sch.validate || this._compileSchemaEnv(sch);
}
compileAsync(schema, meta) {
if (typeof this.opts.loadSchema != "function") {
throw new Error("options.loadSchema should be a function");
}
const { loadSchema } = this.opts;
return runCompileAsync.call(this, schema, meta);
async function runCompileAsync(_schema, _meta) {
await loadMetaSchema.call(this, _schema.$schema);
const sch = this._addSchema(_schema, _meta);
return sch.validate || _compileAsync.call(this, sch);
}
async function loadMetaSchema($ref) {
if ($ref && !this.getSchema($ref)) {
await runCompileAsync.call(this, { $ref }, true);
}
}
async function _compileAsync(sch) {
try {
return this._compileSchemaEnv(sch);
} catch (e) {
if (!(e instanceof ref_error_1.default))
throw e;
checkLoaded.call(this, e);
await loadMissingSchema.call(this, e.missingSchema);
return _compileAsync.call(this, sch);
}
}
function checkLoaded({ missingSchema: ref, missingRef }) {
if (this.refs[ref]) {
throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`);
}
}
async function loadMissingSchema(ref) {
const _schema = await _loadSchema.call(this, ref);
if (!this.refs[ref])
await loadMetaSchema.call(this, _schema.$schema);
if (!this.refs[ref])
this.addSchema(_schema, ref, meta);
}
async function _loadSchema(ref) {
const p = this._loading[ref];
if (p)
return p;
try {
return await (this._loading[ref] = loadSchema(ref));
} finally {
delete this._loading[ref];
}
}
}
// Adds schema to the instance
addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) {
if (Array.isArray(schema)) {
for (const sch of schema)
this.addSchema(sch, void 0, _meta, _validateSchema);
return this;
}
let id;
if (typeof schema === "object") {
const { schemaId } = this.opts;
id = schema[schemaId];
if (id !== void 0 && typeof id != "string") {
throw new Error(`schema ${schemaId} must be string`);
}
}
key = (0, resolve_1.normalizeId)(key || id);
this._checkUnique(key);
this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true);
return this;
}
// Add schema that will be used to validate other schemas
// options in META_IGNORE_OPTIONS are alway set to false
addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) {
this.addSchema(schema, key, true, _validateSchema);
return this;
}
// Validate schema against its meta-schema
validateSchema(schema, throwOrLogError) {
if (typeof schema == "boolean")
return true;
let $schema;
$schema = schema.$schema;
if ($schema !== void 0 && typeof $schema != "string") {
throw new Error("$schema must be a string");
}
$schema = $schema || this.opts.defaultMeta || this.defaultMeta();
if (!$schema) {
this.logger.warn("meta-schema not available");
this.errors = null;
return true;
}
const valid = this.validate($schema, schema);
if (!valid && throwOrLogError) {
const message = "schema is invalid: " + this.errorsText();
if (this.opts.validateSchema === "log")
this.logger.error(message);
else
throw new Error(message);
}
return valid;
}
// Get compiled schema by `key` or `ref`.
// (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id)
getSchema(keyRef) {
let sch;
while (typeof (sch = getSchEnv.call(this, keyRef)) == "string")
keyRef = sch;
if (sch === void 0) {
const { schemaId } = this.opts;
const root = new compile_1.SchemaEnv({ schema: {}, schemaId });
sch = compile_1.resolveSchema.call(this, root, keyRef);
if (!sch)
return;
this.refs[keyRef] = sch;
}
return sch.validate || this._compileSchemaEnv(sch);
}
// Remove cached schema(s).
// If no parameter is passed all schemas but meta-schemas are removed.
// If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.
// Even if schema is referenced by other schemas it still can be removed as other schemas have local references.
removeSchema(schemaKeyRef) {
if (schemaKeyRef instanceof RegExp) {
this._removeAllSchemas(this.schemas, schemaKeyRef);
this._removeAllSchemas(this.refs, schemaKeyRef);
return this;
}
switch (typeof schemaKeyRef) {
case "undefined":
this._removeAllSchemas(this.schemas);
this._removeAllSchemas(this.refs);
this._cache.clear();
return this;
case "string": {
const sch = getSchEnv.call(this, schemaKeyRef);
if (typeof sch == "object")
this._cache.delete(sch.schema);
delete this.schemas[schemaKeyRef];
delete this.refs[schemaKeyRef];
return this;
}
case "object": {
const cacheKey = schemaKeyRef;
this._cache.delete(cacheKey);
let id = schemaKeyRef[this.opts.schemaId];
if (id) {
id = (0, resolve_1.normalizeId)(id);
delete this.schemas[id];
delete this.refs[id];
}
return this;
}
default:
throw new Error("ajv.removeSchema: invalid parameter");
}
}
// add "vocabulary" - a collection of keywords
addVocabulary(definitions) {
for (const def of definitions)
this.addKeyword(def);
return this;
}
addKeyword(kwdOrDef, def) {
let keyword;
if (typeof kwdOrDef == "string") {
keyword = kwdOrDef;
if (typeof def == "object") {
this.logger.warn("these parameters are deprecated, see docs for addKeyword");
def.keyword = keyword;
}
} else if (typeof kwdOrDef == "object" && def === void 0) {
def = kwdOrDef;
keyword = def.keyword;
if (Array.isArray(keyword) && !keyword.length) {
throw new Error("addKeywords: keyword must be string or non-empty array");
}
} else {
throw new Error("invalid addKeywords parameters");
}
checkKeyword.call(this, keyword, def);
if (!def) {
(0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd));
return this;
}
keywordMetaschema.call(this, def);
const definition = {
...def,
type: (0, dataType_1.getJSONTypes)(def.type),
schemaType: (0, dataType_1.getJSONTypes)(def.schemaType)
};
(0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k) => addRule.call(this, k, definition) : (k) => definition.type.forEach((t) => addRule.call(this, k, definition, t)));
return this;
}
getKeyword(keyword) {
const rule = this.RULES.all[keyword];
return typeof rule == "object" ? rule.definition : !!rule;
}
// Remove keyword
removeKeyword(keyword) {
const { RULES } = this;
delete RULES.keywords[keyword];
delete RULES.all[keyword];
for (const group of RULES.rules) {
const i = group.rules.findIndex((rule) => rule.keyword === keyword);
if (i >= 0)
group.rules.splice(i, 1);
}
return this;
}
// Add format
addFormat(name, format) {
if (typeof format == "string")
format = new RegExp(format);
this.formats[name] = format;
return this;
}
errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) {
if (!errors || errors.length === 0)
return "No errors";
return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg);
}
$dataMetaSchema(metaSchema, keywordsJsonPointers) {
const rules = this.RULES.all;
metaSchema = JSON.parse(JSON.stringify(metaSchema));
for (const jsonPointer of keywordsJsonPointers) {
const segments = jsonPointer.split("/").slice(1);
let keywords = metaSchema;
for (const seg of segments)
keywords = keywords[seg];
for (const key in rules) {
const rule = rules[key];
if (typeof rule != "object")
continue;
const { $data } = rule.definition;
const schema = keywords[key];
if ($data && schema)
keywords[key] = schemaOrData(schema);
}
}
return metaSchema;
}
_removeAllSchemas(schemas, regex) {
for (const keyRef in schemas) {
const sch = schemas[keyRef];
if (!regex || regex.test(keyRef)) {
if (typeof sch == "string") {
delete schemas[keyRef];
} else if (sch && !sch.meta) {
this._cache.delete(sch.schema);
delete schemas[keyRef];
}
}
}
}
_addSchema(schema, meta, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) {
let id;
const { schemaId } = this.opts;
if (typeof schema == "object") {
id = schema[schemaId];
} else {
if (this.opts.jtd)
throw new Error("schema must be object");
else if (typeof schema != "boolean")
throw new Error("schema must be object or boolean");
}
let sch = this._cache.get(schema);
if (sch !== void 0)
return sch;
baseId = (0, resolve_1.normalizeId)(id || baseId);
const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId);
sch = new compile_1.SchemaEnv({ schema, schemaId, meta, baseId, localRefs });
this._cache.set(sch.schema, sch);
if (addSchema && !baseId.startsWith("#")) {
if (baseId)
this._checkUnique(baseId);
this.refs[baseId] = sch;
}
if (validateSchema)
this.validateSchema(schema, true);
return sch;
}
_checkUnique(id) {
if (this.schemas[id] || this.refs[id]) {
throw new Error(`schema with key or id "${id}" already exists`);
}
}
_compileSchemaEnv(sch) {
if (sch.meta)
this._compileMetaSchema(sch);
else
compile_1.compileSchema.call(this, sch);
if (!sch.validate)
throw new Error("ajv implementation error");
return sch.validate;
}
_compileMetaSchema(sch) {
const currentOpts = this.opts;
this.opts = this._metaOpts;
try {
compile_1.compileSchema.call(this, sch);
} finally {
this.opts = currentOpts;
}
}
};
Ajv2.ValidationError = validation_error_1.default;
Ajv2.MissingRefError = ref_error_1.default;
exports2.default = Ajv2;
function checkOptions(checkOpts, options, msg, log = "error") {
for (const key in checkOpts) {
const opt = key;
if (opt in options)
this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`);
}
}
function getSchEnv(keyRef) {
keyRef = (0, resolve_1.normalizeId)(keyRef);
return this.schemas[keyRef] || this.refs[keyRef];
}
function addInitialSchemas() {
const optsSchemas = this.opts.schemas;
if (!optsSchemas)
return;
if (Array.isArray(optsSchemas))
this.addSchema(optsSchemas);
else
for (const key in optsSchemas)
this.addSchema(optsSchemas[key], key);
}
function addInitialFormats() {
for (const name in this.opts.formats) {
const format = this.opts.formats[name];
if (format)
this.addFormat(name, format);
}
}
function addInitialKeywords(defs) {
if (Array.isArray(defs)) {
this.addVocabulary(defs);
return;
}
this.logger.warn("keywords option as map is deprecated, pass array");
for (const keyword in defs) {
const def = defs[keyword];
if (!def.keyword)
def.keyword = keyword;
this.addKeyword(def);
}
}
function getMetaSchemaOptions() {
const metaOpts = { ...this.opts };
for (const opt of META_IGNORE_OPTIONS)
delete metaOpts[opt];
return metaOpts;
}
var noLogs = { log() {
}, warn() {
}, error() {
} };
function getLogger(logger) {
if (logger === false)
return noLogs;
if (logger === void 0)
return console;
if (logger.log && logger.warn && logger.error)
return logger;
throw new Error("logger must implement log, warn and error methods");
}
var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i;
function checkKeyword(keyword, def) {
const { RULES } = this;
(0, util_1.eachItem)(keyword, (kwd) => {
if (RULES.keywords[kwd])
throw new Error(`Keyword ${kwd} is already defined`);
if (!KEYWORD_NAME.test(kwd))
throw new Error(`Keyword ${kwd} has invalid name`);
});
if (!def)
return;
if (def.$data && !("code" in def || "validate" in def)) {
throw new Error('$data keyword must have "code" or "validate" function');
}
}
function addRule(keyword, definition, dataType) {
var _a;
const post = definition === null || definition === void 0 ? void 0 : definition.post;
if (dataType && post)
throw new Error('keyword with "post" flag cannot have "type"');
const { RULES } = this;
let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType);
if (!ruleGroup) {
ruleGroup = { type: dataType, rules: [] };
RULES.rules.push(ruleGroup);
}
RULES.keywords[keyword] = true;
if (!definition)
return;
const rule = {
keyword,
definition: {
...definition,
type: (0, dataType_1.getJSONTypes)(definition.type),
schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType)
}
};
if (definition.before)
addBeforeRule.call(this, ruleGroup, rule, definition.before);
else
ruleGroup.rules.push(rule);
RULES.all[keyword] = rule;
(_a = definition.implements) === null || _a === void 0 ? void 0 : _a.forEach((kwd) => this.addKeyword(kwd));
}
function addBeforeRule(ruleGroup, rule, before) {
const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before);
if (i >= 0) {
ruleGroup.rules.splice(i, 0, rule);
} else {
ruleGroup.rules.push(rule);
this.logger.warn(`rule ${before} is not defined`);
}
}
function keywordMetaschema(def) {
let { metaSchema } = def;
if (metaSchema === void 0)
return;
if (def.$data && this.opts.$data)
metaSchema = schemaOrData(metaSchema);
def.validateSchema = this.compile(metaSchema, true);
}
var $dataRef = {
$ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"
};
function schemaOrData(schema) {
return { anyOf: [schema, $dataRef] };
}
}
});
// node_modules/ajv/dist/vocabularies/core/id.js
var require_id = __commonJS({
"node_modules/ajv/dist/vocabularies/core/id.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var def = {
keyword: "id",
code() {
throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID');
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/core/ref.js
var require_ref = __commonJS({
"node_modules/ajv/dist/vocabularies/core/ref.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.callRef = exports2.getValidate = void 0;
var ref_error_1 = require_ref_error();
var code_1 = require_code2();
var codegen_1 = require_codegen();
var names_1 = require_names();
var compile_1 = require_compile();
var util_1 = require_util();
var def = {
keyword: "$ref",
schemaType: "string",
code(cxt) {
const { gen, schema: $ref, it } = cxt;
const { baseId, schemaEnv: env, validateName, opts, self } = it;
const { root } = env;
if (($ref === "#" || $ref === "#/") && baseId === root.baseId)
return callRootRef();
const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref);
if (schOrEnv === void 0)
throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref);
if (schOrEnv instanceof compile_1.SchemaEnv)
return callValidate(schOrEnv);
return inlineRefSchema(schOrEnv);
function callRootRef() {
if (env === root)
return callRef(cxt, validateName, env, env.$async);
const rootName = gen.scopeValue("root", { ref: root });
return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async);
}
function callValidate(sch) {
const v = getValidate(cxt, sch);
callRef(cxt, v, sch, sch.$async);
}
function inlineRefSchema(sch) {
const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch });
const valid = gen.name("valid");
const schCxt = cxt.subschema({
schema: sch,
dataTypes: [],
schemaPath: codegen_1.nil,
topSchemaRef: schName,
errSchemaPath: $ref
}, valid);
cxt.mergeEvaluated(schCxt);
cxt.ok(valid);
}
}
};
function getValidate(cxt, sch) {
const { gen } = cxt;
return sch.validate ? gen.scopeValue("validate", { ref: sch.validate }) : (0, codegen_1._)`${gen.scopeValue("wrapper", { ref: sch })}.validate`;
}
exports2.getValidate = getValidate;
function callRef(cxt, v, sch, $async) {
const { gen, it } = cxt;
const { allErrors, schemaEnv: env, opts } = it;
const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil;
if ($async)
callAsyncRef();
else
callSyncRef();
function callAsyncRef() {
if (!env.$async)
throw new Error("async schema referenced by sync schema");
const valid = gen.let("valid");
gen.try(() => {
gen.code((0, codegen_1._)`await ${(0, code_1.callValidateCode)(cxt, v, passCxt)}`);
addEvaluatedFrom(v);
if (!allErrors)
gen.assign(valid, true);
}, (e) => {
gen.if((0, codegen_1._)`!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e));
addErrorsFrom(e);
if (!allErrors)
gen.assign(valid, false);
});
cxt.ok(valid);
}
function callSyncRef() {
cxt.result((0, code_1.callValidateCode)(cxt, v, passCxt), () => addEvaluatedFrom(v), () => addErrorsFrom(v));
}
function addErrorsFrom(source) {
const errs = (0, codegen_1._)`${source}.errors`;
gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`);
gen.assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`);
}
function addEvaluatedFrom(source) {
var _a;
if (!it.opts.unevaluated)
return;
const schEvaluated = (_a = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a === void 0 ? void 0 : _a.evaluated;
if (it.props !== true) {
if (schEvaluated && !schEvaluated.dynamicProps) {
if (schEvaluated.props !== void 0) {
it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props);
}
} else {
const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`);
it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name);
}
}
if (it.items !== true) {
if (schEvaluated && !schEvaluated.dynamicItems) {
if (schEvaluated.items !== void 0) {
it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items);
}
} else {
const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`);
it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name);
}
}
}
}
exports2.callRef = callRef;
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/core/index.js
var require_core3 = __commonJS({
"node_modules/ajv/dist/vocabularies/core/index.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var id_1 = require_id();
var ref_1 = require_ref();
var core = [
"$schema",
"$id",
"$defs",
"$vocabulary",
{ keyword: "$comment" },
"definitions",
id_1.default,
ref_1.default
];
exports2.default = core;
}
});
// node_modules/ajv/dist/vocabularies/validation/limitNumber.js
var require_limitNumber = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var ops = codegen_1.operators;
var KWDs = {
maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT },
minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT },
exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE },
exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE }
};
var error = {
message: ({ keyword, schemaCode }) => (0, codegen_1.str)`must be ${KWDs[keyword].okStr} ${schemaCode}`,
params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}`
};
var def = {
keyword: Object.keys(KWDs),
type: "number",
schemaType: "number",
$data: true,
error,
code(cxt) {
const { keyword, data, schemaCode } = cxt;
cxt.fail$data((0, codegen_1._)`${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`);
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/validation/multipleOf.js
var require_multipleOf = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var error = {
message: ({ schemaCode }) => (0, codegen_1.str)`must be multiple of ${schemaCode}`,
params: ({ schemaCode }) => (0, codegen_1._)`{multipleOf: ${schemaCode}}`
};
var def = {
keyword: "multipleOf",
type: "number",
schemaType: "number",
$data: true,
error,
code(cxt) {
const { gen, data, schemaCode, it } = cxt;
const prec = it.opts.multipleOfPrecision;
const res = gen.let("res");
const invalid = prec ? (0, codegen_1._)`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}` : (0, codegen_1._)`${res} !== parseInt(${res})`;
cxt.fail$data((0, codegen_1._)`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`);
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/runtime/ucs2length.js
var require_ucs2length = __commonJS({
"node_modules/ajv/dist/runtime/ucs2length.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
function ucs2length(str) {
const len = str.length;
let length = 0;
let pos = 0;
let value;
while (pos < len) {
length++;
value = str.charCodeAt(pos++);
if (value >= 55296 && value <= 56319 && pos < len) {
value = str.charCodeAt(pos);
if ((value & 64512) === 56320)
pos++;
}
}
return length;
}
exports2.default = ucs2length;
ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default';
}
});
// node_modules/ajv/dist/vocabularies/validation/limitLength.js
var require_limitLength = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var util_1 = require_util();
var ucs2length_1 = require_ucs2length();
var error = {
message({ keyword, schemaCode }) {
const comp = keyword === "maxLength" ? "more" : "fewer";
return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} characters`;
},
params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}`
};
var def = {
keyword: ["maxLength", "minLength"],
type: "string",
schemaType: "number",
$data: true,
error,
code(cxt) {
const { keyword, data, schemaCode, it } = cxt;
const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT;
const len = it.opts.unicode === false ? (0, codegen_1._)`${data}.length` : (0, codegen_1._)`${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`;
cxt.fail$data((0, codegen_1._)`${len} ${op} ${schemaCode}`);
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/validation/pattern.js
var require_pattern = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var code_1 = require_code2();
var util_1 = require_util();
var codegen_1 = require_codegen();
var error = {
message: ({ schemaCode }) => (0, codegen_1.str)`must match pattern "${schemaCode}"`,
params: ({ schemaCode }) => (0, codegen_1._)`{pattern: ${schemaCode}}`
};
var def = {
keyword: "pattern",
type: "string",
schemaType: "string",
$data: true,
error,
code(cxt) {
const { gen, data, $data, schema, schemaCode, it } = cxt;
const u = it.opts.unicodeRegExp ? "u" : "";
if ($data) {
const { regExp } = it.opts.code;
const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp);
const valid = gen.let("valid");
gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false));
cxt.fail$data((0, codegen_1._)`!${valid}`);
} else {
const regExp = (0, code_1.usePattern)(cxt, schema);
cxt.fail$data((0, codegen_1._)`!${regExp}.test(${data})`);
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/validation/limitProperties.js
var require_limitProperties = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var error = {
message({ keyword, schemaCode }) {
const comp = keyword === "maxProperties" ? "more" : "fewer";
return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} properties`;
},
params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}`
};
var def = {
keyword: ["maxProperties", "minProperties"],
type: "object",
schemaType: "number",
$data: true,
error,
code(cxt) {
const { keyword, data, schemaCode } = cxt;
const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT;
cxt.fail$data((0, codegen_1._)`Object.keys(${data}).length ${op} ${schemaCode}`);
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/validation/required.js
var require_required = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/required.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var code_1 = require_code2();
var codegen_1 = require_codegen();
var util_1 = require_util();
var error = {
message: ({ params: { missingProperty } }) => (0, codegen_1.str)`must have required property '${missingProperty}'`,
params: ({ params: { missingProperty } }) => (0, codegen_1._)`{missingProperty: ${missingProperty}}`
};
var def = {
keyword: "required",
type: "object",
schemaType: "array",
$data: true,
error,
code(cxt) {
const { gen, schema, schemaCode, data, $data, it } = cxt;
const { opts } = it;
if (!$data && schema.length === 0)
return;
const useLoop = schema.length >= opts.loopRequired;
if (it.allErrors)
allErrorsMode();
else
exitOnErrorMode();
if (opts.strictRequired) {
const props = cxt.parentSchema.properties;
const { definedProperties } = cxt.it;
for (const requiredKey of schema) {
if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === void 0 && !definedProperties.has(requiredKey)) {
const schemaPath = it.schemaEnv.baseId + it.errSchemaPath;
const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`;
(0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired);
}
}
}
function allErrorsMode() {
if (useLoop || $data) {
cxt.block$data(codegen_1.nil, loopAllRequired);
} else {
for (const prop of schema) {
(0, code_1.checkReportMissingProp)(cxt, prop);
}
}
}
function exitOnErrorMode() {
const missing = gen.let("missing");
if (useLoop || $data) {
const valid = gen.let("valid", true);
cxt.block$data(valid, () => loopUntilMissing(missing, valid));
cxt.ok(valid);
} else {
gen.if((0, code_1.checkMissingProp)(cxt, schema, missing));
(0, code_1.reportMissingProp)(cxt, missing);
gen.else();
}
}
function loopAllRequired() {
gen.forOf("prop", schemaCode, (prop) => {
cxt.setParams({ missingProperty: prop });
gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error());
});
}
function loopUntilMissing(missing, valid) {
cxt.setParams({ missingProperty: missing });
gen.forOf(missing, schemaCode, () => {
gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties));
gen.if((0, codegen_1.not)(valid), () => {
cxt.error();
gen.break();
});
}, codegen_1.nil);
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/validation/limitItems.js
var require_limitItems = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var error = {
message({ keyword, schemaCode }) {
const comp = keyword === "maxItems" ? "more" : "fewer";
return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} items`;
},
params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}`
};
var def = {
keyword: ["maxItems", "minItems"],
type: "array",
schemaType: "number",
$data: true,
error,
code(cxt) {
const { keyword, data, schemaCode } = cxt;
const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT;
cxt.fail$data((0, codegen_1._)`${data}.length ${op} ${schemaCode}`);
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/runtime/equal.js
var require_equal = __commonJS({
"node_modules/ajv/dist/runtime/equal.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var equal = require_fast_deep_equal();
equal.code = 'require("ajv/dist/runtime/equal").default';
exports2.default = equal;
}
});
// node_modules/ajv/dist/vocabularies/validation/uniqueItems.js
var require_uniqueItems = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var dataType_1 = require_dataType();
var codegen_1 = require_codegen();
var util_1 = require_util();
var equal_1 = require_equal();
var error = {
message: ({ params: { i, j } }) => (0, codegen_1.str)`must NOT have duplicate items (items ## ${j} and ${i} are identical)`,
params: ({ params: { i, j } }) => (0, codegen_1._)`{i: ${i}, j: ${j}}`
};
var def = {
keyword: "uniqueItems",
type: "array",
schemaType: "boolean",
$data: true,
error,
code(cxt) {
const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt;
if (!$data && !schema)
return;
const valid = gen.let("valid");
const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : [];
cxt.block$data(valid, validateUniqueItems, (0, codegen_1._)`${schemaCode} === false`);
cxt.ok(valid);
function validateUniqueItems() {
const i = gen.let("i", (0, codegen_1._)`${data}.length`);
const j = gen.let("j");
cxt.setParams({ i, j });
gen.assign(valid, true);
gen.if((0, codegen_1._)`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j));
}
function canOptimize() {
return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array");
}
function loopN(i, j) {
const item = gen.name("item");
const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong);
const indices = gen.const("indices", (0, codegen_1._)`{}`);
gen.for((0, codegen_1._)`;${i}--;`, () => {
gen.let(item, (0, codegen_1._)`${data}[${i}]`);
gen.if(wrongType, (0, codegen_1._)`continue`);
if (itemTypes.length > 1)
gen.if((0, codegen_1._)`typeof ${item} == "string"`, (0, codegen_1._)`${item} += "_"`);
gen.if((0, codegen_1._)`typeof ${indices}[${item}] == "number"`, () => {
gen.assign(j, (0, codegen_1._)`${indices}[${item}]`);
cxt.error();
gen.assign(valid, false).break();
}).code((0, codegen_1._)`${indices}[${item}] = ${i}`);
});
}
function loopN2(i, j) {
const eql = (0, util_1.useFunc)(gen, equal_1.default);
const outer = gen.name("outer");
gen.label(outer).for((0, codegen_1._)`;${i}--;`, () => gen.for((0, codegen_1._)`${j} = ${i}; ${j}--;`, () => gen.if((0, codegen_1._)`${eql}(${data}[${i}], ${data}[${j}])`, () => {
cxt.error();
gen.assign(valid, false).break(outer);
})));
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/validation/const.js
var require_const = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/const.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var util_1 = require_util();
var equal_1 = require_equal();
var error = {
message: "must be equal to constant",
params: ({ schemaCode }) => (0, codegen_1._)`{allowedValue: ${schemaCode}}`
};
var def = {
keyword: "const",
$data: true,
error,
code(cxt) {
const { gen, data, $data, schemaCode, schema } = cxt;
if ($data || schema && typeof schema == "object") {
cxt.fail$data((0, codegen_1._)`!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`);
} else {
cxt.fail((0, codegen_1._)`${schema} !== ${data}`);
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/validation/enum.js
var require_enum = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/enum.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var util_1 = require_util();
var equal_1 = require_equal();
var error = {
message: "must be equal to one of the allowed values",
params: ({ schemaCode }) => (0, codegen_1._)`{allowedValues: ${schemaCode}}`
};
var def = {
keyword: "enum",
schemaType: "array",
$data: true,
error,
code(cxt) {
const { gen, data, $data, schema, schemaCode, it } = cxt;
if (!$data && schema.length === 0)
throw new Error("enum must have non-empty array");
const useLoop = schema.length >= it.opts.loopEnum;
let eql;
const getEql = () => eql !== null && eql !== void 0 ? eql : eql = (0, util_1.useFunc)(gen, equal_1.default);
let valid;
if (useLoop || $data) {
valid = gen.let("valid");
cxt.block$data(valid, loopEnum);
} else {
if (!Array.isArray(schema))
throw new Error("ajv implementation error");
const vSchema = gen.const("vSchema", schemaCode);
valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i)));
}
cxt.pass(valid);
function loopEnum() {
gen.assign(valid, false);
gen.forOf("v", schemaCode, (v) => gen.if((0, codegen_1._)`${getEql()}(${data}, ${v})`, () => gen.assign(valid, true).break()));
}
function equalCode(vSchema, i) {
const sch = schema[i];
return typeof sch === "object" && sch !== null ? (0, codegen_1._)`${getEql()}(${data}, ${vSchema}[${i}])` : (0, codegen_1._)`${data} === ${sch}`;
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/validation/index.js
var require_validation = __commonJS({
"node_modules/ajv/dist/vocabularies/validation/index.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var limitNumber_1 = require_limitNumber();
var multipleOf_1 = require_multipleOf();
var limitLength_1 = require_limitLength();
var pattern_1 = require_pattern();
var limitProperties_1 = require_limitProperties();
var required_1 = require_required();
var limitItems_1 = require_limitItems();
var uniqueItems_1 = require_uniqueItems();
var const_1 = require_const();
var enum_1 = require_enum();
var validation = [
// number
limitNumber_1.default,
multipleOf_1.default,
// string
limitLength_1.default,
pattern_1.default,
// object
limitProperties_1.default,
required_1.default,
// array
limitItems_1.default,
uniqueItems_1.default,
// any
{ keyword: "type", schemaType: ["string", "array"] },
{ keyword: "nullable", schemaType: "boolean" },
const_1.default,
enum_1.default
];
exports2.default = validation;
}
});
// node_modules/ajv/dist/vocabularies/applicator/additionalItems.js
var require_additionalItems = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.validateAdditionalItems = void 0;
var codegen_1 = require_codegen();
var util_1 = require_util();
var error = {
message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`,
params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}`
};
var def = {
keyword: "additionalItems",
type: "array",
schemaType: ["boolean", "object"],
before: "uniqueItems",
error,
code(cxt) {
const { parentSchema, it } = cxt;
const { items } = parentSchema;
if (!Array.isArray(items)) {
(0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas');
return;
}
validateAdditionalItems(cxt, items);
}
};
function validateAdditionalItems(cxt, items) {
const { gen, schema, data, keyword, it } = cxt;
it.items = true;
const len = gen.const("len", (0, codegen_1._)`${data}.length`);
if (schema === false) {
cxt.setParams({ len: items.length });
cxt.pass((0, codegen_1._)`${len} <= ${items.length}`);
} else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) {
const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items.length}`);
gen.if((0, codegen_1.not)(valid), () => validateItems(valid));
cxt.ok(valid);
}
function validateItems(valid) {
gen.forRange("i", items.length, len, (i) => {
cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid);
if (!it.allErrors)
gen.if((0, codegen_1.not)(valid), () => gen.break());
});
}
}
exports2.validateAdditionalItems = validateAdditionalItems;
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/items.js
var require_items = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/items.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.validateTuple = void 0;
var codegen_1 = require_codegen();
var util_1 = require_util();
var code_1 = require_code2();
var def = {
keyword: "items",
type: "array",
schemaType: ["object", "array", "boolean"],
before: "uniqueItems",
code(cxt) {
const { schema, it } = cxt;
if (Array.isArray(schema))
return validateTuple(cxt, "additionalItems", schema);
it.items = true;
if ((0, util_1.alwaysValidSchema)(it, schema))
return;
cxt.ok((0, code_1.validateArray)(cxt));
}
};
function validateTuple(cxt, extraItems, schArr = cxt.schema) {
const { gen, parentSchema, data, keyword, it } = cxt;
checkStrictTuple(parentSchema);
if (it.opts.unevaluated && schArr.length && it.items !== true) {
it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items);
}
const valid = gen.name("valid");
const len = gen.const("len", (0, codegen_1._)`${data}.length`);
schArr.forEach((sch, i) => {
if ((0, util_1.alwaysValidSchema)(it, sch))
return;
gen.if((0, codegen_1._)`${len} > ${i}`, () => cxt.subschema({
keyword,
schemaProp: i,
dataProp: i
}, valid));
cxt.ok(valid);
});
function checkStrictTuple(sch) {
const { opts, errSchemaPath } = it;
const l = schArr.length;
const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false);
if (opts.strictTuples && !fullTuple) {
const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`;
(0, util_1.checkStrictMode)(it, msg, opts.strictTuples);
}
}
}
exports2.validateTuple = validateTuple;
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/prefixItems.js
var require_prefixItems = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var items_1 = require_items();
var def = {
keyword: "prefixItems",
type: "array",
schemaType: ["array"],
before: "uniqueItems",
code: (cxt) => (0, items_1.validateTuple)(cxt, "items")
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/items2020.js
var require_items2020 = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var util_1 = require_util();
var code_1 = require_code2();
var additionalItems_1 = require_additionalItems();
var error = {
message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`,
params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}`
};
var def = {
keyword: "items",
type: "array",
schemaType: ["object", "boolean"],
before: "uniqueItems",
error,
code(cxt) {
const { schema, parentSchema, it } = cxt;
const { prefixItems } = parentSchema;
it.items = true;
if ((0, util_1.alwaysValidSchema)(it, schema))
return;
if (prefixItems)
(0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems);
else
cxt.ok((0, code_1.validateArray)(cxt));
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/contains.js
var require_contains = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var util_1 = require_util();
var error = {
message: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1.str)`must contain at least ${min} valid item(s)` : (0, codegen_1.str)`must contain at least ${min} and no more than ${max} valid item(s)`,
params: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1._)`{minContains: ${min}}` : (0, codegen_1._)`{minContains: ${min}, maxContains: ${max}}`
};
var def = {
keyword: "contains",
type: "array",
schemaType: ["object", "boolean"],
before: "uniqueItems",
trackErrors: true,
error,
code(cxt) {
const { gen, schema, parentSchema, data, it } = cxt;
let min;
let max;
const { minContains, maxContains } = parentSchema;
if (it.opts.next) {
min = minContains === void 0 ? 1 : minContains;
max = maxContains;
} else {
min = 1;
}
const len = gen.const("len", (0, codegen_1._)`${data}.length`);
cxt.setParams({ min, max });
if (max === void 0 && min === 0) {
(0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`);
return;
}
if (max !== void 0 && min > max) {
(0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`);
cxt.fail();
return;
}
if ((0, util_1.alwaysValidSchema)(it, schema)) {
let cond = (0, codegen_1._)`${len} >= ${min}`;
if (max !== void 0)
cond = (0, codegen_1._)`${cond} && ${len} <= ${max}`;
cxt.pass(cond);
return;
}
it.items = true;
const valid = gen.name("valid");
if (max === void 0 && min === 1) {
validateItems(valid, () => gen.if(valid, () => gen.break()));
} else if (min === 0) {
gen.let(valid, true);
if (max !== void 0)
gen.if((0, codegen_1._)`${data}.length > 0`, validateItemsWithCount);
} else {
gen.let(valid, false);
validateItemsWithCount();
}
cxt.result(valid, () => cxt.reset());
function validateItemsWithCount() {
const schValid = gen.name("_valid");
const count = gen.let("count", 0);
validateItems(schValid, () => gen.if(schValid, () => checkLimits(count)));
}
function validateItems(_valid, block) {
gen.forRange("i", 0, len, (i) => {
cxt.subschema({
keyword: "contains",
dataProp: i,
dataPropType: util_1.Type.Num,
compositeRule: true
}, _valid);
block();
});
}
function checkLimits(count) {
gen.code((0, codegen_1._)`${count}++`);
if (max === void 0) {
gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break());
} else {
gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break());
if (min === 1)
gen.assign(valid, true);
else
gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true));
}
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/dependencies.js
var require_dependencies = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.validateSchemaDeps = exports2.validatePropertyDeps = exports2.error = void 0;
var codegen_1 = require_codegen();
var util_1 = require_util();
var code_1 = require_code2();
exports2.error = {
message: ({ params: { property, depsCount, deps } }) => {
const property_ies = depsCount === 1 ? "property" : "properties";
return (0, codegen_1.str)`must have ${property_ies} ${deps} when property ${property} is present`;
},
params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._)`{property: ${property},
missingProperty: ${missingProperty},
depsCount: ${depsCount},
deps: ${deps}}`
// TODO change to reference
};
var def = {
keyword: "dependencies",
type: "object",
schemaType: "object",
error: exports2.error,
code(cxt) {
const [propDeps, schDeps] = splitDependencies(cxt);
validatePropertyDeps(cxt, propDeps);
validateSchemaDeps(cxt, schDeps);
}
};
function splitDependencies({ schema }) {
const propertyDeps = {};
const schemaDeps = {};
for (const key in schema) {
if (key === "__proto__")
continue;
const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps;
deps[key] = schema[key];
}
return [propertyDeps, schemaDeps];
}
function validatePropertyDeps(cxt, propertyDeps = cxt.schema) {
const { gen, data, it } = cxt;
if (Object.keys(propertyDeps).length === 0)
return;
const missing = gen.let("missing");
for (const prop in propertyDeps) {
const deps = propertyDeps[prop];
if (deps.length === 0)
continue;
const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties);
cxt.setParams({
property: prop,
depsCount: deps.length,
deps: deps.join(", ")
});
if (it.allErrors) {
gen.if(hasProperty, () => {
for (const depProp of deps) {
(0, code_1.checkReportMissingProp)(cxt, depProp);
}
});
} else {
gen.if((0, codegen_1._)`${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`);
(0, code_1.reportMissingProp)(cxt, missing);
gen.else();
}
}
}
exports2.validatePropertyDeps = validatePropertyDeps;
function validateSchemaDeps(cxt, schemaDeps = cxt.schema) {
const { gen, data, keyword, it } = cxt;
const valid = gen.name("valid");
for (const prop in schemaDeps) {
if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop]))
continue;
gen.if(
(0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties),
() => {
const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid);
cxt.mergeValidEvaluated(schCxt, valid);
},
() => gen.var(valid, true)
// TODO var
);
cxt.ok(valid);
}
}
exports2.validateSchemaDeps = validateSchemaDeps;
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/propertyNames.js
var require_propertyNames = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var util_1 = require_util();
var error = {
message: "property name must be valid",
params: ({ params }) => (0, codegen_1._)`{propertyName: ${params.propertyName}}`
};
var def = {
keyword: "propertyNames",
type: "object",
schemaType: ["object", "boolean"],
error,
code(cxt) {
const { gen, schema, data, it } = cxt;
if ((0, util_1.alwaysValidSchema)(it, schema))
return;
const valid = gen.name("valid");
gen.forIn("key", data, (key) => {
cxt.setParams({ propertyName: key });
cxt.subschema({
keyword: "propertyNames",
data: key,
dataTypes: ["string"],
propertyName: key,
compositeRule: true
}, valid);
gen.if((0, codegen_1.not)(valid), () => {
cxt.error(true);
if (!it.allErrors)
gen.break();
});
});
cxt.ok(valid);
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js
var require_additionalProperties = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var code_1 = require_code2();
var codegen_1 = require_codegen();
var names_1 = require_names();
var util_1 = require_util();
var error = {
message: "must NOT have additional properties",
params: ({ params }) => (0, codegen_1._)`{additionalProperty: ${params.additionalProperty}}`
};
var def = {
keyword: "additionalProperties",
type: ["object"],
schemaType: ["boolean", "object"],
allowUndefined: true,
trackErrors: true,
error,
code(cxt) {
const { gen, schema, parentSchema, data, errsCount, it } = cxt;
if (!errsCount)
throw new Error("ajv implementation error");
const { allErrors, opts } = it;
it.props = true;
if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema))
return;
const props = (0, code_1.allSchemaProperties)(parentSchema.properties);
const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties);
checkAdditionalProperties();
cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`);
function checkAdditionalProperties() {
gen.forIn("key", data, (key) => {
if (!props.length && !patProps.length)
additionalPropertyCode(key);
else
gen.if(isAdditional(key), () => additionalPropertyCode(key));
});
}
function isAdditional(key) {
let definedProp;
if (props.length > 8) {
const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties");
definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key);
} else if (props.length) {
definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._)`${key} === ${p}`));
} else {
definedProp = codegen_1.nil;
}
if (patProps.length) {
definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._)`${(0, code_1.usePattern)(cxt, p)}.test(${key})`));
}
return (0, codegen_1.not)(definedProp);
}
function deleteAdditional(key) {
gen.code((0, codegen_1._)`delete ${data}[${key}]`);
}
function additionalPropertyCode(key) {
if (opts.removeAdditional === "all" || opts.removeAdditional && schema === false) {
deleteAdditional(key);
return;
}
if (schema === false) {
cxt.setParams({ additionalProperty: key });
cxt.error();
if (!allErrors)
gen.break();
return;
}
if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) {
const valid = gen.name("valid");
if (opts.removeAdditional === "failing") {
applyAdditionalSchema(key, valid, false);
gen.if((0, codegen_1.not)(valid), () => {
cxt.reset();
deleteAdditional(key);
});
} else {
applyAdditionalSchema(key, valid);
if (!allErrors)
gen.if((0, codegen_1.not)(valid), () => gen.break());
}
}
}
function applyAdditionalSchema(key, valid, errors) {
const subschema = {
keyword: "additionalProperties",
dataProp: key,
dataPropType: util_1.Type.Str
};
if (errors === false) {
Object.assign(subschema, {
compositeRule: true,
createErrors: false,
allErrors: false
});
}
cxt.subschema(subschema, valid);
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/properties.js
var require_properties = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var validate_1 = require_validate();
var code_1 = require_code2();
var util_1 = require_util();
var additionalProperties_1 = require_additionalProperties();
var def = {
keyword: "properties",
type: "object",
schemaType: "object",
code(cxt) {
const { gen, schema, parentSchema, data, it } = cxt;
if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === void 0) {
additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties"));
}
const allProps = (0, code_1.allSchemaProperties)(schema);
for (const prop of allProps) {
it.definedProperties.add(prop);
}
if (it.opts.unevaluated && allProps.length && it.props !== true) {
it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props);
}
const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p]));
if (properties.length === 0)
return;
const valid = gen.name("valid");
for (const prop of properties) {
if (hasDefault(prop)) {
applyPropertySchema(prop);
} else {
gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties));
applyPropertySchema(prop);
if (!it.allErrors)
gen.else().var(valid, true);
gen.endIf();
}
cxt.it.definedProperties.add(prop);
cxt.ok(valid);
}
function hasDefault(prop) {
return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== void 0;
}
function applyPropertySchema(prop) {
cxt.subschema({
keyword: "properties",
schemaProp: prop,
dataProp: prop
}, valid);
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/patternProperties.js
var require_patternProperties = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var code_1 = require_code2();
var codegen_1 = require_codegen();
var util_1 = require_util();
var util_2 = require_util();
var def = {
keyword: "patternProperties",
type: "object",
schemaType: "object",
code(cxt) {
const { gen, schema, data, parentSchema, it } = cxt;
const { opts } = it;
const patterns = (0, code_1.allSchemaProperties)(schema);
const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p]));
if (patterns.length === 0 || alwaysValidPatterns.length === patterns.length && (!it.opts.unevaluated || it.props === true)) {
return;
}
const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties;
const valid = gen.name("valid");
if (it.props !== true && !(it.props instanceof codegen_1.Name)) {
it.props = (0, util_2.evaluatedPropsToName)(gen, it.props);
}
const { props } = it;
validatePatternProperties();
function validatePatternProperties() {
for (const pat of patterns) {
if (checkProperties)
checkMatchingProperties(pat);
if (it.allErrors) {
validateProperties(pat);
} else {
gen.var(valid, true);
validateProperties(pat);
gen.if(valid);
}
}
}
function checkMatchingProperties(pat) {
for (const prop in checkProperties) {
if (new RegExp(pat).test(prop)) {
(0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`);
}
}
}
function validateProperties(pat) {
gen.forIn("key", data, (key) => {
gen.if((0, codegen_1._)`${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => {
const alwaysValid = alwaysValidPatterns.includes(pat);
if (!alwaysValid) {
cxt.subschema({
keyword: "patternProperties",
schemaProp: pat,
dataProp: key,
dataPropType: util_2.Type.Str
}, valid);
}
if (it.opts.unevaluated && props !== true) {
gen.assign((0, codegen_1._)`${props}[${key}]`, true);
} else if (!alwaysValid && !it.allErrors) {
gen.if((0, codegen_1.not)(valid), () => gen.break());
}
});
});
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/not.js
var require_not = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/not.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var util_1 = require_util();
var def = {
keyword: "not",
schemaType: ["object", "boolean"],
trackErrors: true,
code(cxt) {
const { gen, schema, it } = cxt;
if ((0, util_1.alwaysValidSchema)(it, schema)) {
cxt.fail();
return;
}
const valid = gen.name("valid");
cxt.subschema({
keyword: "not",
compositeRule: true,
createErrors: false,
allErrors: false
}, valid);
cxt.failResult(valid, () => cxt.reset(), () => cxt.error());
},
error: { message: "must NOT be valid" }
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/anyOf.js
var require_anyOf = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var code_1 = require_code2();
var def = {
keyword: "anyOf",
schemaType: "array",
trackErrors: true,
code: code_1.validateUnion,
error: { message: "must match a schema in anyOf" }
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/oneOf.js
var require_oneOf = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var util_1 = require_util();
var error = {
message: "must match exactly one schema in oneOf",
params: ({ params }) => (0, codegen_1._)`{passingSchemas: ${params.passing}}`
};
var def = {
keyword: "oneOf",
schemaType: "array",
trackErrors: true,
error,
code(cxt) {
const { gen, schema, parentSchema, it } = cxt;
if (!Array.isArray(schema))
throw new Error("ajv implementation error");
if (it.opts.discriminator && parentSchema.discriminator)
return;
const schArr = schema;
const valid = gen.let("valid", false);
const passing = gen.let("passing", null);
const schValid = gen.name("_valid");
cxt.setParams({ passing });
gen.block(validateOneOf);
cxt.result(valid, () => cxt.reset(), () => cxt.error(true));
function validateOneOf() {
schArr.forEach((sch, i) => {
let schCxt;
if ((0, util_1.alwaysValidSchema)(it, sch)) {
gen.var(schValid, true);
} else {
schCxt = cxt.subschema({
keyword: "oneOf",
schemaProp: i,
compositeRule: true
}, schValid);
}
if (i > 0) {
gen.if((0, codegen_1._)`${schValid} && ${valid}`).assign(valid, false).assign(passing, (0, codegen_1._)`[${passing}, ${i}]`).else();
}
gen.if(schValid, () => {
gen.assign(valid, true);
gen.assign(passing, i);
if (schCxt)
cxt.mergeEvaluated(schCxt, codegen_1.Name);
});
});
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/allOf.js
var require_allOf = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var util_1 = require_util();
var def = {
keyword: "allOf",
schemaType: "array",
code(cxt) {
const { gen, schema, it } = cxt;
if (!Array.isArray(schema))
throw new Error("ajv implementation error");
const valid = gen.name("valid");
schema.forEach((sch, i) => {
if ((0, util_1.alwaysValidSchema)(it, sch))
return;
const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid);
cxt.ok(valid);
cxt.mergeEvaluated(schCxt);
});
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/if.js
var require_if = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/if.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var util_1 = require_util();
var error = {
message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`,
params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}`
};
var def = {
keyword: "if",
schemaType: ["object", "boolean"],
trackErrors: true,
error,
code(cxt) {
const { gen, parentSchema, it } = cxt;
if (parentSchema.then === void 0 && parentSchema.else === void 0) {
(0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored');
}
const hasThen = hasSchema(it, "then");
const hasElse = hasSchema(it, "else");
if (!hasThen && !hasElse)
return;
const valid = gen.let("valid", true);
const schValid = gen.name("_valid");
validateIf();
cxt.reset();
if (hasThen && hasElse) {
const ifClause = gen.let("ifClause");
cxt.setParams({ ifClause });
gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause));
} else if (hasThen) {
gen.if(schValid, validateClause("then"));
} else {
gen.if((0, codegen_1.not)(schValid), validateClause("else"));
}
cxt.pass(valid, () => cxt.error(true));
function validateIf() {
const schCxt = cxt.subschema({
keyword: "if",
compositeRule: true,
createErrors: false,
allErrors: false
}, schValid);
cxt.mergeEvaluated(schCxt);
}
function validateClause(keyword, ifClause) {
return () => {
const schCxt = cxt.subschema({ keyword }, schValid);
gen.assign(valid, schValid);
cxt.mergeValidEvaluated(schCxt, valid);
if (ifClause)
gen.assign(ifClause, (0, codegen_1._)`${keyword}`);
else
cxt.setParams({ ifClause: keyword });
};
}
}
};
function hasSchema(it, keyword) {
const schema = it.schema[keyword];
return schema !== void 0 && !(0, util_1.alwaysValidSchema)(it, schema);
}
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/thenElse.js
var require_thenElse = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var util_1 = require_util();
var def = {
keyword: ["then", "else"],
schemaType: ["object", "boolean"],
code({ keyword, parentSchema, it }) {
if (parentSchema.if === void 0)
(0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`);
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/applicator/index.js
var require_applicator = __commonJS({
"node_modules/ajv/dist/vocabularies/applicator/index.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var additionalItems_1 = require_additionalItems();
var prefixItems_1 = require_prefixItems();
var items_1 = require_items();
var items2020_1 = require_items2020();
var contains_1 = require_contains();
var dependencies_1 = require_dependencies();
var propertyNames_1 = require_propertyNames();
var additionalProperties_1 = require_additionalProperties();
var properties_1 = require_properties();
var patternProperties_1 = require_patternProperties();
var not_1 = require_not();
var anyOf_1 = require_anyOf();
var oneOf_1 = require_oneOf();
var allOf_1 = require_allOf();
var if_1 = require_if();
var thenElse_1 = require_thenElse();
function getApplicator(draft2020 = false) {
const applicator = [
// any
not_1.default,
anyOf_1.default,
oneOf_1.default,
allOf_1.default,
if_1.default,
thenElse_1.default,
// object
propertyNames_1.default,
additionalProperties_1.default,
dependencies_1.default,
properties_1.default,
patternProperties_1.default
];
if (draft2020)
applicator.push(prefixItems_1.default, items2020_1.default);
else
applicator.push(additionalItems_1.default, items_1.default);
applicator.push(contains_1.default);
return applicator;
}
exports2.default = getApplicator;
}
});
// node_modules/ajv/dist/vocabularies/format/format.js
var require_format = __commonJS({
"node_modules/ajv/dist/vocabularies/format/format.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var error = {
message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`,
params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}`
};
var def = {
keyword: "format",
type: ["number", "string"],
schemaType: "string",
$data: true,
error,
code(cxt, ruleType) {
const { gen, data, $data, schema, schemaCode, it } = cxt;
const { opts, errSchemaPath, schemaEnv, self } = it;
if (!opts.validateFormats)
return;
if ($data)
validate$DataFormat();
else
validateFormat();
function validate$DataFormat() {
const fmts = gen.scopeValue("formats", {
ref: self.formats,
code: opts.code.formats
});
const fDef = gen.const("fDef", (0, codegen_1._)`${fmts}[${schemaCode}]`);
const fType = gen.let("fType");
const format = gen.let("format");
gen.if((0, codegen_1._)`typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._)`${fDef}.type || "string"`).assign(format, (0, codegen_1._)`${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._)`"string"`).assign(format, fDef));
cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt()));
function unknownFmt() {
if (opts.strictSchema === false)
return codegen_1.nil;
return (0, codegen_1._)`${schemaCode} && !${format}`;
}
function invalidFmt() {
const callFormat = schemaEnv.$async ? (0, codegen_1._)`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))` : (0, codegen_1._)`${format}(${data})`;
const validData = (0, codegen_1._)`(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`;
return (0, codegen_1._)`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`;
}
}
function validateFormat() {
const formatDef = self.formats[schema];
if (!formatDef) {
unknownFormat();
return;
}
if (formatDef === true)
return;
const [fmtType, format, fmtRef] = getFormat(formatDef);
if (fmtType === ruleType)
cxt.pass(validCondition());
function unknownFormat() {
if (opts.strictSchema === false) {
self.logger.warn(unknownMsg());
return;
}
throw new Error(unknownMsg());
function unknownMsg() {
return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`;
}
}
function getFormat(fmtDef) {
const code = fmtDef instanceof RegExp ? (0, codegen_1.regexpCode)(fmtDef) : opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(schema)}` : void 0;
const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code });
if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) {
return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._)`${fmt}.validate`];
}
return ["string", fmtDef, fmt];
}
function validCondition() {
if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) {
if (!schemaEnv.$async)
throw new Error("async format in sync schema");
return (0, codegen_1._)`await ${fmtRef}(${data})`;
}
return typeof format == "function" ? (0, codegen_1._)`${fmtRef}(${data})` : (0, codegen_1._)`${fmtRef}.test(${data})`;
}
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/vocabularies/format/index.js
var require_format2 = __commonJS({
"node_modules/ajv/dist/vocabularies/format/index.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var format_1 = require_format();
var format = [format_1.default];
exports2.default = format;
}
});
// node_modules/ajv/dist/vocabularies/metadata.js
var require_metadata = __commonJS({
"node_modules/ajv/dist/vocabularies/metadata.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.contentVocabulary = exports2.metadataVocabulary = void 0;
exports2.metadataVocabulary = [
"title",
"description",
"default",
"deprecated",
"readOnly",
"writeOnly",
"examples"
];
exports2.contentVocabulary = [
"contentMediaType",
"contentEncoding",
"contentSchema"
];
}
});
// node_modules/ajv/dist/vocabularies/draft7.js
var require_draft7 = __commonJS({
"node_modules/ajv/dist/vocabularies/draft7.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var core_1 = require_core3();
var validation_1 = require_validation();
var applicator_1 = require_applicator();
var format_1 = require_format2();
var metadata_1 = require_metadata();
var draft7Vocabularies = [
core_1.default,
validation_1.default,
(0, applicator_1.default)(),
format_1.default,
metadata_1.metadataVocabulary,
metadata_1.contentVocabulary
];
exports2.default = draft7Vocabularies;
}
});
// node_modules/ajv/dist/vocabularies/discriminator/types.js
var require_types = __commonJS({
"node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.DiscrError = void 0;
var DiscrError;
(function(DiscrError2) {
DiscrError2["Tag"] = "tag";
DiscrError2["Mapping"] = "mapping";
})(DiscrError || (exports2.DiscrError = DiscrError = {}));
}
});
// node_modules/ajv/dist/vocabularies/discriminator/index.js
var require_discriminator = __commonJS({
"node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var codegen_1 = require_codegen();
var types_1 = require_types();
var compile_1 = require_compile();
var ref_error_1 = require_ref_error();
var util_1 = require_util();
var error = {
message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`,
params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}`
};
var def = {
keyword: "discriminator",
type: "object",
schemaType: "object",
error,
code(cxt) {
const { gen, data, schema, parentSchema, it } = cxt;
const { oneOf } = parentSchema;
if (!it.opts.discriminator) {
throw new Error("discriminator: requires discriminator option");
}
const tagName = schema.propertyName;
if (typeof tagName != "string")
throw new Error("discriminator: requires propertyName");
if (schema.mapping)
throw new Error("discriminator: mapping is not supported");
if (!oneOf)
throw new Error("discriminator: requires oneOf keyword");
const valid = gen.let("valid", false);
const tag = gen.const("tag", (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(tagName)}`);
gen.if((0, codegen_1._)`typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName }));
cxt.ok(valid);
function validateMapping() {
const mapping = getMapping();
gen.if(false);
for (const tagValue in mapping) {
gen.elseIf((0, codegen_1._)`${tag} === ${tagValue}`);
gen.assign(valid, applyTagSchema(mapping[tagValue]));
}
gen.else();
cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName });
gen.endIf();
}
function applyTagSchema(schemaProp) {
const _valid = gen.name("valid");
const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid);
cxt.mergeEvaluated(schCxt, codegen_1.Name);
return _valid;
}
function getMapping() {
var _a;
const oneOfMapping = {};
const topRequired = hasRequired(parentSchema);
let tagRequired = true;
for (let i = 0; i < oneOf.length; i++) {
let sch = oneOf[i];
if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) {
const ref = sch.$ref;
sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref);
if (sch instanceof compile_1.SchemaEnv)
sch = sch.schema;
if (sch === void 0)
throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref);
}
const propSch = (_a = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a === void 0 ? void 0 : _a[tagName];
if (typeof propSch != "object") {
throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`);
}
tagRequired = tagRequired && (topRequired || hasRequired(sch));
addMappings(propSch, i);
}
if (!tagRequired)
throw new Error(`discriminator: "${tagName}" must be required`);
return oneOfMapping;
function hasRequired({ required }) {
return Array.isArray(required) && required.includes(tagName);
}
function addMappings(sch, i) {
if (sch.const) {
addMapping(sch.const, i);
} else if (sch.enum) {
for (const tagValue of sch.enum) {
addMapping(tagValue, i);
}
} else {
throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`);
}
}
function addMapping(tagValue, i) {
if (typeof tagValue != "string" || tagValue in oneOfMapping) {
throw new Error(`discriminator: "${tagName}" values must be unique strings`);
}
oneOfMapping[tagValue] = i;
}
}
}
};
exports2.default = def;
}
});
// node_modules/ajv/dist/refs/json-schema-draft-07.json
var require_json_schema_draft_07 = __commonJS({
"node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports2, module2) {
module2.exports = {
$schema: "http://json-schema.org/draft-07/schema#",
$id: "http://json-schema.org/draft-07/schema#",
title: "Core schema meta-schema",
definitions: {
schemaArray: {
type: "array",
minItems: 1,
items: { $ref: "#" }
},
nonNegativeInteger: {
type: "integer",
minimum: 0
},
nonNegativeIntegerDefault0: {
allOf: [{ $ref: "#/definitions/nonNegativeInteger" }, { default: 0 }]
},
simpleTypes: {
enum: ["array", "boolean", "integer", "null", "number", "object", "string"]
},
stringArray: {
type: "array",
items: { type: "string" },
uniqueItems: true,
default: []
}
},
type: ["object", "boolean"],
properties: {
$id: {
type: "string",
format: "uri-reference"
},
$schema: {
type: "string",
format: "uri"
},
$ref: {
type: "string",
format: "uri-reference"
},
$comment: {
type: "string"
},
title: {
type: "string"
},
description: {
type: "string"
},
default: true,
readOnly: {
type: "boolean",
default: false
},
examples: {
type: "array",
items: true
},
multipleOf: {
type: "number",
exclusiveMinimum: 0
},
maximum: {
type: "number"
},
exclusiveMaximum: {
type: "number"
},
minimum: {
type: "number"
},
exclusiveMinimum: {
type: "number"
},
maxLength: { $ref: "#/definitions/nonNegativeInteger" },
minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" },
pattern: {
type: "string",
format: "regex"
},
additionalItems: { $ref: "#" },
items: {
anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }],
default: true
},
maxItems: { $ref: "#/definitions/nonNegativeInteger" },
minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" },
uniqueItems: {
type: "boolean",
default: false
},
contains: { $ref: "#" },
maxProperties: { $ref: "#/definitions/nonNegativeInteger" },
minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" },
required: { $ref: "#/definitions/stringArray" },
additionalProperties: { $ref: "#" },
definitions: {
type: "object",
additionalProperties: { $ref: "#" },
default: {}
},
properties: {
type: "object",
additionalProperties: { $ref: "#" },
default: {}
},
patternProperties: {
type: "object",
additionalProperties: { $ref: "#" },
propertyNames: { format: "regex" },
default: {}
},
dependencies: {
type: "object",
additionalProperties: {
anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }]
}
},
propertyNames: { $ref: "#" },
const: true,
enum: {
type: "array",
items: true,
minItems: 1,
uniqueItems: true
},
type: {
anyOf: [
{ $ref: "#/definitions/simpleTypes" },
{
type: "array",
items: { $ref: "#/definitions/simpleTypes" },
minItems: 1,
uniqueItems: true
}
]
},
format: { type: "string" },
contentMediaType: { type: "string" },
contentEncoding: { type: "string" },
if: { $ref: "#" },
then: { $ref: "#" },
else: { $ref: "#" },
allOf: { $ref: "#/definitions/schemaArray" },
anyOf: { $ref: "#/definitions/schemaArray" },
oneOf: { $ref: "#/definitions/schemaArray" },
not: { $ref: "#" }
},
default: true
};
}
});
// node_modules/ajv/dist/ajv.js
var require_ajv = __commonJS({
"node_modules/ajv/dist/ajv.js"(exports2, module2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.MissingRefError = exports2.ValidationError = exports2.CodeGen = exports2.Name = exports2.nil = exports2.stringify = exports2.str = exports2._ = exports2.KeywordCxt = exports2.Ajv = void 0;
var core_1 = require_core2();
var draft7_1 = require_draft7();
var discriminator_1 = require_discriminator();
var draft7MetaSchema = require_json_schema_draft_07();
var META_SUPPORT_DATA = ["/properties"];
var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema";
var Ajv2 = class extends core_1.default {
_addVocabularies() {
super._addVocabularies();
draft7_1.default.forEach((v) => this.addVocabulary(v));
if (this.opts.discriminator)
this.addKeyword(discriminator_1.default);
}
_addDefaultMetaSchema() {
super._addDefaultMetaSchema();
if (!this.opts.meta)
return;
const metaSchema = this.opts.$data ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA) : draft7MetaSchema;
this.addMetaSchema(metaSchema, META_SCHEMA_ID, false);
this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID;
}
defaultMeta() {
return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0);
}
};
exports2.Ajv = Ajv2;
module2.exports = exports2 = Ajv2;
module2.exports.Ajv = Ajv2;
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.default = Ajv2;
var validate_1 = require_validate();
Object.defineProperty(exports2, "KeywordCxt", { enumerable: true, get: function() {
return validate_1.KeywordCxt;
} });
var codegen_1 = require_codegen();
Object.defineProperty(exports2, "_", { enumerable: true, get: function() {
return codegen_1._;
} });
Object.defineProperty(exports2, "str", { enumerable: true, get: function() {
return codegen_1.str;
} });
Object.defineProperty(exports2, "stringify", { enumerable: true, get: function() {
return codegen_1.stringify;
} });
Object.defineProperty(exports2, "nil", { enumerable: true, get: function() {
return codegen_1.nil;
} });
Object.defineProperty(exports2, "Name", { enumerable: true, get: function() {
return codegen_1.Name;
} });
Object.defineProperty(exports2, "CodeGen", { enumerable: true, get: function() {
return codegen_1.CodeGen;
} });
var validation_error_1 = require_validation_error();
Object.defineProperty(exports2, "ValidationError", { enumerable: true, get: function() {
return validation_error_1.default;
} });
var ref_error_1 = require_ref_error();
Object.defineProperty(exports2, "MissingRefError", { enumerable: true, get: function() {
return ref_error_1.default;
} });
}
});
// node_modules/ajv-formats/dist/formats.js
var require_formats = __commonJS({
"node_modules/ajv-formats/dist/formats.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.formatNames = exports2.fastFormats = exports2.fullFormats = void 0;
function fmtDef(validate, compare) {
return { validate, compare };
}
exports2.fullFormats = {
// date: http://tools.ietf.org/html/rfc3339#section-5.6
date: fmtDef(date, compareDate),
// date-time: http://tools.ietf.org/html/rfc3339#section-5.6
time: fmtDef(getTime(true), compareTime),
"date-time": fmtDef(getDateTime(true), compareDateTime),
"iso-time": fmtDef(getTime(), compareIsoTime),
"iso-date-time": fmtDef(getDateTime(), compareIsoDateTime),
// duration: https://tools.ietf.org/html/rfc3339#appendix-A
duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/,
uri,
"uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,
// uri-template: https://tools.ietf.org/html/rfc6570
"uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,
// For the source: https://gist.github.com/dperini/729294
// For test cases: https://mathiasbynens.be/demo/url-regex
url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu,
email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,
// optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/,
ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i,
regex,
// uuid: http://tools.ietf.org/html/rfc4122
uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,
// JSON-pointer: https://tools.ietf.org/html/rfc6901
// uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A
"json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/,
"json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,
// relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00
"relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/,
// the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types
// byte: https://github.com/miguelmota/is-base64
byte,
// signed 32 bit integer
int32: { type: "number", validate: validateInt32 },
// signed 64 bit integer
int64: { type: "number", validate: validateInt64 },
// C-type float
float: { type: "number", validate: validateNumber },
// C-type double
double: { type: "number", validate: validateNumber },
// hint to the UI to hide input strings
password: true,
// unchecked string payload
binary: true
};
exports2.fastFormats = {
...exports2.fullFormats,
date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate),
time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime),
"date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime),
"iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime),
"iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime),
// uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js
uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,
"uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,
// email (sources from jsen validator):
// http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363
// http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation')
email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i
};
exports2.formatNames = Object.keys(exports2.fullFormats);
function isLeapYear(year) {
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}
var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
function date(str) {
const matches = DATE.exec(str);
if (!matches)
return false;
const year = +matches[1];
const month = +matches[2];
const day = +matches[3];
return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]);
}
function compareDate(d1, d2) {
if (!(d1 && d2))
return void 0;
if (d1 > d2)
return 1;
if (d1 < d2)
return -1;
return 0;
}
var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i;
function getTime(strictTimeZone) {
return function time(str) {
const matches = TIME.exec(str);
if (!matches)
return false;
const hr = +matches[1];
const min = +matches[2];
const sec = +matches[3];
const tz = matches[4];
const tzSign = matches[5] === "-" ? -1 : 1;
const tzH = +(matches[6] || 0);
const tzM = +(matches[7] || 0);
if (tzH > 23 || tzM > 59 || strictTimeZone && !tz)
return false;
if (hr <= 23 && min <= 59 && sec < 60)
return true;
const utcMin = min - tzM * tzSign;
const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0);
return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61;
};
}
function compareTime(s1, s2) {
if (!(s1 && s2))
return void 0;
const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf();
const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf();
if (!(t1 && t2))
return void 0;
return t1 - t2;
}
function compareIsoTime(t1, t2) {
if (!(t1 && t2))
return void 0;
const a1 = TIME.exec(t1);
const a2 = TIME.exec(t2);
if (!(a1 && a2))
return void 0;
t1 = a1[1] + a1[2] + a1[3];
t2 = a2[1] + a2[2] + a2[3];
if (t1 > t2)
return 1;
if (t1 < t2)
return -1;
return 0;
}
var DATE_TIME_SEPARATOR = /t|\s/i;
function getDateTime(strictTimeZone) {
const time = getTime(strictTimeZone);
return function date_time(str) {
const dateTime = str.split(DATE_TIME_SEPARATOR);
return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1]);
};
}
function compareDateTime(dt1, dt2) {
if (!(dt1 && dt2))
return void 0;
const d1 = new Date(dt1).valueOf();
const d2 = new Date(dt2).valueOf();
if (!(d1 && d2))
return void 0;
return d1 - d2;
}
function compareIsoDateTime(dt1, dt2) {
if (!(dt1 && dt2))
return void 0;
const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR);
const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR);
const res = compareDate(d1, d2);
if (res === void 0)
return void 0;
return res || compareTime(t1, t2);
}
var NOT_URI_FRAGMENT = /\/|:/;
var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
function uri(str) {
return NOT_URI_FRAGMENT.test(str) && URI.test(str);
}
var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm;
function byte(str) {
BYTE.lastIndex = 0;
return BYTE.test(str);
}
var MIN_INT32 = -(2 ** 31);
var MAX_INT32 = 2 ** 31 - 1;
function validateInt32(value) {
return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32;
}
function validateInt64(value) {
return Number.isInteger(value);
}
function validateNumber() {
return true;
}
var Z_ANCHOR = /[^\\]\\Z/;
function regex(str) {
if (Z_ANCHOR.test(str))
return false;
try {
new RegExp(str);
return true;
} catch (e) {
return false;
}
}
}
});
// node_modules/ajv-formats/dist/limit.js
var require_limit = __commonJS({
"node_modules/ajv-formats/dist/limit.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.formatLimitDefinition = void 0;
var ajv_1 = require_ajv();
var codegen_1 = require_codegen();
var ops = codegen_1.operators;
var KWDs = {
formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT },
formatMinimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT },
formatExclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE },
formatExclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE }
};
var error = {
message: ({ keyword, schemaCode }) => (0, codegen_1.str)`should be ${KWDs[keyword].okStr} ${schemaCode}`,
params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}`
};
exports2.formatLimitDefinition = {
keyword: Object.keys(KWDs),
type: "string",
schemaType: "string",
$data: true,
error,
code(cxt) {
const { gen, data, schemaCode, keyword, it } = cxt;
const { opts, self } = it;
if (!opts.validateFormats)
return;
const fCxt = new ajv_1.KeywordCxt(it, self.RULES.all.format.definition, "format");
if (fCxt.$data)
validate$DataFormat();
else
validateFormat();
function validate$DataFormat() {
const fmts = gen.scopeValue("formats", {
ref: self.formats,
code: opts.code.formats
});
const fmt = gen.const("fmt", (0, codegen_1._)`${fmts}[${fCxt.schemaCode}]`);
cxt.fail$data((0, codegen_1.or)((0, codegen_1._)`typeof ${fmt} != "object"`, (0, codegen_1._)`${fmt} instanceof RegExp`, (0, codegen_1._)`typeof ${fmt}.compare != "function"`, compareCode(fmt)));
}
function validateFormat() {
const format = fCxt.schema;
const fmtDef = self.formats[format];
if (!fmtDef || fmtDef === true)
return;
if (typeof fmtDef != "object" || fmtDef instanceof RegExp || typeof fmtDef.compare != "function") {
throw new Error(`"${keyword}": format "${format}" does not define "compare" function`);
}
const fmt = gen.scopeValue("formats", {
key: format,
ref: fmtDef,
code: opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(format)}` : void 0
});
cxt.fail$data(compareCode(fmt));
}
function compareCode(fmt) {
return (0, codegen_1._)`${fmt}.compare(${data}, ${schemaCode}) ${KWDs[keyword].fail} 0`;
}
},
dependencies: ["format"]
};
var formatLimitPlugin = (ajv2) => {
ajv2.addKeyword(exports2.formatLimitDefinition);
return ajv2;
};
exports2.default = formatLimitPlugin;
}
});
// node_modules/ajv-formats/dist/index.js
var require_dist = __commonJS({
"node_modules/ajv-formats/dist/index.js"(exports2, module2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
var formats_1 = require_formats();
var limit_1 = require_limit();
var codegen_1 = require_codegen();
var fullName = new codegen_1.Name("fullFormats");
var fastName = new codegen_1.Name("fastFormats");
var formatsPlugin = (ajv2, opts = { keywords: true }) => {
if (Array.isArray(opts)) {
addFormats2(ajv2, opts, formats_1.fullFormats, fullName);
return ajv2;
}
const [formats, exportName] = opts.mode === "fast" ? [formats_1.fastFormats, fastName] : [formats_1.fullFormats, fullName];
const list = opts.formats || formats_1.formatNames;
addFormats2(ajv2, list, formats, exportName);
if (opts.keywords)
(0, limit_1.default)(ajv2);
return ajv2;
};
formatsPlugin.get = (name, mode = "full") => {
const formats = mode === "fast" ? formats_1.fastFormats : formats_1.fullFormats;
const f = formats[name];
if (!f)
throw new Error(`Unknown format "${name}"`);
return f;
};
function addFormats2(ajv2, list, fs, exportName) {
var _a;
var _b;
(_a = (_b = ajv2.opts.code).formats) !== null && _a !== void 0 ? _a : _b.formats = (0, codegen_1._)`require("ajv-formats/dist/formats").${exportName}`;
for (const f of list)
ajv2.addFormat(f, fs[f]);
}
module2.exports = exports2 = formatsPlugin;
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.default = formatsPlugin;
}
});
// node_modules/keet-identity-key/node_modules/compact-encoding/endian.js
var require_endian3 = __commonJS({
"node_modules/keet-identity-key/node_modules/compact-encoding/endian.js"(exports2) {
var LE = exports2.LE = new Uint8Array(new Uint16Array([255]).buffer)[0] === 255;
exports2.BE = !LE;
}
});
// node_modules/keet-identity-key/node_modules/compact-encoding/raw.js
var require_raw3 = __commonJS({
"node_modules/keet-identity-key/node_modules/compact-encoding/raw.js"(exports2, module2) {
var b4a4 = require_b4a();
var { BE } = require_endian3();
exports2 = module2.exports = {
preencode(state, b) {
state.end += b.byteLength;
},
encode(state, b) {
state.buffer.set(b, state.start);
state.start += b.byteLength;
},
decode(state) {
const b = state.buffer.subarray(state.start, state.end);
state.start = state.end;
return b;
}
};
var buffer = exports2.buffer = {
preencode(state, b) {
uint8array.preencode(state, b);
},
encode(state, b) {
uint8array.encode(state, b);
},
decode(state) {
const b = state.buffer.subarray(state.start);
state.start = state.end;
return b;
}
};
exports2.binary = {
...buffer,
preencode(state, b) {
if (typeof b === "string") utf8.preencode(state, b);
else buffer.preencode(state, b);
},
encode(state, b) {
if (typeof b === "string") utf8.encode(state, b);
else buffer.encode(state, b);
}
};
exports2.arraybuffer = {
preencode(state, b) {
state.end += b.byteLength;
},
encode(state, b) {
const view = new Uint8Array(b);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
const b = new ArrayBuffer(state.end - state.start);
const view = new Uint8Array(b);
view.set(state.buffer.subarray(state.start));
state.start = state.end;
return b;
}
};
function typedarray(TypedArray, swap) {
const n = TypedArray.BYTES_PER_ELEMENT;
return {
preencode(state, b) {
state.end += b.byteLength;
},
encode(state, b) {
const view = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
if (BE && swap) swap(view);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
let b = state.buffer.subarray(state.start);
if (b.byteOffset % n !== 0) b = new Uint8Array(b);
if (BE && swap) swap(b);
state.start = state.end;
return new TypedArray(b.buffer, b.byteOffset, b.byteLength / n);
}
};
}
var uint8array = exports2.uint8array = typedarray(Uint8Array);
exports2.uint16array = typedarray(Uint16Array, b4a4.swap16);
exports2.uint32array = typedarray(Uint32Array, b4a4.swap32);
exports2.int8array = typedarray(Int8Array);
exports2.int16array = typedarray(Int16Array, b4a4.swap16);
exports2.int32array = typedarray(Int32Array, b4a4.swap32);
exports2.biguint64array = typedarray(BigUint64Array, b4a4.swap64);
exports2.bigint64array = typedarray(BigInt64Array, b4a4.swap64);
exports2.float32array = typedarray(Float32Array, b4a4.swap32);
exports2.float64array = typedarray(Float64Array, b4a4.swap64);
function string(encoding) {
return {
preencode(state, s) {
state.end += b4a4.byteLength(s, encoding);
},
encode(state, s) {
state.start += b4a4.write(state.buffer, s, state.start, encoding);
},
decode(state) {
const s = b4a4.toString(state.buffer, encoding, state.start);
state.start = state.end;
return s;
}
};
}
var utf8 = exports2.string = exports2.utf8 = string("utf-8");
exports2.ascii = string("ascii");
exports2.hex = string("hex");
exports2.base64 = string("base64");
exports2.ucs2 = exports2.utf16le = string("utf16le");
exports2.array = function array(enc) {
return {
preencode(state, list) {
for (const value of list) enc.preencode(state, value);
},
encode(state, list) {
for (const value of list) enc.encode(state, value);
},
decode(state) {
const arr = [];
while (state.start < state.end) arr.push(enc.decode(state));
return arr;
}
};
};
exports2.json = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v));
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v));
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
exports2.ndjson = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v) + "\n");
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v) + "\n");
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
}
});
// node_modules/keet-identity-key/node_modules/compact-encoding/lexint.js
var require_lexint3 = __commonJS({
"node_modules/keet-identity-key/node_modules/compact-encoding/lexint.js"(exports2, module2) {
module2.exports = {
preencode,
encode: encode2,
decode: decode2
};
function preencode(state, num) {
if (num < 251) {
state.end++;
} else if (num < 256) {
state.end += 2;
} else if (num < 65536) {
state.end += 3;
} else if (num < 16777216) {
state.end += 4;
} else if (num < 4294967296) {
state.end += 5;
} else {
state.end++;
const exp = Math.floor(Math.log(num) / Math.log(2)) - 32;
preencode(state, exp);
state.end += 6;
}
}
function encode2(state, num) {
const max = 251;
const x = num - max;
if (num < max) {
state.buffer[state.start++] = num;
} else if (num < 256) {
state.buffer[state.start++] = max;
state.buffer[state.start++] = x;
} else if (num < 65536) {
state.buffer[state.start++] = max + 1;
state.buffer[state.start++] = x >> 8 & 255;
state.buffer[state.start++] = x & 255;
} else if (num < 16777216) {
state.buffer[state.start++] = max + 2;
state.buffer[state.start++] = x >> 16;
state.buffer[state.start++] = x >> 8 & 255;
state.buffer[state.start++] = x & 255;
} else if (num < 4294967296) {
state.buffer[state.start++] = max + 3;
state.buffer[state.start++] = x >> 24;
state.buffer[state.start++] = x >> 16 & 255;
state.buffer[state.start++] = x >> 8 & 255;
state.buffer[state.start++] = x & 255;
} else {
const exp = Math.floor(Math.log(x) / Math.log(2)) - 32;
state.buffer[state.start++] = 255;
encode2(state, exp);
const rem = x / Math.pow(2, exp - 11);
for (let i = 5; i >= 0; i--) {
state.buffer[state.start++] = rem / Math.pow(2, 8 * i) & 255;
}
}
}
function decode2(state) {
const max = 251;
if (state.end - state.start < 1) throw new Error("Out of bounds");
const flag = state.buffer[state.start++];
if (flag < max) return flag;
if (state.end - state.start < flag - max + 1) {
throw new Error("Out of bounds.");
}
if (flag < 252) {
return state.buffer[state.start++] + max;
}
if (flag < 253) {
return (state.buffer[state.start++] << 8) + state.buffer[state.start++] + max;
}
if (flag < 254) {
return (state.buffer[state.start++] << 16) + (state.buffer[state.start++] << 8) + state.buffer[state.start++] + max;
}
if (flag < 255) {
return state.buffer[state.start++] * 16777216 + (state.buffer[state.start++] << 16) + (state.buffer[state.start++] << 8) + state.buffer[state.start++] + max;
}
const exp = decode2(state);
if (state.end - state.start < 6) throw new Error("Out of bounds");
let rem = 0;
for (let i = 5; i >= 0; i--) {
rem += state.buffer[state.start++] * Math.pow(2, 8 * i);
}
return rem * Math.pow(2, exp - 11) + max;
}
}
});
// node_modules/keet-identity-key/node_modules/compact-encoding/index.js
var require_compact_encoding3 = __commonJS({
"node_modules/keet-identity-key/node_modules/compact-encoding/index.js"(exports2) {
var b4a4 = require_b4a();
var { BE } = require_endian3();
exports2.state = function(start = 0, end = 0, buffer2 = null) {
return { start, end, buffer: buffer2 };
};
var raw = exports2.raw = require_raw3();
var uint = exports2.uint = {
preencode(state, n) {
state.end += n <= 252 ? 1 : n <= 65535 ? 3 : n <= 4294967295 ? 5 : 9;
},
encode(state, n) {
if (n <= 252) uint8.encode(state, n);
else if (n <= 65535) {
state.buffer[state.start++] = 253;
uint16.encode(state, n);
} else if (n <= 4294967295) {
state.buffer[state.start++] = 254;
uint32.encode(state, n);
} else {
state.buffer[state.start++] = 255;
uint64.encode(state, n);
}
},
decode(state) {
const a = uint8.decode(state);
if (a <= 252) return a;
if (a === 253) return uint16.decode(state);
if (a === 254) return uint32.decode(state);
return uint64.decode(state);
}
};
var uint8 = exports2.uint8 = {
preencode(state, n) {
state.end += 1;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
},
decode(state) {
if (state.start >= state.end) throw new Error("Out of bounds");
return state.buffer[state.start++];
}
};
var uint16 = exports2.uint16 = {
preencode(state, n) {
state.end += 2;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
state.buffer[state.start++] = n >>> 8;
},
decode(state) {
if (state.end - state.start < 2) throw new Error("Out of bounds");
return state.buffer[state.start++] + state.buffer[state.start++] * 256;
}
};
var uint24 = exports2.uint24 = {
preencode(state, n) {
state.end += 3;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n >>> 16;
},
decode(state) {
if (state.end - state.start < 3) throw new Error("Out of bounds");
return state.buffer[state.start++] + state.buffer[state.start++] * 256 + state.buffer[state.start++] * 65536;
}
};
var uint32 = exports2.uint32 = {
preencode(state, n) {
state.end += 4;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n >>> 16;
state.buffer[state.start++] = n >>> 24;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
return state.buffer[state.start++] + state.buffer[state.start++] * 256 + state.buffer[state.start++] * 65536 + state.buffer[state.start++] * 16777216;
}
};
var uint32be = exports2.uint32be = {
preencode(state, n) {
state.end += 4;
},
encode(state, n) {
validateUint(n);
state.buffer[state.start++] = n >>> 24;
state.buffer[state.start++] = n >>> 16;
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
return state.buffer[state.start++] * 16777216 + state.buffer[state.start++] * 65536 + state.buffer[state.start++] * 256 + state.buffer[state.start++];
}
};
var uint40 = exports2.uint40 = {
preencode(state, n) {
state.end += 5;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 256);
uint8.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 5) throw new Error("Out of bounds");
return uint8.decode(state) + 256 * uint32.decode(state);
}
};
var uint48 = exports2.uint48 = {
preencode(state, n) {
state.end += 6;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 65536);
uint16.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 6) throw new Error("Out of bounds");
return uint16.decode(state) + 65536 * uint32.decode(state);
}
};
var uint56 = exports2.uint56 = {
preencode(state, n) {
state.end += 7;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 16777216);
uint24.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 7) throw new Error("Out of bounds");
return uint24.decode(state) + 16777216 * uint32.decode(state);
}
};
var uint64 = exports2.uint64 = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 4294967296);
uint32.encode(state, n);
uint32.encode(state, r);
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
return uint32.decode(state) + 4294967296 * uint32.decode(state);
}
};
exports2.uint64be = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
validateUint(n);
const r = Math.floor(n / 4294967296);
uint32be.encode(state, r);
uint32be.encode(state, n);
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
return 4294967296 * uint32be.decode(state) + uint32be.decode(state);
}
};
var int = exports2.int = zigZagInt(uint);
exports2.int8 = zigZagInt(uint8);
exports2.int16 = zigZagInt(uint16);
exports2.int24 = zigZagInt(uint24);
exports2.int32 = zigZagInt(uint32);
exports2.int40 = zigZagInt(uint40);
exports2.int48 = zigZagInt(uint48);
exports2.int56 = zigZagInt(uint56);
exports2.int64 = zigZagInt(uint64);
var biguint64 = exports2.biguint64 = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
view.setBigUint64(0, n, true);
state.start += 8;
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
const n = view.getBigUint64(0, true);
state.start += 8;
return n;
}
};
exports2.bigint64 = zigZagBigInt(biguint64);
var biguint = exports2.biguint = {
preencode(state, n) {
let len = 0;
for (let m = n; m; m = m >> 64n) len++;
uint.preencode(state, len);
state.end += 8 * len;
},
encode(state, n) {
let len = 0;
for (let m = n; m; m = m >> 64n) len++;
uint.encode(state, len);
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8 * len
);
for (let m = n, i = 0; m; m = m >> 64n, i += 8) {
view.setBigUint64(i, BigInt.asUintN(64, m), true);
}
state.start += 8 * len;
},
decode(state) {
const len = uint.decode(state);
if (state.end - state.start < 8 * len) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8 * len
);
let n = 0n;
for (let i = len - 1; i >= 0; i--)
n = (n << 64n) + view.getBigUint64(i * 8, true);
state.start += 8 * len;
return n;
}
};
exports2.bigint = zigZagBigInt(biguint);
exports2.lexint = require_lexint3();
exports2.float32 = {
preencode(state, n) {
state.end += 4;
},
encode(state, n) {
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
4
);
view.setFloat32(0, n, true);
state.start += 4;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
4
);
const float = view.getFloat32(0, true);
state.start += 4;
return float;
}
};
exports2.float64 = {
preencode(state, n) {
state.end += 8;
},
encode(state, n) {
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
view.setFloat64(0, n, true);
state.start += 8;
},
decode(state) {
if (state.end - state.start < 8) throw new Error("Out of bounds");
const view = new DataView(
state.buffer.buffer,
state.start + state.buffer.byteOffset,
8
);
const float = view.getFloat64(0, true);
state.start += 8;
return float;
}
};
var buffer = exports2.buffer = {
preencode(state, b) {
uint8array.preencode(state, b);
},
encode(state, b) {
uint8array.encode(state, b);
},
decode(state) {
const len = uint.decode(state);
if (state.end - state.start < len) throw new Error("Out of bounds");
return state.buffer.subarray(state.start, state.start += len);
}
};
exports2.optionalBuffer = {
preencode(state, b) {
if (b) uint8array.preencode(state, b);
else state.end++;
},
encode(state, b) {
if (b) uint8array.encode(state, b);
else state.buffer[state.start++] = 0;
},
decode(state) {
const len = uint.decode(state);
if (len === 0) return null;
if (state.end - state.start < len) throw new Error("Out of bounds");
return state.buffer.subarray(state.start, state.start += len);
}
};
exports2.binary = {
...buffer,
preencode(state, b) {
if (typeof b === "string") utf8.preencode(state, b);
else buffer.preencode(state, b);
},
encode(state, b) {
if (typeof b === "string") utf8.encode(state, b);
else buffer.encode(state, b);
}
};
exports2.arraybuffer = {
preencode(state, b) {
uint.preencode(state, b.byteLength);
state.end += b.byteLength;
},
encode(state, b) {
uint.encode(state, b.byteLength);
const view = new Uint8Array(b);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
const len = uint.decode(state);
const b = new ArrayBuffer(len);
const view = new Uint8Array(b);
view.set(state.buffer.subarray(state.start, state.start += len));
return b;
}
};
function typedarray(TypedArray, swap) {
const n = TypedArray.BYTES_PER_ELEMENT;
return {
preencode(state, b) {
uint.preencode(state, b.length);
state.end += b.byteLength;
},
encode(state, b) {
uint.encode(state, b.length);
const view = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
if (BE && swap) swap(view);
state.buffer.set(view, state.start);
state.start += b.byteLength;
},
decode(state) {
const len = uint.decode(state);
let b = state.buffer.subarray(state.start, state.start += len * n);
if (b.byteLength !== len * n) throw new Error("Out of bounds");
if (b.byteOffset % n !== 0) b = new Uint8Array(b);
if (BE && swap) swap(b);
return new TypedArray(b.buffer, b.byteOffset, b.byteLength / n);
}
};
}
var uint8array = exports2.uint8array = typedarray(Uint8Array);
exports2.uint16array = typedarray(Uint16Array, b4a4.swap16);
exports2.uint32array = typedarray(Uint32Array, b4a4.swap32);
exports2.int8array = typedarray(Int8Array);
exports2.int16array = typedarray(Int16Array, b4a4.swap16);
exports2.int32array = typedarray(Int32Array, b4a4.swap32);
exports2.biguint64array = typedarray(BigUint64Array, b4a4.swap64);
exports2.bigint64array = typedarray(BigInt64Array, b4a4.swap64);
exports2.float32array = typedarray(Float32Array, b4a4.swap32);
exports2.float64array = typedarray(Float64Array, b4a4.swap64);
function string(encoding) {
return {
preencode(state, s) {
const len = b4a4.byteLength(s, encoding);
uint.preencode(state, len);
state.end += len;
},
encode(state, s) {
const len = b4a4.byteLength(s, encoding);
uint.encode(state, len);
b4a4.write(state.buffer, s, state.start, encoding);
state.start += len;
},
decode(state) {
const len = uint.decode(state);
if (state.end - state.start < len) throw new Error("Out of bounds");
return b4a4.toString(
state.buffer,
encoding,
state.start,
state.start += len
);
},
fixed(n) {
return {
preencode(state) {
state.end += n;
},
encode(state, s) {
b4a4.write(state.buffer, s, state.start, n, encoding);
state.start += n;
},
decode(state) {
if (state.end - state.start < n) throw new Error("Out of bounds");
return b4a4.toString(
state.buffer,
encoding,
state.start,
state.start += n
);
}
};
}
};
}
var utf8 = exports2.string = exports2.utf8 = string("utf-8");
exports2.ascii = string("ascii");
exports2.hex = string("hex");
exports2.base64 = string("base64");
exports2.ucs2 = exports2.utf16le = string("utf16le");
exports2.bool = {
preencode(state, b) {
state.end++;
},
encode(state, b) {
state.buffer[state.start++] = b ? 1 : 0;
},
decode(state) {
if (state.start >= state.end) throw Error("Out of bounds");
return state.buffer[state.start++] === 1;
}
};
var fixed = exports2.fixed = function fixed2(n) {
return {
preencode(state, s) {
if (s.byteLength !== n) throw new Error("Incorrect buffer size");
state.end += n;
},
encode(state, s) {
state.buffer.set(s, state.start);
state.start += n;
},
decode(state) {
if (state.end - state.start < n) throw new Error("Out of bounds");
return state.buffer.subarray(state.start, state.start += n);
}
};
};
exports2.fixed32 = fixed(32);
exports2.fixed64 = fixed(64);
exports2.array = function array(enc) {
return {
preencode(state, list) {
uint.preencode(state, list.length);
for (let i = 0; i < list.length; i++) enc.preencode(state, list[i]);
},
encode(state, list) {
uint.encode(state, list.length);
for (let i = 0; i < list.length; i++) enc.encode(state, list[i]);
},
decode(state) {
const len = uint.decode(state);
if (len > 1048576) throw new Error("Array is too big");
const arr = new Array(len);
for (let i = 0; i < len; i++) arr[i] = enc.decode(state);
return arr;
}
};
};
exports2.frame = function frame(enc) {
const dummy = exports2.state();
return {
preencode(state, m) {
const end = state.end;
enc.preencode(state, m);
uint.preencode(state, state.end - end);
},
encode(state, m) {
dummy.end = 0;
enc.preencode(dummy, m);
uint.encode(state, dummy.end);
enc.encode(state, m);
},
decode(state) {
const end = state.end;
const len = uint.decode(state);
state.end = state.start + len;
const m = enc.decode(state);
state.start = state.end;
state.end = end;
return m;
}
};
};
exports2.date = {
preencode(state, d) {
int.preencode(state, d.getTime());
},
encode(state, d) {
int.encode(state, d.getTime());
},
decode(state, d) {
return new Date(int.decode(state));
}
};
exports2.json = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v));
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v));
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
exports2.ndjson = {
preencode(state, v) {
utf8.preencode(state, JSON.stringify(v) + "\n");
},
encode(state, v) {
utf8.encode(state, JSON.stringify(v) + "\n");
},
decode(state) {
return JSON.parse(utf8.decode(state));
}
};
exports2.none = {
preencode(state, n) {
},
encode(state, n) {
},
decode(state) {
return null;
}
};
var anyArray = {
preencode(state, arr) {
uint.preencode(state, arr.length);
for (let i = 0; i < arr.length; i++) {
any.preencode(state, arr[i]);
}
},
encode(state, arr) {
uint.encode(state, arr.length);
for (let i = 0; i < arr.length; i++) {
any.encode(state, arr[i]);
}
},
decode(state) {
const arr = [];
let len = uint.decode(state);
while (len-- > 0) {
arr.push(any.decode(state));
}
return arr;
}
};
var anyObject = {
preencode(state, o) {
const keys = Object.keys(o);
uint.preencode(state, keys.length);
for (const key of keys) {
utf8.preencode(state, key);
any.preencode(state, o[key]);
}
},
encode(state, o) {
const keys = Object.keys(o);
uint.encode(state, keys.length);
for (const key of keys) {
utf8.encode(state, key);
any.encode(state, o[key]);
}
},
decode(state) {
let len = uint.decode(state);
const o = {};
while (len-- > 0) {
const key = utf8.decode(state);
o[key] = any.decode(state);
}
return o;
}
};
var anyTypes = [
exports2.none,
exports2.bool,
exports2.string,
exports2.buffer,
exports2.uint,
exports2.int,
exports2.float64,
anyArray,
anyObject,
exports2.date
];
var any = exports2.any = {
preencode(state, o) {
const t = getType(o);
uint.preencode(state, t);
anyTypes[t].preencode(state, o);
},
encode(state, o) {
const t = getType(o);
uint.encode(state, t);
anyTypes[t].encode(state, o);
},
decode(state) {
const t = uint.decode(state);
if (t >= anyTypes.length) throw new Error("Unknown type: " + t);
return anyTypes[t].decode(state);
}
};
var port = exports2.port = uint16;
var address = (host, family) => {
return {
preencode(state, m) {
host.preencode(state, m.host);
port.preencode(state, m.port);
},
encode(state, m) {
host.encode(state, m.host);
port.encode(state, m.port);
},
decode(state) {
return {
host: host.decode(state),
family,
port: port.decode(state)
};
}
};
};
var ipv4 = exports2.ipv4 = {
preencode(state) {
state.end += 4;
},
encode(state, string2) {
const start = state.start;
const end = start + 4;
let i = 0;
while (i < string2.length) {
let n = 0;
let c4;
while (i < string2.length && (c4 = string2.charCodeAt(i++)) !== /* . */
46) {
n = n * 10 + (c4 - /* 0 */
48);
}
state.buffer[state.start++] = n;
}
state.start = end;
},
decode(state) {
if (state.end - state.start < 4) throw new Error("Out of bounds");
return state.buffer[state.start++] + "." + state.buffer[state.start++] + "." + state.buffer[state.start++] + "." + state.buffer[state.start++];
}
};
exports2.ipv4Address = address(ipv4, 4);
var ipv6 = exports2.ipv6 = {
preencode(state) {
state.end += 16;
},
encode(state, string2) {
const start = state.start;
const end = start + 16;
let i = 0;
let split2 = null;
while (i < string2.length) {
let n = 0;
let c4;
while (i < string2.length && (c4 = string2.charCodeAt(i++)) !== /* : */
58) {
if (c4 >= 48 && c4 <= 57) n = n * 16 + (c4 - /* 0 */
48);
else if (c4 >= 65 && c4 <= 70) n = n * 16 + (c4 - /* A */
65 + 10);
else if (c4 >= 97 && c4 <= 102) n = n * 16 + (c4 - /* a */
97 + 10);
}
state.buffer[state.start++] = n >>> 8;
state.buffer[state.start++] = n;
if (i < string2.length && string2.charCodeAt(i) === /* : */
58) {
i++;
split2 = state.start;
}
}
if (split2 !== null) {
const offset = end - state.start;
state.buffer.copyWithin(split2 + offset, split2).fill(0, split2, split2 + offset);
}
state.start = end;
},
decode(state) {
if (state.end - state.start < 16) throw new Error("Out of bounds");
return (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16) + ":" + (state.buffer[state.start++] * 256 + state.buffer[state.start++]).toString(16);
}
};
exports2.ipv6Address = address(ipv6, 6);
var ip = exports2.ip = {
preencode(state, string2) {
const family = string2.includes(":") ? 6 : 4;
uint8.preencode(state, family);
if (family === 4) ipv4.preencode(state);
else ipv6.preencode(state);
},
encode(state, string2) {
const family = string2.includes(":") ? 6 : 4;
uint8.encode(state, family);
if (family === 4) ipv4.encode(state, string2);
else ipv6.encode(state, string2);
},
decode(state) {
const family = uint8.decode(state);
if (family === 4) return ipv4.decode(state);
else return ipv6.decode(state);
}
};
exports2.ipAddress = {
preencode(state, m) {
ip.preencode(state, m.host);
port.preencode(state, m.port);
},
encode(state, m) {
ip.encode(state, m.host);
port.encode(state, m.port);
},
decode(state) {
const family = uint8.decode(state);
return {
host: family === 4 ? ipv4.decode(state) : ipv6.decode(state),
family,
port: port.decode(state)
};
}
};
var record = exports2.record = function(keyEncoding, valueEncoding) {
return {
preencode(state, v) {
const keys = Object.keys(v);
uint.preencode(state, keys.length);
for (const k of keys) {
keyEncoding.preencode(state, k);
valueEncoding.preencode(state, v[k]);
}
},
encode(state, v) {
const keys = Object.keys(v);
uint.encode(state, keys.length);
for (const k of keys) {
keyEncoding.encode(state, k);
valueEncoding.encode(state, v[k]);
}
},
decode(state) {
const out = /* @__PURE__ */ Object.create(null);
const keys = uint.decode(state);
for (let i = 0; i < keys; i++) {
out[keyEncoding.decode(state)] = valueEncoding.decode(state);
}
return out;
}
};
};
exports2.stringRecord = record(utf8, utf8);
function getType(o) {
if (o === null || o === void 0) return 0;
if (typeof o === "boolean") return 1;
if (typeof o === "string") return 2;
if (b4a4.isBuffer(o)) return 3;
if (typeof o === "number") {
if (Number.isInteger(o)) return o >= 0 ? 4 : 5;
return 6;
}
if (Array.isArray(o)) return 7;
if (o instanceof Date) return 9;
if (typeof o === "object") return 8;
throw new Error("Unsupported type for " + o);
}
exports2.from = function from(enc) {
if (typeof enc === "string") return fromNamed(enc);
if (enc.preencode) return enc;
if (enc.encodingLength) return fromAbstractEncoder(enc);
return fromCodec(enc);
};
function fromNamed(enc) {
switch (enc) {
case "ascii":
return raw.ascii;
case "utf-8":
case "utf8":
return raw.utf8;
case "hex":
return raw.hex;
case "base64":
return raw.base64;
case "utf16-le":
case "utf16le":
case "ucs-2":
case "ucs2":
return raw.ucs2;
case "ndjson":
return raw.ndjson;
case "json":
return raw.json;
case "binary":
default:
return raw.binary;
}
}
function fromCodec(enc) {
let tmpM = null;
let tmpBuf = null;
return {
preencode(state, m) {
tmpM = m;
tmpBuf = enc.encode(m);
state.end += tmpBuf.byteLength;
},
encode(state, m) {
raw.encode(state, m === tmpM ? tmpBuf : enc.encode(m));
tmpM = tmpBuf = null;
},
decode(state) {
return enc.decode(raw.decode(state));
}
};
}
function fromAbstractEncoder(enc) {
return {
preencode(state, m) {
state.end += enc.encodingLength(m);
},
encode(state, m) {
enc.encode(m, state.buffer, state.start);
state.start += enc.encode.bytes;
},
decode(state) {
const m = enc.decode(state.buffer, state.start, state.end);
state.start += enc.decode.bytes;
return m;
}
};
}
exports2.encode = function encode2(enc, m) {
const state = exports2.state();
enc.preencode(state, m);
state.buffer = b4a4.allocUnsafe(state.end);
enc.encode(state, m);
return state.buffer;
};
exports2.decode = function decode2(enc, buffer2) {
return enc.decode(exports2.state(0, buffer2.byteLength, buffer2));
};
function zigZagInt(enc) {
return {
preencode(state, n) {
enc.preencode(state, zigZagEncodeInt(n));
},
encode(state, n) {
enc.encode(state, zigZagEncodeInt(n));
},
decode(state) {
return zigZagDecodeInt(enc.decode(state));
}
};
}
function zigZagDecodeInt(n) {
return n === 0 ? n : (n & 1) === 0 ? n / 2 : -(n + 1) / 2;
}
function zigZagEncodeInt(n) {
return n < 0 ? 2 * -n - 1 : n === 0 ? 0 : 2 * n;
}
function zigZagBigInt(enc) {
return {
preencode(state, n) {
enc.preencode(state, zigZagEncodeBigInt(n));
},
encode(state, n) {
enc.encode(state, zigZagEncodeBigInt(n));
},
decode(state) {
return zigZagDecodeBigInt(enc.decode(state));
}
};
}
function zigZagDecodeBigInt(n) {
return n === 0n ? n : (n & 1n) === 0n ? n / 2n : -(n + 1n) / 2n;
}
function zigZagEncodeBigInt(n) {
return n < 0n ? 2n * -n - 1n : n === 0n ? 0n : 2n * n;
}
function validateUint(n) {
if (n >= 0 === false)
throw new Error("uint must be positive");
if (n > Number.MAX_SAFE_INTEGER)
throw new Error(
"integer is greater than the maximum safe integer, use biguint/bigint"
);
}
}
});
// node_modules/sodium-hmac/hash/sha256.js
var require_sha256 = __commonJS({
"node_modules/sodium-hmac/hash/sha256.js"(exports2, module2) {
var sodium = require_sodium_universal();
module2.exports = {
init: sodium.crypto_hash_sha256_init,
update: sodium.crypto_hash_sha256_update,
final: sodium.crypto_hash_sha256_final,
BYTES: sodium.crypto_hash_sha256_BYTES,
STATEBYTES: sodium.crypto_hash_sha256_STATEBYTES
};
}
});
// node_modules/sodium-hmac/hash/sha512.js
var require_sha512 = __commonJS({
"node_modules/sodium-hmac/hash/sha512.js"(exports2, module2) {
var sodium = require_sodium_universal();
module2.exports = {
init: sodium.crypto_hash_sha512_init,
update: sodium.crypto_hash_sha512_update,
final: sodium.crypto_hash_sha512_final,
BYTES: sodium.crypto_hash_sha512_BYTES,
STATEBYTES: sodium.crypto_hash_sha512_STATEBYTES
};
}
});
// node_modules/sodium-hmac/index.js
var require_sodium_hmac = __commonJS({
"node_modules/sodium-hmac/index.js"(exports2, module2) {
var b4a4 = require_b4a();
var sha256 = require_sha256();
var sha512 = require_sha512();
var HMAC = class _HMAC {
constructor(hash, key) {
this.hash = hash;
this.length = hash.BYTES;
this._blocksize = 2 * hash.BYTES;
this._initialised = false;
this.state = b4a4.alloc(hash.STATEBYTES);
this.pad = b4a4.alloc(this._blocksize);
if (key) this.init(key);
}
init(key) {
if (this._initialised) {
throw new Error("Already initialised, call final first");
}
if (key.length > this._blocksize) {
this.hash.init(this.state);
this.hash.update(this.state, key);
this.hash.final(this.state, this.pad.subarray(0, this.length));
} else {
this.pad.set(key);
}
bufferByteXor(this.pad, 54);
this.hash.init(this.state);
this.hash.update(this.state, this.pad);
bufferByteXor(this.pad, 92 ^ 54);
this._initialised = true;
return this;
}
update(data) {
if (!this._initialised) {
throw new Error("First initialise with a key");
}
this.hash.update(this.state, data);
return this;
}
final(output = b4a4.alloc(this.length)) {
if (!this._initialised) {
throw new Error("First initialise with a key");
}
const out = output.byteLength === this.length ? output : output.subarray(0, this.hash.BYTES);
this.hash.final(this.state, out);
this.hash.init(this.state);
this.hash.update(this.state, this.pad);
this.hash.update(this.state, out);
this.hash.final(this.state, out);
this.pad.fill(0);
this.state.fill(0);
this._initialised = false;
return out;
}
static sha256(data, key, output) {
const hmac = new _HMAC(sha256, key);
return hmac.update(data).final(output);
}
static sha512(data, key, output) {
const hmac = new _HMAC(sha512, key);
return hmac.update(data).final(output);
}
};
module2.exports = {
HMAC,
sha256,
sha512
};
function bufferByteXor(output, byte) {
for (let i = 0; i < output.byteLength; i++) {
output[i] ^= byte;
}
return output;
}
}
});
// node_modules/bip39-mnemonic/wordlist/lookup.json
var require_lookup = __commonJS({
"node_modules/bip39-mnemonic/wordlist/lookup.json"(exports2, module2) {
module2.exports = { \u7684: ["chinese_simplified", "chinese_traditional"], \u4E00: ["chinese_simplified", "chinese_traditional"], \u662F: ["chinese_simplified", "chinese_traditional"], \u5728: ["chinese_simplified", "chinese_traditional"], \u4E0D: ["chinese_simplified", "chinese_traditional"], \u4E86: ["chinese_simplified", "chinese_traditional"], \u6709: ["chinese_simplified", "chinese_traditional"], \u548C: ["chinese_simplified", "chinese_traditional"], \u4EBA: ["chinese_simplified", "chinese_traditional"], \u8FD9: ["chinese_simplified"], \u4E2D: ["chinese_simplified", "chinese_traditional"], \u5927: ["chinese_simplified", "chinese_traditional"], \u4E3A: ["chinese_simplified"], \u4E0A: ["chinese_simplified", "chinese_traditional"], \u4E2A: ["chinese_simplified"], \u56FD: ["chinese_simplified"], \u6211: ["chinese_simplified", "chinese_traditional"], \u4EE5: ["chinese_simplified", "chinese_traditional"], \u8981: ["chinese_simplified", "chinese_traditional"], \u4ED6: ["chinese_simplified", "chinese_traditional"], \u65F6: ["chinese_simplified"], \u6765: ["chinese_simplified"], \u7528: ["chinese_simplified", "chinese_traditional"], \u4EEC: ["chinese_simplified"], \u751F: ["chinese_simplified", "chinese_traditional"], \u5230: ["chinese_simplified", "chinese_traditional"], \u4F5C: ["chinese_simplified", "chinese_traditional"], \u5730: ["chinese_simplified", "chinese_traditional"], \u4E8E: ["chinese_simplified"], \u51FA: ["chinese_simplified", "chinese_traditional"], \u5C31: ["chinese_simplified", "chinese_traditional"], \u5206: ["chinese_simplified", "chinese_traditional"], \u5BF9: ["chinese_simplified"], \u6210: ["chinese_simplified", "chinese_traditional"], \u4F1A: ["chinese_simplified"], \u53EF: ["chinese_simplified", "chinese_traditional"], \u4E3B: ["chinese_simplified", "chinese_traditional"], \u53D1: ["chinese_simplified"], \u5E74: ["chinese_simplified", "chinese_traditional"], \u52A8: ["chinese_simplified"], \u540C: ["chinese_simplified", "chinese_traditional"], \u5DE5: ["chinese_simplified", "chinese_traditional"], \u4E5F: ["chinese_simplified", "chinese_traditional"], \u80FD: ["chinese_simplified", "chinese_traditional"], \u4E0B: ["chinese_simplified", "chinese_traditional"], \u8FC7: ["chinese_simplified"], \u5B50: ["chinese_simplified", "chinese_traditional"], \u8BF4: ["chinese_simplified"], \u4EA7: ["chinese_simplified"], \u79CD: ["chinese_simplified"], \u9762: ["chinese_simplified", "chinese_traditional"], \u800C: ["chinese_simplified", "chinese_traditional"], \u65B9: ["chinese_simplified", "chinese_traditional"], \u540E: ["chinese_simplified"], \u591A: ["chinese_simplified", "chinese_traditional"], \u5B9A: ["chinese_simplified", "chinese_traditional"], \u884C: ["chinese_simplified", "chinese_traditional"], \u5B66: ["chinese_simplified"], \u6CD5: ["chinese_simplified", "chinese_traditional"], \u6240: ["chinese_simplified", "chinese_traditional"], \u6C11: ["chinese_simplified", "chinese_traditional"], \u5F97: ["chinese_simplified", "chinese_traditional"], \u7ECF: ["chinese_simplified"], \u5341: ["chinese_simplified", "chinese_traditional"], \u4E09: ["chinese_simplified", "chinese_traditional"], \u4E4B: ["chinese_simplified", "chinese_traditional"], \u8FDB: ["chinese_simplified"], \u7740: ["chinese_simplified"], \u7B49: ["chinese_simplified", "chinese_traditional"], \u90E8: ["chinese_simplified", "chinese_traditional"], \u5EA6: ["chinese_simplified", "chinese_traditional"], \u5BB6: ["chinese_simplified", "chinese_traditional"], \u7535: ["chinese_simplified"], \u529B: ["chinese_simplified", "chinese_traditional"], \u91CC: ["chinese_simplified"], \u5982: ["chinese_simplified", "chinese_traditional"], \u6C34: ["chinese_simplified", "chinese_traditional"], \u5316: ["chinese_simplified", "chinese_traditional"], \u9AD8: ["chinese_simplified", "chinese_traditional"], \u81EA: ["chinese_simplified", "chinese_traditional"], \u4E8C: ["chinese_simplified", "chinese_traditional"], \u7406: ["chinese_simplified", "chinese_traditional"], \u8D77: ["chinese_simplified", "chinese_traditional"], \u5C0F: ["chinese_simplified", "chinese_traditional"], \u7269: ["chinese_simplified", "chinese_traditional"], \u73B0: ["chinese_simplified"], \u5B9E: ["chinese_simplified"], \u52A0: ["chinese_simplified", "chinese_traditional"], \u91CF: ["chinese_simplified", "chinese_traditional"], \u90FD: ["chinese_simplified", "chinese_traditional"], \u4E24: ["chinese_simplified"], \u4F53: ["chinese_simplified"], \u5236: ["chinese_simplified", "chinese_traditional"], \u673A: ["chinese_simplified"], \u5F53: ["chinese_simplified"], \u4F7F: ["chinese_simplified", "chinese_traditional"], \u70B9: ["chinese_simplified"], \u4ECE: ["chinese_simplified"], \u4E1A: ["chinese_simplified"], \u672C: ["chinese_simplified", "chinese_traditional"], \u53BB: ["chinese_simplified", "chinese_traditional"], \u628A: ["chinese_simplified", "chinese_traditional"], \u6027: ["chinese_simplified", "chinese_traditional"], \u597D: ["chinese_simplified", "chinese_traditional"], \u5E94: ["chinese_simplified"], \u5F00: ["chinese_simplified"], \u5B83: ["chinese_simplified", "chinese_traditional"], \u5408: ["chinese_simplified", "chinese_traditional"], \u8FD8: ["chinese_simplified"], \u56E0: ["chinese_simplified", "chinese_traditional"], \u7531: ["chinese_simplified", "chinese_traditional"], \u5176: ["chinese_simplified", "chinese_traditional"], \u4E9B: ["chinese_simplified", "chinese_traditional"], \u7136: ["chinese_simplified", "chinese_traditional"], \u524D: ["chinese_simplified", "chinese_traditional"], \u5916: ["chinese_simplified", "chinese_traditional"], \u5929: ["chinese_simplified", "chinese_traditional"], \u653F: ["chinese_simplified", "chinese_traditional"], \u56DB: ["chinese_simplified", "chinese_traditional"], \u65E5: ["chinese_simplified", "chinese_traditional"], \u90A3: ["chinese_simplified", "chinese_traditional"], \u793E: ["chinese_simplified", "chinese_traditional"], \u4E49: ["chinese_simplified"], \u4E8B: ["chinese_simplified", "chinese_traditional"], \u5E73: ["chinese_simplified", "chinese_traditional"], \u5F62: ["chinese_simplified", "chinese_traditional"], \u76F8: ["chinese_simplified", "chinese_traditional"], \u5168: ["chinese_simplified", "chinese_traditional"], \u8868: ["chinese_simplified", "chinese_traditional"], \u95F4: ["chinese_simplified"], \u6837: ["chinese_simplified"], \u4E0E: ["chinese_simplified"], \u5173: ["chinese_simplified"], \u5404: ["chinese_simplified", "chinese_traditional"], \u91CD: ["chinese_simplified", "chinese_traditional"], \u65B0: ["chinese_simplified", "chinese_traditional"], \u7EBF: ["chinese_simplified"], \u5185: ["chinese_simplified"], \u6570: ["chinese_simplified"], \u6B63: ["chinese_simplified", "chinese_traditional"], \u5FC3: ["chinese_simplified", "chinese_traditional"], \u53CD: ["chinese_simplified", "chinese_traditional"], \u4F60: ["chinese_simplified", "chinese_traditional"], \u660E: ["chinese_simplified", "chinese_traditional"], \u770B: ["chinese_simplified", "chinese_traditional"], \u539F: ["chinese_simplified", "chinese_traditional"], \u53C8: ["chinese_simplified", "chinese_traditional"], \u4E48: ["chinese_simplified"], \u5229: ["chinese_simplified", "chinese_traditional"], \u6BD4: ["chinese_simplified", "chinese_traditional"], \u6216: ["chinese_simplified", "chinese_traditional"], \u4F46: ["chinese_simplified", "chinese_traditional"], \u8D28: ["chinese_simplified"], \u6C14: ["chinese_simplified"], \u7B2C: ["chinese_simplified", "chinese_traditional"], \u5411: ["chinese_simplified", "chinese_traditional"], \u9053: ["chinese_simplified", "chinese_traditional"], \u547D: ["chinese_simplified", "chinese_traditional"], \u6B64: ["chinese_simplified", "chinese_traditional"], \u53D8: ["chinese_simplified"], \u6761: ["chinese_simplified"], \u53EA: ["chinese_simplified", "chinese_traditional"], \u6CA1: ["chinese_simplified"], \u7ED3: ["chinese_simplified"], \u89E3: ["chinese_simplified", "chinese_traditional"], \u95EE: ["chinese_simplified"], \u610F: ["chinese_simplified", "chinese_traditional"], \u5EFA: ["chinese_simplified", "chinese_traditional"], \u6708: ["chinese_simplified", "chinese_traditional"], \u516C: ["chinese_simplified", "chinese_traditional"], \u65E0: ["chinese_simplified"], \u7CFB: ["chinese_simplified", "chinese_traditional"], \u519B: ["chinese_simplified"], \u5F88: ["chinese_simplified", "chinese_traditional"], \u60C5: ["chinese_simplified", "chinese_traditional"], \u8005: ["chinese_simplified", "chinese_traditional"], \u6700: ["chinese_simplified", "chinese_traditional"], \u7ACB: ["chinese_simplified", "chinese_traditional"], \u4EE3: ["chinese_simplified", "chinese_traditional"], \u60F3: ["chinese_simplified", "chinese_traditional"], \u5DF2: ["chinese_simplified", "chinese_traditional"], \u901A: ["chinese_simplified", "chinese_traditional"], \u5E76: ["chinese_simplified"], \u63D0: ["chinese_simplified", "chinese_traditional"], \u76F4: ["chinese_simplified", "chinese_traditional"], \u9898: ["chinese_simplified"], \u515A: ["chinese_simplified"], \u7A0B: ["chinese_simplified", "chinese_traditional"], \u5C55: ["chinese_simplified", "chinese_traditional"], \u4E94: ["chinese_simplified", "chinese_traditional"], \u679C: ["chinese_simplified", "chinese_traditional"], \u6599: ["chinese_simplified", "chinese_traditional"], \u8C61: ["chinese_simplified", "chinese_traditional"], \u5458: ["chinese_simplified"], \u9769: ["chinese_simplified", "chinese_traditional"], \u4F4D: ["chinese_simplified", "chinese_traditional"], \u5165: ["chinese_simplified", "chinese_traditional"], \u5E38: ["chinese_simplified", "chinese_traditional"], \u6587: ["chinese_simplified", "chinese_traditional"], \u603B: ["chinese_simplified"], \u6B21: ["chinese_simplified", "chinese_traditional"], \u54C1: ["chinese_simplified", "chinese_traditional"], \u5F0F: ["chinese_simplified", "chinese_traditional"], \u6D3B: ["chinese_simplified", "chinese_traditional"], \u8BBE: ["chinese_simplified"], \u53CA: ["chinese_simplified", "chinese_traditional"], \u7BA1: ["chinese_simplified", "chinese_traditional"], \u7279: ["chinese_simplified", "chinese_traditional"], \u4EF6: ["chinese_simplified", "chinese_traditional"], \u957F: ["chinese_simplified"], \u6C42: ["chinese_simplified", "chinese_traditional"], \u8001: ["chinese_simplified", "chinese_traditional"], \u5934: ["chinese_simplified"], \u57FA: ["chinese_simplified", "chinese_traditional"], \u8D44: ["chinese_simplified"], \u8FB9: ["chinese_simplified"], \u6D41: ["chinese_simplified", "chinese_traditional"], \u8DEF: ["chinese_simplified", "chinese_traditional"], \u7EA7: ["chinese_simplified"], \u5C11: ["chinese_simplified", "chinese_traditional"], \u56FE: ["chinese_simplified"], \u5C71: ["chinese_simplified", "chinese_traditional"], \u7EDF: ["chinese_simplified"], \u63A5: ["chinese_simplified", "chinese_traditional"], \u77E5: ["chinese_simplified", "chinese_traditional"], \u8F83: ["chinese_simplified"], \u5C06: ["chinese_simplified"], \u7EC4: ["chinese_simplified"], \u89C1: ["chinese_simplified"], \u8BA1: ["chinese_simplified"], \u522B: ["chinese_simplified"], \u5979: ["chinese_simplified", "chinese_traditional"], \u624B: ["chinese_simplified", "chinese_traditional"], \u89D2: ["chinese_simplified", "chinese_traditional"], \u671F: ["chinese_simplified", "chinese_traditional"], \u6839: ["chinese_simplified", "chinese_traditional"], \u8BBA: ["chinese_simplified"], \u8FD0: ["chinese_simplified"], \u519C: ["chinese_simplified"], \u6307: ["chinese_simplified", "chinese_traditional"], \u51E0: ["chinese_simplified"], \u4E5D: ["chinese_simplified", "chinese_traditional"], \u533A: ["chinese_simplified"], \u5F3A: ["chinese_simplified"], \u653E: ["chinese_simplified", "chinese_traditional"], \u51B3: ["chinese_simplified"], \u897F: ["chinese_simplified", "chinese_traditional"], \u88AB: ["chinese_simplified", "chinese_traditional"], \u5E72: ["chinese_simplified"], \u505A: ["chinese_simplified", "chinese_traditional"], \u5FC5: ["chinese_simplified", "chinese_traditional"], \u6218: ["chinese_simplified"], \u5148: ["chinese_simplified", "chinese_traditional"], \u56DE: ["chinese_simplified", "chinese_traditional"], \u5219: ["chinese_simplified"], \u4EFB: ["chinese_simplified", "chinese_traditional"], \u53D6: ["chinese_simplified", "chinese_traditional"], \u636E: ["chinese_simplified"], \u5904: ["chinese_simplified"], \u961F: ["chinese_simplified"], \u5357: ["chinese_simplified", "chinese_traditional"], \u7ED9: ["chinese_simplified"], \u8272: ["chinese_simplified", "chinese_traditional"], \u5149: ["chinese_simplified", "chinese_traditional"], \u95E8: ["chinese_simplified"], \u5373: ["chinese_simplified", "chinese_traditional"], \u4FDD: ["chinese_simplified", "chinese_traditional"], \u6CBB: ["chinese_simplified", "chinese_traditional"], \u5317: ["chinese_simplified", "chinese_traditional"], \u9020: ["chinese_simplified", "chinese_traditional"], \u767E: ["chinese_simplified", "chinese_traditional"], \u89C4: ["chinese_simplified"], \u70ED: ["chinese_simplified"], \u9886: ["chinese_simplified"], \u4E03: ["chinese_simplified", "chinese_traditional"], \u6D77: ["chinese_simplified", "chinese_traditional"], \u53E3: ["chinese_simplified", "chinese_traditional"], \u4E1C: ["chinese_simplified"], \u5BFC: ["chinese_simplified"], \u5668: ["chinese_simplified", "chinese_traditional"], \u538B: ["chinese_simplified"], \u5FD7: ["chinese_simplified", "chinese_traditional"], \u4E16: ["chinese_simplified", "chinese_traditional"], \u91D1: ["chinese_simplified", "chinese_traditional"], \u589E: ["chinese_simplified", "chinese_traditional"], \u4E89: ["chinese_simplified"], \u6D4E: ["chinese_simplified"], \u9636: ["chinese_simplified"], \u6CB9: ["chinese_simplified", "chinese_traditional"], \u601D: ["chinese_simplified", "chinese_traditional"], \u672F: ["chinese_simplified"], \u6781: ["chinese_simplified"], \u4EA4: ["chinese_simplified", "chinese_traditional"], \u53D7: ["chinese_simplified", "chinese_traditional"], \u8054: ["chinese_simplified"], \u4EC0: ["chinese_simplified", "chinese_traditional"], \u8BA4: ["chinese_simplified"], \u516D: ["chinese_simplified", "chinese_traditional"], \u5171: ["chinese_simplified", "chinese_traditional"], \u6743: ["chinese_simplified"], \u6536: ["chinese_simplified", "chinese_traditional"], \u8BC1: ["chinese_simplified"], \u6539: ["chinese_simplified", "chinese_traditional"], \u6E05: ["chinese_simplified", "chinese_traditional"], \u7F8E: ["chinese_simplified", "chinese_traditional"], \u518D: ["chinese_simplified", "chinese_traditional"], \u91C7: ["chinese_simplified"], \u8F6C: ["chinese_simplified"], \u66F4: ["chinese_simplified", "chinese_traditional"], \u5355: ["chinese_simplified"], \u98CE: ["chinese_simplified"], \u5207: ["chinese_simplified", "chinese_traditional"], \u6253: ["chinese_simplified", "chinese_traditional"], \u767D: ["chinese_simplified", "chinese_traditional"], \u6559: ["chinese_simplified", "chinese_traditional"], \u901F: ["chinese_simplified", "chinese_traditional"], \u82B1: ["chinese_simplified", "chinese_traditional"], \u5E26: ["chinese_simplified"], \u5B89: ["chinese_simplified", "chinese_traditional"], \u573A: ["chinese_simplified"], \u8EAB: ["chinese_simplified", "chinese_traditional"], \u8F66: ["chinese_simplified"], \u4F8B: ["chinese_simplified", "chinese_traditional"], \u771F: ["chinese_simplified", "chinese_traditional"], \u52A1: ["chinese_simplified"], \u5177: ["chinese_simplified", "chinese_traditional"], \u4E07: ["chinese_simplified"], \u6BCF: ["chinese_simplified", "chinese_traditional"], \u76EE: ["chinese_simplified", "chinese_traditional"], \u81F3: ["chinese_simplified", "chinese_traditional"], \u8FBE: ["chinese_simplified"], \u8D70: ["chinese_simplified", "chinese_traditional"], \u79EF: ["chinese_simplified"], \u793A: ["chinese_simplified", "chinese_traditional"], \u8BAE: ["chinese_simplified"], \u58F0: ["chinese_simplified"], \u62A5: ["chinese_simplified"], \u6597: ["chinese_simplified"], \u5B8C: ["chinese_simplified", "chinese_traditional"], \u7C7B: ["chinese_simplified"], \u516B: ["chinese_simplified", "chinese_traditional"], \u79BB: ["chinese_simplified"], \u534E: ["chinese_simplified"], \u540D: ["chinese_simplified", "chinese_traditional"], \u786E: ["chinese_simplified"], \u624D: ["chinese_simplified", "chinese_traditional"], \u79D1: ["chinese_simplified", "chinese_traditional"], \u5F20: ["chinese_simplified"], \u4FE1: ["chinese_simplified", "chinese_traditional"], \u9A6C: ["chinese_simplified"], \u8282: ["chinese_simplified"], \u8BDD: ["chinese_simplified"], \u7C73: ["chinese_simplified", "chinese_traditional"], \u6574: ["chinese_simplified", "chinese_traditional"], \u7A7A: ["chinese_simplified", "chinese_traditional"], \u5143: ["chinese_simplified", "chinese_traditional"], \u51B5: ["chinese_simplified"], \u4ECA: ["chinese_simplified", "chinese_traditional"], \u96C6: ["chinese_simplified", "chinese_traditional"], \u6E29: ["chinese_simplified"], \u4F20: ["chinese_simplified"], \u571F: ["chinese_simplified", "chinese_traditional"], \u8BB8: ["chinese_simplified"], \u6B65: ["chinese_simplified", "chinese_traditional"], \u7FA4: ["chinese_simplified", "chinese_traditional"], \u5E7F: ["chinese_simplified"], \u77F3: ["chinese_simplified", "chinese_traditional"], \u8BB0: ["chinese_simplified"], \u9700: ["chinese_simplified", "chinese_traditional"], \u6BB5: ["chinese_simplified", "chinese_traditional"], \u7814: ["chinese_simplified", "chinese_traditional"], \u754C: ["chinese_simplified", "chinese_traditional"], \u62C9: ["chinese_simplified", "chinese_traditional"], \u6797: ["chinese_simplified", "chinese_traditional"], \u5F8B: ["chinese_simplified", "chinese_traditional"], \u53EB: ["chinese_simplified", "chinese_traditional"], \u4E14: ["chinese_simplified", "chinese_traditional"], \u7A76: ["chinese_simplified", "chinese_traditional"], \u89C2: ["chinese_simplified"], \u8D8A: ["chinese_simplified", "chinese_traditional"], \u7EC7: ["chinese_simplified"], \u88C5: ["chinese_simplified"], \u5F71: ["chinese_simplified", "chinese_traditional"], \u7B97: ["chinese_simplified", "chinese_traditional"], \u4F4E: ["chinese_simplified", "chinese_traditional"], \u6301: ["chinese_simplified", "chinese_traditional"], \u97F3: ["chinese_simplified", "chinese_traditional"], \u4F17: ["chinese_simplified"], \u4E66: ["chinese_simplified"], \u5E03: ["chinese_simplified", "chinese_traditional"], \u590D: ["chinese_simplified", "chinese_traditional"], \u5BB9: ["chinese_simplified", "chinese_traditional"], \u513F: ["chinese_simplified"], \u987B: ["chinese_simplified"], \u9645: ["chinese_simplified"], \u5546: ["chinese_simplified", "chinese_traditional"], \u975E: ["chinese_simplified", "chinese_traditional"], \u9A8C: ["chinese_simplified"], \u8FDE: ["chinese_simplified"], \u65AD: ["chinese_simplified"], \u6DF1: ["chinese_simplified", "chinese_traditional"], \u96BE: ["chinese_simplified"], \u8FD1: ["chinese_simplified", "chinese_traditional"], \u77FF: ["chinese_simplified"], \u5343: ["chinese_simplified", "chinese_traditional"], \u5468: ["chinese_simplified"], \u59D4: ["chinese_simplified", "chinese_traditional"], \u7D20: ["chinese_simplified", "chinese_traditional"], \u6280: ["chinese_simplified", "chinese_traditional"], \u5907: ["chinese_simplified"], \u534A: ["chinese_simplified", "chinese_traditional"], \u529E: ["chinese_simplified"], \u9752: ["chinese_simplified", "chinese_traditional"], \u7701: ["chinese_simplified", "chinese_traditional"], \u5217: ["chinese_simplified", "chinese_traditional"], \u4E60: ["chinese_simplified"], \u54CD: ["chinese_simplified"], \u7EA6: ["chinese_simplified"], \u652F: ["chinese_simplified", "chinese_traditional"], \u822C: ["chinese_simplified", "chinese_traditional"], \u53F2: ["chinese_simplified", "chinese_traditional"], \u611F: ["chinese_simplified", "chinese_traditional"], \u52B3: ["chinese_simplified"], \u4FBF: ["chinese_simplified", "chinese_traditional"], \u56E2: ["chinese_simplified"], \u5F80: ["chinese_simplified", "chinese_traditional"], \u9178: ["chinese_simplified", "chinese_traditional"], \u5386: ["chinese_simplified"], \u5E02: ["chinese_simplified", "chinese_traditional"], \u514B: ["chinese_simplified", "chinese_traditional"], \u4F55: ["chinese_simplified", "chinese_traditional"], \u9664: ["chinese_simplified", "chinese_traditional"], \u6D88: ["chinese_simplified", "chinese_traditional"], \u6784: ["chinese_simplified"], \u5E9C: ["chinese_simplified", "chinese_traditional"], \u79F0: ["chinese_simplified"], \u592A: ["chinese_simplified", "chinese_traditional"], \u51C6: ["chinese_simplified"], \u7CBE: ["chinese_simplified", "chinese_traditional"], \u503C: ["chinese_simplified", "chinese_traditional"], \u53F7: ["chinese_simplified"], \u7387: ["chinese_simplified", "chinese_traditional"], \u65CF: ["chinese_simplified", "chinese_traditional"], \u7EF4: ["chinese_simplified"], \u5212: ["chinese_simplified"], \u9009: ["chinese_simplified"], \u6807: ["chinese_simplified"], \u5199: ["chinese_simplified"], \u5B58: ["chinese_simplified", "chinese_traditional"], \u5019: ["chinese_simplified", "chinese_traditional"], \u6BDB: ["chinese_simplified", "chinese_traditional"], \u4EB2: ["chinese_simplified"], \u5FEB: ["chinese_simplified", "chinese_traditional"], \u6548: ["chinese_simplified", "chinese_traditional"], \u65AF: ["chinese_simplified", "chinese_traditional"], \u9662: ["chinese_simplified", "chinese_traditional"], \u67E5: ["chinese_simplified", "chinese_traditional"], \u6C5F: ["chinese_simplified", "chinese_traditional"], \u578B: ["chinese_simplified", "chinese_traditional"], \u773C: ["chinese_simplified", "chinese_traditional"], \u738B: ["chinese_simplified", "chinese_traditional"], \u6309: ["chinese_simplified", "chinese_traditional"], \u683C: ["chinese_simplified", "chinese_traditional"], \u517B: ["chinese_simplified"], \u6613: ["chinese_simplified", "chinese_traditional"], \u7F6E: ["chinese_simplified", "chinese_traditional"], \u6D3E: ["chinese_simplified", "chinese_traditional"], \u5C42: ["chinese_simplified"], \u7247: ["chinese_simplified", "chinese_traditional"], \u59CB: ["chinese_simplified", "chinese_traditional"], \u5374: ["chinese_simplified"], \u4E13: ["chinese_simplified"], \u72B6: ["chinese_simplified"], \u80B2: ["chinese_simplified", "chinese_traditional"], \u5382: ["chinese_simplified"], \u4EAC: ["chinese_simplified", "chinese_traditional"], \u8BC6: ["chinese_simplified"], \u9002: ["chinese_simplified"], \u5C5E: ["chinese_simplified"], \u5706: ["chinese_simplified"], \u5305: ["chinese_simplified", "chinese_traditional"], \u706B: ["chinese_simplified", "chinese_traditional"], \u4F4F: ["chinese_simplified", "chinese_traditional"], \u8C03: ["chinese_simplified"], \u6EE1: ["chinese_simplified"], \u53BF: ["chinese_simplified"], \u5C40: ["chinese_simplified", "chinese_traditional"], \u7167: ["chinese_simplified", "chinese_traditional"], \u53C2: ["chinese_simplified"], \u7EA2: ["chinese_simplified"], \u7EC6: ["chinese_simplified"], \u5F15: ["chinese_simplified", "chinese_traditional"], \u542C: ["chinese_simplified"], \u8BE5: ["chinese_simplified"], \u94C1: ["chinese_simplified"], \u4EF7: ["chinese_simplified"], \u4E25: ["chinese_simplified"], \u9996: ["chinese_simplified", "chinese_traditional"], \u5E95: ["chinese_simplified", "chinese_traditional"], \u6DB2: ["chinese_simplified", "chinese_traditional"], \u5B98: ["chinese_simplified", "chinese_traditional"], \u5FB7: ["chinese_simplified", "chinese_traditional"], \u968F: ["chinese_simplified"], \u75C5: ["chinese_simplified", "chinese_traditional"], \u82CF: ["chinese_simplified"], \u5931: ["chinese_simplified", "chinese_traditional"], \u5C14: ["chinese_simplified"], \u6B7B: ["chinese_simplified", "chinese_traditional"], \u8BB2: ["chinese_simplified"], \u914D: ["chinese_simplified", "chinese_traditional"], \u5973: ["chinese_simplified", "chinese_traditional"], \u9EC4: ["chinese_simplified"], \u63A8: ["chinese_simplified", "chinese_traditional"], \u663E: ["chinese_simplified"], \u8C08: ["chinese_simplified"], \u7F6A: ["chinese_simplified", "chinese_traditional"], \u795E: ["chinese_simplified", "chinese_traditional"], \u827A: ["chinese_simplified"], \u5462: ["chinese_simplified", "chinese_traditional"], \u5E2D: ["chinese_simplified", "chinese_traditional"], \u542B: ["chinese_simplified", "chinese_traditional"], \u4F01: ["chinese_simplified", "chinese_traditional"], \u671B: ["chinese_simplified", "chinese_traditional"], \u5BC6: ["chinese_simplified", "chinese_traditional"], \u6279: ["chinese_simplified", "chinese_traditional"], \u8425: ["chinese_simplified"], \u9879: ["chinese_simplified"], \u9632: ["chinese_simplified", "chinese_traditional"], \u4E3E: ["chinese_simplified"], \u7403: ["chinese_simplified", "chinese_traditional"], \u82F1: ["chinese_simplified", "chinese_traditional"], \u6C27: ["chinese_simplified", "chinese_traditional"], \u52BF: ["chinese_simplified"], \u544A: ["chinese_simplified", "chinese_traditional"], \u674E: ["chinese_simplified", "chinese_traditional"], \u53F0: ["chinese_simplified", "chinese_traditional"], \u843D: ["chinese_simplified", "chinese_traditional"], \u6728: ["chinese_simplified", "chinese_traditional"], \u5E2E: ["chinese_simplified"], \u8F6E: ["chinese_simplified"], \u7834: ["chinese_simplified", "chinese_traditional"], \u4E9A: ["chinese_simplified"], \u5E08: ["chinese_simplified"], \u56F4: ["chinese_simplified"], \u6CE8: ["chinese_simplified", "chinese_traditional"], \u8FDC: ["chinese_simplified"], \u5B57: ["chinese_simplified", "chinese_traditional"], \u6750: ["chinese_simplified", "chinese_traditional"], \u6392: ["chinese_simplified", "chinese_traditional"], \u4F9B: ["chinese_simplified", "chinese_traditional"], \u6CB3: ["chinese_simplified", "chinese_traditional"], \u6001: ["chinese_simplified"], \u5C01: ["chinese_simplified", "chinese_traditional"], \u53E6: ["chinese_simplified", "chinese_traditional"], \u65BD: ["chinese_simplified", "chinese_traditional"], \u51CF: ["chinese_simplified"], \u6811: ["chinese_simplified"], \u6EB6: ["chinese_simplified", "chinese_traditional"], \u600E: ["chinese_simplified", "chinese_traditional"], \u6B62: ["chinese_simplified", "chinese_traditional"], \u6848: ["chinese_simplified", "chinese_traditional"], \u8A00: ["chinese_simplified", "chinese_traditional"], \u58EB: ["chinese_simplified", "chinese_traditional"], \u5747: ["chinese_simplified", "chinese_traditional"], \u6B66: ["chinese_simplified", "chinese_traditional"], \u56FA: ["chinese_simplified", "chinese_traditional"], \u53F6: ["chinese_simplified"], \u9C7C: ["chinese_simplified"], \u6CE2: ["chinese_simplified", "chinese_traditional"], \u89C6: ["chinese_simplified"], \u4EC5: ["chinese_simplified"], \u8D39: ["chinese_simplified"], \u7D27: ["chinese_simplified"], \u7231: ["chinese_simplified"], \u5DE6: ["chinese_simplified", "chinese_traditional"], \u7AE0: ["chinese_simplified", "chinese_traditional"], \u65E9: ["chinese_simplified", "chinese_traditional"], \u671D: ["chinese_simplified", "chinese_traditional"], \u5BB3: ["chinese_simplified", "chinese_traditional"], \u7EED: ["chinese_simplified"], \u8F7B: ["chinese_simplified"], \u670D: ["chinese_simplified", "chinese_traditional"], \u8BD5: ["chinese_simplified"], \u98DF: ["chinese_simplified", "chinese_traditional"], \u5145: ["chinese_simplified", "chinese_traditional"], \u5175: ["chinese_simplified", "chinese_traditional"], \u6E90: ["chinese_simplified", "chinese_traditional"], \u5224: ["chinese_simplified", "chinese_traditional"], \u62A4: ["chinese_simplified"], \u53F8: ["chinese_simplified", "chinese_traditional"], \u8DB3: ["chinese_simplified", "chinese_traditional"], \u67D0: ["chinese_simplified", "chinese_traditional"], \u7EC3: ["chinese_simplified"], \u5DEE: ["chinese_simplified", "chinese_traditional"], \u81F4: ["chinese_simplified", "chinese_traditional"], \u677F: ["chinese_simplified", "chinese_traditional"], \u7530: ["chinese_simplified", "chinese_traditional"], \u964D: ["chinese_simplified", "chinese_traditional"], \u9ED1: ["chinese_simplified", "chinese_traditional"], \u72AF: ["chinese_simplified", "chinese_traditional"], \u8D1F: ["chinese_simplified"], \u51FB: ["chinese_simplified"], \u8303: ["chinese_simplified", "chinese_traditional"], \u7EE7: ["chinese_simplified"], \u5174: ["chinese_simplified"], \u4F3C: ["chinese_simplified", "chinese_traditional"], \u4F59: ["chinese_simplified"], \u575A: ["chinese_simplified"], \u66F2: ["chinese_simplified", "chinese_traditional"], \u8F93: ["chinese_simplified"], \u4FEE: ["chinese_simplified", "chinese_traditional"], \u6545: ["chinese_simplified", "chinese_traditional"], \u57CE: ["chinese_simplified", "chinese_traditional"], \u592B: ["chinese_simplified", "chinese_traditional"], \u591F: ["chinese_simplified"], \u9001: ["chinese_simplified", "chinese_traditional"], \u7B14: ["chinese_simplified"], \u8239: ["chinese_simplified", "chinese_traditional"], \u5360: ["chinese_simplified"], \u53F3: ["chinese_simplified", "chinese_traditional"], \u8D22: ["chinese_simplified"], \u5403: ["chinese_simplified", "chinese_traditional"], \u5BCC: ["chinese_simplified", "chinese_traditional"], \u6625: ["chinese_simplified", "chinese_traditional"], \u804C: ["chinese_simplified"], \u89C9: ["chinese_simplified"], \u6C49: ["chinese_simplified"], \u753B: ["chinese_simplified"], \u529F: ["chinese_simplified", "chinese_traditional"], \u5DF4: ["chinese_simplified", "chinese_traditional"], \u8DDF: ["chinese_simplified", "chinese_traditional"], \u867D: ["chinese_simplified"], \u6742: ["chinese_simplified"], \u98DE: ["chinese_simplified"], \u68C0: ["chinese_simplified"], \u5438: ["chinese_simplified", "chinese_traditional"], \u52A9: ["chinese_simplified", "chinese_traditional"], \u5347: ["chinese_simplified"], \u9633: ["chinese_simplified"], \u4E92: ["chinese_simplified", "chinese_traditional"], \u521D: ["chinese_simplified", "chinese_traditional"], \u521B: ["chinese_simplified"], \u6297: ["chinese_simplified", "chinese_traditional"], \u8003: ["chinese_simplified", "chinese_traditional"], \u6295: ["chinese_simplified", "chinese_traditional"], \u574F: ["chinese_simplified"], \u7B56: ["chinese_simplified", "chinese_traditional"], \u53E4: ["chinese_simplified", "chinese_traditional"], \u5F84: ["chinese_simplified"], \u6362: ["chinese_simplified"], \u672A: ["chinese_simplified", "chinese_traditional"], \u8DD1: ["chinese_simplified", "chinese_traditional"], \u7559: ["chinese_simplified", "chinese_traditional"], \u94A2: ["chinese_simplified"], \u66FE: ["chinese_simplified", "chinese_traditional"], \u7AEF: ["chinese_simplified", "chinese_traditional"], \u8D23: ["chinese_simplified"], \u7AD9: ["chinese_simplified", "chinese_traditional"], \u7B80: ["chinese_simplified"], \u8FF0: ["chinese_simplified", "chinese_traditional"], \u94B1: ["chinese_simplified"], \u526F: ["chinese_simplified", "chinese_traditional"], \u5C3D: ["chinese_simplified"], \u5E1D: ["chinese_simplified", "chinese_traditional"], \u5C04: ["chinese_simplified", "chinese_traditional"], \u8349: ["chinese_simplified", "chinese_traditional"], \u51B2: ["chinese_simplified"], \u627F: ["chinese_simplified", "chinese_traditional"], \u72EC: ["chinese_simplified"], \u4EE4: ["chinese_simplified", "chinese_traditional"], \u9650: ["chinese_simplified", "chinese_traditional"], \u963F: ["chinese_simplified", "chinese_traditional"], \u5BA3: ["chinese_simplified", "chinese_traditional"], \u73AF: ["chinese_simplified"], \u53CC: ["chinese_simplified"], \u8BF7: ["chinese_simplified"], \u8D85: ["chinese_simplified", "chinese_traditional"], \u5FAE: ["chinese_simplified", "chinese_traditional"], \u8BA9: ["chinese_simplified"], \u63A7: ["chinese_simplified", "chinese_traditional"], \u5DDE: ["chinese_simplified", "chinese_traditional"], \u826F: ["chinese_simplified", "chinese_traditional"], \u8F74: ["chinese_simplified"], \u627E: ["chinese_simplified", "chinese_traditional"], \u5426: ["chinese_simplified", "chinese_traditional"], \u7EAA: ["chinese_simplified"], \u76CA: ["chinese_simplified", "chinese_traditional"], \u4F9D: ["chinese_simplified", "chinese_traditional"], \u4F18: ["chinese_simplified"], \u9876: ["chinese_simplified"], \u7840: ["chinese_simplified"], \u8F7D: ["chinese_simplified"], \u5012: ["chinese_simplified", "chinese_traditional"], \u623F: ["chinese_simplified", "chinese_traditional"], \u7A81: ["chinese_simplified", "chinese_traditional"], \u5750: ["chinese_simplified", "chinese_traditional"], \u7C89: ["chinese_simplified", "chinese_traditional"], \u654C: ["chinese_simplified"], \u7565: ["chinese_simplified", "chinese_traditional"], \u5BA2: ["chinese_simplified", "chinese_traditional"], \u8881: ["chinese_simplified", "chinese_traditional"], \u51B7: ["chinese_simplified", "chinese_traditional"], \u80DC: ["chinese_simplified"], \u7EDD: ["chinese_simplified"], \u6790: ["chinese_simplified", "chinese_traditional"], \u5757: ["chinese_simplified"], \u5242: ["chinese_simplified"], \u6D4B: ["chinese_simplified"], \u4E1D: ["chinese_simplified"], \u534F: ["chinese_simplified"], \u8BC9: ["chinese_simplified"], \u5FF5: ["chinese_simplified", "chinese_traditional"], \u9648: ["chinese_simplified"], \u4ECD: ["chinese_simplified", "chinese_traditional"], \u7F57: ["chinese_simplified"], \u76D0: ["chinese_simplified"], \u53CB: ["chinese_simplified", "chinese_traditional"], \u6D0B: ["chinese_simplified", "chinese_traditional"], \u9519: ["chinese_simplified"], \u82E6: ["chinese_simplified", "chinese_traditional"], \u591C: ["chinese_simplified", "chinese_traditional"], \u5211: ["chinese_simplified", "chinese_traditional"], \u79FB: ["chinese_simplified", "chinese_traditional"], \u9891: ["chinese_simplified"], \u9010: ["chinese_simplified", "chinese_traditional"], \u9760: ["chinese_simplified", "chinese_traditional"], \u6DF7: ["chinese_simplified", "chinese_traditional"], \u6BCD: ["chinese_simplified", "chinese_traditional"], \u77ED: ["chinese_simplified", "chinese_traditional"], \u76AE: ["chinese_simplified", "chinese_traditional"], \u7EC8: ["chinese_simplified"], \u805A: ["chinese_simplified", "chinese_traditional"], \u6C7D: ["chinese_simplified", "chinese_traditional"], \u6751: ["chinese_simplified", "chinese_traditional"], \u4E91: ["chinese_simplified"], \u54EA: ["chinese_simplified", "chinese_traditional"], \u65E2: ["chinese_simplified", "chinese_traditional"], \u8DDD: ["chinese_simplified", "chinese_traditional"], \u536B: ["chinese_simplified"], \u505C: ["chinese_simplified", "chinese_traditional"], \u70C8: ["chinese_simplified", "chinese_traditional"], \u592E: ["chinese_simplified", "chinese_traditional"], \u5BDF: ["chinese_simplified", "chinese_traditional"], \u70E7: ["chinese_simplified"], \u8FC5: ["chinese_simplified", "chinese_traditional"], \u5883: ["chinese_simplified", "chinese_traditional"], \u82E5: ["chinese_simplified", "chinese_traditional"], \u5370: ["chinese_simplified", "chinese_traditional"], \u6D32: ["chinese_simplified", "chinese_traditional"], \u523B: ["chinese_simplified", "chinese_traditional"], \u62EC: ["chinese_simplified", "chinese_traditional"], \u6FC0: ["chinese_simplified", "chinese_traditional"], \u5B54: ["chinese_simplified", "chinese_traditional"], \u641E: ["chinese_simplified", "chinese_traditional"], \u751A: ["chinese_simplified", "chinese_traditional"], \u5BA4: ["chinese_simplified", "chinese_traditional"], \u5F85: ["chinese_simplified", "chinese_traditional"], \u6838: ["chinese_simplified", "chinese_traditional"], \u6821: ["chinese_simplified", "chinese_traditional"], \u6563: ["chinese_simplified", "chinese_traditional"], \u4FB5: ["chinese_simplified", "chinese_traditional"], \u5427: ["chinese_simplified", "chinese_traditional"], \u7532: ["chinese_simplified", "chinese_traditional"], \u6E38: ["chinese_simplified"], \u4E45: ["chinese_simplified", "chinese_traditional"], \u83DC: ["chinese_simplified", "chinese_traditional"], \u5473: ["chinese_simplified", "chinese_traditional"], \u65E7: ["chinese_simplified"], \u6A21: ["chinese_simplified", "chinese_traditional"], \u6E56: ["chinese_simplified", "chinese_traditional"], \u8D27: ["chinese_simplified"], \u635F: ["chinese_simplified"], \u9884: ["chinese_simplified"], \u963B: ["chinese_simplified", "chinese_traditional"], \u6BEB: ["chinese_simplified", "chinese_traditional"], \u666E: ["chinese_simplified", "chinese_traditional"], \u7A33: ["chinese_simplified"], \u4E59: ["chinese_simplified", "chinese_traditional"], \u5988: ["chinese_simplified"], \u690D: ["chinese_simplified", "chinese_traditional"], \u606F: ["chinese_simplified", "chinese_traditional"], \u6269: ["chinese_simplified"], \u94F6: ["chinese_simplified"], \u8BED: ["chinese_simplified"], \u6325: ["chinese_simplified"], \u9152: ["chinese_simplified", "chinese_traditional"], \u5B88: ["chinese_simplified", "chinese_traditional"], \u62FF: ["chinese_simplified", "chinese_traditional"], \u5E8F: ["chinese_simplified", "chinese_traditional"], \u7EB8: ["chinese_simplified"], \u533B: ["chinese_simplified"], \u7F3A: ["chinese_simplified", "chinese_traditional"], \u96E8: ["chinese_simplified", "chinese_traditional"], \u5417: ["chinese_simplified"], \u9488: ["chinese_simplified"], \u5218: ["chinese_simplified"], \u554A: ["chinese_simplified", "chinese_traditional"], \u6025: ["chinese_simplified", "chinese_traditional"], \u5531: ["chinese_simplified", "chinese_traditional"], \u8BEF: ["chinese_simplified"], \u8BAD: ["chinese_simplified"], \u613F: ["chinese_simplified"], \u5BA1: ["chinese_simplified"], \u9644: ["chinese_simplified", "chinese_traditional"], \u83B7: ["chinese_simplified"], \u8336: ["chinese_simplified", "chinese_traditional"], \u9C9C: ["chinese_simplified"], \u7CAE: ["chinese_simplified"], \u65A4: ["chinese_simplified", "chinese_traditional"], \u5B69: ["chinese_simplified", "chinese_traditional"], \u8131: ["chinese_simplified"], \u786B: ["chinese_simplified", "chinese_traditional"], \u80A5: ["chinese_simplified", "chinese_traditional"], \u5584: ["chinese_simplified", "chinese_traditional"], \u9F99: ["chinese_simplified"], \u6F14: ["chinese_simplified", "chinese_traditional"], \u7236: ["chinese_simplified", "chinese_traditional"], \u6E10: ["chinese_simplified"], \u8840: ["chinese_simplified", "chinese_traditional"], \u6B22: ["chinese_simplified"], \u68B0: ["chinese_simplified", "chinese_traditional"], \u638C: ["chinese_simplified", "chinese_traditional"], \u6B4C: ["chinese_simplified", "chinese_traditional"], \u6C99: ["chinese_simplified", "chinese_traditional"], \u521A: ["chinese_simplified"], \u653B: ["chinese_simplified", "chinese_traditional"], \u8C13: ["chinese_simplified"], \u76FE: ["chinese_simplified", "chinese_traditional"], \u8BA8: ["chinese_simplified"], \u665A: ["chinese_simplified", "chinese_traditional"], \u7C92: ["chinese_simplified", "chinese_traditional"], \u4E71: ["chinese_simplified"], \u71C3: ["chinese_simplified", "chinese_traditional"], \u77DB: ["chinese_simplified", "chinese_traditional"], \u4E4E: ["chinese_simplified", "chinese_traditional"], \u6740: ["chinese_simplified"], \u836F: ["chinese_simplified"], \u5B81: ["chinese_simplified"], \u9C81: ["chinese_simplified"], \u8D35: ["chinese_simplified"], \u949F: ["chinese_simplified"], \u7164: ["chinese_simplified", "chinese_traditional"], \u8BFB: ["chinese_simplified"], \u73ED: ["chinese_simplified", "chinese_traditional"], \u4F2F: ["chinese_simplified", "chinese_traditional"], \u9999: ["chinese_simplified", "chinese_traditional"], \u4ECB: ["chinese_simplified", "chinese_traditional"], \u8FEB: ["chinese_simplified", "chinese_traditional"], \u53E5: ["chinese_simplified", "chinese_traditional"], \u4E30: ["chinese_simplified"], \u57F9: ["chinese_simplified", "chinese_traditional"], \u63E1: ["chinese_simplified", "chinese_traditional"], \u5170: ["chinese_simplified"], \u62C5: ["chinese_simplified"], \u5F26: ["chinese_simplified", "chinese_traditional"], \u86CB: ["chinese_simplified", "chinese_traditional"], \u6C89: ["chinese_simplified", "chinese_traditional"], \u5047: ["chinese_simplified", "chinese_traditional"], \u7A7F: ["chinese_simplified", "chinese_traditional"], \u6267: ["chinese_simplified"], \u7B54: ["chinese_simplified", "chinese_traditional"], \u4E50: ["chinese_simplified"], \u8C01: ["chinese_simplified"], \u987A: ["chinese_simplified"], \u70DF: ["chinese_simplified"], \u7F29: ["chinese_simplified"], \u5F81: ["chinese_simplified"], \u8138: ["chinese_simplified"], \u559C: ["chinese_simplified", "chinese_traditional"], \u677E: ["chinese_simplified", "chinese_traditional"], \u811A: ["chinese_simplified"], \u56F0: ["chinese_simplified", "chinese_traditional"], \u5F02: ["chinese_simplified"], \u514D: ["chinese_simplified", "chinese_traditional"], \u80CC: ["chinese_simplified", "chinese_traditional"], \u661F: ["chinese_simplified", "chinese_traditional"], \u798F: ["chinese_simplified", "chinese_traditional"], \u4E70: ["chinese_simplified"], \u67D3: ["chinese_simplified", "chinese_traditional"], \u4E95: ["chinese_simplified", "chinese_traditional"], \u6982: ["chinese_simplified", "chinese_traditional"], \u6162: ["chinese_simplified", "chinese_traditional"], \u6015: ["chinese_simplified", "chinese_traditional"], \u78C1: ["chinese_simplified", "chinese_traditional"], \u500D: ["chinese_simplified", "chinese_traditional"], \u7956: ["chinese_simplified", "chinese_traditional"], \u7687: ["chinese_simplified", "chinese_traditional"], \u4FC3: ["chinese_simplified", "chinese_traditional"], \u9759: ["chinese_simplified"], \u8865: ["chinese_simplified"], \u8BC4: ["chinese_simplified"], \u7FFB: ["chinese_simplified", "chinese_traditional"], \u8089: ["chinese_simplified", "chinese_traditional"], \u8DF5: ["chinese_simplified"], \u5C3C: ["chinese_simplified", "chinese_traditional"], \u8863: ["chinese_simplified", "chinese_traditional"], \u5BBD: ["chinese_simplified"], \u626C: ["chinese_simplified"], \u68C9: ["chinese_simplified", "chinese_traditional"], \u5E0C: ["chinese_simplified", "chinese_traditional"], \u4F24: ["chinese_simplified"], \u64CD: ["chinese_simplified", "chinese_traditional"], \u5782: ["chinese_simplified", "chinese_traditional"], \u79CB: ["chinese_simplified", "chinese_traditional"], \u5B9C: ["chinese_simplified", "chinese_traditional"], \u6C22: ["chinese_simplified"], \u5957: ["chinese_simplified", "chinese_traditional"], \u7763: ["chinese_simplified", "chinese_traditional"], \u632F: ["chinese_simplified", "chinese_traditional"], \u67B6: ["chinese_simplified", "chinese_traditional"], \u4EAE: ["chinese_simplified", "chinese_traditional"], \u672B: ["chinese_simplified", "chinese_traditional"], \u5BAA: ["chinese_simplified"], \u5E86: ["chinese_simplified"], \u7F16: ["chinese_simplified"], \u725B: ["chinese_simplified", "chinese_traditional"], \u89E6: ["chinese_simplified"], \u6620: ["chinese_simplified", "chinese_traditional"], \u96F7: ["chinese_simplified", "chinese_traditional"], \u9500: ["chinese_simplified"], \u8BD7: ["chinese_simplified"], \u5EA7: ["chinese_simplified", "chinese_traditional"], \u5C45: ["chinese_simplified", "chinese_traditional"], \u6293: ["chinese_simplified", "chinese_traditional"], \u88C2: ["chinese_simplified", "chinese_traditional"], \u80DE: ["chinese_simplified", "chinese_traditional"], \u547C: ["chinese_simplified", "chinese_traditional"], \u5A18: ["chinese_simplified", "chinese_traditional"], \u666F: ["chinese_simplified", "chinese_traditional"], \u5A01: ["chinese_simplified", "chinese_traditional"], \u7EFF: ["chinese_simplified"], \u6676: ["chinese_simplified", "chinese_traditional"], \u539A: ["chinese_simplified", "chinese_traditional"], \u76DF: ["chinese_simplified", "chinese_traditional"], \u8861: ["chinese_simplified", "chinese_traditional"], \u9E21: ["chinese_simplified"], \u5B59: ["chinese_simplified"], \u5EF6: ["chinese_simplified", "chinese_traditional"], \u5371: ["chinese_simplified", "chinese_traditional"], \u80F6: ["chinese_simplified"], \u5C4B: ["chinese_simplified", "chinese_traditional"], \u4E61: ["chinese_simplified"], \u4E34: ["chinese_simplified"], \u9646: ["chinese_simplified"], \u987E: ["chinese_simplified"], \u6389: ["chinese_simplified", "chinese_traditional"], \u5440: ["chinese_simplified", "chinese_traditional"], \u706F: ["chinese_simplified"], \u5C81: ["chinese_simplified"], \u63AA: ["chinese_simplified", "chinese_traditional"], \u675F: ["chinese_simplified", "chinese_traditional"], \u8010: ["chinese_simplified", "chinese_traditional"], \u5267: ["chinese_simplified"], \u7389: ["chinese_simplified", "chinese_traditional"], \u8D75: ["chinese_simplified"], \u8DF3: ["chinese_simplified", "chinese_traditional"], \u54E5: ["chinese_simplified", "chinese_traditional"], \u5B63: ["chinese_simplified", "chinese_traditional"], \u8BFE: ["chinese_simplified"], \u51EF: ["chinese_simplified"], \u80E1: ["chinese_simplified", "chinese_traditional"], \u989D: ["chinese_simplified"], \u6B3E: ["chinese_simplified", "chinese_traditional"], \u7ECD: ["chinese_simplified"], \u5377: ["chinese_simplified", "chinese_traditional"], \u9F50: ["chinese_simplified"], \u4F1F: ["chinese_simplified"], \u84B8: ["chinese_simplified", "chinese_traditional"], \u6B96: ["chinese_simplified", "chinese_traditional"], \u6C38: ["chinese_simplified", "chinese_traditional"], \u5B97: ["chinese_simplified", "chinese_traditional"], \u82D7: ["chinese_simplified", "chinese_traditional"], \u5DDD: ["chinese_simplified", "chinese_traditional"], \u7089: ["chinese_simplified"], \u5CA9: ["chinese_simplified", "chinese_traditional"], \u5F31: ["chinese_simplified", "chinese_traditional"], \u96F6: ["chinese_simplified", "chinese_traditional"], \u6768: ["chinese_simplified"], \u594F: ["chinese_simplified", "chinese_traditional"], \u6CBF: ["chinese_simplified", "chinese_traditional"], \u9732: ["chinese_simplified", "chinese_traditional"], \u6746: ["chinese_simplified"], \u63A2: ["chinese_simplified", "chinese_traditional"], \u6ED1: ["chinese_simplified", "chinese_traditional"], \u9547: ["chinese_simplified"], \u996D: ["chinese_simplified"], \u6D53: ["chinese_simplified"], \u822A: ["chinese_simplified", "chinese_traditional"], \u6000: ["chinese_simplified"], \u8D76: ["chinese_simplified"], \u5E93: ["chinese_simplified"], \u593A: ["chinese_simplified"], \u4F0A: ["chinese_simplified", "chinese_traditional"], \u7075: ["chinese_simplified"], \u7A0E: ["chinese_simplified"], \u9014: ["chinese_simplified", "chinese_traditional"], \u706D: ["chinese_simplified"], \u8D5B: ["chinese_simplified"], \u5F52: ["chinese_simplified"], \u53EC: ["chinese_simplified", "chinese_traditional"], \u9F13: ["chinese_simplified", "chinese_traditional"], \u64AD: ["chinese_simplified", "chinese_traditional"], \u76D8: ["chinese_simplified"], \u88C1: ["chinese_simplified", "chinese_traditional"], \u9669: ["chinese_simplified"], \u5EB7: ["chinese_simplified", "chinese_traditional"], \u552F: ["chinese_simplified", "chinese_traditional"], \u5F55: ["chinese_simplified"], \u83CC: ["chinese_simplified", "chinese_traditional"], \u7EAF: ["chinese_simplified"], \u501F: ["chinese_simplified", "chinese_traditional"], \u7CD6: ["chinese_simplified", "chinese_traditional"], \u76D6: ["chinese_simplified"], \u6A2A: ["chinese_simplified"], \u7B26: ["chinese_simplified", "chinese_traditional"], \u79C1: ["chinese_simplified", "chinese_traditional"], \u52AA: ["chinese_simplified", "chinese_traditional"], \u5802: ["chinese_simplified", "chinese_traditional"], \u57DF: ["chinese_simplified", "chinese_traditional"], \u67AA: ["chinese_simplified"], \u6DA6: ["chinese_simplified"], \u5E45: ["chinese_simplified", "chinese_traditional"], \u54C8: ["chinese_simplified", "chinese_traditional"], \u7ADF: ["chinese_simplified", "chinese_traditional"], \u719F: ["chinese_simplified", "chinese_traditional"], \u866B: ["chinese_simplified"], \u6CFD: ["chinese_simplified"], \u8111: ["chinese_simplified"], \u58E4: ["chinese_simplified", "chinese_traditional"], \u78B3: ["chinese_simplified", "chinese_traditional"], \u6B27: ["chinese_simplified"], \u904D: ["chinese_simplified", "chinese_traditional"], \u4FA7: ["chinese_simplified"], \u5BE8: ["chinese_simplified", "chinese_traditional"], \u6562: ["chinese_simplified", "chinese_traditional"], \u5F7B: ["chinese_simplified"], \u8651: ["chinese_simplified"], \u659C: ["chinese_simplified", "chinese_traditional"], \u8584: ["chinese_simplified", "chinese_traditional"], \u5EAD: ["chinese_simplified", "chinese_traditional"], \u7EB3: ["chinese_simplified"], \u5F39: ["chinese_simplified"], \u9972: ["chinese_simplified"], \u4F38: ["chinese_simplified", "chinese_traditional"], \u6298: ["chinese_simplified", "chinese_traditional"], \u9EA6: ["chinese_simplified"], \u6E7F: ["chinese_simplified"], \u6697: ["chinese_simplified", "chinese_traditional"], \u8377: ["chinese_simplified", "chinese_traditional"], \u74E6: ["chinese_simplified", "chinese_traditional"], \u585E: ["chinese_simplified", "chinese_traditional"], \u5E8A: ["chinese_simplified", "chinese_traditional"], \u7B51: ["chinese_simplified"], \u6076: ["chinese_simplified"], \u6237: ["chinese_simplified"], \u8BBF: ["chinese_simplified"], \u5854: ["chinese_simplified", "chinese_traditional"], \u5947: ["chinese_simplified", "chinese_traditional"], \u900F: ["chinese_simplified", "chinese_traditional"], \u6881: ["chinese_simplified", "chinese_traditional"], \u5200: ["chinese_simplified", "chinese_traditional"], \u65CB: ["chinese_simplified", "chinese_traditional"], \u8FF9: ["chinese_simplified"], \u5361: ["chinese_simplified", "chinese_traditional"], \u6C2F: ["chinese_simplified", "chinese_traditional"], \u9047: ["chinese_simplified", "chinese_traditional"], \u4EFD: ["chinese_simplified", "chinese_traditional"], \u6BD2: ["chinese_simplified", "chinese_traditional"], \u6CE5: ["chinese_simplified", "chinese_traditional"], \u9000: ["chinese_simplified", "chinese_traditional"], \u6D17: ["chinese_simplified", "chinese_traditional"], \u6446: ["chinese_simplified"], \u7070: ["chinese_simplified", "chinese_traditional"], \u5F69: ["chinese_simplified", "chinese_traditional"], \u5356: ["chinese_simplified"], \u8017: ["chinese_simplified", "chinese_traditional"], \u590F: ["chinese_simplified", "chinese_traditional"], \u62E9: ["chinese_simplified"], \u5FD9: ["chinese_simplified", "chinese_traditional"], \u94DC: ["chinese_simplified"], \u732E: ["chinese_simplified"], \u786C: ["chinese_simplified", "chinese_traditional"], \u4E88: ["chinese_simplified", "chinese_traditional"], \u7E41: ["chinese_simplified", "chinese_traditional"], \u5708: ["chinese_simplified", "chinese_traditional"], \u96EA: ["chinese_simplified", "chinese_traditional"], \u51FD: ["chinese_simplified", "chinese_traditional"], \u4EA6: ["chinese_simplified", "chinese_traditional"], \u62BD: ["chinese_simplified", "chinese_traditional"], \u7BC7: ["chinese_simplified", "chinese_traditional"], \u9635: ["chinese_simplified"], \u9634: ["chinese_simplified"], \u4E01: ["chinese_simplified", "chinese_traditional"], \u5C3A: ["chinese_simplified", "chinese_traditional"], \u8FFD: ["chinese_simplified", "chinese_traditional"], \u5806: ["chinese_simplified", "chinese_traditional"], \u96C4: ["chinese_simplified", "chinese_traditional"], \u8FCE: ["chinese_simplified", "chinese_traditional"], \u6CDB: ["chinese_simplified", "chinese_traditional"], \u7238: ["chinese_simplified", "chinese_traditional"], \u697C: ["chinese_simplified"], \u907F: ["chinese_simplified", "chinese_traditional"], \u8C0B: ["chinese_simplified"], \u5428: ["chinese_simplified"], \u91CE: ["chinese_simplified", "chinese_traditional"], \u732A: ["chinese_simplified"], \u65D7: ["chinese_simplified", "chinese_traditional"], \u7D2F: ["chinese_simplified", "chinese_traditional"], \u504F: ["chinese_simplified", "chinese_traditional"], \u5178: ["chinese_simplified", "chinese_traditional"], \u9986: ["chinese_simplified"], \u7D22: ["chinese_simplified", "chinese_traditional"], \u79E6: ["chinese_simplified", "chinese_traditional"], \u8102: ["chinese_simplified", "chinese_traditional"], \u6F6E: ["chinese_simplified", "chinese_traditional"], \u7237: ["chinese_simplified"], \u8C46: ["chinese_simplified", "chinese_traditional"], \u5FFD: ["chinese_simplified", "chinese_traditional"], \u6258: ["chinese_simplified", "chinese_traditional"], \u60CA: ["chinese_simplified"], \u5851: ["chinese_simplified", "chinese_traditional"], \u9057: ["chinese_simplified"], \u6108: ["chinese_simplified", "chinese_traditional"], \u6731: ["chinese_simplified", "chinese_traditional"], \u66FF: ["chinese_simplified", "chinese_traditional"], \u7EA4: ["chinese_simplified"], \u7C97: ["chinese_simplified", "chinese_traditional"], \u503E: ["chinese_simplified"], \u5C1A: ["chinese_simplified", "chinese_traditional"], \u75DB: ["chinese_simplified", "chinese_traditional"], \u695A: ["chinese_simplified", "chinese_traditional"], \u8C22: ["chinese_simplified"], \u594B: ["chinese_simplified"], \u8D2D: ["chinese_simplified"], \u78E8: ["chinese_simplified", "chinese_traditional"], \u541B: ["chinese_simplified", "chinese_traditional"], \u6C60: ["chinese_simplified", "chinese_traditional"], \u65C1: ["chinese_simplified", "chinese_traditional"], \u788E: ["chinese_simplified", "chinese_traditional"], \u9AA8: ["chinese_simplified", "chinese_traditional"], \u76D1: ["chinese_simplified"], \u6355: ["chinese_simplified", "chinese_traditional"], \u5F1F: ["chinese_simplified", "chinese_traditional"], \u66B4: ["chinese_simplified", "chinese_traditional"], \u5272: ["chinese_simplified", "chinese_traditional"], \u8D2F: ["chinese_simplified"], \u6B8A: ["chinese_simplified", "chinese_traditional"], \u91CA: ["chinese_simplified"], \u8BCD: ["chinese_simplified"], \u4EA1: ["chinese_simplified", "chinese_traditional"], \u58C1: ["chinese_simplified", "chinese_traditional"], \u987F: ["chinese_simplified"], \u5B9D: ["chinese_simplified"], \u5348: ["chinese_simplified", "chinese_traditional"], \u5C18: ["chinese_simplified"], \u95FB: ["chinese_simplified"], \u63ED: ["chinese_simplified", "chinese_traditional"], \u70AE: ["chinese_simplified", "chinese_traditional"], \u6B8B: ["chinese_simplified"], \u51AC: ["chinese_simplified", "chinese_traditional"], \u6865: ["chinese_simplified"], \u5987: ["chinese_simplified"], \u8B66: ["chinese_simplified", "chinese_traditional"], \u7EFC: ["chinese_simplified"], \u62DB: ["chinese_simplified", "chinese_traditional"], \u5434: ["chinese_simplified"], \u4ED8: ["chinese_simplified", "chinese_traditional"], \u6D6E: ["chinese_simplified", "chinese_traditional"], \u906D: ["chinese_simplified", "chinese_traditional"], \u5F90: ["chinese_simplified", "chinese_traditional"], \u60A8: ["chinese_simplified", "chinese_traditional"], \u6447: ["chinese_simplified"], \u8C37: ["chinese_simplified", "chinese_traditional"], \u8D5E: ["chinese_simplified"], \u7BB1: ["chinese_simplified", "chinese_traditional"], \u9694: ["chinese_simplified", "chinese_traditional"], \u8BA2: ["chinese_simplified"], \u7537: ["chinese_simplified", "chinese_traditional"], \u5439: ["chinese_simplified", "chinese_traditional"], \u56ED: ["chinese_simplified"], \u7EB7: ["chinese_simplified"], \u5510: ["chinese_simplified", "chinese_traditional"], \u8D25: ["chinese_simplified"], \u5B8B: ["chinese_simplified", "chinese_traditional"], \u73BB: ["chinese_simplified", "chinese_traditional"], \u5DE8: ["chinese_simplified", "chinese_traditional"], \u8015: ["chinese_simplified", "chinese_traditional"], \u5766: ["chinese_simplified", "chinese_traditional"], \u8363: ["chinese_simplified"], \u95ED: ["chinese_simplified"], \u6E7E: ["chinese_simplified"], \u952E: ["chinese_simplified"], \u51E1: ["chinese_simplified", "chinese_traditional"], \u9A7B: ["chinese_simplified"], \u9505: ["chinese_simplified"], \u6551: ["chinese_simplified", "chinese_traditional"], \u6069: ["chinese_simplified", "chinese_traditional"], \u5265: ["chinese_simplified"], \u51DD: ["chinese_simplified", "chinese_traditional"], \u78B1: ["chinese_simplified"], \u9F7F: ["chinese_simplified"], \u622A: ["chinese_simplified", "chinese_traditional"], \u70BC: ["chinese_simplified"], \u9EBB: ["chinese_simplified", "chinese_traditional"], \u7EBA: ["chinese_simplified"], \u7981: ["chinese_simplified", "chinese_traditional"], \u5E9F: ["chinese_simplified"], \u76DB: ["chinese_simplified", "chinese_traditional"], \u7248: ["chinese_simplified", "chinese_traditional"], \u7F13: ["chinese_simplified"], \u51C0: ["chinese_simplified"], \u775B: ["chinese_simplified", "chinese_traditional"], \u660C: ["chinese_simplified", "chinese_traditional"], \u5A5A: ["chinese_simplified", "chinese_traditional"], \u6D89: ["chinese_simplified", "chinese_traditional"], \u7B52: ["chinese_simplified", "chinese_traditional"], \u5634: ["chinese_simplified", "chinese_traditional"], \u63D2: ["chinese_simplified", "chinese_traditional"], \u5CB8: ["chinese_simplified", "chinese_traditional"], \u6717: ["chinese_simplified", "chinese_traditional"], \u5E84: ["chinese_simplified"], \u8857: ["chinese_simplified", "chinese_traditional"], \u85CF: ["chinese_simplified", "chinese_traditional"], \u59D1: ["chinese_simplified", "chinese_traditional"], \u8D38: ["chinese_simplified"], \u8150: ["chinese_simplified", "chinese_traditional"], \u5974: ["chinese_simplified", "chinese_traditional"], \u5566: ["chinese_simplified", "chinese_traditional"], \u60EF: ["chinese_simplified"], \u4E58: ["chinese_simplified", "chinese_traditional"], \u4F19: ["chinese_simplified"], \u6062: ["chinese_simplified", "chinese_traditional"], \u5300: ["chinese_simplified"], \u7EB1: ["chinese_simplified"], \u624E: ["chinese_simplified", "chinese_traditional"], \u8FA9: ["chinese_simplified"], \u8033: ["chinese_simplified", "chinese_traditional"], \u5F6A: ["chinese_simplified", "chinese_traditional"], \u81E3: ["chinese_simplified", "chinese_traditional"], \u4EBF: ["chinese_simplified"], \u7483: ["chinese_simplified", "chinese_traditional"], \u62B5: ["chinese_simplified", "chinese_traditional"], \u8109: ["chinese_simplified"], \u79C0: ["chinese_simplified", "chinese_traditional"], \u8428: ["chinese_simplified"], \u4FC4: ["chinese_simplified", "chinese_traditional"], \u7F51: ["chinese_simplified"], \u821E: ["chinese_simplified", "chinese_traditional"], \u5E97: ["chinese_simplified", "chinese_traditional"], \u55B7: ["chinese_simplified"], \u7EB5: ["chinese_simplified"], \u5BF8: ["chinese_simplified", "chinese_traditional"], \u6C57: ["chinese_simplified", "chinese_traditional"], \u6302: ["chinese_simplified"], \u6D2A: ["chinese_simplified", "chinese_traditional"], \u8D3A: ["chinese_simplified"], \u95EA: ["chinese_simplified"], \u67EC: ["chinese_simplified", "chinese_traditional"], \u7206: ["chinese_simplified", "chinese_traditional"], \u70EF: ["chinese_simplified", "chinese_traditional"], \u6D25: ["chinese_simplified", "chinese_traditional"], \u7A3B: ["chinese_simplified", "chinese_traditional"], \u5899: ["chinese_simplified"], \u8F6F: ["chinese_simplified"], \u52C7: ["chinese_simplified", "chinese_traditional"], \u50CF: ["chinese_simplified", "chinese_traditional"], \u6EDA: ["chinese_simplified"], \u5398: ["chinese_simplified", "chinese_traditional"], \u8499: ["chinese_simplified", "chinese_traditional"], \u82B3: ["chinese_simplified", "chinese_traditional"], \u80AF: ["chinese_simplified", "chinese_traditional"], \u5761: ["chinese_simplified", "chinese_traditional"], \u67F1: ["chinese_simplified", "chinese_traditional"], \u8361: ["chinese_simplified"], \u817F: ["chinese_simplified", "chinese_traditional"], \u4EEA: ["chinese_simplified"], \u65C5: ["chinese_simplified", "chinese_traditional"], \u5C3E: ["chinese_simplified", "chinese_traditional"], \u8F67: ["chinese_simplified"], \u51B0: ["chinese_simplified", "chinese_traditional"], \u8D21: ["chinese_simplified"], \u767B: ["chinese_simplified", "chinese_traditional"], \u9ECE: ["chinese_simplified", "chinese_traditional"], \u524A: ["chinese_simplified", "chinese_traditional"], \u94BB: ["chinese_simplified"], \u52D2: ["chinese_simplified", "chinese_traditional"], \u9003: ["chinese_simplified", "chinese_traditional"], \u969C: ["chinese_simplified", "chinese_traditional"], \u6C28: ["chinese_simplified", "chinese_traditional"], \u90ED: ["chinese_simplified", "chinese_traditional"], \u5CF0: ["chinese_simplified", "chinese_traditional"], \u5E01: ["chinese_simplified"], \u6E2F: ["chinese_simplified", "chinese_traditional"], \u4F0F: ["chinese_simplified", "chinese_traditional"], \u8F68: ["chinese_simplified"], \u4EA9: ["chinese_simplified"], \u6BD5: ["chinese_simplified"], \u64E6: ["chinese_simplified", "chinese_traditional"], \u83AB: ["chinese_simplified", "chinese_traditional"], \u523A: ["chinese_simplified", "chinese_traditional"], \u6D6A: ["chinese_simplified", "chinese_traditional"], \u79D8: ["chinese_simplified", "chinese_traditional"], \u63F4: ["chinese_simplified", "chinese_traditional"], \u682A: ["chinese_simplified", "chinese_traditional"], \u5065: ["chinese_simplified", "chinese_traditional"], \u552E: ["chinese_simplified", "chinese_traditional"], \u80A1: ["chinese_simplified", "chinese_traditional"], \u5C9B: ["chinese_simplified"], \u7518: ["chinese_simplified", "chinese_traditional"], \u6CE1: ["chinese_simplified", "chinese_traditional"], \u7761: ["chinese_simplified", "chinese_traditional"], \u7AE5: ["chinese_simplified", "chinese_traditional"], \u94F8: ["chinese_simplified"], \u6C64: ["chinese_simplified"], \u9600: ["chinese_simplified"], \u4F11: ["chinese_simplified", "chinese_traditional"], \u6C47: ["chinese_simplified"], \u820D: ["chinese_simplified", "chinese_traditional"], \u7267: ["chinese_simplified", "chinese_traditional"], \u7ED5: ["chinese_simplified"], \u70B8: ["chinese_simplified", "chinese_traditional"], \u54F2: ["chinese_simplified", "chinese_traditional"], \u78F7: ["chinese_simplified", "chinese_traditional"], \u7EE9: ["chinese_simplified"], \u670B: ["chinese_simplified", "chinese_traditional"], \u6DE1: ["chinese_simplified", "chinese_traditional"], \u5C16: ["chinese_simplified", "chinese_traditional"], \u542F: ["chinese_simplified"], \u9677: ["chinese_simplified", "chinese_traditional"], \u67F4: ["chinese_simplified", "chinese_traditional"], \u5448: ["chinese_simplified", "chinese_traditional"], \u5F92: ["chinese_simplified", "chinese_traditional"], \u989C: ["chinese_simplified"], \u6CEA: ["chinese_simplified"], \u7A0D: ["chinese_simplified", "chinese_traditional"], \u5FD8: ["chinese_simplified", "chinese_traditional"], \u6CF5: ["chinese_simplified", "chinese_traditional"], \u84DD: ["chinese_simplified"], \u62D6: ["chinese_simplified", "chinese_traditional"], \u6D1E: ["chinese_simplified", "chinese_traditional"], \u6388: ["chinese_simplified", "chinese_traditional"], \u955C: ["chinese_simplified"], \u8F9B: ["chinese_simplified", "chinese_traditional"], \u58EE: ["chinese_simplified"], \u950B: ["chinese_simplified"], \u8D2B: ["chinese_simplified"], \u865A: ["chinese_simplified"], \u5F2F: ["chinese_simplified"], \u6469: ["chinese_simplified", "chinese_traditional"], \u6CF0: ["chinese_simplified", "chinese_traditional"], \u5E7C: ["chinese_simplified", "chinese_traditional"], \u5EF7: ["chinese_simplified", "chinese_traditional"], \u5C0A: ["chinese_simplified", "chinese_traditional"], \u7A97: ["chinese_simplified", "chinese_traditional"], \u7EB2: ["chinese_simplified"], \u5F04: ["chinese_simplified", "chinese_traditional"], \u96B6: ["chinese_simplified"], \u7591: ["chinese_simplified", "chinese_traditional"], \u6C0F: ["chinese_simplified", "chinese_traditional"], \u5BAB: ["chinese_simplified"], \u59D0: ["chinese_simplified", "chinese_traditional"], \u9707: ["chinese_simplified", "chinese_traditional"], \u745E: ["chinese_simplified", "chinese_traditional"], \u602A: ["chinese_simplified", "chinese_traditional"], \u5C24: ["chinese_simplified", "chinese_traditional"], \u7434: ["chinese_simplified", "chinese_traditional"], \u5FAA: ["chinese_simplified", "chinese_traditional"], \u63CF: ["chinese_simplified", "chinese_traditional"], \u819C: ["chinese_simplified", "chinese_traditional"], \u8FDD: ["chinese_simplified"], \u5939: ["chinese_simplified"], \u8170: ["chinese_simplified", "chinese_traditional"], \u7F18: ["chinese_simplified"], \u73E0: ["chinese_simplified", "chinese_traditional"], \u7A77: ["chinese_simplified"], \u68EE: ["chinese_simplified", "chinese_traditional"], \u679D: ["chinese_simplified", "chinese_traditional"], \u7AF9: ["chinese_simplified", "chinese_traditional"], \u6C9F: ["chinese_simplified"], \u50AC: ["chinese_simplified", "chinese_traditional"], \u7EF3: ["chinese_simplified"], \u5FC6: ["chinese_simplified"], \u90A6: ["chinese_simplified", "chinese_traditional"], \u5269: ["chinese_simplified", "chinese_traditional"], \u5E78: ["chinese_simplified", "chinese_traditional"], \u6D46: ["chinese_simplified"], \u680F: ["chinese_simplified"], \u62E5: ["chinese_simplified"], \u7259: ["chinese_simplified", "chinese_traditional"], \u8D2E: ["chinese_simplified"], \u793C: ["chinese_simplified"], \u6EE4: ["chinese_simplified"], \u94A0: ["chinese_simplified"], \u7EB9: ["chinese_simplified"], \u7F62: ["chinese_simplified"], \u62CD: ["chinese_simplified", "chinese_traditional"], \u54B1: ["chinese_simplified", "chinese_traditional"], \u558A: ["chinese_simplified", "chinese_traditional"], \u8896: ["chinese_simplified", "chinese_traditional"], \u57C3: ["chinese_simplified", "chinese_traditional"], \u52E4: ["chinese_simplified", "chinese_traditional"], \u7F5A: ["chinese_simplified"], \u7126: ["chinese_simplified", "chinese_traditional"], \u6F5C: ["chinese_simplified"], \u4F0D: ["chinese_simplified", "chinese_traditional"], \u58A8: ["chinese_simplified", "chinese_traditional"], \u6B32: ["chinese_simplified", "chinese_traditional"], \u7F1D: ["chinese_simplified"], \u59D3: ["chinese_simplified", "chinese_traditional"], \u520A: ["chinese_simplified", "chinese_traditional"], \u9971: ["chinese_simplified"], \u4EFF: ["chinese_simplified", "chinese_traditional"], \u5956: ["chinese_simplified"], \u94DD: ["chinese_simplified"], \u9B3C: ["chinese_simplified", "chinese_traditional"], \u4E3D: ["chinese_simplified"], \u8DE8: ["chinese_simplified", "chinese_traditional"], \u9ED8: ["chinese_simplified", "chinese_traditional"], \u6316: ["chinese_simplified", "chinese_traditional"], \u94FE: ["chinese_simplified"], \u626B: ["chinese_simplified"], \u559D: ["chinese_simplified", "chinese_traditional"], \u888B: ["chinese_simplified", "chinese_traditional"], \u70AD: ["chinese_simplified", "chinese_traditional"], \u6C61: ["chinese_simplified", "chinese_traditional"], \u5E55: ["chinese_simplified", "chinese_traditional"], \u8BF8: ["chinese_simplified"], \u5F27: ["chinese_simplified", "chinese_traditional"], \u52B1: ["chinese_simplified"], \u6885: ["chinese_simplified", "chinese_traditional"], \u5976: ["chinese_simplified", "chinese_traditional"], \u6D01: ["chinese_simplified"], \u707E: ["chinese_simplified"], \u821F: ["chinese_simplified", "chinese_traditional"], \u9274: ["chinese_simplified"], \u82EF: ["chinese_simplified", "chinese_traditional"], \u8BBC: ["chinese_simplified"], \u62B1: ["chinese_simplified", "chinese_traditional"], \u6BC1: ["chinese_simplified"], \u61C2: ["chinese_simplified", "chinese_traditional"], \u5BD2: ["chinese_simplified", "chinese_traditional"], \u667A: ["chinese_simplified", "chinese_traditional"], \u57D4: ["chinese_simplified", "chinese_traditional"], \u5BC4: ["chinese_simplified", "chinese_traditional"], \u5C4A: ["chinese_simplified"], \u8DC3: ["chinese_simplified"], \u6E21: ["chinese_simplified", "chinese_traditional"], \u6311: ["chinese_simplified", "chinese_traditional"], \u4E39: ["chinese_simplified", "chinese_traditional"], \u8270: ["chinese_simplified"], \u8D1D: ["chinese_simplified"], \u78B0: ["chinese_simplified", "chinese_traditional"], \u62D4: ["chinese_simplified", "chinese_traditional"], \u7239: ["chinese_simplified", "chinese_traditional"], \u6234: ["chinese_simplified", "chinese_traditional"], \u7801: ["chinese_simplified"], \u68A6: ["chinese_simplified"], \u82BD: ["chinese_simplified", "chinese_traditional"], \u7194: ["chinese_simplified", "chinese_traditional"], \u8D64: ["chinese_simplified", "chinese_traditional"], \u6E14: ["chinese_simplified"], \u54ED: ["chinese_simplified", "chinese_traditional"], \u656C: ["chinese_simplified", "chinese_traditional"], \u9897: ["chinese_simplified"], \u5954: ["chinese_simplified", "chinese_traditional"], \u94C5: ["chinese_simplified"], \u4EF2: ["chinese_simplified", "chinese_traditional"], \u864E: ["chinese_simplified", "chinese_traditional"], \u7A00: ["chinese_simplified", "chinese_traditional"], \u59B9: ["chinese_simplified", "chinese_traditional"], \u4E4F: ["chinese_simplified", "chinese_traditional"], \u73CD: ["chinese_simplified", "chinese_traditional"], \u7533: ["chinese_simplified", "chinese_traditional"], \u684C: ["chinese_simplified", "chinese_traditional"], \u9075: ["chinese_simplified", "chinese_traditional"], \u5141: ["chinese_simplified", "chinese_traditional"], \u9686: ["chinese_simplified", "chinese_traditional"], \u87BA: ["chinese_simplified", "chinese_traditional"], \u4ED3: ["chinese_simplified"], \u9B4F: ["chinese_simplified", "chinese_traditional"], \u9510: ["chinese_simplified"], \u6653: ["chinese_simplified"], \u6C2E: ["chinese_simplified", "chinese_traditional"], \u517C: ["chinese_simplified", "chinese_traditional"], \u9690: ["chinese_simplified"], \u788D: ["chinese_simplified"], \u8D6B: ["chinese_simplified", "chinese_traditional"], \u62E8: ["chinese_simplified"], \u5FE0: ["chinese_simplified", "chinese_traditional"], \u8083: ["chinese_simplified"], \u7F38: ["chinese_simplified", "chinese_traditional"], \u7275: ["chinese_simplified"], \u62A2: ["chinese_simplified"], \u535A: ["chinese_simplified", "chinese_traditional"], \u5DE7: ["chinese_simplified", "chinese_traditional"], \u58F3: ["chinese_simplified"], \u5144: ["chinese_simplified", "chinese_traditional"], \u675C: ["chinese_simplified", "chinese_traditional"], \u8BAF: ["chinese_simplified"], \u8BDA: ["chinese_simplified"], \u78A7: ["chinese_simplified", "chinese_traditional"], \u7965: ["chinese_simplified", "chinese_traditional"], \u67EF: ["chinese_simplified", "chinese_traditional"], \u9875: ["chinese_simplified"], \u5DE1: ["chinese_simplified", "chinese_traditional"], \u77E9: ["chinese_simplified", "chinese_traditional"], \u60B2: ["chinese_simplified", "chinese_traditional"], \u704C: ["chinese_simplified", "chinese_traditional"], \u9F84: ["chinese_simplified"], \u4F26: ["chinese_simplified"], \u7968: ["chinese_simplified", "chinese_traditional"], \u5BFB: ["chinese_simplified"], \u6842: ["chinese_simplified", "chinese_traditional"], \u94FA: ["chinese_simplified"], \u5723: ["chinese_simplified"], \u6050: ["chinese_simplified", "chinese_traditional"], \u6070: ["chinese_simplified", "chinese_traditional"], \u90D1: ["chinese_simplified"], \u8DA3: ["chinese_simplified", "chinese_traditional"], \u62AC: ["chinese_simplified", "chinese_traditional"], \u8352: ["chinese_simplified", "chinese_traditional"], \u817E: ["chinese_simplified"], \u8D34: ["chinese_simplified"], \u67D4: ["chinese_simplified", "chinese_traditional"], \u6EF4: ["chinese_simplified", "chinese_traditional"], \u731B: ["chinese_simplified", "chinese_traditional"], \u9614: ["chinese_simplified"], \u8F86: ["chinese_simplified"], \u59BB: ["chinese_simplified", "chinese_traditional"], \u586B: ["chinese_simplified", "chinese_traditional"], \u64A4: ["chinese_simplified", "chinese_traditional"], \u50A8: ["chinese_simplified"], \u7B7E: ["chinese_simplified"], \u95F9: ["chinese_simplified"], \u6270: ["chinese_simplified"], \u7D2B: ["chinese_simplified", "chinese_traditional"], \u7802: ["chinese_simplified", "chinese_traditional"], \u9012: ["chinese_simplified"], \u620F: ["chinese_simplified"], \u540A: ["chinese_simplified", "chinese_traditional"], \u9676: ["chinese_simplified", "chinese_traditional"], \u4F10: ["chinese_simplified", "chinese_traditional"], \u5582: ["chinese_simplified"], \u7597: ["chinese_simplified"], \u74F6: ["chinese_simplified", "chinese_traditional"], \u5A46: ["chinese_simplified", "chinese_traditional"], \u629A: ["chinese_simplified"], \u81C2: ["chinese_simplified", "chinese_traditional"], \u6478: ["chinese_simplified", "chinese_traditional"], \u5FCD: ["chinese_simplified", "chinese_traditional"], \u867E: ["chinese_simplified"], \u8721: ["chinese_simplified"], \u90BB: ["chinese_simplified"], \u80F8: ["chinese_simplified", "chinese_traditional"], \u5DE9: ["chinese_simplified"], \u6324: ["chinese_simplified"], \u5076: ["chinese_simplified", "chinese_traditional"], \u5F03: ["chinese_simplified"], \u69FD: ["chinese_simplified", "chinese_traditional"], \u52B2: ["chinese_simplified"], \u4E73: ["chinese_simplified", "chinese_traditional"], \u9093: ["chinese_simplified"], \u5409: ["chinese_simplified", "chinese_traditional"], \u4EC1: ["chinese_simplified", "chinese_traditional"], \u70C2: ["chinese_simplified"], \u7816: ["chinese_simplified"], \u79DF: ["chinese_simplified", "chinese_traditional"], \u4E4C: ["chinese_simplified"], \u8230: ["chinese_simplified"], \u4F34: ["chinese_simplified", "chinese_traditional"], \u74DC: ["chinese_simplified", "chinese_traditional"], \u6D45: ["chinese_simplified"], \u4E19: ["chinese_simplified", "chinese_traditional"], \u6682: ["chinese_simplified"], \u71E5: ["chinese_simplified", "chinese_traditional"], \u6A61: ["chinese_simplified", "chinese_traditional"], \u67F3: ["chinese_simplified", "chinese_traditional"], \u8FF7: ["chinese_simplified", "chinese_traditional"], \u6696: ["chinese_simplified", "chinese_traditional"], \u724C: ["chinese_simplified", "chinese_traditional"], \u79E7: ["chinese_simplified", "chinese_traditional"], \u80C6: ["chinese_simplified"], \u8BE6: ["chinese_simplified"], \u7C27: ["chinese_simplified", "chinese_traditional"], \u8E0F: ["chinese_simplified", "chinese_traditional"], \u74F7: ["chinese_simplified", "chinese_traditional"], \u8C31: ["chinese_simplified"], \u5446: ["chinese_simplified", "chinese_traditional"], \u5BBE: ["chinese_simplified"], \u7CCA: ["chinese_simplified", "chinese_traditional"], \u6D1B: ["chinese_simplified", "chinese_traditional"], \u8F89: ["chinese_simplified"], \u6124: ["chinese_simplified"], \u7ADE: ["chinese_simplified"], \u9699: ["chinese_simplified", "chinese_traditional"], \u6012: ["chinese_simplified", "chinese_traditional"], \u7C98: ["chinese_simplified", "chinese_traditional"], \u4E43: ["chinese_simplified", "chinese_traditional"], \u7EEA: ["chinese_simplified"], \u80A9: ["chinese_simplified", "chinese_traditional"], \u7C4D: ["chinese_simplified", "chinese_traditional"], \u654F: ["chinese_simplified", "chinese_traditional"], \u6D82: ["chinese_simplified"], \u7199: ["chinese_simplified", "chinese_traditional"], \u7686: ["chinese_simplified", "chinese_traditional"], \u4FA6: ["chinese_simplified"], \u60AC: ["chinese_simplified"], \u6398: ["chinese_simplified", "chinese_traditional"], \u4EAB: ["chinese_simplified", "chinese_traditional"], \u7EA0: ["chinese_simplified"], \u9192: ["chinese_simplified", "chinese_traditional"], \u72C2: ["chinese_simplified", "chinese_traditional"], \u9501: ["chinese_simplified"], \u6DC0: ["chinese_simplified", "chinese_traditional"], \u6068: ["chinese_simplified", "chinese_traditional"], \u7272: ["chinese_simplified", "chinese_traditional"], \u9738: ["chinese_simplified", "chinese_traditional"], \u722C: ["chinese_simplified", "chinese_traditional"], \u8D4F: ["chinese_simplified"], \u9006: ["chinese_simplified", "chinese_traditional"], \u73A9: ["chinese_simplified", "chinese_traditional"], \u9675: ["chinese_simplified", "chinese_traditional"], \u795D: ["chinese_simplified", "chinese_traditional"], \u79D2: ["chinese_simplified", "chinese_traditional"], \u6D59: ["chinese_simplified", "chinese_traditional"], \u8C8C: ["chinese_simplified", "chinese_traditional"], \u5F79: ["chinese_simplified", "chinese_traditional"], \u5F7C: ["chinese_simplified", "chinese_traditional"], \u6089: ["chinese_simplified", "chinese_traditional"], \u9E2D: ["chinese_simplified"], \u8D8B: ["chinese_simplified"], \u51E4: ["chinese_simplified"], \u6668: ["chinese_simplified", "chinese_traditional"], \u755C: ["chinese_simplified", "chinese_traditional"], \u8F88: ["chinese_simplified"], \u79E9: ["chinese_simplified", "chinese_traditional"], \u5375: ["chinese_simplified", "chinese_traditional"], \u7F72: ["chinese_simplified", "chinese_traditional"], \u68AF: ["chinese_simplified", "chinese_traditional"], \u708E: ["chinese_simplified", "chinese_traditional"], \u6EE9: ["chinese_simplified"], \u68CB: ["chinese_simplified", "chinese_traditional"], \u9A71: ["chinese_simplified"], \u7B5B: ["chinese_simplified"], \u5CE1: ["chinese_simplified"], \u5192: ["chinese_simplified", "chinese_traditional"], \u5565: ["chinese_simplified", "chinese_traditional"], \u5BFF: ["chinese_simplified"], \u8BD1: ["chinese_simplified"], \u6D78: ["chinese_simplified", "chinese_traditional"], \u6CC9: ["chinese_simplified", "chinese_traditional"], \u5E3D: ["chinese_simplified", "chinese_traditional"], \u8FDF: ["chinese_simplified"], \u7845: ["chinese_simplified"], \u7586: ["chinese_simplified", "chinese_traditional"], \u8D37: ["chinese_simplified"], \u6F0F: ["chinese_simplified", "chinese_traditional"], \u7A3F: ["chinese_simplified", "chinese_traditional"], \u51A0: ["chinese_simplified", "chinese_traditional"], \u5AE9: ["chinese_simplified", "chinese_traditional"], \u80C1: ["chinese_simplified"], \u82AF: ["chinese_simplified", "chinese_traditional"], \u7262: ["chinese_simplified", "chinese_traditional"], \u53DB: ["chinese_simplified", "chinese_traditional"], \u8680: ["chinese_simplified"], \u5965: ["chinese_simplified"], \u9E23: ["chinese_simplified"], \u5CAD: ["chinese_simplified"], \u7F8A: ["chinese_simplified", "chinese_traditional"], \u51ED: ["chinese_simplified"], \u4E32: ["chinese_simplified", "chinese_traditional"], \u5858: ["chinese_simplified", "chinese_traditional"], \u7ED8: ["chinese_simplified"], \u9175: ["chinese_simplified", "chinese_traditional"], \u878D: ["chinese_simplified", "chinese_traditional"], \u76C6: ["chinese_simplified", "chinese_traditional"], \u9521: ["chinese_simplified"], \u5E99: ["chinese_simplified"], \u7B79: ["chinese_simplified"], \u51BB: ["chinese_simplified"], \u8F85: ["chinese_simplified"], \u6444: ["chinese_simplified"], \u88AD: ["chinese_simplified"], \u7B4B: ["chinese_simplified", "chinese_traditional"], \u62D2: ["chinese_simplified", "chinese_traditional"], \u50DA: ["chinese_simplified", "chinese_traditional"], \u65F1: ["chinese_simplified", "chinese_traditional"], \u94BE: ["chinese_simplified"], \u9E1F: ["chinese_simplified"], \u6F06: ["chinese_simplified", "chinese_traditional"], \u6C88: ["chinese_simplified", "chinese_traditional"], \u7709: ["chinese_simplified", "chinese_traditional"], \u758F: ["chinese_simplified", "chinese_traditional"], \u6DFB: ["chinese_simplified", "chinese_traditional"], \u68D2: ["chinese_simplified", "chinese_traditional"], \u7A57: ["chinese_simplified", "chinese_traditional"], \u785D: ["chinese_simplified", "chinese_traditional"], \u97E9: ["chinese_simplified"], \u903C: ["chinese_simplified", "chinese_traditional"], \u626D: ["chinese_simplified", "chinese_traditional"], \u4FA8: ["chinese_simplified"], \u51C9: ["chinese_simplified"], \u633A: ["chinese_simplified", "chinese_traditional"], \u7897: ["chinese_simplified", "chinese_traditional"], \u683D: ["chinese_simplified", "chinese_traditional"], \u7092: ["chinese_simplified", "chinese_traditional"], \u676F: ["chinese_simplified", "chinese_traditional"], \u60A3: ["chinese_simplified", "chinese_traditional"], \u998F: ["chinese_simplified"], \u529D: ["chinese_simplified"], \u8C6A: ["chinese_simplified", "chinese_traditional"], \u8FBD: ["chinese_simplified"], \u52C3: ["chinese_simplified", "chinese_traditional"], \u9E3F: ["chinese_simplified"], \u65E6: ["chinese_simplified", "chinese_traditional"], \u540F: ["chinese_simplified", "chinese_traditional"], \u62DC: ["chinese_simplified", "chinese_traditional"], \u72D7: ["chinese_simplified", "chinese_traditional"], \u57CB: ["chinese_simplified", "chinese_traditional"], \u8F8A: ["chinese_simplified"], \u63A9: ["chinese_simplified", "chinese_traditional"], \u996E: ["chinese_simplified"], \u642C: ["chinese_simplified", "chinese_traditional"], \u9A82: ["chinese_simplified"], \u8F9E: ["chinese_simplified"], \u52FE: ["chinese_simplified", "chinese_traditional"], \u6263: ["chinese_simplified", "chinese_traditional"], \u4F30: ["chinese_simplified", "chinese_traditional"], \u848B: ["chinese_simplified"], \u7ED2: ["chinese_simplified"], \u96FE: ["chinese_simplified"], \u4E08: ["chinese_simplified", "chinese_traditional"], \u6735: ["chinese_simplified", "chinese_traditional"], \u59C6: ["chinese_simplified", "chinese_traditional"], \u62DF: ["chinese_simplified"], \u5B87: ["chinese_simplified", "chinese_traditional"], \u8F91: ["chinese_simplified"], \u9655: ["chinese_simplified"], \u96D5: ["chinese_simplified", "chinese_traditional"], \u507F: ["chinese_simplified"], \u84C4: ["chinese_simplified", "chinese_traditional"], \u5D07: ["chinese_simplified", "chinese_traditional"], \u526A: ["chinese_simplified", "chinese_traditional"], \u5021: ["chinese_simplified", "chinese_traditional"], \u5385: ["chinese_simplified"], \u54AC: ["chinese_simplified", "chinese_traditional"], \u9A76: ["chinese_simplified"], \u85AF: ["chinese_simplified", "chinese_traditional"], \u5237: ["chinese_simplified", "chinese_traditional"], \u65A5: ["chinese_simplified", "chinese_traditional"], \u756A: ["chinese_simplified", "chinese_traditional"], \u8D4B: ["chinese_simplified"], \u5949: ["chinese_simplified", "chinese_traditional"], \u4F5B: ["chinese_simplified", "chinese_traditional"], \u6D47: ["chinese_simplified"], \u6F2B: ["chinese_simplified", "chinese_traditional"], \u66FC: ["chinese_simplified", "chinese_traditional"], \u6247: ["chinese_simplified", "chinese_traditional"], \u9499: ["chinese_simplified"], \u6843: ["chinese_simplified", "chinese_traditional"], \u6276: ["chinese_simplified", "chinese_traditional"], \u4ED4: ["chinese_simplified", "chinese_traditional"], \u8FD4: ["chinese_simplified", "chinese_traditional"], \u4FD7: ["chinese_simplified", "chinese_traditional"], \u4E8F: ["chinese_simplified"], \u8154: ["chinese_simplified", "chinese_traditional"], \u978B: ["chinese_simplified", "chinese_traditional"], \u68F1: ["chinese_simplified", "chinese_traditional"], \u8986: ["chinese_simplified", "chinese_traditional"], \u6846: ["chinese_simplified", "chinese_traditional"], \u6084: ["chinese_simplified", "chinese_traditional"], \u53D4: ["chinese_simplified", "chinese_traditional"], \u649E: ["chinese_simplified", "chinese_traditional"], \u9A97: ["chinese_simplified"], \u52D8: ["chinese_simplified", "chinese_traditional"], \u65FA: ["chinese_simplified", "chinese_traditional"], \u6CB8: ["chinese_simplified", "chinese_traditional"], \u5B64: ["chinese_simplified", "chinese_traditional"], \u5410: ["chinese_simplified", "chinese_traditional"], \u5B5F: ["chinese_simplified", "chinese_traditional"], \u6E20: ["chinese_simplified", "chinese_traditional"], \u5C48: ["chinese_simplified", "chinese_traditional"], \u75BE: ["chinese_simplified", "chinese_traditional"], \u5999: ["chinese_simplified", "chinese_traditional"], \u60DC: ["chinese_simplified", "chinese_traditional"], \u4EF0: ["chinese_simplified", "chinese_traditional"], \u72E0: ["chinese_simplified", "chinese_traditional"], \u80C0: ["chinese_simplified"], \u8C10: ["chinese_simplified"], \u629B: ["chinese_simplified"], \u9709: ["chinese_simplified"], \u6851: ["chinese_simplified", "chinese_traditional"], \u5C97: ["chinese_simplified"], \u561B: ["chinese_simplified", "chinese_traditional"], \u8870: ["chinese_simplified", "chinese_traditional"], \u76D7: ["chinese_simplified"], \u6E17: ["chinese_simplified"], \u810F: ["chinese_simplified"], \u8D56: ["chinese_simplified"], \u6D8C: ["chinese_simplified"], \u751C: ["chinese_simplified", "chinese_traditional"], \u66F9: ["chinese_simplified", "chinese_traditional"], \u9605: ["chinese_simplified"], \u808C: ["chinese_simplified", "chinese_traditional"], \u54E9: ["chinese_simplified", "chinese_traditional"], \u5389: ["chinese_simplified"], \u70C3: ["chinese_simplified"], \u7EAC: ["chinese_simplified"], \u6BC5: ["chinese_simplified", "chinese_traditional"], \u6628: ["chinese_simplified", "chinese_traditional"], \u4F2A: ["chinese_simplified"], \u75C7: ["chinese_simplified", "chinese_traditional"], \u716E: ["chinese_simplified", "chinese_traditional"], \u53F9: ["chinese_simplified"], \u9489: ["chinese_simplified"], \u642D: ["chinese_simplified", "chinese_traditional"], \u830E: ["chinese_simplified"], \u7B3C: ["chinese_simplified"], \u9177: ["chinese_simplified", "chinese_traditional"], \u5077: ["chinese_simplified", "chinese_traditional"], \u5F13: ["chinese_simplified", "chinese_traditional"], \u9525: ["chinese_simplified"], \u6052: ["chinese_simplified"], \u6770: ["chinese_simplified"], \u5751: ["chinese_simplified", "chinese_traditional"], \u9F3B: ["chinese_simplified", "chinese_traditional"], \u7FFC: ["chinese_simplified", "chinese_traditional"], \u7EB6: ["chinese_simplified"], \u53D9: ["chinese_simplified"], \u72F1: ["chinese_simplified"], \u902E: ["chinese_simplified", "chinese_traditional"], \u7F50: ["chinese_simplified", "chinese_traditional"], \u7EDC: ["chinese_simplified"], \u68DA: ["chinese_simplified", "chinese_traditional"], \u6291: ["chinese_simplified", "chinese_traditional"], \u81A8: ["chinese_simplified", "chinese_traditional"], \u852C: ["chinese_simplified", "chinese_traditional"], \u5BFA: ["chinese_simplified", "chinese_traditional"], \u9AA4: ["chinese_simplified"], \u7A46: ["chinese_simplified", "chinese_traditional"], \u51B6: ["chinese_simplified", "chinese_traditional"], \u67AF: ["chinese_simplified", "chinese_traditional"], \u518C: ["chinese_simplified"], \u5C38: ["chinese_simplified"], \u51F8: ["chinese_simplified", "chinese_traditional"], \u7EC5: ["chinese_simplified"], \u576F: ["chinese_simplified", "chinese_traditional"], \u727A: ["chinese_simplified"], \u7130: ["chinese_simplified", "chinese_traditional"], \u8F70: ["chinese_simplified"], \u6B23: ["chinese_simplified", "chinese_traditional"], \u664B: ["chinese_simplified"], \u7626: ["chinese_simplified", "chinese_traditional"], \u5FA1: ["chinese_simplified"], \u952D: ["chinese_simplified"], \u9526: ["chinese_simplified"], \u4E27: ["chinese_simplified"], \u65EC: ["chinese_simplified", "chinese_traditional"], \u953B: ["chinese_simplified"], \u5784: ["chinese_simplified"], \u641C: ["chinese_simplified", "chinese_traditional"], \u6251: ["chinese_simplified"], \u9080: ["chinese_simplified", "chinese_traditional"], \u4EAD: ["chinese_simplified", "chinese_traditional"], \u916F: ["chinese_simplified", "chinese_traditional"], \u8FC8: ["chinese_simplified"], \u8212: ["chinese_simplified", "chinese_traditional"], \u8106: ["chinese_simplified", "chinese_traditional"], \u9176: ["chinese_simplified", "chinese_traditional"], \u95F2: ["chinese_simplified"], \u5FE7: ["chinese_simplified"], \u915A: ["chinese_simplified", "chinese_traditional"], \u987D: ["chinese_simplified"], \u7FBD: ["chinese_simplified", "chinese_traditional"], \u6DA8: ["chinese_simplified"], \u5378: ["chinese_simplified", "chinese_traditional"], \u4ED7: ["chinese_simplified", "chinese_traditional"], \u966A: ["chinese_simplified", "chinese_traditional"], \u8F9F: ["chinese_simplified"], \u60E9: ["chinese_simplified"], \u676D: ["chinese_simplified", "chinese_traditional"], \u59DA: ["chinese_simplified", "chinese_traditional"], \u809A: ["chinese_simplified", "chinese_traditional"], \u6349: ["chinese_simplified", "chinese_traditional"], \u98D8: ["chinese_simplified"], \u6F02: ["chinese_simplified", "chinese_traditional"], \u6606: ["chinese_simplified", "chinese_traditional"], \u6B3A: ["chinese_simplified", "chinese_traditional"], \u543E: ["chinese_simplified", "chinese_traditional"], \u90CE: ["chinese_simplified", "chinese_traditional"], \u70F7: ["chinese_simplified", "chinese_traditional"], \u6C41: ["chinese_simplified", "chinese_traditional"], \u5475: ["chinese_simplified", "chinese_traditional"], \u9970: ["chinese_simplified"], \u8427: ["chinese_simplified"], \u96C5: ["chinese_simplified", "chinese_traditional"], \u90AE: ["chinese_simplified"], \u8FC1: ["chinese_simplified"], \u71D5: ["chinese_simplified", "chinese_traditional"], \u6492: ["chinese_simplified", "chinese_traditional"], \u59FB: ["chinese_simplified", "chinese_traditional"], \u8D74: ["chinese_simplified", "chinese_traditional"], \u5BB4: ["chinese_simplified", "chinese_traditional"], \u70E6: ["chinese_simplified"], \u503A: ["chinese_simplified"], \u5E10: ["chinese_simplified"], \u6591: ["chinese_simplified", "chinese_traditional"], \u94C3: ["chinese_simplified"], \u65E8: ["chinese_simplified", "chinese_traditional"], \u9187: ["chinese_simplified", "chinese_traditional"], \u8463: ["chinese_simplified", "chinese_traditional"], \u997C: ["chinese_simplified"], \u96CF: ["chinese_simplified"], \u59FF: ["chinese_simplified", "chinese_traditional"], \u62CC: ["chinese_simplified", "chinese_traditional"], \u5085: ["chinese_simplified", "chinese_traditional"], \u8179: ["chinese_simplified", "chinese_traditional"], \u59A5: ["chinese_simplified", "chinese_traditional"], \u63C9: ["chinese_simplified", "chinese_traditional"], \u8D24: ["chinese_simplified"], \u62C6: ["chinese_simplified", "chinese_traditional"], \u6B6A: ["chinese_simplified", "chinese_traditional"], \u8461: ["chinese_simplified", "chinese_traditional"], \u80FA: ["chinese_simplified", "chinese_traditional"], \u4E22: ["chinese_simplified"], \u6D69: ["chinese_simplified", "chinese_traditional"], \u5FBD: ["chinese_simplified", "chinese_traditional"], \u6602: ["chinese_simplified", "chinese_traditional"], \u57AB: ["chinese_simplified"], \u6321: ["chinese_simplified"], \u89C8: ["chinese_simplified"], \u8D2A: ["chinese_simplified"], \u6170: ["chinese_simplified", "chinese_traditional"], \u7F34: ["chinese_simplified"], \u6C6A: ["chinese_simplified", "chinese_traditional"], \u614C: ["chinese_simplified", "chinese_traditional"], \u51AF: ["chinese_simplified"], \u8BFA: ["chinese_simplified"], \u59DC: ["chinese_simplified", "chinese_traditional"], \u8C0A: ["chinese_simplified"], \u51F6: ["chinese_simplified"], \u52A3: ["chinese_simplified", "chinese_traditional"], \u8BEC: ["chinese_simplified"], \u8000: ["chinese_simplified", "chinese_traditional"], \u660F: ["chinese_simplified", "chinese_traditional"], \u8EBA: ["chinese_simplified", "chinese_traditional"], \u76C8: ["chinese_simplified", "chinese_traditional"], \u9A91: ["chinese_simplified"], \u4E54: ["chinese_simplified"], \u6EAA: ["chinese_simplified", "chinese_traditional"], \u4E1B: ["chinese_simplified"], \u5362: ["chinese_simplified"], \u62B9: ["chinese_simplified", "chinese_traditional"], \u95F7: ["chinese_simplified"], \u54A8: ["chinese_simplified"], \u522E: ["chinese_simplified", "chinese_traditional"], \u9A7E: ["chinese_simplified"], \u7F06: ["chinese_simplified"], \u609F: ["chinese_simplified", "chinese_traditional"], \u6458: ["chinese_simplified", "chinese_traditional"], \u94D2: ["chinese_simplified"], \u63B7: ["chinese_simplified"], \u9887: ["chinese_simplified"], \u5E7B: ["chinese_simplified", "chinese_traditional"], \u67C4: ["chinese_simplified", "chinese_traditional"], \u60E0: ["chinese_simplified", "chinese_traditional"], \u60E8: ["chinese_simplified"], \u4F73: ["chinese_simplified", "chinese_traditional"], \u4EC7: ["chinese_simplified", "chinese_traditional"], \u814A: ["chinese_simplified"], \u7A9D: ["chinese_simplified"], \u6DA4: ["chinese_simplified"], \u5251: ["chinese_simplified"], \u77A7: ["chinese_simplified", "chinese_traditional"], \u5821: ["chinese_simplified", "chinese_traditional"], \u6CFC: ["chinese_simplified"], \u8471: ["chinese_simplified"], \u7F69: ["chinese_simplified", "chinese_traditional"], \u970D: ["chinese_simplified", "chinese_traditional"], \u635E: ["chinese_simplified"], \u80CE: ["chinese_simplified", "chinese_traditional"], \u82CD: ["chinese_simplified"], \u6EE8: ["chinese_simplified"], \u4FE9: ["chinese_simplified"], \u6345: ["chinese_simplified", "chinese_traditional"], \u6E58: ["chinese_simplified", "chinese_traditional"], \u780D: ["chinese_simplified", "chinese_traditional"], \u971E: ["chinese_simplified", "chinese_traditional"], \u90B5: ["chinese_simplified", "chinese_traditional"], \u8404: ["chinese_simplified", "chinese_traditional"], \u75AF: ["chinese_simplified"], \u6DEE: ["chinese_simplified", "chinese_traditional"], \u9042: ["chinese_simplified", "chinese_traditional"], \u718A: ["chinese_simplified", "chinese_traditional"], \u7CAA: ["chinese_simplified"], \u70D8: ["chinese_simplified", "chinese_traditional"], \u5BBF: ["chinese_simplified", "chinese_traditional"], \u6863: ["chinese_simplified"], \u6208: ["chinese_simplified", "chinese_traditional"], \u9A73: ["chinese_simplified"], \u5AC2: ["chinese_simplified", "chinese_traditional"], \u88D5: ["chinese_simplified", "chinese_traditional"], \u5F99: ["chinese_simplified", "chinese_traditional"], \u7BAD: ["chinese_simplified", "chinese_traditional"], \u6350: ["chinese_simplified", "chinese_traditional"], \u80A0: ["chinese_simplified"], \u6491: ["chinese_simplified"], \u6652: ["chinese_simplified"], \u8FA8: ["chinese_simplified", "chinese_traditional"], \u6BBF: ["chinese_simplified", "chinese_traditional"], \u83B2: ["chinese_simplified"], \u644A: ["chinese_simplified"], \u6405: ["chinese_simplified"], \u9171: ["chinese_simplified"], \u5C4F: ["chinese_simplified", "chinese_traditional"], \u75AB: ["chinese_simplified", "chinese_traditional"], \u54C0: ["chinese_simplified", "chinese_traditional"], \u8521: ["chinese_simplified", "chinese_traditional"], \u5835: ["chinese_simplified", "chinese_traditional"], \u6CAB: ["chinese_simplified", "chinese_traditional"], \u76B1: ["chinese_simplified"], \u7545: ["chinese_simplified"], \u53E0: ["chinese_simplified"], \u9601: ["chinese_simplified"], \u83B1: ["chinese_simplified"], \u6572: ["chinese_simplified", "chinese_traditional"], \u8F96: ["chinese_simplified"], \u94A9: ["chinese_simplified"], \u75D5: ["chinese_simplified", "chinese_traditional"], \u575D: ["chinese_simplified"], \u5DF7: ["chinese_simplified", "chinese_traditional"], \u997F: ["chinese_simplified"], \u7978: ["chinese_simplified"], \u4E18: ["chinese_simplified", "chinese_traditional"], \u7384: ["chinese_simplified", "chinese_traditional"], \u6E9C: ["chinese_simplified", "chinese_traditional"], \u66F0: ["chinese_simplified", "chinese_traditional"], \u903B: ["chinese_simplified"], \u5F6D: ["chinese_simplified", "chinese_traditional"], \u5C1D: ["chinese_simplified"], \u537F: ["chinese_simplified", "chinese_traditional"], \u59A8: ["chinese_simplified", "chinese_traditional"], \u8247: ["chinese_simplified", "chinese_traditional"], \u541E: ["chinese_simplified", "chinese_traditional"], \u97E6: ["chinese_simplified"], \u6028: ["chinese_simplified", "chinese_traditional"], \u77EE: ["chinese_simplified", "chinese_traditional"], \u6B47: ["chinese_simplified", "chinese_traditional"], \u9019: ["chinese_traditional"], \u70BA: ["chinese_traditional"], \u500B: ["chinese_traditional"], \u570B: ["chinese_traditional"], \u6642: ["chinese_traditional"], \u4F86: ["chinese_traditional"], \u5011: ["chinese_traditional"], \u65BC: ["chinese_traditional"], \u5C0D: ["chinese_traditional"], \u6703: ["chinese_traditional"], \u767C: ["chinese_traditional"], \u52D5: ["chinese_traditional"], \u904E: ["chinese_traditional"], \u8AAA: ["chinese_traditional"], \u7522: ["chinese_traditional"], \u7A2E: ["chinese_traditional"], \u5F8C: ["chinese_traditional"], \u5B78: ["chinese_traditional"], \u7D93: ["chinese_traditional"], \u9032: ["chinese_traditional"], \u8457: ["chinese_traditional"], \u96FB: ["chinese_traditional"], \u88E1: ["chinese_traditional"], \u73FE: ["chinese_traditional"], \u5BE6: ["chinese_traditional"], \u5169: ["chinese_traditional"], \u9AD4: ["chinese_traditional"], \u6A5F: ["chinese_traditional"], \u7576: ["chinese_traditional"], \u9EDE: ["chinese_traditional"], \u5F9E: ["chinese_traditional"], \u696D: ["chinese_traditional"], \u61C9: ["chinese_traditional"], \u958B: ["chinese_traditional"], \u9084: ["chinese_traditional"], \u7FA9: ["chinese_traditional"], \u9593: ["chinese_traditional"], \u6A23: ["chinese_traditional"], \u8207: ["chinese_traditional"], \u95DC: ["chinese_traditional"], \u7DDA: ["chinese_traditional"], \u5167: ["chinese_traditional"], \u6578: ["chinese_traditional"], \u9EBC: ["chinese_traditional"], \u8CEA: ["chinese_traditional"], \u6C23: ["chinese_traditional"], \u8B8A: ["chinese_traditional"], \u689D: ["chinese_traditional"], \u6C92: ["chinese_traditional"], \u7D50: ["chinese_traditional"], \u554F: ["chinese_traditional"], \u7121: ["chinese_traditional"], \u8ECD: ["chinese_traditional"], \u4E26: ["chinese_traditional"], \u984C: ["chinese_traditional"], \u9EE8: ["chinese_traditional"], \u54E1: ["chinese_traditional"], \u7E3D: ["chinese_traditional"], \u8A2D: ["chinese_traditional"], \u9577: ["chinese_traditional"], \u982D: ["chinese_traditional"], \u8CC7: ["chinese_traditional"], \u908A: ["chinese_traditional"], \u7D1A: ["chinese_traditional"], \u5716: ["chinese_traditional"], \u7D71: ["chinese_traditional"], \u8F03: ["chinese_traditional"], \u5C07: ["chinese_traditional"], \u7D44: ["chinese_traditional"], \u898B: ["chinese_traditional"], \u8A08: ["chinese_traditional"], \u5225: ["chinese_traditional"], \u8AD6: ["chinese_traditional"], \u904B: ["chinese_traditional"], \u8FB2: ["chinese_traditional"], \u5E7E: ["chinese_traditional"], \u5340: ["chinese_traditional"], \u5F37: ["chinese_traditional"], \u6C7A: ["chinese_traditional"], \u5E79: ["chinese_traditional"], \u6230: ["chinese_traditional"], \u5247: ["chinese_traditional"], \u64DA: ["chinese_traditional"], \u8655: ["chinese_traditional"], \u968A: ["chinese_traditional"], \u7D66: ["chinese_traditional"], \u9580: ["chinese_traditional"], \u898F: ["chinese_traditional"], \u71B1: ["chinese_traditional"], \u9818: ["chinese_traditional"], \u6771: ["chinese_traditional"], \u5C0E: ["chinese_traditional"], \u58D3: ["chinese_traditional"], \u722D: ["chinese_traditional"], \u6FDF: ["chinese_traditional"], \u968E: ["chinese_traditional"], \u8853: ["chinese_traditional"], \u6975: ["chinese_traditional"], \u806F: ["chinese_traditional"], \u8A8D: ["chinese_traditional"], \u6B0A: ["chinese_traditional"], \u8B49: ["chinese_traditional"], \u63A1: ["chinese_traditional"], \u8F49: ["chinese_traditional"], \u55AE: ["chinese_traditional"], \u98A8: ["chinese_traditional"], \u5E36: ["chinese_traditional"], \u5834: ["chinese_traditional"], \u8ECA: ["chinese_traditional"], \u52D9: ["chinese_traditional"], \u842C: ["chinese_traditional"], \u9054: ["chinese_traditional"], \u7A4D: ["chinese_traditional"], \u8B70: ["chinese_traditional"], \u8072: ["chinese_traditional"], \u5831: ["chinese_traditional"], \u9B25: ["chinese_traditional"], \u985E: ["chinese_traditional"], \u96E2: ["chinese_traditional"], \u83EF: ["chinese_traditional"], \u78BA: ["chinese_traditional"], \u5F35: ["chinese_traditional"], \u99AC: ["chinese_traditional"], \u7BC0: ["chinese_traditional"], \u8A71: ["chinese_traditional"], \u6CC1: ["chinese_traditional"], \u6EAB: ["chinese_traditional"], \u50B3: ["chinese_traditional"], \u8A31: ["chinese_traditional"], \u5EE3: ["chinese_traditional"], \u8A18: ["chinese_traditional"], \u89C0: ["chinese_traditional"], \u7E54: ["chinese_traditional"], \u88DD: ["chinese_traditional"], \u773E: ["chinese_traditional"], \u66F8: ["chinese_traditional"], \u5152: ["chinese_traditional"], \u9808: ["chinese_traditional"], \u969B: ["chinese_traditional"], \u9A57: ["chinese_traditional"], \u9023: ["chinese_traditional"], \u65B7: ["chinese_traditional"], \u96E3: ["chinese_traditional"], \u7926: ["chinese_traditional"], \u9031: ["chinese_traditional"], \u5099: ["chinese_traditional"], \u8FA6: ["chinese_traditional"], \u7FD2: ["chinese_traditional"], \u97FF: ["chinese_traditional"], \u7D04: ["chinese_traditional"], \u52DE: ["chinese_traditional"], \u5718: ["chinese_traditional"], \u6B77: ["chinese_traditional"], \u69CB: ["chinese_traditional"], \u7A31: ["chinese_traditional"], \u6E96: ["chinese_traditional"], \u865F: ["chinese_traditional"], \u7DAD: ["chinese_traditional"], \u5283: ["chinese_traditional"], \u9078: ["chinese_traditional"], \u6A19: ["chinese_traditional"], \u5BEB: ["chinese_traditional"], \u89AA: ["chinese_traditional"], \u990A: ["chinese_traditional"], \u5C64: ["chinese_traditional"], \u537B: ["chinese_traditional"], \u5C08: ["chinese_traditional"], \u72C0: ["chinese_traditional"], \u5EE0: ["chinese_traditional"], \u8B58: ["chinese_traditional"], \u9069: ["chinese_traditional"], \u5C6C: ["chinese_traditional"], \u5713: ["chinese_traditional"], \u8ABF: ["chinese_traditional"], \u6EFF: ["chinese_traditional"], \u7E23: ["chinese_traditional"], \u53C3: ["chinese_traditional"], \u7D05: ["chinese_traditional"], \u7D30: ["chinese_traditional"], \u807D: ["chinese_traditional"], \u8A72: ["chinese_traditional"], \u9435: ["chinese_traditional"], \u50F9: ["chinese_traditional"], \u56B4: ["chinese_traditional"], \u96A8: ["chinese_traditional"], \u8607: ["chinese_traditional"], \u723E: ["chinese_traditional"], \u8B1B: ["chinese_traditional"], \u9EC3: ["chinese_traditional"], \u986F: ["chinese_traditional"], \u8AC7: ["chinese_traditional"], \u85DD: ["chinese_traditional"], \u71DF: ["chinese_traditional"], \u9805: ["chinese_traditional"], \u8209: ["chinese_traditional"], \u52E2: ["chinese_traditional"], \u5E6B: ["chinese_traditional"], \u8F2A: ["chinese_traditional"], \u4E9E: ["chinese_traditional"], \u5E2B: ["chinese_traditional"], \u570D: ["chinese_traditional"], \u9060: ["chinese_traditional"], \u614B: ["chinese_traditional"], \u6E1B: ["chinese_traditional"], \u6A39: ["chinese_traditional"], \u8449: ["chinese_traditional"], \u9B5A: ["chinese_traditional"], \u8996: ["chinese_traditional"], \u50C5: ["chinese_traditional"], \u8CBB: ["chinese_traditional"], \u7DCA: ["chinese_traditional"], \u611B: ["chinese_traditional"], \u7E8C: ["chinese_traditional"], \u8F15: ["chinese_traditional"], \u8A66: ["chinese_traditional"], \u8B77: ["chinese_traditional"], \u7DF4: ["chinese_traditional"], \u8CA0: ["chinese_traditional"], \u64CA: ["chinese_traditional"], \u7E7C: ["chinese_traditional"], \u8208: ["chinese_traditional"], \u9918: ["chinese_traditional"], \u5805: ["chinese_traditional"], \u8F38: ["chinese_traditional"], \u5920: ["chinese_traditional"], \u7B46: ["chinese_traditional"], \u4F54: ["chinese_traditional"], \u8CA1: ["chinese_traditional"], \u8077: ["chinese_traditional"], \u89BA: ["chinese_traditional"], \u6F22: ["chinese_traditional"], \u756B: ["chinese_traditional"], \u96D6: ["chinese_traditional"], \u96DC: ["chinese_traditional"], \u98DB: ["chinese_traditional"], \u6AA2: ["chinese_traditional"], \u6607: ["chinese_traditional"], \u967D: ["chinese_traditional"], \u5275: ["chinese_traditional"], \u58DE: ["chinese_traditional"], \u5F91: ["chinese_traditional"], \u63DB: ["chinese_traditional"], \u92FC: ["chinese_traditional"], \u8CAC: ["chinese_traditional"], \u7C21: ["chinese_traditional"], \u9322: ["chinese_traditional"], \u76E1: ["chinese_traditional"], \u885D: ["chinese_traditional"], \u7368: ["chinese_traditional"], \u74B0: ["chinese_traditional"], \u96D9: ["chinese_traditional"], \u8ACB: ["chinese_traditional"], \u8B93: ["chinese_traditional"], \u8EF8: ["chinese_traditional"], \u7D00: ["chinese_traditional"], \u512A: ["chinese_traditional"], \u9802: ["chinese_traditional"], \u790E: ["chinese_traditional"], \u8F09: ["chinese_traditional"], \u6575: ["chinese_traditional"], \u52DD: ["chinese_traditional"], \u7D55: ["chinese_traditional"], \u584A: ["chinese_traditional"], \u5291: ["chinese_traditional"], \u6E2C: ["chinese_traditional"], \u7D72: ["chinese_traditional"], \u5354: ["chinese_traditional"], \u8A34: ["chinese_traditional"], \u9673: ["chinese_traditional"], \u7F85: ["chinese_traditional"], \u9E7D: ["chinese_traditional"], \u932F: ["chinese_traditional"], \u983B: ["chinese_traditional"], \u7D42: ["chinese_traditional"], \u96F2: ["chinese_traditional"], \u885B: ["chinese_traditional"], \u71D2: ["chinese_traditional"], \u904A: ["chinese_traditional"], \u820A: ["chinese_traditional"], \u8CA8: ["chinese_traditional"], \u640D: ["chinese_traditional"], \u9810: ["chinese_traditional"], \u7A69: ["chinese_traditional"], \u5ABD: ["chinese_traditional"], \u64F4: ["chinese_traditional"], \u9280: ["chinese_traditional"], \u8A9E: ["chinese_traditional"], \u63EE: ["chinese_traditional"], \u7D19: ["chinese_traditional"], \u91AB: ["chinese_traditional"], \u55CE: ["chinese_traditional"], \u91DD: ["chinese_traditional"], \u5289: ["chinese_traditional"], \u8AA4: ["chinese_traditional"], \u8A13: ["chinese_traditional"], \u9858: ["chinese_traditional"], \u5BE9: ["chinese_traditional"], \u7372: ["chinese_traditional"], \u9BAE: ["chinese_traditional"], \u7CE7: ["chinese_traditional"], \u812B: ["chinese_traditional"], \u9F8D: ["chinese_traditional"], \u6F38: ["chinese_traditional"], \u6B61: ["chinese_traditional"], \u525B: ["chinese_traditional"], \u8B02: ["chinese_traditional"], \u8A0E: ["chinese_traditional"], \u4E82: ["chinese_traditional"], \u6BBA: ["chinese_traditional"], \u85E5: ["chinese_traditional"], \u5BE7: ["chinese_traditional"], \u9B6F: ["chinese_traditional"], \u8CB4: ["chinese_traditional"], \u9418: ["chinese_traditional"], \u8B80: ["chinese_traditional"], \u8C50: ["chinese_traditional"], \u862D: ["chinese_traditional"], \u64D4: ["chinese_traditional"], \u57F7: ["chinese_traditional"], \u6A02: ["chinese_traditional"], \u8AB0: ["chinese_traditional"], \u9806: ["chinese_traditional"], \u7159: ["chinese_traditional"], \u7E2E: ["chinese_traditional"], \u5FB5: ["chinese_traditional"], \u81C9: ["chinese_traditional"], \u8173: ["chinese_traditional"], \u7570: ["chinese_traditional"], \u8CB7: ["chinese_traditional"], \u975C: ["chinese_traditional"], \u88DC: ["chinese_traditional"], \u8A55: ["chinese_traditional"], \u8E10: ["chinese_traditional"], \u5BEC: ["chinese_traditional"], \u63DA: ["chinese_traditional"], \u50B7: ["chinese_traditional"], \u6C2B: ["chinese_traditional"], \u61B2: ["chinese_traditional"], \u6176: ["chinese_traditional"], \u7DE8: ["chinese_traditional"], \u89F8: ["chinese_traditional"], \u92B7: ["chinese_traditional"], \u8A69: ["chinese_traditional"], \u7DA0: ["chinese_traditional"], \u96DE: ["chinese_traditional"], \u5B6B: ["chinese_traditional"], \u81A0: ["chinese_traditional"], \u9109: ["chinese_traditional"], \u81E8: ["chinese_traditional"], \u9678: ["chinese_traditional"], \u9867: ["chinese_traditional"], \u71C8: ["chinese_traditional"], \u6B72: ["chinese_traditional"], \u5287: ["chinese_traditional"], \u8D99: ["chinese_traditional"], \u8AB2: ["chinese_traditional"], \u51F1: ["chinese_traditional"], \u984D: ["chinese_traditional"], \u7D39: ["chinese_traditional"], \u9F4A: ["chinese_traditional"], \u5049: ["chinese_traditional"], \u7210: ["chinese_traditional"], \u694A: ["chinese_traditional"], \u687F: ["chinese_traditional"], \u93AE: ["chinese_traditional"], \u98EF: ["chinese_traditional"], \u6FC3: ["chinese_traditional"], \u61F7: ["chinese_traditional"], \u8D95: ["chinese_traditional"], \u5EAB: ["chinese_traditional"], \u596A: ["chinese_traditional"], \u9748: ["chinese_traditional"], \u7A05: ["chinese_traditional"], \u6EC5: ["chinese_traditional"], \u8CFD: ["chinese_traditional"], \u6B78: ["chinese_traditional"], \u76E4: ["chinese_traditional"], \u96AA: ["chinese_traditional"], \u9304: ["chinese_traditional"], \u7D14: ["chinese_traditional"], \u84CB: ["chinese_traditional"], \u6A6B: ["chinese_traditional"], \u69CD: ["chinese_traditional"], \u6F64: ["chinese_traditional"], \u87F2: ["chinese_traditional"], \u6FA4: ["chinese_traditional"], \u8166: ["chinese_traditional"], \u6B50: ["chinese_traditional"], \u5074: ["chinese_traditional"], \u5FB9: ["chinese_traditional"], \u616E: ["chinese_traditional"], \u7D0D: ["chinese_traditional"], \u5F48: ["chinese_traditional"], \u98FC: ["chinese_traditional"], \u9EA5: ["chinese_traditional"], \u6FD5: ["chinese_traditional"], \u7BC9: ["chinese_traditional"], \u60E1: ["chinese_traditional"], \u6236: ["chinese_traditional"], \u8A2A: ["chinese_traditional"], \u8DE1: ["chinese_traditional"], \u64FA: ["chinese_traditional"], \u8CE3: ["chinese_traditional"], \u64C7: ["chinese_traditional"], \u9285: ["chinese_traditional"], \u737B: ["chinese_traditional"], \u9663: ["chinese_traditional"], \u9670: ["chinese_traditional"], \u6A13: ["chinese_traditional"], \u8B00: ["chinese_traditional"], \u5678: ["chinese_traditional"], \u8C6C: ["chinese_traditional"], \u9928: ["chinese_traditional"], \u723A: ["chinese_traditional"], \u9A5A: ["chinese_traditional"], \u907A: ["chinese_traditional"], \u7E96: ["chinese_traditional"], \u50BE: ["chinese_traditional"], \u8B1D: ["chinese_traditional"], \u596E: ["chinese_traditional"], \u8CFC: ["chinese_traditional"], \u76E3: ["chinese_traditional"], \u8CAB: ["chinese_traditional"], \u91CB: ["chinese_traditional"], \u8A5E: ["chinese_traditional"], \u9813: ["chinese_traditional"], \u5BF6: ["chinese_traditional"], \u5875: ["chinese_traditional"], \u805E: ["chinese_traditional"], \u6B98: ["chinese_traditional"], \u6A4B: ["chinese_traditional"], \u5A66: ["chinese_traditional"], \u7D9C: ["chinese_traditional"], \u5433: ["chinese_traditional"], \u6416: ["chinese_traditional"], \u8D0A: ["chinese_traditional"], \u8A02: ["chinese_traditional"], \u5712: ["chinese_traditional"], \u7D1B: ["chinese_traditional"], \u6557: ["chinese_traditional"], \u69AE: ["chinese_traditional"], \u9589: ["chinese_traditional"], \u7063: ["chinese_traditional"], \u9375: ["chinese_traditional"], \u99D0: ["chinese_traditional"], \u934B: ["chinese_traditional"], \u525D: ["chinese_traditional"], \u9E7C: ["chinese_traditional"], \u9F52: ["chinese_traditional"], \u7149: ["chinese_traditional"], \u7D21: ["chinese_traditional"], \u5EE2: ["chinese_traditional"], \u7DE9: ["chinese_traditional"], \u6DE8: ["chinese_traditional"], \u838A: ["chinese_traditional"], \u8CBF: ["chinese_traditional"], \u6163: ["chinese_traditional"], \u5925: ["chinese_traditional"], \u52FB: ["chinese_traditional"], \u7D17: ["chinese_traditional"], \u8FAF: ["chinese_traditional"], \u5104: ["chinese_traditional"], \u8108: ["chinese_traditional"], \u85A9: ["chinese_traditional"], \u7DB2: ["chinese_traditional"], \u5674: ["chinese_traditional"], \u7E31: ["chinese_traditional"], \u639B: ["chinese_traditional"], \u8CC0: ["chinese_traditional"], \u9583: ["chinese_traditional"], \u7246: ["chinese_traditional"], \u8EDF: ["chinese_traditional"], \u6EFE: ["chinese_traditional"], \u76EA: ["chinese_traditional"], \u5100: ["chinese_traditional"], \u8ECB: ["chinese_traditional"], \u8CA2: ["chinese_traditional"], \u947D: ["chinese_traditional"], \u5E63: ["chinese_traditional"], \u8ECC: ["chinese_traditional"], \u755D: ["chinese_traditional"], \u7562: ["chinese_traditional"], \u5CF6: ["chinese_traditional"], \u9444: ["chinese_traditional"], \u6E6F: ["chinese_traditional"], \u95A5: ["chinese_traditional"], \u532F: ["chinese_traditional"], \u7E5E: ["chinese_traditional"], \u7E3E: ["chinese_traditional"], \u555F: ["chinese_traditional"], \u984F: ["chinese_traditional"], \u6DDA: ["chinese_traditional"], \u85CD: ["chinese_traditional"], \u93E1: ["chinese_traditional"], \u58EF: ["chinese_traditional"], \u92D2: ["chinese_traditional"], \u8CA7: ["chinese_traditional"], \u865B: ["chinese_traditional"], \u5F4E: ["chinese_traditional"], \u7DB1: ["chinese_traditional"], \u96B8: ["chinese_traditional"], \u5BAE: ["chinese_traditional"], \u9055: ["chinese_traditional"], \u593E: ["chinese_traditional"], \u7DE3: ["chinese_traditional"], \u7AAE: ["chinese_traditional"], \u6E9D: ["chinese_traditional"], \u7E69: ["chinese_traditional"], \u61B6: ["chinese_traditional"], \u6F3F: ["chinese_traditional"], \u6B04: ["chinese_traditional"], \u64C1: ["chinese_traditional"], \u8CAF: ["chinese_traditional"], \u79AE: ["chinese_traditional"], \u6FFE: ["chinese_traditional"], \u9209: ["chinese_traditional"], \u7D0B: ["chinese_traditional"], \u7F77: ["chinese_traditional"], \u7F70: ["chinese_traditional"], \u6F5B: ["chinese_traditional"], \u7E2B: ["chinese_traditional"], \u98FD: ["chinese_traditional"], \u734E: ["chinese_traditional"], \u92C1: ["chinese_traditional"], \u9E97: ["chinese_traditional"], \u93C8: ["chinese_traditional"], \u6383: ["chinese_traditional"], \u8AF8: ["chinese_traditional"], \u52F5: ["chinese_traditional"], \u6F54: ["chinese_traditional"], \u707D: ["chinese_traditional"], \u9451: ["chinese_traditional"], \u8A1F: ["chinese_traditional"], \u6BC0: ["chinese_traditional"], \u5C46: ["chinese_traditional"], \u8E8D: ["chinese_traditional"], \u8271: ["chinese_traditional"], \u8C9D: ["chinese_traditional"], \u78BC: ["chinese_traditional"], \u5922: ["chinese_traditional"], \u6F01: ["chinese_traditional"], \u9846: ["chinese_traditional"], \u925B: ["chinese_traditional"], \u5009: ["chinese_traditional"], \u92B3: ["chinese_traditional"], \u66C9: ["chinese_traditional"], \u96B1: ["chinese_traditional"], \u7919: ["chinese_traditional"], \u64A5: ["chinese_traditional"], \u8085: ["chinese_traditional"], \u727D: ["chinese_traditional"], \u6436: ["chinese_traditional"], \u6BBC: ["chinese_traditional"], \u8A0A: ["chinese_traditional"], \u8AA0: ["chinese_traditional"], \u9801: ["chinese_traditional"], \u9F61: ["chinese_traditional"], \u502B: ["chinese_traditional"], \u5C0B: ["chinese_traditional"], \u92EA: ["chinese_traditional"], \u8056: ["chinese_traditional"], \u912D: ["chinese_traditional"], \u9A30: ["chinese_traditional"], \u8CBC: ["chinese_traditional"], \u95CA: ["chinese_traditional"], \u8F1B: ["chinese_traditional"], \u5132: ["chinese_traditional"], \u7C3D: ["chinese_traditional"], \u9B27: ["chinese_traditional"], \u64FE: ["chinese_traditional"], \u905E: ["chinese_traditional"], \u6232: ["chinese_traditional"], \u9935: ["chinese_traditional"], \u7642: ["chinese_traditional"], \u64AB: ["chinese_traditional"], \u8766: ["chinese_traditional"], \u881F: ["chinese_traditional"], \u9130: ["chinese_traditional"], \u978F: ["chinese_traditional"], \u64E0: ["chinese_traditional"], \u68C4: ["chinese_traditional"], \u52C1: ["chinese_traditional"], \u9127: ["chinese_traditional"], \u721B: ["chinese_traditional"], \u78DA: ["chinese_traditional"], \u70CF: ["chinese_traditional"], \u8266: ["chinese_traditional"], \u6DFA: ["chinese_traditional"], \u66AB: ["chinese_traditional"], \u81BD: ["chinese_traditional"], \u8A73: ["chinese_traditional"], \u8B5C: ["chinese_traditional"], \u8CD3: ["chinese_traditional"], \u8F1D: ["chinese_traditional"], \u61A4: ["chinese_traditional"], \u7AF6: ["chinese_traditional"], \u7DD2: ["chinese_traditional"], \u5857: ["chinese_traditional"], \u5075: ["chinese_traditional"], \u61F8: ["chinese_traditional"], \u7CFE: ["chinese_traditional"], \u9396: ["chinese_traditional"], \u8CDE: ["chinese_traditional"], \u9D28: ["chinese_traditional"], \u8DA8: ["chinese_traditional"], \u9CF3: ["chinese_traditional"], \u8F29: ["chinese_traditional"], \u7058: ["chinese_traditional"], \u9A45: ["chinese_traditional"], \u7BE9: ["chinese_traditional"], \u5CFD: ["chinese_traditional"], \u58FD: ["chinese_traditional"], \u8B6F: ["chinese_traditional"], \u9072: ["chinese_traditional"], \u77FD: ["chinese_traditional"], \u8CB8: ["chinese_traditional"], \u8105: ["chinese_traditional"], \u8755: ["chinese_traditional"], \u5967: ["chinese_traditional"], \u9CF4: ["chinese_traditional"], \u5DBA: ["chinese_traditional"], \u6191: ["chinese_traditional"], \u7E6A: ["chinese_traditional"], \u932B: ["chinese_traditional"], \u5EDF: ["chinese_traditional"], \u7C4C: ["chinese_traditional"], \u51CD: ["chinese_traditional"], \u8F14: ["chinese_traditional"], \u651D: ["chinese_traditional"], \u8972: ["chinese_traditional"], \u9240: ["chinese_traditional"], \u9CE5: ["chinese_traditional"], \u97D3: ["chinese_traditional"], \u50D1: ["chinese_traditional"], \u6DBC: ["chinese_traditional"], \u993E: ["chinese_traditional"], \u52F8: ["chinese_traditional"], \u907C: ["chinese_traditional"], \u9D3B: ["chinese_traditional"], \u8F25: ["chinese_traditional"], \u98F2: ["chinese_traditional"], \u7F75: ["chinese_traditional"], \u8FAD: ["chinese_traditional"], \u8523: ["chinese_traditional"], \u7D68: ["chinese_traditional"], \u9727: ["chinese_traditional"], \u64EC: ["chinese_traditional"], \u8F2F: ["chinese_traditional"], \u965D: ["chinese_traditional"], \u511F: ["chinese_traditional"], \u5EF3: ["chinese_traditional"], \u99DB: ["chinese_traditional"], \u8CE6: ["chinese_traditional"], \u6F86: ["chinese_traditional"], \u9223: ["chinese_traditional"], \u8667: ["chinese_traditional"], \u9A19: ["chinese_traditional"], \u8139: ["chinese_traditional"], \u8AE7: ["chinese_traditional"], \u62CB: ["chinese_traditional"], \u9EF4: ["chinese_traditional"], \u5D17: ["chinese_traditional"], \u76DC: ["chinese_traditional"], \u6EF2: ["chinese_traditional"], \u81DF: ["chinese_traditional"], \u8CF4: ["chinese_traditional"], \u6E67: ["chinese_traditional"], \u95B1: ["chinese_traditional"], \u53B2: ["chinese_traditional"], \u70F4: ["chinese_traditional"], \u7DEF: ["chinese_traditional"], \u507D: ["chinese_traditional"], \u5606: ["chinese_traditional"], \u91D8: ["chinese_traditional"], \u8396: ["chinese_traditional"], \u7C60: ["chinese_traditional"], \u9310: ["chinese_traditional"], \u6046: ["chinese_traditional"], \u5091: ["chinese_traditional"], \u7DB8: ["chinese_traditional"], \u6558: ["chinese_traditional"], \u7344: ["chinese_traditional"], \u7D61: ["chinese_traditional"], \u9A5F: ["chinese_traditional"], \u518A: ["chinese_traditional"], \u5C4D: ["chinese_traditional"], \u7D33: ["chinese_traditional"], \u72A7: ["chinese_traditional"], \u8F5F: ["chinese_traditional"], \u6649: ["chinese_traditional"], \u79A6: ["chinese_traditional"], \u9320: ["chinese_traditional"], \u9326: ["chinese_traditional"], \u55AA: ["chinese_traditional"], \u935B: ["chinese_traditional"], \u58DF: ["chinese_traditional"], \u64B2: ["chinese_traditional"], \u9081: ["chinese_traditional"], \u9592: ["chinese_traditional"], \u6182: ["chinese_traditional"], \u9811: ["chinese_traditional"], \u6F32: ["chinese_traditional"], \u95E2: ["chinese_traditional"], \u61F2: ["chinese_traditional"], \u98C4: ["chinese_traditional"], \u98FE: ["chinese_traditional"], \u856D: ["chinese_traditional"], \u90F5: ["chinese_traditional"], \u9077: ["chinese_traditional"], \u7169: ["chinese_traditional"], \u50B5: ["chinese_traditional"], \u5E33: ["chinese_traditional"], \u9234: ["chinese_traditional"], \u9905: ["chinese_traditional"], \u96DB: ["chinese_traditional"], \u8CE2: ["chinese_traditional"], \u4E1F: ["chinese_traditional"], \u588A: ["chinese_traditional"], \u64CB: ["chinese_traditional"], \u89BD: ["chinese_traditional"], \u8CAA: ["chinese_traditional"], \u7E73: ["chinese_traditional"], \u99AE: ["chinese_traditional"], \u8AFE: ["chinese_traditional"], \u8ABC: ["chinese_traditional"], \u5147: ["chinese_traditional"], \u8AA3: ["chinese_traditional"], \u9A0E: ["chinese_traditional"], \u55AC: ["chinese_traditional"], \u53E2: ["chinese_traditional"], \u76E7: ["chinese_traditional"], \u60B6: ["chinese_traditional"], \u8AEE: ["chinese_traditional"], \u99D5: ["chinese_traditional"], \u7E9C: ["chinese_traditional"], \u927A: ["chinese_traditional"], \u64F2: ["chinese_traditional"], \u9817: ["chinese_traditional"], \u6158: ["chinese_traditional"], \u81D8: ["chinese_traditional"], \u7AA9: ["chinese_traditional"], \u6ECC: ["chinese_traditional"], \u528D: ["chinese_traditional"], \u6F51: ["chinese_traditional"], \u8525: ["chinese_traditional"], \u6488: ["chinese_traditional"], \u84BC: ["chinese_traditional"], \u6FF1: ["chinese_traditional"], \u5006: ["chinese_traditional"], \u760B: ["chinese_traditional"], \u7CDE: ["chinese_traditional"], \u6A94: ["chinese_traditional"], \u99C1: ["chinese_traditional"], \u8178: ["chinese_traditional"], \u6490: ["chinese_traditional"], \u66EC: ["chinese_traditional"], \u84EE: ["chinese_traditional"], \u6524: ["chinese_traditional"], \u652A: ["chinese_traditional"], \u91AC: ["chinese_traditional"], \u76BA: ["chinese_traditional"], \u66A2: ["chinese_traditional"], \u758A: ["chinese_traditional"], \u95A3: ["chinese_traditional"], \u840A: ["chinese_traditional"], \u8F44: ["chinese_traditional"], \u9264: ["chinese_traditional"], \u58E9: ["chinese_traditional"], \u9913: ["chinese_traditional"], \u798D: ["chinese_traditional"], \u908F: ["chinese_traditional"], \u5617: ["chinese_traditional"], \u97CB: ["chinese_traditional"], abdikace: ["czech"], abeceda: ["czech"], adresa: ["czech"], agrese: ["czech"], akce: ["czech"], aktovka: ["czech"], alej: ["czech"], alkohol: ["czech"], amputace: ["czech"], ananas: ["czech"], andulka: ["czech"], anekdota: ["czech"], anketa: ["czech"], antika: ["czech"], anulovat: ["czech"], archa: ["czech"], arogance: ["czech"], asfalt: ["czech", "turkish"], asistent: ["czech"], aspirace: ["czech"], astma: ["czech"], astronom: ["czech"], atlas: ["czech"], atletika: ["czech"], atol: ["czech"], autobus: ["czech"], azyl: ["czech"], babka: ["czech"], bachor: ["czech"], bacil: ["czech"], baculka: ["czech"], badatel: ["czech"], bageta: ["czech"], bagr: ["czech"], bahno: ["czech"], bakterie: ["czech"], balada: ["czech"], baletka: ["czech"], balkon: ["czech"], balonek: ["czech"], balvan: ["czech"], balza: ["czech"], bambus: ["czech"], bankomat: ["czech"], barbar: ["czech"], baret: ["czech"], barman: ["czech"], baroko: ["czech"], barva: ["czech"], baterka: ["czech"], batoh: ["czech"], bavlna: ["czech"], bazalka: ["czech"], bazilika: ["czech"], bazuka: ["czech"], bedna: ["czech"], beran: ["czech"], beseda: ["czech"], bestie: ["czech"], beton: ["czech", "turkish"], bezinka: ["czech"], bezmoc: ["czech"], beztak: ["czech"], bicykl: ["czech"], bidlo: ["czech"], biftek: ["czech", "turkish"], bikiny: ["czech"], bilance: ["czech"], biograf: ["czech"], biolog: ["czech"], bitva: ["czech"], bizon: ["czech"], blahobyt: ["czech"], blatouch: ["czech"], blecha: ["czech"], bledule: ["czech"], blesk: ["czech"], blikat: ["czech"], blizna: ["czech"], blokovat: ["czech"], bloudit: ["czech"], blud: ["czech"], bobek: ["czech"], bobr: ["czech"], bodlina: ["czech"], bodnout: ["czech"], bohatost: ["czech"], bojkot: ["czech"], bojovat: ["czech"], bokorys: ["czech"], bolest: ["czech"], borec: ["czech"], borovice: ["czech"], bota: ["czech"], boubel: ["czech"], bouchat: ["czech"], bouda: ["czech"], boule: ["czech"], bourat: ["czech"], boxer: ["czech"], bradavka: ["czech"], brambora: ["czech"], branka: ["czech"], bratr: ["czech"], brepta: ["czech"], briketa: ["czech"], brko: ["czech"], brloh: ["czech"], bronz: ["czech"], broskev: ["czech"], brunetka: ["czech"], brusinka: ["czech"], brzda: ["czech"], brzy: ["czech"], bublina: ["czech"], bubnovat: ["czech"], buchta: ["czech"], buditel: ["czech"], budka: ["czech"], budova: ["czech"], bufet: ["czech"], bujarost: ["czech"], bukvice: ["czech"], buldok: ["czech"], bulva: ["czech"], bunda: ["czech"], bunkr: ["czech"], burza: ["czech"], butik: ["czech", "turkish"], buvol: ["czech"], buzola: ["czech"], bydlet: ["czech"], bylina: ["czech"], bytovka: ["czech"], bzukot: ["czech"], capart: ["czech"], carevna: ["czech"], cedr: ["czech"], cedule: ["czech"], cejch: ["czech"], cejn: ["czech"], cela: ["czech"], celer: ["czech"], celkem: ["czech"], celnice: ["czech"], cenina: ["czech"], cennost: ["czech"], cenovka: ["czech"], centrum: ["czech"], cenzor: ["czech"], cestopis: ["czech"], cetka: ["czech"], chalupa: ["czech"], chapadlo: ["czech"], charita: ["czech"], chata: ["czech"], chechtat: ["czech"], chemie: ["czech"], chichot: ["czech"], chirurg: ["czech"], chlad: ["czech"], chleba: ["czech"], chlubit: ["czech"], chmel: ["czech"], chmura: ["czech"], chobot: ["czech"], chochol: ["czech"], chodba: ["czech"], cholera: ["czech"], chomout: ["czech"], chopit: ["czech"], choroba: ["czech"], chov: ["czech"], chrapot: ["czech"], chrlit: ["czech"], chrt: ["czech"], chrup: ["czech"], chtivost: ["czech"], chudina: ["czech"], chutnat: ["czech"], chvat: ["czech"], chvilka: ["czech"], chvost: ["czech"], chyba: ["czech"], chystat: ["czech"], chytit: ["czech"], cibule: ["czech"], cigareta: ["czech"], cihelna: ["czech"], cihla: ["czech"], cinkot: ["czech"], cirkus: ["czech"], cisterna: ["czech"], citace: ["czech"], citrus: ["czech"], cizinec: ["czech"], cizost: ["czech"], clona: ["czech"], cokoliv: ["czech"], couvat: ["czech"], ctitel: ["czech"], ctnost: ["czech"], cudnost: ["czech"], cuketa: ["czech"], cukr: ["czech"], cupot: ["czech"], cvaknout: ["czech"], cval: ["czech"], cvik: ["czech"], cvrkot: ["czech"], cyklista: ["czech"], daleko: ["czech"], dareba: ["czech"], datel: ["czech"], datum: ["czech"], dcera: ["czech"], debata: ["czech"], dechovka: ["czech"], decibel: ["czech"], deficit: ["czech"], deflace: ["czech"], dekl: ["czech"], dekret: ["czech"], demokrat: ["czech"], deprese: ["czech"], derby: ["czech"], deska: ["czech"], detektiv: ["czech"], dikobraz: ["czech"], diktovat: ["czech"], dioda: ["czech"], diplom: ["czech"], disk: ["czech", "turkish"], displej: ["czech"], divadlo: ["czech"], divoch: ["czech"], dlaha: ["czech"], dlouho: ["czech"], dluhopis: ["czech"], dnes: ["czech"], dobro: ["czech"], dobytek: ["czech"], docent: ["czech"], dochutit: ["czech"], dodnes: ["czech"], dohled: ["czech"], dohoda: ["czech"], dohra: ["czech"], dojem: ["czech"], dojnice: ["czech"], doklad: ["czech"], dokola: ["czech"], doktor: ["czech", "turkish"], dokument: ["czech"], dolar: ["czech"], doleva: ["czech"], dolina: ["czech"], doma: ["czech"], dominant: ["czech"], domluvit: ["czech"], domov: ["czech"], donutit: ["czech"], dopad: ["czech"], dopis: ["czech"], doplnit: ["czech"], doposud: ["czech"], doprovod: ["czech"], dopustit: ["czech"], dorazit: ["czech"], dorost: ["czech"], dort: ["czech"], dosah: ["czech"], doslov: ["czech"], dostatek: ["czech"], dosud: ["czech"], dosyta: ["czech"], dotaz: ["czech"], dotek: ["czech"], dotknout: ["czech"], doufat: ["czech"], doutnat: ["czech"], dovozce: ["czech"], dozadu: ["czech"], doznat: ["czech"], dozorce: ["czech"], drahota: ["czech"], drak: ["czech"], dramatik: ["czech"], dravec: ["czech"], draze: ["czech"], drdol: ["czech"], drobnost: ["czech"], drogerie: ["czech"], drozd: ["czech"], drsnost: ["czech"], drtit: ["czech"], drzost: ["czech"], duben: ["czech"], duchovno: ["czech"], dudek: ["czech"], duha: ["czech"], duhovka: ["czech"], dusit: ["czech"], dusno: ["czech"], dutost: ["czech"], dvojice: ["czech"], dvorec: ["czech"], dynamit: ["czech"], ekolog: ["czech"], ekonomie: ["czech"], elektron: ["czech"], elipsa: ["czech"], email: ["czech"], emise: ["czech"], emoce: ["czech"], empatie: ["czech"], epizoda: ["czech"], epocha: ["czech"], epopej: ["czech"], epos: ["czech"], esej: ["czech"], esence: ["czech"], eskorta: ["czech"], eskymo: ["czech"], etiketa: ["czech"], euforie: ["czech"], evoluce: ["czech"], exekuce: ["czech"], exkurze: ["czech"], expedice: ["czech"], exploze: ["czech"], export: ["czech"], extrakt: ["czech"], facka: ["czech"], fajfka: ["czech"], fakulta: ["czech"], fanatik: ["czech", "turkish"], fantazie: ["czech"], farmacie: ["czech"], favorit: ["czech"], fazole: ["czech"], federace: ["czech"], fejeton: ["czech"], fenka: ["czech"], fialka: ["czech"], figurant: ["czech"], filozof: ["czech"], filtr: ["czech"], finance: ["czech"], finta: ["czech"], fixace: ["czech"], fjord: ["czech"], flanel: ["czech"], flirt: ["czech"], flotila: ["czech"], fond: ["czech"], fosfor: ["czech"], fotbal: ["czech"], fotka: ["czech"], foton: ["czech"], frakce: ["czech"], freska: ["czech"], fronta: ["czech"], fukar: ["czech"], funkce: ["czech"], fyzika: ["czech"], galeje: ["czech"], garant: ["czech"], genetika: ["czech"], geolog: ["czech"], gilotina: ["czech"], glazura: ["czech"], glejt: ["czech"], golem: ["czech"], golfista: ["czech"], gotika: ["czech"], graf: ["czech"], gramofon: ["czech"], granule: ["czech"], grep: ["czech"], gril: ["czech"], grog: ["czech"], groteska: ["czech"], guma: ["czech"], hadice: ["czech"], hadr: ["czech"], hala: ["czech"], halenka: ["czech"], hanba: ["czech"], hanopis: ["czech"], harfa: ["czech"], harpuna: ["czech"], havran: ["czech"], hebkost: ["czech"], hejkal: ["czech"], hejno: ["czech"], hejtman: ["czech"], hektar: ["czech", "turkish"], helma: ["czech"], hematom: ["czech"], herec: ["czech"], herna: ["czech"], heslo: ["czech"], hezky: ["czech"], historik: ["czech"], hladovka: ["czech"], hlasivky: ["czech"], hlava: ["czech"], hledat: ["czech"], hlen: ["czech"], hlodavec: ["czech"], hloh: ["czech"], hloupost: ["czech"], hltat: ["czech"], hlubina: ["czech"], hluchota: ["czech"], hmat: ["czech"], hmota: ["czech"], hmyz: ["czech"], hnis: ["czech"], hnojivo: ["czech"], hnout: ["czech"], hoblina: ["czech"], hoboj: ["czech"], hoch: ["czech"], hodiny: ["czech"], hodlat: ["czech"], hodnota: ["czech"], hodovat: ["czech"], hojnost: ["czech"], hokej: ["czech"], holinka: ["czech"], holka: ["czech"], holub: ["czech"], homole: ["czech"], honitba: ["czech"], honorace: ["czech"], horal: ["czech"], horda: ["czech"], horizont: ["czech"], horko: ["czech"], horlivec: ["czech"], hormon: ["czech", "turkish"], hornina: ["czech"], horoskop: ["czech"], horstvo: ["czech"], hospoda: ["czech"], hostina: ["czech"], hotovost: ["czech"], houba: ["czech"], houf: ["czech"], houpat: ["czech"], houska: ["czech"], hovor: ["czech"], hradba: ["czech"], hranice: ["czech"], hravost: ["czech"], hrazda: ["czech"], hrbolek: ["czech"], hrdina: ["czech"], hrdlo: ["czech"], hrdost: ["czech"], hrnek: ["czech"], hrobka: ["czech"], hromada: ["czech"], hrot: ["czech"], hrouda: ["czech"], hrozen: ["czech"], hrstka: ["czech"], hrubost: ["czech"], hryzat: ["czech"], hubenost: ["czech"], hubnout: ["czech"], hudba: ["czech"], hukot: ["czech"], humr: ["czech"], husita: ["czech"], hustota: ["czech"], hvozd: ["czech"], hybnost: ["czech"], hydrant: ["czech"], hygiena: ["czech"], hymna: ["czech"], hysterik: ["czech"], idylka: ["czech"], ihned: ["czech"], ikona: ["czech"], iluze: ["czech"], imunita: ["czech"], infekce: ["czech"], inflace: ["czech"], inkaso: ["czech"], inovace: ["czech"], inspekce: ["czech"], internet: ["czech"], invalida: ["czech"], investor: ["czech"], inzerce: ["czech"], ironie: ["czech"], jablko: ["czech"], jachta: ["czech"], jahoda: ["czech"], jakmile: ["czech"], jakost: ["czech"], jalovec: ["czech"], jantar: ["czech"], jarmark: ["czech"], jaro: ["czech"], jasan: ["czech"], jasno: ["czech"], jatka: ["czech"], javor: ["czech"], jazyk: ["czech"], jedinec: ["czech"], jedle: ["czech"], jednatel: ["czech"], jehlan: ["czech"], jekot: ["czech"], jelen: ["czech"], jelito: ["czech"], jemnost: ["czech"], jenom: ["czech"], jepice: ["czech"], jeseter: ["czech"], jevit: ["czech"], jezdec: ["czech"], jezero: ["czech"], jinak: ["czech"], jindy: ["czech"], jinoch: ["czech"], jiskra: ["czech"], jistota: ["czech"], jitrnice: ["czech"], jizva: ["czech"], jmenovat: ["czech"], jogurt: ["czech"], jurta: ["czech"], kabaret: ["czech"], kabel: ["czech"], kabinet: ["czech"], kachna: ["czech"], kadet: ["czech"], kadidlo: ["czech"], kahan: ["czech"], kajak: ["czech"], kajuta: ["czech"], kakao: ["czech"], kaktus: ["czech"], kalamita: ["czech"], kalhoty: ["czech"], kalibr: ["czech"], kalnost: ["czech"], kamera: ["czech"], kamkoliv: ["czech"], kamna: ["czech"], kanibal: ["czech"], kanoe: ["czech"], kantor: ["czech"], kapalina: ["czech"], kapela: ["czech"], kapitola: ["czech"], kapka: ["czech"], kaple: ["czech"], kapota: ["czech"], kapr: ["czech"], kapusta: ["czech"], kapybara: ["czech"], karamel: ["czech"], karotka: ["czech"], karton: ["czech"], kasa: ["czech"], katalog: ["czech"], katedra: ["czech"], kauce: ["czech"], kauza: ["czech"], kavalec: ["czech"], kazajka: ["czech"], kazeta: ["czech"], kazivost: ["czech"], kdekoliv: ["czech"], kdesi: ["czech"], kedluben: ["czech"], kemp: ["czech"], keramika: ["czech"], kino: ["czech"], klacek: ["czech"], kladivo: ["czech"], klam: ["czech"], klapot: ["czech"], klasika: ["czech"], klaun: ["czech"], klec: ["czech"], klenba: ["czech"], klepat: ["czech"], klesnout: ["czech"], klid: ["czech"], klima: ["czech"], klisna: ["czech"], klobouk: ["czech"], klokan: ["czech"], klopa: ["czech"], kloub: ["czech"], klubovna: ["czech"], klusat: ["czech"], kluzkost: ["czech"], kmen: ["czech"], kmitat: ["czech"], kmotr: ["czech"], kniha: ["czech"], knot: ["czech"], koalice: ["czech"], koberec: ["czech"], kobka: ["czech"], kobliha: ["czech"], kobyla: ["czech"], kocour: ["czech"], kohout: ["czech"], kojenec: ["czech"], kokos: ["czech"], koktejl: ["czech"], kolaps: ["czech"], koleda: ["czech"], kolize: ["czech"], kolo: ["czech"], komando: ["czech"], kometa: ["czech"], komik: ["czech"], komnata: ["czech"], komora: ["czech"], kompas: ["czech"], komunita: ["czech"], konat: ["czech"], koncept: ["czech"], kondice: ["czech"], konec: ["czech"], konfese: ["czech"], kongres: ["czech"], konina: ["czech"], konkurs: ["czech"], kontakt: ["czech"], konzerva: ["czech"], kopanec: ["czech"], kopie: ["czech"], kopnout: ["czech"], koprovka: ["czech"], korbel: ["czech"], korektor: ["czech"], kormidlo: ["czech"], koroptev: ["czech"], korpus: ["czech"], koruna: ["czech"], koryto: ["czech"], korzet: ["czech"], kosatec: ["czech"], kostka: ["czech"], kotel: ["czech"], kotleta: ["czech"], kotoul: ["czech"], koukat: ["czech"], koupelna: ["czech"], kousek: ["czech"], kouzlo: ["czech"], kovboj: ["czech"], koza: ["czech"], kozoroh: ["czech"], krabice: ["czech"], krach: ["czech"], krajina: ["czech"], kralovat: ["czech"], krasopis: ["czech"], kravata: ["czech"], kredit: ["czech"], krejcar: ["czech"], kresba: ["czech"], kreveta: ["czech"], kriket: ["czech"], kritik: ["czech"], krize: ["czech"], krkavec: ["czech"], krmelec: ["czech"], krmivo: ["czech"], krocan: ["czech"], krok: ["czech"], kronika: ["czech"], kropit: ["czech"], kroupa: ["czech"], krovka: ["czech"], krtek: ["czech"], kruhadlo: ["czech"], krupice: ["czech"], krutost: ["czech"], krvinka: ["czech"], krychle: ["czech"], krypta: ["czech"], krystal: ["czech"], kryt: ["czech"], kudlanka: ["czech"], kufr: ["czech"], kujnost: ["czech"], kukla: ["czech"], kulajda: ["czech"], kulich: ["czech"], kulka: ["czech"], kulomet: ["czech"], kultura: ["czech"], kuna: ["czech"], kupodivu: ["czech"], kurt: ["czech"], kurzor: ["czech"], kutil: ["czech"], kvalita: ["czech"], kvasinka: ["czech"], kvestor: ["czech"], kynolog: ["czech"], kyselina: ["czech"], kytara: ["czech"], kytice: ["czech"], kytka: ["czech"], kytovec: ["czech"], kyvadlo: ["czech"], labrador: ["czech"], lachtan: ["czech"], ladnost: ["czech"], laik: ["czech"], lakomec: ["czech"], lamela: ["czech"], lampa: ["czech"], lanovka: ["czech"], lasice: ["czech"], laso: ["czech"], lastura: ["czech"], latinka: ["czech"], lavina: ["czech"], lebka: ["czech"], leckdy: ["czech"], leden: ["czech"], lednice: ["czech"], ledovka: ["czech"], ledvina: ["czech"], legenda: ["czech"], legie: ["czech"], legrace: ["czech"], lehce: ["czech"], lehkost: ["czech"], lehnout: ["czech"], lektvar: ["czech"], lenochod: ["czech"], lentilka: ["czech"], lepenka: ["czech"], lepidlo: ["czech"], letadlo: ["czech"], letec: ["czech"], letmo: ["czech"], letokruh: ["czech"], levhart: ["czech"], levitace: ["czech"], levobok: ["czech"], libra: ["czech"], lichotka: ["czech"], lidojed: ["czech"], lidskost: ["czech"], lihovina: ["czech"], lijavec: ["czech"], lilek: ["czech"], limetka: ["czech"], linie: ["czech"], linka: ["czech"], linoleum: ["czech"], listopad: ["czech"], litina: ["czech"], litovat: ["czech"], lobista: ["czech"], lodivod: ["czech"], logika: ["czech"], logoped: ["czech"], lokalita: ["czech"], loket: ["czech"], lomcovat: ["czech"], lopata: ["czech"], lopuch: ["czech"], lord: ["czech"], losos: ["czech"], lotr: ["czech"], loudal: ["czech"], louh: ["czech"], louka: ["czech"], louskat: ["czech"], lovec: ["czech"], lstivost: ["czech"], lucerna: ["czech"], lucifer: ["czech"], lump: ["czech"], lusk: ["czech"], lustrace: ["czech"], lvice: ["czech"], lyra: ["czech"], lyrika: ["czech"], lysina: ["czech"], madam: ["czech"], madlo: ["czech"], magistr: ["czech"], mahagon: ["czech"], majetek: ["czech"], majitel: ["czech"], majorita: ["czech"], makak: ["czech"], makovice: ["czech"], makrela: ["czech"], malba: ["czech"], malina: ["czech"], malovat: ["czech"], malvice: ["czech"], maminka: ["czech"], mandle: ["czech"], manko: ["czech"], marnost: ["czech"], masakr: ["czech"], maskot: ["czech"], masopust: ["czech"], matice: ["czech"], matrika: ["czech"], maturita: ["czech"], mazanec: ["czech"], mazivo: ["czech"], mazlit: ["czech"], mazurka: ["czech"], mdloba: ["czech"], mechanik: ["czech"], meditace: ["czech"], medovina: ["czech"], melasa: ["czech"], meloun: ["czech"], mentolka: ["czech"], metla: ["czech"], metoda: ["czech"], metr: ["czech"], mezera: ["czech"], migrace: ["czech"], mihnout: ["czech"], mihule: ["czech"], mikina: ["czech"], mikrofon: ["czech", "turkish"], milenec: ["czech"], milimetr: ["czech"], milost: ["czech"], mimika: ["czech"], mincovna: ["czech"], minibar: ["czech"], minomet: ["czech"], minulost: ["czech"], miska: ["czech"], mistr: ["czech"], mixovat: ["czech"], mladost: ["czech"], mlha: ["czech"], mlhovina: ["czech"], mlok: ["czech"], mlsat: ["czech"], mluvit: ["czech"], mnich: ["czech"], mnohem: ["czech"], mobil: ["czech"], mocnost: ["czech"], modelka: ["czech"], modlitba: ["czech"], mohyla: ["czech"], mokro: ["czech"], molekula: ["czech"], momentka: ["czech"], monarcha: ["czech"], monokl: ["czech"], monstrum: ["czech"], montovat: ["czech"], monzun: ["czech"], mosaz: ["czech"], moskyt: ["czech"], most: ["czech"], motivace: ["czech"], motorka: ["czech"], motyka: ["czech"], moucha: ["czech"], moudrost: ["czech"], mozaika: ["czech"], mozek: ["czech"], mozol: ["czech"], mramor: ["czech"], mravenec: ["czech"], mrkev: ["czech"], mrtvola: ["czech"], mrzet: ["czech"], mrzutost: ["czech"], mstitel: ["czech"], mudrc: ["czech"], muflon: ["czech"], mulat: ["czech"], mumie: ["czech"], munice: ["czech"], muset: ["czech"], mutace: ["czech"], muzeum: ["czech"], muzikant: ["czech"], myslivec: ["czech"], mzda: ["czech"], nabourat: ["czech"], nachytat: ["czech"], nadace: ["czech"], nadbytek: ["czech"], nadhoz: ["czech"], nadobro: ["czech"], nadpis: ["czech"], nahlas: ["czech"], nahnat: ["czech"], nahodile: ["czech"], nahradit: ["czech"], naivita: ["czech"], najednou: ["czech"], najisto: ["czech"], najmout: ["czech"], naklonit: ["czech"], nakonec: ["czech"], nakrmit: ["czech"], nalevo: ["czech"], namazat: ["czech"], namluvit: ["czech"], nanometr: ["czech"], naoko: ["czech"], naopak: ["czech"], naostro: ["czech"], napadat: ["czech"], napevno: ["czech"], naplnit: ["czech"], napnout: ["czech"], naposled: ["czech"], naprosto: ["czech"], narodit: ["czech"], naruby: ["czech"], narychlo: ["czech"], nasadit: ["czech"], nasekat: ["czech"], naslepo: ["czech"], nastat: ["czech"], natolik: ["czech"], navenek: ["czech"], navrch: ["czech"], navzdory: ["czech"], nazvat: ["czech"], nebe: ["czech"], nechat: ["czech"], necky: ["czech"], nedaleko: ["czech"], nedbat: ["czech"], neduh: ["czech"], negace: ["czech"], nehet: ["czech"], nehoda: ["czech"], nejen: ["czech"], nejprve: ["czech"], neklid: ["czech"], nelibost: ["czech"], nemilost: ["czech"], nemoc: ["czech"], neochota: ["czech"], neonka: ["czech"], nepokoj: ["czech"], nerost: ["czech"], nerv: ["czech"], nesmysl: ["czech"], nesoulad: ["czech"], netvor: ["czech"], neuron: ["czech"], nevina: ["czech"], nezvykle: ["czech"], nicota: ["czech"], nijak: ["czech"], nikam: ["czech"], nikdy: ["czech"], nikl: ["czech"], nikterak: ["czech"], nitro: ["czech"], nocleh: ["czech"], nohavice: ["czech"], nominace: ["czech"], nora: ["czech"], norek: ["czech"], nositel: ["czech"], nosnost: ["czech"], nouze: ["czech"], noviny: ["czech"], novota: ["czech"], nozdra: ["czech"], nuda: ["czech"], nudle: ["czech"], nuget: ["czech"], nutit: ["czech"], nutnost: ["czech"], nutrie: ["czech"], nymfa: ["czech"], obal: ["czech"], obarvit: ["czech"], obava: ["czech"], obdiv: ["czech"], obec: ["czech"], obehnat: ["czech"], obejmout: ["czech"], obezita: ["czech"], obhajoba: ["czech"], obilnice: ["czech"], objasnit: ["czech"], objekt: ["czech"], obklopit: ["czech"], oblast: ["czech"], oblek: ["czech"], obliba: ["czech"], obloha: ["czech"], obluda: ["czech"], obnos: ["czech"], obohatit: ["czech"], obojek: ["czech"], obout: ["czech"], obrazec: ["czech"], obrna: ["czech"], obruba: ["czech"], obrys: ["czech"], obsah: ["czech"], obsluha: ["czech"], obstarat: ["czech"], obuv: ["czech"], obvaz: ["czech"], obvinit: ["czech"], obvod: ["czech"], obvykle: ["czech"], obyvatel: ["czech"], obzor: ["czech"], ocas: ["czech"], ocel: ["czech"], ocenit: ["czech"], ochladit: ["czech"], ochota: ["czech"], ochrana: ["czech"], ocitnout: ["czech"], odboj: ["czech"], odbyt: ["czech"], odchod: ["czech"], odcizit: ["czech"], odebrat: ["czech"], odeslat: ["czech"], odevzdat: ["czech"], odezva: ["czech"], odhadce: ["czech"], odhodit: ["czech"], odjet: ["czech"], odjinud: ["czech"], odkaz: ["czech"], odkoupit: ["czech"], odliv: ["czech"], odluka: ["czech"], odmlka: ["czech"], odolnost: ["czech"], odpad: ["czech"], odpis: ["czech"], odplout: ["czech"], odpor: ["czech"], odpustit: ["czech"], odpykat: ["czech"], odrazka: ["czech"], odsoudit: ["czech"], odstup: ["czech"], odsun: ["czech"], odtok: ["czech"], odtud: ["czech"], odvaha: ["czech"], odveta: ["czech"], odvolat: ["czech"], odvracet: ["czech"], odznak: ["czech"], ofina: ["czech"], ofsajd: ["czech"], ohlas: ["czech"], ohnisko: ["czech"], ohrada: ["czech"], ohrozit: ["czech"], ohryzek: ["czech"], okap: ["czech"], okenice: ["czech"], oklika: ["czech"], okno: ["czech"], okouzlit: ["czech"], okovy: ["czech"], okrasa: ["czech"], okres: ["czech"], okrsek: ["czech"], okruh: ["czech"], okupant: ["czech"], okurka: ["czech"], okusit: ["czech"], olejnina: ["czech"], olizovat: ["czech"], omak: ["czech"], omeleta: ["czech"], omezit: ["czech"], omladina: ["czech"], omlouvat: ["czech"], omluva: ["czech"], omyl: ["czech"], onehdy: ["czech"], opakovat: ["czech"], opasek: ["czech"], operace: ["czech"], opice: ["czech"], opilost: ["czech"], opisovat: ["czech"], opora: ["czech"], opozice: ["czech"], opravdu: ["czech"], oproti: ["czech"], orbital: ["czech"], orchestr: ["czech"], orgie: ["czech"], orlice: ["czech"], orloj: ["czech"], ortel: ["czech"], osada: ["czech"], oschnout: ["czech"], osika: ["czech"], osivo: ["czech"], oslava: ["czech"], oslepit: ["czech"], oslnit: ["czech"], oslovit: ["czech"], osnova: ["czech"], osoba: ["czech"], osolit: ["czech"], ospalec: ["czech"], osten: ["czech"], ostraha: ["czech"], ostuda: ["czech"], ostych: ["czech"], osvojit: ["czech"], oteplit: ["czech"], otisk: ["czech"], otop: ["czech"], otrhat: ["czech"], otrlost: ["czech"], otrok: ["czech"], otruby: ["czech"], otvor: ["czech"], ovanout: ["czech"], ovar: ["czech"], oves: ["czech"], ovlivnit: ["czech"], ovoce: ["czech"], oxid: ["czech"], ozdoba: ["czech"], pachatel: ["czech"], pacient: ["czech"], padouch: ["czech"], pahorek: ["czech"], pakt: ["czech"], palanda: ["czech"], palec: ["czech"], palivo: ["czech"], paluba: ["czech"], pamflet: ["czech"], pamlsek: ["czech"], panenka: ["czech"], panika: ["czech"], panna: ["czech"], panovat: ["czech"], panstvo: ["czech"], pantofle: ["czech"], paprika: ["czech"], parketa: ["czech"], parodie: ["czech"], parta: ["czech"], paruka: ["czech"], paryba: ["czech"], paseka: ["czech"], pasivita: ["czech"], pastelka: ["czech"], patent: ["czech"], patrona: ["czech"], pavouk: ["czech"], pazneht: ["czech"], pazourek: ["czech"], pecka: ["czech"], pedagog: ["czech"], pejsek: ["czech"], peklo: ["czech"], peloton: ["czech"], penalta: ["czech"], pendrek: ["czech"], penze: ["czech"], periskop: ["czech"], pero: ["czech"], pestrost: ["czech"], petarda: ["czech"], petice: ["czech"], petrolej: ["czech"], pevnina: ["czech"], pexeso: ["czech"], pianista: ["czech"], piha: ["czech"], pijavice: ["czech"], pikle: ["czech"], piknik: ["czech", "turkish"], pilina: ["czech"], pilnost: ["czech"], pilulka: ["czech"], pinzeta: ["czech"], pipeta: ["czech"], pisatel: ["czech"], pistole: ["czech"], pitevna: ["czech"], pivnice: ["czech"], pivovar: ["czech"], placenta: ["czech"], plakat: ["czech"], plamen: ["czech"], planeta: ["czech"], plastika: ["czech"], platit: ["czech"], plavidlo: ["czech"], plaz: ["czech"], plech: ["czech"], plemeno: ["czech"], plenta: ["czech"], ples: ["czech"], pletivo: ["czech"], plevel: ["czech"], plivat: ["czech"], plnit: ["czech"], plno: ["czech"], plocha: ["czech"], plodina: ["czech"], plomba: ["czech"], plout: ["czech"], pluk: ["czech"], plyn: ["czech"], pobavit: ["czech"], pobyt: ["czech"], pochod: ["czech"], pocit: ["czech"], poctivec: ["czech"], podat: ["czech"], podcenit: ["czech"], podepsat: ["czech"], podhled: ["czech"], podivit: ["czech"], podklad: ["czech"], podmanit: ["czech"], podnik: ["czech"], podoba: ["czech"], podpora: ["czech"], podraz: ["czech"], podstata: ["czech"], podvod: ["czech"], podzim: ["czech"], poezie: ["czech"], pohanka: ["czech"], pohnutka: ["czech"], pohovor: ["czech"], pohroma: ["czech"], pohyb: ["czech"], pointa: ["czech"], pojistka: ["czech"], pojmout: ["czech"], pokazit: ["czech"], pokles: ["czech"], pokoj: ["czech"], pokrok: ["czech"], pokuta: ["czech"], pokyn: ["czech"], poledne: ["czech"], polibek: ["czech"], polknout: ["czech"], poloha: ["czech"], polynom: ["czech"], pomalu: ["czech"], pominout: ["czech"], pomlka: ["czech"], pomoc: ["czech"], pomsta: ["czech"], pomyslet: ["czech"], ponechat: ["czech"], ponorka: ["czech"], ponurost: ["czech"], popadat: ["czech"], popel: ["czech"], popisek: ["czech"], poplach: ["czech"], poprosit: ["czech"], popsat: ["czech"], popud: ["czech"], poradce: ["czech"], porce: ["czech"], porod: ["czech"], porucha: ["czech"], poryv: ["czech"], posadit: ["czech"], posed: ["czech"], posila: ["czech"], poskok: ["czech"], poslanec: ["czech"], posoudit: ["czech"], pospolu: ["czech"], postava: ["czech"], posudek: ["czech"], posyp: ["czech"], potah: ["czech"], potkan: ["czech"], potlesk: ["czech"], potomek: ["czech"], potrava: ["czech"], potupa: ["czech"], potvora: ["czech"], poukaz: ["czech"], pouto: ["czech"], pouzdro: ["czech"], povaha: ["czech"], povidla: ["czech"], povlak: ["czech"], povoz: ["czech"], povrch: ["czech"], povstat: ["czech"], povyk: ["czech"], povzdech: ["czech"], pozdrav: ["czech"], pozemek: ["czech"], poznatek: ["czech"], pozor: ["czech"], pozvat: ["czech"], pracovat: ["czech"], prahory: ["czech"], praktika: ["czech"], prales: ["czech"], praotec: ["czech"], praporek: ["czech"], prase: ["czech"], pravda: ["czech"], princip: ["czech"], prkno: ["czech"], probudit: ["czech"], procento: ["czech"], prodej: ["czech"], profese: ["czech"], prohra: ["czech"], projekt: ["czech"], prolomit: ["czech"], promile: ["czech"], pronikat: ["czech"], propad: ["czech"], prorok: ["czech"], prosba: ["czech"], proton: ["czech"], proutek: ["czech"], provaz: ["czech"], prskavka: ["czech"], prsten: ["czech"], prudkost: ["czech"], prut: ["czech"], prvek: ["czech"], prvohory: ["czech"], psanec: ["czech"], psovod: ["czech"], pstruh: ["czech"], ptactvo: ["czech"], puberta: ["czech"], puch: ["czech"], pudl: ["czech"], pukavec: ["czech"], puklina: ["czech"], pukrle: ["czech"], pult: ["czech"], pumpa: ["czech"], punc: ["czech"], pupen: ["czech"], pusa: ["czech"], pusinka: ["czech"], pustina: ["czech"], putovat: ["czech"], putyka: ["czech"], pyramida: ["czech"], pysk: ["czech"], pytel: ["czech"], racek: ["czech"], rachot: ["czech"], radiace: ["czech"], radnice: ["czech"], radon: ["czech"], raft: ["czech"], ragby: ["czech"], raketa: ["czech"], rakovina: ["czech"], rameno: ["czech"], rampouch: ["czech"], rande: ["czech"], rarach: ["czech"], rarita: ["czech"], rasovna: ["czech"], rastr: ["czech"], ratolest: ["czech"], razance: ["czech"], razidlo: ["czech"], reagovat: ["czech"], reakce: ["czech"], recept: ["czech"], redaktor: ["czech"], referent: ["czech"], reflex: ["czech"], rejnok: ["czech"], reklama: ["czech"], rekord: ["czech"], rekrut: ["czech"], rektor: ["czech"], reputace: ["czech"], revize: ["czech", "turkish"], revma: ["czech"], revolver: ["czech"], rezerva: ["czech"], riskovat: ["czech"], riziko: ["czech"], robotika: ["czech"], rodokmen: ["czech"], rohovka: ["czech"], rokle: ["czech"], rokoko: ["czech"], romaneto: ["czech"], ropovod: ["czech"], ropucha: ["czech"], rorejs: ["czech"], rosol: ["czech"], rostlina: ["czech"], rotmistr: ["czech"], rotoped: ["czech"], rotunda: ["czech"], roubenka: ["czech"], roucho: ["czech"], roup: ["czech"], roura: ["czech"], rovina: ["czech"], rovnice: ["czech"], rozbor: ["czech"], rozchod: ["czech"], rozdat: ["czech"], rozeznat: ["czech"], rozhodce: ["czech"], rozinka: ["czech"], rozjezd: ["czech"], rozkaz: ["czech"], rozloha: ["czech"], rozmar: ["czech"], rozpad: ["czech"], rozruch: ["czech"], rozsah: ["czech"], roztok: ["czech"], rozum: ["czech"], rozvod: ["czech"], rubrika: ["czech"], ruchadlo: ["czech"], rukavice: ["czech"], rukopis: ["czech"], ryba: ["czech"], rybolov: ["czech"], rychlost: ["czech"], rydlo: ["czech"], rypadlo: ["czech"], rytina: ["czech"], ryzost: ["czech"], sadista: ["czech"], sahat: ["czech"], sako: ["czech"], samec: ["czech"], samizdat: ["czech"], samota: ["czech"], sanitka: ["czech"], sardinka: ["czech"], sasanka: ["czech"], satelit: ["czech"], sazba: ["czech"], sazenice: ["czech"], sbor: ["czech"], schovat: ["czech"], sebranka: ["czech"], secese: ["czech"], sedadlo: ["czech"], sediment: ["czech"], sedlo: ["czech"], sehnat: ["czech"], sejmout: ["czech"], sekera: ["czech"], sekta: ["czech"], sekunda: ["czech"], sekvoje: ["czech"], semeno: ["czech"], seno: ["czech"], servis: ["czech", "turkish"], sesadit: ["czech"], seshora: ["czech"], seskok: ["czech"], seslat: ["czech"], sestra: ["czech"], sesuv: ["czech"], sesypat: ["czech"], setba: ["czech"], setina: ["czech"], setkat: ["czech"], setnout: ["czech"], setrvat: ["czech"], sever: ["czech"], seznam: ["czech"], shoda: ["czech"], shrnout: ["czech"], sifon: ["czech"], silnice: ["czech"], sirka: ["czech"], sirotek: ["czech"], sirup: ["czech"], situace: ["czech"], skafandr: ["czech"], skalisko: ["czech"], skanzen: ["czech"], skaut: ["czech"], skeptik: ["czech"], skica: ["czech"], skladba: ["czech"], sklenice: ["czech"], sklo: ["czech"], skluz: ["czech"], skoba: ["czech"], skokan: ["czech"], skoro: ["czech"], skripta: ["czech"], skrz: ["czech"], skupina: ["czech"], skvost: ["czech"], skvrna: ["czech"], slabika: ["czech"], sladidlo: ["czech"], slanina: ["czech"], slast: ["czech"], slavnost: ["czech"], sledovat: ["czech"], slepec: ["czech"], sleva: ["czech"], slezina: ["czech"], slib: ["czech"], slina: ["czech"], sliznice: ["czech"], slon: ["czech"], sloupek: ["czech"], slovo: ["czech"], sluch: ["czech"], sluha: ["czech"], slunce: ["czech"], slupka: ["czech"], slza: ["czech"], smaragd: ["czech"], smetana: ["czech"], smilstvo: ["czech"], smlouva: ["czech"], smog: ["czech"], smrad: ["czech"], smrk: ["czech"], smrtka: ["czech"], smutek: ["czech"], smysl: ["czech"], snad: ["czech"], snaha: ["czech"], snob: ["czech"], sobota: ["czech"], socha: ["czech"], sodovka: ["czech"], sokol: ["czech"], sopka: ["czech"], sotva: ["czech"], souboj: ["czech"], soucit: ["czech"], soudce: ["czech"], souhlas: ["czech"], soulad: ["czech"], soumrak: ["czech"], souprava: ["czech"], soused: ["czech"], soutok: ["czech"], souviset: ["czech"], spalovna: ["czech"], spasitel: ["czech"], spis: ["czech"], splav: ["czech"], spodek: ["czech"], spojenec: ["czech"], spolu: ["czech"], sponzor: ["czech"], spornost: ["czech"], spousta: ["czech"], sprcha: ["czech"], spustit: ["czech"], sranda: ["czech"], sraz: ["czech"], srdce: ["czech"], srna: ["czech"], srnec: ["czech"], srovnat: ["czech"], srpen: ["czech"], srst: ["czech"], srub: ["czech"], stanice: ["czech"], starosta: ["czech"], statika: ["czech"], stavba: ["czech"], stehno: ["czech"], stezka: ["czech"], stodola: ["czech"], stolek: ["czech"], stopa: ["czech"], storno: ["czech"], stoupat: ["czech"], strach: ["czech"], stres: ["czech"], strhnout: ["czech"], strom: ["czech"], struna: ["czech"], studna: ["czech"], stupnice: ["czech"], stvol: ["czech"], styk: ["czech"], subjekt: ["czech"], subtropy: ["czech"], suchar: ["czech"], sudost: ["czech"], sukno: ["czech"], sundat: ["czech"], sunout: ["czech"], surikata: ["czech"], surovina: ["czech"], svah: ["czech"], svalstvo: ["czech"], svetr: ["czech"], svatba: ["czech"], svazek: ["czech"], svisle: ["czech"], svitek: ["czech"], svoboda: ["czech"], svodidlo: ["czech"], svorka: ["czech"], svrab: ["czech"], sykavka: ["czech"], sykot: ["czech"], synek: ["czech"], synovec: ["czech"], sypat: ["czech"], sypkost: ["czech"], syrovost: ["czech"], sysel: ["czech"], sytost: ["czech"], tabletka: ["czech"], tabule: ["czech"], tahoun: ["czech"], tajemno: ["czech"], tajfun: ["czech"], tajga: ["czech"], tajit: ["czech"], tajnost: ["czech"], taktika: ["czech"], tamhle: ["czech"], tampon: ["czech", "turkish"], tancovat: ["czech"], tanec: ["czech"], tanker: ["czech"], tapeta: ["czech"], tavenina: ["czech"], tazatel: ["czech"], technika: ["czech"], tehdy: ["czech"], tekutina: ["czech"], telefon: ["czech"], temnota: ["czech"], tendence: ["czech"], tenista: ["czech"], tenor: ["czech"], teplota: ["czech"], tepna: ["czech"], teprve: ["czech"], terapie: ["czech"], termoska: ["czech"], textil: ["czech"], ticho: ["czech"], tiskopis: ["czech"], titulek: ["czech"], tkadlec: ["czech"], tkanina: ["czech"], tlapka: ["czech"], tleskat: ["czech"], tlukot: ["czech"], tlupa: ["czech"], tmel: ["czech"], toaleta: ["czech"], topinka: ["czech"], topol: ["czech"], torzo: ["czech"], touha: ["czech"], toulec: ["czech"], tradice: ["czech"], traktor: ["czech"], tramp: ["czech"], trasa: ["czech"], traverza: ["czech"], trefit: ["czech"], trest: ["czech"], trezor: ["czech"], trhavina: ["czech"], trhlina: ["czech"], trochu: ["czech"], trojice: ["czech"], troska: ["czech"], trouba: ["czech"], trpce: ["czech"], trpitel: ["czech"], trpkost: ["czech"], trubec: ["czech"], truchlit: ["czech"], truhlice: ["czech"], trus: ["czech"], trvat: ["czech"], tudy: ["czech"], tuhnout: ["czech"], tuhost: ["czech"], tundra: ["czech"], turista: ["czech"], turnaj: ["czech"], tuzemsko: ["czech"], tvaroh: ["czech"], tvorba: ["czech"], tvrdost: ["czech"], tvrz: ["czech"], tygr: ["czech"], tykev: ["czech"], ubohost: ["czech"], uboze: ["czech"], ubrat: ["czech"], ubrousek: ["czech"], ubrus: ["czech"], ubytovna: ["czech"], ucho: ["czech"], uctivost: ["czech"], udivit: ["czech"], uhradit: ["czech"], ujednat: ["czech"], ujistit: ["czech"], ujmout: ["czech"], ukazatel: ["czech"], uklidnit: ["czech"], uklonit: ["czech"], ukotvit: ["czech"], ukrojit: ["czech"], ulice: ["czech"], ulita: ["czech"], ulovit: ["czech"], umyvadlo: ["czech"], unavit: ["czech"], uniforma: ["czech"], uniknout: ["czech"], upadnout: ["czech"], uplatnit: ["czech"], uplynout: ["czech"], upoutat: ["czech"], upravit: ["czech"], uran: ["czech"], urazit: ["czech"], usednout: ["czech"], usilovat: ["czech"], usmrtit: ["czech"], usnadnit: ["czech"], usnout: ["czech"], usoudit: ["czech"], ustlat: ["czech"], ustrnout: ["czech"], utahovat: ["czech"], utkat: ["czech"], utlumit: ["czech"], utonout: ["czech"], utopenec: ["czech"], utrousit: ["czech"], uvalit: ["czech"], uvolnit: ["czech"], uvozovka: ["czech"], uzdravit: ["czech"], uzel: ["czech"], uzenina: ["czech"], uzlina: ["czech"], uznat: ["czech"], vagon: ["czech", "turkish"], valcha: ["czech"], valoun: ["czech"], vana: ["czech"], vandal: ["czech"], vanilka: ["czech"], varan: ["czech"], varhany: ["czech"], varovat: ["czech"], vcelku: ["czech"], vchod: ["czech"], vdova: ["czech"], vedro: ["czech"], vegetace: ["czech"], vejce: ["czech"], velbloud: ["czech"], veletrh: ["czech"], velitel: ["czech"], velmoc: ["czech"], velryba: ["czech"], venkov: ["czech"], veranda: ["czech"], verze: ["czech"], veselka: ["czech"], veskrze: ["czech"], vesnice: ["czech"], vespodu: ["czech"], vesta: ["czech"], veterina: ["czech"], veverka: ["czech"], vibrace: ["czech"], vichr: ["czech"], videohra: ["czech"], vidina: ["czech"], vidle: ["czech"], vila: ["czech"], vinice: ["czech"], viset: ["czech"], vitalita: ["czech"], vize: ["czech"], vizitka: ["czech"], vjezd: ["czech"], vklad: ["czech"], vkus: ["czech"], vlajka: ["czech"], vlak: ["czech"], vlasec: ["czech"], vlevo: ["czech"], vlhkost: ["czech"], vliv: ["czech"], vlnovka: ["czech"], vloupat: ["czech"], vnucovat: ["czech"], vnuk: ["czech"], voda: ["czech"], vodivost: ["czech"], vodoznak: ["czech"], vodstvo: ["czech"], vojensky: ["czech"], vojna: ["czech"], vojsko: ["czech"], volant: ["czech"], volba: ["czech"], volit: ["czech"], volno: ["czech"], voskovka: ["czech"], vozidlo: ["czech"], vozovna: ["czech"], vpravo: ["czech"], vrabec: ["czech"], vracet: ["czech"], vrah: ["czech"], vrata: ["czech"], vrba: ["czech"], vrcholek: ["czech"], vrhat: ["czech"], vrstva: ["czech"], vrtule: ["czech"], vsadit: ["czech"], vstoupit: ["czech"], vstup: ["czech"], vtip: ["czech"], vybavit: ["czech"], vybrat: ["czech"], vychovat: ["czech"], vydat: ["czech"], vydra: ["czech"], vyfotit: ["czech"], vyhledat: ["czech"], vyhnout: ["czech"], vyhodit: ["czech"], vyhradit: ["czech"], vyhubit: ["czech"], vyjasnit: ["czech"], vyjet: ["czech"], vyjmout: ["czech"], vyklopit: ["czech"], vykonat: ["czech"], vylekat: ["czech"], vymazat: ["czech"], vymezit: ["czech"], vymizet: ["czech"], vymyslet: ["czech"], vynechat: ["czech"], vynikat: ["czech"], vynutit: ["czech"], vypadat: ["czech"], vyplatit: ["czech"], vypravit: ["czech"], vypustit: ["czech"], vyrazit: ["czech"], vyrovnat: ["czech"], vyrvat: ["czech"], vyslovit: ["czech"], vysoko: ["czech"], vystavit: ["czech"], vysunout: ["czech"], vysypat: ["czech"], vytasit: ["czech"], vytesat: ["czech"], vytratit: ["czech"], vyvinout: ["czech"], vyvolat: ["czech"], vyvrhel: ["czech"], vyzdobit: ["czech"], vyznat: ["czech"], vzadu: ["czech"], vzbudit: ["czech"], vzchopit: ["czech"], vzdor: ["czech"], vzduch: ["czech"], vzdychat: ["czech"], vzestup: ["czech"], vzhledem: ["czech"], vzkaz: ["czech"], vzlykat: ["czech"], vznik: ["czech"], vzorek: ["czech"], vzpoura: ["czech"], vztah: ["czech"], vztek: ["czech"], xylofon: ["czech"], zabrat: ["czech"], zabydlet: ["czech"], zachovat: ["czech"], zadarmo: ["czech"], zadusit: ["czech"], zafoukat: ["czech"], zahltit: ["czech"], zahodit: ["czech"], zahrada: ["czech"], zahynout: ["czech"], zajatec: ["czech"], zajet: ["czech"], zajistit: ["czech"], zaklepat: ["czech"], zakoupit: ["czech"], zalepit: ["czech"], zamezit: ["czech"], zamotat: ["czech"], zamyslet: ["czech"], zanechat: ["czech"], zanikat: ["czech"], zaplatit: ["czech"], zapojit: ["czech"], zapsat: ["czech"], zarazit: ["czech"], zastavit: ["czech"], zasunout: ["czech"], zatajit: ["czech"], zatemnit: ["czech"], zatknout: ["czech"], zaujmout: ["czech"], zavalit: ["czech"], zavelet: ["czech"], zavinit: ["czech"], zavolat: ["czech"], zavrtat: ["czech"], zazvonit: ["czech"], zbavit: ["czech"], zbrusu: ["czech"], zbudovat: ["czech"], zbytek: ["czech"], zdaleka: ["czech"], zdarma: ["czech"], zdatnost: ["czech"], zdivo: ["czech"], zdobit: ["czech"], zdroj: ["czech"], zdvih: ["czech"], zdymadlo: ["czech"], zelenina: ["czech"], zeman: ["czech"], zemina: ["czech"], zeptat: ["czech"], zezadu: ["czech"], zezdola: ["czech"], zhatit: ["czech"], zhltnout: ["czech"], zhluboka: ["czech"], zhotovit: ["czech"], zhruba: ["czech"], zima: ["czech"], zimnice: ["czech"], zjemnit: ["czech"], zklamat: ["czech"], zkoumat: ["czech"], zkratka: ["czech"], zkumavka: ["czech"], zlato: ["czech"], zlehka: ["czech"], zloba: ["czech"], zlom: ["czech"], zlost: ["czech"], zlozvyk: ["czech"], zmapovat: ["czech"], zmar: ["czech"], zmatek: ["czech"], zmije: ["czech"], zmizet: ["czech"], zmocnit: ["czech"], zmodrat: ["czech"], zmrzlina: ["czech"], zmutovat: ["czech"], znak: ["czech"], znalost: ["czech"], znamenat: ["czech"], znovu: ["czech"], zobrazit: ["czech"], zotavit: ["czech"], zoubek: ["czech"], zoufale: ["czech"], zplodit: ["czech"], zpomalit: ["czech"], zprava: ["czech"], zprostit: ["czech"], zprudka: ["czech"], zprvu: ["czech"], zrada: ["czech"], zranit: ["czech"], zrcadlo: ["czech"], zrnitost: ["czech"], zrno: ["czech"], zrovna: ["czech"], zrychlit: ["czech"], zrzavost: ["czech"], zticha: ["czech"], ztratit: ["czech"], zubovina: ["czech"], zubr: ["czech"], zvednout: ["czech"], zvenku: ["czech"], zvesela: ["czech"], zvon: ["czech"], zvrat: ["czech"], zvukovod: ["czech"], zvyk: ["czech"], abandon: ["english", "french"], ability: ["english"], able: ["english"], about: ["english"], above: ["english"], absent: ["english"], absorb: ["english"], abstract: ["english"], absurd: ["english"], abuse: ["english"], access: ["english"], accident: ["english"], account: ["english"], accuse: ["english"], achieve: ["english"], acid: ["english"], acoustic: ["english"], acquire: ["english"], across: ["english"], act: ["english"], action: ["english"], actor: ["english"], actress: ["english"], actual: ["english"], adapt: ["english"], add: ["english"], addict: ["english"], address: ["english"], adjust: ["english"], admit: ["english"], adult: ["english"], advance: ["english"], advice: ["english"], aerobic: ["english"], affair: ["english"], afford: ["english"], afraid: ["english"], again: ["english"], age: ["english"], agent: ["english"], agree: ["english"], ahead: ["english"], aim: ["english"], air: ["english"], airport: ["english"], aisle: ["english"], alarm: ["english"], album: ["english"], alcohol: ["english"], alert: ["english"], alien: ["english"], all: ["english"], alley: ["english"], allow: ["english"], almost: ["english"], alone: ["english"], alpha: ["english"], already: ["english"], also: ["english"], alter: ["english"], always: ["english"], amateur: ["english", "french"], amazing: ["english"], among: ["english"], amount: ["english"], amused: ["english"], analyst: ["english"], anchor: ["english"], ancient: ["english"], anger: ["english"], angle: ["english", "french"], angry: ["english"], animal: ["english", "french"], ankle: ["english"], announce: ["english"], annual: ["english"], another: ["english"], answer: ["english"], antenna: ["english"], antique: ["english"], anxiety: ["english"], any: ["english"], apart: ["english"], apology: ["english"], appear: ["english"], apple: ["english"], approve: ["english"], april: ["english"], arch: ["english"], arctic: ["english"], area: ["english"], arena: ["english", "turkish"], argue: ["english"], arm: ["english"], armed: ["english"], armor: ["english"], army: ["english"], around: ["english"], arrange: ["english"], arrest: ["english"], arrive: ["english"], arrow: ["english"], art: ["english"], artefact: ["english"], artist: ["english", "turkish"], artwork: ["english"], ask: ["english"], aspect: ["english", "french"], assault: ["english"], asset: ["english"], assist: ["english"], assume: ["english"], asthma: ["english"], athlete: ["english"], atom: ["english", "turkish"], attack: ["english"], attend: ["english"], attitude: ["english"], attract: ["english"], auction: ["english"], audit: ["english"], august: ["english"], aunt: ["english"], author: ["english"], auto: ["english"], autumn: ["english"], average: ["english"], avocado: ["english"], avoid: ["english"], awake: ["english"], aware: ["english"], away: ["english"], awesome: ["english"], awful: ["english"], awkward: ["english"], axis: ["english"], baby: ["english"], bachelor: ["english"], bacon: ["english"], badge: ["english", "french"], bag: ["english"], balance: ["english"], balcony: ["english"], ball: ["english"], bamboo: ["english"], banana: ["english"], banner: ["english"], bar: ["english"], barely: ["english"], bargain: ["english"], barrel: ["english"], base: ["english"], basic: ["english"], basket: ["english"], battle: ["english"], beach: ["english"], bean: ["english"], beauty: ["english"], because: ["english"], become: ["english"], beef: ["english"], before: ["english"], begin: ["english"], behave: ["english"], behind: ["english"], believe: ["english"], below: ["english"], belt: ["english"], bench: ["english"], benefit: ["english"], best: ["english"], betray: ["english"], better: ["english"], between: ["english"], beyond: ["english"], bicycle: ["english", "french"], bid: ["english"], bike: ["english"], bind: ["english"], biology: ["english"], bird: ["english"], birth: ["english"], bitter: ["english"], black: ["english"], blade: ["english"], blame: ["english"], blanket: ["english"], blast: ["english"], bleak: ["english"], bless: ["english"], blind: ["english"], blood: ["english"], blossom: ["english"], blouse: ["english"], blue: ["english"], blur: ["english"], blush: ["english"], board: ["english"], boat: ["english"], body: ["english"], boil: ["english"], bomb: ["english"], bone: ["english"], bonus: ["english", "french"], book: ["english"], boost: ["english"], border: ["english"], boring: ["english"], borrow: ["english"], boss: ["english"], bottom: ["english"], bounce: ["english"], box: ["english"], boy: ["english"], bracket: ["english"], brain: ["english"], brand: ["english"], brass: ["english"], brave: ["english", "french"], bread: ["english"], breeze: ["english"], brick: ["english"], bridge: ["english"], brief: ["english"], bright: ["english"], bring: ["english"], brisk: ["english"], broccoli: ["english"], broken: ["english"], bronze: ["english"], broom: ["english"], brother: ["english"], brown: ["english"], brush: ["english"], bubble: ["english"], buddy: ["english"], budget: ["english"], buffalo: ["english"], build: ["english"], bulb: ["english"], bulk: ["english"], bullet: ["english"], bundle: ["english"], bunker: ["english"], burden: ["english"], burger: ["english"], burst: ["english"], bus: ["english"], business: ["english"], busy: ["english"], butter: ["english"], buyer: ["english"], buzz: ["english"], cabbage: ["english"], cabin: ["english"], cable: ["english"], cactus: ["english"], cage: ["english"], cake: ["english"], call: ["english"], calm: ["english"], camera: ["english"], camp: ["english"], can: ["english"], canal: ["english", "french"], cancel: ["english"], candy: ["english"], cannon: ["english"], canoe: ["english"], canvas: ["english"], canyon: ["english"], capable: ["english", "french"], capital: ["english"], captain: ["english"], car: ["english"], carbon: ["english"], card: ["english"], cargo: ["english"], carpet: ["english"], carry: ["english"], cart: ["english"], case: ["english"], cash: ["english"], casino: ["english"], castle: ["english"], casual: ["english"], cat: ["english"], catalog: ["english"], catch: ["english"], category: ["english"], cattle: ["english"], caught: ["english"], cause: ["english"], caution: ["english", "french"], cave: ["english"], ceiling: ["english"], celery: ["english"], cement: ["english"], census: ["english"], century: ["english"], cereal: ["english"], certain: ["english"], chair: ["english"], chalk: ["english"], champion: ["english"], change: ["english"], chaos: ["english"], chapter: ["english"], charge: ["english"], chase: ["english"], chat: ["english"], cheap: ["english"], check: ["english"], cheese: ["english"], chef: ["english"], cherry: ["english"], chest: ["english"], chicken: ["english"], chief: ["english"], child: ["english"], chimney: ["english"], choice: ["english"], choose: ["english"], chronic: ["english"], chuckle: ["english"], chunk: ["english"], churn: ["english"], cigar: ["english"], cinnamon: ["english"], circle: ["english"], citizen: ["english"], city: ["english"], civil: ["english", "french"], claim: ["english"], clap: ["english"], clarify: ["english"], claw: ["english"], clay: ["english"], clean: ["english"], clerk: ["english"], clever: ["english"], click: ["english"], client: ["english", "french"], cliff: ["english"], climb: ["english"], clinic: ["english"], clip: ["english"], clock: ["english"], clog: ["english"], close: ["english"], cloth: ["english"], cloud: ["english"], clown: ["english"], club: ["english"], clump: ["english"], cluster: ["english"], clutch: ["english"], coach: ["english"], coast: ["english"], coconut: ["english"], code: ["english"], coffee: ["english"], coil: ["english"], coin: ["english"], collect: ["english"], color: ["english"], column: ["english"], combine: ["english"], come: ["english"], comfort: ["english"], comic: ["english"], common: ["english"], company: ["english"], concert: ["english", "french"], conduct: ["english"], confirm: ["english"], congress: ["english"], connect: ["english"], consider: ["english"], control: ["english"], convince: ["english"], cook: ["english"], cool: ["english"], copper: ["english"], copy: ["english"], coral: ["english"], core: ["english"], corn: ["english"], correct: ["english", "french"], cost: ["english"], cotton: ["english"], couch: ["english"], country: ["english"], couple: ["english"], course: ["english"], cousin: ["english"], cover: ["english"], coyote: ["english", "french"], crack: ["english"], cradle: ["english"], craft: ["english"], cram: ["english"], crane: ["english"], crash: ["english"], crater: ["english"], crawl: ["english"], crazy: ["english"], cream: ["english"], credit: ["english"], creek: ["english"], crew: ["english"], cricket: ["english"], crime: ["english"], crisp: ["english"], critic: ["english"], crop: ["english"], cross: ["english"], crouch: ["english"], crowd: ["english"], crucial: ["english", "french"], cruel: ["english", "french"], cruise: ["english"], crumble: ["english"], crunch: ["english"], crush: ["english"], cry: ["english"], crystal: ["english"], cube: ["english"], culture: ["english"], cup: ["english"], cupboard: ["english"], curious: ["english"], current: ["english"], curtain: ["english"], curve: ["english"], cushion: ["english"], custom: ["english"], cute: ["english"], cycle: ["english", "french"], dad: ["english"], damage: ["english"], damp: ["english"], dance: ["english"], danger: ["english", "french"], daring: ["english"], dash: ["english"], daughter: ["english"], dawn: ["english"], day: ["english"], deal: ["english"], debate: ["english"], debris: ["english"], decade: ["english"], december: ["english"], decide: ["english"], decline: ["english"], decorate: ["english"], decrease: ["english"], deer: ["english"], defense: ["english"], define: ["english"], defy: ["english"], degree: ["english"], delay: ["english"], deliver: ["english"], demand: ["english"], demise: ["english"], denial: ["english"], dentist: ["english"], deny: ["english"], depart: ["english"], depend: ["english"], deposit: ["english"], depth: ["english"], deputy: ["english"], derive: ["english"], describe: ["english"], desert: ["english"], design: ["english"], desk: ["english"], despair: ["english"], destroy: ["english"], detail: ["english"], detect: ["english"], develop: ["english"], device: ["english"], devote: ["english"], diagram: ["english"], dial: ["english"], diamond: ["english"], diary: ["english"], dice: ["english"], diesel: ["english"], diet: ["english"], differ: ["english"], digital: ["english", "french"], dignity: ["english"], dilemma: ["english"], dinner: ["english"], dinosaur: ["english"], direct: ["english"], dirt: ["english"], disagree: ["english"], discover: ["english"], disease: ["english"], dish: ["english"], dismiss: ["english"], disorder: ["english"], display: ["english"], distance: ["english", "french"], divert: ["english"], divide: ["english"], divorce: ["english"], dizzy: ["english"], doctor: ["english"], document: ["english"], dog: ["english"], doll: ["english"], dolphin: ["english"], domain: ["english"], donate: ["english"], donkey: ["english"], donor: ["english"], door: ["english"], dose: ["english"], double: ["english", "french"], dove: ["english"], draft: ["english"], dragon: ["english", "french"], drama: ["english"], drastic: ["english"], draw: ["english"], dream: ["english"], dress: ["english"], drift: ["english"], drill: ["english"], drink: ["english"], drip: ["english"], drive: ["english"], drop: ["english"], drum: ["english"], dry: ["english"], duck: ["english"], dumb: ["english"], dune: ["english"], during: ["english"], dust: ["english"], dutch: ["english"], duty: ["english"], dwarf: ["english"], dynamic: ["english"], eager: ["english"], eagle: ["english"], early: ["english"], earn: ["english"], earth: ["english"], easily: ["english"], east: ["english"], easy: ["english"], echo: ["english"], ecology: ["english"], economy: ["english"], edge: ["english"], edit: ["english"], educate: ["english"], effort: ["english", "french"], egg: ["english"], eight: ["english"], either: ["english"], elbow: ["english"], elder: ["english"], electric: ["english"], elegant: ["english"], element: ["english"], elephant: ["english"], elevator: ["english"], elite: ["english"], else: ["english"], embark: ["english"], embody: ["english"], embrace: ["english"], emerge: ["english"], emotion: ["english"], employ: ["english"], empower: ["english"], empty: ["english"], enable: ["english"], enact: ["english"], end: ["english"], endless: ["english"], endorse: ["english"], enemy: ["english"], energy: ["english"], enforce: ["english"], engage: ["english"], engine: ["english"], enhance: ["english"], enjoy: ["english"], enlist: ["english"], enough: ["english"], enrich: ["english"], enroll: ["english"], ensure: ["english"], enter: ["english"], entire: ["english"], entry: ["english"], envelope: ["english"], episode: ["english"], equal: ["english"], equip: ["english"], era: ["english"], erase: ["english"], erode: ["english"], erosion: ["english"], error: ["english"], erupt: ["english"], escape: ["english"], essay: ["english"], essence: ["english", "french"], estate: ["english"], eternal: ["english"], ethics: ["english"], evidence: ["english"], evil: ["english"], evoke: ["english"], evolve: ["english"], exact: ["english", "french"], example: ["english"], excess: ["english"], exchange: ["english"], excite: ["english"], exclude: ["english"], excuse: ["english", "french"], execute: ["english"], exercise: ["english"], exhaust: ["english"], exhibit: ["english"], exile: ["english"], exist: ["english"], exit: ["english"], exotic: ["english"], expand: ["english"], expect: ["english"], expire: ["english"], explain: ["english"], expose: ["english"], express: ["english"], extend: ["english"], extra: ["english"], eye: ["english"], eyebrow: ["english"], fabric: ["english"], face: ["english"], faculty: ["english"], fade: ["english"], faint: ["english"], faith: ["english"], fall: ["english"], false: ["english"], fame: ["english"], family: ["english"], famous: ["english"], fan: ["english"], fancy: ["english"], fantasy: ["english"], farm: ["english"], fashion: ["english"], fat: ["english"], fatal: ["english", "french"], father: ["english"], fatigue: ["english", "french"], fault: ["english"], favorite: ["english"], feature: ["english"], february: ["english"], federal: ["english", "turkish"], fee: ["english"], feed: ["english"], feel: ["english"], female: ["english"], fence: ["english"], festival: ["english", "french", "turkish"], fetch: ["english"], fever: ["english"], few: ["english"], fiber: ["english"], fiction: ["english"], field: ["english"], figure: ["english", "french"], file: ["english"], film: ["english"], filter: ["english"], final: ["english"], find: ["english"], fine: ["english"], finger: ["english"], finish: ["english"], fire: ["english"], firm: ["english"], first: ["english"], fiscal: ["english"], fish: ["english"], fit: ["english"], fitness: ["english"], fix: ["english"], flag: ["english"], flame: ["english"], flash: ["english"], flat: ["english"], flavor: ["english"], flee: ["english"], flight: ["english"], flip: ["english"], float: ["english"], flock: ["english"], floor: ["english"], flower: ["english"], fluid: ["english"], flush: ["english"], fly: ["english"], foam: ["english"], focus: ["english"], fog: ["english"], foil: ["english"], fold: ["english"], follow: ["english"], food: ["english"], foot: ["english"], force: ["english"], forest: ["english"], forget: ["english"], fork: ["english"], fortune: ["english", "french"], forum: ["english"], forward: ["english"], fossil: ["english"], foster: ["english"], found: ["english"], fox: ["english"], fragile: ["english", "french"], frame: ["english"], frequent: ["english"], fresh: ["english"], friend: ["english"], fringe: ["english"], frog: ["english"], front: ["english"], frost: ["english"], frown: ["english"], frozen: ["english"], fruit: ["english", "french"], fuel: ["english"], fun: ["english"], funny: ["english"], furnace: ["english"], fury: ["english"], future: ["english"], gadget: ["english"], gain: ["english"], galaxy: ["english"], gallery: ["english"], game: ["english"], gap: ["english"], garage: ["english"], garbage: ["english"], garden: ["english"], garlic: ["english"], garment: ["english"], gas: ["english"], gasp: ["english"], gate: ["english"], gather: ["english"], gauge: ["english"], gaze: ["english"], general: ["english"], genius: ["english"], genre: ["english"], gentle: ["english"], genuine: ["english"], gesture: ["english"], ghost: ["english"], giant: ["english"], gift: ["english"], giggle: ["english"], ginger: ["english"], giraffe: ["english"], girl: ["english"], give: ["english"], glad: ["english"], glance: ["english"], glare: ["english"], glass: ["english"], glide: ["english"], glimpse: ["english"], globe: ["english", "french"], gloom: ["english"], glory: ["english"], glove: ["english"], glow: ["english"], glue: ["english"], goat: ["english"], goddess: ["english"], gold: ["english"], good: ["english"], goose: ["english"], gorilla: ["english"], gospel: ["english"], gossip: ["english"], govern: ["english"], gown: ["english"], grab: ["english"], grace: ["english"], grain: ["english"], grant: ["english"], grape: ["english"], grass: ["english"], gravity: ["english"], great: ["english"], green: ["english"], grid: ["english"], grief: ["english"], grit: ["english"], grocery: ["english"], group: ["english"], grow: ["english"], grunt: ["english"], guard: ["english"], guess: ["english"], guide: ["english", "french"], guilt: ["english"], guitar: ["english"], gun: ["english"], gym: ["english"], habit: ["english"], hair: ["english"], half: ["english"], hammer: ["english"], hamster: ["english"], hand: ["english"], happy: ["english"], harbor: ["english"], hard: ["english"], harsh: ["english"], harvest: ["english"], hat: ["english"], have: ["english"], hawk: ["english"], hazard: ["english"], head: ["english"], health: ["english"], heart: ["english"], heavy: ["english"], hedgehog: ["english"], height: ["english"], hello: ["english"], helmet: ["english"], help: ["english"], hen: ["english"], hero: ["english"], hidden: ["english"], high: ["english"], hill: ["english"], hint: ["english"], hip: ["english"], hire: ["english"], history: ["english"], hobby: ["english"], hockey: ["english"], hold: ["english"], hole: ["english"], holiday: ["english"], hollow: ["english"], home: ["english"], honey: ["english"], hood: ["english"], hope: ["english"], horn: ["english"], horror: ["english"], horse: ["english"], hospital: ["english"], host: ["english"], hotel: ["english"], hour: ["english"], hover: ["english"], hub: ["english"], huge: ["english"], human: ["english"], humble: ["english", "french"], humor: ["english"], hundred: ["english"], hungry: ["english"], hunt: ["english"], hurdle: ["english"], hurry: ["english"], hurt: ["english"], husband: ["english"], hybrid: ["english"], ice: ["english"], icon: ["english"], idea: ["english"], identify: ["english"], idle: ["english"], ignore: ["english"], ill: ["english"], illegal: ["english"], illness: ["english"], image: ["english", "french"], imitate: ["english"], immense: ["english", "french"], immune: ["english"], impact: ["english", "french"], impose: ["english"], improve: ["english"], impulse: ["english"], inch: ["english"], include: ["english"], income: ["english"], increase: ["english"], index: ["english"], indicate: ["english"], indoor: ["english"], industry: ["english"], infant: ["english"], inflict: ["english"], inform: ["english"], inhale: ["english"], inherit: ["english"], initial: ["english"], inject: ["english"], injury: ["english"], inmate: ["english"], inner: ["english"], innocent: ["english", "french"], input: ["english"], inquiry: ["english"], insane: ["english"], insect: ["english"], inside: ["english"], inspire: ["english"], install: ["english"], intact: ["english", "french"], interest: ["english"], into: ["english"], invest: ["english"], invite: ["english"], involve: ["english"], iron: ["english"], island: ["english"], isolate: ["english"], issue: ["english"], item: ["english"], ivory: ["english"], jacket: ["english"], jaguar: ["english", "french"], jar: ["english"], jazz: ["english"], jealous: ["english"], jeans: ["english"], jelly: ["english"], jewel: ["english"], job: ["english"], join: ["english"], joke: ["english"], journey: ["english"], joy: ["english"], judge: ["english"], juice: ["english"], jump: ["english"], jungle: ["english"], junior: ["english", "french"], junk: ["english"], just: ["english"], kangaroo: ["english"], keen: ["english"], keep: ["english"], ketchup: ["english"], key: ["english"], kick: ["english"], kid: ["english"], kidney: ["english"], kind: ["english"], kingdom: ["english"], kiss: ["english"], kit: ["english"], kitchen: ["english"], kite: ["english"], kitten: ["english"], kiwi: ["english"], knee: ["english"], knife: ["english"], knock: ["english"], know: ["english"], lab: ["english"], label: ["english", "french"], labor: ["english"], ladder: ["english"], lady: ["english"], lake: ["english"], lamp: ["english"], language: ["english"], laptop: ["english"], large: ["english"], later: ["english"], latin: ["english"], laugh: ["english"], laundry: ["english"], lava: ["english"], law: ["english"], lawn: ["english"], lawsuit: ["english"], layer: ["english"], lazy: ["english"], leader: ["english"], leaf: ["english"], learn: ["english"], leave: ["english"], lecture: ["english", "french"], left: ["english"], leg: ["english"], legal: ["english"], legend: ["english"], leisure: ["english"], lemon: ["english"], lend: ["english"], length: ["english"], lens: ["english"], leopard: ["english"], lesson: ["english"], letter: ["english"], level: ["english"], liar: ["english"], liberty: ["english"], library: ["english"], license: ["english"], life: ["english"], lift: ["english"], light: ["english"], like: ["english"], limb: ["english"], limit: ["english"], link: ["english"], lion: ["english"], liquid: ["english"], list: ["english"], little: ["english"], live: ["english"], lizard: ["english"], load: ["english"], loan: ["english"], lobster: ["english"], local: ["english"], lock: ["english"], logic: ["english"], lonely: ["english"], long: ["english"], loop: ["english"], lottery: ["english"], loud: ["english"], lounge: ["english"], love: ["english"], loyal: ["english", "french"], lucky: ["english"], luggage: ["english"], lumber: ["english"], lunar: ["english"], lunch: ["english"], luxury: ["english"], lyrics: ["english"], machine: ["english", "french"], mad: ["english"], magic: ["english"], magnet: ["english"], maid: ["english"], mail: ["english"], main: ["english"], major: ["english"], make: ["english"], mammal: ["english"], man: ["english"], manage: ["english"], mandate: ["english"], mango: ["english"], mansion: ["english"], manual: ["english"], maple: ["english"], marble: ["english"], march: ["english"], margin: ["english"], marine: ["english"], market: ["english", "turkish"], marriage: ["english"], mask: ["english"], mass: ["english"], master: ["english"], match: ["english"], material: ["english"], math: ["english"], matrix: ["english"], matter: ["english"], maximum: ["english"], maze: ["english"], meadow: ["english"], mean: ["english"], measure: ["english"], meat: ["english"], mechanic: ["english"], medal: ["english"], media: ["english"], melody: ["english"], melt: ["english"], member: ["english"], memory: ["english"], mention: ["english"], menu: ["english"], mercy: ["english"], merge: ["english"], merit: ["english"], merry: ["english"], mesh: ["english"], message: ["english"], metal: ["english"], method: ["english"], middle: ["english"], midnight: ["english"], milk: ["english"], million: ["english", "french"], mimic: ["english"], mind: ["english"], minimum: ["english"], minor: ["english"], minute: ["english", "french"], miracle: ["english", "french"], mirror: ["english"], misery: ["english"], miss: ["english"], mistake: ["english"], mix: ["english"], mixed: ["english"], mixture: ["english"], mobile: ["english", "french"], model: ["english", "turkish"], modify: ["english"], mom: ["english"], moment: ["english"], monitor: ["english"], monkey: ["english"], monster: ["english"], month: ["english"], moon: ["english"], moral: ["english"], more: ["english"], morning: ["english"], mosquito: ["english"], mother: ["english"], motion: ["english"], motor: ["english", "turkish"], mountain: ["english"], mouse: ["english"], move: ["english"], movie: ["english"], much: ["english"], muffin: ["english"], mule: ["english"], multiply: ["english"], muscle: ["english", "french"], museum: ["english"], mushroom: ["english"], music: ["english"], must: ["english"], mutual: ["english"], myself: ["english"], mystery: ["english"], myth: ["english"], naive: ["english"], name: ["english"], napkin: ["english"], narrow: ["english"], nasty: ["english"], nation: ["english", "french"], nature: ["english", "french"], near: ["english"], neck: ["english"], need: ["english"], negative: ["english"], neglect: ["english"], neither: ["english"], nephew: ["english"], nerve: ["english"], nest: ["english"], net: ["english"], network: ["english"], neutral: ["english"], never: ["english"], news: ["english"], next: ["english"], nice: ["english"], night: ["english"], noble: ["english", "french"], noise: ["english"], nominee: ["english"], noodle: ["english"], normal: ["english", "turkish"], north: ["english"], nose: ["english"], notable: ["english", "french"], note: ["english"], nothing: ["english"], notice: ["english"], novel: ["english"], now: ["english"], nuclear: ["english"], number: ["english"], nurse: ["english"], nut: ["english"], oak: ["english"], obey: ["english"], object: ["english"], oblige: ["english"], obscure: ["english"], observe: ["english"], obtain: ["english"], obvious: ["english"], occur: ["english"], ocean: ["english"], october: ["english"], odor: ["english"], off: ["english"], offer: ["english"], office: ["english"], often: ["english"], oil: ["english"], okay: ["english"], old: ["english"], olive: ["english"], olympic: ["english"], omit: ["english"], once: ["english"], one: ["english"], onion: ["english"], online: ["english"], only: ["english"], open: ["english"], opera: ["english", "turkish"], opinion: ["english", "french"], oppose: ["english"], option: ["english"], orange: ["english", "french"], orbit: ["english"], orchard: ["english"], order: ["english"], ordinary: ["english"], organ: ["english"], orient: ["english"], original: ["english"], orphan: ["english"], ostrich: ["english"], other: ["english"], outdoor: ["english"], outer: ["english"], output: ["english"], outside: ["english"], oval: ["english"], oven: ["english"], over: ["english"], own: ["english"], owner: ["english"], oxygen: ["english"], oyster: ["english"], ozone: ["english", "french"], pact: ["english"], paddle: ["english"], page: ["english"], pair: ["english"], palace: ["english", "french"], palm: ["english"], panda: ["english", "french", "turkish"], panel: ["english", "turkish"], panic: ["english"], panther: ["english"], paper: ["english"], parade: ["english"], parent: ["english"], park: ["english"], parrot: ["english"], party: ["english"], pass: ["english"], patch: ["english"], path: ["english"], patient: ["english"], patrol: ["english"], pattern: ["english"], pause: ["english"], pave: ["english"], payment: ["english"], peace: ["english"], peanut: ["english"], pear: ["english"], peasant: ["english"], pelican: ["english"], pen: ["english"], penalty: ["english"], pencil: ["english"], people: ["english"], pepper: ["english"], perfect: ["english"], permit: ["english"], person: ["english"], pet: ["english"], phone: ["english"], photo: ["english"], phrase: ["english", "french"], physical: ["english"], piano: ["english", "french"], picnic: ["english"], picture: ["english"], piece: ["english"], pig: ["english"], pigeon: ["english"], pill: ["english"], pilot: ["english", "turkish"], pink: ["english"], pioneer: ["english"], pipe: ["english"], pistol: ["english"], pitch: ["english"], pizza: ["english", "french"], place: ["english"], planet: ["english"], plastic: ["english"], plate: ["english"], play: ["english"], please: ["english"], pledge: ["english"], pluck: ["english"], plug: ["english"], plunge: ["english"], poem: ["english"], poet: ["english"], point: ["english"], polar: ["english"], pole: ["english"], police: ["english"], pond: ["english"], pony: ["english"], pool: ["english"], popular: ["english"], portion: ["english"], position: ["english", "french"], possible: ["english"], post: ["english"], potato: ["english"], pottery: ["english"], poverty: ["english"], powder: ["english"], power: ["english"], practice: ["english"], praise: ["english"], predict: ["english"], prefer: ["english"], prepare: ["english"], present: ["english"], pretty: ["english"], prevent: ["english"], price: ["english"], pride: ["english"], primary: ["english"], print: ["english"], priority: ["english"], prison: ["english", "french"], private: ["english"], prize: ["english"], problem: ["english", "turkish"], process: ["english"], produce: ["english"], profit: ["english"], program: ["english", "turkish"], project: ["english"], promote: ["english"], proof: ["english"], property: ["english"], prosper: ["english"], protect: ["english"], proud: ["english"], provide: ["english"], public: ["english", "french"], pudding: ["english"], pull: ["english"], pulp: ["english"], pulse: ["english"], pumpkin: ["english"], punch: ["english"], pupil: ["english"], puppy: ["english"], purchase: ["english"], purity: ["english"], purpose: ["english"], purse: ["english"], push: ["english"], put: ["english"], puzzle: ["english", "french"], pyramid: ["english"], quality: ["english"], quantum: ["english"], quarter: ["english"], question: ["english", "french"], quick: ["english"], quit: ["english"], quiz: ["english"], quote: ["english"], rabbit: ["english"], raccoon: ["english"], race: ["english"], rack: ["english"], radar: ["english", "turkish"], radio: ["english"], rail: ["english"], rain: ["english"], raise: ["english"], rally: ["english"], ramp: ["english"], ranch: ["english"], random: ["english"], range: ["english"], rapid: ["english"], rare: ["english"], rate: ["english"], rather: ["english"], raven: ["english"], raw: ["english"], razor: ["english"], ready: ["english"], real: ["english"], reason: ["english"], rebel: ["english"], rebuild: ["english"], recall: ["english"], receive: ["english"], recipe: ["english"], record: ["english"], recycle: ["english"], reduce: ["english"], reflect: ["english"], reform: ["english", "turkish"], refuse: ["english"], region: ["english"], regret: ["english"], regular: ["english"], reject: ["english"], relax: ["english"], release: ["english"], relief: ["english", "french"], rely: ["english"], remain: ["english"], remember: ["english"], remind: ["english"], remove: ["english"], render: ["english"], renew: ["english"], rent: ["english"], reopen: ["english"], repair: ["english"], repeat: ["english"], replace: ["english"], report: ["english"], require: ["english"], rescue: ["english"], resemble: ["english"], resist: ["english"], resource: ["english"], response: ["english"], result: ["english"], retire: ["english"], retreat: ["english"], return: ["english"], reunion: ["english"], reveal: ["english"], review: ["english"], reward: ["english"], rhythm: ["english"], rib: ["english"], ribbon: ["english"], rice: ["english"], rich: ["english"], ride: ["english"], ridge: ["english"], rifle: ["english"], right: ["english"], rigid: ["english"], ring: ["english"], riot: ["english"], ripple: ["english"], risk: ["english"], ritual: ["english"], rival: ["english", "french"], river: ["english"], road: ["english"], roast: ["english"], robot: ["english", "turkish"], robust: ["english"], rocket: ["english"], romance: ["english", "french"], roof: ["english"], rookie: ["english"], room: ["english"], rose: ["english"], rotate: ["english"], rough: ["english"], round: ["english"], route: ["english"], royal: ["english"], rubber: ["english"], rude: ["english"], rug: ["english"], rule: ["english"], run: ["english"], runway: ["english"], rural: ["english"], sad: ["english"], saddle: ["english"], sadness: ["english"], safe: ["english"], sail: ["english"], salad: ["english"], salmon: ["english"], salon: ["english", "french", "turkish"], salt: ["english"], salute: ["english"], same: ["english"], sample: ["english"], sand: ["english"], satisfy: ["english"], satoshi: ["english"], sauce: ["english"], sausage: ["english"], save: ["english"], say: ["english"], scale: ["english"], scan: ["english"], scare: ["english"], scatter: ["english"], scene: ["english"], scheme: ["english"], school: ["english"], science: ["english", "french"], scissors: ["english"], scorpion: ["english"], scout: ["english"], scrap: ["english"], screen: ["english"], script: ["english"], scrub: ["english"], sea: ["english"], search: ["english"], season: ["english"], seat: ["english"], second: ["english"], secret: ["english"], section: ["english"], security: ["english"], seed: ["english"], seek: ["english"], segment: ["english"], select: ["english"], sell: ["english"], seminar: ["english"], senior: ["english"], sense: ["english"], sentence: ["english", "french"], series: ["english"], service: ["english", "french"], session: ["english"], settle: ["english"], setup: ["english"], seven: ["english"], shadow: ["english"], shaft: ["english"], shallow: ["english"], share: ["english"], shed: ["english"], shell: ["english"], sheriff: ["english"], shield: ["english"], shift: ["english"], shine: ["english"], ship: ["english"], shiver: ["english"], shock: ["english"], shoe: ["english"], shoot: ["english"], shop: ["english"], short: ["english"], shoulder: ["english"], shove: ["english"], shrimp: ["english"], shrug: ["english"], shuffle: ["english"], shy: ["english"], sibling: ["english"], sick: ["english"], side: ["english"], siege: ["english"], sight: ["english"], sign: ["english"], silent: ["english"], silk: ["english"], silly: ["english"], silver: ["english"], similar: ["english"], simple: ["english", "french"], since: ["english"], sing: ["english"], siren: ["english"], sister: ["english"], situate: ["english"], six: ["english"], size: ["english"], skate: ["english"], sketch: ["english"], ski: ["english"], skill: ["english"], skin: ["english"], skirt: ["english"], skull: ["english"], slab: ["english"], slam: ["english"], sleep: ["english"], slender: ["english"], slice: ["english"], slide: ["english"], slight: ["english"], slim: ["english"], slogan: ["english", "turkish"], slot: ["english"], slow: ["english"], slush: ["english"], small: ["english"], smart: ["english"], smile: ["english"], smoke: ["english"], smooth: ["english"], snack: ["english"], snake: ["english"], snap: ["english"], sniff: ["english"], snow: ["english"], soap: ["english"], soccer: ["english"], social: ["english", "french"], sock: ["english"], soda: ["english"], soft: ["english"], solar: ["english"], soldier: ["english"], solid: ["english"], solution: ["english"], solve: ["english"], someone: ["english"], song: ["english"], soon: ["english"], sorry: ["english"], sort: ["english"], soul: ["english"], sound: ["english"], soup: ["english"], source: ["english", "french"], south: ["english"], space: ["english"], spare: ["english"], spatial: ["english", "french"], spawn: ["english"], speak: ["english"], special: ["english"], speed: ["english"], spell: ["english"], spend: ["english"], sphere: ["english"], spice: ["english"], spider: ["english"], spike: ["english"], spin: ["english"], spirit: ["english"], split: ["english"], spoil: ["english"], sponsor: ["english", "turkish"], spoon: ["english"], sport: ["english"], spot: ["english"], spray: ["english"], spread: ["english"], spring: ["english"], spy: ["english"], square: ["english"], squeeze: ["english"], squirrel: ["english"], stable: ["english", "french"], stadium: ["english"], staff: ["english"], stage: ["english"], stairs: ["english"], stamp: ["english"], stand: ["english"], start: ["english"], state: ["english"], stay: ["english"], steak: ["english"], steel: ["english"], stem: ["english"], step: ["english"], stereo: ["english"], stick: ["english"], still: ["english"], sting: ["english"], stock: ["english"], stomach: ["english"], stone: ["english"], stool: ["english"], story: ["english"], stove: ["english"], strategy: ["english"], street: ["english"], strike: ["english"], strong: ["english"], struggle: ["english"], student: ["english"], stuff: ["english"], stumble: ["english"], style: ["english"], subject: ["english"], submit: ["english"], subway: ["english"], success: ["english"], such: ["english"], sudden: ["english"], suffer: ["english"], sugar: ["english"], suggest: ["english"], suit: ["english"], summer: ["english"], sun: ["english"], sunny: ["english"], sunset: ["english"], super: ["english"], supply: ["english"], supreme: ["english"], sure: ["english"], surface: ["english", "french"], surge: ["english"], surprise: ["english", "french"], surround: ["english"], survey: ["english"], suspect: ["english", "french"], sustain: ["english"], swallow: ["english"], swamp: ["english"], swap: ["english"], swarm: ["english"], swear: ["english"], sweet: ["english"], swift: ["english"], swim: ["english"], swing: ["english"], switch: ["english"], sword: ["english"], symbol: ["english"], symptom: ["english"], syrup: ["english"], system: ["english"], table: ["english"], tackle: ["english"], tag: ["english"], tail: ["english"], talent: ["english", "french"], talk: ["english"], tank: ["english"], tape: ["english"], target: ["english"], task: ["english"], taste: ["english"], tattoo: ["english"], taxi: ["english"], teach: ["english"], team: ["english"], tell: ["english"], ten: ["english"], tenant: ["english"], tennis: ["english"], tent: ["english"], term: ["english"], test: ["english"], text: ["english"], thank: ["english"], that: ["english"], theme: ["english"], then: ["english"], theory: ["english"], there: ["english"], they: ["english"], thing: ["english"], this: ["english"], thought: ["english"], three: ["english"], thrive: ["english"], throw: ["english"], thumb: ["english"], thunder: ["english"], ticket: ["english"], tide: ["english"], tiger: ["english"], tilt: ["english"], timber: ["english"], time: ["english"], tiny: ["english"], tip: ["english"], tired: ["english"], tissue: ["english"], title: ["english"], toast: ["english"], tobacco: ["english"], today: ["english"], toddler: ["english"], toe: ["english"], together: ["english"], toilet: ["english"], token: ["english"], tomato: ["english"], tomorrow: ["english"], tone: ["english"], tongue: ["english"], tonight: ["english"], tool: ["english"], tooth: ["english"], top: ["english"], topic: ["english"], topple: ["english"], torch: ["english"], tornado: ["english"], tortoise: ["english"], toss: ["english"], total: ["english"], tourist: ["english"], toward: ["english"], tower: ["english"], town: ["english"], toy: ["english"], track: ["english"], trade: ["english"], traffic: ["english"], tragic: ["english"], train: ["english", "french"], transfer: ["english", "turkish"], trap: ["english"], trash: ["english"], travel: ["english"], tray: ["english"], treat: ["english"], tree: ["english"], trend: ["english"], trial: ["english"], tribe: ["english"], trick: ["english"], trigger: ["english"], trim: ["english"], trip: ["english"], trophy: ["english"], trouble: ["english"], truck: ["english"], true: ["english"], truly: ["english"], trumpet: ["english"], trust: ["english"], truth: ["english"], try: ["english"], tube: ["english"], tuition: ["english"], tumble: ["english"], tuna: ["english"], tunnel: ["english", "french"], turkey: ["english"], turn: ["english"], turtle: ["english"], twelve: ["english"], twenty: ["english"], twice: ["english"], twin: ["english"], twist: ["english"], two: ["english"], type: ["english"], typical: ["english"], ugly: ["english"], umbrella: ["english"], unable: ["english"], unaware: ["english"], uncle: ["english"], uncover: ["english"], under: ["english"], undo: ["english"], unfair: ["english"], unfold: ["english"], unhappy: ["english"], uniform: ["english"], unique: ["english", "french"], unit: ["english"], universe: ["english"], unknown: ["english"], unlock: ["english"], until: ["english"], unusual: ["english"], unveil: ["english"], update: ["english"], upgrade: ["english"], uphold: ["english"], upon: ["english"], upper: ["english"], upset: ["english"], urban: ["english"], urge: ["english"], usage: ["english", "french"], use: ["english"], used: ["english"], useful: ["english"], useless: ["english"], usual: ["english"], utility: ["english"], vacant: ["english"], vacuum: ["english"], vague: ["english", "french"], valid: ["english"], valley: ["english"], valve: ["english", "french"], van: ["english"], vanish: ["english"], vapor: ["english"], various: ["english"], vast: ["english"], vault: ["english"], vehicle: ["english"], velvet: ["english"], vendor: ["english"], venture: ["english"], venue: ["english"], verb: ["english"], verify: ["english"], version: ["english"], very: ["english"], vessel: ["english"], veteran: ["english"], viable: ["english"], vibrant: ["english"], vicious: ["english"], victory: ["english"], video: ["english"], view: ["english"], village: ["english", "french"], vintage: ["english"], violin: ["english"], virtual: ["english"], virus: ["english", "french"], visa: ["english"], visit: ["english"], visual: ["english"], vital: ["english", "french"], vivid: ["english"], vocal: ["english"], voice: ["english"], void: ["english"], volcano: ["english"], volume: ["english", "french"], vote: ["english"], voyage: ["english", "french"], wage: ["english"], wagon: ["english", "french"], wait: ["english"], walk: ["english"], wall: ["english"], walnut: ["english"], want: ["english"], warfare: ["english"], warm: ["english"], warrior: ["english"], wash: ["english"], wasp: ["english"], waste: ["english"], water: ["english"], wave: ["english"], way: ["english"], wealth: ["english"], weapon: ["english"], wear: ["english"], weasel: ["english"], weather: ["english"], web: ["english"], wedding: ["english"], weekend: ["english"], weird: ["english"], welcome: ["english"], west: ["english"], wet: ["english"], whale: ["english"], what: ["english"], wheat: ["english"], wheel: ["english"], when: ["english"], where: ["english"], whip: ["english"], whisper: ["english"], wide: ["english"], width: ["english"], wife: ["english"], wild: ["english"], will: ["english"], win: ["english"], window: ["english"], wine: ["english"], wing: ["english"], wink: ["english"], winner: ["english"], winter: ["english"], wire: ["english"], wisdom: ["english"], wise: ["english"], wish: ["english"], witness: ["english"], wolf: ["english"], woman: ["english"], wonder: ["english"], wood: ["english"], wool: ["english"], word: ["english"], work: ["english"], world: ["english"], worry: ["english"], worth: ["english"], wrap: ["english"], wreck: ["english"], wrestle: ["english"], wrist: ["english"], write: ["english"], wrong: ["english"], yard: ["english"], year: ["english"], yellow: ["english"], you: ["english"], young: ["english"], youth: ["english"], zebra: ["english"], zero: ["english"], zone: ["english"], zoo: ["english"], abaisser: ["french"], abdiquer: ["french"], abeille: ["french"], abolir: ["french"], aborder: ["french"], aboutir: ["french"], aboyer: ["french"], abrasif: ["french"], abreuver: ["french"], abriter: ["french"], abroger: ["french"], abrupt: ["french"], absence: ["french"], absolu: ["french"], absurde: ["french"], abusif: ["french"], abyssal: ["french"], acade\u0301mie: ["french"], acajou: ["french"], acarien: ["french"], accabler: ["french"], accepter: ["french"], acclamer: ["french"], accolade: ["french"], accroche: ["french"], accuser: ["french"], acerbe: ["french"], achat: ["french"], acheter: ["french"], aciduler: ["french"], acier: ["french"], acompte: ["french"], acque\u0301rir: ["french"], acronyme: ["french"], acteur: ["french"], actif: ["french"], actuel: ["french"], adepte: ["french"], ade\u0301quat: ["french"], adhe\u0301sif: ["french"], adjectif: ["french"], adjuger: ["french"], admettre: ["french"], admirer: ["french"], adopter: ["french"], adorer: ["french"], adoucir: ["french"], adresse: ["french"], adroit: ["french"], adulte: ["french"], adverbe: ["french"], ae\u0301rer: ["french"], ae\u0301ronef: ["french"], affaire: ["french"], affecter: ["french"], affiche: ["french"], affreux: ["french"], affubler: ["french"], agacer: ["french"], agencer: ["french"], agile: ["french"], agiter: ["french"], agrafer: ["french"], agre\u0301able: ["french"], agrume: ["french"], aider: ["french"], aiguille: ["french"], ailier: ["french"], aimable: ["french"], aisance: ["french"], ajouter: ["french"], ajuster: ["french"], alarmer: ["french"], alchimie: ["french"], alerte: ["french"], alge\u0300bre: ["french"], algue: ["french"], alie\u0301ner: ["french"], aliment: ["french"], alle\u0301ger: ["french"], alliage: ["french"], allouer: ["french"], allumer: ["french"], alourdir: ["french"], alpaga: ["french"], altesse: ["french"], alve\u0301ole: ["french"], ambigu: ["french"], ambre: ["french"], ame\u0301nager: ["french"], amertume: ["french"], amidon: ["french"], amiral: ["french"], amorcer: ["french"], amour: ["french"], amovible: ["french"], amphibie: ["french"], ampleur: ["french"], amusant: ["french"], analyse: ["french"], anaphore: ["french"], anarchie: ["french"], anatomie: ["french"], ancien: ["french"], ane\u0301antir: ["french"], angoisse: ["french"], anguleux: ["french"], annexer: ["french"], annonce: ["french"], annuel: ["french"], anodin: ["french"], anomalie: ["french"], anonyme: ["french"], anormal: ["french"], antenne: ["french"], antidote: ["french"], anxieux: ["french"], apaiser: ["french"], ape\u0301ritif: ["french"], aplanir: ["french"], apologie: ["french"], appareil: ["french"], appeler: ["french"], apporter: ["french"], appuyer: ["french"], aquarium: ["french"], aqueduc: ["french"], arbitre: ["french"], arbuste: ["french"], ardeur: ["french"], ardoise: ["french"], argent: ["french"], arlequin: ["french"], armature: ["french"], armement: ["french"], armoire: ["french"], armure: ["french"], arpenter: ["french"], arracher: ["french"], arriver: ["french"], arroser: ["french"], arsenic: ["french"], arte\u0301riel: ["french"], article: ["french"], asphalte: ["french"], aspirer: ["french"], assaut: ["french"], asservir: ["french"], assiette: ["french"], associer: ["french"], assurer: ["french"], asticot: ["french"], astre: ["french"], astuce: ["french"], atelier: ["french"], atome: ["french"], atrium: ["french"], atroce: ["french"], attaque: ["french"], attentif: ["french"], attirer: ["french"], attraper: ["french"], aubaine: ["french"], auberge: ["french"], audace: ["french"], audible: ["french"], augurer: ["french"], aurore: ["french"], automne: ["french"], autruche: ["french"], avaler: ["french"], avancer: ["french"], avarice: ["french"], avenir: ["french"], averse: ["french"], aveugle: ["french"], aviateur: ["french"], avide: ["french"], avion: ["french"], aviser: ["french"], avoine: ["french"], avouer: ["french"], avril: ["french"], axial: ["french"], axiome: ["french"], bafouer: ["french"], bagage: ["french"], baguette: ["french"], baignade: ["french"], balancer: ["french"], balcon: ["french"], baleine: ["french"], balisage: ["french"], bambin: ["french"], bancaire: ["french"], bandage: ["french"], banlieue: ["french"], bannie\u0300re: ["french"], banquier: ["french"], barbier: ["french"], baril: ["french"], baron: ["french"], barque: ["french"], barrage: ["french"], bassin: ["french"], bastion: ["french"], bataille: ["french"], bateau: ["french"], batterie: ["french"], baudrier: ["french"], bavarder: ["french"], belette: ["french"], be\u0301lier: ["french"], belote: ["french"], be\u0301ne\u0301fice: ["french"], berceau: ["french"], berger: ["french"], berline: ["french"], bermuda: ["french", "turkish"], besace: ["french"], besogne: ["french"], be\u0301tail: ["french"], beurre: ["french"], biberon: ["french"], bidule: ["french"], bijou: ["french"], bilan: ["french"], bilingue: ["french"], billard: ["french"], binaire: ["french"], biologie: ["french"], biopsie: ["french"], biotype: ["french"], biscuit: ["french"], bison: ["french"], bistouri: ["french"], bitume: ["french"], bizarre: ["french"], blafard: ["french"], blague: ["french"], blanchir: ["french"], blessant: ["french"], blinder: ["french"], blond: ["french"], bloquer: ["french"], blouson: ["french"], bobard: ["french"], bobine: ["french"], boire: ["french"], boiser: ["french"], bolide: ["french"], bonbon: ["french"], bondir: ["french"], bonheur: ["french"], bonifier: ["french"], bordure: ["french"], borne: ["french"], botte: ["french"], boucle: ["french"], boueux: ["french"], bougie: ["french"], boulon: ["french"], bouquin: ["french"], bourse: ["french"], boussole: ["french"], boutique: ["french"], boxeur: ["french"], branche: ["french"], brasier: ["french"], brebis: ["french"], bre\u0300che: ["french"], breuvage: ["french"], bricoler: ["french"], brigade: ["french"], brillant: ["french"], brioche: ["french"], brique: ["french"], brochure: ["french"], broder: ["french"], bronzer: ["french"], brousse: ["french"], broyeur: ["french"], brume: ["french"], brusque: ["french"], brutal: ["french"], bruyant: ["french"], buffle: ["french"], buisson: ["french"], bulletin: ["french"], bureau: ["french"], burin: ["french"], bustier: ["french"], butiner: ["french"], butoir: ["french"], buvable: ["french"], buvette: ["french"], cabanon: ["french"], cabine: ["french"], cachette: ["french"], cadeau: ["french"], cadre: ["french"], cafe\u0301ine: ["french"], caillou: ["french"], caisson: ["french"], calculer: ["french"], calepin: ["french"], calibre: ["french"], calmer: ["french"], calomnie: ["french"], calvaire: ["french"], camarade: ["french"], came\u0301ra: ["french"], camion: ["french"], campagne: ["french"], caneton: ["french"], canon: ["french"], cantine: ["french"], canular: ["french"], caporal: ["french"], caprice: ["french"], capsule: ["french"], capter: ["french"], capuche: ["french"], carabine: ["french"], carbone: ["french"], caresser: ["french"], caribou: ["french"], carnage: ["french"], carotte: ["french"], carreau: ["french"], carton: ["french"], cascade: ["french"], casier: ["french"], casque: ["french"], cassure: ["french"], causer: ["french"], cavalier: ["french"], caverne: ["french"], caviar: ["french"], ce\u0301dille: ["french"], ceinture: ["french"], ce\u0301leste: ["french"], cellule: ["french"], cendrier: ["french"], censurer: ["french"], central: ["french"], cercle: ["french"], ce\u0301re\u0301bral: ["french"], cerise: ["french"], cerner: ["french"], cerveau: ["french"], cesser: ["french"], chagrin: ["french"], chaise: ["french"], chaleur: ["french"], chambre: ["french"], chance: ["french"], chapitre: ["french"], charbon: ["french"], chasseur: ["french"], chaton: ["french"], chausson: ["french"], chavirer: ["french"], chemise: ["french"], chenille: ["french"], che\u0301quier: ["french"], chercher: ["french"], cheval: ["french"], chien: ["french"], chiffre: ["french"], chignon: ["french"], chime\u0300re: ["french"], chiot: ["french"], chlorure: ["french"], chocolat: ["french"], choisir: ["french"], chose: ["french"], chouette: ["french"], chrome: ["french"], chute: ["french"], cigare: ["french"], cigogne: ["french"], cimenter: ["french"], cine\u0301ma: ["french"], cintrer: ["french"], circuler: ["french"], cirer: ["french"], cirque: ["french"], citerne: ["french"], citoyen: ["french"], citron: ["french"], clairon: ["french"], clameur: ["french"], claquer: ["french"], classe: ["french"], clavier: ["french"], cligner: ["french"], climat: ["french"], clivage: ["french"], cloche: ["french"], clonage: ["french"], cloporte: ["french"], cobalt: ["french"], cobra: ["french"], cocasse: ["french"], cocotier: ["french"], coder: ["french"], codifier: ["french"], coffre: ["french"], cogner: ["french"], cohe\u0301sion: ["french"], coiffer: ["french"], coincer: ["french"], cole\u0300re: ["french"], colibri: ["french"], colline: ["french"], colmater: ["french"], colonel: ["french"], combat: ["french"], come\u0301die: ["french"], commande: ["french"], compact: ["french"], conduire: ["french"], confier: ["french"], congeler: ["french"], connoter: ["french"], consonne: ["french"], contact: ["french"], convexe: ["french"], copain: ["french"], copie: ["french"], corail: ["french"], corbeau: ["french"], cordage: ["french"], corniche: ["french"], corpus: ["french"], corte\u0300ge: ["french"], cosmique: ["french"], costume: ["french"], coton: ["french"], coude: ["french"], coupure: ["french"], courage: ["french"], couteau: ["french"], couvrir: ["french"], crabe: ["french"], crainte: ["french"], cravate: ["french"], crayon: ["french"], cre\u0301ature: ["french"], cre\u0301diter: ["french"], cre\u0301meux: ["french"], creuser: ["french"], crevette: ["french"], cribler: ["french"], crier: ["french"], cristal: ["french"], crite\u0300re: ["french"], croire: ["french"], croquer: ["french"], crotale: ["french"], crypter: ["french"], cubique: ["french"], cueillir: ["french"], cuille\u0300re: ["french"], cuisine: ["french"], cuivre: ["french"], culminer: ["french"], cultiver: ["french"], cumuler: ["french"], cupide: ["french"], curatif: ["french"], curseur: ["french"], cyanure: ["french"], cylindre: ["french"], cynique: ["french"], daigner: ["french"], damier: ["french"], danseur: ["french"], dauphin: ["french"], de\u0301battre: ["french"], de\u0301biter: ["french"], de\u0301border: ["french"], de\u0301brider: ["french"], de\u0301butant: ["french"], de\u0301caler: ["french"], de\u0301cembre: ["french"], de\u0301chirer: ["french"], de\u0301cider: ["french"], de\u0301clarer: ["french"], de\u0301corer: ["french"], de\u0301crire: ["french"], de\u0301cupler: ["french"], de\u0301dale: ["french"], de\u0301ductif: ["french"], de\u0301esse: ["french"], de\u0301fensif: ["french"], de\u0301filer: ["french"], de\u0301frayer: ["french"], de\u0301gager: ["french"], de\u0301givrer: ["french"], de\u0301glutir: ["french"], de\u0301grafer: ["french"], de\u0301jeuner: ["french"], de\u0301lice: ["french"], de\u0301loger: ["french"], demander: ["french"], demeurer: ["french"], de\u0301molir: ["french"], de\u0301nicher: ["french"], de\u0301nouer: ["french"], dentelle: ["french"], de\u0301nuder: ["french"], de\u0301part: ["french"], de\u0301penser: ["french"], de\u0301phaser: ["french"], de\u0301placer: ["french"], de\u0301poser: ["french"], de\u0301ranger: ["french"], de\u0301rober: ["french"], de\u0301sastre: ["french"], descente: ["french"], de\u0301sert: ["french"], de\u0301signer: ["french"], de\u0301sobe\u0301ir: ["french"], dessiner: ["french"], destrier: ["french"], de\u0301tacher: ["french"], de\u0301tester: ["french"], de\u0301tourer: ["french"], de\u0301tresse: ["french"], devancer: ["french"], devenir: ["french"], deviner: ["french"], devoir: ["french"], diable: ["french"], dialogue: ["french"], diamant: ["french"], dicter: ["french"], diffe\u0301rer: ["french"], dige\u0301rer: ["french"], digne: ["french"], diluer: ["french"], dimanche: ["french"], diminuer: ["french"], dioxyde: ["french"], directif: ["french"], diriger: ["french"], discuter: ["french"], disposer: ["french"], dissiper: ["french"], divertir: ["french"], diviser: ["french"], docile: ["french"], docteur: ["french"], dogme: ["french"], doigt: ["french"], domaine: ["french"], domicile: ["french"], dompter: ["french"], donateur: ["french"], donjon: ["french"], donner: ["french"], dopamine: ["french"], dortoir: ["french"], dorure: ["french"], dosage: ["french"], doseur: ["french"], dossier: ["french"], dotation: ["french"], douanier: ["french"], douceur: ["french"], douter: ["french"], doyen: ["french"], draper: ["french"], dresser: ["french"], dribbler: ["french"], droiture: ["french"], duperie: ["french"], duplexe: ["french"], durable: ["french"], durcir: ["french"], dynastie: ["french"], e\u0301blouir: ["french"], e\u0301carter: ["french"], e\u0301charpe: ["french"], e\u0301chelle: ["french"], e\u0301clairer: ["french"], e\u0301clipse: ["french"], e\u0301clore: ["french"], e\u0301cluse: ["french"], e\u0301cole: ["french"], e\u0301conomie: ["french"], e\u0301corce: ["french"], e\u0301couter: ["french"], e\u0301craser: ["french"], e\u0301cre\u0301mer: ["french"], e\u0301crivain: ["french"], e\u0301crou: ["french"], e\u0301cume: ["french"], e\u0301cureuil: ["french"], e\u0301difier: ["french"], e\u0301duquer: ["french"], effacer: ["french"], effectif: ["french"], effigie: ["french"], effrayer: ["french"], effusion: ["french"], e\u0301galiser: ["french"], e\u0301garer: ["french"], e\u0301jecter: ["french"], e\u0301laborer: ["french"], e\u0301largir: ["french"], e\u0301lectron: ["french"], e\u0301le\u0301gant: ["french"], e\u0301le\u0301phant: ["french"], e\u0301le\u0300ve: ["french"], e\u0301ligible: ["french"], e\u0301litisme: ["french"], e\u0301loge: ["french"], e\u0301lucider: ["french"], e\u0301luder: ["french"], emballer: ["french"], embellir: ["french"], embryon: ["french"], e\u0301meraude: ["french"], e\u0301mission: ["french"], emmener: ["french"], e\u0301motion: ["french"], e\u0301mouvoir: ["french"], empereur: ["french"], employer: ["french"], emporter: ["french"], emprise: ["french"], e\u0301mulsion: ["french"], encadrer: ["french"], enche\u0300re: ["french"], enclave: ["french"], encoche: ["french"], endiguer: ["french"], endosser: ["french"], endroit: ["french"], enduire: ["french"], e\u0301nergie: ["french"], enfance: ["french"], enfermer: ["french"], enfouir: ["french"], engager: ["french"], engin: ["french", "turkish"], englober: ["french"], e\u0301nigme: ["french"], enjamber: ["french"], enjeu: ["french"], enlever: ["french"], ennemi: ["french"], ennuyeux: ["french"], enrichir: ["french"], enrobage: ["french"], enseigne: ["french"], entasser: ["french"], entendre: ["french"], entier: ["french"], entourer: ["french"], entraver: ["french"], e\u0301nume\u0301rer: ["french"], envahir: ["french"], enviable: ["french"], envoyer: ["french"], enzyme: ["french"], e\u0301olien: ["french"], e\u0301paissir: ["french"], e\u0301pargne: ["french"], e\u0301patant: ["french"], e\u0301paule: ["french"], e\u0301picerie: ["french"], e\u0301pide\u0301mie: ["french"], e\u0301pier: ["french"], e\u0301pilogue: ["french"], e\u0301pine: ["french"], e\u0301pisode: ["french"], e\u0301pitaphe: ["french"], e\u0301poque: ["french"], e\u0301preuve: ["french"], e\u0301prouver: ["french"], e\u0301puisant: ["french"], e\u0301querre: ["french"], e\u0301quipe: ["french"], e\u0301riger: ["french"], e\u0301rosion: ["french"], erreur: ["french"], e\u0301ruption: ["french"], escalier: ["french"], espadon: ["french"], espe\u0300ce: ["french"], espie\u0300gle: ["french"], espoir: ["french"], esprit: ["french"], esquiver: ["french"], essayer: ["french"], essieu: ["french"], essorer: ["french"], estime: ["french"], estomac: ["french"], estrade: ["french"], e\u0301tage\u0300re: ["french"], e\u0301taler: ["french"], e\u0301tanche: ["french"], e\u0301tatique: ["french"], e\u0301teindre: ["french"], e\u0301tendoir: ["french"], e\u0301ternel: ["french"], e\u0301thanol: ["french"], e\u0301thique: ["french"], ethnie: ["french"], e\u0301tirer: ["french"], e\u0301toffer: ["french"], e\u0301toile: ["french"], e\u0301tonnant: ["french"], e\u0301tourdir: ["french"], e\u0301trange: ["french"], e\u0301troit: ["french"], e\u0301tude: ["french"], euphorie: ["french"], e\u0301valuer: ["french"], e\u0301vasion: ["french"], e\u0301ventail: ["french"], e\u0301vidence: ["french"], e\u0301viter: ["french"], e\u0301volutif: ["french"], e\u0301voquer: ["french"], exage\u0301rer: ["french"], exaucer: ["french"], exceller: ["french"], excitant: ["french"], exclusif: ["french"], exe\u0301cuter: ["french"], exemple: ["french"], exercer: ["french"], exhaler: ["french"], exhorter: ["french"], exigence: ["french"], exiler: ["french"], exister: ["french"], exotique: ["french"], expe\u0301dier: ["french"], explorer: ["french"], exposer: ["french"], exprimer: ["french"], exquis: ["french"], extensif: ["french"], extraire: ["french"], exulter: ["french"], fable: ["french"], fabuleux: ["french"], facette: ["french"], facile: ["french"], facture: ["french"], faiblir: ["french"], falaise: ["french"], fameux: ["french"], famille: ["french"], farceur: ["french"], farfelu: ["french"], farine: ["french"], farouche: ["french"], fasciner: ["french"], faucon: ["french"], fautif: ["french"], faveur: ["french"], favori: ["french", "turkish"], fe\u0301brile: ["french"], fe\u0301conder: ["french"], fe\u0301de\u0301rer: ["french"], fe\u0301lin: ["french"], femme: ["french"], fe\u0301mur: ["french"], fendoir: ["french"], fe\u0301odal: ["french"], fermer: ["french"], fe\u0301roce: ["french"], ferveur: ["french"], feuille: ["french"], feutre: ["french"], fe\u0301vrier: ["french"], fiasco: ["french"], ficeler: ["french"], fictif: ["french"], fide\u0300le: ["french"], filature: ["french"], filetage: ["french"], filie\u0300re: ["french"], filleul: ["french"], filmer: ["french"], filou: ["french"], filtrer: ["french"], financer: ["french"], finir: ["french"], fiole: ["french"], firme: ["french"], fissure: ["french"], fixer: ["french"], flairer: ["french"], flamme: ["french"], flasque: ["french"], flatteur: ["french"], fle\u0301au: ["french"], fle\u0300che: ["french"], fleur: ["french"], flexion: ["french"], flocon: ["french"], flore: ["french"], fluctuer: ["french"], fluide: ["french"], fluvial: ["french"], folie: ["french"], fonderie: ["french"], fongible: ["french"], fontaine: ["french"], forcer: ["french"], forgeron: ["french"], formuler: ["french"], fossile: ["french"], foudre: ["french"], fouge\u0300re: ["french"], fouiller: ["french"], foulure: ["french"], fourmi: ["french"], fraise: ["french"], franchir: ["french"], frapper: ["french"], frayeur: ["french"], fre\u0301gate: ["french"], freiner: ["french"], frelon: ["french"], fre\u0301mir: ["french"], fre\u0301ne\u0301sie: ["french"], fre\u0300re: ["french"], friable: ["french"], friction: ["french"], frisson: ["french"], frivole: ["french"], froid: ["french"], fromage: ["french"], frontal: ["french"], frotter: ["french"], fugitif: ["french"], fuite: ["french"], fureur: ["french"], furieux: ["french"], furtif: ["french"], fusion: ["french"], futur: ["french"], gagner: ["french"], galaxie: ["french"], galerie: ["french"], gambader: ["french"], garantir: ["french"], gardien: ["french"], garnir: ["french"], garrigue: ["french"], gazelle: ["french"], gazon: ["french"], ge\u0301ant: ["french"], ge\u0301latine: ["french"], ge\u0301lule: ["french"], gendarme: ["french"], ge\u0301ne\u0301ral: ["french"], ge\u0301nie: ["french"], genou: ["french"], gentil: ["french"], ge\u0301ologie: ["french"], ge\u0301ome\u0300tre: ["french"], ge\u0301ranium: ["french"], germe: ["french"], gestuel: ["french"], geyser: ["french"], gibier: ["french"], gicler: ["french"], girafe: ["french"], givre: ["french"], glace: ["french"], glaive: ["french"], glisser: ["french"], gloire: ["french"], glorieux: ["french"], golfeur: ["french"], gomme: ["french"], gonfler: ["french"], gorge: ["french"], gorille: ["french"], goudron: ["french"], gouffre: ["french"], goulot: ["french"], goupille: ["french"], gourmand: ["french"], goutte: ["french"], graduel: ["french"], graffiti: ["french"], graine: ["french"], grand: ["french"], grappin: ["french"], gratuit: ["french"], gravir: ["french"], grenat: ["french"], griffure: ["french"], griller: ["french"], grimper: ["french"], grogner: ["french"], gronder: ["french"], grotte: ["french"], groupe: ["french"], gruger: ["french"], grutier: ["french"], gruye\u0300re: ["french"], gue\u0301pard: ["french"], guerrier: ["french"], guimauve: ["french"], guitare: ["french"], gustatif: ["french"], gymnaste: ["french"], gyrostat: ["french"], habitude: ["french"], hachoir: ["french"], halte: ["french"], hameau: ["french"], hangar: ["french", "turkish"], hanneton: ["french"], haricot: ["french"], harmonie: ["french"], harpon: ["french"], hasard: ["french"], he\u0301lium: ["french"], he\u0301matome: ["french"], herbe: ["french"], he\u0301risson: ["french"], hermine: ["french"], he\u0301ron: ["french"], he\u0301siter: ["french"], heureux: ["french"], hiberner: ["french"], hibou: ["french"], hilarant: ["french"], histoire: ["french"], hiver: ["french"], homard: ["french"], hommage: ["french"], homoge\u0300ne: ["french"], honneur: ["french"], honorer: ["french"], honteux: ["french"], horde: ["french"], horizon: ["french"], horloge: ["french"], hormone: ["french"], horrible: ["french"], houleux: ["french"], housse: ["french"], hublot: ["french"], huileux: ["french"], humain: ["french"], humide: ["french"], humour: ["french"], hurler: ["french"], hydromel: ["french"], hygie\u0300ne: ["french"], hymne: ["french"], hypnose: ["french"], idylle: ["french"], ignorer: ["french"], iguane: ["french"], illicite: ["french"], illusion: ["french"], imbiber: ["french"], imiter: ["french"], immobile: ["french"], immuable: ["french"], impe\u0301rial: ["french"], implorer: ["french"], imposer: ["french"], imprimer: ["french"], imputer: ["french"], incarner: ["french"], incendie: ["french"], incident: ["french"], incliner: ["french"], incolore: ["french"], indexer: ["french"], indice: ["french"], inductif: ["french"], ine\u0301dit: ["french"], ineptie: ["french"], inexact: ["french"], infini: ["french"], infliger: ["french"], informer: ["french"], infusion: ["french"], inge\u0301rer: ["french"], inhaler: ["french"], inhiber: ["french"], injecter: ["french"], injure: ["french"], inoculer: ["french"], inonder: ["french"], inscrire: ["french"], insecte: ["french"], insigne: ["french"], insolite: ["french"], inspirer: ["french"], instinct: ["french"], insulter: ["french"], intense: ["french"], intime: ["french"], intrigue: ["french"], intuitif: ["french"], inutile: ["french"], invasion: ["french"], inventer: ["french"], inviter: ["french"], invoquer: ["french"], ironique: ["french"], irradier: ["french"], irre\u0301el: ["french"], irriter: ["french"], isoler: ["french"], ivoire: ["french"], ivresse: ["french"], jaillir: ["french"], jambe: ["french"], janvier: ["french"], jardin: ["french"], jauger: ["french"], jaune: ["french"], javelot: ["french"], jetable: ["french"], jeton: ["french"], jeudi: ["french"], jeunesse: ["french"], joindre: ["french"], joncher: ["french"], jongler: ["french"], joueur: ["french"], jouissif: ["french"], journal: ["french"], jovial: ["french"], joyau: ["french"], joyeux: ["french"], jubiler: ["french"], jugement: ["french"], jupon: ["french"], juriste: ["french"], justice: ["french"], juteux: ["french"], juve\u0301nile: ["french"], kayak: ["french"], kimono: ["french"], kiosque: ["french"], labial: ["french"], labourer: ["french"], lace\u0301rer: ["french"], lactose: ["french"], lagune: ["french"], laine: ["french"], laisser: ["french"], laitier: ["french"], lambeau: ["french"], lamelle: ["french"], lampe: ["french"], lanceur: ["french"], langage: ["french"], lanterne: ["french"], lapin: ["french"], largeur: ["french"], larme: ["french"], laurier: ["french"], lavabo: ["french"], lavoir: ["french"], le\u0301gal: ["french"], le\u0301ger: ["french"], le\u0301gume: ["french"], lessive: ["french"], lettre: ["french"], levier: ["french"], lexique: ["french"], le\u0301zard: ["french"], liasse: ["french"], libe\u0301rer: ["french"], libre: ["french"], licence: ["french"], licorne: ["french"], lie\u0300ge: ["french"], lie\u0300vre: ["french"], ligature: ["french"], ligoter: ["french"], ligue: ["french"], limer: ["french"], limite: ["french"], limonade: ["french"], limpide: ["french"], line\u0301aire: ["french"], lingot: ["french"], lionceau: ["french"], liquide: ["french"], lisie\u0300re: ["french"], lister: ["french"], lithium: ["french"], litige: ["french"], littoral: ["french"], livreur: ["french"], logique: ["french"], lointain: ["french"], loisir: ["french"], lombric: ["french"], loterie: ["french"], louer: ["french"], lourd: ["french"], loutre: ["french"], louve: ["french"], lubie: ["french"], lucide: ["french"], lucratif: ["french"], lueur: ["french"], lugubre: ["french"], luisant: ["french"], lumie\u0300re: ["french"], lunaire: ["french"], lundi: ["french"], luron: ["french"], lutter: ["french"], luxueux: ["french"], magasin: ["french"], magenta: ["french"], magique: ["french"], maigre: ["french"], maillon: ["french"], maintien: ["french"], mairie: ["french"], maison: ["french"], majorer: ["french"], malaxer: ["french"], male\u0301fice: ["french"], malheur: ["french"], malice: ["french"], mallette: ["french"], mammouth: ["french"], mandater: ["french"], maniable: ["french"], manquant: ["french"], manteau: ["french"], manuel: ["french"], marathon: ["french"], marbre: ["french"], marchand: ["french"], mardi: ["french"], maritime: ["french"], marqueur: ["french"], marron: ["french"], marteler: ["french"], mascotte: ["french"], massif: ["french"], mate\u0301riel: ["french"], matie\u0300re: ["french"], matraque: ["french"], maudire: ["french"], maussade: ["french"], mauve: ["french"], maximal: ["french"], me\u0301chant: ["french"], me\u0301connu: ["french"], me\u0301daille: ["french"], me\u0301decin: ["french"], me\u0301diter: ["french"], me\u0301duse: ["french"], meilleur: ["french"], me\u0301lange: ["french"], me\u0301lodie: ["french"], membre: ["french"], me\u0301moire: ["french"], menacer: ["french"], mener: ["french"], menhir: ["french"], mensonge: ["french"], mentor: ["french"], mercredi: ["french"], me\u0301rite: ["french"], merle: ["french"], messager: ["french"], mesure: ["french"], me\u0301tal: ["french"], me\u0301te\u0301ore: ["french"], me\u0301thode: ["french"], me\u0301tier: ["french"], meuble: ["french"], miauler: ["french"], microbe: ["french"], miette: ["french"], mignon: ["french"], migrer: ["french"], milieu: ["french"], mimique: ["french"], mince: ["french"], mine\u0301ral: ["french"], minimal: ["french"], minorer: ["french"], miroiter: ["french"], missile: ["french"], mixte: ["french"], moderne: ["french"], moelleux: ["french"], mondial: ["french"], moniteur: ["french"], monnaie: ["french"], monotone: ["french"], monstre: ["french"], montagne: ["french"], monument: ["french"], moqueur: ["french"], morceau: ["french"], morsure: ["french"], mortier: ["french"], moteur: ["french"], motif: ["french"], mouche: ["french"], moufle: ["french"], moulin: ["french"], mousson: ["french"], mouton: ["french"], mouvant: ["french"], multiple: ["french"], munition: ["french"], muraille: ["french"], mure\u0300ne: ["french"], murmure: ["french"], muse\u0301um: ["french"], musicien: ["french"], mutation: ["french"], muter: ["french"], mutuel: ["french"], myriade: ["french"], myrtille: ["french"], myste\u0300re: ["french"], mythique: ["french"], nageur: ["french"], nappe: ["french"], narquois: ["french"], narrer: ["french"], natation: ["french"], naufrage: ["french"], nautique: ["french"], navire: ["french"], ne\u0301buleux: ["french"], nectar: ["french"], ne\u0301faste: ["french"], ne\u0301gation: ["french"], ne\u0301gliger: ["french"], ne\u0301gocier: ["french"], neige: ["french"], nerveux: ["french"], nettoyer: ["french"], neurone: ["french"], neutron: ["french"], neveu: ["french"], niche: ["french"], nickel: ["french"], nitrate: ["french"], niveau: ["french"], nocif: ["french"], nocturne: ["french"], noirceur: ["french"], noisette: ["french"], nomade: ["french"], nombreux: ["french"], nommer: ["french"], normatif: ["french"], notifier: ["french"], notoire: ["french"], nourrir: ["french"], nouveau: ["french"], novateur: ["french"], novembre: ["french"], novice: ["french"], nuage: ["french"], nuancer: ["french"], nuire: ["french"], nuisible: ["french"], nume\u0301ro: ["french"], nuptial: ["french"], nuque: ["french"], nutritif: ["french"], obe\u0301ir: ["french"], objectif: ["french"], obliger: ["french"], obscur: ["french"], observer: ["french"], obstacle: ["french"], obtenir: ["french"], obturer: ["french"], occasion: ["french"], occuper: ["french"], oce\u0301an: ["french"], octobre: ["french"], octroyer: ["french"], octupler: ["french"], oculaire: ["french"], odeur: ["french"], odorant: ["french"], offenser: ["french"], officier: ["french"], offrir: ["french"], ogive: ["french"], oiseau: ["french"], oisillon: ["french"], olfactif: ["french"], olivier: ["french"], ombrage: ["french"], omettre: ["french"], onctueux: ["french"], onduler: ["french"], one\u0301reux: ["french"], onirique: ["french"], opale: ["french"], opaque: ["french"], ope\u0301rer: ["french"], opportun: ["french"], opprimer: ["french"], opter: ["french"], optique: ["french"], orageux: ["french"], orbite: ["french"], ordonner: ["french"], oreille: ["french"], organe: ["french"], orgueil: ["french"], orifice: ["french"], ornement: ["french"], orque: ["french"], ortie: ["french"], osciller: ["french"], osmose: ["french"], ossature: ["french"], otarie: ["french"], ouragan: ["french"], ourson: ["french"], outil: ["french"], outrager: ["french"], ouvrage: ["french"], ovation: ["french"], oxyde: ["french"], oxyge\u0300ne: ["french"], paisible: ["french"], palmare\u0300s: ["french"], palourde: ["french"], palper: ["french"], panache: ["french"], pangolin: ["french"], paniquer: ["french"], panneau: ["french"], panorama: ["french"], pantalon: ["french"], papaye: ["french"], papier: ["french"], papoter: ["french"], papyrus: ["french"], paradoxe: ["french"], parcelle: ["french"], paresse: ["french"], parfumer: ["french"], parler: ["french"], parole: ["french"], parrain: ["french"], parsemer: ["french"], partager: ["french"], parure: ["french"], parvenir: ["french"], passion: ["french"], paste\u0300que: ["french"], paternel: ["french"], patience: ["french"], patron: ["french", "turkish"], pavillon: ["french"], pavoiser: ["french"], payer: ["french"], paysage: ["french"], peigne: ["french"], peintre: ["french"], pelage: ["french"], pe\u0301lican: ["french"], pelle: ["french"], pelouse: ["french"], peluche: ["french"], pendule: ["french"], pe\u0301ne\u0301trer: ["french"], pe\u0301nible: ["french"], pensif: ["french"], pe\u0301nurie: ["french"], pe\u0301pite: ["french"], pe\u0301plum: ["french"], perdrix: ["french"], perforer: ["french"], pe\u0301riode: ["french"], permuter: ["french"], perplexe: ["french"], persil: ["french"], perte: ["french"], peser: ["french"], pe\u0301tale: ["french"], petit: ["french"], pe\u0301trir: ["french"], peuple: ["french"], pharaon: ["french"], phobie: ["french"], phoque: ["french"], photon: ["french"], physique: ["french"], pictural: ["french"], pie\u0300ce: ["french"], pierre: ["french"], pieuvre: ["french"], pilote: ["french"], pinceau: ["french"], pipette: ["french"], piquer: ["french"], pirogue: ["french"], piscine: ["french"], piston: ["french"], pivoter: ["french"], pixel: ["french"], placard: ["french"], plafond: ["french"], plaisir: ["french"], planer: ["french"], plaque: ["french"], plastron: ["french"], plateau: ["french"], pleurer: ["french"], plexus: ["french"], pliage: ["french"], plomb: ["french"], plonger: ["french"], pluie: ["french"], plumage: ["french"], pochette: ["french"], poe\u0301sie: ["french"], poe\u0300te: ["french"], pointe: ["french"], poirier: ["french"], poisson: ["french"], poivre: ["french"], polaire: ["french"], policier: ["french"], pollen: ["french"], polygone: ["french"], pommade: ["french"], pompier: ["french"], ponctuel: ["french"], ponde\u0301rer: ["french"], poney: ["french"], portique: ["french"], posse\u0301der: ["french"], posture: ["french"], potager: ["french"], poteau: ["french"], potion: ["french"], pouce: ["french"], poulain: ["french"], poumon: ["french"], pourpre: ["french"], poussin: ["french"], pouvoir: ["french"], prairie: ["french"], pratique: ["french"], pre\u0301cieux: ["french"], pre\u0301dire: ["french"], pre\u0301fixe: ["french"], pre\u0301lude: ["french"], pre\u0301nom: ["french"], pre\u0301sence: ["french"], pre\u0301texte: ["french"], pre\u0301voir: ["french"], primitif: ["french"], prince: ["french"], priver: ["french"], proble\u0300me: ["french"], proce\u0301der: ["french"], prodige: ["french"], profond: ["french"], progre\u0300s: ["french"], proie: ["french"], projeter: ["french"], prologue: ["french"], promener: ["french"], propre: ["french"], prospe\u0300re: ["french"], prote\u0301ger: ["french"], prouesse: ["french"], proverbe: ["french"], prudence: ["french"], pruneau: ["french"], psychose: ["french"], puceron: ["french"], puiser: ["french"], pulpe: ["french"], pulsar: ["french"], punaise: ["french"], punitif: ["french"], pupitre: ["french"], purifier: ["french"], pyramide: ["french"], quasar: ["french"], querelle: ["french"], quie\u0301tude: ["french"], quitter: ["french"], quotient: ["french"], racine: ["french"], raconter: ["french"], radieux: ["french"], ragondin: ["french"], raideur: ["french"], raisin: ["french"], ralentir: ["french"], rallonge: ["french"], ramasser: ["french"], rapide: ["french"], rasage: ["french"], ratisser: ["french"], ravager: ["french"], ravin: ["french"], rayonner: ["french"], re\u0301actif: ["french"], re\u0301agir: ["french"], re\u0301aliser: ["french"], re\u0301animer: ["french"], recevoir: ["french"], re\u0301citer: ["french"], re\u0301clamer: ["french"], re\u0301colter: ["french"], recruter: ["french"], reculer: ["french"], recycler: ["french"], re\u0301diger: ["french"], redouter: ["french"], refaire: ["french"], re\u0301flexe: ["french"], re\u0301former: ["french"], refrain: ["french"], refuge: ["french"], re\u0301galien: ["french"], re\u0301gion: ["french"], re\u0301glage: ["french"], re\u0301gulier: ["french"], re\u0301ite\u0301rer: ["french"], rejeter: ["french"], rejouer: ["french"], relatif: ["french"], relever: ["french"], remarque: ["french"], reme\u0300de: ["french"], remise: ["french"], remonter: ["french"], remplir: ["french"], remuer: ["french"], renard: ["french"], renfort: ["french"], renifler: ["french"], renoncer: ["french"], rentrer: ["french"], renvoi: ["french"], replier: ["french"], reporter: ["french"], reprise: ["french"], reptile: ["french"], requin: ["french"], re\u0301serve: ["french"], re\u0301sineux: ["french"], re\u0301soudre: ["french"], respect: ["french"], rester: ["french"], re\u0301sultat: ["french"], re\u0301tablir: ["french"], retenir: ["french"], re\u0301ticule: ["french"], retomber: ["french"], retracer: ["french"], re\u0301union: ["french"], re\u0301ussir: ["french"], revanche: ["french"], revivre: ["french"], re\u0301volte: ["french"], re\u0301vulsif: ["french"], richesse: ["french"], rideau: ["french"], rieur: ["french"], rigide: ["french"], rigoler: ["french"], rincer: ["french"], riposter: ["french"], risible: ["french"], risque: ["french"], rituel: ["french"], rivie\u0300re: ["french"], rocheux: ["french"], rompre: ["french"], ronce: ["french"], rondin: ["french"], roseau: ["french"], rosier: ["french"], rotatif: ["french"], rotor: ["french"], rotule: ["french"], rouge: ["french"], rouille: ["french"], rouleau: ["french"], routine: ["french"], royaume: ["french"], ruban: ["french"], rubis: ["french"], ruche: ["french"], ruelle: ["french"], rugueux: ["french"], ruiner: ["french"], ruisseau: ["french"], ruser: ["french"], rustique: ["french"], rythme: ["french"], sabler: ["french"], saboter: ["french"], sabre: ["french"], sacoche: ["french"], safari: ["french"], sagesse: ["french"], saisir: ["french"], salade: ["french"], salive: ["french"], saluer: ["french"], samedi: ["french"], sanction: ["french"], sanglier: ["french"], sarcasme: ["french"], sardine: ["french"], saturer: ["french"], saugrenu: ["french"], saumon: ["french"], sauter: ["french"], sauvage: ["french"], savant: ["french"], savonner: ["french"], scalpel: ["french"], scandale: ["french"], sce\u0301le\u0301rat: ["french"], sce\u0301nario: ["french"], sceptre: ["french"], sche\u0301ma: ["french"], scinder: ["french"], score: ["french"], scrutin: ["french"], sculpter: ["french"], se\u0301ance: ["french"], se\u0301cable: ["french"], se\u0301cher: ["french"], secouer: ["french"], se\u0301cre\u0301ter: ["french"], se\u0301datif: ["french"], se\u0301duire: ["french"], seigneur: ["french"], se\u0301jour: ["french"], se\u0301lectif: ["french"], semaine: ["french"], sembler: ["french"], semence: ["french"], se\u0301minal: ["french"], se\u0301nateur: ["french"], sensible: ["french"], se\u0301parer: ["french"], se\u0301quence: ["french"], serein: ["french"], sergent: ["french"], se\u0301rieux: ["french"], serrure: ["french"], se\u0301rum: ["french"], se\u0301same: ["french"], se\u0301vir: ["french"], sevrage: ["french"], sextuple: ["french"], side\u0301ral: ["french"], sie\u0300cle: ["french"], sie\u0301ger: ["french"], siffler: ["french"], sigle: ["french"], signal: ["french"], silence: ["french"], silicium: ["french"], since\u0300re: ["french"], sinistre: ["french"], siphon: ["french"], sirop: ["french"], sismique: ["french"], situer: ["french"], skier: ["french"], socle: ["french"], sodium: ["french"], soigneux: ["french"], soldat: ["french"], soleil: ["french"], solitude: ["french"], soluble: ["french"], sombre: ["french"], sommeil: ["french"], somnoler: ["french"], sonde: ["french"], songeur: ["french"], sonnette: ["french"], sonore: ["french"], sorcier: ["french"], sortir: ["french"], sosie: ["french"], sottise: ["french"], soucieux: ["french"], soudure: ["french"], souffle: ["french"], soulever: ["french"], soupape: ["french"], soutirer: ["french"], souvenir: ["french"], spacieux: ["french"], spe\u0301cial: ["french"], sphe\u0300re: ["french"], spiral: ["french", "turkish"], station: ["french"], sternum: ["french"], stimulus: ["french"], stipuler: ["french"], strict: ["french"], studieux: ["french"], stupeur: ["french"], styliste: ["french"], sublime: ["french"], substrat: ["french"], subtil: ["french"], subvenir: ["french"], succe\u0300s: ["french"], sucre: ["french"], suffixe: ["french"], sugge\u0301rer: ["french"], suiveur: ["french"], sulfate: ["french"], superbe: ["french"], supplier: ["french"], suricate: ["french"], surmener: ["french"], sursaut: ["french"], survie: ["french"], syllabe: ["french"], symbole: ["french"], syme\u0301trie: ["french"], synapse: ["french"], syntaxe: ["french"], syste\u0300me: ["french"], tabac: ["french"], tablier: ["french"], tactile: ["french"], tailler: ["french"], talisman: ["french"], talonner: ["french"], tambour: ["french"], tamiser: ["french"], tangible: ["french"], tapis: ["french"], taquiner: ["french"], tarder: ["french"], tarif: ["french"], tartine: ["french"], tasse: ["french"], tatami: ["french"], tatouage: ["french"], taupe: ["french"], taureau: ["french"], taxer: ["french"], te\u0301moin: ["french"], temporel: ["french"], tenaille: ["french"], tendre: ["french"], teneur: ["french"], tenir: ["french"], tension: ["french"], terminer: ["french"], terne: ["french"], terrible: ["french"], te\u0301tine: ["french"], texte: ["french"], the\u0300me: ["french"], the\u0301orie: ["french"], the\u0301rapie: ["french"], thorax: ["french"], tibia: ["french"], tie\u0300de: ["french"], timide: ["french"], tirelire: ["french"], tiroir: ["french"], tissu: ["french"], titane: ["french"], titre: ["french"], tituber: ["french"], toboggan: ["french"], tole\u0301rant: ["french"], tomate: ["french"], tonique: ["french"], tonneau: ["french"], toponyme: ["french"], torche: ["french"], tordre: ["french"], tornade: ["french"], torpille: ["french"], torrent: ["french"], torse: ["french"], tortue: ["french"], totem: ["french"], toucher: ["french"], tournage: ["french"], tousser: ["french"], toxine: ["french"], traction: ["french"], trafic: ["french"], tragique: ["french"], trahir: ["french"], trancher: ["french"], travail: ["french"], tre\u0300fle: ["french"], tremper: ["french"], tre\u0301sor: ["french"], treuil: ["french"], triage: ["french"], tribunal: ["french"], tricoter: ["french"], trilogie: ["french"], triomphe: ["french"], tripler: ["french"], triturer: ["french"], trivial: ["french"], trombone: ["french"], tronc: ["french"], tropical: ["french"], troupeau: ["french"], tuile: ["french"], tulipe: ["french"], tumulte: ["french"], turbine: ["french"], tuteur: ["french"], tutoyer: ["french"], tuyau: ["french"], tympan: ["french"], typhon: ["french"], typique: ["french"], tyran: ["french"], ubuesque: ["french"], ultime: ["french"], ultrason: ["french"], unanime: ["french"], unifier: ["french"], union: ["french"], unitaire: ["french"], univers: ["french"], uranium: ["french"], urbain: ["french"], urticant: ["french"], usine: ["french"], usuel: ["french"], usure: ["french"], utile: ["french"], utopie: ["french"], vacarme: ["french"], vaccin: ["french"], vagabond: ["french"], vaillant: ["french"], vaincre: ["french"], vaisseau: ["french"], valable: ["french"], valise: ["french"], vallon: ["french"], vampire: ["french"], vanille: ["french"], vapeur: ["french"], varier: ["french"], vaseux: ["french"], vassal: ["french"], vaste: ["french"], vecteur: ["french"], vedette: ["french"], ve\u0301ge\u0301tal: ["french"], ve\u0301hicule: ["french"], veinard: ["french"], ve\u0301loce: ["french"], vendredi: ["french"], ve\u0301ne\u0301rer: ["french"], venger: ["french"], venimeux: ["french"], ventouse: ["french"], verdure: ["french"], ve\u0301rin: ["french"], vernir: ["french"], verrou: ["french"], verser: ["french"], vertu: ["french"], veston: ["french"], ve\u0301te\u0301ran: ["french"], ve\u0301tuste: ["french"], vexant: ["french"], vexer: ["french"], viaduc: ["french"], viande: ["french"], victoire: ["french"], vidange: ["french"], vide\u0301o: ["french"], vignette: ["french"], vigueur: ["french"], vilain: ["french"], vinaigre: ["french"], violon: ["french"], vipe\u0300re: ["french"], virement: ["french"], virtuose: ["french"], visage: ["french"], viseur: ["french"], vision: ["french"], visqueux: ["french"], visuel: ["french"], vitesse: ["french"], viticole: ["french"], vitrine: ["french"], vivace: ["french"], vivipare: ["french"], vocation: ["french"], voguer: ["french"], voile: ["french"], voisin: ["french"], voiture: ["french"], volaille: ["french"], volcan: ["french"], voltiger: ["french"], vorace: ["french"], vortex: ["french"], voter: ["french"], vouloir: ["french"], voyelle: ["french"], xe\u0301non: ["french"], yacht: ["french"], ze\u0300bre: ["french"], ze\u0301nith: ["french"], zeste: ["french"], zoologie: ["french"], abaco: ["italian"], abbaglio: ["italian"], abbinato: ["italian"], abete: ["italian"], abisso: ["italian"], abolire: ["italian"], abrasivo: ["italian"], abrogato: ["italian"], accadere: ["italian"], accenno: ["italian"], accusato: ["italian"], acetone: ["italian"], achille: ["italian"], acido: ["italian"], acqua: ["italian"], acre: ["italian"], acrilico: ["italian"], acrobata: ["italian"], acuto: ["italian"], adagio: ["italian"], addebito: ["italian"], addome: ["italian"], adeguato: ["italian"], aderire: ["italian"], adipe: ["italian"], adottare: ["italian"], adulare: ["italian"], affabile: ["italian"], affetto: ["italian"], affisso: ["italian"], affranto: ["italian"], aforisma: ["italian"], afoso: ["italian"], africano: ["italian"], agave: ["italian"], agente: ["italian"], agevole: ["italian"], aggancio: ["italian"], agire: ["italian"], agitare: ["italian"], agonismo: ["italian"], agricolo: ["italian"], agrumeto: ["italian"], aguzzo: ["italian"], alabarda: ["italian"], alato: ["italian"], albatro: ["italian"], alberato: ["italian"], albo: ["italian"], albume: ["italian"], alce: ["italian"], alcolico: ["italian"], alettone: ["italian"], alfa: ["italian"], algebra: ["italian"], aliante: ["italian"], alibi: ["italian"], alimento: ["italian"], allagato: ["italian"], allegro: ["italian"], allievo: ["italian"], allodola: ["italian"], allusivo: ["italian"], almeno: ["italian"], alogeno: ["italian"], alpaca: ["italian"], alpestre: ["italian"], altalena: ["italian"], alterno: ["italian"], alticcio: ["italian"], altrove: ["italian"], alunno: ["italian"], alveolo: ["italian"], alzare: ["italian"], amalgama: ["italian"], amanita: ["italian"], amarena: ["italian"], ambito: ["italian"], ambrato: ["italian"], ameba: ["italian"], america: ["italian"], ametista: ["italian"], amico: ["italian"], ammasso: ["italian"], ammenda: ["italian"], ammirare: ["italian"], ammonito: ["italian"], amore: ["italian"], ampio: ["italian"], ampliare: ["italian"], amuleto: ["italian"], anacardo: ["italian"], anagrafe: ["italian"], analista: ["italian"], anarchia: ["italian"], anatra: ["italian"], anca: ["italian"], ancella: ["italian"], ancora: ["italian"], andare: ["italian"], andrea: ["italian"], anello: ["italian"], angelo: ["italian"], angolare: ["italian"], angusto: ["italian"], anima: ["italian"], annegare: ["italian"], annidato: ["italian"], anno: ["italian"], annuncio: ["italian"], anonimo: ["italian"], anticipo: ["italian"], anzi: ["italian"], apatico: ["italian"], apertura: ["italian"], apode: ["italian"], apparire: ["italian"], appetito: ["italian"], appoggio: ["italian"], approdo: ["italian"], appunto: ["italian"], aprile: ["italian"], arabica: ["italian"], arachide: ["italian"], aragosta: ["italian"], araldica: ["italian"], arancio: ["italian"], aratura: ["italian"], arazzo: ["italian"], arbitro: ["italian"], archivio: ["italian"], ardito: ["italian"], arenile: ["italian"], argento: ["italian"], argine: ["italian"], arguto: ["italian"], aria: ["italian"], armonia: ["italian"], arnese: ["italian"], arredato: ["italian"], arringa: ["italian"], arrosto: ["italian"], arsenico: ["italian"], arso: ["italian"], artefice: ["italian"], arzillo: ["italian"], asciutto: ["italian"], ascolto: ["italian"], asepsi: ["italian"], asettico: ["italian"], asfalto: ["italian"], asino: ["italian"], asola: ["italian"], aspirato: ["italian"], aspro: ["italian"], assaggio: ["italian"], asse: ["italian"], assoluto: ["italian"], assurdo: ["italian"], asta: ["italian"], astenuto: ["italian"], astice: ["italian"], astratto: ["italian"], atavico: ["italian"], ateismo: ["italian"], atomico: ["italian"], atono: ["italian"], attesa: ["italian"], attivare: ["italian"], attorno: ["italian"], attrito: ["italian"], attuale: ["italian"], ausilio: ["italian"], austria: ["italian"], autista: ["italian"], autonomo: ["italian"], autunno: ["italian"], avanzato: ["italian"], avere: ["italian"], avvenire: ["italian"], avviso: ["italian"], avvolgere: ["italian"], azione: ["italian"], azoto: ["italian"], azzimo: ["italian"], azzurro: ["italian"], babele: ["italian"], baccano: ["italian"], bacino: ["italian"], baco: ["italian"], badessa: ["italian"], badilata: ["italian"], bagnato: ["italian"], baita: ["italian"], balcone: ["italian"], baldo: ["italian"], balena: ["italian"], ballata: ["italian"], balzano: ["italian"], bambino: ["italian"], bandire: ["italian"], baraonda: ["italian"], barbaro: ["italian"], barca: ["italian"], baritono: ["italian"], barlume: ["italian"], barocco: ["italian"], basilico: ["italian"], basso: ["italian"], batosta: ["italian"], battuto: ["italian"], baule: ["italian"], bava: ["italian"], bavosa: ["italian"], becco: ["italian"], beffa: ["italian"], belgio: ["italian"], belva: ["italian"], benda: ["italian"], benevole: ["italian"], benigno: ["italian"], benzina: ["italian"], bere: ["italian"], berlina: ["italian"], beta: ["italian"], bibita: ["italian"], bici: ["italian"], bidone: ["italian"], bifido: ["italian"], biga: ["italian"], bilancia: ["italian"], bimbo: ["italian"], binocolo: ["italian"], biologo: ["italian"], bipede: ["italian"], bipolare: ["italian"], birbante: ["italian"], birra: ["italian"], biscotto: ["italian"], bisesto: ["italian"], bisnonno: ["italian"], bisonte: ["italian"], bisturi: ["italian"], bizzarro: ["italian"], blando: ["italian"], blatta: ["italian"], bollito: ["italian"], bonifico: ["italian"], bordo: ["italian"], bosco: ["italian"], botanico: ["italian"], bottino: ["italian"], bozzolo: ["italian"], braccio: ["italian"], bradipo: ["italian"], brama: ["italian"], branca: ["italian"], bravura: ["italian"], bretella: ["italian"], brevetto: ["italian"], brezza: ["italian"], briglia: ["italian"], brillante: ["italian"], brindare: ["italian"], broccolo: ["italian"], brodo: ["italian"], bronzina: ["italian"], brullo: ["italian"], bruno: ["italian"], bubbone: ["italian"], buca: ["italian"], budino: ["italian"], buffone: ["italian"], buio: ["italian"], bulbo: ["italian"], buono: ["italian"], burlone: ["italian"], burrasca: ["italian"], bussola: ["italian"], busta: ["italian"], cadetto: ["italian"], caduco: ["italian"], calamaro: ["italian"], calcolo: ["italian"], calesse: ["italian"], calibro: ["italian"], calmo: ["italian"], caloria: ["italian"], cambusa: ["italian"], camerata: ["italian"], camicia: ["italian"], cammino: ["italian"], camola: ["italian"], campale: ["italian"], canapa: ["italian"], candela: ["italian"], cane: ["italian"], canino: ["italian"], canotto: ["italian"], cantina: ["italian"], capace: ["italian"], capello: ["italian"], capitolo: ["italian"], capogiro: ["italian"], cappero: ["italian"], capra: ["italian"], capsula: ["italian"], carapace: ["italian"], carcassa: ["italian"], cardo: ["italian"], carisma: ["italian"], carovana: ["italian"], carretto: ["italian"], cartolina: ["italian"], casaccio: ["italian"], cascata: ["italian"], caserma: ["italian"], caso: ["italian"], cassone: ["italian"], castello: ["italian"], casuale: ["italian"], catasta: ["italian"], catena: ["italian"], catrame: ["italian"], cauto: ["italian"], cavillo: ["italian"], cedibile: ["italian"], cedrata: ["italian"], cefalo: ["italian"], celebre: ["italian"], cellulare: ["italian"], cena: ["italian"], cenone: ["italian"], centesimo: ["italian"], ceramica: ["italian"], cercare: ["italian"], certo: ["italian"], cerume: ["italian"], cervello: ["italian"], cesoia: ["italian"], cespo: ["italian"], ceto: ["italian"], chela: ["italian"], chiaro: ["italian"], chicca: ["italian"], chiedere: ["italian"], chimera: ["italian"], china: ["italian"], chirurgo: ["italian"], chitarra: ["italian"], ciao: ["italian"], ciclismo: ["italian"], cifrare: ["italian"], cigno: ["italian"], cilindro: ["italian"], ciottolo: ["italian"], circa: ["italian"], cirrosi: ["italian"], citrico: ["italian"], cittadino: ["italian"], ciuffo: ["italian"], civetta: ["italian"], civile: ["italian"], classico: ["italian"], clinica: ["italian"], cloro: ["italian"], cocco: ["italian"], codardo: ["italian"], codice: ["italian"], coerente: ["italian"], cognome: ["italian"], collare: ["italian"], colmato: ["italian"], colore: ["italian"], colposo: ["italian"], coltivato: ["italian"], colza: ["italian"], coma: ["italian"], cometa: ["italian"], commando: ["italian"], comodo: ["italian"], computer: ["italian"], comune: ["italian"], conciso: ["italian"], condurre: ["italian"], conferma: ["italian"], congelare: ["italian"], coniuge: ["italian"], connesso: ["italian"], conoscere: ["italian"], consumo: ["italian"], continuo: ["italian"], convegno: ["italian"], coperto: ["italian"], copione: ["italian"], coppia: ["italian"], copricapo: ["italian"], corazza: ["italian"], cordata: ["italian"], coricato: ["italian"], cornice: ["italian"], corolla: ["italian"], corpo: ["italian"], corredo: ["italian"], corsia: ["italian"], cortese: ["italian"], cosmico: ["italian"], costante: ["italian"], cottura: ["italian"], covato: ["italian"], cratere: ["italian"], cravatta: ["italian"], creato: ["italian"], credere: ["italian"], cremoso: ["italian"], crescita: ["italian"], creta: ["italian"], criceto: ["italian"], crinale: ["italian"], crisi: ["italian"], critico: ["italian"], croce: ["italian"], cronaca: ["italian"], crostata: ["italian"], cruciale: ["italian"], crusca: ["italian"], cucire: ["italian"], cuculo: ["italian"], cugino: ["italian"], cullato: ["italian"], cupola: ["italian"], curatore: ["italian"], cursore: ["italian"], curvo: ["italian"], cuscino: ["italian"], custode: ["italian"], dado: ["italian"], daino: ["italian"], dalmata: ["italian"], damerino: ["italian"], daniela: ["italian"], dannoso: ["italian"], danzare: ["italian"], datato: ["italian"], davanti: ["italian"], davvero: ["italian"], debutto: ["italian"], decennio: ["italian"], deciso: ["italian"], declino: ["italian"], decollo: ["italian"], decreto: ["italian"], dedicato: ["italian"], definito: ["italian"], deforme: ["italian"], degno: ["italian"], delegare: ["italian"], delfino: ["italian"], delirio: ["italian"], delta: ["italian"], demenza: ["italian"], denotato: ["italian"], dentro: ["italian"], deposito: ["italian"], derapata: ["italian"], derivare: ["italian"], deroga: ["italian"], descritto: ["italian"], deserto: ["italian"], desiderio: ["italian"], desumere: ["italian"], detersivo: ["italian"], devoto: ["italian"], diametro: ["italian"], dicembre: ["italian"], diedro: ["italian"], difeso: ["italian"], diffuso: ["italian"], digerire: ["italian"], digitale: ["italian"], diluvio: ["italian"], dinamico: ["italian"], dinnanzi: ["italian"], dipinto: ["italian"], diploma: ["italian"], dipolo: ["italian"], diradare: ["italian"], dire: ["italian"], dirotto: ["italian"], dirupo: ["italian"], disagio: ["italian"], discreto: ["italian"], disfare: ["italian"], disgelo: ["italian"], disposto: ["italian"], distanza: ["italian"], disumano: ["italian"], dito: ["italian"], divano: ["italian"], divelto: ["italian"], dividere: ["italian"], divorato: ["italian"], doblone: ["italian"], docente: ["italian"], doganale: ["italian"], dogma: ["italian"], dolce: ["italian"], domato: ["italian"], domenica: ["italian"], dominare: ["italian"], dondolo: ["italian"], dono: ["italian"], dormire: ["italian"], dote: ["italian"], dottore: ["italian"], dovuto: ["italian"], dozzina: ["italian"], drago: ["italian"], druido: ["italian"], dubbio: ["italian"], dubitare: ["italian"], ducale: ["italian"], duna: ["italian"], duomo: ["italian"], duplice: ["italian"], duraturo: ["italian"], ebano: ["italian"], eccesso: ["italian"], ecco: ["italian"], eclissi: ["italian"], economia: ["italian"], edera: ["italian"], edicola: ["italian"], edile: ["italian"], editoria: ["italian"], educare: ["italian"], egemonia: ["italian"], egli: ["italian"], egoismo: ["italian"], egregio: ["italian"], elaborato: ["italian"], elargire: ["italian"], elegante: ["italian"], elencato: ["italian"], eletto: ["italian"], elevare: ["italian"], elfico: ["italian"], elica: ["italian"], elmo: ["italian"], elsa: ["italian"], eluso: ["italian"], emanato: ["italian"], emblema: ["italian"], emesso: ["italian"], emiro: ["italian"], emotivo: ["italian"], emozione: ["italian"], empirico: ["italian"], emulo: ["italian"], endemico: ["italian"], enduro: ["italian"], energia: ["italian"], enfasi: ["italian"], enoteca: ["italian"], entrare: ["italian"], enzima: ["italian"], epatite: ["italian"], epilogo: ["italian"], episodio: ["italian"], epocale: ["italian"], eppure: ["italian"], equatore: ["italian"], erario: ["italian"], erba: ["italian"], erboso: ["italian"], erede: ["italian"], eremita: ["italian"], erigere: ["italian"], ermetico: ["italian"], eroe: ["italian"], erosivo: ["italian"], errante: ["italian"], esagono: ["italian"], esame: ["italian"], esanime: ["italian"], esaudire: ["italian"], esca: ["italian"], esempio: ["italian"], esercito: ["italian"], esibito: ["italian"], esigente: ["italian"], esistere: ["italian"], esito: ["italian"], esofago: ["italian"], esortato: ["italian"], esoso: ["italian"], espanso: ["italian"], espresso: ["italian"], essenza: ["italian"], esso: ["italian"], esteso: ["italian"], estimare: ["italian"], estonia: ["italian"], estroso: ["italian"], esultare: ["italian"], etilico: ["italian"], etnico: ["italian"], etrusco: ["italian"], etto: ["italian"], euclideo: ["italian"], europa: ["italian"], evaso: ["italian"], evidenza: ["italian"], evitato: ["italian"], evoluto: ["italian"], evviva: ["italian"], fabbrica: ["italian"], faccenda: ["italian"], fachiro: ["italian"], falco: ["italian"], famiglia: ["italian"], fanale: ["italian"], fanfara: ["italian"], fango: ["italian"], fantasma: ["italian"], fare: ["italian"], farfalla: ["italian"], farinoso: ["italian"], farmaco: ["italian"], fascia: ["italian"], fastoso: ["italian"], fasullo: ["italian"], faticare: ["italian"], fato: ["italian"], favoloso: ["italian"], febbre: ["italian"], fecola: ["italian"], fede: ["italian"], fegato: ["italian"], felpa: ["italian"], feltro: ["italian"], femmina: ["italian"], fendere: ["italian"], fenomeno: ["italian"], fermento: ["italian"], ferro: ["italian"], fertile: ["italian"], fessura: ["italian"], festivo: ["italian"], fetta: ["italian"], feudo: ["italian"], fiaba: ["italian"], fiducia: ["italian"], fifa: ["italian"], figurato: ["italian"], filo: ["italian", "turkish"], finanza: ["italian"], finestra: ["italian"], finire: ["italian"], fiore: ["italian"], fiscale: ["italian"], fisico: ["italian"], fiume: ["italian"], flacone: ["italian"], flamenco: ["italian"], flebo: ["italian"], flemma: ["italian"], florido: ["italian"], fluente: ["italian"], fluoro: ["italian"], fobico: ["italian"], focaccia: ["italian"], focoso: ["italian"], foderato: ["italian"], foglio: ["italian"], folata: ["italian"], folclore: ["italian"], folgore: ["italian"], fondente: ["italian"], fonetico: ["italian"], fonia: ["italian"], fontana: ["italian"], forbito: ["italian"], forchetta: ["italian"], foresta: ["italian"], formica: ["italian"], fornaio: ["italian"], foro: ["italian"], fortezza: ["italian"], forzare: ["italian"], fosfato: ["italian"], fosso: ["italian"], fracasso: ["italian"], frana: ["italian"], frassino: ["italian"], fratello: ["italian"], freccetta: ["italian"], frenata: ["italian"], fresco: ["italian"], frigo: ["italian"], frollino: ["italian"], fronde: ["italian"], frugale: ["italian"], frutta: ["italian"], fucilata: ["italian"], fucsia: ["italian"], fuggente: ["italian"], fulmine: ["italian"], fulvo: ["italian"], fumante: ["italian"], fumetto: ["italian"], fumoso: ["italian"], fune: ["italian"], funzione: ["italian"], fuoco: ["italian"], furbo: ["italian"], furgone: ["italian"], furore: ["italian"], fuso: ["italian"], futile: ["italian"], gabbiano: ["italian"], gaffe: ["italian"], galateo: ["italian"], gallina: ["italian"], galoppo: ["italian"], gambero: ["italian"], gamma: ["italian"], garanzia: ["italian"], garbo: ["italian"], garofano: ["italian"], garzone: ["italian"], gasdotto: ["italian"], gasolio: ["italian"], gastrico: ["italian"], gatto: ["italian"], gaudio: ["italian"], gazebo: ["italian"], gazzella: ["italian"], geco: ["italian"], gelatina: ["italian"], gelso: ["italian"], gemello: ["italian"], gemmato: ["italian"], gene: ["italian"], genitore: ["italian"], gennaio: ["italian"], genotipo: ["italian"], gergo: ["italian"], ghepardo: ["italian"], ghiaccio: ["italian"], ghisa: ["italian"], giallo: ["italian"], gilda: ["italian"], ginepro: ["italian"], giocare: ["italian"], gioiello: ["italian"], giorno: ["italian"], giove: ["italian"], girato: ["italian"], girone: ["italian"], gittata: ["italian"], giudizio: ["italian"], giurato: ["italian"], giusto: ["italian"], globulo: ["italian"], glutine: ["italian"], gnomo: ["italian"], gobba: ["italian"], golf: ["italian"], gomito: ["italian"], gommone: ["italian"], gonfio: ["italian"], gonna: ["italian"], governo: ["italian"], gracile: ["italian"], grado: ["italian"], grafico: ["italian"], grammo: ["italian"], grande: ["italian"], grattare: ["italian"], gravoso: ["italian"], grazia: ["italian"], greca: ["italian"], gregge: ["italian"], grifone: ["italian"], grigio: ["italian"], grinza: ["italian"], grotta: ["italian"], gruppo: ["italian"], guadagno: ["italian"], guaio: ["italian"], guanto: ["italian"], guardare: ["italian"], gufo: ["italian"], guidare: ["italian"], ibernato: ["italian"], icona: ["italian"], identico: ["italian"], idillio: ["italian"], idolo: ["italian"], idra: ["italian"], idrico: ["italian"], idrogeno: ["italian"], igiene: ["italian"], ignaro: ["italian"], ignorato: ["italian"], ilare: ["italian"], illeso: ["italian"], illogico: ["italian"], illudere: ["italian"], imballo: ["italian"], imbevuto: ["italian"], imbocco: ["italian"], imbuto: ["italian"], immane: ["italian"], immerso: ["italian"], immolato: ["italian"], impacco: ["italian"], impeto: ["italian"], impiego: ["italian"], importo: ["italian"], impronta: ["italian"], inalare: ["italian"], inarcare: ["italian"], inattivo: ["italian"], incanto: ["italian"], incendio: ["italian"], inchino: ["italian"], incisivo: ["italian"], incluso: ["italian"], incontro: ["italian"], incrocio: ["italian"], incubo: ["italian"], indagine: ["italian"], india: ["italian"], indole: ["italian"], inedito: ["italian"], infatti: ["italian"], infilare: ["italian"], inflitto: ["italian"], ingaggio: ["italian"], ingegno: ["italian"], inglese: ["italian"], ingordo: ["italian"], ingrosso: ["italian"], innesco: ["italian"], inodore: ["italian"], inoltrare: ["italian"], inondato: ["italian"], insano: ["italian"], insetto: ["italian"], insieme: ["italian"], insonnia: ["italian"], insulina: ["italian"], intasato: ["italian"], intero: ["italian"], intonaco: ["italian"], intuito: ["italian"], inumidire: ["italian"], invalido: ["italian"], invece: ["italian"], invito: ["italian"], iperbole: ["italian"], ipnotico: ["italian"], ipotesi: ["italian"], ippica: ["italian"], iride: ["italian"], irlanda: ["italian"], ironico: ["italian"], irrigato: ["italian"], irrorare: ["italian"], isolato: ["italian"], isotopo: ["italian"], isterico: ["italian"], istituto: ["italian"], istrice: ["italian"], italia: ["italian"], iterare: ["italian"], labbro: ["italian"], labirinto: ["italian"], lacca: ["italian"], lacerato: ["italian"], lacrima: ["italian"], lacuna: ["italian"], laddove: ["italian"], lago: ["italian"], lampo: ["italian"], lancetta: ["italian"], lanterna: ["italian"], lardoso: ["italian"], larga: ["italian"], laringe: ["italian"], lastra: ["italian"], latenza: ["italian"], latino: ["italian"], lattuga: ["italian"], lavagna: ["italian"], lavoro: ["italian"], legale: ["italian"], leggero: ["italian"], lembo: ["italian"], lentezza: ["italian"], lenza: ["italian"], leone: ["italian"], lepre: ["italian"], lesivo: ["italian"], lessato: ["italian"], lesto: ["italian"], letterale: ["italian"], leva: ["italian"], levigato: ["italian"], libero: ["italian"], lido: ["italian"], lievito: ["italian"], lilla: ["italian"], limatura: ["italian"], limitare: ["italian"], limpido: ["italian"], lineare: ["italian"], lingua: ["italian"], liquido: ["italian"], lira: ["italian"], lirica: ["italian"], lisca: ["italian"], lite: ["italian"], litigio: ["italian"], livrea: ["italian"], locanda: ["italian"], lode: ["italian"], logica: ["italian"], lombare: ["italian"], londra: ["italian"], longevo: ["italian"], loquace: ["italian"], lorenzo: ["italian"], loto: ["italian"], lotteria: ["italian"], luce: ["italian"], lucidato: ["italian"], lumaca: ["italian"], luminoso: ["italian"], lungo: ["italian"], lupo: ["italian"], luppolo: ["italian"], lusinga: ["italian"], lusso: ["italian"], lutto: ["italian"], macabro: ["italian"], macchina: ["italian"], macero: ["italian"], macinato: ["italian"], madama: ["italian"], magico: ["italian"], maglia: ["italian"], magnete: ["italian"], magro: ["italian"], maiolica: ["italian"], malafede: ["italian"], malgrado: ["italian"], malinteso: ["italian"], malsano: ["italian"], malto: ["italian"], malumore: ["italian"], mana: ["italian"], mancia: ["italian"], mandorla: ["italian"], mangiare: ["italian"], manifesto: ["italian"], mannaro: ["italian"], manovra: ["italian"], mansarda: ["italian"], mantide: ["italian"], manubrio: ["italian"], mappa: ["italian"], maratona: ["italian"], marcire: ["italian"], maretta: ["italian"], marmo: ["italian"], marsupio: ["italian"], maschera: ["italian"], massaia: ["italian"], mastino: ["italian"], materasso: ["italian"], matricola: ["italian"], mattone: ["italian"], maturo: ["italian"], mazurca: ["italian"], meandro: ["italian"], meccanico: ["italian"], mecenate: ["italian"], medesimo: ["italian"], meditare: ["italian"], mega: ["italian"], melassa: ["italian"], melis: ["italian"], melodia: ["italian"], meninge: ["italian"], meno: ["italian"], mensola: ["italian"], mercurio: ["italian"], merenda: ["italian"], merlo: ["italian"], meschino: ["italian"], mese: ["italian"], messere: ["italian"], mestolo: ["italian"], metallo: ["italian"], metodo: ["italian"], mettere: ["italian"], miagolare: ["italian"], mica: ["italian"], micelio: ["italian"], michele: ["italian"], microbo: ["italian"], midollo: ["italian"], miele: ["italian"], migliore: ["italian"], milano: ["italian"], milite: ["italian"], mimosa: ["italian"], minerale: ["italian"], mini: ["italian"], minore: ["italian"], mirino: ["italian"], mirtillo: ["italian"], miscela: ["italian"], missiva: ["italian"], misto: ["italian"], misurare: ["italian"], mitezza: ["italian"], mitigare: ["italian"], mitra: ["italian"], mittente: ["italian"], mnemonico: ["italian"], modello: ["italian"], modifica: ["italian"], modulo: ["italian"], mogano: ["italian"], mogio: ["italian"], mole: ["italian"], molosso: ["italian"], monastero: ["italian"], monco: ["italian"], mondina: ["italian"], monetario: ["italian"], monile: ["italian"], monotono: ["italian"], monsone: ["italian"], montato: ["italian"], monviso: ["italian"], mora: ["italian"], mordere: ["italian"], morsicato: ["italian"], mostro: ["italian"], motivato: ["italian"], motosega: ["italian"], motto: ["italian"], movenza: ["italian"], movimento: ["italian"], mozzo: ["italian"], mucca: ["italian"], mucosa: ["italian"], muffa: ["italian"], mughetto: ["italian"], mugnaio: ["italian"], mulatto: ["italian"], mulinello: ["italian"], multiplo: ["italian"], mummia: ["italian"], munto: ["italian"], muovere: ["italian"], murale: ["italian"], musa: ["italian"], muscolo: ["italian"], musica: ["italian"], mutevole: ["italian"], muto: ["italian"], nababbo: ["italian"], nafta: ["italian"], nanometro: ["italian"], narciso: ["italian"], narice: ["italian"], narrato: ["italian"], nascere: ["italian"], nastrare: ["italian"], naturale: ["italian"], nautica: ["italian"], naviglio: ["italian"], nebulosa: ["italian"], necrosi: ["italian"], negativo: ["italian"], negozio: ["italian"], nemmeno: ["italian"], neofita: ["italian"], neretto: ["italian"], nervo: ["italian"], nessuno: ["italian"], nettuno: ["italian"], neutrale: ["italian"], neve: ["italian"], nevrotico: ["italian"], nicchia: ["italian"], ninfa: ["italian"], nitido: ["italian"], nobile: ["italian"], nocivo: ["italian"], nodo: ["italian"], nome: ["italian"], nomina: ["italian"], nordico: ["italian"], normale: ["italian"], norvegese: ["italian"], nostrano: ["italian"], notare: ["italian"], notizia: ["italian"], notturno: ["italian"], novella: ["italian"], nucleo: ["italian"], nulla: ["italian"], numero: ["italian"], nuovo: ["italian"], nutrire: ["italian"], nuvola: ["italian"], nuziale: ["italian"], oasi: ["italian"], obbedire: ["italian"], obbligo: ["italian"], obelisco: ["italian"], oblio: ["italian"], obolo: ["italian"], obsoleto: ["italian"], occasione: ["italian"], occhio: ["italian"], occidente: ["italian"], occorrere: ["italian"], occultare: ["italian"], ocra: ["italian"], oculato: ["italian"], odierno: ["italian"], odorare: ["italian"], offerta: ["italian"], offrire: ["italian"], offuscato: ["italian"], oggetto: ["italian"], oggi: ["italian"], ognuno: ["italian"], olandese: ["italian"], olfatto: ["italian"], oliato: ["italian"], oliva: ["italian"], ologramma: ["italian"], oltre: ["italian"], omaggio: ["italian"], ombelico: ["italian"], ombra: ["italian"], omega: ["italian"], omissione: ["italian"], ondoso: ["italian"], onere: ["italian"], onice: ["italian"], onnivoro: ["italian"], onorevole: ["italian"], onta: ["italian"], operato: ["italian"], opinione: ["italian"], opposto: ["italian"], oracolo: ["italian"], orafo: ["italian"], ordine: ["italian"], orecchino: ["italian"], orefice: ["italian"], orfano: ["italian"], organico: ["italian"], origine: ["italian"], orizzonte: ["italian"], orma: ["italian"], ormeggio: ["italian"], ornativo: ["italian"], orologio: ["italian"], orrendo: ["italian"], orribile: ["italian"], ortensia: ["italian"], ortica: ["italian"], orzata: ["italian"], orzo: ["italian"], osare: ["italian"], oscurare: ["italian"], osmosi: ["italian"], ospedale: ["italian"], ospite: ["italian"], ossa: ["italian"], ossidare: ["italian"], ostacolo: ["italian"], oste: ["italian"], otite: ["italian"], otre: ["italian"], ottagono: ["italian"], ottimo: ["italian"], ottobre: ["italian"], ovale: ["italian"], ovest: ["italian"], ovino: ["italian"], oviparo: ["italian"], ovocito: ["italian"], ovunque: ["italian"], ovviare: ["italian"], ozio: ["italian"], pacchetto: ["italian"], pace: ["italian"], pacifico: ["italian"], padella: ["italian"], padrone: ["italian"], paese: ["italian"], paga: ["italian"], pagina: ["italian"], palazzina: ["italian"], palesare: ["italian"], pallido: ["italian"], palo: ["italian"], palude: ["italian"], pandoro: ["italian"], pannello: ["italian"], paolo: ["italian"], paonazzo: ["italian"], paprica: ["italian"], parabola: ["italian"], parcella: ["italian"], parere: ["italian"], pargolo: ["italian"], pari: ["italian"], parlato: ["italian"], parola: ["italian"], partire: ["italian"], parvenza: ["italian"], parziale: ["italian"], passivo: ["italian"], pasticca: ["italian"], patacca: ["italian"], patologia: ["italian"], pattume: ["italian"], pavone: ["italian"], peccato: ["italian"], pedalare: ["italian"], pedonale: ["italian"], peggio: ["italian"], peloso: ["italian"], penare: ["italian"], pendice: ["italian"], penisola: ["italian"], pennuto: ["italian"], penombra: ["italian"], pensare: ["italian"], pentola: ["italian"], pepe: ["italian"], pepita: ["italian"], perbene: ["italian"], percorso: ["italian"], perdonato: ["italian"], perforare: ["italian"], pergamena: ["italian"], periodo: ["italian"], permesso: ["italian"], perno: ["italian"], perplesso: ["italian"], persuaso: ["italian"], pertugio: ["italian"], pervaso: ["italian"], pesatore: ["italian"], pesista: ["italian"], peso: ["italian"], pestifero: ["italian"], petalo: ["italian"], pettine: ["italian"], petulante: ["italian"], pezzo: ["italian"], piacere: ["italian"], pianta: ["italian"], piattino: ["italian"], piccino: ["italian"], picozza: ["italian"], piega: ["italian"], pietra: ["italian"], piffero: ["italian"], pigiama: ["italian"], pigolio: ["italian"], pigro: ["italian"], pila: ["italian"], pilifero: ["italian"], pillola: ["italian"], pilota: ["italian"], pimpante: ["italian"], pineta: ["italian"], pinna: ["italian"], pinolo: ["italian"], pioggia: ["italian"], piombo: ["italian"], piramide: ["italian"], piretico: ["italian"], pirite: ["italian"], pirolisi: ["italian"], pitone: ["italian"], pizzico: ["italian"], placebo: ["italian"], planare: ["italian"], plasma: ["italian"], platano: ["italian"], plenario: ["italian"], pochezza: ["italian"], poderoso: ["italian"], podismo: ["italian"], poesia: ["italian"], poggiare: ["italian"], polenta: ["italian"], poligono: ["italian"], pollice: ["italian"], polmonite: ["italian"], polpetta: ["italian"], polso: ["italian"], poltrona: ["italian"], polvere: ["italian"], pomice: ["italian"], pomodoro: ["italian"], ponte: ["italian"], popoloso: ["italian"], porfido: ["italian"], poroso: ["italian"], porpora: ["italian"], porre: ["italian"], portata: ["italian"], posa: ["italian", "turkish"], positivo: ["italian"], possesso: ["italian"], postulato: ["italian"], potassio: ["italian"], potere: ["italian"], pranzo: ["italian"], prassi: ["italian"], pratica: ["italian"], precluso: ["italian"], predica: ["italian"], prefisso: ["italian"], pregiato: ["italian"], prelievo: ["italian"], premere: ["italian"], prenotare: ["italian"], preparato: ["italian"], presenza: ["italian"], pretesto: ["italian"], prevalso: ["italian"], prima: ["italian"], principe: ["italian"], privato: ["italian"], problema: ["italian"], procura: ["italian"], produrre: ["italian"], profumo: ["italian"], progetto: ["italian"], prolunga: ["italian"], promessa: ["italian"], pronome: ["italian"], proposta: ["italian"], proroga: ["italian"], proteso: ["italian"], prova: ["italian", "turkish"], prudente: ["italian"], prugna: ["italian"], prurito: ["italian"], psiche: ["italian"], pubblico: ["italian"], pudica: ["italian"], pugilato: ["italian"], pugno: ["italian"], pulce: ["italian"], pulito: ["italian"], pulsante: ["italian"], puntare: ["italian"], pupazzo: ["italian"], pupilla: ["italian"], puro: ["italian"], quadro: ["italian"], qualcosa: ["italian"], quasi: ["italian"], querela: ["italian"], quota: ["italian"], raccolto: ["italian"], raddoppio: ["italian"], radicale: ["italian"], radunato: ["italian"], raffica: ["italian"], ragazzo: ["italian"], ragione: ["italian"], ragno: ["italian"], ramarro: ["italian"], ramingo: ["italian"], ramo: ["italian"], randagio: ["italian"], rantolare: ["italian"], rapato: ["italian"], rapina: ["italian"], rappreso: ["italian"], rasatura: ["italian"], raschiato: ["italian"], rasente: ["italian"], rassegna: ["italian"], rastrello: ["italian"], rata: ["italian"], ravveduto: ["italian"], reale: ["italian"], recepire: ["italian"], recinto: ["italian"], recluta: ["italian"], recondito: ["italian"], recupero: ["italian"], reddito: ["italian"], redimere: ["italian"], regalato: ["italian"], registro: ["italian"], regola: ["italian"], regresso: ["italian"], relazione: ["italian"], remare: ["italian"], remoto: ["italian"], renna: ["italian"], replica: ["italian"], reprimere: ["italian"], reputare: ["italian"], resa: ["italian"], residente: ["italian"], responso: ["italian"], restauro: ["italian"], rete: ["italian"], retina: ["italian"], retorica: ["italian"], rettifica: ["italian"], revocato: ["italian"], riassunto: ["italian"], ribadire: ["italian"], ribelle: ["italian"], ribrezzo: ["italian"], ricarica: ["italian"], ricco: ["italian"], ricevere: ["italian"], riciclato: ["italian"], ricordo: ["italian"], ricreduto: ["italian"], ridicolo: ["italian"], ridurre: ["italian"], rifasare: ["italian"], riflesso: ["italian"], riforma: ["italian"], rifugio: ["italian"], rigare: ["italian"], rigettato: ["italian"], righello: ["italian"], rilassato: ["italian"], rilevato: ["italian"], rimanere: ["italian"], rimbalzo: ["italian"], rimedio: ["italian"], rimorchio: ["italian"], rinascita: ["italian"], rincaro: ["italian"], rinforzo: ["italian"], rinnovo: ["italian"], rinomato: ["italian"], rinsavito: ["italian"], rintocco: ["italian"], rinuncia: ["italian"], rinvenire: ["italian"], riparato: ["italian"], ripetuto: ["italian"], ripieno: ["italian"], riportare: ["italian"], ripresa: ["italian"], ripulire: ["italian"], risata: ["italian"], rischio: ["italian"], riserva: ["italian"], risibile: ["italian"], riso: ["italian"], rispetto: ["italian"], ristoro: ["italian"], risultato: ["italian"], risvolto: ["italian"], ritardo: ["italian"], ritegno: ["italian"], ritmico: ["italian"], ritrovo: ["italian"], riunione: ["italian"], riva: ["italian"], riverso: ["italian"], rivincita: ["italian"], rivolto: ["italian"], rizoma: ["italian"], roba: ["italian"], robotico: ["italian"], robusto: ["italian"], roccia: ["italian"], roco: ["italian"], rodaggio: ["italian"], rodere: ["italian"], roditore: ["italian"], rogito: ["italian"], rollio: ["italian"], romantico: ["italian"], rompere: ["italian"], ronzio: ["italian"], rosolare: ["italian"], rospo: ["italian"], rotante: ["italian"], rotondo: ["italian"], rotula: ["italian"], rovescio: ["italian"], rubizzo: ["italian"], rubrica: ["italian"], ruga: ["italian"], rullino: ["italian"], rumine: ["italian"], rumoroso: ["italian"], ruolo: ["italian"], rupe: ["italian"], russare: ["italian"], rustico: ["italian"], sabato: ["italian"], sabbiare: ["italian"], sabotato: ["italian"], sagoma: ["italian"], salasso: ["italian"], saldatura: ["italian"], salgemma: ["italian"], salivare: ["italian"], salmone: ["italian"], salone: ["italian"], saltare: ["italian"], saluto: ["italian"], salvo: ["italian"], sapere: ["italian"], sapido: ["italian"], saporito: ["italian"], saraceno: ["italian"], sarcasmo: ["italian"], sarto: ["italian"], sassoso: ["italian"], satellite: ["italian"], satira: ["italian"], satollo: ["italian"], saturno: ["italian"], savana: ["italian"], savio: ["italian"], saziato: ["italian"], sbadiglio: ["italian"], sbalzo: ["italian"], sbancato: ["italian"], sbarra: ["italian"], sbattere: ["italian"], sbavare: ["italian"], sbendare: ["italian"], sbirciare: ["italian"], sbloccato: ["italian"], sbocciato: ["italian"], sbrinare: ["italian"], sbruffone: ["italian"], sbuffare: ["italian"], scabroso: ["italian"], scadenza: ["italian"], scala: ["italian"], scambiare: ["italian"], scandalo: ["italian"], scapola: ["italian"], scarso: ["italian"], scatenare: ["italian"], scavato: ["italian"], scelto: ["italian"], scenico: ["italian"], scettro: ["italian"], scheda: ["italian"], schiena: ["italian"], sciarpa: ["italian"], scienza: ["italian"], scindere: ["italian"], scippo: ["italian"], sciroppo: ["italian"], scivolo: ["italian"], sclerare: ["italian"], scodella: ["italian"], scolpito: ["italian"], scomparto: ["italian"], sconforto: ["italian"], scoprire: ["italian"], scorta: ["italian"], scossone: ["italian"], scozzese: ["italian"], scriba: ["italian"], scrollare: ["italian"], scrutinio: ["italian"], scuderia: ["italian"], scultore: ["italian"], scuola: ["italian"], scuro: ["italian"], scusare: ["italian"], sdebitare: ["italian"], sdoganare: ["italian"], seccatura: ["italian"], secondo: ["italian"], sedano: ["italian"], seggiola: ["italian"], segnalato: ["italian"], segregato: ["italian"], seguito: ["italian"], selciato: ["italian"], selettivo: ["italian"], sella: ["italian"], selvaggio: ["italian"], semaforo: ["italian"], sembrare: ["italian"], seme: ["italian"], seminato: ["italian"], sempre: ["italian"], senso: ["italian"], sentire: ["italian"], sepolto: ["italian"], sequenza: ["italian"], serata: ["italian"], serbato: ["italian"], sereno: ["italian"], serio: ["italian"], serpente: ["italian"], serraglio: ["italian"], servire: ["italian"], sestina: ["italian"], setola: ["italian"], settimana: ["italian"], sfacelo: ["italian"], sfaldare: ["italian"], sfamato: ["italian"], sfarzoso: ["italian"], sfaticato: ["italian"], sfera: ["italian"], sfida: ["italian"], sfilato: ["italian"], sfinge: ["italian"], sfocato: ["italian"], sfoderare: ["italian"], sfogo: ["italian"], sfoltire: ["italian"], sforzato: ["italian"], sfratto: ["italian"], sfruttato: ["italian"], sfuggito: ["italian"], sfumare: ["italian"], sfuso: ["italian"], sgabello: ["italian"], sgarbato: ["italian"], sgonfiare: ["italian"], sgorbio: ["italian"], sgrassato: ["italian"], sguardo: ["italian"], sibilo: ["italian"], siccome: ["italian"], sierra: ["italian"], sigla: ["italian"], signore: ["italian"], silenzio: ["italian"], sillaba: ["italian"], simbolo: ["italian"], simpatico: ["italian"], simulato: ["italian"], sinfonia: ["italian"], singolo: ["italian"], sinistro: ["italian"], sino: ["italian"], sintesi: ["italian"], sinusoide: ["italian"], sipario: ["italian"], sisma: ["italian"], sistole: ["italian"], situato: ["italian"], slitta: ["italian"], slogatura: ["italian"], sloveno: ["italian"], smarrito: ["italian"], smemorato: ["italian"], smentito: ["italian"], smeraldo: ["italian"], smilzo: ["italian"], smontare: ["italian"], smottato: ["italian"], smussato: ["italian"], snellire: ["italian"], snervato: ["italian"], snodo: ["italian"], sobbalzo: ["italian"], sobrio: ["italian"], soccorso: ["italian"], sociale: ["italian"], sodale: ["italian"], soffitto: ["italian"], sogno: ["italian"], soldato: ["italian"], solenne: ["italian"], solido: ["italian"], sollazzo: ["italian"], solo: ["italian"], solubile: ["italian"], solvente: ["italian"], somatico: ["italian"], somma: ["italian"], sonda: ["italian"], sonetto: ["italian"], sonnifero: ["italian"], sopire: ["italian"], soppeso: ["italian"], sopra: ["italian"], sorgere: ["italian"], sorpasso: ["italian"], sorriso: ["italian"], sorso: ["italian"], sorteggio: ["italian"], sorvolato: ["italian"], sospiro: ["italian"], sosta: ["italian"], sottile: ["italian"], spada: ["italian"], spalla: ["italian"], spargere: ["italian"], spatola: ["italian"], spavento: ["italian"], spazzola: ["italian"], specie: ["italian"], spedire: ["italian"], spegnere: ["italian"], spelatura: ["italian"], speranza: ["italian"], spessore: ["italian"], spettrale: ["italian"], spezzato: ["italian"], spia: ["italian"], spigoloso: ["italian"], spillato: ["italian"], spinoso: ["italian"], spirale: ["italian"], splendido: ["italian"], sportivo: ["italian"], sposo: ["italian"], spranga: ["italian"], sprecare: ["italian"], spronato: ["italian"], spruzzo: ["italian"], spuntino: ["italian"], squillo: ["italian"], sradicare: ["italian"], srotolato: ["italian"], stabile: ["italian"], stacco: ["italian"], staffa: ["italian"], stagnare: ["italian"], stampato: ["italian"], stantio: ["italian"], starnuto: ["italian"], stasera: ["italian"], statuto: ["italian"], stelo: ["italian"], steppa: ["italian"], sterzo: ["italian"], stiletto: ["italian"], stima: ["italian"], stirpe: ["italian"], stivale: ["italian"], stizzoso: ["italian"], stonato: ["italian"], storico: ["italian"], strappo: ["italian"], stregato: ["italian"], stridulo: ["italian"], strozzare: ["italian"], strutto: ["italian"], stuccare: ["italian"], stufo: ["italian"], stupendo: ["italian"], subentro: ["italian"], succoso: ["italian"], sudore: ["italian"], suggerito: ["italian"], sugo: ["italian"], sultano: ["italian"], suonare: ["italian"], superbo: ["italian"], supporto: ["italian"], surgelato: ["italian"], surrogato: ["italian"], sussurro: ["italian"], sutura: ["italian"], svagare: ["italian"], svedese: ["italian"], sveglio: ["italian"], svelare: ["italian"], svenuto: ["italian"], svezia: ["italian"], sviluppo: ["italian"], svista: ["italian"], svizzera: ["italian"], svolta: ["italian"], svuotare: ["italian"], tabacco: ["italian"], tabulato: ["italian"], tacciare: ["italian"], taciturno: ["italian"], tale: ["italian"], talismano: ["italian"], tampone: ["italian"], tannino: ["italian"], tara: ["italian"], tardivo: ["italian"], targato: ["italian"], tariffa: ["italian"], tarpare: ["italian"], tartaruga: ["italian"], tasto: ["italian"], tattico: ["italian"], taverna: ["italian"], tavolata: ["italian"], tazza: ["italian"], teca: ["italian"], tecnico: ["italian"], telefono: ["italian"], temerario: ["italian"], tempo: ["italian", "turkish"], temuto: ["italian"], tendone: ["italian"], tenero: ["italian"], tensione: ["italian"], tentacolo: ["italian"], teorema: ["italian"], terme: ["italian"], terrazzo: ["italian"], terzetto: ["italian"], tesi: ["italian"], tesserato: ["italian"], testato: ["italian"], tetro: ["italian"], tettoia: ["italian"], tifare: ["italian"], tigella: ["italian"], timbro: ["italian"], tinto: ["italian"], tipico: ["italian"], tipografo: ["italian"], tiraggio: ["italian"], tiro: ["italian"], titanio: ["italian"], titolo: ["italian"], titubante: ["italian"], tizio: ["italian"], tizzone: ["italian"], toccare: ["italian"], tollerare: ["italian"], tolto: ["italian"], tombola: ["italian"], tomo: ["italian"], tonfo: ["italian"], tonsilla: ["italian"], topazio: ["italian"], topologia: ["italian"], toppa: ["italian"], torba: ["italian"], tornare: ["italian"], torrone: ["italian"], tortora: ["italian"], toscano: ["italian"], tossire: ["italian"], tostatura: ["italian"], totano: ["italian"], trabocco: ["italian"], trachea: ["italian"], trafila: ["italian"], tragedia: ["italian"], tralcio: ["italian"], tramonto: ["italian"], transito: ["italian"], trapano: ["italian"], trarre: ["italian"], trasloco: ["italian"], trattato: ["italian"], trave: ["italian"], treccia: ["italian"], tremolio: ["italian"], trespolo: ["italian"], tributo: ["italian"], tricheco: ["italian"], trifoglio: ["italian"], trillo: ["italian"], trincea: ["italian"], trio: ["italian"], tristezza: ["italian"], triturato: ["italian"], trivella: ["italian"], tromba: ["italian"], trono: ["italian"], troppo: ["italian"], trottola: ["italian"], trovare: ["italian"], truccato: ["italian"], tubatura: ["italian"], tuffato: ["italian"], tulipano: ["italian"], tumulto: ["italian"], tunisia: ["italian"], turbare: ["italian"], turchino: ["italian"], tuta: ["italian"], tutela: ["italian"], ubicato: ["italian"], uccello: ["italian"], uccisore: ["italian"], udire: ["italian"], uditivo: ["italian"], uffa: ["italian"], ufficio: ["italian"], uguale: ["italian"], ulisse: ["italian"], ultimato: ["italian"], umano: ["italian"], umile: ["italian"], umorismo: ["italian"], uncinetto: ["italian"], ungere: ["italian"], ungherese: ["italian"], unicorno: ["italian"], unificato: ["italian"], unisono: ["italian"], unitario: ["italian"], unte: ["italian"], uovo: ["italian"], upupa: ["italian"], uragano: ["italian"], urgenza: ["italian"], urlo: ["italian"], usanza: ["italian"], usato: ["italian"], uscito: ["italian"], usignolo: ["italian"], usuraio: ["italian"], utensile: ["italian"], utilizzo: ["italian"], utopia: ["italian"], vacante: ["italian"], vaccinato: ["italian"], vagabondo: ["italian"], vagliato: ["italian"], valanga: ["italian"], valgo: ["italian"], valico: ["italian"], valletta: ["italian"], valoroso: ["italian"], valutare: ["italian"], valvola: ["italian"], vampata: ["italian"], vangare: ["italian"], vanitoso: ["italian"], vano: ["italian"], vantaggio: ["italian"], vanvera: ["italian"], vapore: ["italian"], varano: ["italian"], varcato: ["italian"], variante: ["italian"], vasca: ["italian"], vedetta: ["italian"], vedova: ["italian"], veduto: ["italian"], vegetale: ["italian"], veicolo: ["italian"], velcro: ["italian"], velina: ["italian"], velluto: ["italian"], veloce: ["italian"], venato: ["italian"], vendemmia: ["italian"], vento: ["italian"], verace: ["italian"], verbale: ["italian"], vergogna: ["italian"], verifica: ["italian"], vero: ["italian"], verruca: ["italian"], verticale: ["italian"], vescica: ["italian"], vessillo: ["italian"], vestale: ["italian"], veterano: ["italian"], vetrina: ["italian"], vetusto: ["italian"], viandante: ["italian"], vibrante: ["italian"], vicenda: ["italian"], vichingo: ["italian"], vicinanza: ["italian"], vidimare: ["italian"], vigilia: ["italian"], vigneto: ["italian"], vigore: ["italian"], vile: ["italian"], villano: ["italian"], vimini: ["italian"], vincitore: ["italian"], viola: ["italian"], vipera: ["italian"], virgola: ["italian"], virologo: ["italian"], virulento: ["italian"], viscoso: ["italian"], visione: ["italian"], vispo: ["italian"], vissuto: ["italian"], visura: ["italian"], vita: ["italian"], vitello: ["italian"], vittima: ["italian"], vivanda: ["italian"], vivido: ["italian"], viziare: ["italian"], voce: ["italian"], voga: ["italian"], volatile: ["italian"], volere: ["italian"], volpe: ["italian"], voragine: ["italian"], vulcano: ["italian"], zampogna: ["italian"], zanna: ["italian"], zappato: ["italian"], zattera: ["italian"], zavorra: ["italian"], zefiro: ["italian"], zelante: ["italian"], zelo: ["italian"], zenzero: ["italian"], zerbino: ["italian"], zibetto: ["italian"], zinco: ["italian"], zircone: ["italian"], zitto: ["italian"], zolla: ["italian"], zotico: ["italian"], zucchero: ["italian"], zufolo: ["italian"], zulu: ["italian"], zuppa: ["italian"], \u3042\u3044\u3053\u304F\u3057\u3093: ["japanese"], \u3042\u3044\u3055\u3064: ["japanese"], \u3042\u3044\u305F\u3099: ["japanese"], \u3042\u304A\u305D\u3099\u3089: ["japanese"], \u3042\u304B\u3061\u3083\u3093: ["japanese"], \u3042\u304D\u308B: ["japanese"], \u3042\u3051\u304B\u3099\u305F: ["japanese"], \u3042\u3051\u308B: ["japanese"], \u3042\u3053\u304B\u3099\u308C\u308B: ["japanese"], \u3042\u3055\u3044: ["japanese"], \u3042\u3055\u3072: ["japanese"], \u3042\u3057\u3042\u3068: ["japanese"], \u3042\u3057\u3099\u308F\u3046: ["japanese"], \u3042\u3059\u3099\u304B\u308B: ["japanese"], \u3042\u3059\u3099\u304D: ["japanese"], \u3042\u305D\u3075\u3099: ["japanese"], \u3042\u305F\u3048\u308B: ["japanese"], \u3042\u305F\u305F\u3081\u308B: ["japanese"], \u3042\u305F\u308A\u307E\u3048: ["japanese"], \u3042\u305F\u308B: ["japanese"], \u3042\u3064\u3044: ["japanese"], \u3042\u3064\u304B\u3046: ["japanese"], \u3042\u3063\u3057\u3085\u304F: ["japanese"], \u3042\u3064\u307E\u308A: ["japanese"], \u3042\u3064\u3081\u308B: ["japanese"], \u3042\u3066\u306A: ["japanese"], \u3042\u3066\u306F\u307E\u308B: ["japanese"], \u3042\u3072\u308B: ["japanese"], \u3042\u3075\u3099\u3089: ["japanese"], \u3042\u3075\u3099\u308B: ["japanese"], \u3042\u3075\u308C\u308B: ["japanese"], \u3042\u307E\u3044: ["japanese"], \u3042\u307E\u3068\u3099: ["japanese"], \u3042\u307E\u3084\u304B\u3059: ["japanese"], \u3042\u307E\u308A: ["japanese"], \u3042\u307F\u3082\u306E: ["japanese"], \u3042\u3081\u308A\u304B: ["japanese"], \u3042\u3084\u307E\u308B: ["japanese"], \u3042\u3086\u3080: ["japanese"], \u3042\u3089\u3044\u304F\u3099\u307E: ["japanese"], \u3042\u3089\u3057: ["japanese"], \u3042\u3089\u3059\u3057\u3099: ["japanese"], \u3042\u3089\u305F\u3081\u308B: ["japanese"], \u3042\u3089\u3086\u308B: ["japanese"], \u3042\u3089\u308F\u3059: ["japanese"], \u3042\u308A\u304B\u3099\u3068\u3046: ["japanese"], \u3042\u308F\u305B\u308B: ["japanese"], \u3042\u308F\u3066\u308B: ["japanese"], \u3042\u3093\u3044: ["japanese"], \u3042\u3093\u304B\u3099\u3044: ["japanese"], \u3042\u3093\u3053: ["japanese"], \u3042\u3093\u305B\u3099\u3093: ["japanese"], \u3042\u3093\u3066\u3044: ["japanese"], \u3042\u3093\u306A\u3044: ["japanese"], \u3042\u3093\u307E\u308A: ["japanese"], \u3044\u3044\u305F\u3099\u3059: ["japanese"], \u3044\u304A\u3093: ["japanese"], \u3044\u304B\u3099\u3044: ["japanese"], \u3044\u304B\u3099\u304F: ["japanese"], \u3044\u304D\u304A\u3044: ["japanese"], \u3044\u304D\u306A\u308A: ["japanese"], \u3044\u304D\u3082\u306E: ["japanese"], \u3044\u304D\u308B: ["japanese"], \u3044\u304F\u3057\u3099: ["japanese"], \u3044\u304F\u3075\u3099\u3093: ["japanese"], \u3044\u3051\u306F\u3099\u306A: ["japanese"], \u3044\u3051\u3093: ["japanese"], \u3044\u3053\u3046: ["japanese"], \u3044\u3053\u304F: ["japanese"], \u3044\u3053\u3064: ["japanese"], \u3044\u3055\u307E\u3057\u3044: ["japanese"], \u3044\u3055\u3093: ["japanese"], \u3044\u3057\u304D: ["japanese"], \u3044\u3057\u3099\u3085\u3046: ["japanese"], \u3044\u3057\u3099\u3087\u3046: ["japanese"], \u3044\u3057\u3099\u308F\u308B: ["japanese"], \u3044\u3059\u3099\u307F: ["japanese"], \u3044\u3059\u3099\u308C: ["japanese"], \u3044\u305B\u3044: ["japanese"], \u3044\u305B\u3048\u3072\u3099: ["japanese"], \u3044\u305B\u304B\u3044: ["japanese"], \u3044\u305B\u304D: ["japanese"], \u3044\u305B\u3099\u3093: ["japanese"], \u3044\u305D\u3046\u308D\u3046: ["japanese"], \u3044\u305D\u304B\u3099\u3057\u3044: ["japanese"], \u3044\u305F\u3099\u3044: ["japanese"], \u3044\u305F\u3099\u304F: ["japanese"], \u3044\u305F\u3059\u3099\u3089: ["japanese"], \u3044\u305F\u307F: ["japanese"], \u3044\u305F\u308A\u3042: ["japanese"], \u3044\u3061\u304A\u3046: ["japanese"], \u3044\u3061\u3057\u3099: ["japanese"], \u3044\u3061\u3068\u3099: ["japanese"], \u3044\u3061\u306F\u3099: ["japanese"], \u3044\u3061\u3075\u3099: ["japanese"], \u3044\u3061\u308A\u3085\u3046: ["japanese"], \u3044\u3064\u304B: ["japanese"], \u3044\u3063\u3057\u3085\u3093: ["japanese"], \u3044\u3063\u305B\u3044: ["japanese"], \u3044\u3063\u305D\u3046: ["japanese"], \u3044\u3063\u305F\u3093: ["japanese"], \u3044\u3063\u3061: ["japanese"], \u3044\u3063\u3066\u3044: ["japanese"], \u3044\u3063\u307B\u309A\u3046: ["japanese"], \u3044\u3066\u3055\u3099: ["japanese"], \u3044\u3066\u3093: ["japanese"], \u3044\u3068\u3099\u3046: ["japanese"], \u3044\u3068\u3053: ["japanese"], \u3044\u306A\u3044: ["japanese"], \u3044\u306A\u304B: ["japanese"], \u3044\u306D\u3080\u308A: ["japanese"], \u3044\u306E\u3061: ["japanese"], \u3044\u306E\u308B: ["japanese"], \u3044\u306F\u3064: ["japanese"], \u3044\u306F\u3099\u308B: ["japanese"], \u3044\u306F\u3093: ["japanese"], \u3044\u3072\u3099\u304D: ["japanese"], \u3044\u3072\u3093: ["japanese"], \u3044\u3075\u304F: ["japanese"], \u3044\u3078\u3093: ["japanese"], \u3044\u307B\u3046: ["japanese"], \u3044\u307F\u3093: ["japanese"], \u3044\u3082\u3046\u3068: ["japanese"], \u3044\u3082\u305F\u308C: ["japanese"], \u3044\u3082\u308A: ["japanese"], \u3044\u3084\u304B\u3099\u308B: ["japanese"], \u3044\u3084\u3059: ["japanese"], \u3044\u3088\u304B\u3093: ["japanese"], \u3044\u3088\u304F: ["japanese"], \u3044\u3089\u3044: ["japanese"], \u3044\u3089\u3059\u3068: ["japanese"], \u3044\u308A\u304F\u3099\u3061: ["japanese"], \u3044\u308A\u3087\u3046: ["japanese"], \u3044\u308C\u3044: ["japanese"], \u3044\u308C\u3082\u306E: ["japanese"], \u3044\u308C\u308B: ["japanese"], \u3044\u308D\u3048\u3093\u3072\u309A\u3064: ["japanese"], \u3044\u308F\u3044: ["japanese"], \u3044\u308F\u3046: ["japanese"], \u3044\u308F\u304B\u3093: ["japanese"], \u3044\u308F\u306F\u3099: ["japanese"], \u3044\u308F\u3086\u308B: ["japanese"], \u3044\u3093\u3051\u3099\u3093\u307E\u3081: ["japanese"], \u3044\u3093\u3055\u3064: ["japanese"], \u3044\u3093\u3057\u3087\u3046: ["japanese"], \u3044\u3093\u3088\u3046: ["japanese"], \u3046\u3048\u304D: ["japanese"], \u3046\u3048\u308B: ["japanese"], \u3046\u304A\u3055\u3099: ["japanese"], \u3046\u304B\u3099\u3044: ["japanese"], \u3046\u304B\u3075\u3099: ["japanese"], \u3046\u304B\u3078\u3099\u308B: ["japanese"], \u3046\u304D\u308F: ["japanese"], \u3046\u304F\u3089\u3044\u306A: ["japanese"], \u3046\u304F\u308C\u308C: ["japanese"], \u3046\u3051\u305F\u307E\u308F\u308B: ["japanese"], \u3046\u3051\u3064\u3051: ["japanese"], \u3046\u3051\u3068\u308B: ["japanese"], \u3046\u3051\u3082\u3064: ["japanese"], \u3046\u3051\u308B: ["japanese"], \u3046\u3053\u3099\u304B\u3059: ["japanese"], \u3046\u3053\u3099\u304F: ["japanese"], \u3046\u3053\u3093: ["japanese"], \u3046\u3055\u304D\u3099: ["japanese"], \u3046\u3057\u306A\u3046: ["japanese"], \u3046\u3057\u308D\u304B\u3099\u307F: ["japanese"], \u3046\u3059\u3044: ["japanese"], \u3046\u3059\u304D\u3099: ["japanese"], \u3046\u3059\u304F\u3099\u3089\u3044: ["japanese"], \u3046\u3059\u3081\u308B: ["japanese"], \u3046\u305B\u3064: ["japanese"], \u3046\u3061\u3042\u308F\u305B: ["japanese"], \u3046\u3061\u304B\u3099\u308F: ["japanese"], \u3046\u3061\u304D: ["japanese"], \u3046\u3061\u3085\u3046: ["japanese"], \u3046\u3063\u304B\u308A: ["japanese"], \u3046\u3064\u304F\u3057\u3044: ["japanese"], \u3046\u3063\u305F\u3048\u308B: ["japanese"], \u3046\u3064\u308B: ["japanese"], \u3046\u3068\u3099\u3093: ["japanese"], \u3046\u306A\u304D\u3099: ["japanese"], \u3046\u306A\u3057\u3099: ["japanese"], \u3046\u306A\u3059\u3099\u304F: ["japanese"], \u3046\u306A\u308B: ["japanese"], \u3046\u306D\u308B: ["japanese"], \u3046\u306E\u3046: ["japanese"], \u3046\u3075\u3099\u3051\u3099: ["japanese"], \u3046\u3075\u3099\u3053\u3099\u3048: ["japanese"], \u3046\u307E\u308C\u308B: ["japanese"], \u3046\u3081\u308B: ["japanese"], \u3046\u3082\u3046: ["japanese"], \u3046\u3084\u307E\u3046: ["japanese"], \u3046\u3088\u304F: ["japanese"], \u3046\u3089\u304B\u3099\u3048\u3059: ["japanese"], \u3046\u3089\u304F\u3099\u3061: ["japanese"], \u3046\u3089\u306A\u3044: ["japanese"], \u3046\u308A\u3042\u3051\u3099: ["japanese"], \u3046\u308A\u304D\u308C: ["japanese"], \u3046\u308B\u3055\u3044: ["japanese"], \u3046\u308C\u3057\u3044: ["japanese"], \u3046\u308C\u3086\u304D: ["japanese"], \u3046\u308C\u308B: ["japanese"], \u3046\u308D\u3053: ["japanese"], \u3046\u308F\u304D: ["japanese"], \u3046\u308F\u3055: ["japanese"], \u3046\u3093\u3053\u3046: ["japanese"], \u3046\u3093\u3061\u3093: ["japanese"], \u3046\u3093\u3066\u3093: ["japanese"], \u3046\u3093\u3068\u3099\u3046: ["japanese"], \u3048\u3044\u3048\u3093: ["japanese"], \u3048\u3044\u304B\u3099: ["japanese"], \u3048\u3044\u304D\u3087\u3046: ["japanese"], \u3048\u3044\u3053\u3099: ["japanese"], \u3048\u3044\u305B\u3044: ["japanese"], \u3048\u3044\u3075\u3099\u3093: ["japanese"], \u3048\u3044\u3088\u3046: ["japanese"], \u3048\u3044\u308F: ["japanese"], \u3048\u304A\u308A: ["japanese"], \u3048\u304B\u3099\u304A: ["japanese"], \u3048\u304B\u3099\u304F: ["japanese"], \u3048\u304D\u305F\u3044: ["japanese"], \u3048\u304F\u305B\u308B: ["japanese"], \u3048\u3057\u3083\u304F: ["japanese"], \u3048\u3059\u3066: ["japanese"], \u3048\u3064\u3089\u3093: ["japanese"], \u3048\u306E\u304F\u3099: ["japanese"], \u3048\u307B\u3046\u307E\u304D: ["japanese"], \u3048\u307B\u3093: ["japanese"], \u3048\u307E\u304D: ["japanese"], \u3048\u3082\u3057\u3099: ["japanese"], \u3048\u3082\u306E: ["japanese"], \u3048\u3089\u3044: ["japanese"], \u3048\u3089\u3075\u3099: ["japanese"], \u3048\u308A\u3042: ["japanese"], \u3048\u3093\u3048\u3093: ["japanese"], \u3048\u3093\u304B\u3044: ["japanese"], \u3048\u3093\u304D\u3099: ["japanese"], \u3048\u3093\u3051\u3099\u304D: ["japanese"], \u3048\u3093\u3057\u3085\u3046: ["japanese"], \u3048\u3093\u305B\u3099\u3064: ["japanese"], \u3048\u3093\u305D\u304F: ["japanese"], \u3048\u3093\u3061\u3087\u3046: ["japanese"], \u3048\u3093\u3068\u3064: ["japanese"], \u304A\u3044\u304B\u3051\u308B: ["japanese"], \u304A\u3044\u3053\u3059: ["japanese"], \u304A\u3044\u3057\u3044: ["japanese"], \u304A\u3044\u3064\u304F: ["japanese"], \u304A\u3046\u3048\u3093: ["japanese"], \u304A\u3046\u3055\u307E: ["japanese"], \u304A\u3046\u3057\u3099: ["japanese"], \u304A\u3046\u305B\u3064: ["japanese"], \u304A\u3046\u305F\u3044: ["japanese"], \u304A\u3046\u3075\u304F: ["japanese"], \u304A\u3046\u3078\u3099\u3044: ["japanese"], \u304A\u3046\u3088\u3046: ["japanese"], \u304A\u3048\u308B: ["japanese"], \u304A\u304A\u3044: ["japanese"], \u304A\u304A\u3046: ["japanese"], \u304A\u304A\u3068\u3099\u304A\u308A: ["japanese"], \u304A\u304A\u3084: ["japanese"], \u304A\u304A\u3088\u305D: ["japanese"], \u304A\u304B\u3048\u308A: ["japanese"], \u304A\u304B\u3059\u3099: ["japanese"], \u304A\u304B\u3099\u3080: ["japanese"], \u304A\u304B\u308F\u308A: ["japanese"], \u304A\u304D\u3099\u306A\u3046: ["japanese"], \u304A\u304D\u308B: ["japanese"], \u304A\u304F\u3055\u307E: ["japanese"], \u304A\u304F\u3057\u3099\u3087\u3046: ["japanese"], \u304A\u304F\u308A\u304B\u3099\u306A: ["japanese"], \u304A\u304F\u308B: ["japanese"], \u304A\u304F\u308C\u308B: ["japanese"], \u304A\u3053\u3059: ["japanese"], \u304A\u3053\u306A\u3046: ["japanese"], \u304A\u3053\u308B: ["japanese"], \u304A\u3055\u3048\u308B: ["japanese"], \u304A\u3055\u306A\u3044: ["japanese"], \u304A\u3055\u3081\u308B: ["japanese"], \u304A\u3057\u3044\u308C: ["japanese"], \u304A\u3057\u3048\u308B: ["japanese"], \u304A\u3057\u3099\u304D\u3099: ["japanese"], \u304A\u3057\u3099\u3055\u3093: ["japanese"], \u304A\u3057\u3083\u308C: ["japanese"], \u304A\u305D\u3089\u304F: ["japanese"], \u304A\u305D\u308F\u308B: ["japanese"], \u304A\u305F\u304B\u3099\u3044: ["japanese"], \u304A\u305F\u304F: ["japanese"], \u304A\u305F\u3099\u3084\u304B: ["japanese"], \u304A\u3061\u3064\u304F: ["japanese"], \u304A\u3063\u3068: ["japanese"], \u304A\u3064\u308A: ["japanese"], \u304A\u3066\u3099\u304B\u3051: ["japanese"], \u304A\u3068\u3057\u3082\u306E: ["japanese"], \u304A\u3068\u306A\u3057\u3044: ["japanese"], \u304A\u3068\u3099\u308A: ["japanese"], \u304A\u3068\u3099\u308D\u304B\u3059: ["japanese"], \u304A\u306F\u3099\u3055\u3093: ["japanese"], \u304A\u307E\u3044\u308A: ["japanese"], \u304A\u3081\u3066\u3099\u3068\u3046: ["japanese"], \u304A\u3082\u3044\u3066\u3099: ["japanese"], \u304A\u3082\u3046: ["japanese"], \u304A\u3082\u305F\u3044: ["japanese"], \u304A\u3082\u3061\u3083: ["japanese"], \u304A\u3084\u3064: ["japanese"], \u304A\u3084\u3086\u3072\u3099: ["japanese"], \u304A\u3088\u307B\u3099\u3059: ["japanese"], \u304A\u3089\u3093\u305F\u3099: ["japanese"], \u304A\u308D\u3059: ["japanese"], \u304A\u3093\u304B\u3099\u304F: ["japanese"], \u304A\u3093\u3051\u3044: ["japanese"], \u304A\u3093\u3057\u3083: ["japanese"], \u304A\u3093\u305B\u3093: ["japanese"], \u304A\u3093\u305F\u3099\u3093: ["japanese"], \u304A\u3093\u3061\u3085\u3046: ["japanese"], \u304A\u3093\u3068\u3099\u3051\u3044: ["japanese"], \u304B\u3042\u3064: ["japanese"], \u304B\u3044\u304B\u3099: ["japanese"], \u304B\u3099\u3044\u304D: ["japanese"], \u304B\u3099\u3044\u3051\u3093: ["japanese"], \u304B\u3099\u3044\u3053\u3046: ["japanese"], \u304B\u3044\u3055\u3064: ["japanese"], \u304B\u3044\u3057\u3083: ["japanese"], \u304B\u3044\u3059\u3044\u3088\u304F: ["japanese"], \u304B\u3044\u305B\u3099\u3093: ["japanese"], \u304B\u3044\u305D\u3099\u3046\u3068\u3099: ["japanese"], \u304B\u3044\u3064\u3046: ["japanese"], \u304B\u3044\u3066\u3093: ["japanese"], \u304B\u3044\u3068\u3046: ["japanese"], \u304B\u3044\u3075\u304F: ["japanese"], \u304B\u3099\u3044\u3078\u304D: ["japanese"], \u304B\u3044\u307B\u3046: ["japanese"], \u304B\u3044\u3088\u3046: ["japanese"], \u304B\u3099\u3044\u3089\u3044: ["japanese"], \u304B\u3044\u308F: ["japanese"], \u304B\u3048\u308B: ["japanese"], \u304B\u304A\u308A: ["japanese"], \u304B\u304B\u3048\u308B: ["japanese"], \u304B\u304B\u3099\u304F: ["japanese"], \u304B\u304B\u3099\u3057: ["japanese"], \u304B\u304B\u3099\u307F: ["japanese"], \u304B\u304F\u3053\u3099: ["japanese"], \u304B\u304F\u3068\u304F: ["japanese"], \u304B\u3055\u3099\u308B: ["japanese"], \u304B\u3099\u305D\u3099\u3046: ["japanese"], \u304B\u305F\u3044: ["japanese"], \u304B\u305F\u3061: ["japanese"], \u304B\u3099\u3061\u3087\u3046: ["japanese"], \u304B\u3099\u3063\u304D\u3085\u3046: ["japanese"], \u304B\u3099\u3063\u3053\u3046: ["japanese"], \u304B\u3099\u3063\u3055\u3093: ["japanese"], \u304B\u3099\u3063\u3057\u3087\u3046: ["japanese"], \u304B\u306A\u3055\u3099\u308F\u3057: ["japanese"], \u304B\u306E\u3046: ["japanese"], \u304B\u3099\u306F\u304F: ["japanese"], \u304B\u3075\u3099\u304B: ["japanese"], \u304B\u307B\u3046: ["japanese"], \u304B\u307B\u3053\u3099: ["japanese"], \u304B\u307E\u3046: ["japanese"], \u304B\u307E\u307B\u3099\u3053: ["japanese"], \u304B\u3081\u308C\u304A\u3093: ["japanese"], \u304B\u3086\u3044: ["japanese"], \u304B\u3088\u3046\u3072\u3099: ["japanese"], \u304B\u3089\u3044: ["japanese"], \u304B\u308B\u3044: ["japanese"], \u304B\u308D\u3046: ["japanese"], \u304B\u308F\u304F: ["japanese"], \u304B\u308F\u3089: ["japanese"], \u304B\u3099\u3093\u304B: ["japanese"], \u304B\u3093\u3051\u3044: ["japanese"], \u304B\u3093\u3053\u3046: ["japanese"], \u304B\u3093\u3057\u3083: ["japanese"], \u304B\u3093\u305D\u3046: ["japanese"], \u304B\u3093\u305F\u3093: ["japanese"], \u304B\u3093\u3061: ["japanese"], \u304B\u3099\u3093\u306F\u3099\u308B: ["japanese"], \u304D\u3042\u3044: ["japanese"], \u304D\u3042\u3064: ["japanese"], \u304D\u3044\u308D: ["japanese"], \u304D\u3099\u3044\u3093: ["japanese"], \u304D\u3046\u3044: ["japanese"], \u304D\u3046\u3093: ["japanese"], \u304D\u3048\u308B: ["japanese"], \u304D\u304A\u3046: ["japanese"], \u304D\u304A\u304F: ["japanese"], \u304D\u304A\u3061: ["japanese"], \u304D\u304A\u3093: ["japanese"], \u304D\u304B\u3044: ["japanese"], \u304D\u304B\u304F: ["japanese"], \u304D\u304B\u3093\u3057\u3083: ["japanese"], \u304D\u304D\u3066: ["japanese"], \u304D\u304F\u306F\u3099\u308A: ["japanese"], \u304D\u304F\u3089\u3051\u3099: ["japanese"], \u304D\u3051\u3093\u305B\u3044: ["japanese"], \u304D\u3053\u3046: ["japanese"], \u304D\u3053\u3048\u308B: ["japanese"], \u304D\u3053\u304F: ["japanese"], \u304D\u3055\u3044: ["japanese"], \u304D\u3055\u304F: ["japanese"], \u304D\u3055\u307E: ["japanese"], \u304D\u3055\u3089\u304D\u3099: ["japanese"], \u304D\u3099\u3057\u3099\u304B\u304B\u3099\u304F: ["japanese"], \u304D\u3099\u3057\u304D: ["japanese"], \u304D\u3099\u3057\u3099\u305F\u3044\u3051\u3093: ["japanese"], \u304D\u3099\u3057\u3099\u306B\u3063\u3066\u3044: ["japanese"], \u304D\u3099\u3057\u3099\u3085\u3064\u3057\u3083: ["japanese"], \u304D\u3059\u3046: ["japanese"], \u304D\u305B\u3044: ["japanese"], \u304D\u305B\u304D: ["japanese"], \u304D\u305B\u3064: ["japanese"], \u304D\u305D\u3046: ["japanese"], \u304D\u305D\u3099\u304F: ["japanese"], \u304D\u305D\u3099\u3093: ["japanese"], \u304D\u305F\u3048\u308B: ["japanese"], \u304D\u3061\u3087\u3046: ["japanese"], \u304D\u3064\u3048\u3093: ["japanese"], \u304D\u3099\u3063\u3061\u308A: ["japanese"], \u304D\u3064\u3064\u304D: ["japanese"], \u304D\u3064\u306D: ["japanese"], \u304D\u3066\u3044: ["japanese"], \u304D\u3068\u3099\u3046: ["japanese"], \u304D\u3068\u3099\u304F: ["japanese"], \u304D\u306A\u3044: ["japanese"], \u304D\u306A\u304B\u3099: ["japanese"], \u304D\u306A\u3053: ["japanese"], \u304D\u306C\u3053\u3099\u3057: ["japanese"], \u304D\u306D\u3093: ["japanese"], \u304D\u306E\u3046: ["japanese"], \u304D\u306E\u3057\u305F: ["japanese"], \u304D\u306F\u304F: ["japanese"], \u304D\u3072\u3099\u3057\u3044: ["japanese"], \u304D\u3072\u3093: ["japanese"], \u304D\u3075\u304F: ["japanese"], \u304D\u3075\u3099\u3093: ["japanese"], \u304D\u307B\u3099\u3046: ["japanese"], \u304D\u307B\u3093: ["japanese"], \u304D\u307E\u308B: ["japanese"], \u304D\u307F\u3064: ["japanese"], \u304D\u3080\u3059\u3099\u304B\u3057\u3044: ["japanese"], \u304D\u3081\u308B: ["japanese"], \u304D\u3082\u305F\u3099\u3081\u3057: ["japanese"], \u304D\u3082\u3061: ["japanese"], \u304D\u3082\u306E: ["japanese"], \u304D\u3083\u304F: ["japanese"], \u304D\u3084\u304F: ["japanese"], \u304D\u3099\u3085\u3046\u306B\u304F: ["japanese"], \u304D\u3088\u3046: ["japanese"], \u304D\u3087\u3046\u308A\u3085\u3046: ["japanese"], \u304D\u3089\u3044: ["japanese"], \u304D\u3089\u304F: ["japanese"], \u304D\u308A\u3093: ["japanese"], \u304D\u308C\u3044: ["japanese"], \u304D\u308C\u3064: ["japanese"], \u304D\u308D\u304F: ["japanese"], \u304D\u3099\u308D\u3093: ["japanese"], \u304D\u308F\u3081\u308B: ["japanese"], \u304D\u3099\u3093\u3044\u308D: ["japanese"], \u304D\u3093\u304B\u304F\u3057\u3099: ["japanese"], \u304D\u3093\u3057\u3099\u3087: ["japanese"], \u304D\u3093\u3088\u3046\u3072\u3099: ["japanese"], \u304F\u3099\u3042\u3044: ["japanese"], \u304F\u3044\u3059\u3099: ["japanese"], \u304F\u3046\u304B\u3093: ["japanese"], \u304F\u3046\u304D: ["japanese"], \u304F\u3046\u304F\u3099\u3093: ["japanese"], \u304F\u3046\u3053\u3046: ["japanese"], \u304F\u3099\u3046\u305B\u3044: ["japanese"], \u304F\u3046\u305D\u3046: ["japanese"], \u304F\u3099\u3046\u305F\u3089: ["japanese"], \u304F\u3046\u3075\u304F: ["japanese"], \u304F\u3046\u307B\u3099: ["japanese"], \u304F\u304B\u3093: ["japanese"], \u304F\u304D\u3087\u3046: ["japanese"], \u304F\u3051\u3099\u3093: ["japanese"], \u304F\u3099\u3053\u3046: ["japanese"], \u304F\u3055\u3044: ["japanese"], \u304F\u3055\u304D: ["japanese"], \u304F\u3055\u306F\u3099\u306A: ["japanese"], \u304F\u3055\u308B: ["japanese"], \u304F\u3057\u3083\u307F: ["japanese"], \u304F\u3057\u3087\u3046: ["japanese"], \u304F\u3059\u306E\u304D: ["japanese"], \u304F\u3059\u308A\u3086\u3072\u3099: ["japanese"], \u304F\u305B\u3051\u3099: ["japanese"], \u304F\u305B\u3093: ["japanese"], \u304F\u3099\u305F\u3044\u3066\u304D: ["japanese"], \u304F\u305F\u3099\u3055\u308B: ["japanese"], \u304F\u305F\u3072\u3099\u308C\u308B: ["japanese"], \u304F\u3061\u3053\u307F: ["japanese"], \u304F\u3061\u3055\u304D: ["japanese"], \u304F\u3064\u3057\u305F: ["japanese"], \u304F\u3099\u3063\u3059\u308A: ["japanese"], \u304F\u3064\u308D\u304F\u3099: ["japanese"], \u304F\u3068\u3046\u3066\u3093: ["japanese"], \u304F\u3068\u3099\u304F: ["japanese"], \u304F\u306A\u3093: ["japanese"], \u304F\u306D\u304F\u306D: ["japanese"], \u304F\u306E\u3046: ["japanese"], \u304F\u3075\u3046: ["japanese"], \u304F\u307F\u3042\u308F\u305B: ["japanese"], \u304F\u307F\u305F\u3066\u308B: ["japanese"], \u304F\u3081\u308B: ["japanese"], \u304F\u3084\u304F\u3057\u3087: ["japanese"], \u304F\u3089\u3059: ["japanese"], \u304F\u3089\u3078\u3099\u308B: ["japanese"], \u304F\u308B\u307E: ["japanese"], \u304F\u308C\u308B: ["japanese"], \u304F\u308D\u3046: ["japanese"], \u304F\u308F\u3057\u3044: ["japanese"], \u304F\u3099\u3093\u304B\u3093: ["japanese"], \u304F\u3099\u3093\u3057\u3087\u304F: ["japanese"], \u304F\u3099\u3093\u305F\u3044: ["japanese"], \u304F\u3099\u3093\u3066: ["japanese"], \u3051\u3042\u306A: ["japanese"], \u3051\u3044\u304B\u304F: ["japanese"], \u3051\u3044\u3051\u3093: ["japanese"], \u3051\u3044\u3053: ["japanese"], \u3051\u3044\u3055\u3064: ["japanese"], \u3051\u3099\u3044\u3057\u3099\u3085\u3064: ["japanese"], \u3051\u3044\u305F\u3044: ["japanese"], \u3051\u3099\u3044\u306E\u3046\u3057\u3099\u3093: ["japanese"], \u3051\u3044\u308C\u304D: ["japanese"], \u3051\u3044\u308D: ["japanese"], \u3051\u304A\u3068\u3059: ["japanese"], \u3051\u304A\u308A\u3082\u306E: ["japanese"], \u3051\u3099\u304D\u304B: ["japanese"], \u3051\u3099\u304D\u3051\u3099\u3093: ["japanese"], \u3051\u3099\u304D\u305F\u3099\u3093: ["japanese"], \u3051\u3099\u304D\u3061\u3093: ["japanese"], \u3051\u3099\u304D\u3068\u3064: ["japanese"], \u3051\u3099\u304D\u306F: ["japanese"], \u3051\u3099\u304D\u3084\u304F: ["japanese"], \u3051\u3099\u3053\u3046: ["japanese"], \u3051\u3099\u3053\u304F\u3057\u3099\u3087\u3046: ["japanese"], \u3051\u3099\u3055\u3099\u3044: ["japanese"], \u3051\u3055\u304D: ["japanese"], \u3051\u3099\u3055\u3099\u3093: ["japanese"], \u3051\u3057\u304D: ["japanese"], \u3051\u3057\u3053\u3099\u3080: ["japanese"], \u3051\u3057\u3087\u3046: ["japanese"], \u3051\u3099\u3059\u3068: ["japanese"], \u3051\u305F\u306F\u3099: ["japanese"], \u3051\u3061\u3083\u3063\u3075\u309A: ["japanese"], \u3051\u3061\u3089\u3059: ["japanese"], \u3051\u3064\u3042\u3064: ["japanese"], \u3051\u3064\u3044: ["japanese"], \u3051\u3064\u3048\u304D: ["japanese"], \u3051\u3063\u3053\u3093: ["japanese"], \u3051\u3064\u3057\u3099\u3087: ["japanese"], \u3051\u3063\u305B\u304D: ["japanese"], \u3051\u3063\u3066\u3044: ["japanese"], \u3051\u3064\u307E\u3064: ["japanese"], \u3051\u3099\u3064\u3088\u3046\u3072\u3099: ["japanese"], \u3051\u3099\u3064\u308C\u3044: ["japanese"], \u3051\u3064\u308D\u3093: ["japanese"], \u3051\u3099\u3068\u3099\u304F: ["japanese"], \u3051\u3068\u306F\u3099\u3059: ["japanese"], \u3051\u3068\u308B: ["japanese"], \u3051\u306A\u3051\u3099: ["japanese"], \u3051\u306A\u3059: ["japanese"], \u3051\u306A\u307F: ["japanese"], \u3051\u306C\u304D: ["japanese"], \u3051\u3099\u306D\u3064: ["japanese"], \u3051\u306D\u3093: ["japanese"], \u3051\u306F\u3044: ["japanese"], \u3051\u3099\u3072\u3093: ["japanese"], \u3051\u3075\u3099\u304B\u3044: ["japanese"], \u3051\u3099\u307B\u3099\u304F: ["japanese"], \u3051\u307E\u308A: ["japanese"], \u3051\u307F\u304B\u308B: ["japanese"], \u3051\u3080\u3057: ["japanese"], \u3051\u3080\u308A: ["japanese"], \u3051\u3082\u306E: ["japanese"], \u3051\u3089\u3044: ["japanese"], \u3051\u308D\u3051\u308D: ["japanese"], \u3051\u308F\u3057\u3044: ["japanese"], \u3051\u3093\u3044: ["japanese"], \u3051\u3093\u3048\u3064: ["japanese"], \u3051\u3093\u304A: ["japanese"], \u3051\u3093\u304B: ["japanese"], \u3051\u3099\u3093\u304D: ["japanese"], \u3051\u3093\u3051\u3099\u3093: ["japanese"], \u3051\u3093\u3053\u3046: ["japanese"], \u3051\u3093\u3055\u304F: ["japanese"], \u3051\u3093\u3057\u3085\u3046: ["japanese"], \u3051\u3093\u3059\u3046: ["japanese"], \u3051\u3099\u3093\u305D\u3046: ["japanese"], \u3051\u3093\u3061\u304F: ["japanese"], \u3051\u3093\u3066\u3044: ["japanese"], \u3051\u3093\u3068\u3046: ["japanese"], \u3051\u3093\u306A\u3044: ["japanese"], \u3051\u3093\u306B\u3093: ["japanese"], \u3051\u3099\u3093\u3075\u3099\u3064: ["japanese"], \u3051\u3093\u307E: ["japanese"], \u3051\u3093\u307F\u3093: ["japanese"], \u3051\u3093\u3081\u3044: ["japanese"], \u3051\u3093\u3089\u3093: ["japanese"], \u3051\u3093\u308A: ["japanese"], \u3053\u3042\u304F\u307E: ["japanese"], \u3053\u3044\u306C: ["japanese"], \u3053\u3044\u3072\u3099\u3068: ["japanese"], \u3053\u3099\u3046\u3044: ["japanese"], \u3053\u3046\u3048\u3093: ["japanese"], \u3053\u3046\u304A\u3093: ["japanese"], \u3053\u3046\u304B\u3093: ["japanese"], \u3053\u3099\u3046\u304D\u3085\u3046: ["japanese"], \u3053\u3099\u3046\u3051\u3044: ["japanese"], \u3053\u3046\u3053\u3046: ["japanese"], \u3053\u3046\u3055\u3044: ["japanese"], \u3053\u3046\u3057\u3099: ["japanese"], \u3053\u3046\u3059\u3044: ["japanese"], \u3053\u3099\u3046\u305B\u3044: ["japanese"], \u3053\u3046\u305D\u304F: ["japanese"], \u3053\u3046\u305F\u3044: ["japanese"], \u3053\u3046\u3061\u3083: ["japanese"], \u3053\u3046\u3064\u3046: ["japanese"], \u3053\u3046\u3066\u3044: ["japanese"], \u3053\u3046\u3068\u3099\u3046: ["japanese"], \u3053\u3046\u306A\u3044: ["japanese"], \u3053\u3046\u306F\u3044: ["japanese"], \u3053\u3099\u3046\u307B\u3046: ["japanese"], \u3053\u3099\u3046\u307E\u3093: ["japanese"], \u3053\u3046\u3082\u304F: ["japanese"], \u3053\u3046\u308A\u3064: ["japanese"], \u3053\u3048\u308B: ["japanese"], \u3053\u304A\u308A: ["japanese"], \u3053\u3099\u304B\u3044: ["japanese"], \u3053\u3099\u304B\u3099\u3064: ["japanese"], \u3053\u3099\u304B\u3093: ["japanese"], \u3053\u304F\u3053\u3099: ["japanese"], \u3053\u304F\u3055\u3044: ["japanese"], \u3053\u304F\u3068\u3046: ["japanese"], \u3053\u304F\u306A\u3044: ["japanese"], \u3053\u304F\u306F\u304F: ["japanese"], \u3053\u304F\u3099\u307E: ["japanese"], \u3053\u3051\u3044: ["japanese"], \u3053\u3051\u308B: ["japanese"], \u3053\u3053\u306E\u304B: ["japanese"], \u3053\u3053\u308D: ["japanese"], \u3053\u3055\u3081: ["japanese"], \u3053\u3057\u3064: ["japanese"], \u3053\u3059\u3046: ["japanese"], \u3053\u305B\u3044: ["japanese"], \u3053\u305B\u304D: ["japanese"], \u3053\u305B\u3099\u3093: ["japanese"], \u3053\u305D\u305F\u3099\u3066: ["japanese"], \u3053\u305F\u3044: ["japanese"], \u3053\u305F\u3048\u308B: ["japanese"], \u3053\u305F\u3064: ["japanese"], \u3053\u3061\u3087\u3046: ["japanese"], \u3053\u3063\u304B: ["japanese"], \u3053\u3064\u3053\u3064: ["japanese"], \u3053\u3064\u306F\u3099\u3093: ["japanese"], \u3053\u3064\u3075\u3099: ["japanese"], \u3053\u3066\u3044: ["japanese"], \u3053\u3066\u3093: ["japanese"], \u3053\u3068\u304B\u3099\u3089: ["japanese"], \u3053\u3068\u3057: ["japanese"], \u3053\u3068\u306F\u3099: ["japanese"], \u3053\u3068\u308A: ["japanese"], \u3053\u306A\u3053\u3099\u306A: ["japanese"], \u3053\u306D\u3053\u306D: ["japanese"], \u3053\u306E\u307E\u307E: ["japanese"], \u3053\u306E\u307F: ["japanese"], \u3053\u306E\u3088: ["japanese"], \u3053\u3099\u306F\u3093: ["japanese"], \u3053\u3072\u3064\u3057\u3099: ["japanese"], \u3053\u3075\u3046: ["japanese"], \u3053\u3075\u3093: ["japanese"], \u3053\u307B\u3099\u308C\u308B: ["japanese"], \u3053\u3099\u307E\u3042\u3075\u3099\u3089: ["japanese"], \u3053\u307E\u304B\u3044: ["japanese"], \u3053\u3099\u307E\u3059\u308A: ["japanese"], \u3053\u307E\u3064\u306A: ["japanese"], \u3053\u307E\u308B: ["japanese"], \u3053\u3080\u304D\u3099\u3053: ["japanese"], \u3053\u3082\u3057\u3099: ["japanese"], \u3053\u3082\u3061: ["japanese"], \u3053\u3082\u306E: ["japanese"], \u3053\u3082\u3093: ["japanese"], \u3053\u3084\u304F: ["japanese"], \u3053\u3084\u307E: ["japanese"], \u3053\u3086\u3046: ["japanese"], \u3053\u3086\u3072\u3099: ["japanese"], \u3053\u3088\u3044: ["japanese"], \u3053\u3088\u3046: ["japanese"], \u3053\u308A\u308B: ["japanese"], \u3053\u308C\u304F\u3057\u3087\u3093: ["japanese"], \u3053\u308D\u3063\u3051: ["japanese"], \u3053\u308F\u3082\u3066: ["japanese"], \u3053\u308F\u308C\u308B: ["japanese"], \u3053\u3093\u3044\u3093: ["japanese"], \u3053\u3093\u304B\u3044: ["japanese"], \u3053\u3093\u304D: ["japanese"], \u3053\u3093\u3057\u3085\u3046: ["japanese"], \u3053\u3093\u3059\u3044: ["japanese"], \u3053\u3093\u305F\u3099\u3066: ["japanese"], \u3053\u3093\u3068\u3093: ["japanese"], \u3053\u3093\u306A\u3093: ["japanese"], \u3053\u3093\u3072\u3099\u306B: ["japanese"], \u3053\u3093\u307B\u309A\u3093: ["japanese"], \u3053\u3093\u307E\u3051: ["japanese"], \u3053\u3093\u3084: ["japanese"], \u3053\u3093\u308C\u3044: ["japanese"], \u3053\u3093\u308F\u304F: ["japanese"], \u3055\u3099\u3044\u3048\u304D: ["japanese"], \u3055\u3044\u304B\u3044: ["japanese"], \u3055\u3044\u304D\u3093: ["japanese"], \u3055\u3099\u3044\u3051\u3099\u3093: ["japanese"], \u3055\u3099\u3044\u3053: ["japanese"], \u3055\u3044\u3057\u3087: ["japanese"], \u3055\u3044\u305B\u3044: ["japanese"], \u3055\u3099\u3044\u305F\u304F: ["japanese"], \u3055\u3099\u3044\u3061\u3085\u3046: ["japanese"], \u3055\u3044\u3066\u304D: ["japanese"], \u3055\u3099\u3044\u308A\u3087\u3046: ["japanese"], \u3055\u3046\u306A: ["japanese"], \u3055\u304B\u3044\u3057: ["japanese"], \u3055\u304B\u3099\u3059: ["japanese"], \u3055\u304B\u306A: ["japanese"], \u3055\u304B\u307F\u3061: ["japanese"], \u3055\u304B\u3099\u308B: ["japanese"], \u3055\u304D\u3099\u3087\u3046: ["japanese"], \u3055\u304F\u3057: ["japanese"], \u3055\u304F\u3072\u3093: ["japanese"], \u3055\u304F\u3089: ["japanese"], \u3055\u3053\u304F: ["japanese"], \u3055\u3053\u3064: ["japanese"], \u3055\u3059\u3099\u304B\u308B: ["japanese"], \u3055\u3099\u305B\u304D: ["japanese"], \u3055\u305F\u3093: ["japanese"], \u3055\u3064\u3048\u3044: ["japanese"], \u3055\u3099\u3064\u304A\u3093: ["japanese"], \u3055\u3099\u3063\u304B: ["japanese"], \u3055\u3099\u3064\u304B\u3099\u304F: ["japanese"], \u3055\u3063\u304D\u3087\u304F: ["japanese"], \u3055\u3099\u3063\u3057: ["japanese"], \u3055\u3064\u3057\u3099\u3093: ["japanese"], \u3055\u3099\u3063\u305D\u3046: ["japanese"], \u3055\u3064\u305F\u306F\u3099: ["japanese"], \u3055\u3064\u307E\u3044\u3082: ["japanese"], \u3055\u3066\u3044: ["japanese"], \u3055\u3068\u3044\u3082: ["japanese"], \u3055\u3068\u3046: ["japanese"], \u3055\u3068\u304A\u3084: ["japanese"], \u3055\u3068\u3057: ["japanese"], \u3055\u3068\u308B: ["japanese"], \u3055\u306E\u3046: ["japanese"], \u3055\u306F\u3099\u304F: ["japanese"], \u3055\u3072\u3099\u3057\u3044: ["japanese"], \u3055\u3078\u3099\u3064: ["japanese"], \u3055\u307B\u3046: ["japanese"], \u3055\u307B\u3068\u3099: ["japanese"], \u3055\u307E\u3059: ["japanese"], \u3055\u307F\u3057\u3044: ["japanese"], \u3055\u307F\u305F\u3099\u308C: ["japanese"], \u3055\u3080\u3051: ["japanese"], \u3055\u3081\u308B: ["japanese"], \u3055\u3084\u3048\u3093\u3068\u3099\u3046: ["japanese"], \u3055\u3086\u3046: ["japanese"], \u3055\u3088\u3046: ["japanese"], \u3055\u3088\u304F: ["japanese"], \u3055\u3089\u305F\u3099: ["japanese"], \u3055\u3099\u308B\u305D\u306F\u3099: ["japanese"], \u3055\u308F\u3084\u304B: ["japanese"], \u3055\u308F\u308B: ["japanese"], \u3055\u3093\u3044\u3093: ["japanese"], \u3055\u3093\u304B: ["japanese"], \u3055\u3093\u304D\u3083\u304F: ["japanese"], \u3055\u3093\u3053\u3046: ["japanese"], \u3055\u3093\u3055\u3044: ["japanese"], \u3055\u3099\u3093\u3057\u3087: ["japanese"], \u3055\u3093\u3059\u3046: ["japanese"], \u3055\u3093\u305B\u3044: ["japanese"], \u3055\u3093\u305D: ["japanese"], \u3055\u3093\u3061: ["japanese"], \u3055\u3093\u307E: ["japanese"], \u3055\u3093\u307F: ["japanese"], \u3055\u3093\u3089\u3093: ["japanese"], \u3057\u3042\u3044: ["japanese"], \u3057\u3042\u3051\u3099: ["japanese"], \u3057\u3042\u3055\u3063\u3066: ["japanese"], \u3057\u3042\u308F\u305B: ["japanese"], \u3057\u3044\u304F: ["japanese"], \u3057\u3044\u3093: ["japanese"], \u3057\u3046\u3061: ["japanese"], \u3057\u3048\u3044: ["japanese"], \u3057\u304A\u3051: ["japanese"], \u3057\u304B\u3044: ["japanese"], \u3057\u304B\u304F: ["japanese"], \u3057\u3099\u304B\u3093: ["japanese"], \u3057\u3053\u3099\u3068: ["japanese"], \u3057\u3059\u3046: ["japanese"], \u3057\u3099\u305F\u3099\u3044: ["japanese"], \u3057\u305F\u3046\u3051: ["japanese"], \u3057\u305F\u304D\u3099: ["japanese"], \u3057\u305F\u3066: ["japanese"], \u3057\u305F\u307F: ["japanese"], \u3057\u3061\u3087\u3046: ["japanese"], \u3057\u3061\u308A\u3093: ["japanese"], \u3057\u3063\u304B\u308A: ["japanese"], \u3057\u3064\u3057\u3099: ["japanese"], \u3057\u3064\u3082\u3093: ["japanese"], \u3057\u3066\u3044: ["japanese"], \u3057\u3066\u304D: ["japanese"], \u3057\u3066\u3064: ["japanese"], \u3057\u3099\u3066\u3093: ["japanese"], \u3057\u3099\u3068\u3099\u3046: ["japanese"], \u3057\u306A\u304D\u3099\u308C: ["japanese"], \u3057\u306A\u3082\u306E: ["japanese"], \u3057\u306A\u3093: ["japanese"], \u3057\u306D\u307E: ["japanese"], \u3057\u306D\u3093: ["japanese"], \u3057\u306E\u304F\u3099: ["japanese"], \u3057\u306E\u3075\u3099: ["japanese"], \u3057\u306F\u3044: ["japanese"], \u3057\u306F\u3099\u304B\u308A: ["japanese"], \u3057\u306F\u3064: ["japanese"], \u3057\u306F\u3089\u3044: ["japanese"], \u3057\u306F\u3093: ["japanese"], \u3057\u3072\u3087\u3046: ["japanese"], \u3057\u3075\u304F: ["japanese"], \u3057\u3099\u3075\u3099\u3093: ["japanese"], \u3057\u3078\u3044: ["japanese"], \u3057\u307B\u3046: ["japanese"], \u3057\u307B\u3093: ["japanese"], \u3057\u307E\u3046: ["japanese"], \u3057\u307E\u308B: ["japanese"], \u3057\u307F\u3093: ["japanese"], \u3057\u3080\u3051\u308B: ["japanese"], \u3057\u3099\u3080\u3057\u3087: ["japanese"], \u3057\u3081\u3044: ["japanese"], \u3057\u3081\u308B: ["japanese"], \u3057\u3082\u3093: ["japanese"], \u3057\u3083\u3044\u3093: ["japanese"], \u3057\u3083\u3046\u3093: ["japanese"], \u3057\u3083\u304A\u3093: ["japanese"], \u3057\u3099\u3083\u304B\u3099\u3044\u3082: ["japanese"], \u3057\u3084\u304F\u3057\u3087: ["japanese"], \u3057\u3083\u304F\u307B\u3046: ["japanese"], \u3057\u3083\u3051\u3093: ["japanese"], \u3057\u3083\u3053: ["japanese"], \u3057\u3083\u3055\u3099\u3044: ["japanese"], \u3057\u3083\u3057\u3093: ["japanese"], \u3057\u3083\u305B\u3093: ["japanese"], \u3057\u3083\u305D\u3046: ["japanese"], \u3057\u3083\u305F\u3044: ["japanese"], \u3057\u3083\u3061\u3087\u3046: ["japanese"], \u3057\u3083\u3063\u304D\u3093: ["japanese"], \u3057\u3099\u3083\u307E: ["japanese"], \u3057\u3083\u308A\u3093: ["japanese"], \u3057\u3083\u308C\u3044: ["japanese"], \u3057\u3099\u3086\u3046: ["japanese"], \u3057\u3099\u3085\u3046\u3057\u3087: ["japanese"], \u3057\u3085\u304F\u306F\u304F: ["japanese"], \u3057\u3099\u3085\u3057\u3093: ["japanese"], \u3057\u3085\u3063\u305B\u304D: ["japanese"], \u3057\u3085\u307F: ["japanese"], \u3057\u3085\u3089\u306F\u3099: ["japanese"], \u3057\u3099\u3085\u3093\u306F\u3099\u3093: ["japanese"], \u3057\u3087\u3046\u304B\u3044: ["japanese"], \u3057\u3087\u304F\u305F\u304F: ["japanese"], \u3057\u3087\u3063\u3051\u3093: ["japanese"], \u3057\u3087\u3068\u3099\u3046: ["japanese"], \u3057\u3087\u3082\u3064: ["japanese"], \u3057\u3089\u305B\u308B: ["japanese"], \u3057\u3089\u3078\u3099\u308B: ["japanese"], \u3057\u3093\u304B: ["japanese"], \u3057\u3093\u3053\u3046: ["japanese"], \u3057\u3099\u3093\u3057\u3099\u3083: ["japanese"], \u3057\u3093\u305B\u3044\u3057\u3099: ["japanese"], \u3057\u3093\u3061\u304F: ["japanese"], \u3057\u3093\u308A\u3093: ["japanese"], \u3059\u3042\u3051\u3099: ["japanese"], \u3059\u3042\u3057: ["japanese"], \u3059\u3042\u306A: ["japanese"], \u3059\u3099\u3042\u3093: ["japanese"], \u3059\u3044\u3048\u3044: ["japanese"], \u3059\u3044\u304B: ["japanese"], \u3059\u3044\u3068\u3046: ["japanese"], \u3059\u3099\u3044\u3075\u3099\u3093: ["japanese"], \u3059\u3044\u3088\u3046\u3072\u3099: ["japanese"], \u3059\u3046\u304B\u3099\u304F: ["japanese"], \u3059\u3046\u3057\u3099\u3064: ["japanese"], \u3059\u3046\u305B\u3093: ["japanese"], \u3059\u304A\u3068\u3099\u308A: ["japanese"], \u3059\u304D\u307E: ["japanese"], \u3059\u304F\u3046: ["japanese"], \u3059\u304F\u306A\u3044: ["japanese"], \u3059\u3051\u308B: ["japanese"], \u3059\u3053\u3099\u3044: ["japanese"], \u3059\u3053\u3057: ["japanese"], \u3059\u3099\u3055\u3093: ["japanese"], \u3059\u3059\u3099\u3057\u3044: ["japanese"], \u3059\u3059\u3080: ["japanese"], \u3059\u3059\u3081\u308B: ["japanese"], \u3059\u3063\u304B\u308A: ["japanese"], \u3059\u3099\u3063\u3057\u308A: ["japanese"], \u3059\u3099\u3063\u3068: ["japanese"], \u3059\u3066\u304D: ["japanese"], \u3059\u3066\u308B: ["japanese"], \u3059\u306D\u308B: ["japanese"], \u3059\u306E\u3053: ["japanese"], \u3059\u306F\u305F\u3099: ["japanese"], \u3059\u306F\u3099\u3089\u3057\u3044: ["japanese"], \u3059\u3099\u3072\u3087\u3046: ["japanese"], \u3059\u3099\u3075\u3099\u306C\u308C: ["japanese"], \u3059\u3075\u3099\u308A: ["japanese"], \u3059\u3075\u308C: ["japanese"], \u3059\u3078\u3099\u3066: ["japanese"], \u3059\u3078\u3099\u308B: ["japanese"], \u3059\u3099\u307B\u3046: ["japanese"], \u3059\u307B\u3099\u3093: ["japanese"], \u3059\u307E\u3044: ["japanese"], \u3059\u3081\u3057: ["japanese"], \u3059\u3082\u3046: ["japanese"], \u3059\u3084\u304D: ["japanese"], \u3059\u3089\u3059\u3089: ["japanese"], \u3059\u308B\u3081: ["japanese"], \u3059\u308C\u3061\u304B\u3099\u3046: ["japanese"], \u3059\u308D\u3063\u3068: ["japanese"], \u3059\u308F\u308B: ["japanese"], \u3059\u3093\u305B\u3099\u3093: ["japanese"], \u3059\u3093\u307B\u309A\u3046: ["japanese"], \u305B\u3042\u3075\u3099\u3089: ["japanese"], \u305B\u3044\u304B\u3064: ["japanese"], \u305B\u3044\u3051\u3099\u3093: ["japanese"], \u305B\u3044\u3057\u3099: ["japanese"], \u305B\u3044\u3088\u3046: ["japanese"], \u305B\u304A\u3046: ["japanese"], \u305B\u304B\u3044\u304B\u3093: ["japanese"], \u305B\u304D\u306B\u3093: ["japanese"], \u305B\u304D\u3080: ["japanese"], \u305B\u304D\u3086: ["japanese"], \u305B\u304D\u3089\u3093\u3046\u3093: ["japanese"], \u305B\u3051\u3093: ["japanese"], \u305B\u3053\u3046: ["japanese"], \u305B\u3059\u3057\u3099: ["japanese"], \u305B\u305F\u3044: ["japanese"], \u305B\u305F\u3051: ["japanese"], \u305B\u3063\u304B\u304F: ["japanese"], \u305B\u3063\u304D\u3083\u304F: ["japanese"], \u305B\u3099\u3063\u304F: ["japanese"], \u305B\u3063\u3051\u3093: ["japanese"], \u305B\u3063\u3053\u3064: ["japanese"], \u305B\u3063\u3055\u305F\u304F\u307E: ["japanese"], \u305B\u3064\u305D\u3099\u304F: ["japanese"], \u305B\u3064\u305F\u3099\u3093: ["japanese"], \u305B\u3064\u3066\u3099\u3093: ["japanese"], \u305B\u3063\u306F\u309A\u3093: ["japanese"], \u305B\u3064\u3072\u3099: ["japanese"], \u305B\u3064\u3075\u3099\u3093: ["japanese"], \u305B\u3064\u3081\u3044: ["japanese"], \u305B\u3064\u308A\u3064: ["japanese"], \u305B\u306A\u304B: ["japanese"], \u305B\u306E\u3072\u3099: ["japanese"], \u305B\u306F\u306F\u3099: ["japanese"], \u305B\u3072\u3099\u308D: ["japanese"], \u305B\u307B\u3099\u306D: ["japanese"], \u305B\u307E\u3044: ["japanese"], \u305B\u307E\u308B: ["japanese"], \u305B\u3081\u308B: ["japanese"], \u305B\u3082\u305F\u308C: ["japanese"], \u305B\u308A\u3075: ["japanese"], \u305B\u3099\u3093\u3042\u304F: ["japanese"], \u305B\u3093\u3044: ["japanese"], \u305B\u3093\u3048\u3044: ["japanese"], \u305B\u3093\u304B: ["japanese"], \u305B\u3093\u304D\u3087: ["japanese"], \u305B\u3093\u304F: ["japanese"], \u305B\u3093\u3051\u3099\u3093: ["japanese"], \u305B\u3099\u3093\u3053\u3099: ["japanese"], \u305B\u3093\u3055\u3044: ["japanese"], \u305B\u3093\u3057\u3085: ["japanese"], \u305B\u3093\u3059\u3044: ["japanese"], \u305B\u3093\u305B\u3044: ["japanese"], \u305B\u3093\u305D\u3099: ["japanese"], \u305B\u3093\u305F\u304F: ["japanese"], \u305B\u3093\u3061\u3087\u3046: ["japanese"], \u305B\u3093\u3066\u3044: ["japanese"], \u305B\u3093\u3068\u3046: ["japanese"], \u305B\u3093\u306C\u304D: ["japanese"], \u305B\u3093\u306D\u3093: ["japanese"], \u305B\u3093\u306F\u309A\u3044: ["japanese"], \u305B\u3099\u3093\u3075\u3099: ["japanese"], \u305B\u3099\u3093\u307B\u309A\u3046: ["japanese"], \u305B\u3093\u3080: ["japanese"], \u305B\u3093\u3081\u3093\u3057\u3099\u3087: ["japanese"], \u305B\u3093\u3082\u3093: ["japanese"], \u305B\u3093\u3084\u304F: ["japanese"], \u305B\u3093\u3086\u3046: ["japanese"], \u305B\u3093\u3088\u3046: ["japanese"], \u305B\u3099\u3093\u3089: ["japanese"], \u305B\u3099\u3093\u308A\u3083\u304F: ["japanese"], \u305B\u3093\u308C\u3044: ["japanese"], \u305B\u3093\u308D: ["japanese"], \u305D\u3042\u304F: ["japanese"], \u305D\u3044\u3068\u3051\u3099\u308B: ["japanese"], \u305D\u3044\u306D: ["japanese"], \u305D\u3046\u304B\u3099\u3093\u304D\u3087\u3046: ["japanese"], \u305D\u3046\u304D: ["japanese"], \u305D\u3046\u3053\u3099: ["japanese"], \u305D\u3046\u3057\u3093: ["japanese"], \u305D\u3046\u305F\u3099\u3093: ["japanese"], \u305D\u3046\u306A\u3093: ["japanese"], \u305D\u3046\u3072\u3099: ["japanese"], \u305D\u3046\u3081\u3093: ["japanese"], \u305D\u3046\u308A: ["japanese"], \u305D\u3048\u3082\u306E: ["japanese"], \u305D\u3048\u3093: ["japanese"], \u305D\u304B\u3099\u3044: ["japanese"], \u305D\u3051\u3099\u304D: ["japanese"], \u305D\u3053\u3046: ["japanese"], \u305D\u3053\u305D\u3053: ["japanese"], \u305D\u3055\u3099\u3044: ["japanese"], \u305D\u3057\u306A: ["japanese"], \u305D\u305B\u3044: ["japanese"], \u305D\u305B\u3093: ["japanese"], \u305D\u305D\u304F\u3099: ["japanese"], \u305D\u305F\u3099\u3066\u308B: ["japanese"], \u305D\u3064\u3046: ["japanese"], \u305D\u3064\u3048\u3093: ["japanese"], \u305D\u3063\u304B\u3093: ["japanese"], \u305D\u3064\u304D\u3099\u3087\u3046: ["japanese"], \u305D\u3063\u3051\u3064: ["japanese"], \u305D\u3063\u3053\u3046: ["japanese"], \u305D\u3063\u305B\u3093: ["japanese"], \u305D\u3063\u3068: ["japanese"], \u305D\u3068\u304B\u3099\u308F: ["japanese"], \u305D\u3068\u3064\u3099\u3089: ["japanese"], \u305D\u306A\u3048\u308B: ["japanese"], \u305D\u306A\u305F: ["japanese"], \u305D\u3075\u307B\u3099: ["japanese"], \u305D\u307B\u3099\u304F: ["japanese"], \u305D\u307B\u3099\u308D: ["japanese"], \u305D\u307E\u3064: ["japanese"], \u305D\u307E\u308B: ["japanese"], \u305D\u3080\u304F: ["japanese"], \u305D\u3080\u308A\u3048: ["japanese"], \u305D\u3081\u308B: ["japanese"], \u305D\u3082\u305D\u3082: ["japanese"], \u305D\u3088\u304B\u305B\u3099: ["japanese"], \u305D\u3089\u307E\u3081: ["japanese"], \u305D\u308D\u3046: ["japanese"], \u305D\u3093\u304B\u3044: ["japanese"], \u305D\u3093\u3051\u3044: ["japanese"], \u305D\u3093\u3055\u3099\u3044: ["japanese"], \u305D\u3093\u3057\u3064: ["japanese"], \u305D\u3093\u305D\u3099\u304F: ["japanese"], \u305D\u3093\u3061\u3087\u3046: ["japanese"], \u305D\u3099\u3093\u3072\u3099: ["japanese"], \u305D\u3099\u3093\u3075\u3099\u3093: ["japanese"], \u305D\u3093\u307F\u3093: ["japanese"], \u305F\u3042\u3044: ["japanese"], \u305F\u3044\u3044\u3093: ["japanese"], \u305F\u3044\u3046\u3093: ["japanese"], \u305F\u3044\u3048\u304D: ["japanese"], \u305F\u3044\u304A\u3046: ["japanese"], \u305F\u3099\u3044\u304B\u3099\u304F: ["japanese"], \u305F\u3044\u304D: ["japanese"], \u305F\u3044\u304F\u3099\u3046: ["japanese"], \u305F\u3044\u3051\u3093: ["japanese"], \u305F\u3044\u3053: ["japanese"], \u305F\u3044\u3055\u3099\u3044: ["japanese"], \u305F\u3099\u3044\u3057\u3099\u3087\u3046\u3075\u3099: ["japanese"], \u305F\u3099\u3044\u3059\u304D: ["japanese"], \u305F\u3044\u305B\u3064: ["japanese"], \u305F\u3044\u305D\u3046: ["japanese"], \u305F\u3099\u3044\u305F\u3044: ["japanese"], \u305F\u3044\u3061\u3087\u3046: ["japanese"], \u305F\u3044\u3066\u3044: ["japanese"], \u305F\u3099\u3044\u3068\u3099\u3053\u308D: ["japanese"], \u305F\u3044\u306A\u3044: ["japanese"], \u305F\u3044\u306D\u3064: ["japanese"], \u305F\u3044\u306E\u3046: ["japanese"], \u305F\u3044\u306F\u3093: ["japanese"], \u305F\u3099\u3044\u3072\u3087\u3046: ["japanese"], \u305F\u3044\u3075\u3046: ["japanese"], \u305F\u3044\u3078\u3093: ["japanese"], \u305F\u3044\u307B: ["japanese"], \u305F\u3044\u307E\u3064\u306F\u3099\u306A: ["japanese"], \u305F\u3044\u307F\u3093\u304F\u3099: ["japanese"], \u305F\u3044\u3080: ["japanese"], \u305F\u3044\u3081\u3093: ["japanese"], \u305F\u3044\u3084\u304D: ["japanese"], \u305F\u3044\u3088\u3046: ["japanese"], \u305F\u3044\u3089: ["japanese"], \u305F\u3044\u308A\u3087\u304F: ["japanese"], \u305F\u3044\u308B: ["japanese"], \u305F\u3044\u308F\u3093: ["japanese"], \u305F\u3046\u3048: ["japanese"], \u305F\u3048\u308B: ["japanese"], \u305F\u304A\u3059: ["japanese"], \u305F\u304A\u308B: ["japanese"], \u305F\u304A\u308C\u308B: ["japanese"], \u305F\u304B\u3044: ["japanese"], \u305F\u304B\u306D: ["japanese"], \u305F\u304D\u3072\u3099: ["japanese"], \u305F\u304F\u3055\u3093: ["japanese"], \u305F\u3053\u304F: ["japanese"], \u305F\u3053\u3084\u304D: ["japanese"], \u305F\u3055\u3044: ["japanese"], \u305F\u3057\u3055\u3099\u3093: ["japanese"], \u305F\u3099\u3057\u3099\u3083\u308C: ["japanese"], \u305F\u3059\u3051\u308B: ["japanese"], \u305F\u3059\u3099\u3055\u308F\u308B: ["japanese"], \u305F\u305D\u304B\u3099\u308C: ["japanese"], \u305F\u305F\u304B\u3046: ["japanese"], \u305F\u305F\u304F: ["japanese"], \u305F\u305F\u3099\u3057\u3044: ["japanese"], \u305F\u305F\u307F: ["japanese"], \u305F\u3061\u306F\u3099\u306A: ["japanese"], \u305F\u3099\u3063\u304B\u3044: ["japanese"], \u305F\u3099\u3063\u304D\u3083\u304F: ["japanese"], \u305F\u3099\u3063\u3053: ["japanese"], \u305F\u3099\u3063\u3057\u3085\u3064: ["japanese"], \u305F\u3099\u3063\u305F\u3044: ["japanese"], \u305F\u3066\u308B: ["japanese"], \u305F\u3068\u3048\u308B: ["japanese"], \u305F\u306A\u306F\u3099\u305F: ["japanese"], \u305F\u306B\u3093: ["japanese"], \u305F\u306C\u304D: ["japanese"], \u305F\u306E\u3057\u307F: ["japanese"], \u305F\u306F\u3064: ["japanese"], \u305F\u3075\u3099\u3093: ["japanese"], \u305F\u3078\u3099\u308B: ["japanese"], \u305F\u307B\u3099\u3046: ["japanese"], \u305F\u307E\u3053\u3099: ["japanese"], \u305F\u307E\u308B: ["japanese"], \u305F\u3099\u3080\u308B: ["japanese"], \u305F\u3081\u3044\u304D: ["japanese"], \u305F\u3081\u3059: ["japanese"], \u305F\u3081\u308B: ["japanese"], \u305F\u3082\u3064: ["japanese"], \u305F\u3084\u3059\u3044: ["japanese"], \u305F\u3088\u308B: ["japanese"], \u305F\u3089\u3059: ["japanese"], \u305F\u308A\u304D\u307B\u3093\u304B\u3099\u3093: ["japanese"], \u305F\u308A\u3087\u3046: ["japanese"], \u305F\u308A\u308B: ["japanese"], \u305F\u308B\u3068: ["japanese"], \u305F\u308C\u308B: ["japanese"], \u305F\u308C\u3093\u3068: ["japanese"], \u305F\u308D\u3063\u3068: ["japanese"], \u305F\u308F\u3080\u308C\u308B: ["japanese"], \u305F\u3099\u3093\u3042\u3064: ["japanese"], \u305F\u3093\u3044: ["japanese"], \u305F\u3093\u304A\u3093: ["japanese"], \u305F\u3093\u304B: ["japanese"], \u305F\u3093\u304D: ["japanese"], \u305F\u3093\u3051\u3093: ["japanese"], \u305F\u3093\u3053\u3099: ["japanese"], \u305F\u3093\u3055\u3093: ["japanese"], \u305F\u3093\u3057\u3099\u3087\u3046\u3072\u3099: ["japanese"], \u305F\u3099\u3093\u305B\u3044: ["japanese"], \u305F\u3093\u305D\u304F: ["japanese"], \u305F\u3093\u305F\u3044: ["japanese"], \u305F\u3099\u3093\u3061: ["japanese"], \u305F\u3093\u3066\u3044: ["japanese"], \u305F\u3093\u3068\u3046: ["japanese"], \u305F\u3099\u3093\u306A: ["japanese"], \u305F\u3093\u306B\u3093: ["japanese"], \u305F\u3099\u3093\u306D\u3064: ["japanese"], \u305F\u3093\u306E\u3046: ["japanese"], \u305F\u3093\u3072\u309A\u3093: ["japanese"], \u305F\u3099\u3093\u307B\u3099\u3046: ["japanese"], \u305F\u3093\u307E\u3064: ["japanese"], \u305F\u3093\u3081\u3044: ["japanese"], \u305F\u3099\u3093\u308C\u3064: ["japanese"], \u305F\u3099\u3093\u308D: ["japanese"], \u305F\u3099\u3093\u308F: ["japanese"], \u3061\u3042\u3044: ["japanese"], \u3061\u3042\u3093: ["japanese"], \u3061\u3044\u304D: ["japanese"], \u3061\u3044\u3055\u3044: ["japanese"], \u3061\u3048\u3093: ["japanese"], \u3061\u304B\u3044: ["japanese"], \u3061\u304B\u3089: ["japanese"], \u3061\u304D\u3085\u3046: ["japanese"], \u3061\u304D\u3093: ["japanese"], \u3061\u3051\u3044\u3059\u3099: ["japanese"], \u3061\u3051\u3093: ["japanese"], \u3061\u3053\u304F: ["japanese"], \u3061\u3055\u3044: ["japanese"], \u3061\u3057\u304D: ["japanese"], \u3061\u3057\u308A\u3087\u3046: ["japanese"], \u3061\u305B\u3044: ["japanese"], \u3061\u305D\u3046: ["japanese"], \u3061\u305F\u3044: ["japanese"], \u3061\u305F\u3093: ["japanese"], \u3061\u3061\u304A\u3084: ["japanese"], \u3061\u3064\u3057\u3099\u3087: ["japanese"], \u3061\u3066\u304D: ["japanese"], \u3061\u3066\u3093: ["japanese"], \u3061\u306C\u304D: ["japanese"], \u3061\u306C\u308A: ["japanese"], \u3061\u306E\u3046: ["japanese"], \u3061\u3072\u3087\u3046: ["japanese"], \u3061\u3078\u3044\u305B\u3093: ["japanese"], \u3061\u307B\u3046: ["japanese"], \u3061\u307E\u305F: ["japanese"], \u3061\u307F\u3064: ["japanese"], \u3061\u307F\u3068\u3099\u308D: ["japanese"], \u3061\u3081\u3044\u3068\u3099: ["japanese"], \u3061\u3083\u3093\u3053\u306A\u3078\u3099: ["japanese"], \u3061\u3085\u3046\u3044: ["japanese"], \u3061\u3086\u308A\u3087\u304F: ["japanese"], \u3061\u3087\u3046\u3057: ["japanese"], \u3061\u3087\u3055\u304F\u3051\u3093: ["japanese"], \u3061\u3089\u3057: ["japanese"], \u3061\u3089\u307F: ["japanese"], \u3061\u308A\u304B\u3099\u307F: ["japanese"], \u3061\u308A\u3087\u3046: ["japanese"], \u3061\u308B\u3068\u3099: ["japanese"], \u3061\u308F\u308F: ["japanese"], \u3061\u3093\u305F\u3044: ["japanese"], \u3061\u3093\u3082\u304F: ["japanese"], \u3064\u3044\u304B: ["japanese"], \u3064\u3044\u305F\u3061: ["japanese"], \u3064\u3046\u304B: ["japanese"], \u3064\u3046\u3057\u3099\u3087\u3046: ["japanese"], \u3064\u3046\u306F\u3093: ["japanese"], \u3064\u3046\u308F: ["japanese"], \u3064\u304B\u3046: ["japanese"], \u3064\u304B\u308C\u308B: ["japanese"], \u3064\u304F\u306D: ["japanese"], \u3064\u304F\u308B: ["japanese"], \u3064\u3051\u306D: ["japanese"], \u3064\u3051\u308B: ["japanese"], \u3064\u3053\u3099\u3046: ["japanese"], \u3064\u305F\u3048\u308B: ["japanese"], \u3064\u3064\u3099\u304F: ["japanese"], \u3064\u3064\u3057\u3099: ["japanese"], \u3064\u3064\u3080: ["japanese"], \u3064\u3068\u3081\u308B: ["japanese"], \u3064\u306A\u304B\u3099\u308B: ["japanese"], \u3064\u306A\u307F: ["japanese"], \u3064\u306D\u3064\u3099\u306D: ["japanese"], \u3064\u306E\u308B: ["japanese"], \u3064\u3075\u3099\u3059: ["japanese"], \u3064\u307E\u3089\u306A\u3044: ["japanese"], \u3064\u307E\u308B: ["japanese"], \u3064\u307F\u304D: ["japanese"], \u3064\u3081\u305F\u3044: ["japanese"], \u3064\u3082\u308A: ["japanese"], \u3064\u3082\u308B: ["japanese"], \u3064\u3088\u3044: ["japanese"], \u3064\u308B\u307B\u3099: ["japanese"], \u3064\u308B\u307F\u304F: ["japanese"], \u3064\u308F\u3082\u306E: ["japanese"], \u3064\u308F\u308A: ["japanese"], \u3066\u3042\u3057: ["japanese"], \u3066\u3042\u3066: ["japanese"], \u3066\u3042\u307F: ["japanese"], \u3066\u3044\u304A\u3093: ["japanese"], \u3066\u3044\u304B: ["japanese"], \u3066\u3044\u304D: ["japanese"], \u3066\u3044\u3051\u3044: ["japanese"], \u3066\u3044\u3053\u304F: ["japanese"], \u3066\u3044\u3055\u3064: ["japanese"], \u3066\u3044\u3057: ["japanese"], \u3066\u3044\u305B\u3044: ["japanese"], \u3066\u3044\u305F\u3044: ["japanese"], \u3066\u3044\u3068\u3099: ["japanese"], \u3066\u3044\u306D\u3044: ["japanese"], \u3066\u3044\u3072\u3087\u3046: ["japanese"], \u3066\u3044\u3078\u3093: ["japanese"], \u3066\u3044\u307B\u3099\u3046: ["japanese"], \u3066\u3046\u3061: ["japanese"], \u3066\u304A\u304F\u308C: ["japanese"], \u3066\u304D\u3068\u3046: ["japanese"], \u3066\u304F\u3072\u3099: ["japanese"], \u3066\u3099\u3053\u307B\u3099\u3053: ["japanese"], \u3066\u3055\u304D\u3099\u3087\u3046: ["japanese"], \u3066\u3055\u3051\u3099: ["japanese"], \u3066\u3059\u308A: ["japanese"], \u3066\u305D\u3046: ["japanese"], \u3066\u3061\u304B\u3099\u3044: ["japanese"], \u3066\u3061\u3087\u3046: ["japanese"], \u3066\u3064\u304B\u3099\u304F: ["japanese"], \u3066\u3064\u3064\u3099\u304D: ["japanese"], \u3066\u3099\u3063\u306F\u309A: ["japanese"], \u3066\u3064\u307B\u3099\u3046: ["japanese"], \u3066\u3064\u3084: ["japanese"], \u3066\u3099\u306C\u304B\u3048: ["japanese"], \u3066\u306C\u304D: ["japanese"], \u3066\u306C\u304F\u3099\u3044: ["japanese"], \u3066\u306E\u3072\u3089: ["japanese"], \u3066\u306F\u3044: ["japanese"], \u3066\u3075\u3099\u304F\u308D: ["japanese"], \u3066\u3075\u305F\u3099: ["japanese"], \u3066\u307B\u3068\u3099\u304D: ["japanese"], \u3066\u307B\u3093: ["japanese"], \u3066\u307E\u3048: ["japanese"], \u3066\u307E\u304D\u3059\u3099\u3057: ["japanese"], \u3066\u307F\u3057\u3099\u304B: ["japanese"], \u3066\u307F\u3084\u3051\u3099: ["japanese"], \u3066\u3089\u3059: ["japanese"], \u3066\u308C\u3072\u3099: ["japanese"], \u3066\u308F\u3051: ["japanese"], \u3066\u308F\u305F\u3057: ["japanese"], \u3066\u3099\u3093\u3042\u3064: ["japanese"], \u3066\u3093\u3044\u3093: ["japanese"], \u3066\u3093\u304B\u3044: ["japanese"], \u3066\u3093\u304D: ["japanese"], \u3066\u3093\u304F\u3099: ["japanese"], \u3066\u3093\u3051\u3093: ["japanese"], \u3066\u3093\u3053\u3099\u304F: ["japanese"], \u3066\u3093\u3055\u3044: ["japanese"], \u3066\u3093\u3057: ["japanese"], \u3066\u3093\u3059\u3046: ["japanese"], \u3066\u3099\u3093\u3061: ["japanese"], \u3066\u3093\u3066\u304D: ["japanese"], \u3066\u3093\u3068\u3046: ["japanese"], \u3066\u3093\u306A\u3044: ["japanese"], \u3066\u3093\u3075\u309A\u3089: ["japanese"], \u3066\u3093\u307B\u3099\u3046\u305F\u3099\u3044: ["japanese"], \u3066\u3093\u3081\u3064: ["japanese"], \u3066\u3093\u3089\u3093\u304B\u3044: ["japanese"], \u3066\u3099\u3093\u308A\u3087\u304F: ["japanese"], \u3066\u3099\u3093\u308F: ["japanese"], \u3068\u3099\u3042\u3044: ["japanese"], \u3068\u3044\u308C: ["japanese"], \u3068\u3099\u3046\u304B\u3093: ["japanese"], \u3068\u3046\u304D\u3085\u3046: ["japanese"], \u3068\u3099\u3046\u304F\u3099: ["japanese"], \u3068\u3046\u3057: ["japanese"], \u3068\u3046\u3080\u304D\u3099: ["japanese"], \u3068\u304A\u3044: ["japanese"], \u3068\u304A\u304B: ["japanese"], \u3068\u304A\u304F: ["japanese"], \u3068\u304A\u3059: ["japanese"], \u3068\u304A\u308B: ["japanese"], \u3068\u304B\u3044: ["japanese"], \u3068\u304B\u3059: ["japanese"], \u3068\u304D\u304A\u308A: ["japanese"], \u3068\u304D\u3068\u3099\u304D: ["japanese"], \u3068\u304F\u3044: ["japanese"], \u3068\u304F\u3057\u3085\u3046: ["japanese"], \u3068\u304F\u3066\u3093: ["japanese"], \u3068\u304F\u306B: ["japanese"], \u3068\u304F\u3078\u3099\u3064: ["japanese"], \u3068\u3051\u3044: ["japanese"], \u3068\u3051\u308B: ["japanese"], \u3068\u3053\u3084: ["japanese"], \u3068\u3055\u304B: ["japanese"], \u3068\u3057\u3087\u304B\u3093: ["japanese"], \u3068\u305D\u3046: ["japanese"], \u3068\u305F\u3093: ["japanese"], \u3068\u3061\u3085\u3046: ["japanese"], \u3068\u3063\u304D\u3085\u3046: ["japanese"], \u3068\u3063\u304F\u3093: ["japanese"], \u3068\u3064\u305B\u3099\u3093: ["japanese"], \u3068\u3064\u306B\u3085\u3046: ["japanese"], \u3068\u3068\u3099\u3051\u308B: ["japanese"], \u3068\u3068\u306E\u3048\u308B: ["japanese"], \u3068\u306A\u3044: ["japanese"], \u3068\u306A\u3048\u308B: ["japanese"], \u3068\u306A\u308A: ["japanese"], \u3068\u306E\u3055\u307E: ["japanese"], \u3068\u306F\u3099\u3059: ["japanese"], \u3068\u3099\u3075\u3099\u304B\u3099\u308F: ["japanese"], \u3068\u307B\u3046: ["japanese"], \u3068\u307E\u308B: ["japanese"], \u3068\u3081\u308B: ["japanese"], \u3068\u3082\u305F\u3099\u3061: ["japanese"], \u3068\u3082\u308B: ["japanese"], \u3068\u3099\u3088\u3046\u3072\u3099: ["japanese"], \u3068\u3089\u3048\u308B: ["japanese"], \u3068\u3093\u304B\u3064: ["japanese"], \u3068\u3099\u3093\u3075\u3099\u308A: ["japanese"], \u306A\u3044\u304B\u304F: ["japanese"], \u306A\u3044\u3053\u3046: ["japanese"], \u306A\u3044\u3057\u3087: ["japanese"], \u306A\u3044\u3059: ["japanese"], \u306A\u3044\u305B\u3093: ["japanese"], \u306A\u3044\u305D\u3046: ["japanese"], \u306A\u304A\u3059: ["japanese"], \u306A\u304B\u3099\u3044: ["japanese"], \u306A\u304F\u3059: ["japanese"], \u306A\u3051\u3099\u308B: ["japanese"], \u306A\u3053\u3046\u3068\u3099: ["japanese"], \u306A\u3055\u3051: ["japanese"], \u306A\u305F\u3066\u3099\u3053\u3053: ["japanese"], \u306A\u3063\u3068\u3046: ["japanese"], \u306A\u3064\u3084\u3059\u307F: ["japanese"], \u306A\u306A\u304A\u3057: ["japanese"], \u306A\u306B\u3053\u3099\u3068: ["japanese"], \u306A\u306B\u3082\u306E: ["japanese"], \u306A\u306B\u308F: ["japanese"], \u306A\u306E\u304B: ["japanese"], \u306A\u3075\u305F\u3099: ["japanese"], \u306A\u307E\u3044\u304D: ["japanese"], \u306A\u307E\u3048: ["japanese"], \u306A\u307E\u307F: ["japanese"], \u306A\u307F\u305F\u3099: ["japanese"], \u306A\u3081\u3089\u304B: ["japanese"], \u306A\u3081\u308B: ["japanese"], \u306A\u3084\u3080: ["japanese"], \u306A\u3089\u3046: ["japanese"], \u306A\u3089\u3072\u3099: ["japanese"], \u306A\u3089\u3075\u3099: ["japanese"], \u306A\u308C\u308B: ["japanese"], \u306A\u308F\u3068\u3072\u3099: ["japanese"], \u306A\u308F\u306F\u3099\u308A: ["japanese"], \u306B\u3042\u3046: ["japanese"], \u306B\u3044\u304B\u3099\u305F: ["japanese"], \u306B\u3046\u3051: ["japanese"], \u306B\u304A\u3044: ["japanese"], \u306B\u304B\u3044: ["japanese"], \u306B\u304B\u3099\u3066: ["japanese"], \u306B\u304D\u3072\u3099: ["japanese"], \u306B\u304F\u3057\u307F: ["japanese"], \u306B\u304F\u307E\u3093: ["japanese"], \u306B\u3051\u3099\u308B: ["japanese"], \u306B\u3055\u3093\u304B\u305F\u3093\u305D: ["japanese"], \u306B\u3057\u304D: ["japanese"], \u306B\u305B\u3082\u306E: ["japanese"], \u306B\u3061\u3057\u3099\u3087\u3046: ["japanese"], \u306B\u3061\u3088\u3046\u3072\u3099: ["japanese"], \u306B\u3063\u304B: ["japanese"], \u306B\u3063\u304D: ["japanese"], \u306B\u3063\u3051\u3044: ["japanese"], \u306B\u3063\u3053\u3046: ["japanese"], \u306B\u3063\u3055\u3093: ["japanese"], \u306B\u3063\u3057\u3087\u304F: ["japanese"], \u306B\u3063\u3059\u3046: ["japanese"], \u306B\u3063\u305B\u304D: ["japanese"], \u306B\u3063\u3066\u3044: ["japanese"], \u306B\u306A\u3046: ["japanese"], \u306B\u307B\u3093: ["japanese"], \u306B\u307E\u3081: ["japanese"], \u306B\u3082\u3064: ["japanese"], \u306B\u3084\u308A: ["japanese"], \u306B\u3085\u3046\u3044\u3093: ["japanese"], \u306B\u308A\u3093\u3057\u3083: ["japanese"], \u306B\u308F\u3068\u308A: ["japanese"], \u306B\u3093\u3044: ["japanese"], \u306B\u3093\u304B: ["japanese"], \u306B\u3093\u304D: ["japanese"], \u306B\u3093\u3051\u3099\u3093: ["japanese"], \u306B\u3093\u3057\u304D: ["japanese"], \u306B\u3093\u3059\u3099\u3046: ["japanese"], \u306B\u3093\u305D\u3046: ["japanese"], \u306B\u3093\u305F\u3044: ["japanese"], \u306B\u3093\u3061: ["japanese"], \u306B\u3093\u3066\u3044: ["japanese"], \u306B\u3093\u306B\u304F: ["japanese"], \u306B\u3093\u3075\u309A: ["japanese"], \u306B\u3093\u307E\u308A: ["japanese"], \u306B\u3093\u3080: ["japanese"], \u306B\u3093\u3081\u3044: ["japanese"], \u306B\u3093\u3088\u3046: ["japanese"], \u306C\u3044\u304F\u304D\u3099: ["japanese"], \u306C\u304B\u3059: ["japanese"], \u306C\u304F\u3099\u3044\u3068\u308B: ["japanese"], \u306C\u304F\u3099\u3046: ["japanese"], \u306C\u304F\u3082\u308A: ["japanese"], \u306C\u3059\u3080: ["japanese"], \u306C\u307E\u3048\u3072\u3099: ["japanese"], \u306C\u3081\u308A: ["japanese"], \u306C\u3089\u3059: ["japanese"], \u306C\u3093\u3061\u3083\u304F: ["japanese"], \u306D\u3042\u3051\u3099: ["japanese"], \u306D\u3044\u304D: ["japanese"], \u306D\u3044\u308B: ["japanese"], \u306D\u3044\u308D: ["japanese"], \u306D\u304F\u3099\u305B: ["japanese"], \u306D\u304F\u305F\u3044: ["japanese"], \u306D\u304F\u3089: ["japanese"], \u306D\u3053\u305B\u3099: ["japanese"], \u306D\u3053\u3080: ["japanese"], \u306D\u3055\u3051\u3099: ["japanese"], \u306D\u3059\u3053\u3099\u3059: ["japanese"], \u306D\u305D\u3078\u3099\u308B: ["japanese"], \u306D\u305F\u3099\u3093: ["japanese"], \u306D\u3064\u3044: ["japanese"], \u306D\u3063\u3057\u3093: ["japanese"], \u306D\u3064\u305D\u3099\u3046: ["japanese"], \u306D\u3063\u305F\u3044\u304D\u3099\u3087: ["japanese"], \u306D\u3075\u3099\u305D\u304F: ["japanese"], \u306D\u3075\u305F\u3099: ["japanese"], \u306D\u307B\u3099\u3046: ["japanese"], \u306D\u307B\u308A\u306F\u307B\u308A: ["japanese"], \u306D\u307E\u304D: ["japanese"], \u306D\u307E\u308F\u3057: ["japanese"], \u306D\u307F\u307F: ["japanese"], \u306D\u3080\u3044: ["japanese"], \u306D\u3080\u305F\u3044: ["japanese"], \u306D\u3082\u3068: ["japanese"], \u306D\u3089\u3046: ["japanese"], \u306D\u308F\u3055\u3099: ["japanese"], \u306D\u3093\u3044\u308A: ["japanese"], \u306D\u3093\u304A\u3057: ["japanese"], \u306D\u3093\u304B\u3093: ["japanese"], \u306D\u3093\u304D\u3093: ["japanese"], \u306D\u3093\u304F\u3099: ["japanese"], \u306D\u3093\u3055\u3099: ["japanese"], \u306D\u3093\u3057: ["japanese"], \u306D\u3093\u3061\u3083\u304F: ["japanese"], \u306D\u3093\u3068\u3099: ["japanese"], \u306D\u3093\u3072\u309A: ["japanese"], \u306D\u3093\u3075\u3099\u3064: ["japanese"], \u306D\u3093\u307E\u3064: ["japanese"], \u306D\u3093\u308A\u3087\u3046: ["japanese"], \u306D\u3093\u308C\u3044: ["japanese"], \u306E\u3044\u3059\u3099: ["japanese"], \u306E\u304A\u3064\u3099\u307E: ["japanese"], \u306E\u304B\u3099\u3059: ["japanese"], \u306E\u304D\u306A\u307F: ["japanese"], \u306E\u3053\u304D\u3099\u308A: ["japanese"], \u306E\u3053\u3059: ["japanese"], \u306E\u3053\u308B: ["japanese"], \u306E\u305B\u308B: ["japanese"], \u306E\u305D\u3099\u304F: ["japanese"], \u306E\u305D\u3099\u3080: ["japanese"], \u306E\u305F\u307E\u3046: ["japanese"], \u306E\u3061\u307B\u3068\u3099: ["japanese"], \u306E\u3063\u304F: ["japanese"], \u306E\u306F\u3099\u3059: ["japanese"], \u306E\u306F\u3089: ["japanese"], \u306E\u3078\u3099\u308B: ["japanese"], \u306E\u307B\u3099\u308B: ["japanese"], \u306E\u307F\u3082\u306E: ["japanese"], \u306E\u3084\u307E: ["japanese"], \u306E\u3089\u3044\u306C: ["japanese"], \u306E\u3089\u306D\u3053: ["japanese"], \u306E\u308A\u3082\u306E: ["japanese"], \u306E\u308A\u3086\u304D: ["japanese"], \u306E\u308C\u3093: ["japanese"], \u306E\u3093\u304D: ["japanese"], \u306F\u3099\u3042\u3044: ["japanese"], \u306F\u3042\u304F: ["japanese"], \u306F\u3099\u3042\u3055\u3093: ["japanese"], \u306F\u3099\u3044\u304B: ["japanese"], \u306F\u3099\u3044\u304F: ["japanese"], \u306F\u3044\u3051\u3093: ["japanese"], \u306F\u3044\u3053\u3099: ["japanese"], \u306F\u3044\u3057\u3093: ["japanese"], \u306F\u3044\u3059\u3044: ["japanese"], \u306F\u3044\u305B\u3093: ["japanese"], \u306F\u3044\u305D\u3046: ["japanese"], \u306F\u3044\u3061: ["japanese"], \u306F\u3099\u3044\u306F\u3099\u3044: ["japanese"], \u306F\u3044\u308C\u3064: ["japanese"], \u306F\u3048\u308B: ["japanese"], \u306F\u304A\u308B: ["japanese"], \u306F\u304B\u3044: ["japanese"], \u306F\u3099\u304B\u308A: ["japanese"], \u306F\u304B\u308B: ["japanese"], \u306F\u304F\u3057\u3085: ["japanese"], \u306F\u3051\u3093: ["japanese"], \u306F\u3053\u3075\u3099: ["japanese"], \u306F\u3055\u307F: ["japanese"], \u306F\u3055\u3093: ["japanese"], \u306F\u3057\u3053\u3099: ["japanese"], \u306F\u3099\u3057\u3087: ["japanese"], \u306F\u3057\u308B: ["japanese"], \u306F\u305B\u308B: ["japanese"], \u306F\u309A\u305D\u3053\u3093: ["japanese"], \u306F\u305D\u3093: ["japanese"], \u306F\u305F\u3093: ["japanese"], \u306F\u3061\u307F\u3064: ["japanese"], \u306F\u3064\u304A\u3093: ["japanese"], \u306F\u3063\u304B\u304F: ["japanese"], \u306F\u3064\u3099\u304D: ["japanese"], \u306F\u3063\u304D\u308A: ["japanese"], \u306F\u3063\u304F\u3064: ["japanese"], \u306F\u3063\u3051\u3093: ["japanese"], \u306F\u3063\u3053\u3046: ["japanese"], \u306F\u3063\u3055\u3093: ["japanese"], \u306F\u3063\u3057\u3093: ["japanese"], \u306F\u3063\u305F\u3064: ["japanese"], \u306F\u3063\u3061\u3085\u3046: ["japanese"], \u306F\u3063\u3066\u3093: ["japanese"], \u306F\u3063\u3072\u309A\u3087\u3046: ["japanese"], \u306F\u3063\u307B\u309A\u3046: ["japanese"], \u306F\u306A\u3059: ["japanese"], \u306F\u306A\u3072\u3099: ["japanese"], \u306F\u306B\u304B\u3080: ["japanese"], \u306F\u3075\u3099\u3089\u3057: ["japanese"], \u306F\u307F\u304B\u3099\u304D: ["japanese"], \u306F\u3080\u304B\u3046: ["japanese"], \u306F\u3081\u3064: ["japanese"], \u306F\u3084\u3044: ["japanese"], \u306F\u3084\u3057: ["japanese"], \u306F\u3089\u3046: ["japanese"], \u306F\u308D\u3046\u3043\u3093: ["japanese"], \u306F\u308F\u3044: ["japanese"], \u306F\u3093\u3044: ["japanese"], \u306F\u3093\u3048\u3044: ["japanese"], \u306F\u3093\u304A\u3093: ["japanese"], \u306F\u3093\u304B\u304F: ["japanese"], \u306F\u3093\u304D\u3087\u3046: ["japanese"], \u306F\u3099\u3093\u304F\u3099\u307F: ["japanese"], \u306F\u3093\u3053: ["japanese"], \u306F\u3093\u3057\u3083: ["japanese"], \u306F\u3093\u3059\u3046: ["japanese"], \u306F\u3093\u305F\u3099\u3093: ["japanese"], \u306F\u309A\u3093\u3061: ["japanese"], \u306F\u309A\u3093\u3064: ["japanese"], \u306F\u3093\u3066\u3044: ["japanese"], \u306F\u3093\u3068\u3057: ["japanese"], \u306F\u3093\u306E\u3046: ["japanese"], \u306F\u3093\u306F\u309A: ["japanese"], \u306F\u3093\u3075\u3099\u3093: ["japanese"], \u306F\u3093\u3078\u309A\u3093: ["japanese"], \u306F\u3093\u307B\u3099\u3046\u304D: ["japanese"], \u306F\u3093\u3081\u3044: ["japanese"], \u306F\u3093\u3089\u3093: ["japanese"], \u306F\u3093\u308D\u3093: ["japanese"], \u3072\u3044\u304D: ["japanese"], \u3072\u3046\u3093: ["japanese"], \u3072\u3048\u308B: ["japanese"], \u3072\u304B\u304F: ["japanese"], \u3072\u304B\u308A: ["japanese"], \u3072\u304B\u308B: ["japanese"], \u3072\u304B\u3093: ["japanese"], \u3072\u304F\u3044: ["japanese"], \u3072\u3051\u3064: ["japanese"], \u3072\u3053\u3046\u304D: ["japanese"], \u3072\u3053\u304F: ["japanese"], \u3072\u3055\u3044: ["japanese"], \u3072\u3055\u3057\u3075\u3099\u308A: ["japanese"], \u3072\u3055\u3093: ["japanese"], \u3072\u3099\u3057\u3099\u3085\u3064\u304B\u3093: ["japanese"], \u3072\u3057\u3087: ["japanese"], \u3072\u305D\u304B: ["japanese"], \u3072\u305D\u3080: ["japanese"], \u3072\u305F\u3080\u304D: ["japanese"], \u3072\u305F\u3099\u308A: ["japanese"], \u3072\u305F\u308B: ["japanese"], \u3072\u3064\u304D\u3099: ["japanese"], \u3072\u3063\u3053\u3057: ["japanese"], \u3072\u3063\u3057: ["japanese"], \u3072\u3064\u3057\u3099\u3085\u3072\u3093: ["japanese"], \u3072\u3063\u3059: ["japanese"], \u3072\u3064\u305B\u3099\u3093: ["japanese"], \u3072\u309A\u3063\u305F\u308A: ["japanese"], \u3072\u309A\u3063\u3061\u308A: ["japanese"], \u3072\u3064\u3088\u3046: ["japanese"], \u3072\u3066\u3044: ["japanese"], \u3072\u3068\u3053\u3099\u307F: ["japanese"], \u3072\u306A\u307E\u3064\u308A: ["japanese"], \u3072\u306A\u3093: ["japanese"], \u3072\u306D\u308B: ["japanese"], \u3072\u306F\u3093: ["japanese"], \u3072\u3072\u3099\u304F: ["japanese"], \u3072\u3072\u3087\u3046: ["japanese"], \u3072\u307B\u3046: ["japanese"], \u3072\u307E\u308F\u308A: ["japanese"], \u3072\u307E\u3093: ["japanese"], \u3072\u307F\u3064: ["japanese"], \u3072\u3081\u3044: ["japanese"], \u3072\u3081\u3057\u3099\u3057: ["japanese"], \u3072\u3084\u3051: ["japanese"], \u3072\u3084\u3059: ["japanese"], \u3072\u3088\u3046: ["japanese"], \u3072\u3099\u3087\u3046\u304D: ["japanese"], \u3072\u3089\u304B\u3099\u306A: ["japanese"], \u3072\u3089\u304F: ["japanese"], \u3072\u308A\u3064: ["japanese"], \u3072\u308A\u3087\u3046: ["japanese"], \u3072\u308B\u307E: ["japanese"], \u3072\u308B\u3084\u3059\u307F: ["japanese"], \u3072\u308C\u3044: ["japanese"], \u3072\u308D\u3044: ["japanese"], \u3072\u308D\u3046: ["japanese"], \u3072\u308D\u304D: ["japanese"], \u3072\u308D\u3086\u304D: ["japanese"], \u3072\u3093\u304B\u304F: ["japanese"], \u3072\u3093\u3051\u3064: ["japanese"], \u3072\u3093\u3053\u3093: ["japanese"], \u3072\u3093\u3057\u3085: ["japanese"], \u3072\u3093\u305D\u3046: ["japanese"], \u3072\u309A\u3093\u3061: ["japanese"], \u3072\u3093\u306F\u309A\u3093: ["japanese"], \u3072\u3099\u3093\u307B\u3099\u3046: ["japanese"], \u3075\u3042\u3093: ["japanese"], \u3075\u3044\u3046\u3061: ["japanese"], \u3075\u3046\u3051\u3044: ["japanese"], \u3075\u3046\u305B\u3093: ["japanese"], \u3075\u309A\u3046\u305F\u308D\u3046: ["japanese"], \u3075\u3046\u3068\u3046: ["japanese"], \u3075\u3046\u3075: ["japanese"], \u3075\u3048\u308B: ["japanese"], \u3075\u304A\u3093: ["japanese"], \u3075\u304B\u3044: ["japanese"], \u3075\u304D\u3093: ["japanese"], \u3075\u304F\u3055\u3099\u3064: ["japanese"], \u3075\u304F\u3075\u3099\u304F\u308D: ["japanese"], \u3075\u3053\u3046: ["japanese"], \u3075\u3055\u3044: ["japanese"], \u3075\u3057\u304D\u3099: ["japanese"], \u3075\u3057\u3099\u307F: ["japanese"], \u3075\u3059\u307E: ["japanese"], \u3075\u305B\u3044: ["japanese"], \u3075\u305B\u304F\u3099: ["japanese"], \u3075\u305D\u304F: ["japanese"], \u3075\u3099\u305F\u306B\u304F: ["japanese"], \u3075\u305F\u3093: ["japanese"], \u3075\u3061\u3087\u3046: ["japanese"], \u3075\u3064\u3046: ["japanese"], \u3075\u3064\u304B: ["japanese"], \u3075\u3063\u304B\u3064: ["japanese"], \u3075\u3063\u304D: ["japanese"], \u3075\u3063\u3053\u304F: ["japanese"], \u3075\u3099\u3068\u3099\u3046: ["japanese"], \u3075\u3068\u308B: ["japanese"], \u3075\u3068\u3093: ["japanese"], \u3075\u306E\u3046: ["japanese"], \u3075\u306F\u3044: ["japanese"], \u3075\u3072\u3087\u3046: ["japanese"], \u3075\u3078\u3093: ["japanese"], \u3075\u307E\u3093: ["japanese"], \u3075\u307F\u3093: ["japanese"], \u3075\u3081\u3064: ["japanese"], \u3075\u3081\u3093: ["japanese"], \u3075\u3088\u3046: ["japanese"], \u3075\u308A\u3053: ["japanese"], \u3075\u308A\u308B: ["japanese"], \u3075\u308B\u3044: ["japanese"], \u3075\u3093\u3044\u304D: ["japanese"], \u3075\u3099\u3093\u304B\u3099\u304F: ["japanese"], \u3075\u3099\u3093\u304F\u3099: ["japanese"], \u3075\u3093\u3057\u3064: ["japanese"], \u3075\u3099\u3093\u305B\u304D: ["japanese"], \u3075\u3093\u305D\u3046: ["japanese"], \u3075\u3099\u3093\u307B\u309A\u3046: ["japanese"], \u3078\u3044\u3042\u3093: ["japanese"], \u3078\u3044\u304A\u3093: ["japanese"], \u3078\u3044\u304B\u3099\u3044: ["japanese"], \u3078\u3044\u304D: ["japanese"], \u3078\u3044\u3051\u3099\u3093: ["japanese"], \u3078\u3044\u3053\u3046: ["japanese"], \u3078\u3044\u3055: ["japanese"], \u3078\u3044\u3057\u3083: ["japanese"], \u3078\u3044\u305B\u3064: ["japanese"], \u3078\u3044\u305D: ["japanese"], \u3078\u3044\u305F\u304F: ["japanese"], \u3078\u3044\u3066\u3093: ["japanese"], \u3078\u3044\u306D\u3064: ["japanese"], \u3078\u3044\u308F: ["japanese"], \u3078\u304D\u304B\u3099: ["japanese"], \u3078\u3053\u3080: ["japanese"], \u3078\u3099\u306B\u3044\u308D: ["japanese"], \u3078\u3099\u306B\u3057\u3087\u3046\u304B\u3099: ["japanese"], \u3078\u3089\u3059: ["japanese"], \u3078\u3093\u304B\u3093: ["japanese"], \u3078\u3099\u3093\u304D\u3087\u3046: ["japanese"], \u3078\u3099\u3093\u3053\u3099\u3057: ["japanese"], \u3078\u3093\u3055\u3044: ["japanese"], \u3078\u3093\u305F\u3044: ["japanese"], \u3078\u3099\u3093\u308A: ["japanese"], \u307B\u3042\u3093: ["japanese"], \u307B\u3044\u304F: ["japanese"], \u307B\u3099\u3046\u304D\u3099\u3087: ["japanese"], \u307B\u3046\u3053\u304F: ["japanese"], \u307B\u3046\u305D\u3046: ["japanese"], \u307B\u3046\u307B\u3046: ["japanese"], \u307B\u3046\u3082\u3093: ["japanese"], \u307B\u3046\u308A\u3064: ["japanese"], \u307B\u3048\u308B: ["japanese"], \u307B\u304A\u3093: ["japanese"], \u307B\u304B\u3093: ["japanese"], \u307B\u304D\u3087\u3046: ["japanese"], \u307B\u3099\u304D\u3093: ["japanese"], \u307B\u304F\u308D: ["japanese"], \u307B\u3051\u3064: ["japanese"], \u307B\u3051\u3093: ["japanese"], \u307B\u3053\u3046: ["japanese"], \u307B\u3053\u308B: ["japanese"], \u307B\u3057\u3044: ["japanese"], \u307B\u3057\u3064: ["japanese"], \u307B\u3057\u3085: ["japanese"], \u307B\u3057\u3087\u3046: ["japanese"], \u307B\u305B\u3044: ["japanese"], \u307B\u305D\u3044: ["japanese"], \u307B\u305D\u304F: ["japanese"], \u307B\u305F\u3066: ["japanese"], \u307B\u305F\u308B: ["japanese"], \u307B\u309A\u3061\u3075\u3099\u304F\u308D: ["japanese"], \u307B\u3063\u304D\u3087\u304F: ["japanese"], \u307B\u3063\u3055: ["japanese"], \u307B\u3063\u305F\u3093: ["japanese"], \u307B\u3068\u3093\u3068\u3099: ["japanese"], \u307B\u3081\u308B: ["japanese"], \u307B\u3093\u3044: ["japanese"], \u307B\u3093\u304D: ["japanese"], \u307B\u3093\u3051: ["japanese"], \u307B\u3093\u3057\u3064: ["japanese"], \u307B\u3093\u3084\u304F: ["japanese"], \u307E\u3044\u306B\u3061: ["japanese"], \u307E\u304B\u3044: ["japanese"], \u307E\u304B\u305B\u308B: ["japanese"], \u307E\u304B\u3099\u308B: ["japanese"], \u307E\u3051\u308B: ["japanese"], \u307E\u3053\u3068: ["japanese"], \u307E\u3055\u3064: ["japanese"], \u307E\u3057\u3099\u3081: ["japanese"], \u307E\u3059\u304F: ["japanese"], \u307E\u305B\u3099\u308B: ["japanese"], \u307E\u3064\u308A: ["japanese"], \u307E\u3068\u3081: ["japanese"], \u307E\u306A\u3075\u3099: ["japanese"], \u307E\u306C\u3051: ["japanese"], \u307E\u306D\u304F: ["japanese"], \u307E\u307B\u3046: ["japanese"], \u307E\u3082\u308B: ["japanese"], \u307E\u3086\u3051\u3099: ["japanese"], \u307E\u3088\u3046: ["japanese"], \u307E\u308D\u3084\u304B: ["japanese"], \u307E\u308F\u3059: ["japanese"], \u307E\u308F\u308A: ["japanese"], \u307E\u308F\u308B: ["japanese"], \u307E\u3093\u304B\u3099: ["japanese"], \u307E\u3093\u304D\u3064: ["japanese"], \u307E\u3093\u305D\u3099\u304F: ["japanese"], \u307E\u3093\u306A\u304B: ["japanese"], \u307F\u3044\u3089: ["japanese"], \u307F\u3046\u3061: ["japanese"], \u307F\u3048\u308B: ["japanese"], \u307F\u304B\u3099\u304F: ["japanese"], \u307F\u304B\u305F: ["japanese"], \u307F\u304B\u3093: ["japanese"], \u307F\u3051\u3093: ["japanese"], \u307F\u3053\u3093: ["japanese"], \u307F\u3057\u3099\u304B\u3044: ["japanese"], \u307F\u3059\u3044: ["japanese"], \u307F\u3059\u3048\u308B: ["japanese"], \u307F\u305B\u308B: ["japanese"], \u307F\u3063\u304B: ["japanese"], \u307F\u3064\u304B\u308B: ["japanese"], \u307F\u3064\u3051\u308B: ["japanese"], \u307F\u3066\u3044: ["japanese"], \u307F\u3068\u3081\u308B: ["japanese"], \u307F\u306A\u3068: ["japanese"], \u307F\u306A\u307F\u304B\u3055\u3044: ["japanese"], \u307F\u306D\u3089\u308B: ["japanese"], \u307F\u306E\u3046: ["japanese"], \u307F\u306E\u304B\u3099\u3059: ["japanese"], \u307F\u307B\u3093: ["japanese"], \u307F\u3082\u3068: ["japanese"], \u307F\u3084\u3051\u3099: ["japanese"], \u307F\u3089\u3044: ["japanese"], \u307F\u308A\u3087\u304F: ["japanese"], \u307F\u308F\u304F: ["japanese"], \u307F\u3093\u304B: ["japanese"], \u307F\u3093\u305D\u3099\u304F: ["japanese"], \u3080\u3044\u304B: ["japanese"], \u3080\u3048\u304D: ["japanese"], \u3080\u3048\u3093: ["japanese"], \u3080\u304B\u3044: ["japanese"], \u3080\u304B\u3046: ["japanese"], \u3080\u304B\u3048: ["japanese"], \u3080\u304B\u3057: ["japanese"], \u3080\u304D\u3099\u3061\u3083: ["japanese"], \u3080\u3051\u308B: ["japanese"], \u3080\u3051\u3099\u3093: ["japanese"], \u3080\u3055\u307B\u3099\u308B: ["japanese"], \u3080\u3057\u3042\u3064\u3044: ["japanese"], \u3080\u3057\u306F\u3099: ["japanese"], \u3080\u3057\u3099\u3085\u3093: ["japanese"], \u3080\u3057\u308D: ["japanese"], \u3080\u3059\u3046: ["japanese"], \u3080\u3059\u3053: ["japanese"], \u3080\u3059\u3075\u3099: ["japanese"], \u3080\u3059\u3081: ["japanese"], \u3080\u305B\u308B: ["japanese"], \u3080\u305B\u3093: ["japanese"], \u3080\u3061\u3085\u3046: ["japanese"], \u3080\u306A\u3057\u3044: ["japanese"], \u3080\u306E\u3046: ["japanese"], \u3080\u3084\u307F: ["japanese"], \u3080\u3088\u3046: ["japanese"], \u3080\u3089\u3055\u304D: ["japanese"], \u3080\u308A\u3087\u3046: ["japanese"], \u3080\u308D\u3093: ["japanese"], \u3081\u3044\u3042\u3093: ["japanese"], \u3081\u3044\u3046\u3093: ["japanese"], \u3081\u3044\u3048\u3093: ["japanese"], \u3081\u3044\u304B\u304F: ["japanese"], \u3081\u3044\u304D\u3087\u304F: ["japanese"], \u3081\u3044\u3055\u3044: ["japanese"], \u3081\u3044\u3057: ["japanese"], \u3081\u3044\u305D\u3046: ["japanese"], \u3081\u3044\u3075\u3099\u3064: ["japanese"], \u3081\u3044\u308C\u3044: ["japanese"], \u3081\u3044\u308F\u304F: ["japanese"], \u3081\u304F\u3099\u307E\u308C\u308B: ["japanese"], \u3081\u3055\u3099\u3059: ["japanese"], \u3081\u3057\u305F: ["japanese"], \u3081\u3059\u3099\u3089\u3057\u3044: ["japanese"], \u3081\u305F\u3099\u3064: ["japanese"], \u3081\u307E\u3044: ["japanese"], \u3081\u3084\u3059: ["japanese"], \u3081\u3093\u304D\u3087: ["japanese"], \u3081\u3093\u305B\u304D: ["japanese"], \u3081\u3093\u3068\u3099\u3046: ["japanese"], \u3082\u3046\u3057\u3042\u3051\u3099\u308B: ["japanese"], \u3082\u3046\u3068\u3099\u3046\u3051\u3093: ["japanese"], \u3082\u3048\u308B: ["japanese"], \u3082\u304F\u3057: ["japanese"], \u3082\u304F\u3066\u304D: ["japanese"], \u3082\u304F\u3088\u3046\u3072\u3099: ["japanese"], \u3082\u3061\u308D\u3093: ["japanese"], \u3082\u3068\u3099\u308B: ["japanese"], \u3082\u3089\u3046: ["japanese"], \u3082\u3093\u304F: ["japanese"], \u3082\u3093\u305F\u3099\u3044: ["japanese"], \u3084\u304A\u3084: ["japanese"], \u3084\u3051\u308B: ["japanese"], \u3084\u3055\u3044: ["japanese"], \u3084\u3055\u3057\u3044: ["japanese"], \u3084\u3059\u3044: ["japanese"], \u3084\u3059\u305F\u308D\u3046: ["japanese"], \u3084\u3059\u307F: ["japanese"], \u3084\u305B\u308B: ["japanese"], \u3084\u305D\u3046: ["japanese"], \u3084\u305F\u3044: ["japanese"], \u3084\u3061\u3093: ["japanese"], \u3084\u3063\u3068: ["japanese"], \u3084\u3063\u306F\u309A\u308A: ["japanese"], \u3084\u3075\u3099\u308B: ["japanese"], \u3084\u3081\u308B: ["japanese"], \u3084\u3084\u3053\u3057\u3044: ["japanese"], \u3084\u3088\u3044: ["japanese"], \u3084\u308F\u3089\u304B\u3044: ["japanese"], \u3086\u3046\u304D: ["japanese"], \u3086\u3046\u3072\u3099\u3093\u304D\u3087\u304F: ["japanese"], \u3086\u3046\u3078\u3099: ["japanese"], \u3086\u3046\u3081\u3044: ["japanese"], \u3086\u3051\u3064: ["japanese"], \u3086\u3057\u3085\u3064: ["japanese"], \u3086\u305B\u3093: ["japanese"], \u3086\u305D\u3046: ["japanese"], \u3086\u305F\u304B: ["japanese"], \u3086\u3061\u3083\u304F: ["japanese"], \u3086\u3066\u3099\u308B: ["japanese"], \u3086\u306B\u3085\u3046: ["japanese"], \u3086\u3072\u3099\u308F: ["japanese"], \u3086\u3089\u3044: ["japanese"], \u3086\u308C\u308B: ["japanese"], \u3088\u3046\u3044: ["japanese"], \u3088\u3046\u304B: ["japanese"], \u3088\u3046\u304D\u3085\u3046: ["japanese"], \u3088\u3046\u3057\u3099: ["japanese"], \u3088\u3046\u3059: ["japanese"], \u3088\u3046\u3061\u3048\u3093: ["japanese"], \u3088\u304B\u305B\u3099: ["japanese"], \u3088\u304B\u3093: ["japanese"], \u3088\u304D\u3093: ["japanese"], \u3088\u304F\u305B\u3044: ["japanese"], \u3088\u304F\u307B\u3099\u3046: ["japanese"], \u3088\u3051\u3044: ["japanese"], \u3088\u3053\u3099\u308C\u308B: ["japanese"], \u3088\u3055\u3093: ["japanese"], \u3088\u3057\u3085\u3046: ["japanese"], \u3088\u305D\u3046: ["japanese"], \u3088\u305D\u304F: ["japanese"], \u3088\u3063\u304B: ["japanese"], \u3088\u3066\u3044: ["japanese"], \u3088\u3068\u3099\u304B\u3099\u308F\u304F: ["japanese"], \u3088\u306D\u3064: ["japanese"], \u3088\u3084\u304F: ["japanese"], \u3088\u3086\u3046: ["japanese"], \u3088\u308D\u3053\u3075\u3099: ["japanese"], \u3088\u308D\u3057\u3044: ["japanese"], \u3089\u3044\u3046: ["japanese"], \u3089\u304F\u304B\u3099\u304D: ["japanese"], \u3089\u304F\u3053\u3099: ["japanese"], \u3089\u304F\u3055\u3064: ["japanese"], \u3089\u304F\u305F\u3099: ["japanese"], \u3089\u3057\u3093\u306F\u3099\u3093: ["japanese"], \u3089\u305B\u3093: ["japanese"], \u3089\u305D\u3099\u304F: ["japanese"], \u3089\u305F\u3044: ["japanese"], \u3089\u3063\u304B: ["japanese"], \u3089\u308C\u3064: ["japanese"], \u308A\u3048\u304D: ["japanese"], \u308A\u304B\u3044: ["japanese"], \u308A\u304D\u3055\u304F: ["japanese"], \u308A\u304D\u305B\u3064: ["japanese"], \u308A\u304F\u304F\u3099\u3093: ["japanese"], \u308A\u304F\u3064: ["japanese"], \u308A\u3051\u3093: ["japanese"], \u308A\u3053\u3046: ["japanese"], \u308A\u305B\u3044: ["japanese"], \u308A\u305D\u3046: ["japanese"], \u308A\u305D\u304F: ["japanese"], \u308A\u3066\u3093: ["japanese"], \u308A\u306D\u3093: ["japanese"], \u308A\u3086\u3046: ["japanese"], \u308A\u3085\u3046\u304B\u3099\u304F: ["japanese"], \u308A\u3088\u3046: ["japanese"], \u308A\u3087\u3046\u308A: ["japanese"], \u308A\u3087\u304B\u3093: ["japanese"], \u308A\u3087\u304F\u3061\u3083: ["japanese"], \u308A\u3087\u3053\u3046: ["japanese"], \u308A\u308A\u304F: ["japanese"], \u308A\u308C\u304D: ["japanese"], \u308A\u308D\u3093: ["japanese"], \u308A\u3093\u3053\u3099: ["japanese"], \u308B\u3044\u3051\u3044: ["japanese"], \u308B\u3044\u3055\u3044: ["japanese"], \u308B\u3044\u3057\u3099: ["japanese"], \u308B\u3044\u305B\u304D: ["japanese"], \u308B\u3059\u306F\u3099\u3093: ["japanese"], \u308B\u308A\u304B\u3099\u308F\u3089: ["japanese"], \u308C\u3044\u304B\u3093: ["japanese"], \u308C\u3044\u304D\u3099: ["japanese"], \u308C\u3044\u305B\u3044: ["japanese"], \u308C\u3044\u305D\u3099\u3046\u3053: ["japanese"], \u308C\u3044\u3068\u3046: ["japanese"], \u308C\u3044\u307B\u3099\u3046: ["japanese"], \u308C\u304D\u3057: ["japanese"], \u308C\u304D\u305F\u3099\u3044: ["japanese"], \u308C\u3093\u3042\u3044: ["japanese"], \u308C\u3093\u3051\u3044: ["japanese"], \u308C\u3093\u3053\u3093: ["japanese"], \u308C\u3093\u3055\u3044: ["japanese"], \u308C\u3093\u3057\u3085\u3046: ["japanese"], \u308C\u3093\u305D\u3099\u304F: ["japanese"], \u308C\u3093\u3089\u304F: ["japanese"], \u308D\u3046\u304B: ["japanese"], \u308D\u3046\u3053\u3099: ["japanese"], \u308D\u3046\u3057\u3099\u3093: ["japanese"], \u308D\u3046\u305D\u304F: ["japanese"], \u308D\u304F\u304B\u3099: ["japanese"], \u308D\u3053\u3064: ["japanese"], \u308D\u3057\u3099\u3046\u3089: ["japanese"], \u308D\u3057\u3085\u3064: ["japanese"], \u308D\u305B\u3093: ["japanese"], \u308D\u3066\u3093: ["japanese"], \u308D\u3081\u3093: ["japanese"], \u308D\u308C\u3064: ["japanese"], \u308D\u3093\u304D\u3099: ["japanese"], \u308D\u3093\u306F\u309A: ["japanese"], \u308D\u3093\u3075\u3099\u3093: ["japanese"], \u308D\u3093\u308A: ["japanese"], \u308F\u304B\u3059: ["japanese"], \u308F\u304B\u3081: ["japanese"], \u308F\u304B\u3084\u307E: ["japanese"], \u308F\u304B\u308C\u308B: ["japanese"], \u308F\u3057\u3064: ["japanese"], \u308F\u3057\u3099\u307E\u3057: ["japanese"], \u308F\u3059\u308C\u3082\u306E: ["japanese"], \u308F\u3089\u3046: ["japanese"], \u308F\u308C\u308B: ["japanese"], \u1100\u1161\u1100\u1167\u11A8: ["korean"], \u1100\u1161\u1101\u1173\u11B7: ["korean"], \u1100\u1161\u1102\u1161\u11AB: ["korean"], \u1100\u1161\u1102\u1173\u11BC: ["korean"], \u1100\u1161\u1103\u1173\u11A8: ["korean"], \u1100\u1161\u1105\u1173\u110E\u1175\u11B7: ["korean"], \u1100\u1161\u1106\u116E\u11B7: ["korean"], \u1100\u1161\u1107\u1161\u11BC: ["korean"], \u1100\u1161\u1109\u1161\u11BC: ["korean"], \u1100\u1161\u1109\u1173\u11B7: ["korean"], \u1100\u1161\u110B\u116E\u11AB\u1103\u1166: ["korean"], \u1100\u1161\u110B\u1173\u11AF: ["korean"], \u1100\u1161\u110B\u1175\u1103\u1173: ["korean"], \u1100\u1161\u110B\u1175\u11B8: ["korean"], \u1100\u1161\u110C\u1161\u11BC: ["korean"], \u1100\u1161\u110C\u1165\u11BC: ["korean"], \u1100\u1161\u110C\u1169\u11A8: ["korean"], \u1100\u1161\u110C\u116E\u11A8: ["korean"], \u1100\u1161\u11A8\u110B\u1169: ["korean"], \u1100\u1161\u11A8\u110C\u1161: ["korean"], \u1100\u1161\u11AB\u1100\u1167\u11A8: ["korean"], \u1100\u1161\u11AB\u1107\u116E: ["korean"], \u1100\u1161\u11AB\u1109\u1165\u11B8: ["korean"], \u1100\u1161\u11AB\u110C\u1161\u11BC: ["korean"], \u1100\u1161\u11AB\u110C\u1165\u11B8: ["korean"], \u1100\u1161\u11AB\u1111\u1161\u11AB: ["korean"], \u1100\u1161\u11AF\u1103\u1173\u11BC: ["korean"], \u1100\u1161\u11AF\u1107\u1175: ["korean"], \u1100\u1161\u11AF\u1109\u1162\u11A8: ["korean"], \u1100\u1161\u11AF\u110C\u1173\u11BC: ["korean"], \u1100\u1161\u11B7\u1100\u1161\u11A8: ["korean"], \u1100\u1161\u11B7\u1100\u1175: ["korean"], \u1100\u1161\u11B7\u1109\u1169: ["korean"], \u1100\u1161\u11B7\u1109\u116E\u1109\u1165\u11BC: ["korean"], \u1100\u1161\u11B7\u110C\u1161: ["korean"], \u1100\u1161\u11B7\u110C\u1165\u11BC: ["korean"], \u1100\u1161\u11B8\u110C\u1161\u1100\u1175: ["korean"], \u1100\u1161\u11BC\u1102\u1161\u11B7: ["korean"], \u1100\u1161\u11BC\u1103\u1161\u11BC: ["korean"], \u1100\u1161\u11BC\u1103\u1169: ["korean"], \u1100\u1161\u11BC\u1105\u1167\u11A8\u1112\u1175: ["korean"], \u1100\u1161\u11BC\u1107\u1167\u11AB: ["korean"], \u1100\u1161\u11BC\u1107\u116E\u11A8: ["korean"], \u1100\u1161\u11BC\u1109\u1161: ["korean"], \u1100\u1161\u11BC\u1109\u116E\u1105\u1163\u11BC: ["korean"], \u1100\u1161\u11BC\u110B\u1161\u110C\u1175: ["korean"], \u1100\u1161\u11BC\u110B\u116F\u11AB\u1103\u1169: ["korean"], \u1100\u1161\u11BC\u110B\u1174: ["korean"], \u1100\u1161\u11BC\u110C\u1166: ["korean"], \u1100\u1161\u11BC\u110C\u1169: ["korean"], \u1100\u1161\u11C0\u110B\u1175: ["korean"], \u1100\u1162\u1100\u116E\u1105\u1175: ["korean"], \u1100\u1162\u1102\u1161\u1105\u1175: ["korean"], \u1100\u1162\u1107\u1161\u11BC: ["korean"], \u1100\u1162\u1107\u1167\u11AF: ["korean"], \u1100\u1162\u1109\u1165\u11AB: ["korean"], \u1100\u1162\u1109\u1165\u11BC: ["korean"], \u1100\u1162\u110B\u1175\u11AB: ["korean"], \u1100\u1162\u11A8\u1100\u116A\u11AB\u110C\u1165\u11A8: ["korean"], \u1100\u1165\u1109\u1175\u11AF: ["korean"], \u1100\u1165\u110B\u1162\u11A8: ["korean"], \u1100\u1165\u110B\u116E\u11AF: ["korean"], \u1100\u1165\u110C\u1175\u11BA: ["korean"], \u1100\u1165\u1111\u116E\u11B7: ["korean"], \u1100\u1165\u11A8\u110C\u1165\u11BC: ["korean"], \u1100\u1165\u11AB\u1100\u1161\u11BC: ["korean"], \u1100\u1165\u11AB\u1106\u116E\u11AF: ["korean"], \u1100\u1165\u11AB\u1109\u1165\u11AF: ["korean"], \u1100\u1165\u11AB\u110C\u1169: ["korean"], \u1100\u1165\u11AB\u110E\u116E\u11A8: ["korean"], \u1100\u1165\u11AF\u110B\u1173\u11B7: ["korean"], \u1100\u1165\u11B7\u1109\u1161: ["korean"], \u1100\u1165\u11B7\u1110\u1169: ["korean"], \u1100\u1166\u1109\u1175\u1111\u1161\u11AB: ["korean"], \u1100\u1166\u110B\u1175\u11B7: ["korean"], \u1100\u1167\u110B\u116E\u11AF: ["korean"], \u1100\u1167\u11AB\u1112\u1162: ["korean"], \u1100\u1167\u11AF\u1100\u116A: ["korean"], \u1100\u1167\u11AF\u1100\u116E\u11A8: ["korean"], \u1100\u1167\u11AF\u1105\u1169\u11AB: ["korean"], \u1100\u1167\u11AF\u1109\u1165\u11A8: ["korean"], \u1100\u1167\u11AF\u1109\u1173\u11BC: ["korean"], \u1100\u1167\u11AF\u1109\u1175\u11B7: ["korean"], \u1100\u1167\u11AF\u110C\u1165\u11BC: ["korean"], \u1100\u1167\u11AF\u1112\u1169\u11AB: ["korean"], \u1100\u1167\u11BC\u1100\u1168: ["korean"], \u1100\u1167\u11BC\u1100\u1169: ["korean"], \u1100\u1167\u11BC\u1100\u1175: ["korean"], \u1100\u1167\u11BC\u1105\u1167\u11A8: ["korean"], \u1100\u1167\u11BC\u1107\u1169\u11A8\u1100\u116E\u11BC: ["korean"], \u1100\u1167\u11BC\u1107\u1175: ["korean"], \u1100\u1167\u11BC\u1109\u1161\u11BC\u1103\u1169: ["korean"], \u1100\u1167\u11BC\u110B\u1167\u11BC: ["korean"], \u1100\u1167\u11BC\u110B\u116E: ["korean"], \u1100\u1167\u11BC\u110C\u1162\u11BC: ["korean"], \u1100\u1167\u11BC\u110C\u1166: ["korean"], \u1100\u1167\u11BC\u110C\u116E: ["korean"], \u1100\u1167\u11BC\u110E\u1161\u11AF: ["korean"], \u1100\u1167\u11BC\u110E\u1175: ["korean"], \u1100\u1167\u11BC\u1112\u1163\u11BC: ["korean"], \u1100\u1167\u11BC\u1112\u1165\u11B7: ["korean"], \u1100\u1168\u1100\u1169\u11A8: ["korean"], \u1100\u1168\u1103\u1161\u11AB: ["korean"], \u1100\u1168\u1105\u1161\u11AB: ["korean"], \u1100\u1168\u1109\u1161\u11AB: ["korean"], \u1100\u1168\u1109\u1169\u11A8: ["korean"], \u1100\u1168\u110B\u1163\u11A8: ["korean"], \u1100\u1168\u110C\u1165\u11AF: ["korean"], \u1100\u1168\u110E\u1173\u11BC: ["korean"], \u1100\u1168\u1112\u116C\u11A8: ["korean"], \u1100\u1169\u1100\u1162\u11A8: ["korean"], \u1100\u1169\u1100\u116E\u1105\u1167: ["korean"], \u1100\u1169\u1100\u116E\u11BC: ["korean"], \u1100\u1169\u1100\u1173\u11B8: ["korean"], \u1100\u1169\u1103\u1173\u11BC\u1112\u1161\u11A8\u1109\u1162\u11BC: ["korean"], \u1100\u1169\u1106\u116E\u1109\u1175\u11AB: ["korean"], \u1100\u1169\u1106\u1175\u11AB: ["korean"], \u1100\u1169\u110B\u1163\u11BC\u110B\u1175: ["korean"], \u1100\u1169\u110C\u1161\u11BC: ["korean"], \u1100\u1169\u110C\u1165\u11AB: ["korean"], \u1100\u1169\u110C\u1175\u11B8: ["korean"], \u1100\u1169\u110E\u116E\u11BA\u1100\u1161\u1105\u116E: ["korean"], \u1100\u1169\u1110\u1169\u11BC: ["korean"], \u1100\u1169\u1112\u1163\u11BC: ["korean"], \u1100\u1169\u11A8\u1109\u1175\u11A8: ["korean"], \u1100\u1169\u11AF\u1106\u1169\u11A8: ["korean"], \u1100\u1169\u11AF\u110D\u1161\u1100\u1175: ["korean"], \u1100\u1169\u11AF\u1111\u1173: ["korean"], \u1100\u1169\u11BC\u1100\u1161\u11AB: ["korean"], \u1100\u1169\u11BC\u1100\u1162: ["korean"], \u1100\u1169\u11BC\u1100\u1167\u11A8: ["korean"], \u1100\u1169\u11BC\u1100\u116E\u11AB: ["korean"], \u1100\u1169\u11BC\u1100\u1173\u11B8: ["korean"], \u1100\u1169\u11BC\u1100\u1175: ["korean"], \u1100\u1169\u11BC\u1103\u1169\u11BC: ["korean"], \u1100\u1169\u11BC\u1106\u116E\u110B\u116F\u11AB: ["korean"], \u1100\u1169\u11BC\u1107\u116E: ["korean"], \u1100\u1169\u11BC\u1109\u1161: ["korean"], \u1100\u1169\u11BC\u1109\u1175\u11A8: ["korean"], \u1100\u1169\u11BC\u110B\u1165\u11B8: ["korean"], \u1100\u1169\u11BC\u110B\u1167\u11AB: ["korean"], \u1100\u1169\u11BC\u110B\u116F\u11AB: ["korean"], \u1100\u1169\u11BC\u110C\u1161\u11BC: ["korean"], \u1100\u1169\u11BC\u110D\u1161: ["korean"], \u1100\u1169\u11BC\u110E\u1162\u11A8: ["korean"], \u1100\u1169\u11BC\u1110\u1169\u11BC: ["korean"], \u1100\u1169\u11BC\u1111\u1169: ["korean"], \u1100\u1169\u11BC\u1112\u1161\u11BC: ["korean"], \u1100\u1169\u11BC\u1112\u1172\u110B\u1175\u11AF: ["korean"], \u1100\u116A\u1106\u1169\u11A8: ["korean"], \u1100\u116A\u110B\u1175\u11AF: ["korean"], \u1100\u116A\u110C\u1161\u11BC: ["korean"], \u1100\u116A\u110C\u1165\u11BC: ["korean"], \u1100\u116A\u1112\u1161\u11A8: ["korean"], \u1100\u116A\u11AB\u1100\u1162\u11A8: ["korean"], \u1100\u116A\u11AB\u1100\u1168: ["korean"], \u1100\u116A\u11AB\u1100\u116A\u11BC: ["korean"], \u1100\u116A\u11AB\u1102\u1167\u11B7: ["korean"], \u1100\u116A\u11AB\u1105\u1161\u11B7: ["korean"], \u1100\u116A\u11AB\u1105\u1167\u11AB: ["korean"], \u1100\u116A\u11AB\u1105\u1175: ["korean"], \u1100\u116A\u11AB\u1109\u1173\u11B8: ["korean"], \u1100\u116A\u11AB\u1109\u1175\u11B7: ["korean"], \u1100\u116A\u11AB\u110C\u1165\u11B7: ["korean"], \u1100\u116A\u11AB\u110E\u1161\u11AF: ["korean"], \u1100\u116A\u11BC\u1100\u1167\u11BC: ["korean"], \u1100\u116A\u11BC\u1100\u1169: ["korean"], \u1100\u116A\u11BC\u110C\u1161\u11BC: ["korean"], \u1100\u116A\u11BC\u110C\u116E: ["korean"], \u1100\u116C\u1105\u1169\u110B\u116E\u11B7: ["korean"], \u1100\u116C\u11BC\u110C\u1161\u11BC\u1112\u1175: ["korean"], \u1100\u116D\u1100\u116A\u1109\u1165: ["korean"], \u1100\u116D\u1106\u116E\u11AB: ["korean"], \u1100\u116D\u1107\u1169\u11A8: ["korean"], \u1100\u116D\u1109\u1175\u11AF: ["korean"], \u1100\u116D\u110B\u1163\u11BC: ["korean"], \u1100\u116D\u110B\u1172\u11A8: ["korean"], \u1100\u116D\u110C\u1161\u11BC: ["korean"], \u1100\u116D\u110C\u1175\u11A8: ["korean"], \u1100\u116D\u1110\u1169\u11BC: ["korean"], \u1100\u116D\u1112\u116A\u11AB: ["korean"], \u1100\u116D\u1112\u116E\u11AB: ["korean"], \u1100\u116E\u1100\u1167\u11BC: ["korean"], \u1100\u116E\u1105\u1173\u11B7: ["korean"], \u1100\u116E\u1106\u1165\u11BC: ["korean"], \u1100\u116E\u1107\u1167\u11AF: ["korean"], \u1100\u116E\u1107\u116E\u11AB: ["korean"], \u1100\u116E\u1109\u1165\u11A8: ["korean"], \u1100\u116E\u1109\u1165\u11BC: ["korean"], \u1100\u116E\u1109\u1169\u11A8: ["korean"], \u1100\u116E\u110B\u1167\u11A8: ["korean"], \u1100\u116E\u110B\u1175\u11B8: ["korean"], \u1100\u116E\u110E\u1165\u11BC: ["korean"], \u1100\u116E\u110E\u1166\u110C\u1165\u11A8: ["korean"], \u1100\u116E\u11A8\u1100\u1161: ["korean"], \u1100\u116E\u11A8\u1100\u1175: ["korean"], \u1100\u116E\u11A8\u1102\u1162: ["korean"], \u1100\u116E\u11A8\u1105\u1175\u11B8: ["korean"], \u1100\u116E\u11A8\u1106\u116E\u11AF: ["korean"], \u1100\u116E\u11A8\u1106\u1175\u11AB: ["korean"], \u1100\u116E\u11A8\u1109\u116E: ["korean"], \u1100\u116E\u11A8\u110B\u1165: ["korean"], \u1100\u116E\u11A8\u110B\u116A\u11BC: ["korean"], \u1100\u116E\u11A8\u110C\u1165\u11A8: ["korean"], \u1100\u116E\u11A8\u110C\u1166: ["korean"], \u1100\u116E\u11A8\u1112\u116C: ["korean"], \u1100\u116E\u11AB\u1103\u1162: ["korean"], \u1100\u116E\u11AB\u1109\u1161: ["korean"], \u1100\u116E\u11AB\u110B\u1175\u11AB: ["korean"], \u1100\u116E\u11BC\u1100\u1173\u11A8\u110C\u1165\u11A8: ["korean"], \u1100\u116F\u11AB\u1105\u1175: ["korean"], \u1100\u116F\u11AB\u110B\u1171: ["korean"], \u1100\u116F\u11AB\u1110\u116E: ["korean"], \u1100\u1171\u1100\u116E\u11A8: ["korean"], \u1100\u1171\u1109\u1175\u11AB: ["korean"], \u1100\u1172\u110C\u1165\u11BC: ["korean"], \u1100\u1172\u110E\u1175\u11A8: ["korean"], \u1100\u1172\u11AB\u1112\u1167\u11BC: ["korean"], \u1100\u1173\u1102\u1161\u11AF: ["korean"], \u1100\u1173\u1102\u1163\u11BC: ["korean"], \u1100\u1173\u1102\u1173\u11AF: ["korean"], \u1100\u1173\u1105\u1165\u1102\u1161: ["korean"], \u1100\u1173\u1105\u116E\u11B8: ["korean"], \u1100\u1173\u1105\u1173\u11BA: ["korean"], \u1100\u1173\u1105\u1175\u11B7: ["korean"], \u1100\u1173\u110C\u1166\u1109\u1165\u110B\u1163: ["korean"], \u1100\u1173\u1110\u1169\u1105\u1169\u11A8: ["korean"], \u1100\u1173\u11A8\u1107\u1169\u11A8: ["korean"], \u1100\u1173\u11A8\u1112\u1175: ["korean"], \u1100\u1173\u11AB\u1100\u1165: ["korean"], \u1100\u1173\u11AB\u1100\u116D: ["korean"], \u1100\u1173\u11AB\u1105\u1162: ["korean"], \u1100\u1173\u11AB\u1105\u1169: ["korean"], \u1100\u1173\u11AB\u1106\u116E: ["korean"], \u1100\u1173\u11AB\u1107\u1169\u11AB: ["korean"], \u1100\u1173\u11AB\u110B\u116F\u11AB: ["korean"], \u1100\u1173\u11AB\u110B\u1172\u11A8: ["korean"], \u1100\u1173\u11AB\u110E\u1165: ["korean"], \u1100\u1173\u11AF\u110A\u1175: ["korean"], \u1100\u1173\u11AF\u110C\u1161: ["korean"], \u1100\u1173\u11B7\u1100\u1161\u11BC\u1109\u1161\u11AB: ["korean"], \u1100\u1173\u11B7\u1100\u1169: ["korean"], \u1100\u1173\u11B7\u1102\u1167\u11AB: ["korean"], \u1100\u1173\u11B7\u1106\u1166\u1103\u1161\u11AF: ["korean"], \u1100\u1173\u11B7\u110B\u1162\u11A8: ["korean"], \u1100\u1173\u11B7\u110B\u1167\u11AB: ["korean"], \u1100\u1173\u11B7\u110B\u116D\u110B\u1175\u11AF: ["korean"], \u1100\u1173\u11B7\u110C\u1175: ["korean"], \u1100\u1173\u11BC\u110C\u1165\u11BC\u110C\u1165\u11A8: ["korean"], \u1100\u1175\u1100\u1161\u11AB: ["korean"], \u1100\u1175\u1100\u116A\u11AB: ["korean"], \u1100\u1175\u1102\u1167\u11B7: ["korean"], \u1100\u1175\u1102\u1173\u11BC: ["korean"], \u1100\u1175\u1103\u1169\u11A8\u1100\u116D: ["korean"], \u1100\u1175\u1103\u116E\u11BC: ["korean"], \u1100\u1175\u1105\u1169\u11A8: ["korean"], \u1100\u1175\u1105\u1173\u11B7: ["korean"], \u1100\u1175\u1107\u1165\u11B8: ["korean"], \u1100\u1175\u1107\u1169\u11AB: ["korean"], \u1100\u1175\u1107\u116E\u11AB: ["korean"], \u1100\u1175\u1108\u1173\u11B7: ["korean"], \u1100\u1175\u1109\u116E\u11A8\u1109\u1161: ["korean"], \u1100\u1175\u1109\u116E\u11AF: ["korean"], \u1100\u1175\u110B\u1165\u11A8: ["korean"], \u1100\u1175\u110B\u1165\u11B8: ["korean"], \u1100\u1175\u110B\u1169\u11AB: ["korean"], \u1100\u1175\u110B\u116E\u11AB: ["korean"], \u1100\u1175\u110B\u116F\u11AB: ["korean"], \u1100\u1175\u110C\u1165\u11A8: ["korean"], \u1100\u1175\u110C\u116E\u11AB: ["korean"], \u1100\u1175\u110E\u1175\u11B7: ["korean"], \u1100\u1175\u1112\u1169\u11AB: ["korean"], \u1100\u1175\u1112\u116C\u11A8: ["korean"], \u1100\u1175\u11AB\u1100\u1173\u11B8: ["korean"], \u1100\u1175\u11AB\u110C\u1161\u11BC: ["korean"], \u1100\u1175\u11AF\u110B\u1175: ["korean"], \u1100\u1175\u11B7\u1107\u1161\u11B8: ["korean"], \u1100\u1175\u11B7\u110E\u1175: ["korean"], \u1100\u1175\u11B7\u1111\u1169\u1100\u1169\u11BC\u1112\u1161\u11BC: ["korean"], \u1101\u1161\u11A8\u1103\u116E\u1100\u1175: ["korean"], \u1101\u1161\u11B7\u1108\u1161\u11A8: ["korean"], \u1101\u1162\u1103\u1161\u11AF\u110B\u1173\u11B7: ["korean"], \u1101\u1162\u1109\u1169\u1100\u1173\u11B7: ["korean"], \u1101\u1165\u11B8\u110C\u1175\u11AF: ["korean"], \u1101\u1169\u11A8\u1103\u1162\u1100\u1175: ["korean"], \u1101\u1169\u11BE\u110B\u1175\u11C1: ["korean"], \u1102\u1161\u1103\u1173\u11AF\u110B\u1175: ["korean"], \u1102\u1161\u1105\u1161\u11AB\u1112\u1175: ["korean"], \u1102\u1161\u1106\u1165\u110C\u1175: ["korean"], \u1102\u1161\u1106\u116E\u11AF: ["korean"], \u1102\u1161\u110E\u1175\u11B7\u1107\u1161\u11AB: ["korean"], \u1102\u1161\u1112\u1173\u11AF: ["korean"], \u1102\u1161\u11A8\u110B\u1167\u11B8: ["korean"], \u1102\u1161\u11AB\u1107\u1161\u11BC: ["korean"], \u1102\u1161\u11AF\u1100\u1162: ["korean"], \u1102\u1161\u11AF\u110A\u1175: ["korean"], \u1102\u1161\u11AF\u110D\u1161: ["korean"], \u1102\u1161\u11B7\u1102\u1167: ["korean"], \u1102\u1161\u11B7\u1103\u1162\u1106\u116E\u11AB: ["korean"], \u1102\u1161\u11B7\u1106\u1162: ["korean"], \u1102\u1161\u11B7\u1109\u1161\u11AB: ["korean"], \u1102\u1161\u11B7\u110C\u1161: ["korean"], \u1102\u1161\u11B7\u1111\u1167\u11AB: ["korean"], \u1102\u1161\u11B7\u1112\u1161\u11A8\u1109\u1162\u11BC: ["korean"], \u1102\u1161\u11BC\u1107\u1175: ["korean"], \u1102\u1161\u11C0\u1106\u1161\u11AF: ["korean"], \u1102\u1162\u1102\u1167\u11AB: ["korean"], \u1102\u1162\u110B\u116D\u11BC: ["korean"], \u1102\u1162\u110B\u1175\u11AF: ["korean"], \u1102\u1162\u11B7\u1107\u1175: ["korean"], \u1102\u1162\u11B7\u1109\u1162: ["korean"], \u1102\u1162\u11BA\u1106\u116E\u11AF: ["korean"], \u1102\u1162\u11BC\u1103\u1169\u11BC: ["korean"], \u1102\u1162\u11BC\u1106\u1167\u11AB: ["korean"], \u1102\u1162\u11BC\u1107\u1161\u11BC: ["korean"], \u1102\u1162\u11BC\u110C\u1161\u11BC\u1100\u1169: ["korean"], \u1102\u1166\u11A8\u1110\u1161\u110B\u1175: ["korean"], \u1102\u1166\u11BA\u110D\u1162: ["korean"], \u1102\u1169\u1103\u1169\u11BC: ["korean"], \u1102\u1169\u1105\u1161\u11AB\u1109\u1162\u11A8: ["korean"], \u1102\u1169\u1105\u1167\u11A8: ["korean"], \u1102\u1169\u110B\u1175\u11AB: ["korean"], \u1102\u1169\u11A8\u110B\u1173\u11B7: ["korean"], \u1102\u1169\u11A8\u110E\u1161: ["korean"], \u1102\u1169\u11A8\u1112\u116A: ["korean"], \u1102\u1169\u11AB\u1105\u1175: ["korean"], \u1102\u1169\u11AB\u1106\u116E\u11AB: ["korean"], \u1102\u1169\u11AB\u110C\u1162\u11BC: ["korean"], \u1102\u1169\u11AF\u110B\u1175: ["korean"], \u1102\u1169\u11BC\u1100\u116E: ["korean"], \u1102\u1169\u11BC\u1103\u1161\u11B7: ["korean"], \u1102\u1169\u11BC\u1106\u1175\u11AB: ["korean"], \u1102\u1169\u11BC\u1107\u116E: ["korean"], \u1102\u1169\u11BC\u110B\u1165\u11B8: ["korean"], \u1102\u1169\u11BC\u110C\u1161\u11BC: ["korean"], \u1102\u1169\u11BC\u110E\u1169\u11AB: ["korean"], \u1102\u1169\u11C1\u110B\u1175: ["korean"], \u1102\u116E\u11AB\u1103\u1169\u11BC\u110C\u1161: ["korean"], \u1102\u116E\u11AB\u1106\u116E\u11AF: ["korean"], \u1102\u116E\u11AB\u110A\u1165\u11B8: ["korean"], \u1102\u1172\u110B\u116D\u11A8: ["korean"], \u1102\u1173\u1101\u1175\u11B7: ["korean"], \u1102\u1173\u11A8\u1103\u1162: ["korean"], \u1102\u1173\u11BC\u1103\u1169\u11BC\u110C\u1165\u11A8: ["korean"], \u1102\u1173\u11BC\u1105\u1167\u11A8: ["korean"], \u1103\u1161\u1107\u1161\u11BC: ["korean"], \u1103\u1161\u110B\u1163\u11BC\u1109\u1165\u11BC: ["korean"], \u1103\u1161\u110B\u1173\u11B7: ["korean"], \u1103\u1161\u110B\u1175\u110B\u1165\u1110\u1173: ["korean"], \u1103\u1161\u1112\u1162\u11BC: ["korean"], \u1103\u1161\u11AB\u1100\u1168: ["korean"], \u1103\u1161\u11AB\u1100\u1169\u11AF: ["korean"], \u1103\u1161\u11AB\u1103\u1169\u11A8: ["korean"], \u1103\u1161\u11AB\u1106\u1161\u11BA: ["korean"], \u1103\u1161\u11AB\u1109\u116E\u11AB: ["korean"], \u1103\u1161\u11AB\u110B\u1165: ["korean"], \u1103\u1161\u11AB\u110B\u1171: ["korean"], \u1103\u1161\u11AB\u110C\u1165\u11B7: ["korean"], \u1103\u1161\u11AB\u110E\u1166: ["korean"], \u1103\u1161\u11AB\u110E\u116E: ["korean"], \u1103\u1161\u11AB\u1111\u1167\u11AB: ["korean"], \u1103\u1161\u11AB\u1111\u116E\u11BC: ["korean"], \u1103\u1161\u11AF\u1100\u1163\u11AF: ["korean"], \u1103\u1161\u11AF\u1105\u1165: ["korean"], \u1103\u1161\u11AF\u1105\u1167\u11A8: ["korean"], \u1103\u1161\u11AF\u1105\u1175: ["korean"], \u1103\u1161\u11B0\u1100\u1169\u1100\u1175: ["korean"], \u1103\u1161\u11B7\u1103\u1161\u11BC: ["korean"], \u1103\u1161\u11B7\u1107\u1162: ["korean"], \u1103\u1161\u11B7\u110B\u116D: ["korean"], \u1103\u1161\u11B7\u110B\u1175\u11B7: ["korean"], \u1103\u1161\u11B8\u1107\u1167\u11AB: ["korean"], \u1103\u1161\u11B8\u110C\u1161\u11BC: ["korean"], \u1103\u1161\u11BC\u1100\u1173\u11AB: ["korean"], \u1103\u1161\u11BC\u1107\u116E\u11AB\u1100\u1161\u11AB: ["korean"], \u1103\u1161\u11BC\u110B\u1167\u11AB\u1112\u1175: ["korean"], \u1103\u1161\u11BC\u110C\u1161\u11BC: ["korean"], \u1103\u1162\u1100\u1172\u1106\u1169: ["korean"], \u1103\u1162\u1102\u1161\u11BD: ["korean"], \u1103\u1162\u1103\u1161\u11AB\u1112\u1175: ["korean"], \u1103\u1162\u1103\u1161\u11B8: ["korean"], \u1103\u1162\u1103\u1169\u1109\u1175: ["korean"], \u1103\u1162\u1105\u1163\u11A8: ["korean"], \u1103\u1162\u1105\u1163\u11BC: ["korean"], \u1103\u1162\u1105\u1172\u11A8: ["korean"], \u1103\u1162\u1106\u116E\u11AB: ["korean"], \u1103\u1162\u1107\u116E\u1107\u116E\u11AB: ["korean"], \u1103\u1162\u1109\u1175\u11AB: ["korean"], \u1103\u1162\u110B\u1173\u11BC: ["korean"], \u1103\u1162\u110C\u1161\u11BC: ["korean"], \u1103\u1162\u110C\u1165\u11AB: ["korean"], \u1103\u1162\u110C\u1165\u11B8: ["korean"], \u1103\u1162\u110C\u116E\u11BC: ["korean"], \u1103\u1162\u110E\u1162\u11A8: ["korean"], \u1103\u1162\u110E\u116E\u11AF: ["korean"], \u1103\u1162\u110E\u116E\u11BC: ["korean"], \u1103\u1162\u1110\u1169\u11BC\u1105\u1167\u11BC: ["korean"], \u1103\u1162\u1112\u1161\u11A8: ["korean"], \u1103\u1162\u1112\u1161\u11AB\u1106\u1175\u11AB\u1100\u116E\u11A8: ["korean"], \u1103\u1162\u1112\u1161\u11B8\u1109\u1175\u11AF: ["korean"], \u1103\u1162\u1112\u1167\u11BC: ["korean"], \u1103\u1165\u11BC\u110B\u1165\u1105\u1175: ["korean"], \u1103\u1166\u110B\u1175\u1110\u1173: ["korean"], \u1103\u1169\u1103\u1162\u110E\u1166: ["korean"], \u1103\u1169\u1103\u1165\u11A8: ["korean"], \u1103\u1169\u1103\u116E\u11A8: ["korean"], \u1103\u1169\u1106\u1161\u11BC: ["korean"], \u1103\u1169\u1109\u1165\u1100\u116A\u11AB: ["korean"], \u1103\u1169\u1109\u1175\u11B7: ["korean"], \u1103\u1169\u110B\u116E\u11B7: ["korean"], \u1103\u1169\u110B\u1175\u11B8: ["korean"], \u1103\u1169\u110C\u1161\u1100\u1175: ["korean"], \u1103\u1169\u110C\u1165\u1112\u1175: ["korean"], \u1103\u1169\u110C\u1165\u11AB: ["korean"], \u1103\u1169\u110C\u116E\u11BC: ["korean"], \u1103\u1169\u110E\u1161\u11A8: ["korean"], \u1103\u1169\u11A8\u1100\u1161\u11B7: ["korean"], \u1103\u1169\u11A8\u1105\u1175\u11B8: ["korean"], \u1103\u1169\u11A8\u1109\u1165: ["korean"], \u1103\u1169\u11A8\u110B\u1175\u11AF: ["korean"], \u1103\u1169\u11A8\u110E\u1161\u11BC\u110C\u1165\u11A8: ["korean"], \u1103\u1169\u11BC\u1112\u116A\u110E\u1162\u11A8: ["korean"], \u1103\u1171\u11BA\u1106\u1169\u1109\u1173\u11B8: ["korean"], \u1103\u1171\u11BA\u1109\u1161\u11AB: ["korean"], \u1104\u1161\u11AF\u110B\u1161\u110B\u1175: ["korean"], \u1106\u1161\u1102\u116E\u1105\u1161: ["korean"], \u1106\u1161\u1102\u1173\u11AF: ["korean"], \u1106\u1161\u1103\u1161\u11BC: ["korean"], \u1106\u1161\u1105\u1161\u1110\u1169\u11AB: ["korean"], \u1106\u1161\u1105\u1167\u11AB: ["korean"], \u1106\u1161\u1106\u116E\u1105\u1175: ["korean"], \u1106\u1161\u1109\u1161\u110C\u1175: ["korean"], \u1106\u1161\u110B\u1163\u11A8: ["korean"], \u1106\u1161\u110B\u116D\u1102\u1166\u110C\u1173: ["korean"], \u1106\u1161\u110B\u1173\u11AF: ["korean"], \u1106\u1161\u110B\u1173\u11B7: ["korean"], \u1106\u1161\u110B\u1175\u110F\u1173: ["korean"], \u1106\u1161\u110C\u116E\u11BC: ["korean"], \u1106\u1161\u110C\u1175\u1106\u1161\u11A8: ["korean"], \u1106\u1161\u110E\u1161\u11AB\u1100\u1161\u110C\u1175: ["korean"], \u1106\u1161\u110E\u1161\u11AF: ["korean"], \u1106\u1161\u1112\u1173\u11AB: ["korean"], \u1106\u1161\u11A8\u1100\u1165\u11AF\u1105\u1175: ["korean"], \u1106\u1161\u11A8\u1102\u1162: ["korean"], \u1106\u1161\u11A8\u1109\u1161\u11BC: ["korean"], \u1106\u1161\u11AB\u1102\u1161\u11B7: ["korean"], \u1106\u1161\u11AB\u1103\u116E: ["korean"], \u1106\u1161\u11AB\u1109\u1166: ["korean"], \u1106\u1161\u11AB\u110B\u1163\u11A8: ["korean"], \u1106\u1161\u11AB\u110B\u1175\u11AF: ["korean"], \u1106\u1161\u11AB\u110C\u1165\u11B7: ["korean"], \u1106\u1161\u11AB\u110C\u1169\u11A8: ["korean"], \u1106\u1161\u11AB\u1112\u116A: ["korean"], \u1106\u1161\u11AD\u110B\u1175: ["korean"], \u1106\u1161\u11AF\u1100\u1175: ["korean"], \u1106\u1161\u11AF\u110A\u1173\u11B7: ["korean"], \u1106\u1161\u11AF\u1110\u116E: ["korean"], \u1106\u1161\u11B7\u1103\u1162\u1105\u1169: ["korean"], \u1106\u1161\u11BC\u110B\u116F\u11AB\u1100\u1167\u11BC: ["korean"], \u1106\u1162\u1102\u1167\u11AB: ["korean"], \u1106\u1162\u1103\u1161\u11AF: ["korean"], \u1106\u1162\u1105\u1167\u11A8: ["korean"], \u1106\u1162\u1107\u1165\u11AB: ["korean"], \u1106\u1162\u1109\u1173\u110F\u1165\u11B7: ["korean"], \u1106\u1162\u110B\u1175\u11AF: ["korean"], \u1106\u1162\u110C\u1161\u11BC: ["korean"], \u1106\u1162\u11A8\u110C\u116E: ["korean"], \u1106\u1165\u11A8\u110B\u1175: ["korean"], \u1106\u1165\u11AB\u110C\u1165: ["korean"], \u1106\u1165\u11AB\u110C\u1175: ["korean"], \u1106\u1165\u11AF\u1105\u1175: ["korean"], \u1106\u1166\u110B\u1175\u11AF: ["korean"], \u1106\u1167\u1102\u1173\u1105\u1175: ["korean"], \u1106\u1167\u110E\u1175\u11AF: ["korean"], \u1106\u1167\u11AB\u1103\u1161\u11B7: ["korean"], \u1106\u1167\u11AF\u110E\u1175: ["korean"], \u1106\u1167\u11BC\u1103\u1161\u11AB: ["korean"], \u1106\u1167\u11BC\u1105\u1167\u11BC: ["korean"], \u1106\u1167\u11BC\u110B\u1168: ["korean"], \u1106\u1167\u11BC\u110B\u1174: ["korean"], \u1106\u1167\u11BC\u110C\u1165\u11AF: ["korean"], \u1106\u1167\u11BC\u110E\u1175\u11BC: ["korean"], \u1106\u1167\u11BC\u1112\u1161\u11B7: ["korean"], \u1106\u1169\u1100\u1173\u11B7: ["korean"], \u1106\u1169\u1102\u1175\u1110\u1165: ["korean"], \u1106\u1169\u1103\u1166\u11AF: ["korean"], \u1106\u1169\u1103\u1173\u11AB: ["korean"], \u1106\u1169\u1107\u1165\u11B7: ["korean"], \u1106\u1169\u1109\u1173\u11B8: ["korean"], \u1106\u1169\u110B\u1163\u11BC: ["korean"], \u1106\u1169\u110B\u1175\u11B7: ["korean"], \u1106\u1169\u110C\u1169\u1105\u1175: ["korean"], \u1106\u1169\u110C\u1175\u11B8: ["korean"], \u1106\u1169\u1110\u116E\u11BC\u110B\u1175: ["korean"], \u1106\u1169\u11A8\u1100\u1165\u11AF\u110B\u1175: ["korean"], \u1106\u1169\u11A8\u1105\u1169\u11A8: ["korean"], \u1106\u1169\u11A8\u1109\u1161: ["korean"], \u1106\u1169\u11A8\u1109\u1169\u1105\u1175: ["korean"], \u1106\u1169\u11A8\u1109\u116E\u11B7: ["korean"], \u1106\u1169\u11A8\u110C\u1165\u11A8: ["korean"], \u1106\u1169\u11A8\u1111\u116D: ["korean"], \u1106\u1169\u11AF\u1105\u1162: ["korean"], \u1106\u1169\u11B7\u1106\u1162: ["korean"], \u1106\u1169\u11B7\u1106\u116E\u1100\u1166: ["korean"], \u1106\u1169\u11B7\u1109\u1161\u11AF: ["korean"], \u1106\u1169\u11B7\u1109\u1169\u11A8: ["korean"], \u1106\u1169\u11B7\u110C\u1175\u11BA: ["korean"], \u1106\u1169\u11B7\u1110\u1169\u11BC: ["korean"], \u1106\u1169\u11B8\u1109\u1175: ["korean"], \u1106\u116E\u1100\u116A\u11AB\u1109\u1175\u11B7: ["korean"], \u1106\u116E\u1100\u116E\u11BC\u1112\u116A: ["korean"], \u1106\u116E\u1103\u1165\u110B\u1171: ["korean"], \u1106\u116E\u1103\u1165\u11B7: ["korean"], \u1106\u116E\u1105\u1173\u11C1: ["korean"], \u1106\u116E\u1109\u1173\u11AB: ["korean"], \u1106\u116E\u110B\u1165\u11BA: ["korean"], \u1106\u116E\u110B\u1167\u11A8: ["korean"], \u1106\u116E\u110B\u116D\u11BC: ["korean"], \u1106\u116E\u110C\u1169\u1100\u1165\u11AB: ["korean"], \u1106\u116E\u110C\u1175\u1100\u1162: ["korean"], \u1106\u116E\u110E\u1165\u11A8: ["korean"], \u1106\u116E\u11AB\u1100\u116E: ["korean"], \u1106\u116E\u11AB\u1103\u1173\u11A8: ["korean"], \u1106\u116E\u11AB\u1107\u1165\u11B8: ["korean"], \u1106\u116E\u11AB\u1109\u1165: ["korean"], \u1106\u116E\u11AB\u110C\u1166: ["korean"], \u1106\u116E\u11AB\u1112\u1161\u11A8: ["korean"], \u1106\u116E\u11AB\u1112\u116A: ["korean"], \u1106\u116E\u11AF\u1100\u1161: ["korean"], \u1106\u116E\u11AF\u1100\u1165\u11AB: ["korean"], \u1106\u116E\u11AF\u1100\u1167\u11AF: ["korean"], \u1106\u116E\u11AF\u1100\u1169\u1100\u1175: ["korean"], \u1106\u116E\u11AF\u1105\u1169\u11AB: ["korean"], \u1106\u116E\u11AF\u1105\u1175\u1112\u1161\u11A8: ["korean"], \u1106\u116E\u11AF\u110B\u1173\u11B7: ["korean"], \u1106\u116E\u11AF\u110C\u1175\u11AF: ["korean"], \u1106\u116E\u11AF\u110E\u1166: ["korean"], \u1106\u1175\u1100\u116E\u11A8: ["korean"], \u1106\u1175\u1103\u1175\u110B\u1165: ["korean"], \u1106\u1175\u1109\u1161\u110B\u1175\u11AF: ["korean"], \u1106\u1175\u1109\u116E\u11AF: ["korean"], \u1106\u1175\u110B\u1167\u11A8: ["korean"], \u1106\u1175\u110B\u116D\u11BC\u1109\u1175\u11AF: ["korean"], \u1106\u1175\u110B\u116E\u11B7: ["korean"], \u1106\u1175\u110B\u1175\u11AB: ["korean"], \u1106\u1175\u1110\u1175\u11BC: ["korean"], \u1106\u1175\u1112\u1169\u11AB: ["korean"], \u1106\u1175\u11AB\u1100\u1161\u11AB: ["korean"], \u1106\u1175\u11AB\u110C\u1169\u11A8: ["korean"], \u1106\u1175\u11AB\u110C\u116E: ["korean"], \u1106\u1175\u11AE\u110B\u1173\u11B7: ["korean"], \u1106\u1175\u11AF\u1100\u1161\u1105\u116E: ["korean"], \u1106\u1175\u11AF\u1105\u1175\u1106\u1175\u1110\u1165: ["korean"], \u1106\u1175\u11C0\u1107\u1161\u1103\u1161\u11A8: ["korean"], \u1107\u1161\u1100\u1161\u110C\u1175: ["korean"], \u1107\u1161\u1100\u116E\u1102\u1175: ["korean"], \u1107\u1161\u1102\u1161\u1102\u1161: ["korean"], \u1107\u1161\u1102\u1173\u11AF: ["korean"], \u1107\u1161\u1103\u1161\u11A8: ["korean"], \u1107\u1161\u1103\u1161\u11BA\u1100\u1161: ["korean"], \u1107\u1161\u1105\u1161\u11B7: ["korean"], \u1107\u1161\u110B\u1175\u1105\u1165\u1109\u1173: ["korean"], \u1107\u1161\u1110\u1161\u11BC: ["korean"], \u1107\u1161\u11A8\u1106\u116E\u11AF\u1100\u116A\u11AB: ["korean"], \u1107\u1161\u11A8\u1109\u1161: ["korean"], \u1107\u1161\u11A8\u1109\u116E: ["korean"], \u1107\u1161\u11AB\u1103\u1162: ["korean"], \u1107\u1161\u11AB\u1103\u1173\u1109\u1175: ["korean"], \u1107\u1161\u11AB\u1106\u1161\u11AF: ["korean"], \u1107\u1161\u11AB\u1107\u1161\u11AF: ["korean"], \u1107\u1161\u11AB\u1109\u1165\u11BC: ["korean"], \u1107\u1161\u11AB\u110B\u1173\u11BC: ["korean"], \u1107\u1161\u11AB\u110C\u1161\u11BC: ["korean"], \u1107\u1161\u11AB\u110C\u116E\u11A8: ["korean"], \u1107\u1161\u11AB\u110C\u1175: ["korean"], \u1107\u1161\u11AB\u110E\u1161\u11AB: ["korean"], \u1107\u1161\u11AE\u110E\u1175\u11B7: ["korean"], \u1107\u1161\u11AF\u1100\u1161\u1105\u1161\u11A8: ["korean"], \u1107\u1161\u11AF\u1100\u1165\u11AF\u110B\u1173\u11B7: ["korean"], \u1107\u1161\u11AF\u1100\u1167\u11AB: ["korean"], \u1107\u1161\u11AF\u1103\u1161\u11AF: ["korean"], \u1107\u1161\u11AF\u1105\u1166: ["korean"], \u1107\u1161\u11AF\u1106\u1169\u11A8: ["korean"], \u1107\u1161\u11AF\u1107\u1161\u1103\u1161\u11A8: ["korean"], \u1107\u1161\u11AF\u1109\u1162\u11BC: ["korean"], \u1107\u1161\u11AF\u110B\u1173\u11B7: ["korean"], \u1107\u1161\u11AF\u110C\u1161\u1100\u116E\u11A8: ["korean"], \u1107\u1161\u11AF\u110C\u1165\u11AB: ["korean"], \u1107\u1161\u11AF\u1110\u1169\u11B8: ["korean"], \u1107\u1161\u11AF\u1111\u116D: ["korean"], \u1107\u1161\u11B7\u1112\u1161\u1102\u1173\u11AF: ["korean"], \u1107\u1161\u11B8\u1100\u1173\u1105\u1173\u11BA: ["korean"], \u1107\u1161\u11B8\u1106\u1161\u11BA: ["korean"], \u1107\u1161\u11B8\u1109\u1161\u11BC: ["korean"], \u1107\u1161\u11B8\u1109\u1169\u11C0: ["korean"], \u1107\u1161\u11BC\u1100\u1173\u11B7: ["korean"], \u1107\u1161\u11BC\u1106\u1167\u11AB: ["korean"], \u1107\u1161\u11BC\u1106\u116E\u11AB: ["korean"], \u1107\u1161\u11BC\u1107\u1161\u1103\u1161\u11A8: ["korean"], \u1107\u1161\u11BC\u1107\u1165\u11B8: ["korean"], \u1107\u1161\u11BC\u1109\u1169\u11BC: ["korean"], \u1107\u1161\u11BC\u1109\u1175\u11A8: ["korean"], \u1107\u1161\u11BC\u110B\u1161\u11AB: ["korean"], \u1107\u1161\u11BC\u110B\u116E\u11AF: ["korean"], \u1107\u1161\u11BC\u110C\u1175: ["korean"], \u1107\u1161\u11BC\u1112\u1161\u11A8: ["korean"], \u1107\u1161\u11BC\u1112\u1162: ["korean"], \u1107\u1161\u11BC\u1112\u1163\u11BC: ["korean"], \u1107\u1162\u1100\u1167\u11BC: ["korean"], \u1107\u1162\u1101\u1169\u11B8: ["korean"], \u1107\u1162\u1103\u1161\u11AF: ["korean"], \u1107\u1162\u1103\u1173\u1106\u1175\u11AB\u1110\u1165\u11AB: ["korean"], \u1107\u1162\u11A8\u1103\u116E\u1109\u1161\u11AB: ["korean"], \u1107\u1162\u11A8\u1109\u1162\u11A8: ["korean"], \u1107\u1162\u11A8\u1109\u1165\u11BC: ["korean"], \u1107\u1162\u11A8\u110B\u1175\u11AB: ["korean"], \u1107\u1162\u11A8\u110C\u1166: ["korean"], \u1107\u1162\u11A8\u1112\u116A\u110C\u1165\u11B7: ["korean"], \u1107\u1165\u1105\u1173\u11BA: ["korean"], \u1107\u1165\u1109\u1165\u11BA: ["korean"], \u1107\u1165\u1110\u1173\u11AB: ["korean"], \u1107\u1165\u11AB\u1100\u1162: ["korean"], \u1107\u1165\u11AB\u110B\u1167\u11A8: ["korean"], \u1107\u1165\u11AB\u110C\u1175: ["korean"], \u1107\u1165\u11AB\u1112\u1169: ["korean"], \u1107\u1165\u11AF\u1100\u1173\u11B7: ["korean"], \u1107\u1165\u11AF\u1105\u1166: ["korean"], \u1107\u1165\u11AF\u110A\u1165: ["korean"], \u1107\u1165\u11B7\u110B\u1171: ["korean"], \u1107\u1165\u11B7\u110B\u1175\u11AB: ["korean"], \u1107\u1165\u11B7\u110C\u116C: ["korean"], \u1107\u1165\u11B8\u1105\u1172\u11AF: ["korean"], \u1107\u1165\u11B8\u110B\u116F\u11AB: ["korean"], \u1107\u1165\u11B8\u110C\u1165\u11A8: ["korean"], \u1107\u1165\u11B8\u110E\u1175\u11A8: ["korean"], \u1107\u1166\u110B\u1175\u110C\u1175\u11BC: ["korean"], \u1107\u1166\u11AF\u1110\u1173: ["korean"], \u1107\u1167\u11AB\u1100\u1167\u11BC: ["korean"], \u1107\u1167\u11AB\u1103\u1169\u11BC: ["korean"], \u1107\u1167\u11AB\u1106\u1167\u11BC: ["korean"], \u1107\u1167\u11AB\u1109\u1175\u11AB: ["korean"], \u1107\u1167\u11AB\u1112\u1169\u1109\u1161: ["korean"], \u1107\u1167\u11AB\u1112\u116A: ["korean"], \u1107\u1167\u11AF\u1103\u1169: ["korean"], \u1107\u1167\u11AF\u1106\u1167\u11BC: ["korean"], \u1107\u1167\u11AF\u110B\u1175\u11AF: ["korean"], \u1107\u1167\u11BC\u1109\u1175\u11AF: ["korean"], \u1107\u1167\u11BC\u110B\u1161\u1105\u1175: ["korean"], \u1107\u1167\u11BC\u110B\u116F\u11AB: ["korean"], \u1107\u1169\u1100\u116A\u11AB: ["korean"], \u1107\u1169\u1102\u1165\u1109\u1173: ["korean"], \u1107\u1169\u1105\u1161\u1109\u1162\u11A8: ["korean"], \u1107\u1169\u1105\u1161\u11B7: ["korean"], \u1107\u1169\u1105\u1173\u11B7: ["korean"], \u1107\u1169\u1109\u1161\u11BC: ["korean"], \u1107\u1169\u110B\u1161\u11AB: ["korean"], \u1107\u1169\u110C\u1161\u1100\u1175: ["korean"], \u1107\u1169\u110C\u1161\u11BC: ["korean"], \u1107\u1169\u110C\u1165\u11AB: ["korean"], \u1107\u1169\u110C\u1169\u11AB: ["korean"], \u1107\u1169\u1110\u1169\u11BC: ["korean"], \u1107\u1169\u1111\u1167\u11AB\u110C\u1165\u11A8: ["korean"], \u1107\u1169\u1112\u1165\u11B7: ["korean"], \u1107\u1169\u11A8\u1103\u1169: ["korean"], \u1107\u1169\u11A8\u1109\u1161: ["korean"], \u1107\u1169\u11A8\u1109\u116E\u11BC\u110B\u1161: ["korean"], \u1107\u1169\u11A8\u1109\u1173\u11B8: ["korean"], \u1107\u1169\u11A9\u110B\u1173\u11B7: ["korean"], \u1107\u1169\u11AB\u1100\u1167\u11A8\u110C\u1165\u11A8: ["korean"], \u1107\u1169\u11AB\u1105\u1162: ["korean"], \u1107\u1169\u11AB\u1107\u116E: ["korean"], \u1107\u1169\u11AB\u1109\u1161: ["korean"], \u1107\u1169\u11AB\u1109\u1165\u11BC: ["korean"], \u1107\u1169\u11AB\u110B\u1175\u11AB: ["korean"], \u1107\u1169\u11AB\u110C\u1175\u11AF: ["korean"], \u1107\u1169\u11AF\u1111\u1166\u11AB: ["korean"], \u1107\u1169\u11BC\u1109\u1161: ["korean"], \u1107\u1169\u11BC\u110C\u1175: ["korean"], \u1107\u1169\u11BC\u1110\u116E: ["korean"], \u1107\u116E\u1100\u1173\u11AB: ["korean"], \u1107\u116E\u1101\u1173\u1105\u1165\u110B\u116E\u11B7: ["korean"], \u1107\u116E\u1103\u1161\u11B7: ["korean"], \u1107\u116E\u1103\u1169\u11BC\u1109\u1161\u11AB: ["korean"], \u1107\u116E\u1106\u116E\u11AB: ["korean"], \u1107\u116E\u1107\u116E\u11AB: ["korean"], \u1107\u116E\u1109\u1161\u11AB: ["korean"], \u1107\u116E\u1109\u1161\u11BC: ["korean"], \u1107\u116E\u110B\u1165\u11BF: ["korean"], \u1107\u116E\u110B\u1175\u11AB: ["korean"], \u1107\u116E\u110C\u1161\u11A8\u110B\u116D\u11BC: ["korean"], \u1107\u116E\u110C\u1161\u11BC: ["korean"], \u1107\u116E\u110C\u1165\u11BC: ["korean"], \u1107\u116E\u110C\u1169\u11A8: ["korean"], \u1107\u116E\u110C\u1175\u1105\u1165\u11AB\u1112\u1175: ["korean"], \u1107\u116E\u110E\u1175\u11AB: ["korean"], \u1107\u116E\u1110\u1161\u11A8: ["korean"], \u1107\u116E\u1111\u116E\u11B7: ["korean"], \u1107\u116E\u1112\u116C\u110C\u1161\u11BC: ["korean"], \u1107\u116E\u11A8\u1107\u116E: ["korean"], \u1107\u116E\u11A8\u1112\u1161\u11AB: ["korean"], \u1107\u116E\u11AB\u1102\u1169: ["korean"], \u1107\u116E\u11AB\u1105\u1163\u11BC: ["korean"], \u1107\u116E\u11AB\u1105\u1175: ["korean"], \u1107\u116E\u11AB\u1106\u1167\u11BC: ["korean"], \u1107\u116E\u11AB\u1109\u1165\u11A8: ["korean"], \u1107\u116E\u11AB\u110B\u1163: ["korean"], \u1107\u116E\u11AB\u110B\u1171\u1100\u1175: ["korean"], \u1107\u116E\u11AB\u1111\u1175\u11AF: ["korean"], \u1107\u116E\u11AB\u1112\u1169\u11BC\u1109\u1162\u11A8: ["korean"], \u1107\u116E\u11AF\u1100\u1169\u1100\u1175: ["korean"], \u1107\u116E\u11AF\u1100\u116A: ["korean"], \u1107\u116E\u11AF\u1100\u116D: ["korean"], \u1107\u116E\u11AF\u1101\u1169\u11BE: ["korean"], \u1107\u116E\u11AF\u1106\u1161\u11AB: ["korean"], \u1107\u116E\u11AF\u1107\u1165\u11B8: ["korean"], \u1107\u116E\u11AF\u1107\u1175\u11BE: ["korean"], \u1107\u116E\u11AF\u110B\u1161\u11AB: ["korean"], \u1107\u116E\u11AF\u110B\u1175\u110B\u1175\u11A8: ["korean"], \u1107\u116E\u11AF\u1112\u1162\u11BC: ["korean"], \u1107\u1173\u1105\u1162\u11AB\u1103\u1173: ["korean"], \u1107\u1175\u1100\u1173\u11A8: ["korean"], \u1107\u1175\u1102\u1161\u11AB: ["korean"], \u1107\u1175\u1102\u1175\u11AF: ["korean"], \u1107\u1175\u1103\u116E\u11AF\u1100\u1175: ["korean"], \u1107\u1175\u1103\u1175\u110B\u1169: ["korean"], \u1107\u1175\u1105\u1169\u1109\u1169: ["korean"], \u1107\u1175\u1106\u1161\u11AB: ["korean"], \u1107\u1175\u1106\u1167\u11BC: ["korean"], \u1107\u1175\u1106\u1175\u11AF: ["korean"], \u1107\u1175\u1107\u1161\u1105\u1161\u11B7: ["korean"], \u1107\u1175\u1107\u1175\u11B7\u1107\u1161\u11B8: ["korean"], \u1107\u1175\u1109\u1161\u11BC: ["korean"], \u1107\u1175\u110B\u116D\u11BC: ["korean"], \u1107\u1175\u110B\u1172\u11AF: ["korean"], \u1107\u1175\u110C\u116E\u11BC: ["korean"], \u1107\u1175\u1110\u1161\u1106\u1175\u11AB: ["korean"], \u1107\u1175\u1111\u1161\u11AB: ["korean"], \u1107\u1175\u11AF\u1103\u1175\u11BC: ["korean"], \u1107\u1175\u11BA\u1106\u116E\u11AF: ["korean"], \u1107\u1175\u11BA\u1107\u1161\u11BC\u110B\u116E\u11AF: ["korean"], \u1107\u1175\u11BA\u110C\u116E\u11AF\u1100\u1175: ["korean"], \u1107\u1175\u11BE\u1101\u1161\u11AF: ["korean"], \u1108\u1161\u11AF\u1100\u1161\u11AB\u1109\u1162\u11A8: ["korean"], \u1108\u1161\u11AF\u1105\u1162: ["korean"], \u1108\u1161\u11AF\u1105\u1175: ["korean"], \u1109\u1161\u1100\u1165\u11AB: ["korean"], \u1109\u1161\u1100\u1168\u110C\u1165\u11AF: ["korean"], \u1109\u1161\u1102\u1161\u110B\u1175: ["korean"], \u1109\u1161\u1102\u1163\u11BC: ["korean"], \u1109\u1161\u1105\u1161\u11B7: ["korean"], \u1109\u1161\u1105\u1161\u11BC: ["korean"], \u1109\u1161\u1105\u1175\u11B8: ["korean"], \u1109\u1161\u1106\u1169\u1102\u1175\u11B7: ["korean"], \u1109\u1161\u1106\u116E\u11AF: ["korean"], \u1109\u1161\u1107\u1161\u11BC: ["korean"], \u1109\u1161\u1109\u1161\u11BC: ["korean"], \u1109\u1161\u1109\u1162\u11BC\u1112\u116A\u11AF: ["korean"], \u1109\u1161\u1109\u1165\u11AF: ["korean"], \u1109\u1161\u1109\u1173\u11B7: ["korean"], \u1109\u1161\u1109\u1175\u11AF: ["korean"], \u1109\u1161\u110B\u1165\u11B8: ["korean"], \u1109\u1161\u110B\u116D\u11BC: ["korean"], \u1109\u1161\u110B\u116F\u11AF: ["korean"], \u1109\u1161\u110C\u1161\u11BC: ["korean"], \u1109\u1161\u110C\u1165\u11AB: ["korean"], \u1109\u1161\u110C\u1175\u11AB: ["korean"], \u1109\u1161\u110E\u1169\u11AB: ["korean"], \u1109\u1161\u110E\u116E\u11AB\u1100\u1175: ["korean"], \u1109\u1161\u1110\u1161\u11BC: ["korean"], \u1109\u1161\u1110\u116E\u1105\u1175: ["korean"], \u1109\u1161\u1112\u1173\u11AF: ["korean"], \u1109\u1161\u11AB\u1100\u1175\u11AF: ["korean"], \u1109\u1161\u11AB\u1107\u116E\u110B\u1175\u11AB\u1100\u116A: ["korean"], \u1109\u1161\u11AB\u110B\u1165\u11B8: ["korean"], \u1109\u1161\u11AB\u110E\u1162\u11A8: ["korean"], \u1109\u1161\u11AF\u1105\u1175\u11B7: ["korean"], \u1109\u1161\u11AF\u110B\u1175\u11AB: ["korean"], \u1109\u1161\u11AF\u110D\u1161\u11A8: ["korean"], \u1109\u1161\u11B7\u1100\u1168\u1110\u1161\u11BC: ["korean"], \u1109\u1161\u11B7\u1100\u116E\u11A8: ["korean"], \u1109\u1161\u11B7\u1109\u1175\u11B8: ["korean"], \u1109\u1161\u11B7\u110B\u116F\u11AF: ["korean"], \u1109\u1161\u11B7\u110E\u1169\u11AB: ["korean"], \u1109\u1161\u11BC\u1100\u116A\u11AB: ["korean"], \u1109\u1161\u11BC\u1100\u1173\u11B7: ["korean"], \u1109\u1161\u11BC\u1103\u1162: ["korean"], \u1109\u1161\u11BC\u1105\u1172: ["korean"], \u1109\u1161\u11BC\u1107\u1161\u11AB\u1100\u1175: ["korean"], \u1109\u1161\u11BC\u1109\u1161\u11BC: ["korean"], \u1109\u1161\u11BC\u1109\u1175\u11A8: ["korean"], \u1109\u1161\u11BC\u110B\u1165\u11B8: ["korean"], \u1109\u1161\u11BC\u110B\u1175\u11AB: ["korean"], \u1109\u1161\u11BC\u110C\u1161: ["korean"], \u1109\u1161\u11BC\u110C\u1165\u11B7: ["korean"], \u1109\u1161\u11BC\u110E\u1165: ["korean"], \u1109\u1161\u11BC\u110E\u116E: ["korean"], \u1109\u1161\u11BC\u1110\u1162: ["korean"], \u1109\u1161\u11BC\u1111\u116D: ["korean"], \u1109\u1161\u11BC\u1111\u116E\u11B7: ["korean"], \u1109\u1161\u11BC\u1112\u116A\u11BC: ["korean"], \u1109\u1162\u1107\u1167\u11A8: ["korean"], \u1109\u1162\u11A8\u1101\u1161\u11AF: ["korean"], \u1109\u1162\u11A8\u110B\u1167\u11AB\u1111\u1175\u11AF: ["korean"], \u1109\u1162\u11BC\u1100\u1161\u11A8: ["korean"], \u1109\u1162\u11BC\u1106\u1167\u11BC: ["korean"], \u1109\u1162\u11BC\u1106\u116E\u11AF: ["korean"], \u1109\u1162\u11BC\u1107\u1161\u11BC\u1109\u1169\u11BC: ["korean"], \u1109\u1162\u11BC\u1109\u1161\u11AB: ["korean"], \u1109\u1162\u11BC\u1109\u1165\u11AB: ["korean"], \u1109\u1162\u11BC\u1109\u1175\u11AB: ["korean"], \u1109\u1162\u11BC\u110B\u1175\u11AF: ["korean"], \u1109\u1162\u11BC\u1112\u116A\u11AF: ["korean"], \u1109\u1165\u1105\u1161\u11B8: ["korean"], \u1109\u1165\u1105\u1173\u11AB: ["korean"], \u1109\u1165\u1106\u1167\u11BC: ["korean"], \u1109\u1165\u1106\u1175\u11AB: ["korean"], \u1109\u1165\u1107\u1175\u1109\u1173: ["korean"], \u1109\u1165\u110B\u1163\u11BC: ["korean"], \u1109\u1165\u110B\u116E\u11AF: ["korean"], \u1109\u1165\u110C\u1165\u11A8: ["korean"], \u1109\u1165\u110C\u1165\u11B7: ["korean"], \u1109\u1165\u110D\u1169\u11A8: ["korean"], \u1109\u1165\u110F\u1173\u11AF: ["korean"], \u1109\u1165\u11A8\u1109\u1161: ["korean"], \u1109\u1165\u11A8\u110B\u1172: ["korean"], \u1109\u1165\u11AB\u1100\u1165: ["korean"], \u1109\u1165\u11AB\u1106\u116E\u11AF: ["korean"], \u1109\u1165\u11AB\u1107\u1162: ["korean"], \u1109\u1165\u11AB\u1109\u1162\u11BC: ["korean"], \u1109\u1165\u11AB\u1109\u116E: ["korean"], \u1109\u1165\u11AB\u110B\u116F\u11AB: ["korean"], \u1109\u1165\u11AB\u110C\u1161\u11BC: ["korean"], \u1109\u1165\u11AB\u110C\u1165\u11AB: ["korean"], \u1109\u1165\u11AB\u1110\u1162\u11A8: ["korean"], \u1109\u1165\u11AB\u1111\u116E\u11BC\u1100\u1175: ["korean"], \u1109\u1165\u11AF\u1100\u1165\u110C\u1175: ["korean"], \u1109\u1165\u11AF\u1102\u1161\u11AF: ["korean"], \u1109\u1165\u11AF\u1105\u1165\u11BC\u1110\u1161\u11BC: ["korean"], \u1109\u1165\u11AF\u1106\u1167\u11BC: ["korean"], \u1109\u1165\u11AF\u1106\u116E\u11AB: ["korean"], \u1109\u1165\u11AF\u1109\u1161: ["korean"], \u1109\u1165\u11AF\u110B\u1161\u11A8\u1109\u1161\u11AB: ["korean"], \u1109\u1165\u11AF\u110E\u1175: ["korean"], \u1109\u1165\u11AF\u1110\u1161\u11BC: ["korean"], \u1109\u1165\u11B8\u110A\u1175: ["korean"], \u1109\u1165\u11BC\u1100\u1169\u11BC: ["korean"], \u1109\u1165\u11BC\u1103\u1161\u11BC: ["korean"], \u1109\u1165\u11BC\u1106\u1167\u11BC: ["korean"], \u1109\u1165\u11BC\u1107\u1167\u11AF: ["korean"], \u1109\u1165\u11BC\u110B\u1175\u11AB: ["korean"], \u1109\u1165\u11BC\u110C\u1161\u11BC: ["korean"], \u1109\u1165\u11BC\u110C\u1165\u11A8: ["korean"], \u1109\u1165\u11BC\u110C\u1175\u11AF: ["korean"], \u1109\u1165\u11BC\u1112\u1161\u11B7: ["korean"], \u1109\u1166\u1100\u1173\u11B7: ["korean"], \u1109\u1166\u1106\u1175\u1102\u1161: ["korean"], \u1109\u1166\u1109\u1161\u11BC: ["korean"], \u1109\u1166\u110B\u116F\u11AF: ["korean"], \u1109\u1166\u110C\u1169\u11BC\u1103\u1162\u110B\u116A\u11BC: ["korean"], \u1109\u1166\u1110\u1161\u11A8: ["korean"], \u1109\u1166\u11AB\u1110\u1165: ["korean"], \u1109\u1166\u11AB\u1110\u1175\u1106\u1175\u1110\u1165: ["korean"], \u1109\u1166\u11BA\u110D\u1162: ["korean"], \u1109\u1169\u1100\u1172\u1106\u1169: ["korean"], \u1109\u1169\u1100\u1173\u11A8\u110C\u1165\u11A8: ["korean"], \u1109\u1169\u1100\u1173\u11B7: ["korean"], \u1109\u1169\u1102\u1161\u1100\u1175: ["korean"], \u1109\u1169\u1102\u1167\u11AB: ["korean"], \u1109\u1169\u1103\u1173\u11A8: ["korean"], \u1109\u1169\u1106\u1161\u11BC: ["korean"], \u1109\u1169\u1106\u116E\u11AB: ["korean"], \u1109\u1169\u1109\u1165\u11AF: ["korean"], \u1109\u1169\u1109\u1169\u11A8: ["korean"], \u1109\u1169\u110B\u1161\u1100\u116A: ["korean"], \u1109\u1169\u110B\u116D\u11BC: ["korean"], \u1109\u1169\u110B\u116F\u11AB: ["korean"], \u1109\u1169\u110B\u1173\u11B7: ["korean"], \u1109\u1169\u110C\u116E\u11BC\u1112\u1175: ["korean"], \u1109\u1169\u110C\u1175\u1111\u116E\u11B7: ["korean"], \u1109\u1169\u110C\u1175\u11AF: ["korean"], \u1109\u1169\u1111\u116E\u11BC: ["korean"], \u1109\u1169\u1112\u1167\u11BC: ["korean"], \u1109\u1169\u11A8\u1103\u1161\u11B7: ["korean"], \u1109\u1169\u11A8\u1103\u1169: ["korean"], \u1109\u1169\u11A8\u110B\u1169\u11BA: ["korean"], \u1109\u1169\u11AB\u1100\u1161\u1105\u1161\u11A8: ["korean"], \u1109\u1169\u11AB\u1100\u1175\u11AF: ["korean"], \u1109\u1169\u11AB\u1102\u1167: ["korean"], \u1109\u1169\u11AB\u1102\u1175\u11B7: ["korean"], \u1109\u1169\u11AB\u1103\u1173\u11BC: ["korean"], \u1109\u1169\u11AB\u1106\u1169\u11A8: ["korean"], \u1109\u1169\u11AB\u1108\u1167\u11A8: ["korean"], \u1109\u1169\u11AB\u1109\u1175\u11AF: ["korean"], \u1109\u1169\u11AB\u110C\u1175\u11AF: ["korean"], \u1109\u1169\u11AB\u1110\u1169\u11B8: ["korean"], \u1109\u1169\u11AB\u1112\u1162: ["korean"], \u1109\u1169\u11AF\u110C\u1175\u11A8\u1112\u1175: ["korean"], \u1109\u1169\u11B7\u110A\u1175: ["korean"], \u1109\u1169\u11BC\u110B\u1161\u110C\u1175: ["korean"], \u1109\u1169\u11BC\u110B\u1175: ["korean"], \u1109\u1169\u11BC\u1111\u1167\u11AB: ["korean"], \u1109\u116C\u1100\u1169\u1100\u1175: ["korean"], \u1109\u116D\u1111\u1175\u11BC: ["korean"], \u1109\u116E\u1100\u1165\u11AB: ["korean"], \u1109\u116E\u1102\u1167\u11AB: ["korean"], \u1109\u116E\u1103\u1161\u11AB: ["korean"], \u1109\u116E\u1103\u1169\u11BA\u1106\u116E\u11AF: ["korean"], \u1109\u116E\u1103\u1169\u11BC\u110C\u1165\u11A8: ["korean"], \u1109\u116E\u1106\u1167\u11AB: ["korean"], \u1109\u116E\u1106\u1167\u11BC: ["korean"], \u1109\u116E\u1107\u1161\u11A8: ["korean"], \u1109\u116E\u1109\u1161\u11BC: ["korean"], \u1109\u116E\u1109\u1165\u11A8: ["korean"], \u1109\u116E\u1109\u116E\u11AF: ["korean"], \u1109\u116E\u1109\u1175\u1105\u1169: ["korean"], \u1109\u116E\u110B\u1165\u11B8: ["korean"], \u1109\u116E\u110B\u1167\u11B7: ["korean"], \u1109\u116E\u110B\u1167\u11BC: ["korean"], \u1109\u116E\u110B\u1175\u11B8: ["korean"], \u1109\u116E\u110C\u116E\u11AB: ["korean"], \u1109\u116E\u110C\u1175\u11B8: ["korean"], \u1109\u116E\u110E\u116E\u11AF: ["korean"], \u1109\u116E\u110F\u1165\u11BA: ["korean"], \u1109\u116E\u1111\u1175\u11AF: ["korean"], \u1109\u116E\u1112\u1161\u11A8: ["korean"], \u1109\u116E\u1112\u1165\u11B7\u1109\u1162\u11BC: ["korean"], \u1109\u116E\u1112\u116A\u1100\u1175: ["korean"], \u1109\u116E\u11A8\u1102\u1167: ["korean"], \u1109\u116E\u11A8\u1109\u1169: ["korean"], \u1109\u116E\u11A8\u110C\u1166: ["korean"], \u1109\u116E\u11AB\u1100\u1161\u11AB: ["korean"], \u1109\u116E\u11AB\u1109\u1165: ["korean"], \u1109\u116E\u11AB\u1109\u116E: ["korean"], \u1109\u116E\u11AB\u1109\u1175\u11A8\u1100\u1161\u11AB: ["korean"], \u1109\u116E\u11AB\u110B\u1171: ["korean"], \u1109\u116E\u11AE\u1100\u1161\u1105\u1161\u11A8: ["korean"], \u1109\u116E\u11AF\u1107\u1167\u11BC: ["korean"], \u1109\u116E\u11AF\u110C\u1175\u11B8: ["korean"], \u1109\u116E\u11BA\u110C\u1161: ["korean"], \u1109\u1173\u1102\u1175\u11B7: ["korean"], \u1109\u1173\u1106\u116E\u11AF: ["korean"], \u1109\u1173\u1109\u1173\u1105\u1169: ["korean"], \u1109\u1173\u1109\u1173\u11BC: ["korean"], \u1109\u1173\u110B\u1170\u1110\u1165: ["korean"], \u1109\u1173\u110B\u1171\u110E\u1175: ["korean"], \u1109\u1173\u110F\u1166\u110B\u1175\u1110\u1173: ["korean"], \u1109\u1173\u1110\u1172\u1103\u1175\u110B\u1169: ["korean"], \u1109\u1173\u1110\u1173\u1105\u1166\u1109\u1173: ["korean"], \u1109\u1173\u1111\u1169\u110E\u1173: ["korean"], \u1109\u1173\u11AF\u110D\u1165\u11A8: ["korean"], \u1109\u1173\u11AF\u1111\u1173\u11B7: ["korean"], \u1109\u1173\u11B8\u1100\u116A\u11AB: ["korean"], \u1109\u1173\u11B8\u1100\u1175: ["korean"], \u1109\u1173\u11BC\u1100\u1162\u11A8: ["korean"], \u1109\u1173\u11BC\u1105\u1175: ["korean"], \u1109\u1173\u11BC\u1107\u116E: ["korean"], \u1109\u1173\u11BC\u110B\u116D\u11BC\u110E\u1161: ["korean"], \u1109\u1173\u11BC\u110C\u1175\u11AB: ["korean"], \u1109\u1175\u1100\u1161\u11A8: ["korean"], \u1109\u1175\u1100\u1161\u11AB: ["korean"], \u1109\u1175\u1100\u1169\u11AF: ["korean"], \u1109\u1175\u1100\u1173\u11B7\u110E\u1175: ["korean"], \u1109\u1175\u1102\u1161\u1105\u1175\u110B\u1169: ["korean"], \u1109\u1175\u1103\u1162\u11A8: ["korean"], \u1109\u1175\u1105\u1175\u110C\u1173: ["korean"], \u1109\u1175\u1106\u1166\u11AB\u1110\u1173: ["korean"], \u1109\u1175\u1106\u1175\u11AB: ["korean"], \u1109\u1175\u1107\u116E\u1106\u1169: ["korean"], \u1109\u1175\u1109\u1165\u11AB: ["korean"], \u1109\u1175\u1109\u1165\u11AF: ["korean"], \u1109\u1175\u1109\u1173\u1110\u1166\u11B7: ["korean"], \u1109\u1175\u110B\u1161\u1107\u1165\u110C\u1175: ["korean"], \u1109\u1175\u110B\u1165\u1106\u1165\u1102\u1175: ["korean"], \u1109\u1175\u110B\u116F\u11AF: ["korean"], \u1109\u1175\u110B\u1175\u11AB: ["korean"], \u1109\u1175\u110B\u1175\u11AF: ["korean"], \u1109\u1175\u110C\u1161\u11A8: ["korean"], \u1109\u1175\u110C\u1161\u11BC: ["korean"], \u1109\u1175\u110C\u1165\u11AF: ["korean"], \u1109\u1175\u110C\u1165\u11B7: ["korean"], \u1109\u1175\u110C\u116E\u11BC: ["korean"], \u1109\u1175\u110C\u1173\u11AB: ["korean"], \u1109\u1175\u110C\u1175\u11B8: ["korean"], \u1109\u1175\u110E\u1165\u11BC: ["korean"], \u1109\u1175\u1112\u1161\u11B8: ["korean"], \u1109\u1175\u1112\u1165\u11B7: ["korean"], \u1109\u1175\u11A8\u1100\u116E: ["korean"], \u1109\u1175\u11A8\u1100\u1175: ["korean"], \u1109\u1175\u11A8\u1103\u1161\u11BC: ["korean"], \u1109\u1175\u11A8\u1105\u1163\u11BC: ["korean"], \u1109\u1175\u11A8\u1105\u116D\u1111\u116E\u11B7: ["korean"], \u1109\u1175\u11A8\u1106\u116E\u11AF: ["korean"], \u1109\u1175\u11A8\u1108\u1161\u11BC: ["korean"], \u1109\u1175\u11A8\u1109\u1161: ["korean"], \u1109\u1175\u11A8\u1109\u1162\u11BC\u1112\u116A\u11AF: ["korean"], \u1109\u1175\u11A8\u110E\u1169: ["korean"], \u1109\u1175\u11A8\u1110\u1161\u11A8: ["korean"], \u1109\u1175\u11A8\u1111\u116E\u11B7: ["korean"], \u1109\u1175\u11AB\u1100\u1169: ["korean"], \u1109\u1175\u11AB\u1100\u1172: ["korean"], \u1109\u1175\u11AB\u1102\u1167\u11B7: ["korean"], \u1109\u1175\u11AB\u1106\u116E\u11AB: ["korean"], \u1109\u1175\u11AB\u1107\u1161\u11AF: ["korean"], \u1109\u1175\u11AB\u1107\u1175: ["korean"], \u1109\u1175\u11AB\u1109\u1161: ["korean"], \u1109\u1175\u11AB\u1109\u1166: ["korean"], \u1109\u1175\u11AB\u110B\u116D\u11BC: ["korean"], \u1109\u1175\u11AB\u110C\u1166\u1111\u116E\u11B7: ["korean"], \u1109\u1175\u11AB\u110E\u1165\u11BC: ["korean"], \u1109\u1175\u11AB\u110E\u1166: ["korean"], \u1109\u1175\u11AB\u1112\u116A: ["korean"], \u1109\u1175\u11AF\u1100\u1161\u11B7: ["korean"], \u1109\u1175\u11AF\u1102\u1162: ["korean"], \u1109\u1175\u11AF\u1105\u1167\u11A8: ["korean"], \u1109\u1175\u11AF\u1105\u1168: ["korean"], \u1109\u1175\u11AF\u1106\u1161\u11BC: ["korean"], \u1109\u1175\u11AF\u1109\u116E: ["korean"], \u1109\u1175\u11AF\u1109\u1173\u11B8: ["korean"], \u1109\u1175\u11AF\u1109\u1175: ["korean"], \u1109\u1175\u11AF\u110C\u1161\u11BC: ["korean"], \u1109\u1175\u11AF\u110C\u1165\u11BC: ["korean"], \u1109\u1175\u11AF\u110C\u1175\u11AF\u110C\u1165\u11A8: ["korean"], \u1109\u1175\u11AF\u110E\u1165\u11AB: ["korean"], \u1109\u1175\u11AF\u110E\u1166: ["korean"], \u1109\u1175\u11AF\u110F\u1165\u11BA: ["korean"], \u1109\u1175\u11AF\u1110\u1162: ["korean"], \u1109\u1175\u11AF\u1111\u1162: ["korean"], \u1109\u1175\u11AF\u1112\u1165\u11B7: ["korean"], \u1109\u1175\u11AF\u1112\u1167\u11AB: ["korean"], \u1109\u1175\u11B7\u1105\u1175: ["korean"], \u1109\u1175\u11B7\u1107\u116E\u1105\u1173\u11B7: ["korean"], \u1109\u1175\u11B7\u1109\u1161: ["korean"], \u1109\u1175\u11B7\u110C\u1161\u11BC: ["korean"], \u1109\u1175\u11B7\u110C\u1165\u11BC: ["korean"], \u1109\u1175\u11B7\u1111\u1161\u11AB: ["korean"], \u110A\u1161\u11BC\u1103\u116E\u11BC\u110B\u1175: ["korean"], \u110A\u1175\u1105\u1173\u11B7: ["korean"], \u110A\u1175\u110B\u1161\u11BA: ["korean"], \u110B\u1161\u1100\u1161\u110A\u1175: ["korean"], \u110B\u1161\u1102\u1161\u110B\u116E\u11AB\u1109\u1165: ["korean"], \u110B\u1161\u1103\u1173\u1102\u1175\u11B7: ["korean"], \u110B\u1161\u1103\u1173\u11AF: ["korean"], \u110B\u1161\u1109\u1171\u110B\u116E\u11B7: ["korean"], \u110B\u1161\u1109\u1173\u1111\u1161\u11AF\u1110\u1173: ["korean"], \u110B\u1161\u1109\u1175\u110B\u1161: ["korean"], \u110B\u1161\u110B\u116E\u11AF\u1105\u1165: ["korean"], \u110B\u1161\u110C\u1165\u110A\u1175: ["korean"], \u110B\u1161\u110C\u116E\u11B7\u1106\u1161: ["korean"], \u110B\u1161\u110C\u1175\u11A8: ["korean"], \u110B\u1161\u110E\u1175\u11B7: ["korean"], \u110B\u1161\u1111\u1161\u1110\u1173: ["korean"], \u110B\u1161\u1111\u1173\u1105\u1175\u110F\u1161: ["korean"], \u110B\u1161\u1111\u1173\u11B7: ["korean"], \u110B\u1161\u1112\u1169\u11B8: ["korean"], \u110B\u1161\u1112\u1173\u11AB: ["korean"], \u110B\u1161\u11A8\u1100\u1175: ["korean"], \u110B\u1161\u11A8\u1106\u1169\u11BC: ["korean"], \u110B\u1161\u11A8\u1109\u116E: ["korean"], \u110B\u1161\u11AB\u1100\u1162: ["korean"], \u110B\u1161\u11AB\u1100\u1167\u11BC: ["korean"], \u110B\u1161\u11AB\u1100\u116A: ["korean"], \u110B\u1161\u11AB\u1102\u1162: ["korean"], \u110B\u1161\u11AB\u1102\u1167\u11BC: ["korean"], \u110B\u1161\u11AB\u1103\u1169\u11BC: ["korean"], \u110B\u1161\u11AB\u1107\u1161\u11BC: ["korean"], \u110B\u1161\u11AB\u1107\u116E: ["korean"], \u110B\u1161\u11AB\u110C\u116E: ["korean"], \u110B\u1161\u11AF\u1105\u116E\u1106\u1175\u1102\u1172\u11B7: ["korean"], \u110B\u1161\u11AF\u110F\u1169\u110B\u1169\u11AF: ["korean"], \u110B\u1161\u11B7\u1109\u1175: ["korean"], \u110B\u1161\u11B7\u110F\u1165\u11BA: ["korean"], \u110B\u1161\u11B8\u1105\u1167\u11A8: ["korean"], \u110B\u1161\u11C1\u1102\u1161\u11AF: ["korean"], \u110B\u1161\u11C1\u1106\u116E\u11AB: ["korean"], \u110B\u1162\u110B\u1175\u11AB: ["korean"], \u110B\u1162\u110C\u1165\u11BC: ["korean"], \u110B\u1162\u11A8\u1109\u116E: ["korean"], \u110B\u1162\u11AF\u1107\u1165\u11B7: ["korean"], \u110B\u1163\u1100\u1161\u11AB: ["korean"], \u110B\u1163\u1103\u1161\u11AB: ["korean"], \u110B\u1163\u110B\u1169\u11BC: ["korean"], \u110B\u1163\u11A8\u1100\u1161\u11AB: ["korean"], \u110B\u1163\u11A8\u1100\u116E\u11A8: ["korean"], \u110B\u1163\u11A8\u1109\u1169\u11A8: ["korean"], \u110B\u1163\u11A8\u1109\u116E: ["korean"], \u110B\u1163\u11A8\u110C\u1165\u11B7: ["korean"], \u110B\u1163\u11A8\u1111\u116E\u11B7: ["korean"], \u110B\u1163\u11A8\u1112\u1169\u11AB\u1102\u1167: ["korean"], \u110B\u1163\u11BC\u1102\u1167\u11B7: ["korean"], \u110B\u1163\u11BC\u1105\u1167\u11A8: ["korean"], \u110B\u1163\u11BC\u1106\u1161\u11AF: ["korean"], \u110B\u1163\u11BC\u1107\u1162\u110E\u116E: ["korean"], \u110B\u1163\u11BC\u110C\u116E: ["korean"], \u110B\u1163\u11BC\u1111\u1161: ["korean"], \u110B\u1165\u1103\u116E\u11B7: ["korean"], \u110B\u1165\u1105\u1167\u110B\u116E\u11B7: ["korean"], \u110B\u1165\u1105\u1173\u11AB: ["korean"], \u110B\u1165\u110C\u1166\u11BA\u1107\u1161\u11B7: ["korean"], \u110B\u1165\u110D\u1162\u11BB\u1103\u1173\u11AB: ["korean"], \u110B\u1165\u110D\u1165\u1103\u1161\u1100\u1161: ["korean"], \u110B\u1165\u110D\u1165\u11AB\u110C\u1175: ["korean"], \u110B\u1165\u11AB\u1102\u1175: ["korean"], \u110B\u1165\u11AB\u1103\u1165\u11A8: ["korean"], \u110B\u1165\u11AB\u1105\u1169\u11AB: ["korean"], \u110B\u1165\u11AB\u110B\u1165: ["korean"], \u110B\u1165\u11AF\u1100\u116E\u11AF: ["korean"], \u110B\u1165\u11AF\u1105\u1173\u11AB: ["korean"], \u110B\u1165\u11AF\u110B\u1173\u11B7: ["korean"], \u110B\u1165\u11AF\u1111\u1175\u11BA: ["korean"], \u110B\u1165\u11B7\u1106\u1161: ["korean"], \u110B\u1165\u11B8\u1106\u116E: ["korean"], \u110B\u1165\u11B8\u110C\u1169\u11BC: ["korean"], \u110B\u1165\u11B8\u110E\u1166: ["korean"], \u110B\u1165\u11BC\u1103\u1165\u11BC\u110B\u1175: ["korean"], \u110B\u1165\u11BC\u1106\u1161\u11BC: ["korean"], \u110B\u1165\u11BC\u1110\u1165\u1105\u1175: ["korean"], \u110B\u1165\u11BD\u1100\u1173\u110C\u1166: ["korean"], \u110B\u1166\u1102\u1165\u110C\u1175: ["korean"], \u110B\u1166\u110B\u1165\u110F\u1165\u11AB: ["korean"], \u110B\u1166\u11AB\u110C\u1175\u11AB: ["korean"], \u110B\u1167\u1100\u1165\u11AB: ["korean"], \u110B\u1167\u1100\u1169\u1109\u1162\u11BC: ["korean"], \u110B\u1167\u1100\u116A\u11AB: ["korean"], \u110B\u1167\u1100\u116E\u11AB: ["korean"], \u110B\u1167\u1100\u116F\u11AB: ["korean"], \u110B\u1167\u1103\u1162\u1109\u1162\u11BC: ["korean"], \u110B\u1167\u1103\u1165\u11B2: ["korean"], \u110B\u1167\u1103\u1169\u11BC\u1109\u1162\u11BC: ["korean"], \u110B\u1167\u1103\u1173\u11AB: ["korean"], \u110B\u1167\u1105\u1169\u11AB: ["korean"], \u110B\u1167\u1105\u1173\u11B7: ["korean"], \u110B\u1167\u1109\u1165\u11BA: ["korean"], \u110B\u1167\u1109\u1165\u11BC: ["korean"], \u110B\u1167\u110B\u116A\u11BC: ["korean"], \u110B\u1167\u110B\u1175\u11AB: ["korean"], \u110B\u1167\u110C\u1165\u11AB\u1112\u1175: ["korean"], \u110B\u1167\u110C\u1175\u11A8\u110B\u116F\u11AB: ["korean"], \u110B\u1167\u1112\u1161\u11A8\u1109\u1162\u11BC: ["korean"], \u110B\u1167\u1112\u1162\u11BC: ["korean"], \u110B\u1167\u11A8\u1109\u1161: ["korean"], \u110B\u1167\u11A8\u1109\u1175: ["korean"], \u110B\u1167\u11A8\u1112\u1161\u11AF: ["korean"], \u110B\u1167\u11AB\u1100\u1167\u11AF: ["korean"], \u110B\u1167\u11AB\u1100\u116E: ["korean"], \u110B\u1167\u11AB\u1100\u1173\u11A8: ["korean"], \u110B\u1167\u11AB\u1100\u1175: ["korean"], \u110B\u1167\u11AB\u1105\u1161\u11A8: ["korean"], \u110B\u1167\u11AB\u1109\u1165\u11AF: ["korean"], \u110B\u1167\u11AB\u1109\u1166: ["korean"], \u110B\u1167\u11AB\u1109\u1169\u11A8: ["korean"], \u110B\u1167\u11AB\u1109\u1173\u11B8: ["korean"], \u110B\u1167\u11AB\u110B\u1162: ["korean"], \u110B\u1167\u11AB\u110B\u1168\u110B\u1175\u11AB: ["korean"], \u110B\u1167\u11AB\u110B\u1175\u11AB: ["korean"], \u110B\u1167\u11AB\u110C\u1161\u11BC: ["korean"], \u110B\u1167\u11AB\u110C\u116E: ["korean"], \u110B\u1167\u11AB\u110E\u116E\u11AF: ["korean"], \u110B\u1167\u11AB\u1111\u1175\u11AF: ["korean"], \u110B\u1167\u11AB\u1112\u1161\u11B8: ["korean"], \u110B\u1167\u11AB\u1112\u1172: ["korean"], \u110B\u1167\u11AF\u1100\u1175: ["korean"], \u110B\u1167\u11AF\u1106\u1162: ["korean"], \u110B\u1167\u11AF\u1109\u116C: ["korean"], \u110B\u1167\u11AF\u1109\u1175\u11B7\u1112\u1175: ["korean"], \u110B\u1167\u11AF\u110C\u1165\u11BC: ["korean"], \u110B\u1167\u11AF\u110E\u1161: ["korean"], \u110B\u1167\u11AF\u1112\u1173\u11AF: ["korean"], \u110B\u1167\u11B7\u1105\u1167: ["korean"], \u110B\u1167\u11B8\u1109\u1165: ["korean"], \u110B\u1167\u11BC\u1100\u116E\u11A8: ["korean"], \u110B\u1167\u11BC\u1102\u1161\u11B7: ["korean"], \u110B\u1167\u11BC\u1109\u1161\u11BC: ["korean"], \u110B\u1167\u11BC\u110B\u1163\u11BC: ["korean"], \u110B\u1167\u11BC\u110B\u1167\u11A8: ["korean"], \u110B\u1167\u11BC\u110B\u116E\u11BC: ["korean"], \u110B\u1167\u11BC\u110B\u116F\u11AB\u1112\u1175: ["korean"], \u110B\u1167\u11BC\u1112\u1161: ["korean"], \u110B\u1167\u11BC\u1112\u1163\u11BC: ["korean"], \u110B\u1167\u11BC\u1112\u1169\u11AB: ["korean"], \u110B\u1167\u11BC\u1112\u116A: ["korean"], \u110B\u1167\u11C1\u1100\u116E\u1105\u1175: ["korean"], \u110B\u1167\u11C1\u1107\u1161\u11BC: ["korean"], \u110B\u1167\u11C1\u110C\u1175\u11B8: ["korean"], \u110B\u1168\u1100\u1161\u11B7: ["korean"], \u110B\u1168\u1100\u1173\u11B7: ["korean"], \u110B\u1168\u1107\u1161\u11BC: ["korean"], \u110B\u1168\u1109\u1161\u11AB: ["korean"], \u110B\u1168\u1109\u1161\u11BC: ["korean"], \u110B\u1168\u1109\u1165\u11AB: ["korean"], \u110B\u1168\u1109\u116E\u11AF: ["korean"], \u110B\u1168\u1109\u1173\u11B8: ["korean"], \u110B\u1168\u1109\u1175\u11A8\u110C\u1161\u11BC: ["korean"], \u110B\u1168\u110B\u1163\u11A8: ["korean"], \u110B\u1168\u110C\u1165\u11AB: ["korean"], \u110B\u1168\u110C\u1165\u11AF: ["korean"], \u110B\u1168\u110C\u1165\u11BC: ["korean"], \u110B\u1168\u110F\u1165\u11AB\u1103\u1162: ["korean"], \u110B\u1168\u11BA\u1102\u1161\u11AF: ["korean"], \u110B\u1169\u1102\u1173\u11AF: ["korean"], \u110B\u1169\u1105\u1161\u11A8: ["korean"], \u110B\u1169\u1105\u1162\u11BA\u1103\u1169\u11BC\u110B\u1161\u11AB: ["korean"], \u110B\u1169\u1105\u1166\u11AB\u110C\u1175: ["korean"], \u110B\u1169\u1105\u1169\u110C\u1175: ["korean"], \u110B\u1169\u1105\u1173\u11AB\u1107\u1161\u11AF: ["korean"], \u110B\u1169\u1107\u1173\u11AB: ["korean"], \u110B\u1169\u1109\u1175\u11B8: ["korean"], \u110B\u1169\u110B\u1167\u11B7: ["korean"], \u110B\u1169\u110B\u116F\u11AF: ["korean"], \u110B\u1169\u110C\u1165\u11AB: ["korean"], \u110B\u1169\u110C\u1175\u11A8: ["korean"], \u110B\u1169\u110C\u1175\u11BC\u110B\u1165: ["korean"], \u110B\u1169\u1111\u1166\u1105\u1161: ["korean"], \u110B\u1169\u1111\u1175\u1109\u1173\u1110\u1166\u11AF: ["korean"], \u110B\u1169\u1112\u1175\u1105\u1167: ["korean"], \u110B\u1169\u11A8\u1109\u1161\u11BC: ["korean"], \u110B\u1169\u11A8\u1109\u116E\u1109\u116E: ["korean"], \u110B\u1169\u11AB\u1100\u1161\u11BD: ["korean"], \u110B\u1169\u11AB\u1105\u1161\u110B\u1175\u11AB: ["korean"], \u110B\u1169\u11AB\u1106\u1169\u11B7: ["korean"], \u110B\u1169\u11AB\u110C\u1169\u11BC\u110B\u1175\u11AF: ["korean"], \u110B\u1169\u11AB\u1110\u1169\u11BC: ["korean"], \u110B\u1169\u11AF\u1100\u1161\u110B\u1173\u11AF: ["korean"], \u110B\u1169\u11AF\u1105\u1175\u11B7\u1111\u1175\u11A8: ["korean"], \u110B\u1169\u11AF\u1112\u1162: ["korean"], \u110B\u1169\u11BA\u110E\u1161\u1105\u1175\u11B7: ["korean"], \u110B\u116A\u110B\u1175\u1109\u1167\u110E\u1173: ["korean"], \u110B\u116A\u110B\u1175\u11AB: ["korean"], \u110B\u116A\u11AB\u1109\u1165\u11BC: ["korean"], \u110B\u116A\u11AB\u110C\u1165\u11AB: ["korean"], \u110B\u116A\u11BC\u1107\u1175: ["korean"], \u110B\u116A\u11BC\u110C\u1161: ["korean"], \u110B\u116B\u1102\u1163\u1112\u1161\u1106\u1167\u11AB: ["korean"], \u110B\u116B\u11AB\u110C\u1175: ["korean"], \u110B\u116C\u1100\u1161\u11BA\u110C\u1175\u11B8: ["korean"], \u110B\u116C\u1100\u116E\u11A8: ["korean"], \u110B\u116C\u1105\u1169\u110B\u116E\u11B7: ["korean"], \u110B\u116C\u1109\u1161\u11B7\u110E\u1169\u11AB: ["korean"], \u110B\u116C\u110E\u116E\u11AF: ["korean"], \u110B\u116C\u110E\u1175\u11B7: ["korean"], \u110B\u116C\u1112\u1161\u11AF\u1106\u1165\u1102\u1175: ["korean"], \u110B\u116C\u11AB\u1107\u1161\u11AF: ["korean"], \u110B\u116C\u11AB\u1109\u1169\u11AB: ["korean"], \u110B\u116C\u11AB\u110D\u1169\u11A8: ["korean"], \u110B\u116D\u1100\u1173\u11B7: ["korean"], \u110B\u116D\u110B\u1175\u11AF: ["korean"], \u110B\u116D\u110C\u1173\u11B7: ["korean"], \u110B\u116D\u110E\u1165\u11BC: ["korean"], \u110B\u116D\u11BC\u1100\u1175: ["korean"], \u110B\u116D\u11BC\u1109\u1165: ["korean"], \u110B\u116D\u11BC\u110B\u1165: ["korean"], \u110B\u116E\u1109\u1161\u11AB: ["korean"], \u110B\u116E\u1109\u1165\u11AB: ["korean"], \u110B\u116E\u1109\u1173\u11BC: ["korean"], \u110B\u116E\u110B\u1167\u11AB\u1112\u1175: ["korean"], \u110B\u116E\u110C\u1165\u11BC: ["korean"], \u110B\u116E\u110E\u1166\u1100\u116E\u11A8: ["korean"], \u110B\u116E\u1111\u1167\u11AB: ["korean"], \u110B\u116E\u11AB\u1103\u1169\u11BC: ["korean"], \u110B\u116E\u11AB\u1106\u1167\u11BC: ["korean"], \u110B\u116E\u11AB\u1107\u1161\u11AB: ["korean"], \u110B\u116E\u11AB\u110C\u1165\u11AB: ["korean"], \u110B\u116E\u11AB\u1112\u1162\u11BC: ["korean"], \u110B\u116E\u11AF\u1109\u1161\u11AB: ["korean"], \u110B\u116E\u11AF\u110B\u1173\u11B7: ["korean"], \u110B\u116E\u11B7\u110C\u1175\u11A8\u110B\u1175\u11B7: ["korean"], \u110B\u116E\u11BA\u110B\u1165\u1105\u1173\u11AB: ["korean"], \u110B\u116E\u11BA\u110B\u1173\u11B7: ["korean"], \u110B\u116F\u1102\u1161\u11A8: ["korean"], \u110B\u116F\u11AB\u1100\u1169: ["korean"], \u110B\u116F\u11AB\u1105\u1162: ["korean"], \u110B\u116F\u11AB\u1109\u1165: ["korean"], \u110B\u116F\u11AB\u1109\u116E\u11BC\u110B\u1175: ["korean"], \u110B\u116F\u11AB\u110B\u1175\u11AB: ["korean"], \u110B\u116F\u11AB\u110C\u1161\u11BC: ["korean"], \u110B\u116F\u11AB\u1111\u1175\u1109\u1173: ["korean"], \u110B\u116F\u11AF\u1100\u1173\u11B8: ["korean"], \u110B\u116F\u11AF\u1103\u1173\u110F\u1165\u11B8: ["korean"], \u110B\u116F\u11AF\u1109\u1166: ["korean"], \u110B\u116F\u11AF\u110B\u116D\u110B\u1175\u11AF: ["korean"], \u110B\u1170\u110B\u1175\u1110\u1165: ["korean"], \u110B\u1171\u1107\u1161\u11AB: ["korean"], \u110B\u1171\u1107\u1165\u11B8: ["korean"], \u110B\u1171\u1109\u1165\u11BC: ["korean"], \u110B\u1171\u110B\u116F\u11AB: ["korean"], \u110B\u1171\u1112\u1165\u11B7: ["korean"], \u110B\u1171\u1112\u1167\u11B8: ["korean"], \u110B\u1171\u11BA\u1109\u1161\u1105\u1161\u11B7: ["korean"], \u110B\u1172\u1102\u1161\u11AB\u1112\u1175: ["korean"], \u110B\u1172\u1105\u1165\u11B8: ["korean"], \u110B\u1172\u1106\u1167\u11BC: ["korean"], \u110B\u1172\u1106\u116E\u11AF: ["korean"], \u110B\u1172\u1109\u1161\u11AB: ["korean"], \u110B\u1172\u110C\u1165\u11A8: ["korean"], \u110B\u1172\u110E\u1175\u110B\u116F\u11AB: ["korean"], \u110B\u1172\u1112\u1161\u11A8: ["korean"], \u110B\u1172\u1112\u1162\u11BC: ["korean"], \u110B\u1172\u1112\u1167\u11BC: ["korean"], \u110B\u1172\u11A8\u1100\u116E\u11AB: ["korean"], \u110B\u1172\u11A8\u1109\u1161\u11BC: ["korean"], \u110B\u1172\u11A8\u1109\u1175\u11B8: ["korean"], \u110B\u1172\u11A8\u110E\u1166: ["korean"], \u110B\u1173\u11AB\u1112\u1162\u11BC: ["korean"], \u110B\u1173\u11B7\u1105\u1167\u11A8: ["korean"], \u110B\u1173\u11B7\u1105\u116D: ["korean"], \u110B\u1173\u11B7\u1107\u1161\u11AB: ["korean"], \u110B\u1173\u11B7\u1109\u1165\u11BC: ["korean"], \u110B\u1173\u11B7\u1109\u1175\u11A8: ["korean"], \u110B\u1173\u11B7\u110B\u1161\u11A8: ["korean"], \u110B\u1173\u11B7\u110C\u116E: ["korean"], \u110B\u1174\u1100\u1167\u11AB: ["korean"], \u110B\u1174\u1102\u1169\u11AB: ["korean"], \u110B\u1174\u1106\u116E\u11AB: ["korean"], \u110B\u1174\u1107\u1169\u11A8: ["korean"], \u110B\u1174\u1109\u1175\u11A8: ["korean"], \u110B\u1174\u1109\u1175\u11B7: ["korean"], \u110B\u1174\u110B\u116C\u1105\u1169: ["korean"], \u110B\u1174\u110B\u116D\u11A8: ["korean"], \u110B\u1174\u110B\u116F\u11AB: ["korean"], \u110B\u1174\u1112\u1161\u11A8: ["korean"], \u110B\u1175\u1100\u1165\u11BA: ["korean"], \u110B\u1175\u1100\u1169\u11BA: ["korean"], \u110B\u1175\u1102\u1167\u11B7: ["korean"], \u110B\u1175\u1102\u1169\u11B7: ["korean"], \u110B\u1175\u1103\u1161\u11AF: ["korean"], \u110B\u1175\u1103\u1162\u1105\u1169: ["korean"], \u110B\u1175\u1103\u1169\u11BC: ["korean"], \u110B\u1175\u1105\u1165\u11C2\u1100\u1166: ["korean"], \u110B\u1175\u1105\u1167\u11A8\u1109\u1165: ["korean"], \u110B\u1175\u1105\u1169\u11AB\u110C\u1165\u11A8: ["korean"], \u110B\u1175\u1105\u1173\u11B7: ["korean"], \u110B\u1175\u1106\u1175\u11AB: ["korean"], \u110B\u1175\u1107\u1161\u11AF\u1109\u1169: ["korean"], \u110B\u1175\u1107\u1167\u11AF: ["korean"], \u110B\u1175\u1107\u116E\u11AF: ["korean"], \u110B\u1175\u1108\u1161\u11AF: ["korean"], \u110B\u1175\u1109\u1161\u11BC: ["korean"], \u110B\u1175\u1109\u1165\u11BC: ["korean"], \u110B\u1175\u1109\u1173\u11AF: ["korean"], \u110B\u1175\u110B\u1163\u1100\u1175: ["korean"], \u110B\u1175\u110B\u116D\u11BC: ["korean"], \u110B\u1175\u110B\u116E\u11BA: ["korean"], \u110B\u1175\u110B\u116F\u11AF: ["korean"], \u110B\u1175\u110B\u1173\u11A8\u1100\u1169: ["korean"], \u110B\u1175\u110B\u1175\u11A8: ["korean"], \u110B\u1175\u110C\u1165\u11AB: ["korean"], \u110B\u1175\u110C\u116E\u11BC: ["korean"], \u110B\u1175\u1110\u1173\u11AE\u1102\u1161\u11AF: ["korean"], \u110B\u1175\u1110\u1173\u11AF: ["korean"], \u110B\u1175\u1112\u1169\u11AB: ["korean"], \u110B\u1175\u11AB\u1100\u1161\u11AB: ["korean"], \u110B\u1175\u11AB\u1100\u1167\u11A8: ["korean"], \u110B\u1175\u11AB\u1100\u1169\u11BC: ["korean"], \u110B\u1175\u11AB\u1100\u116E: ["korean"], \u110B\u1175\u11AB\u1100\u1173\u11AB: ["korean"], \u110B\u1175\u11AB\u1100\u1175: ["korean"], \u110B\u1175\u11AB\u1103\u1169: ["korean"], \u110B\u1175\u11AB\u1105\u1172: ["korean"], \u110B\u1175\u11AB\u1106\u116E\u11AF: ["korean"], \u110B\u1175\u11AB\u1109\u1162\u11BC: ["korean"], \u110B\u1175\u11AB\u1109\u116B: ["korean"], \u110B\u1175\u11AB\u110B\u1167\u11AB: ["korean"], \u110B\u1175\u11AB\u110B\u116F\u11AB: ["korean"], \u110B\u1175\u11AB\u110C\u1162: ["korean"], \u110B\u1175\u11AB\u110C\u1169\u11BC: ["korean"], \u110B\u1175\u11AB\u110E\u1165\u11AB: ["korean"], \u110B\u1175\u11AB\u110E\u1166: ["korean"], \u110B\u1175\u11AB\u1110\u1165\u1102\u1166\u11BA: ["korean"], \u110B\u1175\u11AB\u1112\u1161: ["korean"], \u110B\u1175\u11AB\u1112\u1167\u11BC: ["korean"], \u110B\u1175\u11AF\u1100\u1169\u11B8: ["korean"], \u110B\u1175\u11AF\u1100\u1175: ["korean"], \u110B\u1175\u11AF\u1103\u1161\u11AB: ["korean"], \u110B\u1175\u11AF\u1103\u1162: ["korean"], \u110B\u1175\u11AF\u1103\u1173\u11BC: ["korean"], \u110B\u1175\u11AF\u1107\u1161\u11AB: ["korean"], \u110B\u1175\u11AF\u1107\u1169\u11AB: ["korean"], \u110B\u1175\u11AF\u1107\u116E: ["korean"], \u110B\u1175\u11AF\u1109\u1161\u11BC: ["korean"], \u110B\u1175\u11AF\u1109\u1162\u11BC: ["korean"], \u110B\u1175\u11AF\u1109\u1169\u11AB: ["korean"], \u110B\u1175\u11AF\u110B\u116D\u110B\u1175\u11AF: ["korean"], \u110B\u1175\u11AF\u110B\u116F\u11AF: ["korean"], \u110B\u1175\u11AF\u110C\u1165\u11BC: ["korean"], \u110B\u1175\u11AF\u110C\u1169\u11BC: ["korean"], \u110B\u1175\u11AF\u110C\u116E\u110B\u1175\u11AF: ["korean"], \u110B\u1175\u11AF\u110D\u1175\u11A8: ["korean"], \u110B\u1175\u11AF\u110E\u1166: ["korean"], \u110B\u1175\u11AF\u110E\u1175: ["korean"], \u110B\u1175\u11AF\u1112\u1162\u11BC: ["korean"], \u110B\u1175\u11AF\u1112\u116C\u110B\u116D\u11BC: ["korean"], \u110B\u1175\u11B7\u1100\u1173\u11B7: ["korean"], \u110B\u1175\u11B7\u1106\u116E: ["korean"], \u110B\u1175\u11B8\u1103\u1162: ["korean"], \u110B\u1175\u11B8\u1105\u1167\u11A8: ["korean"], \u110B\u1175\u11B8\u1106\u1161\u11BA: ["korean"], \u110B\u1175\u11B8\u1109\u1161: ["korean"], \u110B\u1175\u11B8\u1109\u116E\u11AF: ["korean"], \u110B\u1175\u11B8\u1109\u1175: ["korean"], \u110B\u1175\u11B8\u110B\u116F\u11AB: ["korean"], \u110B\u1175\u11B8\u110C\u1161\u11BC: ["korean"], \u110B\u1175\u11B8\u1112\u1161\u11A8: ["korean"], \u110C\u1161\u1100\u1161\u110B\u116D\u11BC: ["korean"], \u110C\u1161\u1100\u1167\u11A8: ["korean"], \u110C\u1161\u1100\u1173\u11A8: ["korean"], \u110C\u1161\u1103\u1169\u11BC: ["korean"], \u110C\u1161\u1105\u1161\u11BC: ["korean"], \u110C\u1161\u1107\u116E\u1109\u1175\u11B7: ["korean"], \u110C\u1161\u1109\u1175\u11A8: ["korean"], \u110C\u1161\u1109\u1175\u11AB: ["korean"], \u110C\u1161\u110B\u1167\u11AB: ["korean"], \u110C\u1161\u110B\u116F\u11AB: ["korean"], \u110C\u1161\u110B\u1172\u11AF: ["korean"], \u110C\u1161\u110C\u1165\u11AB\u1100\u1165: ["korean"], \u110C\u1161\u110C\u1165\u11BC: ["korean"], \u110C\u1161\u110C\u1169\u11AB\u1109\u1175\u11B7: ["korean"], \u110C\u1161\u1111\u1161\u11AB: ["korean"], \u110C\u1161\u11A8\u1100\u1161: ["korean"], \u110C\u1161\u11A8\u1102\u1167\u11AB: ["korean"], \u110C\u1161\u11A8\u1109\u1165\u11BC: ["korean"], \u110C\u1161\u11A8\u110B\u1165\u11B8: ["korean"], \u110C\u1161\u11A8\u110B\u116D\u11BC: ["korean"], \u110C\u1161\u11A8\u110B\u1173\u11AB\u1104\u1161\u11AF: ["korean"], \u110C\u1161\u11A8\u1111\u116E\u11B7: ["korean"], \u110C\u1161\u11AB\u1103\u1175: ["korean"], \u110C\u1161\u11AB\u1104\u1173\u11A8: ["korean"], \u110C\u1161\u11AB\u110E\u1175: ["korean"], \u110C\u1161\u11AF\u1106\u1169\u11BA: ["korean"], \u110C\u1161\u11B7\u1101\u1161\u11AB: ["korean"], \u110C\u1161\u11B7\u1109\u116E\u1112\u1161\u11B7: ["korean"], \u110C\u1161\u11B7\u1109\u1175: ["korean"], \u110C\u1161\u11B7\u110B\u1169\u11BA: ["korean"], \u110C\u1161\u11B7\u110C\u1161\u1105\u1175: ["korean"], \u110C\u1161\u11B8\u110C\u1175: ["korean"], \u110C\u1161\u11BC\u1100\u116A\u11AB: ["korean"], \u110C\u1161\u11BC\u1100\u116E\u11AB: ["korean"], \u110C\u1161\u11BC\u1100\u1175\u1100\u1161\u11AB: ["korean"], \u110C\u1161\u11BC\u1105\u1162: ["korean"], \u110C\u1161\u11BC\u1105\u1168: ["korean"], \u110C\u1161\u11BC\u1105\u1173: ["korean"], \u110C\u1161\u11BC\u1106\u1161: ["korean"], \u110C\u1161\u11BC\u1106\u1167\u11AB: ["korean"], \u110C\u1161\u11BC\u1106\u1169: ["korean"], \u110C\u1161\u11BC\u1106\u1175: ["korean"], \u110C\u1161\u11BC\u1107\u1175: ["korean"], \u110C\u1161\u11BC\u1109\u1161: ["korean"], \u110C\u1161\u11BC\u1109\u1169: ["korean"], \u110C\u1161\u11BC\u1109\u1175\u11A8: ["korean"], \u110C\u1161\u11BC\u110B\u1162\u110B\u1175\u11AB: ["korean"], \u110C\u1161\u11BC\u110B\u1175\u11AB: ["korean"], \u110C\u1161\u11BC\u110C\u1165\u11B7: ["korean"], \u110C\u1161\u11BC\u110E\u1161: ["korean"], \u110C\u1161\u11BC\u1112\u1161\u11A8\u1100\u1173\u11B7: ["korean"], \u110C\u1162\u1102\u1173\u11BC: ["korean"], \u110C\u1162\u1108\u1161\u11AF\u1105\u1175: ["korean"], \u110C\u1162\u1109\u1161\u11AB: ["korean"], \u110C\u1162\u1109\u1162\u11BC: ["korean"], \u110C\u1162\u110C\u1161\u11A8\u1102\u1167\u11AB: ["korean"], \u110C\u1162\u110C\u1165\u11BC: ["korean"], \u110C\u1162\u110E\u1162\u1100\u1175: ["korean"], \u110C\u1162\u1111\u1161\u11AB: ["korean"], \u110C\u1162\u1112\u1161\u11A8: ["korean"], \u110C\u1162\u1112\u116A\u11AF\u110B\u116D\u11BC: ["korean"], \u110C\u1165\u1100\u1165\u11BA: ["korean"], \u110C\u1165\u1100\u1169\u1105\u1175: ["korean"], \u110C\u1165\u1100\u1169\u11BA: ["korean"], \u110C\u1165\u1102\u1167\u11A8: ["korean"], \u110C\u1165\u1105\u1165\u11AB: ["korean"], \u110C\u1165\u1105\u1165\u11C2\u1100\u1166: ["korean"], \u110C\u1165\u1107\u1165\u11AB: ["korean"], \u110C\u1165\u110B\u116E\u11AF: ["korean"], \u110C\u1165\u110C\u1165\u11AF\u1105\u1169: ["korean"], \u110C\u1165\u110E\u116E\u11A8: ["korean"], \u110C\u1165\u11A8\u1100\u1173\u11A8: ["korean"], \u110C\u1165\u11A8\u1103\u1161\u11BC\u1112\u1175: ["korean"], \u110C\u1165\u11A8\u1109\u1165\u11BC: ["korean"], \u110C\u1165\u11A8\u110B\u116D\u11BC: ["korean"], \u110C\u1165\u11A8\u110B\u1173\u11BC: ["korean"], \u110C\u1165\u11AB\u1100\u1162: ["korean"], \u110C\u1165\u11AB\u1100\u1169\u11BC: ["korean"], \u110C\u1165\u11AB\u1100\u1175: ["korean"], \u110C\u1165\u11AB\u1103\u1161\u11AF: ["korean"], \u110C\u1165\u11AB\u1105\u1161\u1103\u1169: ["korean"], \u110C\u1165\u11AB\u1106\u1161\u11BC: ["korean"], \u110C\u1165\u11AB\u1106\u116E\u11AB: ["korean"], \u110C\u1165\u11AB\u1107\u1161\u11AB: ["korean"], \u110C\u1165\u11AB\u1107\u116E: ["korean"], \u110C\u1165\u11AB\u1109\u1166: ["korean"], \u110C\u1165\u11AB\u1109\u1175: ["korean"], \u110C\u1165\u11AB\u110B\u116D\u11BC: ["korean"], \u110C\u1165\u11AB\u110C\u1161: ["korean"], \u110C\u1165\u11AB\u110C\u1162\u11BC: ["korean"], \u110C\u1165\u11AB\u110C\u116E: ["korean"], \u110C\u1165\u11AB\u110E\u1165\u11AF: ["korean"], \u110C\u1165\u11AB\u110E\u1166: ["korean"], \u110C\u1165\u11AB\u1110\u1169\u11BC: ["korean"], \u110C\u1165\u11AB\u1112\u1167: ["korean"], \u110C\u1165\u11AB\u1112\u116E: ["korean"], \u110C\u1165\u11AF\u1103\u1162: ["korean"], \u110C\u1165\u11AF\u1106\u1161\u11BC: ["korean"], \u110C\u1165\u11AF\u1107\u1161\u11AB: ["korean"], \u110C\u1165\u11AF\u110B\u1163\u11A8: ["korean"], \u110C\u1165\u11AF\u110E\u1161: ["korean"], \u110C\u1165\u11B7\u1100\u1165\u11B7: ["korean"], \u110C\u1165\u11B7\u1109\u116E: ["korean"], \u110C\u1165\u11B7\u1109\u1175\u11B7: ["korean"], \u110C\u1165\u11B7\u110B\u116F\u11AB: ["korean"], \u110C\u1165\u11B7\u110C\u1165\u11B7: ["korean"], \u110C\u1165\u11B7\u110E\u1161: ["korean"], \u110C\u1165\u11B8\u1100\u1173\u11AB: ["korean"], \u110C\u1165\u11B8\u1109\u1175: ["korean"], \u110C\u1165\u11B8\u110E\u1169\u11A8: ["korean"], \u110C\u1165\u11BA\u1100\u1161\u1105\u1161\u11A8: ["korean"], \u110C\u1165\u11BC\u1100\u1165\u110C\u1161\u11BC: ["korean"], \u110C\u1165\u11BC\u1103\u1169: ["korean"], \u110C\u1165\u11BC\u1105\u1172\u110C\u1161\u11BC: ["korean"], \u110C\u1165\u11BC\u1105\u1175: ["korean"], \u110C\u1165\u11BC\u1106\u1161\u11AF: ["korean"], \u110C\u1165\u11BC\u1106\u1167\u11AB: ["korean"], \u110C\u1165\u11BC\u1106\u116E\u11AB: ["korean"], \u110C\u1165\u11BC\u1107\u1161\u11AB\u1103\u1162: ["korean"], \u110C\u1165\u11BC\u1107\u1169: ["korean"], \u110C\u1165\u11BC\u1107\u116E: ["korean"], \u110C\u1165\u11BC\u1107\u1175: ["korean"], \u110C\u1165\u11BC\u1109\u1161\u11BC: ["korean"], \u110C\u1165\u11BC\u1109\u1165\u11BC: ["korean"], \u110C\u1165\u11BC\u110B\u1169: ["korean"], \u110C\u1165\u11BC\u110B\u116F\u11AB: ["korean"], \u110C\u1165\u11BC\u110C\u1161\u11BC: ["korean"], \u110C\u1165\u11BC\u110C\u1175: ["korean"], \u110C\u1165\u11BC\u110E\u1175: ["korean"], \u110C\u1165\u11BC\u1112\u116A\u11A8\u1112\u1175: ["korean"], \u110C\u1166\u1100\u1169\u11BC: ["korean"], \u110C\u1166\u1100\u116A\u110C\u1165\u11B7: ["korean"], \u110C\u1166\u1103\u1162\u1105\u1169: ["korean"], \u110C\u1166\u1106\u1169\u11A8: ["korean"], \u110C\u1166\u1107\u1161\u11AF: ["korean"], \u110C\u1166\u1107\u1165\u11B8: ["korean"], \u110C\u1166\u1109\u1161\u11BA\u1102\u1161\u11AF: ["korean"], \u110C\u1166\u110B\u1161\u11AB: ["korean"], \u110C\u1166\u110B\u1175\u11AF: ["korean"], \u110C\u1166\u110C\u1161\u11A8: ["korean"], \u110C\u1166\u110C\u116E\u1103\u1169: ["korean"], \u110C\u1166\u110E\u116E\u11AF: ["korean"], \u110C\u1166\u1111\u116E\u11B7: ["korean"], \u110C\u1166\u1112\u1161\u11AB: ["korean"], \u110C\u1169\u1100\u1161\u11A8: ["korean"], \u110C\u1169\u1100\u1165\u11AB: ["korean"], \u110C\u1169\u1100\u1173\u11B7: ["korean"], \u110C\u1169\u1100\u1175\u11BC: ["korean"], \u110C\u1169\u1106\u1167\u11BC: ["korean"], \u110C\u1169\u1106\u1175\u1105\u116D: ["korean"], \u110C\u1169\u1109\u1161\u11BC: ["korean"], \u110C\u1169\u1109\u1165\u11AB: ["korean"], \u110C\u1169\u110B\u116D\u11BC\u1112\u1175: ["korean"], \u110C\u1169\u110C\u1165\u11AF: ["korean"], \u110C\u1169\u110C\u1165\u11BC: ["korean"], \u110C\u1169\u110C\u1175\u11A8: ["korean"], \u110C\u1169\u11AB\u1103\u1162\u11BA\u1106\u1161\u11AF: ["korean"], \u110C\u1169\u11AB\u110C\u1162: ["korean"], \u110C\u1169\u11AF\u110B\u1165\u11B8: ["korean"], \u110C\u1169\u11AF\u110B\u1173\u11B7: ["korean"], \u110C\u1169\u11BC\u1100\u116D: ["korean"], \u110C\u1169\u11BC\u1105\u1169: ["korean"], \u110C\u1169\u11BC\u1105\u1172: ["korean"], \u110C\u1169\u11BC\u1109\u1169\u1105\u1175: ["korean"], \u110C\u1169\u11BC\u110B\u1165\u11B8\u110B\u116F\u11AB: ["korean"], \u110C\u1169\u11BC\u110C\u1169\u11BC: ["korean"], \u110C\u1169\u11BC\u1112\u1161\u11B8: ["korean"], \u110C\u116A\u1109\u1165\u11A8: ["korean"], \u110C\u116C\u110B\u1175\u11AB: ["korean"], \u110C\u116E\u1100\u116A\u11AB\u110C\u1165\u11A8: ["korean"], \u110C\u116E\u1105\u1173\u11B7: ["korean"], \u110C\u116E\u1106\u1161\u11AF: ["korean"], \u110C\u116E\u1106\u1165\u1102\u1175: ["korean"], \u110C\u116E\u1106\u1165\u11A8: ["korean"], \u110C\u116E\u1106\u116E\u11AB: ["korean"], \u110C\u116E\u1106\u1175\u11AB: ["korean"], \u110C\u116E\u1107\u1161\u11BC: ["korean"], \u110C\u116E\u1107\u1167\u11AB: ["korean"], \u110C\u116E\u1109\u1175\u11A8: ["korean"], \u110C\u116E\u110B\u1175\u11AB: ["korean"], \u110C\u116E\u110B\u1175\u11AF: ["korean"], \u110C\u116E\u110C\u1161\u11BC: ["korean"], \u110C\u116E\u110C\u1165\u11AB\u110C\u1161: ["korean"], \u110C\u116E\u1110\u1162\u11A8: ["korean"], \u110C\u116E\u11AB\u1107\u1175: ["korean"], \u110C\u116E\u11AF\u1100\u1165\u1105\u1175: ["korean"], \u110C\u116E\u11AF\u1100\u1175: ["korean"], \u110C\u116E\u11AF\u1106\u116E\u1102\u1174: ["korean"], \u110C\u116E\u11BC\u1100\u1161\u11AB: ["korean"], \u110C\u116E\u11BC\u1100\u1168\u1107\u1161\u11BC\u1109\u1169\u11BC: ["korean"], \u110C\u116E\u11BC\u1100\u116E\u11A8: ["korean"], \u110C\u116E\u11BC\u1102\u1167\u11AB: ["korean"], \u110C\u116E\u11BC\u1103\u1161\u11AB: ["korean"], \u110C\u116E\u11BC\u1103\u1169\u11A8: ["korean"], \u110C\u116E\u11BC\u1107\u1161\u11AB: ["korean"], \u110C\u116E\u11BC\u1107\u116E: ["korean"], \u110C\u116E\u11BC\u1109\u1166: ["korean"], \u110C\u116E\u11BC\u1109\u1169\u1100\u1175\u110B\u1165\u11B8: ["korean"], \u110C\u116E\u11BC\u1109\u116E\u11AB: ["korean"], \u110C\u116E\u11BC\u110B\u1161\u11BC: ["korean"], \u110C\u116E\u11BC\u110B\u116D: ["korean"], \u110C\u116E\u11BC\u1112\u1161\u11A8\u1100\u116D: ["korean"], \u110C\u1173\u11A8\u1109\u1165\u11A8: ["korean"], \u110C\u1173\u11A8\u1109\u1175: ["korean"], \u110C\u1173\u11AF\u1100\u1165\u110B\u116E\u11B7: ["korean"], \u110C\u1173\u11BC\u1100\u1161: ["korean"], \u110C\u1173\u11BC\u1100\u1165: ["korean"], \u110C\u1173\u11BC\u1100\u116F\u11AB: ["korean"], \u110C\u1173\u11BC\u1109\u1161\u11BC: ["korean"], \u110C\u1173\u11BC\u1109\u1166: ["korean"], \u110C\u1175\u1100\u1161\u11A8: ["korean"], \u110C\u1175\u1100\u1161\u11B8: ["korean"], \u110C\u1175\u1100\u1167\u11BC: ["korean"], \u110C\u1175\u1100\u1173\u11A8\u1112\u1175: ["korean"], \u110C\u1175\u1100\u1173\u11B7: ["korean"], \u110C\u1175\u1100\u1173\u11B8: ["korean"], \u110C\u1175\u1102\u1173\u11BC: ["korean"], \u110C\u1175\u1105\u1173\u11B7\u1100\u1175\u11AF: ["korean"], \u110C\u1175\u1105\u1175\u1109\u1161\u11AB: ["korean"], \u110C\u1175\u1107\u1161\u11BC: ["korean"], \u110C\u1175\u1107\u116E\u11BC: ["korean"], \u110C\u1175\u1109\u1175\u11A8: ["korean"], \u110C\u1175\u110B\u1167\u11A8: ["korean"], \u110C\u1175\u110B\u116E\u1100\u1162: ["korean"], \u110C\u1175\u110B\u116F\u11AB: ["korean"], \u110C\u1175\u110C\u1165\u11A8: ["korean"], \u110C\u1175\u110C\u1165\u11B7: ["korean"], \u110C\u1175\u110C\u1175\u11AB: ["korean"], \u110C\u1175\u110E\u116E\u11AF: ["korean"], \u110C\u1175\u11A8\u1109\u1165\u11AB: ["korean"], \u110C\u1175\u11A8\u110B\u1165\u11B8: ["korean"], \u110C\u1175\u11A8\u110B\u116F\u11AB: ["korean"], \u110C\u1175\u11A8\u110C\u1161\u11BC: ["korean"], \u110C\u1175\u11AB\u1100\u1173\u11B8: ["korean"], \u110C\u1175\u11AB\u1103\u1169\u11BC: ["korean"], \u110C\u1175\u11AB\u1105\u1169: ["korean"], \u110C\u1175\u11AB\u1105\u116D: ["korean"], \u110C\u1175\u11AB\u1105\u1175: ["korean"], \u110C\u1175\u11AB\u110D\u1161: ["korean"], \u110C\u1175\u11AB\u110E\u1161\u11AF: ["korean"], \u110C\u1175\u11AB\u110E\u116E\u11AF: ["korean"], \u110C\u1175\u11AB\u1110\u1169\u11BC: ["korean"], \u110C\u1175\u11AB\u1112\u1162\u11BC: ["korean"], \u110C\u1175\u11AF\u1106\u116E\u11AB: ["korean"], \u110C\u1175\u11AF\u1107\u1167\u11BC: ["korean"], \u110C\u1175\u11AF\u1109\u1165: ["korean"], \u110C\u1175\u11B7\u110C\u1161\u11A8: ["korean"], \u110C\u1175\u11B8\u1103\u1161\u11AB: ["korean"], \u110C\u1175\u11B8\u110B\u1161\u11AB: ["korean"], \u110C\u1175\u11B8\u110C\u116E\u11BC: ["korean"], \u110D\u1161\u110C\u1173\u11BC: ["korean"], \u110D\u1175\u1101\u1165\u1100\u1175: ["korean"], \u110E\u1161\u1102\u1161\u11B7: ["korean"], \u110E\u1161\u1105\u1161\u1105\u1175: ["korean"], \u110E\u1161\u1105\u1163\u11BC: ["korean"], \u110E\u1161\u1105\u1175\u11B7: ["korean"], \u110E\u1161\u1107\u1167\u11AF: ["korean"], \u110E\u1161\u1109\u1165\u11AB: ["korean"], \u110E\u1161\u110E\u1173\u11B7: ["korean"], \u110E\u1161\u11A8\u1100\u1161\u11A8: ["korean"], \u110E\u1161\u11AB\u1106\u116E\u11AF: ["korean"], \u110E\u1161\u11AB\u1109\u1165\u11BC: ["korean"], \u110E\u1161\u11B7\u1100\u1161: ["korean"], \u110E\u1161\u11B7\u1100\u1175\u1105\u1173\u11B7: ["korean"], \u110E\u1161\u11B7\u1109\u1162: ["korean"], \u110E\u1161\u11B7\u1109\u1165\u11A8: ["korean"], \u110E\u1161\u11B7\u110B\u1167: ["korean"], \u110E\u1161\u11B7\u110B\u116C: ["korean"], \u110E\u1161\u11B7\u110C\u1169: ["korean"], \u110E\u1161\u11BA\u110C\u1161\u11AB: ["korean"], \u110E\u1161\u11BC\u1100\u1161: ["korean"], \u110E\u1161\u11BC\u1100\u1169: ["korean"], \u110E\u1161\u11BC\u1100\u116E: ["korean"], \u110E\u1161\u11BC\u1106\u116E\u11AB: ["korean"], \u110E\u1161\u11BC\u1107\u1161\u11A9: ["korean"], \u110E\u1161\u11BC\u110C\u1161\u11A8: ["korean"], \u110E\u1161\u11BC\u110C\u1169: ["korean"], \u110E\u1162\u1102\u1165\u11AF: ["korean"], \u110E\u1162\u110C\u1165\u11B7: ["korean"], \u110E\u1162\u11A8\u1100\u1161\u1107\u1161\u11BC: ["korean"], \u110E\u1162\u11A8\u1107\u1161\u11BC: ["korean"], \u110E\u1162\u11A8\u1109\u1161\u11BC: ["korean"], \u110E\u1162\u11A8\u110B\u1175\u11B7: ["korean"], \u110E\u1162\u11B7\u1111\u1175\u110B\u1165\u11AB: ["korean"], \u110E\u1165\u1107\u1165\u11AF: ["korean"], \u110E\u1165\u110B\u1173\u11B7: ["korean"], \u110E\u1165\u11AB\u1100\u116E\u11A8: ["korean"], \u110E\u1165\u11AB\u1103\u116E\u11BC: ["korean"], \u110E\u1165\u11AB\u110C\u1161\u11BC: ["korean"], \u110E\u1165\u11AB\u110C\u1162: ["korean"], \u110E\u1165\u11AB\u110E\u1165\u11AB\u1112\u1175: ["korean"], \u110E\u1165\u11AF\u1103\u1169: ["korean"], \u110E\u1165\u11AF\u110C\u1165\u1112\u1175: ["korean"], \u110E\u1165\u11AF\u1112\u1161\u11A8: ["korean"], \u110E\u1165\u11BA\u1102\u1161\u11AF: ["korean"], \u110E\u1165\u11BA\u110D\u1162: ["korean"], \u110E\u1165\u11BC\u1102\u1167\u11AB: ["korean"], \u110E\u1165\u11BC\u1107\u1161\u110C\u1175: ["korean"], \u110E\u1165\u11BC\u1109\u1169: ["korean"], \u110E\u1165\u11BC\u110E\u116E\u11AB: ["korean"], \u110E\u1166\u1100\u1168: ["korean"], \u110E\u1166\u1105\u1167\u11A8: ["korean"], \u110E\u1166\u110B\u1169\u11AB: ["korean"], \u110E\u1166\u110B\u1172\u11A8: ["korean"], \u110E\u1166\u110C\u116E\u11BC: ["korean"], \u110E\u1166\u1112\u1165\u11B7: ["korean"], \u110E\u1169\u1103\u1173\u11BC\u1112\u1161\u11A8\u1109\u1162\u11BC: ["korean"], \u110E\u1169\u1107\u1161\u11AB: ["korean"], \u110E\u1169\u1107\u1161\u11B8: ["korean"], \u110E\u1169\u1109\u1161\u11BC\u1112\u116A: ["korean"], \u110E\u1169\u1109\u116E\u11AB: ["korean"], \u110E\u1169\u110B\u1167\u1105\u1173\u11B7: ["korean"], \u110E\u1169\u110B\u116F\u11AB: ["korean"], \u110E\u1169\u110C\u1165\u1102\u1167\u11A8: ["korean"], \u110E\u1169\u110C\u1165\u11B7: ["korean"], \u110E\u1169\u110E\u1165\u11BC: ["korean"], \u110E\u1169\u110F\u1169\u11AF\u1105\u1175\u11BA: ["korean"], \u110E\u1169\u11BA\u1107\u116E\u11AF: ["korean"], \u110E\u1169\u11BC\u1100\u1161\u11A8: ["korean"], \u110E\u1169\u11BC\u1105\u1175: ["korean"], \u110E\u1169\u11BC\u110C\u1161\u11BC: ["korean"], \u110E\u116A\u11AF\u110B\u1167\u11BC: ["korean"], \u110E\u116C\u1100\u1173\u11AB: ["korean"], \u110E\u116C\u1109\u1161\u11BC: ["korean"], \u110E\u116C\u1109\u1165\u11AB: ["korean"], \u110E\u116C\u1109\u1175\u11AB: ["korean"], \u110E\u116C\u110B\u1161\u11A8: ["korean"], \u110E\u116C\u110C\u1169\u11BC: ["korean"], \u110E\u116E\u1109\u1165\u11A8: ["korean"], \u110E\u116E\u110B\u1165\u11A8: ["korean"], \u110E\u116E\u110C\u1175\u11AB: ["korean"], \u110E\u116E\u110E\u1165\u11AB: ["korean"], \u110E\u116E\u110E\u1173\u11A8: ["korean"], \u110E\u116E\u11A8\u1100\u116E: ["korean"], \u110E\u116E\u11A8\u1109\u1169: ["korean"], \u110E\u116E\u11A8\u110C\u1166: ["korean"], \u110E\u116E\u11A8\u1112\u1161: ["korean"], \u110E\u116E\u11AF\u1100\u1173\u11AB: ["korean"], \u110E\u116E\u11AF\u1107\u1161\u11AF: ["korean"], \u110E\u116E\u11AF\u1109\u1161\u11AB: ["korean"], \u110E\u116E\u11AF\u1109\u1175\u11AB: ["korean"], \u110E\u116E\u11AF\u110B\u1167\u11AB: ["korean"], \u110E\u116E\u11AF\u110B\u1175\u11B8: ["korean"], \u110E\u116E\u11AF\u110C\u1161\u11BC: ["korean"], \u110E\u116E\u11AF\u1111\u1161\u11AB: ["korean"], \u110E\u116E\u11BC\u1100\u1167\u11A8: ["korean"], \u110E\u116E\u11BC\u1100\u1169: ["korean"], \u110E\u116E\u11BC\u1103\u1169\u11AF: ["korean"], \u110E\u116E\u11BC\u1107\u116E\u11AB\u1112\u1175: ["korean"], \u110E\u116E\u11BC\u110E\u1165\u11BC\u1103\u1169: ["korean"], \u110E\u1171\u110B\u1165\u11B8: ["korean"], \u110E\u1171\u110C\u1175\u11A8: ["korean"], \u110E\u1171\u1112\u1163\u11BC: ["korean"], \u110E\u1175\u110B\u1163\u11A8: ["korean"], \u110E\u1175\u11AB\u1100\u116E: ["korean"], \u110E\u1175\u11AB\u110E\u1165\u11A8: ["korean"], \u110E\u1175\u11AF\u1109\u1175\u11B8: ["korean"], \u110E\u1175\u11AF\u110B\u116F\u11AF: ["korean"], \u110E\u1175\u11AF\u1111\u1161\u11AB: ["korean"], \u110E\u1175\u11B7\u1103\u1162: ["korean"], \u110E\u1175\u11B7\u1106\u116E\u11A8: ["korean"], \u110E\u1175\u11B7\u1109\u1175\u11AF: ["korean"], \u110E\u1175\u11BA\u1109\u1169\u11AF: ["korean"], \u110E\u1175\u11BC\u110E\u1161\u11AB: ["korean"], \u110F\u1161\u1106\u1166\u1105\u1161: ["korean"], \u110F\u1161\u110B\u116E\u11AB\u1110\u1165: ["korean"], \u110F\u1161\u11AF\u1100\u116E\u11A8\u1109\u116E: ["korean"], \u110F\u1162\u1105\u1175\u11A8\u1110\u1165: ["korean"], \u110F\u1162\u11B7\u1111\u1165\u1109\u1173: ["korean"], \u110F\u1162\u11B7\u1111\u1166\u110B\u1175\u11AB: ["korean"], \u110F\u1165\u1110\u1173\u11AB: ["korean"], \u110F\u1165\u11AB\u1103\u1175\u1109\u1167\u11AB: ["korean"], \u110F\u1165\u11AF\u1105\u1165: ["korean"], \u110F\u1165\u11B7\u1111\u1172\u1110\u1165: ["korean"], \u110F\u1169\u1101\u1175\u1105\u1175: ["korean"], \u110F\u1169\u1106\u1175\u1103\u1175: ["korean"], \u110F\u1169\u11AB\u1109\u1165\u1110\u1173: ["korean"], \u110F\u1169\u11AF\u1105\u1161: ["korean"], \u110F\u1169\u11B7\u1111\u1173\u11AF\u1105\u1166\u11A8\u1109\u1173: ["korean"], \u110F\u1169\u11BC\u1102\u1161\u1106\u116E\u11AF: ["korean"], \u110F\u116B\u1100\u1161\u11B7: ["korean"], \u110F\u116E\u1103\u1166\u1110\u1161: ["korean"], \u110F\u1173\u1105\u1175\u11B7: ["korean"], \u110F\u1173\u11AB\u1100\u1175\u11AF: ["korean"], \u110F\u1173\u11AB\u1104\u1161\u11AF: ["korean"], \u110F\u1173\u11AB\u1109\u1169\u1105\u1175: ["korean"], \u110F\u1173\u11AB\u110B\u1161\u1103\u1173\u11AF: ["korean"], \u110F\u1173\u11AB\u110B\u1165\u1106\u1165\u1102\u1175: ["korean"], \u110F\u1173\u11AB\u110B\u1175\u11AF: ["korean"], \u110F\u1173\u11AB\u110C\u1165\u11AF: ["korean"], \u110F\u1173\u11AF\u1105\u1162\u1109\u1175\u11A8: ["korean"], \u110F\u1173\u11AF\u1105\u1165\u11B8: ["korean"], \u110F\u1175\u11AF\u1105\u1169: ["korean"], \u1110\u1161\u110B\u1175\u11B8: ["korean"], \u1110\u1161\u110C\u1161\u1100\u1175: ["korean"], \u1110\u1161\u11A8\u1100\u116E: ["korean"], \u1110\u1161\u11A8\u110C\u1161: ["korean"], \u1110\u1161\u11AB\u1109\u1162\u11BC: ["korean"], \u1110\u1162\u1100\u116F\u11AB\u1103\u1169: ["korean"], \u1110\u1162\u110B\u1163\u11BC: ["korean"], \u1110\u1162\u1111\u116E\u11BC: ["korean"], \u1110\u1162\u11A8\u1109\u1175: ["korean"], \u1110\u1162\u11AF\u1105\u1165\u11AB\u1110\u1173: ["korean"], \u1110\u1165\u1102\u1165\u11AF: ["korean"], \u1110\u1165\u1106\u1175\u1102\u1165\u11AF: ["korean"], \u1110\u1166\u1102\u1175\u1109\u1173: ["korean"], \u1110\u1166\u1109\u1173\u1110\u1173: ["korean"], \u1110\u1166\u110B\u1175\u1107\u1173\u11AF: ["korean"], \u1110\u1166\u11AF\u1105\u1166\u1107\u1175\u110C\u1165\u11AB: ["korean"], \u1110\u1169\u1105\u1169\u11AB: ["korean"], \u1110\u1169\u1106\u1161\u1110\u1169: ["korean"], \u1110\u1169\u110B\u116D\u110B\u1175\u11AF: ["korean"], \u1110\u1169\u11BC\u1100\u1168: ["korean"], \u1110\u1169\u11BC\u1100\u116A: ["korean"], \u1110\u1169\u11BC\u1105\u1169: ["korean"], \u1110\u1169\u11BC\u1109\u1175\u11AB: ["korean"], \u1110\u1169\u11BC\u110B\u1167\u11A8: ["korean"], \u1110\u1169\u11BC\u110B\u1175\u11AF: ["korean"], \u1110\u1169\u11BC\u110C\u1161\u11BC: ["korean"], \u1110\u1169\u11BC\u110C\u1166: ["korean"], \u1110\u1169\u11BC\u110C\u1173\u11BC: ["korean"], \u1110\u1169\u11BC\u1112\u1161\u11B8: ["korean"], \u1110\u1169\u11BC\u1112\u116A: ["korean"], \u1110\u116C\u1100\u1173\u11AB: ["korean"], \u1110\u116C\u110B\u116F\u11AB: ["korean"], \u1110\u116C\u110C\u1175\u11A8\u1100\u1173\u11B7: ["korean"], \u1110\u1171\u1100\u1175\u11B7: ["korean"], \u1110\u1173\u1105\u1165\u11A8: ["korean"], \u1110\u1173\u11A8\u1100\u1173\u11B8: ["korean"], \u1110\u1173\u11A8\u1107\u1167\u11AF: ["korean"], \u1110\u1173\u11A8\u1109\u1165\u11BC: ["korean"], \u1110\u1173\u11A8\u1109\u116E: ["korean"], \u1110\u1173\u11A8\u110C\u1175\u11BC: ["korean"], \u1110\u1173\u11A8\u1112\u1175: ["korean"], \u1110\u1173\u11AB\u1110\u1173\u11AB\u1112\u1175: ["korean"], \u1110\u1175\u1109\u1167\u110E\u1173: ["korean"], \u1111\u1161\u1105\u1161\u11AB\u1109\u1162\u11A8: ["korean"], \u1111\u1161\u110B\u1175\u11AF: ["korean"], \u1111\u1161\u110E\u116E\u11AF\u1109\u1169: ["korean"], \u1111\u1161\u11AB\u1100\u1167\u11AF: ["korean"], \u1111\u1161\u11AB\u1103\u1161\u11AB: ["korean"], \u1111\u1161\u11AB\u1106\u1162: ["korean"], \u1111\u1161\u11AB\u1109\u1161: ["korean"], \u1111\u1161\u11AF\u1109\u1175\u11B8: ["korean"], \u1111\u1161\u11AF\u110B\u116F\u11AF: ["korean"], \u1111\u1161\u11B8\u1109\u1169\u11BC: ["korean"], \u1111\u1162\u1109\u1167\u11AB: ["korean"], \u1111\u1162\u11A8\u1109\u1173: ["korean"], \u1111\u1162\u11A8\u1109\u1175\u1106\u1175\u11AF\u1105\u1175: ["korean"], \u1111\u1162\u11AB\u1110\u1175: ["korean"], \u1111\u1165\u1109\u1166\u11AB\u1110\u1173: ["korean"], \u1111\u1166\u110B\u1175\u11AB\u1110\u1173: ["korean"], \u1111\u1167\u11AB\u1100\u1167\u11AB: ["korean"], \u1111\u1167\u11AB\u110B\u1174: ["korean"], \u1111\u1167\u11AB\u110C\u1175: ["korean"], \u1111\u1167\u11AB\u1112\u1175: ["korean"], \u1111\u1167\u11BC\u1100\u1161: ["korean"], \u1111\u1167\u11BC\u1100\u1172\u11AB: ["korean"], \u1111\u1167\u11BC\u1109\u1162\u11BC: ["korean"], \u1111\u1167\u11BC\u1109\u1169: ["korean"], \u1111\u1167\u11BC\u110B\u1163\u11BC: ["korean"], \u1111\u1167\u11BC\u110B\u1175\u11AF: ["korean"], \u1111\u1167\u11BC\u1112\u116A: ["korean"], \u1111\u1169\u1109\u1173\u1110\u1165: ["korean"], \u1111\u1169\u110B\u1175\u11AB\u1110\u1173: ["korean"], \u1111\u1169\u110C\u1161\u11BC: ["korean"], \u1111\u1169\u1112\u1161\u11B7: ["korean"], \u1111\u116D\u1106\u1167\u11AB: ["korean"], \u1111\u116D\u110C\u1165\u11BC: ["korean"], \u1111\u116D\u110C\u116E\u11AB: ["korean"], \u1111\u116D\u1112\u1167\u11AB: ["korean"], \u1111\u116E\u11B7\u1106\u1169\u11A8: ["korean"], \u1111\u116E\u11B7\u110C\u1175\u11AF: ["korean"], \u1111\u116E\u11BC\u1100\u1167\u11BC: ["korean"], \u1111\u116E\u11BC\u1109\u1169\u11A8: ["korean"], \u1111\u116E\u11BC\u1109\u1173\u11B8: ["korean"], \u1111\u1173\u1105\u1161\u11BC\u1109\u1173: ["korean"], \u1111\u1173\u1105\u1175\u11AB\u1110\u1165: ["korean"], \u1111\u1173\u11AF\u1105\u1161\u1109\u1173\u1110\u1175\u11A8: ["korean"], \u1111\u1175\u1100\u1169\u11AB: ["korean"], \u1111\u1175\u1106\u1161\u11BC: ["korean"], \u1111\u1175\u110B\u1161\u1102\u1169: ["korean"], \u1111\u1175\u11AF\u1105\u1173\u11B7: ["korean"], \u1111\u1175\u11AF\u1109\u116E: ["korean"], \u1111\u1175\u11AF\u110B\u116D: ["korean"], \u1111\u1175\u11AF\u110C\u1161: ["korean"], \u1111\u1175\u11AF\u1110\u1169\u11BC: ["korean"], \u1111\u1175\u11BC\u1100\u1168: ["korean"], \u1112\u1161\u1102\u1173\u1102\u1175\u11B7: ["korean"], \u1112\u1161\u1102\u1173\u11AF: ["korean"], \u1112\u1161\u1103\u1173\u110B\u1170\u110B\u1165: ["korean"], \u1112\u1161\u1105\u116E\u11BA\u1107\u1161\u11B7: ["korean"], \u1112\u1161\u1107\u1161\u11AB\u1100\u1175: ["korean"], \u1112\u1161\u1109\u116E\u11A8\u110C\u1175\u11B8: ["korean"], \u1112\u1161\u1109\u116E\u11AB: ["korean"], \u1112\u1161\u110B\u1167\u1110\u1173\u11AB: ["korean"], \u1112\u1161\u110C\u1175\u1106\u1161\u11AB: ["korean"], \u1112\u1161\u110E\u1165\u11AB: ["korean"], \u1112\u1161\u1111\u116E\u11B7: ["korean"], \u1112\u1161\u1111\u1175\u11AF: ["korean"], \u1112\u1161\u11A8\u1100\u116A: ["korean"], \u1112\u1161\u11A8\u1100\u116D: ["korean"], \u1112\u1161\u11A8\u1100\u1173\u11B8: ["korean"], \u1112\u1161\u11A8\u1100\u1175: ["korean"], \u1112\u1161\u11A8\u1102\u1167\u11AB: ["korean"], \u1112\u1161\u11A8\u1105\u1167\u11A8: ["korean"], \u1112\u1161\u11A8\u1107\u1165\u11AB: ["korean"], \u1112\u1161\u11A8\u1107\u116E\u1106\u1169: ["korean"], \u1112\u1161\u11A8\u1107\u1175: ["korean"], \u1112\u1161\u11A8\u1109\u1162\u11BC: ["korean"], \u1112\u1161\u11A8\u1109\u116E\u11AF: ["korean"], \u1112\u1161\u11A8\u1109\u1173\u11B8: ["korean"], \u1112\u1161\u11A8\u110B\u116D\u11BC\u1111\u116E\u11B7: ["korean"], \u1112\u1161\u11A8\u110B\u116F\u11AB: ["korean"], \u1112\u1161\u11A8\u110B\u1171: ["korean"], \u1112\u1161\u11A8\u110C\u1161: ["korean"], \u1112\u1161\u11A8\u110C\u1165\u11B7: ["korean"], \u1112\u1161\u11AB\u1100\u1168: ["korean"], \u1112\u1161\u11AB\u1100\u1173\u11AF: ["korean"], \u1112\u1161\u11AB\u1101\u1165\u1107\u1165\u11AB\u110B\u1166: ["korean"], \u1112\u1161\u11AB\u1102\u1161\u11BD: ["korean"], \u1112\u1161\u11AB\u1102\u116E\u11AB: ["korean"], \u1112\u1161\u11AB\u1103\u1169\u11BC\u110B\u1161\u11AB: ["korean"], \u1112\u1161\u11AB\u1104\u1162: ["korean"], \u1112\u1161\u11AB\u1105\u1161\u1109\u1161\u11AB: ["korean"], \u1112\u1161\u11AB\u1106\u1161\u1103\u1175: ["korean"], \u1112\u1161\u11AB\u1106\u116E\u11AB: ["korean"], \u1112\u1161\u11AB\u1107\u1165\u11AB: ["korean"], \u1112\u1161\u11AB\u1107\u1169\u11A8: ["korean"], \u1112\u1161\u11AB\u1109\u1175\u11A8: ["korean"], \u1112\u1161\u11AB\u110B\u1167\u1105\u1173\u11B7: ["korean"], \u1112\u1161\u11AB\u110D\u1169\u11A8: ["korean"], \u1112\u1161\u11AF\u1106\u1165\u1102\u1175: ["korean"], \u1112\u1161\u11AF\u110B\u1161\u1107\u1165\u110C\u1175: ["korean"], \u1112\u1161\u11AF\u110B\u1175\u11AB: ["korean"], \u1112\u1161\u11B7\u1101\u1166: ["korean"], \u1112\u1161\u11B7\u1107\u116E\u1105\u1169: ["korean"], \u1112\u1161\u11B8\u1100\u1167\u11A8: ["korean"], \u1112\u1161\u11B8\u1105\u1175\u110C\u1165\u11A8: ["korean"], \u1112\u1161\u11BC\u1100\u1169\u11BC: ["korean"], \u1112\u1161\u11BC\u1100\u116E: ["korean"], \u1112\u1161\u11BC\u1109\u1161\u11BC: ["korean"], \u1112\u1161\u11BC\u110B\u1174: ["korean"], \u1112\u1162\u1100\u1167\u11AF: ["korean"], \u1112\u1162\u1100\u116E\u11AB: ["korean"], \u1112\u1162\u1103\u1161\u11B8: ["korean"], \u1112\u1162\u1103\u1161\u11BC: ["korean"], \u1112\u1162\u1106\u116E\u11AF: ["korean"], \u1112\u1162\u1109\u1165\u11A8: ["korean"], \u1112\u1162\u1109\u1165\u11AF: ["korean"], \u1112\u1162\u1109\u116E\u110B\u116D\u11A8\u110C\u1161\u11BC: ["korean"], \u1112\u1162\u110B\u1161\u11AB: ["korean"], \u1112\u1162\u11A8\u1109\u1175\u11B7: ["korean"], \u1112\u1162\u11AB\u1103\u1173\u1107\u1162\u11A8: ["korean"], \u1112\u1162\u11B7\u1107\u1165\u1100\u1165: ["korean"], \u1112\u1162\u11BA\u1107\u1167\u11C0: ["korean"], \u1112\u1162\u11BA\u1109\u1161\u11AF: ["korean"], \u1112\u1162\u11BC\u1103\u1169\u11BC: ["korean"], \u1112\u1162\u11BC\u1107\u1169\u11A8: ["korean"], \u1112\u1162\u11BC\u1109\u1161: ["korean"], \u1112\u1162\u11BC\u110B\u116E\u11AB: ["korean"], \u1112\u1162\u11BC\u110B\u1171: ["korean"], \u1112\u1163\u11BC\u1100\u1175: ["korean"], \u1112\u1163\u11BC\u1109\u1161\u11BC: ["korean"], \u1112\u1163\u11BC\u1109\u116E: ["korean"], \u1112\u1165\u1105\u1161\u11A8: ["korean"], \u1112\u1165\u110B\u116D\u11BC: ["korean"], \u1112\u1166\u11AF\u1100\u1175: ["korean"], \u1112\u1167\u11AB\u1100\u116A\u11AB: ["korean"], \u1112\u1167\u11AB\u1100\u1173\u11B7: ["korean"], \u1112\u1167\u11AB\u1103\u1162: ["korean"], \u1112\u1167\u11AB\u1109\u1161\u11BC: ["korean"], \u1112\u1167\u11AB\u1109\u1175\u11AF: ["korean"], \u1112\u1167\u11AB\u110C\u1161\u11BC: ["korean"], \u1112\u1167\u11AB\u110C\u1162: ["korean"], \u1112\u1167\u11AB\u110C\u1175: ["korean"], \u1112\u1167\u11AF\u110B\u1162\u11A8: ["korean"], \u1112\u1167\u11B8\u1105\u1167\u11A8: ["korean"], \u1112\u1167\u11BC\u1107\u116E: ["korean"], \u1112\u1167\u11BC\u1109\u1161: ["korean"], \u1112\u1167\u11BC\u1109\u116E: ["korean"], \u1112\u1167\u11BC\u1109\u1175\u11A8: ["korean"], \u1112\u1167\u11BC\u110C\u1166: ["korean"], \u1112\u1167\u11BC\u1110\u1162: ["korean"], \u1112\u1167\u11BC\u1111\u1167\u11AB: ["korean"], \u1112\u1168\u1110\u1162\u11A8: ["korean"], \u1112\u1169\u1100\u1175\u1109\u1175\u11B7: ["korean"], \u1112\u1169\u1102\u1161\u11B7: ["korean"], \u1112\u1169\u1105\u1161\u11BC\u110B\u1175: ["korean"], \u1112\u1169\u1107\u1161\u11A8: ["korean"], \u1112\u1169\u1110\u1166\u11AF: ["korean"], \u1112\u1169\u1112\u1173\u11B8: ["korean"], \u1112\u1169\u11A8\u1109\u1175: ["korean"], \u1112\u1169\u11AF\u1105\u1169: ["korean"], \u1112\u1169\u11B7\u1111\u1166\u110B\u1175\u110C\u1175: ["korean"], \u1112\u1169\u11BC\u1107\u1169: ["korean"], \u1112\u1169\u11BC\u1109\u116E: ["korean"], \u1112\u1169\u11BC\u110E\u1161: ["korean"], \u1112\u116A\u1106\u1167\u11AB: ["korean"], \u1112\u116A\u1107\u116E\u11AB: ["korean"], \u1112\u116A\u1109\u1161\u11AF: ["korean"], \u1112\u116A\u110B\u116D\u110B\u1175\u11AF: ["korean"], \u1112\u116A\u110C\u1161\u11BC: ["korean"], \u1112\u116A\u1112\u1161\u11A8: ["korean"], \u1112\u116A\u11A8\u1107\u1169: ["korean"], \u1112\u116A\u11A8\u110B\u1175\u11AB: ["korean"], \u1112\u116A\u11A8\u110C\u1161\u11BC: ["korean"], \u1112\u116A\u11A8\u110C\u1165\u11BC: ["korean"], \u1112\u116A\u11AB\u1100\u1161\u11B8: ["korean"], \u1112\u116A\u11AB\u1100\u1167\u11BC: ["korean"], \u1112\u116A\u11AB\u110B\u1167\u11BC: ["korean"], \u1112\u116A\u11AB\u110B\u1172\u11AF: ["korean"], \u1112\u116A\u11AB\u110C\u1161: ["korean"], \u1112\u116A\u11AF\u1100\u1175: ["korean"], \u1112\u116A\u11AF\u1103\u1169\u11BC: ["korean"], \u1112\u116A\u11AF\u1107\u1161\u11AF\u1112\u1175: ["korean"], \u1112\u116A\u11AF\u110B\u116D\u11BC: ["korean"], \u1112\u116A\u11AF\u110D\u1161\u11A8: ["korean"], \u1112\u116C\u1100\u1167\u11AB: ["korean"], \u1112\u116C\u1100\u116A\u11AB: ["korean"], \u1112\u116C\u1107\u1169\u11A8: ["korean"], \u1112\u116C\u1109\u1162\u11A8: ["korean"], \u1112\u116C\u110B\u116F\u11AB: ["korean"], \u1112\u116C\u110C\u1161\u11BC: ["korean"], \u1112\u116C\u110C\u1165\u11AB: ["korean"], \u1112\u116C\u11BA\u1109\u116E: ["korean"], \u1112\u116C\u11BC\u1103\u1161\u11AB\u1107\u1169\u1103\u1169: ["korean"], \u1112\u116D\u110B\u1172\u11AF\u110C\u1165\u11A8: ["korean"], \u1112\u116E\u1107\u1161\u11AB: ["korean"], \u1112\u116E\u110E\u116E\u11BA\u1100\u1161\u1105\u116E: ["korean"], \u1112\u116E\u11AB\u1105\u1167\u11AB: ["korean"], \u1112\u116F\u11AF\u110A\u1175\u11AB: ["korean"], \u1112\u1172\u1109\u1175\u11A8: ["korean"], \u1112\u1172\u110B\u1175\u11AF: ["korean"], \u1112\u1172\u11BC\u1102\u1162: ["korean"], \u1112\u1173\u1105\u1173\u11B7: ["korean"], \u1112\u1173\u11A8\u1107\u1162\u11A8: ["korean"], \u1112\u1173\u11A8\u110B\u1175\u11AB: ["korean"], \u1112\u1173\u11AB\u110C\u1165\u11A8: ["korean"], \u1112\u1173\u11AB\u1112\u1175: ["korean"], \u1112\u1173\u11BC\u1106\u1175: ["korean"], \u1112\u1173\u11BC\u1107\u116E\u11AB: ["korean"], \u1112\u1174\u1100\u1169\u11A8: ["korean"], \u1112\u1174\u1106\u1161\u11BC: ["korean"], \u1112\u1174\u1109\u1162\u11BC: ["korean"], \u1112\u1174\u11AB\u1109\u1162\u11A8: ["korean"], \u1112\u1175\u11B7\u1101\u1165\u11BA: ["korean"], abacate: ["portuguese"], abaixo: ["portuguese"], abalar: ["portuguese"], abater: ["portuguese"], abduzir: ["portuguese"], abelha: ["portuguese"], aberto: ["portuguese"], abismo: ["portuguese"], abotoar: ["portuguese"], abranger: ["portuguese"], abreviar: ["portuguese"], abrigar: ["portuguese"], abrupto: ["portuguese"], absinto: ["portuguese"], absoluto: ["portuguese"], absurdo: ["portuguese"], abutre: ["portuguese"], acabado: ["portuguese"], acalmar: ["portuguese"], acampar: ["portuguese"], acanhar: ["portuguese"], acaso: ["portuguese"], aceitar: ["portuguese"], acelerar: ["portuguese"], acenar: ["portuguese"], acervo: ["portuguese"], acessar: ["portuguese"], acetona: ["portuguese"], achatar: ["portuguese"], acidez: ["portuguese"], acima: ["portuguese"], acionado: ["portuguese"], acirrar: ["portuguese"], aclamar: ["portuguese"], aclive: ["portuguese"], acolhida: ["portuguese"], acomodar: ["portuguese"], acoplar: ["portuguese"], acordar: ["portuguese"], acumular: ["portuguese"], acusador: ["portuguese"], adaptar: ["portuguese"], adega: ["portuguese"], adentro: ["portuguese"], adepto: ["portuguese"], adequar: ["portuguese"], aderente: ["portuguese"], adesivo: ["portuguese"], adeus: ["portuguese"], adiante: ["portuguese"], aditivo: ["portuguese"], adjetivo: ["portuguese"], adjunto: ["portuguese"], admirar: ["portuguese"], adorar: ["portuguese"], adquirir: ["portuguese"], adubo: ["portuguese"], adverso: ["portuguese"], advogado: ["portuguese"], aeronave: ["portuguese"], afastar: ["portuguese"], aferir: ["portuguese"], afetivo: ["portuguese"], afinador: ["portuguese"], afivelar: ["portuguese"], aflito: ["portuguese"], afluente: ["portuguese"], afrontar: ["portuguese"], agachar: ["portuguese"], agarrar: ["portuguese"], agasalho: ["portuguese"], agenciar: ["portuguese"], agilizar: ["portuguese"], agiota: ["portuguese"], agitado: ["portuguese"], agora: ["portuguese"], agradar: ["portuguese"], agreste: ["portuguese"], agrupar: ["portuguese"], aguardar: ["portuguese"], agulha: ["portuguese"], ajoelhar: ["portuguese"], ajudar: ["portuguese"], ajustar: ["portuguese"], alameda: ["portuguese"], alarme: ["portuguese"], alastrar: ["portuguese"], alavanca: ["portuguese"], albergue: ["portuguese"], albino: ["portuguese"], alcatra: ["portuguese"], aldeia: ["portuguese"], alecrim: ["portuguese"], alegria: ["portuguese"], alertar: ["portuguese"], alface: ["portuguese"], alfinete: ["portuguese"], algum: ["portuguese"], alheio: ["portuguese"], aliar: ["portuguese"], alicate: ["portuguese"], alienar: ["portuguese"], alinhar: ["portuguese"], aliviar: ["portuguese"], almofada: ["portuguese"], alocar: ["portuguese"], alpiste: ["portuguese"], alterar: ["portuguese"], altitude: ["portuguese"], alucinar: ["portuguese"], alugar: ["portuguese"], aluno: ["portuguese"], alusivo: ["portuguese"], alvo: ["portuguese"], amaciar: ["portuguese"], amador: ["portuguese"], amarelo: ["portuguese"], amassar: ["portuguese"], ambas: ["portuguese"], ambiente: ["portuguese"], ameixa: ["portuguese"], amenizar: ["portuguese"], amido: ["portuguese"], amistoso: ["portuguese"], amizade: ["portuguese"], amolador: ["portuguese"], amontoar: ["portuguese"], amoroso: ["portuguese"], amostra: ["portuguese"], amparar: ["portuguese"], ampliar: ["portuguese"], ampola: ["portuguese"], anagrama: ["portuguese"], analisar: ["portuguese"], anarquia: ["portuguese"], anatomia: ["portuguese"], andaime: ["portuguese"], anel: ["portuguese"], anexo: ["portuguese"], angular: ["portuguese"], animar: ["portuguese"], anjo: ["portuguese"], anomalia: ["portuguese"], anotado: ["portuguese"], ansioso: ["portuguese"], anterior: ["portuguese"], anuidade: ["portuguese"], anunciar: ["portuguese"], anzol: ["portuguese"], apagador: ["portuguese"], apalpar: ["portuguese"], apanhado: ["portuguese"], apego: ["portuguese"], apelido: ["portuguese"], apertada: ["portuguese"], apesar: ["portuguese"], apetite: ["portuguese"], apito: ["portuguese"], aplauso: ["portuguese"], aplicada: ["portuguese"], apoio: ["portuguese"], apontar: ["portuguese"], aposta: ["portuguese"], aprendiz: ["portuguese"], aprovar: ["portuguese"], aquecer: ["portuguese"], arame: ["portuguese"], aranha: ["portuguese"], arara: ["portuguese"], arcada: ["portuguese"], ardente: ["portuguese"], areia: ["portuguese"], arejar: ["portuguese"], arenito: ["portuguese"], aresta: ["portuguese"], argiloso: ["portuguese"], argola: ["portuguese"], arma: ["portuguese"], arquivo: ["portuguese"], arraial: ["portuguese"], arrebate: ["portuguese"], arriscar: ["portuguese"], arroba: ["portuguese"], arrumar: ["portuguese"], arsenal: ["portuguese"], arterial: ["portuguese"], artigo: ["portuguese"], arvoredo: ["portuguese"], asfaltar: ["portuguese"], asilado: ["portuguese"], aspirar: ["portuguese"], assador: ["portuguese"], assinar: ["portuguese"], assoalho: ["portuguese"], assunto: ["portuguese"], astral: ["portuguese"], atacado: ["portuguese"], atadura: ["portuguese"], atalho: ["portuguese"], atarefar: ["portuguese"], atear: ["portuguese"], atender: ["portuguese"], aterro: ["portuguese"], ateu: ["portuguese"], atingir: ["portuguese"], atirador: ["portuguese"], ativo: ["portuguese"], atoleiro: ["portuguese"], atracar: ["portuguese"], atrevido: ["portuguese"], atriz: ["portuguese"], atual: ["portuguese"], atum: ["portuguese"], auditor: ["portuguese"], aumentar: ["portuguese"], aura: ["portuguese"], aurora: ["portuguese"], autismo: ["portuguese"], autoria: ["portuguese"], autuar: ["portuguese"], avaliar: ["portuguese"], avante: ["portuguese"], avaria: ["portuguese"], avental: ["portuguese"], avesso: ["portuguese"], aviador: ["portuguese"], avisar: ["portuguese"], avulso: ["portuguese"], axila: ["portuguese"], azarar: ["portuguese"], azedo: ["portuguese"], azeite: ["portuguese"], azulejo: ["portuguese"], babar: ["portuguese"], babosa: ["portuguese"], bacalhau: ["portuguese"], bacharel: ["portuguese"], bacia: ["portuguese"], bagagem: ["portuguese"], baiano: ["portuguese"], bailar: ["portuguese"], baioneta: ["portuguese"], bairro: ["portuguese"], baixista: ["portuguese"], bajular: ["portuguese"], baleia: ["portuguese"], baliza: ["portuguese"], balsa: ["portuguese"], banal: ["portuguese"], bandeira: ["portuguese"], banho: ["portuguese"], banir: ["portuguese"], banquete: ["portuguese"], barato: ["portuguese"], barbado: ["portuguese"], baronesa: ["portuguese"], barraca: ["portuguese"], barulho: ["portuguese"], baseado: ["portuguese"], bastante: ["portuguese"], batata: ["portuguese"], batedor: ["portuguese"], batida: ["portuguese"], batom: ["portuguese"], batucar: ["portuguese"], baunilha: ["portuguese"], beber: ["portuguese"], beijo: ["portuguese"], beirada: ["portuguese"], beisebol: ["portuguese"], beldade: ["portuguese"], beleza: ["portuguese"], belga: ["portuguese"], beliscar: ["portuguese"], bendito: ["portuguese"], bengala: ["portuguese"], benzer: ["portuguese", "turkish"], berimbau: ["portuguese"], berlinda: ["portuguese"], berro: ["portuguese"], besouro: ["portuguese"], bexiga: ["portuguese"], bezerro: ["portuguese"], bico: ["portuguese"], bicudo: ["portuguese"], bienal: ["portuguese"], bifocal: ["portuguese"], bifurcar: ["portuguese"], bigorna: ["portuguese"], bilhete: ["portuguese"], bimestre: ["portuguese"], bimotor: ["portuguese"], biologia: ["portuguese"], biombo: ["portuguese"], biosfera: ["portuguese"], bipolar: ["portuguese"], birrento: ["portuguese"], biscoito: ["portuguese"], bisneto: ["portuguese"], bispo: ["portuguese"], bissexto: ["portuguese"], bitola: ["portuguese"], bizarro: ["portuguese"], blindado: ["portuguese"], bloco: ["portuguese"], bloquear: ["portuguese"], boato: ["portuguese"], bobagem: ["portuguese"], bocado: ["portuguese"], bocejo: ["portuguese"], bochecha: ["portuguese"], boicotar: ["portuguese"], bolada: ["portuguese"], boletim: ["portuguese"], bolha: ["portuguese"], bolo: ["portuguese"], bombeiro: ["portuguese"], bonde: ["portuguese"], boneco: ["portuguese"], bonita: ["portuguese"], borbulha: ["portuguese"], borda: ["portuguese"], boreal: ["portuguese"], borracha: ["portuguese"], bovino: ["portuguese"], boxeador: ["portuguese"], branco: ["portuguese"], brasa: ["portuguese"], braveza: ["portuguese"], breu: ["portuguese"], briga: ["portuguese"], brilho: ["portuguese"], brincar: ["portuguese"], broa: ["portuguese"], brochura: ["portuguese"], bronzear: ["portuguese"], broto: ["portuguese"], bruxo: ["portuguese"], bucha: ["portuguese"], budismo: ["portuguese"], bufar: ["portuguese"], bule: ["portuguese"], buraco: ["portuguese"], busca: ["portuguese"], busto: ["portuguese"], buzina: ["portuguese"], cabana: ["portuguese"], cabelo: ["portuguese"], cabide: ["portuguese"], cabo: ["portuguese"], cabrito: ["portuguese"], cacau: ["portuguese"], cacetada: ["portuguese"], cachorro: ["portuguese"], cacique: ["portuguese"], cadastro: ["portuguese"], cadeado: ["portuguese"], cafezal: ["portuguese"], caiaque: ["portuguese"], caipira: ["portuguese"], caixote: ["portuguese"], cajado: ["portuguese"], caju: ["portuguese"], calafrio: ["portuguese"], calcular: ["portuguese"], caldeira: ["portuguese"], calibrar: ["portuguese"], calmante: ["portuguese"], calota: ["portuguese"], camada: ["portuguese"], cambista: ["portuguese"], camisa: ["portuguese"], camomila: ["portuguese"], campanha: ["portuguese"], camuflar: ["portuguese"], canavial: ["portuguese"], cancelar: ["portuguese"], caneta: ["portuguese"], canguru: ["portuguese"], canhoto: ["portuguese"], canivete: ["portuguese"], canoa: ["portuguese"], cansado: ["portuguese"], cantar: ["portuguese"], canudo: ["portuguese"], capacho: ["portuguese"], capela: ["portuguese"], capinar: ["portuguese"], capotar: ["portuguese"], capricho: ["portuguese"], captador: ["portuguese"], capuz: ["portuguese"], caracol: ["portuguese"], carbono: ["portuguese"], cardeal: ["portuguese"], careca: ["portuguese"], carimbar: ["portuguese"], carneiro: ["portuguese"], carpete: ["portuguese"], carreira: ["portuguese"], cartaz: ["portuguese"], carvalho: ["portuguese"], casaco: ["portuguese"], casca: ["portuguese"], casebre: ["portuguese"], castelo: ["portuguese"], casulo: ["portuguese"], catarata: ["portuguese"], cativar: ["portuguese"], caule: ["portuguese"], causador: ["portuguese"], cautelar: ["portuguese"], cavalo: ["portuguese"], caverna: ["portuguese"], cebola: ["portuguese"], cedilha: ["portuguese"], cegonha: ["portuguese"], celebrar: ["portuguese"], celular: ["portuguese"], cenoura: ["portuguese"], censo: ["portuguese"], centeio: ["portuguese"], cercar: ["portuguese"], cerrado: ["portuguese"], certeiro: ["portuguese"], cerveja: ["portuguese"], cetim: ["portuguese"], cevada: ["portuguese"], chacota: ["portuguese"], chaleira: ["portuguese"], chamado: ["portuguese"], chapada: ["portuguese"], charme: ["portuguese"], chatice: ["portuguese"], chave: ["portuguese"], chefe: ["portuguese"], chegada: ["portuguese"], cheiro: ["portuguese"], cheque: ["portuguese"], chicote: ["portuguese"], chifre: ["portuguese"], chinelo: ["portuguese"], chocalho: ["portuguese"], chover: ["portuguese"], chumbo: ["portuguese"], chutar: ["portuguese"], chuva: ["portuguese"], cicatriz: ["portuguese"], ciclone: ["portuguese"], cidade: ["portuguese"], cidreira: ["portuguese"], ciente: ["portuguese"], cigana: ["portuguese"], cimento: ["portuguese"], cinto: ["portuguese"], cinza: ["portuguese"], ciranda: ["portuguese"], circuito: ["portuguese"], cirurgia: ["portuguese"], citar: ["portuguese"], clareza: ["portuguese"], clero: ["portuguese"], clicar: ["portuguese"], clone: ["portuguese"], clube: ["portuguese"], coado: ["portuguese"], coagir: ["portuguese"], cobaia: ["portuguese"], cobertor: ["portuguese"], cobrar: ["portuguese"], cocada: ["portuguese"], coelho: ["portuguese"], coentro: ["portuguese"], coeso: ["portuguese"], cogumelo: ["portuguese"], coibir: ["portuguese"], coifa: ["portuguese"], coiote: ["portuguese"], colar: ["portuguese"], coleira: ["portuguese"], colher: ["portuguese"], colidir: ["portuguese"], colmeia: ["portuguese"], colono: ["portuguese"], coluna: ["portuguese"], comando: ["portuguese"], combinar: ["portuguese"], comentar: ["portuguese"], comitiva: ["portuguese"], comover: ["portuguese"], complexo: ["portuguese"], comum: ["portuguese"], concha: ["portuguese"], condor: ["portuguese"], conectar: ["portuguese"], confuso: ["portuguese"], congelar: ["portuguese"], conhecer: ["portuguese"], conjugar: ["portuguese"], consumir: ["portuguese"], contrato: ["portuguese"], convite: ["portuguese"], cooperar: ["portuguese"], copeiro: ["portuguese"], copiador: ["portuguese"], copo: ["portuguese"], coquetel: ["portuguese"], coragem: ["portuguese"], cordial: ["portuguese"], corneta: ["portuguese"], coronha: ["portuguese"], corporal: ["portuguese"], correio: ["portuguese"], cortejo: ["portuguese"], coruja: ["portuguese"], corvo: ["portuguese"], cosseno: ["portuguese"], costela: ["portuguese"], cotonete: ["portuguese"], couro: ["portuguese"], couve: ["portuguese"], covil: ["portuguese"], cozinha: ["portuguese"], cratera: ["portuguese"], cravo: ["portuguese"], creche: ["portuguese"], credor: ["portuguese"], creme: ["portuguese"], crer: ["portuguese"], crespo: ["portuguese"], criada: ["portuguese"], criminal: ["portuguese"], crioulo: ["portuguese"], crise: ["portuguese"], criticar: ["portuguese"], crosta: ["portuguese"], crua: ["portuguese"], cruzeiro: ["portuguese"], cubano: ["portuguese"], cueca: ["portuguese"], cuidado: ["portuguese"], cujo: ["portuguese"], culatra: ["portuguese"], culminar: ["portuguese"], culpar: ["portuguese"], cultura: ["portuguese"], cumprir: ["portuguese"], cunhado: ["portuguese"], cupido: ["portuguese"], curativo: ["portuguese"], curral: ["portuguese"], cursar: ["portuguese"], curto: ["portuguese"], cuspir: ["portuguese"], custear: ["portuguese"], cutelo: ["portuguese"], damasco: ["portuguese"], datar: ["portuguese"], debater: ["portuguese"], debitar: ["portuguese"], deboche: ["portuguese"], debulhar: ["portuguese"], decalque: ["portuguese"], decimal: ["portuguese"], declive: ["portuguese"], decote: ["portuguese"], decretar: ["portuguese"], dedal: ["portuguese"], dedicado: ["portuguese"], deduzir: ["portuguese"], defesa: ["portuguese"], defumar: ["portuguese"], degelo: ["portuguese"], degrau: ["portuguese"], degustar: ["portuguese"], deitado: ["portuguese"], deixar: ["portuguese"], delator: ["portuguese"], delegado: ["portuguese"], delinear: ["portuguese"], delonga: ["portuguese"], demanda: ["portuguese"], demitir: ["portuguese"], demolido: ["portuguese"], dentista: ["portuguese"], depenado: ["portuguese"], depilar: ["portuguese"], depois: ["portuguese"], depressa: ["portuguese"], depurar: ["portuguese"], deriva: ["portuguese"], derramar: ["portuguese"], desafio: ["portuguese"], desbotar: ["portuguese"], descanso: ["portuguese"], desenho: ["portuguese"], desfiado: ["portuguese"], desgaste: ["portuguese"], desigual: ["portuguese"], deslize: ["portuguese"], desmamar: ["portuguese"], desova: ["portuguese"], despesa: ["portuguese"], destaque: ["portuguese"], desviar: ["portuguese"], detalhar: ["portuguese"], detentor: ["portuguese"], detonar: ["portuguese"], detrito: ["portuguese"], deusa: ["portuguese"], dever: ["portuguese"], devido: ["portuguese"], devotado: ["portuguese"], dezena: ["portuguese"], diagrama: ["portuguese"], dialeto: ["portuguese"], didata: ["portuguese"], difuso: ["portuguese"], digitar: ["portuguese"], dilatado: ["portuguese"], diluente: ["portuguese"], diminuir: ["portuguese"], dinastia: ["portuguese"], dinheiro: ["portuguese"], diocese: ["portuguese"], direto: ["portuguese"], discreta: ["portuguese"], disfarce: ["portuguese"], disparo: ["portuguese"], disquete: ["portuguese"], dissipar: ["portuguese"], distante: ["portuguese"], ditador: ["portuguese"], diurno: ["portuguese"], diverso: ["portuguese"], divisor: ["portuguese"], divulgar: ["portuguese"], dizer: ["portuguese"], dobrador: ["portuguese"], dolorido: ["portuguese"], domador: ["portuguese"], dominado: ["portuguese"], donativo: ["portuguese"], donzela: ["portuguese"], dormente: ["portuguese"], dorsal: ["portuguese"], dosagem: ["portuguese"], dourado: ["portuguese"], doutor: ["portuguese"], drenagem: ["portuguese"], drible: ["portuguese"], drogaria: ["portuguese"], duelar: ["portuguese"], duende: ["portuguese"], dueto: ["portuguese"], duplo: ["portuguese"], duquesa: ["portuguese"], durante: ["portuguese"], duvidoso: ["portuguese"], eclodir: ["portuguese"], ecoar: ["portuguese"], ecologia: ["portuguese"], edificar: ["portuguese"], edital: ["portuguese"], educado: ["portuguese"], efeito: ["portuguese"], efetivar: ["portuguese"], ejetar: ["portuguese"], elaborar: ["portuguese"], eleger: ["portuguese"], eleitor: ["portuguese"], elenco: ["portuguese"], elevador: ["portuguese"], eliminar: ["portuguese"], elogiar: ["portuguese"], embargo: ["portuguese"], embolado: ["portuguese"], embrulho: ["portuguese"], embutido: ["portuguese"], emenda: ["portuguese"], emergir: ["portuguese"], emissor: ["portuguese"], empatia: ["portuguese"], empenho: ["portuguese"], empinado: ["portuguese"], empolgar: ["portuguese"], emprego: ["portuguese"], empurrar: ["portuguese"], emulador: ["portuguese"], encaixe: ["portuguese"], encenado: ["portuguese"], enchente: ["portuguese"], encontro: ["portuguese"], endeusar: ["portuguese"], endossar: ["portuguese"], enfaixar: ["portuguese"], enfeite: ["portuguese"], enfim: ["portuguese"], engajado: ["portuguese"], engenho: ["portuguese"], englobar: ["portuguese"], engomado: ["portuguese"], engraxar: ["portuguese"], enguia: ["portuguese"], enjoar: ["portuguese"], enlatar: ["portuguese"], enquanto: ["portuguese"], enraizar: ["portuguese"], enrolado: ["portuguese"], enrugar: ["portuguese"], ensaio: ["portuguese"], enseada: ["portuguese"], ensino: ["portuguese"], ensopado: ["portuguese"], entanto: ["portuguese"], enteado: ["portuguese"], entidade: ["portuguese"], entortar: ["portuguese"], entrada: ["portuguese"], entulho: ["portuguese"], envergar: ["portuguese"], enviado: ["portuguese"], envolver: ["portuguese"], enxame: ["portuguese"], enxerto: ["portuguese"], enxofre: ["portuguese"], enxuto: ["portuguese"], epiderme: ["portuguese"], equipar: ["portuguese"], ereto: ["portuguese"], erguido: ["portuguese"], errata: ["portuguese"], erva: ["portuguese"], ervilha: ["portuguese"], esbanjar: ["portuguese"], esbelto: ["portuguese"], escama: ["portuguese"], escola: ["portuguese"], escrita: ["portuguese"], escuta: ["portuguese"], esfinge: ["portuguese"], esfolar: ["portuguese"], esfregar: ["portuguese"], esfumado: ["portuguese"], esgrima: ["portuguese"], esmalte: ["portuguese"], espanto: ["portuguese"], espelho: ["portuguese"], espiga: ["portuguese"], esponja: ["portuguese"], espreita: ["portuguese"], espumar: ["portuguese"], esquerda: ["portuguese"], estaca: ["portuguese"], esteira: ["portuguese"], esticar: ["portuguese"], estofado: ["portuguese"], estrela: ["portuguese"], estudo: ["portuguese"], esvaziar: ["portuguese"], etanol: ["portuguese"], etiqueta: ["portuguese"], euforia: ["portuguese"], europeu: ["portuguese"], evacuar: ["portuguese"], evaporar: ["portuguese"], evasivo: ["portuguese"], eventual: ["portuguese"], evidente: ["portuguese"], evoluir: ["portuguese"], exagero: ["portuguese"], exalar: ["portuguese"], examinar: ["portuguese"], exato: ["portuguese"], exausto: ["portuguese"], excesso: ["portuguese"], excitar: ["portuguese"], exclamar: ["portuguese"], executar: ["portuguese"], exemplo: ["portuguese"], exibir: ["portuguese"], exigente: ["portuguese"], exonerar: ["portuguese"], expandir: ["portuguese"], expelir: ["portuguese"], expirar: ["portuguese"], explanar: ["portuguese"], exposto: ["portuguese"], expresso: ["portuguese"], expulsar: ["portuguese"], externo: ["portuguese"], extinto: ["portuguese"], extrato: ["portuguese"], fabricar: ["portuguese"], fabuloso: ["portuguese"], faceta: ["portuguese"], facial: ["portuguese"], fada: ["portuguese"], fadiga: ["portuguese"], faixa: ["portuguese"], falar: ["portuguese"], falta: ["portuguese"], familiar: ["portuguese"], fandango: ["portuguese"], fanfarra: ["portuguese"], fantoche: ["portuguese"], fardado: ["portuguese"], farelo: ["portuguese"], farinha: ["portuguese"], farofa: ["portuguese"], farpa: ["portuguese"], fartura: ["portuguese"], fatia: ["portuguese"], fator: ["portuguese"], favorita: ["portuguese"], faxina: ["portuguese"], fazenda: ["portuguese"], fechado: ["portuguese"], feijoada: ["portuguese"], feirante: ["portuguese"], felino: ["portuguese"], feminino: ["portuguese"], fenda: ["portuguese"], feno: ["portuguese"], fera: ["portuguese"], feriado: ["portuguese"], ferrugem: ["portuguese"], ferver: ["portuguese"], festejar: ["portuguese"], fetal: ["portuguese"], feudal: ["portuguese"], fiapo: ["portuguese"], fibrose: ["portuguese"], ficar: ["portuguese"], ficheiro: ["portuguese"], figurado: ["portuguese"], fileira: ["portuguese"], filho: ["portuguese"], filme: ["portuguese"], filtrar: ["portuguese"], firmeza: ["portuguese"], fisgada: ["portuguese"], fissura: ["portuguese"], fita: ["portuguese"], fivela: ["portuguese"], fixador: ["portuguese"], fixo: ["portuguese"], flacidez: ["portuguese"], flamingo: ["portuguese"], flanela: ["portuguese"], flechada: ["portuguese"], flora: ["portuguese"], flutuar: ["portuguese"], fluxo: ["portuguese"], focal: ["portuguese"], focinho: ["portuguese"], fofocar: ["portuguese"], fogo: ["portuguese"], foguete: ["portuguese"], foice: ["portuguese"], folgado: ["portuguese"], folheto: ["portuguese"], forjar: ["portuguese"], formiga: ["portuguese"], forno: ["portuguese"], forte: ["portuguese"], fosco: ["portuguese"], fossa: ["portuguese"], fragata: ["portuguese"], fralda: ["portuguese"], frango: ["portuguese"], frasco: ["portuguese"], fraterno: ["portuguese"], freira: ["portuguese"], frente: ["portuguese"], fretar: ["portuguese"], frieza: ["portuguese"], friso: ["portuguese"], fritura: ["portuguese"], fronha: ["portuguese"], frustrar: ["portuguese"], fruteira: ["portuguese"], fugir: ["portuguese"], fulano: ["portuguese"], fuligem: ["portuguese"], fundar: ["portuguese"], fungo: ["portuguese"], funil: ["portuguese"], furador: ["portuguese"], furioso: ["portuguese"], futebol: ["portuguese"], gabarito: ["portuguese"], gabinete: ["portuguese"], gado: ["portuguese"], gaiato: ["portuguese"], gaiola: ["portuguese"], gaivota: ["portuguese"], galega: ["portuguese"], galho: ["portuguese"], galinha: ["portuguese"], galocha: ["portuguese"], ganhar: ["portuguese"], garagem: ["portuguese"], garfo: ["portuguese"], gargalo: ["portuguese"], garimpo: ["portuguese"], garoupa: ["portuguese"], garrafa: ["portuguese"], gasoduto: ["portuguese"], gasto: ["portuguese"], gata: ["portuguese"], gatilho: ["portuguese"], gaveta: ["portuguese"], gazela: ["portuguese"], gelado: ["portuguese"], geleia: ["portuguese"], gelo: ["portuguese"], gemada: ["portuguese"], gemer: ["portuguese"], gemido: ["portuguese"], generoso: ["portuguese"], gengiva: ["portuguese"], genial: ["portuguese"], genoma: ["portuguese"], genro: ["portuguese"], geologia: ["portuguese"], gerador: ["portuguese"], germinar: ["portuguese"], gesso: ["portuguese"], gestor: ["portuguese"], ginasta: ["portuguese"], gincana: ["portuguese"], gingado: ["portuguese"], girafa: ["portuguese"], girino: ["portuguese"], glacial: ["portuguese"], glicose: ["portuguese"], global: ["portuguese"], glorioso: ["portuguese"], goela: ["portuguese"], goiaba: ["portuguese"], golfe: ["portuguese"], golpear: ["portuguese"], gordura: ["portuguese"], gorjeta: ["portuguese"], gorro: ["portuguese"], gostoso: ["portuguese"], goteira: ["portuguese"], governar: ["portuguese"], gracejo: ["portuguese"], gradual: ["portuguese"], grafite: ["portuguese"], gralha: ["portuguese"], grampo: ["portuguese"], granada: ["portuguese"], gratuito: ["portuguese"], graveto: ["portuguese"], graxa: ["portuguese"], grego: ["portuguese"], grelhar: ["portuguese"], greve: ["portuguese"], grilo: ["portuguese"], grisalho: ["portuguese"], gritaria: ["portuguese"], grosso: ["portuguese"], grotesco: ["portuguese"], grudado: ["portuguese"], grunhido: ["portuguese"], gruta: ["portuguese"], guache: ["portuguese"], guarani: ["portuguese"], guaxinim: ["portuguese"], guerrear: ["portuguese"], guiar: ["portuguese"], guincho: ["portuguese"], guisado: ["portuguese"], gula: ["portuguese"], guloso: ["portuguese"], guru: ["portuguese"], habitar: ["portuguese"], harmonia: ["portuguese"], haste: ["portuguese"], haver: ["portuguese"], hectare: ["portuguese"], herdar: ["portuguese"], heresia: ["portuguese"], hesitar: ["portuguese"], hiato: ["portuguese"], hibernar: ["portuguese"], hidratar: ["portuguese"], hiena: ["portuguese"], hino: ["portuguese"], hipismo: ["portuguese"], hipnose: ["portuguese"], hipoteca: ["portuguese"], hoje: ["portuguese"], holofote: ["portuguese"], homem: ["portuguese"], honesto: ["portuguese"], honrado: ["portuguese"], hormonal: ["portuguese"], hospedar: ["portuguese"], humorado: ["portuguese"], iate: ["portuguese"], ideia: ["portuguese"], idoso: ["portuguese"], ignorado: ["portuguese"], igreja: ["portuguese"], iguana: ["portuguese"], ileso: ["portuguese"], ilha: ["portuguese"], iludido: ["portuguese"], iluminar: ["portuguese"], ilustrar: ["portuguese"], imagem: ["portuguese"], imediato: ["portuguese"], imenso: ["portuguese"], imersivo: ["portuguese"], iminente: ["portuguese"], imitador: ["portuguese"], imortal: ["portuguese"], impacto: ["portuguese"], impedir: ["portuguese"], implante: ["portuguese"], impor: ["portuguese"], imprensa: ["portuguese"], impune: ["portuguese"], imunizar: ["portuguese"], inalador: ["portuguese"], inapto: ["portuguese"], inativo: ["portuguese"], incenso: ["portuguese"], inchar: ["portuguese"], incidir: ["portuguese"], incluir: ["portuguese"], incolor: ["portuguese"], indeciso: ["portuguese"], indireto: ["portuguese"], indutor: ["portuguese"], ineficaz: ["portuguese"], inerente: ["portuguese"], infantil: ["portuguese"], infestar: ["portuguese"], infinito: ["portuguese"], inflamar: ["portuguese"], informal: ["portuguese"], infrator: ["portuguese"], ingerir: ["portuguese"], inibido: ["portuguese"], inicial: ["portuguese"], inimigo: ["portuguese"], injetar: ["portuguese"], inocente: ["portuguese"], inodoro: ["portuguese"], inovador: ["portuguese"], inox: ["portuguese"], inquieto: ["portuguese"], inscrito: ["portuguese"], inseto: ["portuguese"], insistir: ["portuguese"], inspetor: ["portuguese"], instalar: ["portuguese"], insulto: ["portuguese"], intacto: ["portuguese"], integral: ["portuguese"], intimar: ["portuguese"], intocado: ["portuguese"], intriga: ["portuguese"], invasor: ["portuguese"], inverno: ["portuguese"], invicto: ["portuguese"], invocar: ["portuguese"], iogurte: ["portuguese"], iraniano: ["portuguese"], ironizar: ["portuguese"], irreal: ["portuguese"], irritado: ["portuguese"], isca: ["portuguese"], isento: ["portuguese"], isolado: ["portuguese"], isqueiro: ["portuguese"], italiano: ["portuguese"], janeiro: ["portuguese"], jangada: ["portuguese"], janta: ["portuguese"], jararaca: ["portuguese"], jardim: ["portuguese"], jarro: ["portuguese"], jasmim: ["portuguese"], jato: ["portuguese"], javali: ["portuguese"], jazida: ["portuguese"], jejum: ["portuguese"], joaninha: ["portuguese"], joelhada: ["portuguese"], jogador: ["portuguese"], joia: ["portuguese"], jornal: ["portuguese"], jorrar: ["portuguese"], jovem: ["portuguese"], juba: ["portuguese"], judeu: ["portuguese"], judoca: ["portuguese"], juiz: ["portuguese"], julgador: ["portuguese"], julho: ["portuguese"], jurado: ["portuguese"], jurista: ["portuguese"], juro: ["portuguese"], justa: ["portuguese"], labareda: ["portuguese"], laboral: ["portuguese"], lacre: ["portuguese"], lactante: ["portuguese"], ladrilho: ["portuguese"], lagarta: ["portuguese"], lagoa: ["portuguese"], laje: ["portuguese"], lamber: ["portuguese"], lamentar: ["portuguese"], laminar: ["portuguese"], lampejo: ["portuguese"], lanche: ["portuguese"], lapidar: ["portuguese"], lapso: ["portuguese"], laranja: ["portuguese"], lareira: ["portuguese"], largura: ["portuguese"], lasanha: ["portuguese"], lastro: ["portuguese"], lateral: ["portuguese"], latido: ["portuguese"], lavanda: ["portuguese"], lavoura: ["portuguese"], lavrador: ["portuguese"], laxante: ["portuguese"], lazer: ["portuguese"], lealdade: ["portuguese"], lebre: ["portuguese"], legado: ["portuguese"], legendar: ["portuguese"], legista: ["portuguese"], leigo: ["portuguese"], leiloar: ["portuguese"], leitura: ["portuguese"], lembrete: ["portuguese"], leme: ["portuguese"], lenhador: ["portuguese"], lentilha: ["portuguese"], leoa: ["portuguese"], lesma: ["portuguese"], leste: ["portuguese"], letivo: ["portuguese"], letreiro: ["portuguese"], levar: ["portuguese"], leveza: ["portuguese"], levitar: ["portuguese"], liberal: ["portuguese"], libido: ["portuguese"], liderar: ["portuguese"], ligar: ["portuguese"], ligeiro: ["portuguese"], limitar: ["portuguese"], limoeiro: ["portuguese"], limpador: ["portuguese"], linda: ["portuguese"], linear: ["portuguese"], linhagem: ["portuguese"], liquidez: ["portuguese"], listagem: ["portuguese"], lisura: ["portuguese"], litoral: ["portuguese"], livro: ["portuguese"], lixa: ["portuguese"], lixeira: ["portuguese"], locador: ["portuguese"], locutor: ["portuguese"], lojista: ["portuguese"], lombo: ["portuguese"], lona: ["portuguese"], longe: ["portuguese"], lontra: ["portuguese"], lorde: ["portuguese"], lotado: ["portuguese"], loteria: ["portuguese"], loucura: ["portuguese"], lousa: ["portuguese"], louvar: ["portuguese"], luar: ["portuguese"], lucidez: ["portuguese"], lucro: ["portuguese"], luneta: ["portuguese"], lustre: ["portuguese"], lutador: ["portuguese"], luva: ["portuguese"], macaco: ["portuguese"], macete: ["portuguese"], machado: ["portuguese"], macio: ["portuguese"], madeira: ["portuguese"], madrinha: ["portuguese"], magnata: ["portuguese"], magreza: ["portuguese"], maior: ["portuguese"], mais: ["portuguese"], malandro: ["portuguese"], malha: ["portuguese"], malote: ["portuguese"], maluco: ["portuguese"], mamilo: ["portuguese"], mamoeiro: ["portuguese"], mamute: ["portuguese"], manada: ["portuguese"], mancha: ["portuguese"], mandato: ["portuguese"], manequim: ["portuguese"], manhoso: ["portuguese"], manivela: ["portuguese"], manobrar: ["portuguese"], mansa: ["portuguese"], manter: ["portuguese"], manusear: ["portuguese"], mapeado: ["portuguese"], maquinar: ["portuguese"], marcador: ["portuguese"], maresia: ["portuguese"], marfim: ["portuguese"], margem: ["portuguese"], marinho: ["portuguese"], marmita: ["portuguese"], maroto: ["portuguese"], marquise: ["portuguese"], marreco: ["portuguese"], martelo: ["portuguese"], marujo: ["portuguese"], mascote: ["portuguese"], masmorra: ["portuguese"], massagem: ["portuguese"], mastigar: ["portuguese"], matagal: ["portuguese"], materno: ["portuguese"], matinal: ["portuguese"], matutar: ["portuguese"], maxilar: ["portuguese"], medalha: ["portuguese"], medida: ["portuguese"], medusa: ["portuguese"], megafone: ["portuguese"], meiga: ["portuguese"], melancia: ["portuguese"], melhor: ["portuguese"], membro: ["portuguese"], memorial: ["portuguese"], menino: ["portuguese"], menos: ["portuguese"], mensagem: ["portuguese"], mental: ["portuguese"], merecer: ["portuguese"], mergulho: ["portuguese"], mesada: ["portuguese"], mesclar: ["portuguese"], mesmo: ["portuguese"], mesquita: ["portuguese"], mestre: ["portuguese"], metade: ["portuguese"], meteoro: ["portuguese"], metragem: ["portuguese"], mexer: ["portuguese"], mexicano: ["portuguese"], micro: ["portuguese"], migalha: ["portuguese"], migrar: ["portuguese"], milagre: ["portuguese"], milenar: ["portuguese"], milhar: ["portuguese"], mimado: ["portuguese"], minerar: ["portuguese"], minhoca: ["portuguese"], ministro: ["portuguese"], minoria: ["portuguese"], miolo: ["portuguese"], mirante: ["portuguese"], mirtilo: ["portuguese"], misturar: ["portuguese"], mocidade: ["portuguese"], moderno: ["portuguese"], modular: ["portuguese"], moeda: ["portuguese"], moer: ["portuguese"], moinho: ["portuguese"], moita: ["portuguese"], moldura: ["portuguese"], moleza: ["portuguese"], molho: ["portuguese"], molinete: ["portuguese"], molusco: ["portuguese"], montanha: ["portuguese"], moqueca: ["portuguese"], morango: ["portuguese"], morcego: ["portuguese"], mordomo: ["portuguese"], morena: ["portuguese"], mosaico: ["portuguese"], mosquete: ["portuguese"], mostarda: ["portuguese"], motel: ["portuguese"], motim: ["portuguese"], moto: ["portuguese"], motriz: ["portuguese"], muda: ["portuguese"], muito: ["portuguese"], mulata: ["portuguese"], mulher: ["portuguese"], multar: ["portuguese"], mundial: ["portuguese"], munido: ["portuguese"], muralha: ["portuguese"], murcho: ["portuguese"], muscular: ["portuguese"], museu: ["portuguese"], musical: ["portuguese"], nacional: ["portuguese"], nadador: ["portuguese"], naja: ["portuguese"], namoro: ["portuguese"], narina: ["portuguese"], narrado: ["portuguese"], nascer: ["portuguese"], nativa: ["portuguese"], natureza: ["portuguese"], navalha: ["portuguese"], navegar: ["portuguese"], navio: ["portuguese"], neblina: ["portuguese"], nebuloso: ["portuguese"], negativa: ["portuguese"], negociar: ["portuguese"], negrito: ["portuguese"], nervoso: ["portuguese"], neta: ["portuguese"], neural: ["portuguese"], nevasca: ["portuguese"], nevoeiro: ["portuguese"], ninar: ["portuguese"], ninho: ["portuguese"], nitidez: ["portuguese"], nivelar: ["portuguese"], nobreza: ["portuguese"], noite: ["portuguese"], noiva: ["portuguese"], nomear: ["portuguese"], nominal: ["portuguese"], nordeste: ["portuguese"], nortear: ["portuguese"], notar: ["portuguese"], noticiar: ["portuguese"], noturno: ["portuguese"], novelo: ["portuguese"], novilho: ["portuguese"], novo: ["portuguese"], nublado: ["portuguese"], nudez: ["portuguese"], numeral: ["portuguese"], nupcial: ["portuguese"], nutrir: ["portuguese"], nuvem: ["portuguese"], obcecado: ["portuguese"], obedecer: ["portuguese"], objetivo: ["portuguese"], obrigado: ["portuguese"], obscuro: ["portuguese"], obstetra: ["portuguese"], obter: ["portuguese"], obturar: ["portuguese"], ocidente: ["portuguese"], ocioso: ["portuguese"], ocorrer: ["portuguese"], oculista: ["portuguese"], ocupado: ["portuguese"], ofegante: ["portuguese"], ofensiva: ["portuguese"], oferenda: ["portuguese"], oficina: ["portuguese"], ofuscado: ["portuguese"], ogiva: ["portuguese"], olaria: ["portuguese"], oleoso: ["portuguese"], olhar: ["portuguese"], oliveira: ["portuguese"], ombro: ["portuguese"], omelete: ["portuguese"], omisso: ["portuguese"], omitir: ["portuguese"], ondulado: ["portuguese"], oneroso: ["portuguese"], ontem: ["portuguese"], opcional: ["portuguese"], operador: ["portuguese"], oponente: ["portuguese"], oportuno: ["portuguese"], oposto: ["portuguese"], orar: ["portuguese"], orbitar: ["portuguese"], ordem: ["portuguese"], ordinal: ["portuguese"], orfanato: ["portuguese"], orgasmo: ["portuguese"], orgulho: ["portuguese"], oriental: ["portuguese"], origem: ["portuguese"], oriundo: ["portuguese"], orla: ["portuguese"], ortodoxo: ["portuguese"], orvalho: ["portuguese"], oscilar: ["portuguese"], ossada: ["portuguese"], osso: ["portuguese"], ostentar: ["portuguese"], otimismo: ["portuguese"], ousadia: ["portuguese"], outono: ["portuguese"], outubro: ["portuguese"], ouvido: ["portuguese"], ovelha: ["portuguese"], ovular: ["portuguese"], oxidar: ["portuguese"], oxigenar: ["portuguese"], pacato: ["portuguese"], paciente: ["portuguese"], pacote: ["portuguese"], pactuar: ["portuguese"], padaria: ["portuguese"], padrinho: ["portuguese"], pagar: ["portuguese"], pagode: ["portuguese"], painel: ["portuguese"], pairar: ["portuguese"], paisagem: ["portuguese"], palavra: ["portuguese"], palestra: ["portuguese"], palheta: ["portuguese"], palito: ["portuguese"], palmada: ["portuguese"], palpitar: ["portuguese"], pancada: ["portuguese"], panela: ["portuguese"], panfleto: ["portuguese"], panqueca: ["portuguese"], pantanal: ["portuguese"], papagaio: ["portuguese"], papelada: ["portuguese"], papiro: ["portuguese"], parafina: ["portuguese"], parcial: ["portuguese"], pardal: ["portuguese"], parede: ["portuguese"], partida: ["portuguese"], pasmo: ["portuguese"], passado: ["portuguese"], pastel: ["portuguese"], patamar: ["portuguese"], patente: ["portuguese"], patinar: ["portuguese"], patrono: ["portuguese"], paulada: ["portuguese"], pausar: ["portuguese"], peculiar: ["portuguese"], pedalar: ["portuguese"], pedestre: ["portuguese"], pediatra: ["portuguese"], pedra: ["portuguese"], pegada: ["portuguese"], peitoral: ["portuguese"], peixe: ["portuguese"], pele: ["portuguese"], pelicano: ["portuguese"], penca: ["portuguese"], pendurar: ["portuguese"], peneira: ["portuguese"], penhasco: ["portuguese"], pensador: ["portuguese"], pente: ["portuguese"], perceber: ["portuguese"], perfeito: ["portuguese"], pergunta: ["portuguese"], perito: ["portuguese"], permitir: ["portuguese"], perna: ["portuguese"], perplexo: ["portuguese"], persiana: ["portuguese"], pertence: ["portuguese"], peruca: ["portuguese"], pescado: ["portuguese"], pesquisa: ["portuguese"], pessoa: ["portuguese"], petiscar: ["portuguese"], piada: ["portuguese"], picado: ["portuguese"], piedade: ["portuguese"], pigmento: ["portuguese"], pilastra: ["portuguese"], pilhado: ["portuguese"], pilotar: ["portuguese"], pimenta: ["portuguese"], pincel: ["portuguese"], pinguim: ["portuguese"], pinha: ["portuguese"], pinote: ["portuguese"], pintar: ["portuguese"], pioneiro: ["portuguese"], pipoca: ["portuguese"], piquete: ["portuguese"], piranha: ["portuguese"], pires: ["portuguese"], pirueta: ["portuguese"], piscar: ["portuguese"], pistola: ["portuguese"], pitanga: ["portuguese"], pivete: ["portuguese"], planta: ["portuguese"], plaqueta: ["portuguese"], platina: ["portuguese"], plebeu: ["portuguese"], plumagem: ["portuguese"], pluvial: ["portuguese"], pneu: ["portuguese"], poda: ["portuguese"], poeira: ["portuguese"], poetisa: ["portuguese"], polegada: ["portuguese"], policiar: ["portuguese"], poluente: ["portuguese"], polvilho: ["portuguese"], pomar: ["portuguese"], pomba: ["portuguese"], ponderar: ["portuguese"], pontaria: ["portuguese"], populoso: ["portuguese"], porta: ["portuguese"], possuir: ["portuguese"], postal: ["portuguese"], pote: ["portuguese"], poupar: ["portuguese"], pouso: ["portuguese"], povoar: ["portuguese"], praia: ["portuguese"], prancha: ["portuguese"], prato: ["portuguese"], praxe: ["portuguese"], prece: ["portuguese"], predador: ["portuguese"], prefeito: ["portuguese"], premiar: ["portuguese"], prensar: ["portuguese"], preparar: ["portuguese"], presilha: ["portuguese"], pretexto: ["portuguese"], prevenir: ["portuguese"], prezar: ["portuguese"], primata: ["portuguese"], princesa: ["portuguese"], prisma: ["portuguese"], privado: ["portuguese"], processo: ["portuguese"], produto: ["portuguese"], profeta: ["portuguese"], proibido: ["portuguese"], projeto: ["portuguese"], prometer: ["portuguese"], propagar: ["portuguese"], prosa: ["portuguese"], protetor: ["portuguese"], provador: ["portuguese"], publicar: ["portuguese"], pudim: ["portuguese"], pular: ["portuguese"], pulmonar: ["portuguese"], pulseira: ["portuguese"], punhal: ["portuguese"], punir: ["portuguese"], pupilo: ["portuguese"], pureza: ["portuguese"], puxador: ["portuguese"], quadra: ["portuguese"], quantia: ["portuguese"], quarto: ["portuguese"], quase: ["portuguese"], quebrar: ["portuguese"], queda: ["portuguese"], queijo: ["portuguese"], quente: ["portuguese"], querido: ["portuguese"], quimono: ["portuguese"], quina: ["portuguese"], quiosque: ["portuguese"], rabanada: ["portuguese"], rabisco: ["portuguese"], rachar: ["portuguese"], racionar: ["portuguese"], radial: ["portuguese"], raiar: ["portuguese"], rainha: ["portuguese"], raio: ["portuguese"], raiva: ["portuguese"], rajada: ["portuguese"], ralado: ["portuguese"], ramal: ["portuguese"], ranger: ["portuguese"], ranhura: ["portuguese"], rapadura: ["portuguese"], rapel: ["portuguese"], rapidez: ["portuguese"], raposa: ["portuguese"], raquete: ["portuguese"], raridade: ["portuguese"], rasante: ["portuguese"], rascunho: ["portuguese"], rasgar: ["portuguese"], raspador: ["portuguese"], rasteira: ["portuguese"], rasurar: ["portuguese"], ratazana: ["portuguese"], ratoeira: ["portuguese"], realeza: ["portuguese"], reanimar: ["portuguese"], reaver: ["portuguese"], rebaixar: ["portuguese"], rebelde: ["portuguese"], rebolar: ["portuguese"], recado: ["portuguese"], recente: ["portuguese"], recheio: ["portuguese"], recibo: ["portuguese"], recordar: ["portuguese"], recrutar: ["portuguese"], recuar: ["portuguese"], rede: ["portuguese"], redimir: ["portuguese"], redonda: ["portuguese"], reduzida: ["portuguese"], reenvio: ["portuguese"], refinar: ["portuguese"], refletir: ["portuguese"], refogar: ["portuguese"], refresco: ["portuguese"], refugiar: ["portuguese"], regalia: ["portuguese"], regime: ["portuguese"], regra: ["portuguese"], reinado: ["portuguese"], reitor: ["portuguese"], rejeitar: ["portuguese"], relativo: ["portuguese"], remador: ["portuguese"], remendo: ["portuguese"], remorso: ["portuguese"], renovado: ["portuguese"], reparo: ["portuguese"], repelir: ["portuguese"], repleto: ["portuguese"], repolho: ["portuguese"], represa: ["portuguese"], repudiar: ["portuguese"], requerer: ["portuguese"], resenha: ["portuguese"], resfriar: ["portuguese"], resgatar: ["portuguese"], residir: ["portuguese"], resolver: ["portuguese"], respeito: ["portuguese"], ressaca: ["portuguese"], restante: ["portuguese"], resumir: ["portuguese"], retalho: ["portuguese"], reter: ["portuguese"], retirar: ["portuguese"], retomada: ["portuguese"], retratar: ["portuguese"], revelar: ["portuguese"], revisor: ["portuguese"], revolta: ["portuguese"], riacho: ["portuguese"], rica: ["portuguese"], rigidez: ["portuguese"], rigoroso: ["portuguese"], rimar: ["portuguese"], ringue: ["portuguese"], risada: ["portuguese"], risco: ["portuguese"], risonho: ["portuguese"], robalo: ["portuguese"], rochedo: ["portuguese"], rodada: ["portuguese"], rodeio: ["portuguese"], rodovia: ["portuguese"], roedor: ["portuguese"], roleta: ["portuguese"], romano: ["portuguese"], roncar: ["portuguese"], rosado: ["portuguese"], roseira: ["portuguese"], rosto: ["portuguese"], rota: ["portuguese", "turkish"], roteiro: ["portuguese"], rotina: ["portuguese"], rotular: ["portuguese"], rouco: ["portuguese"], roupa: ["portuguese"], roxo: ["portuguese"], rubro: ["portuguese"], rugido: ["portuguese"], rugoso: ["portuguese"], ruivo: ["portuguese"], rumo: ["portuguese"], rupestre: ["portuguese"], russo: ["portuguese"], sabor: ["portuguese"], saciar: ["portuguese"], sacola: ["portuguese"], sacudir: ["portuguese"], sadio: ["portuguese"], safira: ["portuguese"], saga: ["portuguese"], sagrada: ["portuguese"], saibro: ["portuguese"], salada: ["portuguese"], saleiro: ["portuguese"], salgado: ["portuguese"], saliva: ["portuguese"], salpicar: ["portuguese"], salsicha: ["portuguese"], saltar: ["portuguese"], salvador: ["portuguese"], sambar: ["portuguese"], samurai: ["portuguese"], sanar: ["portuguese"], sanfona: ["portuguese"], sangue: ["portuguese"], sanidade: ["portuguese"], sapato: ["portuguese"], sarda: ["portuguese"], sargento: ["portuguese"], sarjeta: ["portuguese"], saturar: ["portuguese"], saudade: ["portuguese"], saxofone: ["portuguese"], sazonal: ["portuguese"], secar: ["portuguese"], secular: ["portuguese"], seda: ["portuguese", "turkish"], sedento: ["portuguese"], sediado: ["portuguese"], sedoso: ["portuguese"], sedutor: ["portuguese"], segmento: ["portuguese"], segredo: ["portuguese"], segundo: ["portuguese"], seiva: ["portuguese"], seleto: ["portuguese"], selvagem: ["portuguese"], semanal: ["portuguese"], semente: ["portuguese"], senador: ["portuguese"], senhor: ["portuguese"], sensual: ["portuguese"], sentado: ["portuguese"], separado: ["portuguese"], sereia: ["portuguese"], seringa: ["portuguese"], serra: ["portuguese"], servo: ["portuguese"], setembro: ["portuguese"], setor: ["portuguese"], sigilo: ["portuguese"], silhueta: ["portuguese"], silicone: ["portuguese"], simetria: ["portuguese"], simpatia: ["portuguese"], simular: ["portuguese"], sinal: ["portuguese"], sincero: ["portuguese"], singular: ["portuguese"], sinopse: ["portuguese"], sintonia: ["portuguese"], sirene: ["portuguese"], siri: ["portuguese"], situado: ["portuguese"], soberano: ["portuguese"], sobra: ["portuguese"], socorro: ["portuguese"], sogro: ["portuguese"], soja: ["portuguese"], solda: ["portuguese"], soletrar: ["portuguese"], solteiro: ["portuguese"], sombrio: ["portuguese"], sonata: ["portuguese"], sondar: ["portuguese"], sonegar: ["portuguese"], sonhador: ["portuguese"], sono: ["portuguese"], soprano: ["portuguese"], soquete: ["portuguese"], sorrir: ["portuguese"], sorteio: ["portuguese"], sossego: ["portuguese"], sotaque: ["portuguese"], soterrar: ["portuguese"], sovado: ["portuguese"], sozinho: ["portuguese"], suavizar: ["portuguese"], subida: ["portuguese"], submerso: ["portuguese"], subsolo: ["portuguese"], subtrair: ["portuguese"], sucata: ["portuguese"], sucesso: ["portuguese"], suco: ["portuguese"], sudeste: ["portuguese"], sufixo: ["portuguese"], sugador: ["portuguese"], sugerir: ["portuguese"], sujeito: ["portuguese"], sulfato: ["portuguese"], sumir: ["portuguese"], suor: ["portuguese"], superior: ["portuguese"], suplicar: ["portuguese"], suposto: ["portuguese"], suprimir: ["portuguese"], surdina: ["portuguese"], surfista: ["portuguese"], surpresa: ["portuguese"], surreal: ["portuguese"], surtir: ["portuguese"], suspiro: ["portuguese"], sustento: ["portuguese"], tabela: ["portuguese", "turkish"], tablete: ["portuguese"], tabuada: ["portuguese"], tacho: ["portuguese"], tagarela: ["portuguese"], talher: ["portuguese"], talo: ["portuguese"], talvez: ["portuguese"], tamanho: ["portuguese"], tamborim: ["portuguese"], tampa: ["portuguese"], tangente: ["portuguese"], tanto: ["portuguese"], tapar: ["portuguese"], tapioca: ["portuguese"], tardio: ["portuguese"], tarefa: ["portuguese"], tarja: ["portuguese"], tarraxa: ["portuguese"], tatuagem: ["portuguese"], taurino: ["portuguese"], taxativo: ["portuguese"], taxista: ["portuguese"], teatral: ["portuguese"], tecer: ["portuguese"], tecido: ["portuguese"], teclado: ["portuguese"], tedioso: ["portuguese"], teia: ["portuguese"], teimar: ["portuguese"], telefone: ["portuguese"], telhado: ["portuguese"], tempero: ["portuguese"], tenente: ["portuguese"], tensor: ["portuguese"], tentar: ["portuguese"], termal: ["portuguese"], terno: ["portuguese"], terreno: ["portuguese"], tese: ["portuguese"], tesoura: ["portuguese"], testado: ["portuguese"], teto: ["portuguese"], textura: ["portuguese"], texugo: ["portuguese"], tiara: ["portuguese"], tigela: ["portuguese"], tijolo: ["portuguese"], timbrar: ["portuguese"], timidez: ["portuguese"], tingido: ["portuguese"], tinteiro: ["portuguese"], tiragem: ["portuguese"], titular: ["portuguese"], toalha: ["portuguese"], tocha: ["portuguese"], tolerar: ["portuguese"], tolice: ["portuguese"], tomada: ["portuguese"], tomilho: ["portuguese"], tonel: ["portuguese"], tontura: ["portuguese"], topete: ["portuguese"], tora: ["portuguese"], torcido: ["portuguese"], torneio: ["portuguese"], torque: ["portuguese"], torrada: ["portuguese"], torto: ["portuguese"], tostar: ["portuguese"], touca: ["portuguese"], toupeira: ["portuguese"], toxina: ["portuguese"], trabalho: ["portuguese"], tracejar: ["portuguese"], tradutor: ["portuguese"], trafegar: ["portuguese"], trajeto: ["portuguese"], trama: ["portuguese"], trancar: ["portuguese"], trapo: ["portuguese"], traseiro: ["portuguese"], tratador: ["portuguese"], travar: ["portuguese"], treino: ["portuguese"], tremer: ["portuguese"], trepidar: ["portuguese"], trevo: ["portuguese"], triagem: ["portuguese"], tribo: ["portuguese"], triciclo: ["portuguese"], tridente: ["portuguese"], trilogia: ["portuguese"], trindade: ["portuguese"], triplo: ["portuguese"], triturar: ["portuguese"], triunfal: ["portuguese"], trocar: ["portuguese"], trombeta: ["portuguese"], trova: ["portuguese"], trunfo: ["portuguese"], truque: ["portuguese"], tubular: ["portuguese"], tucano: ["portuguese"], tudo: ["portuguese"], tulipa: ["portuguese"], tupi: ["portuguese"], turbo: ["portuguese"], turma: ["portuguese"], turquesa: ["portuguese"], tutelar: ["portuguese"], tutorial: ["portuguese"], uivar: ["portuguese"], umbigo: ["portuguese"], unha: ["portuguese"], unidade: ["portuguese"], uniforme: ["portuguese"], urologia: ["portuguese"], urso: ["portuguese"], urtiga: ["portuguese"], urubu: ["portuguese"], usado: ["portuguese"], usina: ["portuguese"], usufruir: ["portuguese"], vacina: ["portuguese"], vadiar: ["portuguese"], vagaroso: ["portuguese"], vaidoso: ["portuguese"], vala: ["portuguese"], valente: ["portuguese"], validade: ["portuguese"], valores: ["portuguese"], vantagem: ["portuguese"], vaqueiro: ["portuguese"], varanda: ["portuguese"], vareta: ["portuguese"], varrer: ["portuguese"], vascular: ["portuguese"], vasilha: ["portuguese"], vassoura: ["portuguese"], vazar: ["portuguese"], vazio: ["portuguese"], veado: ["portuguese"], vedar: ["portuguese"], vegetar: ["portuguese"], veicular: ["portuguese"], veleiro: ["portuguese"], velhice: ["portuguese"], veludo: ["portuguese"], vencedor: ["portuguese"], vendaval: ["portuguese"], venerar: ["portuguese"], ventre: ["portuguese"], verbal: ["portuguese"], verdade: ["portuguese"], vereador: ["portuguese"], vergonha: ["portuguese"], vermelho: ["portuguese"], verniz: ["portuguese"], versar: ["portuguese"], vertente: ["portuguese"], vespa: ["portuguese"], vestido: ["portuguese"], vetorial: ["portuguese"], viaduto: ["portuguese"], viagem: ["portuguese"], viajar: ["portuguese"], viatura: ["portuguese"], vibrador: ["portuguese"], videira: ["portuguese"], vidraria: ["portuguese"], viela: ["portuguese"], viga: ["portuguese"], vigente: ["portuguese"], vigiar: ["portuguese"], vigorar: ["portuguese"], vilarejo: ["portuguese"], vinco: ["portuguese"], vinheta: ["portuguese"], vinil: ["portuguese"], violeta: ["portuguese"], virada: ["portuguese"], virtude: ["portuguese"], visitar: ["portuguese"], visto: ["portuguese"], vitral: ["portuguese"], viveiro: ["portuguese"], vizinho: ["portuguese"], voador: ["portuguese"], voar: ["portuguese"], vogal: ["portuguese"], volante: ["portuguese"], voleibol: ["portuguese"], voltagem: ["portuguese"], volumoso: ["portuguese"], vontade: ["portuguese"], vulto: ["portuguese"], vuvuzela: ["portuguese"], xadrez: ["portuguese"], xarope: ["portuguese"], xeque: ["portuguese"], xeretar: ["portuguese"], xerife: ["portuguese"], xingar: ["portuguese"], zangado: ["portuguese"], zarpar: ["portuguese"], zebu: ["portuguese"], zelador: ["portuguese"], zombar: ["portuguese"], zoologia: ["portuguese"], zumbido: ["portuguese"], \u0430\u0431\u0437\u0430\u0446: ["russian"], \u0430\u0431\u043E\u043D\u0435\u043D\u0442: ["russian"], \u0430\u0431\u0441\u0443\u0440\u0434: ["russian"], \u0430\u0432\u0430\u043D\u0433\u0430\u0440\u0434: ["russian"], \u0430\u0432\u0430\u0440\u0438\u044F: ["russian"], \u0430\u0432\u0433\u0443\u0441\u0442: ["russian"], \u0430\u0432\u0438\u0430\u0446\u0438\u044F: ["russian"], \u0430\u0432\u0442\u043E\u0440: ["russian"], \u0430\u0433\u0435\u043D\u0442: ["russian"], \u0430\u0433\u0438\u0442\u0430\u0446\u0438\u044F: ["russian"], \u0430\u0433\u0440\u0435\u0433\u0430\u0442: ["russian"], \u0430\u0434\u0432\u043E\u043A\u0430\u0442: ["russian"], \u0430\u0434\u043C\u0438\u0440\u0430\u043B: ["russian"], \u0430\u0434\u0440\u0435\u0441: ["russian"], \u0430\u0437\u0430\u0440\u0442: ["russian"], \u0430\u0437\u043E\u0442: ["russian"], \u0430\u043A\u0430\u0434\u0435\u043C\u0438\u044F: ["russian"], \u0430\u043A\u0432\u0430\u0440\u0438\u0443\u043C: ["russian"], \u0430\u043A\u0441\u0438\u043E\u043C\u0430: ["russian"], \u0430\u043A\u0443\u043B\u0430: ["russian"], \u0430\u043A\u0446\u0435\u043D\u0442: ["russian"], \u0430\u043A\u0446\u0438\u044F: ["russian"], \u0430\u043B\u043B\u0435\u044F: ["russian"], \u0430\u043B\u043C\u0430\u0437: ["russian"], \u0430\u043B\u0442\u0430\u0440\u044C: ["russian"], \u0430\u043B\u044C\u0431\u043E\u043C: ["russian"], \u0430\u043B\u044C\u044F\u043D\u0441: ["russian"], \u0430\u043C\u0431\u0438\u0446\u0438\u044F: ["russian"], \u0430\u043D\u0430\u043B\u0438\u0437: ["russian"], \u0430\u043D\u0435\u043A\u0434\u043E\u0442: ["russian"], \u0430\u043D\u043A\u0435\u0442\u0430: ["russian"], \u0430\u043D\u0441\u0430\u043C\u0431\u043B\u044C: ["russian"], \u0430\u043D\u0442\u0435\u043D\u043D\u0430: ["russian"], \u0430\u043F\u0435\u043B\u044C\u0441\u0438\u043D: ["russian"], \u0430\u043F\u043F\u0430\u0440\u0430\u0442: ["russian"], \u0430\u043F\u043F\u0435\u0442\u0438\u0442: ["russian"], \u0430\u043F\u0440\u0435\u043B\u044C: ["russian"], \u0430\u043F\u0442\u0435\u043A\u0430: ["russian"], \u0430\u0440\u0431\u0443\u0437: ["russian"], \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442: ["russian"], \u0430\u0440\u0435\u043D\u0434\u0430: ["russian"], \u0430\u0440\u0435\u0441\u0442: ["russian"], \u0430\u0440\u043C\u0438\u044F: ["russian"], \u0430\u0440\u043E\u043C\u0430\u0442: ["russian"], \u0430\u0440\u0441\u0435\u043D\u0430\u043B: ["russian"], \u0430\u0440\u0442\u0435\u0440\u0438\u044F: ["russian"], \u0430\u0440\u0442\u0438\u0441\u0442: ["russian"], \u0430\u0440\u0445\u0438\u0432: ["russian"], \u0430\u0441\u043F\u0438\u0440\u0430\u043D\u0442: ["russian"], \u0430\u0441\u0444\u0430\u043B\u044C\u0442: ["russian"], \u0430\u0442\u0430\u043A\u0430: ["russian"], \u0430\u0442\u043E\u043C\u043D\u044B\u0439: ["russian"], \u0430\u0442\u0440\u0438\u0431\u0443\u0442: ["russian"], \u0430\u0443\u043A\u0446\u0438\u043E\u043D: ["russian"], \u0430\u0444\u0438\u0448\u0430: ["russian"], \u0430\u044D\u0440\u043E\u043F\u043E\u0440\u0442: ["russian"], \u0431\u0430\u0431\u043E\u0447\u043A\u0430: ["russian"], \u0431\u0430\u0431\u0443\u0448\u043A\u0430: ["russian"], \u0431\u0430\u0433\u0430\u0436: ["russian"], \u0431\u0430\u0437\u0430: ["russian"], \u0431\u0430\u043A\u0442\u0435\u0440\u0438\u044F: ["russian"], \u0431\u0430\u043B\u0430\u043D\u0441: ["russian"], \u0431\u0430\u043B\u0435\u0440\u0438\u043D\u0430: ["russian"], \u0431\u0430\u043B\u043A\u043E\u043D: ["russian"], \u0431\u0430\u043D\u0434\u0438\u0442: ["russian"], \u0431\u0430\u043D\u043A: ["russian"], \u0431\u0430\u0440\u0430\u0431\u0430\u043D: ["russian"], \u0431\u0430\u0440\u043E\u043D: ["russian"], \u0431\u0430\u0440\u044B\u0448\u043D\u044F: ["russian"], \u0431\u0430\u0440\u044C\u0435\u0440: ["russian"], \u0431\u0430\u0441\u0441\u0435\u0439\u043D: ["russian"], \u0431\u0430\u0442\u0430\u0440\u0435\u044F: ["russian"], \u0431\u0430\u0448\u043C\u0430\u043A: ["russian"], \u0431\u0430\u0448\u043D\u044F: ["russian"], \u0431\u0435\u0434\u043D\u044B\u0439: ["russian"], \u0431\u0435\u0436\u0435\u043D\u0435\u0446: ["russian"], \u0431\u0435\u0437\u0434\u043D\u0430: ["russian"], \u0431\u0435\u043B\u043A\u0430: ["russian"], \u0431\u0435\u043B\u044B\u0439: ["russian"], \u0431\u0435\u043D\u0437\u0438\u043D: ["russian"], \u0431\u0435\u0440\u0435\u0433: ["russian"], \u0431\u0435\u0441\u0435\u0434\u0430: ["russian"], \u0431\u0435\u0448\u0435\u043D\u044B\u0439: ["russian"], \u0431\u0438\u043B\u0435\u0442: ["russian"], \u0431\u0438\u043D\u043E\u043A\u043B\u044C: ["russian"], \u0431\u0438\u0440\u0436\u0430: ["russian"], \u0431\u0438\u0442\u0432\u0430: ["russian"], \u0431\u043B\u0430\u0433\u043E: ["russian"], \u0431\u043B\u0435\u0441\u043A: ["russian"], \u0431\u043B\u0438\u0437\u043A\u0438\u0439: ["russian"], \u0431\u043B\u0438\u043D: ["russian"], \u0431\u043B\u043E\u043A: ["russian"], \u0431\u043B\u044E\u0434\u043E: ["russian"], \u0431\u043E\u0433\u0430\u0442\u044B\u0439: ["russian"], \u0431\u043E\u0434\u0440\u044B\u0439: ["russian"], \u0431\u043E\u0435\u0446: ["russian"], \u0431\u043E\u043A\u0430\u043B: ["russian"], \u0431\u043E\u043A\u043E\u0432\u043E\u0439: ["russian"], \u0431\u043E\u043A\u0441: ["russian"], \u0431\u043E\u043B\u0435\u0435: ["russian"], \u0431\u043E\u043B\u043E\u0442\u043E: ["russian"], \u0431\u043E\u043B\u0442\u0430\u0442\u044C: ["russian"], \u0431\u043E\u043B\u044C\u0448\u043E\u0439: ["russian"], \u0431\u043E\u043C\u0431\u0430: ["russian"], \u0431\u043E\u0440\u0442: ["russian"], \u0431\u043E\u0440\u044C\u0431\u0430: ["russian"], \u0431\u043E\u0441\u043E\u0439: ["russian"], \u0431\u043E\u0442\u0438\u043D\u043E\u043A: ["russian"], \u0431\u043E\u044F\u0442\u044C\u0441\u044F: ["russian"], \u0431\u0440\u0430\u043A: ["russian"], \u0431\u0440\u0430\u0442\u044C: ["russian"], \u0431\u0440\u0435\u0432\u043D\u043E: ["russian"], \u0431\u0440\u0435\u0434: ["russian"], \u0431\u0440\u0438\u0433\u0430\u0434\u0430: ["russian"], \u0431\u0440\u043E\u0434\u044F\u0433\u0430: ["russian"], \u0431\u0440\u043E\u043D\u044F: ["russian"], \u0431\u0440\u043E\u0441\u0438\u0442\u044C: ["russian"], \u0431\u0440\u044B\u0437\u0433\u0438: ["russian"], \u0431\u0440\u044E\u043A\u0438: ["russian"], \u0431\u0440\u044E\u0445\u043E: ["russian"], \u0431\u0443\u0433\u043E\u0440: ["russian"], \u0431\u0443\u0434\u043A\u0430: ["russian"], \u0431\u0443\u0434\u043D\u0438: ["russian"], \u0431\u0443\u0434\u0443\u0449\u0435\u0435: ["russian"], \u0431\u0443\u043A\u0432\u0430: ["russian"], \u0431\u0443\u043A\u0435\u0442: ["russian"], \u0431\u0443\u043B\u044C\u0432\u0430\u0440: ["russian"], \u0431\u0443\u043C\u0430\u0433\u0430: ["russian"], \u0431\u0443\u043D\u0442: ["russian"], \u0431\u0443\u0440\u043D\u044B\u0439: ["russian"], \u0431\u0443\u0440\u044F: ["russian"], \u0431\u0443\u0442\u044B\u043B\u043A\u0430: ["russian"], \u0431\u0443\u0445\u0442\u0430: ["russian"], \u0431\u044B\u0432\u0448\u0438\u0439: ["russian"], \u0431\u044B\u0441\u0442\u0440\u043E: ["russian"], \u0431\u044B\u0442\u043E\u0432\u043E\u0439: ["russian"], \u0431\u044B\u0442\u044C: ["russian"], \u0431\u044E\u0434\u0436\u0435\u0442: ["russian"], \u0431\u044E\u0440\u043E: ["russian"], \u0431\u044E\u0441\u0442: ["russian"], \u0432\u0430\u0433\u043E\u043D: ["russian"], \u0432\u0430\u0436\u043D\u044B\u0439: ["russian"], \u0432\u0430\u043A\u0446\u0438\u043D\u0430: ["russian"], \u0432\u0430\u043B\u0435\u043D\u043E\u043A: ["russian"], \u0432\u0430\u043B\u044C\u0441: ["russian"], \u0432\u0430\u043B\u044E\u0442\u0430: ["russian"], \u0432\u0430\u043D\u043D\u0430\u044F: ["russian"], \u0432\u0430\u0440\u0435\u043D\u044C\u0435: ["russian"], \u0432\u0430\u0440\u0438\u0430\u043D\u0442: ["russian"], \u0432\u0431\u043B\u0438\u0437\u0438: ["russian"], \u0432\u0432\u0435\u0440\u0445: ["russian"], \u0432\u0432\u043E\u0434\u0438\u0442\u044C: ["russian"], \u0432\u0434\u0430\u043B\u0438: ["russian"], \u0432\u0434\u0432\u043E\u0435: ["russian"], \u0432\u0434\u043E\u0432\u0430: ["russian"], \u0432\u0434\u043E\u043B\u044C: ["russian"], \u0432\u0434\u0440\u0443\u0433: ["russian"], \u0432\u0435\u0434\u0440\u043E: ["russian"], \u0432\u0435\u0434\u0443\u0449\u0438\u0439: ["russian"], \u0432\u0435\u0434\u044C\u043C\u0430: ["russian"], \u0432\u0435\u0436\u043B\u0438\u0432\u043E: ["russian"], \u0432\u0435\u0437\u0434\u0435: ["russian"], \u0432\u0435\u043A\u043E: ["russian"], \u0432\u0435\u043A\u0441\u0435\u043B\u044C: ["russian"], \u0432\u0435\u043B\u0435\u0442\u044C: ["russian"], \u0432\u0435\u043B\u0438\u043A\u0438\u0439: ["russian"], \u0432\u0435\u043D\u0435\u0446: ["russian"], \u0432\u0435\u043D\u0438\u043A: ["russian"], \u0432\u0435\u0440\u0430\u043D\u0434\u0430: ["russian"], \u0432\u0435\u0440\u0431\u043B\u044E\u0434: ["russian"], \u0432\u0435\u0440\u0438\u0442\u044C: ["russian"], \u0432\u0435\u0440\u043D\u044B\u0439: ["russian"], \u0432\u0435\u0440\u0441\u0438\u044F: ["russian"], \u0432\u0435\u0440\u0442\u0435\u0442\u044C: ["russian"], \u0432\u0435\u0440\u0445\u043D\u0438\u0439: ["russian"], \u0432\u0435\u0440\u0448\u0438\u043D\u0430: ["russian"], \u0432\u0435\u0441\u0435\u043B\u043E: ["russian"], \u0432\u0435\u0441\u043D\u0430: ["russian"], \u0432\u0435\u0441\u043E\u043C\u044B\u0439: ["russian"], \u0432\u0435\u0441\u0442\u0438: ["russian"], \u0432\u0435\u0441\u044C: ["russian"], \u0432\u0435\u0442\u0435\u0440\u0430\u043D: ["russian"], \u0432\u0435\u0442\u0445\u0438\u0439: ["russian"], \u0432\u0435\u0447\u0435\u0440: ["russian"], \u0432\u0435\u0447\u043D\u043E: ["russian"], \u0432\u0435\u0448\u0430\u043B\u043A\u0430: ["russian"], \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u043E: ["russian"], \u0432\u0437\u0430\u043C\u0435\u043D: ["russian"], \u0432\u0437\u0433\u043B\u044F\u0434: ["russian"], \u0432\u0437\u0434\u043E\u0445: ["russian"], \u0432\u0437\u043D\u043E\u0441: ["russian"], \u0432\u0437\u043E\u0439\u0442\u0438: ["russian"], \u0432\u0437\u043E\u0440: ["russian"], \u0432\u0437\u0440\u044B\u0432: ["russian"], \u0432\u0437\u044F\u0442\u044C: ["russian"], \u0432\u0438\u0434\u0435\u0442\u044C: ["russian"], \u0432\u0438\u0434\u0438\u043C\u043E: ["russian"], \u0432\u0438\u0437\u0433: ["russian"], \u0432\u0438\u0437\u0438\u0442: ["russian"], \u0432\u0438\u043B\u043A\u0430: ["russian"], \u0432\u0438\u043D\u0430: ["russian"], \u0432\u0438\u0440\u0443\u0441: ["russian"], \u0432\u0438\u0441\u043E\u043A: ["russian"], \u0432\u0438\u0442\u0430\u043C\u0438\u043D: ["russian"], \u0432\u0438\u0442\u0440\u0438\u043D\u0430: ["russian"], \u0432\u0438\u0445\u0440\u044C: ["russian"], \u0432\u0438\u0448\u043D\u044F: ["russian"], \u0432\u043A\u0443\u0441: ["russian"], \u0432\u043B\u0430\u0433\u0430: ["russian"], \u0432\u043B\u0430\u0434\u0435\u043B\u0435\u0446: ["russian"], \u0432\u043B\u0430\u0441\u0442\u044C: ["russian"], \u0432\u043B\u0435\u0432\u043E: ["russian"], \u0432\u043B\u0438\u044F\u043D\u0438\u0435: ["russian"], \u0432\u043B\u043E\u0436\u0438\u0442\u044C: ["russian"], \u0432\u043C\u0435\u0441\u0442\u0435: ["russian"], \u0432\u043D\u0435\u0448\u043D\u0438\u0439: ["russian"], \u0432\u043D\u0438\u043A\u0430\u0442\u044C: ["russian"], \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435: ["russian"], \u0432\u043D\u043E\u0432\u044C: ["russian"], \u0432\u043D\u0443\u043A: ["russian"], \u0432\u043D\u0443\u0442\u0440\u0438: ["russian"], \u0432\u043D\u0443\u0447\u043A\u0430: ["russian"], \u0432\u043D\u0443\u0448\u0430\u0442\u044C: ["russian"], \u0432\u043E\u0432\u043B\u0435\u0447\u044C: ["russian"], \u0432\u043E\u0432\u0440\u0435\u043C\u044F: ["russian"], \u0432\u043E\u0432\u0441\u044E: ["russian"], \u0432\u043E\u0434\u0430: ["russian"], \u0432\u043E\u0434\u043E\u0440\u043E\u0434: ["russian"], \u0432\u043E\u0434\u044F\u043D\u043E\u0439: ["russian"], \u0432\u043E\u0435\u0432\u0430\u0442\u044C: ["russian"], \u0432\u043E\u0437\u0432\u0440\u0430\u0442: ["russian"], \u0432\u043E\u0437\u0433\u043B\u0430\u0441: ["russian"], \u0432\u043E\u0437\u0434\u0443\u0445: ["russian"], \u0432\u043E\u0437\u0438\u0442\u044C: ["russian"], \u0432\u043E\u0437\u043B\u0435: ["russian"], \u0432\u043E\u0437\u043D\u044F: ["russian"], \u0432\u043E\u0437\u0440\u0430\u0441\u0442: ["russian"], \u0432\u043E\u0439\u043D\u0430: ["russian"], \u0432\u043E\u0439\u0441\u043A\u043E: ["russian"], \u0432\u043E\u043A\u0437\u0430\u043B: ["russian"], \u0432\u043E\u043B\u043E\u0441: ["russian"], \u0432\u043E\u043B\u0447\u0438\u0439: ["russian"], \u0432\u043E\u043B\u044C\u043D\u044B\u0439: ["russian"], \u0432\u043E\u043B\u044F: ["russian"], \u0432\u043E\u043E\u0431\u0449\u0435: ["russian"], \u0432\u043E\u043F\u043B\u044C: ["russian"], \u0432\u043E\u043F\u0440\u043E\u0441: ["russian"], \u0432\u043E\u0440\u043E\u0442\u0430: ["russian"], \u0432\u043E\u0441\u0435\u043C\u044C: ["russian"], \u0432\u043E\u0441\u0442\u043E\u043A: ["russian"], \u0432\u043F\u043B\u043E\u0442\u044C: ["russian"], \u0432\u043F\u043E\u043B\u043D\u0435: ["russian"], \u0432\u043F\u0440\u0430\u0432\u0435: ["russian"], \u0432\u043F\u0440\u0435\u0434\u044C: ["russian"], \u0432\u043F\u0440\u043E\u0447\u0435\u043C: ["russian"], \u0432\u0440\u0430\u0447: ["russian"], \u0432\u0440\u0435\u0434\u043D\u044B\u0439: ["russian"], \u0432\u0440\u0435\u043C\u044F: ["russian"], \u0432\u0440\u0443\u0447\u0438\u0442\u044C: ["russian"], \u0432\u0441\u0430\u0434\u043D\u0438\u043A: ["russian"], \u0432\u0441\u0435\u0433\u0434\u0430: ["russian"], \u0432\u0441\u043A\u043E\u0440\u0435: ["russian"], \u0432\u0441\u043A\u0440\u044B\u0442\u044C: ["russian"], \u0432\u0441\u043F\u043B\u0435\u0441\u043A: ["russian"], \u0432\u0441\u043F\u044B\u0448\u043A\u0430: ["russian"], \u0432\u0441\u0442\u0440\u0435\u0447\u0430: ["russian"], \u0432\u0441\u044E\u0434\u0443: ["russian"], \u0432\u0441\u044F\u043A\u0438\u0439: ["russian"], \u0432\u0442\u043E\u0440\u043E\u0439: ["russian"], \u0432\u0445\u043E\u0434: ["russian"], \u0432\u0447\u0435\u0440\u0430: ["russian"], \u0432\u044B\u0431\u043E\u0440: ["russian"], \u0432\u044B\u0432\u043E\u0434: ["russian"], \u0432\u044B\u0433\u043D\u0430\u0442\u044C: ["russian"], \u0432\u044B\u0434\u0430\u0442\u044C: ["russian"], \u0432\u044B\u0435\u0445\u0430\u0442\u044C: ["russian"], \u0432\u044B\u0437\u043E\u0432: ["russian"], \u0432\u044B\u0439\u0442\u0438: ["russian"], \u0432\u044B\u043A\u0443\u043F: ["russian"], \u0432\u044B\u043B\u0435\u0437\u0442\u0438: ["russian"], \u0432\u044B\u043C\u044B\u0442\u044C: ["russian"], \u0432\u044B\u043F\u0430\u0441\u0442\u044C: ["russian"], \u0432\u044B\u043F\u0438\u0442\u044C: ["russian"], \u0432\u044B\u043F\u043B\u0430\u0442\u0430: ["russian"], \u0432\u044B\u043F\u0443\u0441\u043A: ["russian"], \u0432\u044B\u0440\u0430\u0441\u0442\u0438: ["russian"], \u0432\u044B\u0440\u0443\u0447\u043A\u0430: ["russian"], \u0432\u044B\u0441\u043B\u0430\u0442\u044C: ["russian"], \u0432\u044B\u0441\u043E\u043A\u0438\u0439: ["russian"], \u0432\u044B\u0441\u0442\u0430\u0432\u043A\u0430: ["russian"], \u0432\u044B\u0448\u043A\u0430: ["russian"], \u0432\u044F\u0437\u0430\u0442\u044C: ["russian"], \u0432\u044F\u043B\u044B\u0439: ["russian"], \u0433\u0430\u0437\u0435\u0442\u0430: ["russian"], \u0433\u0430\u0437\u043E\u0432\u044B\u0439: ["russian"], \u0433\u0430\u043B\u0435\u0440\u0435\u044F: ["russian"], \u0433\u0430\u043B\u0441\u0442\u0443\u043A: ["russian"], \u0433\u0430\u043C\u043C\u0430: ["russian"], \u0433\u0430\u0440\u0430\u043D\u0442\u0438\u044F: ["russian"], \u0433\u0430\u0440\u043C\u043E\u043D\u0438\u044F: ["russian"], \u0433\u0430\u0440\u043D\u0438\u0437\u043E\u043D: ["russian"], \u0433\u0430\u0441\u0442\u0440\u043E\u043B\u0438: ["russian"], \u0433\u0432\u0430\u0440\u0434\u0438\u044F: ["russian"], \u0433\u0432\u043E\u0437\u0434\u044C: ["russian"], \u0433\u0435\u043A\u0442\u0430\u0440: ["russian"], \u0433\u0435\u043D\u0435\u0440\u0430\u043B: ["russian"], \u0433\u0435\u043D\u0438\u0439: ["russian"], \u0433\u0435\u043D\u043E\u043C: ["russian"], \u0433\u0435\u043E\u043B\u043E\u0433: ["russian"], \u0433\u0435\u0440\u0431: ["russian"], \u0433\u0435\u0440\u043E\u0439: ["russian"], \u0433\u0438\u0431\u043A\u0438\u0439: ["russian"], \u0433\u0438\u0433\u0430\u043D\u0442: ["russian"], \u0433\u0438\u043C\u043D: ["russian"], \u0433\u0438\u043F\u043E\u0442\u0435\u0437\u0430: ["russian"], \u0433\u0438\u0442\u0430\u0440\u0430: ["russian"], \u0433\u043B\u0430\u0432\u043D\u044B\u0439: ["russian"], \u0433\u043B\u0430\u0433\u043E\u043B: ["russian"], \u0433\u043B\u0430\u0434\u0438\u0442\u044C: ["russian"], \u0433\u043B\u0430\u0437: ["russian"], \u0433\u043B\u0438\u043D\u0430: ["russian"], \u0433\u043B\u043E\u0442\u043E\u043A: ["russian"], \u0433\u043B\u0443\u0431\u043E\u043A\u0438\u0439: ["russian"], \u0433\u043B\u0443\u043F\u044B\u0439: ["russian"], \u0433\u043B\u0443\u0445\u043E\u0439: ["russian"], \u0433\u043B\u044B\u0431\u0430: ["russian"], \u0433\u043B\u044F\u0434\u0435\u0442\u044C: ["russian"], \u0433\u043D\u0435\u0432: ["russian"], \u0433\u043D\u0435\u0437\u0434\u043E: ["russian"], \u0433\u043D\u0438\u043B\u043E\u0439: ["russian"], \u0433\u043E\u0434\u043E\u0432\u043E\u0439: ["russian"], \u0433\u043E\u043B\u043E\u0432\u0430: ["russian"], \u0433\u043E\u043B\u0443\u0431\u043E\u0439: ["russian"], \u0433\u043E\u043B\u044B\u0439: ["russian"], \u0433\u043E\u043D\u043E\u0440\u0430\u0440: ["russian"], \u0433\u043E\u0440\u0434\u043E\u0441\u0442\u044C: ["russian"], \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442: ["russian"], \u0433\u043E\u0440\u043B\u043E: ["russian"], \u0433\u043E\u0440\u043D\u044B\u0439: ["russian"], \u0433\u043E\u0440\u043E\u0434: ["russian"], \u0433\u043E\u0440\u0448\u043E\u043A: ["russian"], \u0433\u043E\u0440\u044C\u043A\u0438\u0439: ["russian"], \u0433\u043E\u0440\u044E\u0447\u0435\u0435: ["russian"], \u0433\u043E\u0440\u044F\u0447\u0438\u0439: ["russian"], \u0433\u043E\u0442\u043E\u0432\u044B\u0439: ["russian"], \u0433\u0440\u0430\u0434\u0443\u0441: ["russian"], \u0433\u0440\u0430\u043C\u043C: ["russian"], \u0433\u0440\u0430\u043D\u0438\u0446\u0430: ["russian"], \u0433\u0440\u0430\u0444: ["russian"], \u0433\u0440\u0435\u0431\u0435\u043D\u044C: ["russian"], \u0433\u0440\u0438\u0431: ["russian"], \u0433\u0440\u0438\u043C\u0430\u0441\u0430: ["russian"], \u0433\u0440\u043E\u0437\u0438\u0442\u044C: ["russian"], \u0433\u0440\u043E\u0445\u043E\u0442: ["russian"], \u0433\u0440\u043E\u0448: ["russian"], \u0433\u0440\u0443\u0431\u044B\u0439: ["russian"], \u0433\u0440\u0443\u0434\u044C: ["russian"], \u0433\u0440\u0443\u0437: ["russian"], \u0433\u0440\u0443\u043D\u0442: ["russian"], \u0433\u0440\u0443\u043F\u043F\u0430: ["russian"], \u0433\u0440\u0443\u0448\u0430: ["russian"], \u0433\u0440\u044F\u0437\u043D\u044B\u0439: ["russian"], \u0433\u0443\u0431\u0430: ["russian"], \u0433\u0443\u0434\u043E\u043A: ["russian"], \u0433\u0443\u043B\u043A\u0438\u0439: ["russian"], \u0433\u0443\u043B\u044F\u0442\u044C: ["russian"], \u0433\u0443\u0441\u0435\u043D\u0438\u0446\u0430: ["russian"], \u0433\u0443\u0441\u0442\u043E: ["russian"], \u0433\u0443\u0441\u044C: ["russian"], \u0434\u0430\u0432\u043B\u0435\u043D\u0438\u0435: ["russian"], \u0434\u0430\u0432\u043D\u043E: ["russian"], \u0434\u0430\u0436\u0435: ["russian"], \u0434\u0430\u043B\u044C\u043D\u0438\u0439: ["russian"], \u0434\u0430\u043D\u043D\u044B\u0439: ["russian"], \u0434\u0430\u0440\u0438\u0442\u044C: ["russian"], \u0434\u0430\u0442\u0447\u0438\u043A: ["russian"], \u0434\u0430\u0442\u044C: ["russian"], \u0434\u0430\u0447\u0430: ["russian"], \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C: ["russian"], \u0434\u0432\u0430\u0436\u0434\u044B: ["russian"], \u0434\u0432\u0435\u0440\u044C: ["russian"], \u0434\u0432\u0438\u0433\u0430\u0442\u044C: ["russian"], \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0435: ["russian"], \u0434\u0432\u043E\u0439\u043D\u043E\u0439: ["russian"], \u0434\u0432\u043E\u0440: ["russian"], \u0434\u0435\u0431\u044E\u0442: ["russian"], \u0434\u0435\u0432\u044F\u0442\u044B\u0439: ["russian"], \u0434\u0435\u0436\u0443\u0440\u043D\u044B\u0439: ["russian"], \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435: ["russian"], \u0434\u0435\u043A\u0430\u0431\u0440\u044C: ["russian"], \u0434\u0435\u043B\u0435\u043D\u0438\u0435: ["russian"], \u0434\u0435\u043B\u043E: ["russian"], \u0434\u0435\u043B\u044C\u0444\u0438\u043D: ["russian"], \u0434\u0435\u043D\u044C: ["russian"], \u0434\u0435\u0440\u0435\u0432\u043E: ["russian"], \u0434\u0435\u0440\u0436\u0430\u0442\u044C: ["russian"], \u0434\u0435\u0440\u0437\u043A\u0438\u0439: ["russian"], \u0434\u0435\u0441\u044F\u0442\u044C: ["russian"], \u0434\u0435\u0442\u0430\u043B\u044C: ["russian"], \u0434\u0435\u0442\u0441\u043A\u0438\u0439: ["russian"], \u0434\u0435\u0444\u0435\u043A\u0442: ["russian"], \u0434\u0435\u0444\u0438\u0446\u0438\u0442: ["russian"], \u0434\u0435\u044F\u0442\u0435\u043B\u044C: ["russian"], \u0434\u0436\u0430\u0437: ["russian"], \u0434\u0436\u0438\u043D\u0441\u044B: ["russian"], \u0434\u0436\u0443\u043D\u0433\u043B\u0438: ["russian"], \u0434\u0438\u0430\u0433\u043D\u043E\u0437: ["russian"], \u0434\u0438\u0430\u043B\u043E\u0433: ["russian"], \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D: ["russian"], \u0434\u0438\u0432\u0430\u043D: ["russian"], \u0434\u0438\u0432\u0438\u0437\u0438\u044F: ["russian"], \u0434\u0438\u0432\u043D\u044B\u0439: ["russian"], \u0434\u0438\u0435\u0442\u0430: ["russian"], \u0434\u0438\u0437\u0430\u0439\u043D: ["russian"], \u0434\u0438\u043A\u0430\u0440\u044C: ["russian"], \u0434\u0438\u043B\u0435\u0440: ["russian"], \u0434\u0438\u043D\u0430\u043C\u0438\u043A\u0430: ["russian"], \u0434\u0438\u043F\u043B\u043E\u043C: ["russian"], \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440: ["russian"], \u0434\u0438\u0442\u044F: ["russian"], \u0434\u043B\u0438\u043D\u043D\u044B\u0439: ["russian"], \u0434\u043D\u0435\u0432\u043D\u0438\u043A: ["russian"], \u0434\u043E\u0431\u0440\u044B\u0439: ["russian"], \u0434\u043E\u0431\u044B\u0447\u0430: ["russian"], \u0434\u043E\u0432\u0435\u0440\u0438\u0435: ["russian"], \u0434\u043E\u0433\u0430\u0434\u043A\u0430: ["russian"], \u0434\u043E\u0433\u043D\u0430\u0442\u044C: ["russian"], \u0434\u043E\u0436\u0434\u044C: ["russian"], \u0434\u043E\u043A\u043B\u0430\u0434: ["russian"], \u0434\u043E\u043A\u0442\u043E\u0440: ["russian"], \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442: ["russian"], \u0434\u043E\u043B\u0433\u043E: ["russian"], \u0434\u043E\u043B\u0436\u0435\u043D: ["russian"], \u0434\u043E\u043B\u0438\u043D\u0430: ["russian"], \u0434\u043E\u043D\u043E\u0441: ["russian"], \u0434\u043E\u0440\u043E\u0433\u0430: ["russian"], \u0434\u043E\u0441\u0430\u0434\u0430: ["russian"], \u0434\u043E\u0441\u043A\u0430: ["russian"], \u0434\u043E\u0441\u0442\u0430\u0442\u044C: ["russian"], \u0434\u043E\u0441\u0443\u0433: ["russian"], \u0434\u043E\u0445\u043E\u0434: ["russian"], \u0434\u043E\u0446\u0435\u043D\u0442: ["russian"], \u0434\u043E\u0449\u0430\u0442\u044B\u0439: ["russian"], \u0434\u0440\u0430\u043A\u0430: ["russian"], \u0434\u0440\u0435\u0432\u043D\u0438\u0439: ["russian"], \u0434\u0440\u0435\u043C\u0430\u0442\u044C: ["russian"], \u0434\u0440\u043E\u0431\u043D\u044B\u0439: ["russian"], \u0434\u0440\u043E\u0432\u0430: ["russian"], \u0434\u0440\u043E\u0436\u0430\u0442\u044C: ["russian"], \u0434\u0440\u0443\u0433\u043E\u0439: ["russian"], \u0434\u0440\u0443\u0436\u0431\u0430: ["russian"], \u0434\u0443\u0431\u043E\u0432\u044B\u0439: ["russian"], \u0434\u0443\u0433\u0430: ["russian"], \u0434\u0443\u043C\u0430\u0442\u044C: ["russian"], \u0434\u0443\u0440\u043D\u043E\u0439: ["russian"], \u0434\u0443\u0445\u0438: ["russian"], \u0434\u0443\u0448\u043D\u044B\u0439: ["russian"], \u0434\u0443\u044D\u043B\u044C: ["russian"], \u0434\u0443\u044D\u0442: ["russian"], \u0434\u044B\u0440\u0430: ["russian"], \u0434\u044B\u0445\u0430\u043D\u0438\u0435: ["russian"], \u0434\u044E\u0436\u0438\u043D\u0430: ["russian"], \u0434\u044F\u0434\u044F: ["russian"], \u0435\u0434\u0432\u0430: ["russian"], \u0435\u0434\u0438\u043D\u044B\u0439: ["russian"], \u0435\u0440\u0443\u043D\u0434\u0430: ["russian"], \u0435\u0441\u043B\u0438: ["russian"], \u0435\u0445\u0430\u0442\u044C: ["russian"], \u0436\u0430\u0434\u043D\u044B\u0439: ["russian"], \u0436\u0430\u0436\u0434\u0430: ["russian"], \u0436\u0430\u043B\u0435\u0442\u044C: ["russian"], \u0436\u0430\u043B\u043E\u0431\u0430: ["russian"], \u0436\u0430\u043D\u0440: ["russian"], \u0436\u0430\u0440\u0435\u043D\u044B\u0439: ["russian"], \u0436\u0430\u0440\u043A\u0438\u0439: ["russian"], \u0436\u0433\u0443\u0447\u0438\u0439: ["russian"], \u0436\u0435\u0432\u0430\u0442\u044C: ["russian"], \u0436\u0435\u043B\u0430\u043D\u0438\u0435: ["russian"], \u0436\u0435\u043B\u0443\u0434\u043E\u043A: ["russian"], \u0436\u0435\u043D\u0430: ["russian"], \u0436\u0435\u043D\u0449\u0438\u043D\u0430: ["russian"], \u0436\u0435\u0440\u0442\u0432\u0430: ["russian"], \u0436\u0435\u0441\u0442: ["russian"], \u0436\u0438\u0434\u043A\u043E\u0441\u0442\u044C: ["russian"], \u0436\u0438\u0442\u0435\u043B\u044C: ["russian"], \u0436\u0438\u0442\u044C: ["russian"], \u0436\u0440\u0435\u0446: ["russian"], \u0436\u0443\u043B\u0438\u043A: ["russian"], \u0436\u0443\u0440\u043D\u0430\u043B: ["russian"], \u0436\u0443\u0442\u043A\u0438\u0439: ["russian"], \u0437\u0430\u0431\u0440\u0430\u0442\u044C: ["russian"], \u0437\u0430\u0431\u044B\u0442\u044C: ["russian"], \u0437\u0430\u0432\u0435\u0441\u0442\u0438: ["russian"], \u0437\u0430\u0432\u043E\u0434: ["russian"], \u0437\u0430\u0432\u0442\u0440\u0430: ["russian"], \u0437\u0430\u0433\u0430\u0434\u043A\u0430: ["russian"], \u0437\u0430\u0433\u043D\u0430\u0442\u044C: ["russian"], \u0437\u0430\u0433\u043E\u0432\u043E\u0440: ["russian"], \u0437\u0430\u0434\u0430\u0447\u0430: ["russian"], \u0437\u0430\u0434\u0435\u0442\u044C: ["russian"], \u0437\u0430\u0434\u043D\u0438\u0439: ["russian"], \u0437\u0430\u0434\u043E\u043B\u0433\u043E: ["russian"], \u0437\u0430\u0435\u0445\u0430\u0442\u044C: ["russian"], \u0437\u0430\u043A\u0430\u0437: ["russian"], \u0437\u0430\u043A\u043E\u043D: ["russian"], \u0437\u0430\u043A\u0440\u044B\u0442\u044C: ["russian"], \u0437\u0430\u043A\u0443\u0441\u043A\u0430: ["russian"], \u0437\u0430\u043B\u0435\u0437\u0442\u044C: ["russian"], \u0437\u0430\u043B\u0438\u0442\u044C: ["russian"], \u0437\u0430\u043B\u043F: ["russian"], \u0437\u0430\u043C\u043E\u043A: ["russian"], \u0437\u0430\u043C\u0443\u0436: ["russian"], \u0437\u0430\u043C\u044B\u0441\u0435\u043B: ["russian"], \u0437\u0430\u043D\u0430\u0432\u0435\u0441: ["russian"], \u0437\u0430\u043D\u043E\u0432\u043E: ["russian"], \u0437\u0430\u043D\u044F\u0442\u044C: ["russian"], \u0437\u0430\u043E\u0434\u043D\u043E: ["russian"], \u0437\u0430\u043F\u0438\u0441\u044C: ["russian"], \u0437\u0430\u043F\u0440\u043E\u0441: ["russian"], \u0437\u0430\u043F\u0443\u0441\u043A: ["russian"], \u0437\u0430\u043F\u044F\u0441\u0442\u044C\u0435: ["russian"], \u0437\u0430\u0440\u0430\u043D\u0435\u0435: ["russian"], \u0437\u0430\u0440\u043E\u0441\u043B\u044C: ["russian"], \u0437\u0430\u0440\u043F\u043B\u0430\u0442\u0430: ["russian"], \u0437\u0430\u0440\u044F: ["russian"], \u0437\u0430\u0441\u0430\u0434\u0430: ["russian"], \u0437\u0430\u0441\u043B\u0443\u0433\u0430: ["russian"], \u0437\u0430\u0441\u043D\u0443\u0442\u044C: ["russian"], \u0437\u0430\u0441\u0442\u0430\u0442\u044C: ["russian"], \u0437\u0430\u0442\u0432\u043E\u0440: ["russian"], \u0437\u0430\u0442\u0435\u044F\u0442\u044C: ["russian"], \u0437\u0430\u0442\u0440\u0430\u0442\u0430: ["russian"], \u0437\u0430\u0442\u044B\u043B\u043E\u043A: ["russian"], \u0437\u0430\u0445\u0432\u0430\u0442: ["russian"], \u0437\u0430\u0447\u0435\u043C: ["russian"], \u0437\u0430\u0449\u0438\u0442\u0430: ["russian"], \u0437\u0430\u044F\u0432\u0438\u0442\u044C: ["russian"], \u0437\u0430\u044F\u0446: ["russian"], \u0437\u0432\u0435\u0437\u0434\u0430: ["russian"], \u0437\u0432\u0435\u043D\u043E: ["russian"], \u0437\u0432\u043E\u043D\u0438\u0442\u044C: ["russian"], \u0437\u0434\u0435\u0441\u044C: ["russian"], \u0437\u0435\u043B\u0435\u043D\u044C: ["russian"], \u0437\u0435\u043C\u043B\u044F: ["russian"], \u0437\u0435\u0440\u043A\u0430\u043B\u043E: ["russian"], \u0437\u0435\u0440\u043D\u043E: ["russian"], \u0437\u0438\u043C\u0430: ["russian"], \u0437\u043B\u043E\u0439: ["russian"], \u0437\u043C\u0435\u044F: ["russian"], \u0437\u043D\u0430\u043C\u044F: ["russian"], \u0437\u043D\u0430\u043D\u0438\u0435: ["russian"], \u0437\u043D\u0430\u0447\u0438\u0442: ["russian"], \u0437\u043E\u043B\u043E\u0442\u043E\u0439: ["russian"], \u0437\u043E\u043D\u0430: ["russian"], \u0437\u043E\u043D\u0442\u0438\u043A: ["russian"], \u0437\u043E\u043E\u043F\u0430\u0440\u043A: ["russian"], \u0437\u0440\u0430\u0447\u043E\u043A: ["russian"], \u0437\u0440\u0435\u043D\u0438\u0435: ["russian"], \u0437\u0440\u0438\u0442\u0435\u043B\u044C: ["russian"], \u0437\u0443\u0431\u043D\u043E\u0439: ["russian"], \u0437\u0443\u0431\u0440: ["russian"], \u0438\u0433\u043B\u0430: ["russian"], \u0438\u0434\u0435\u0430\u043B: ["russian"], \u0438\u0434\u0435\u043E\u043B\u043E\u0433: ["russian"], \u0438\u0434\u0435\u044F: ["russian"], \u0438\u0434\u043E\u043B: ["russian"], \u0438\u0434\u0442\u0438: ["russian"], \u0438\u0437\u0431\u0430: ["russian"], \u0438\u0437\u0431\u0438\u0442\u044C: ["russian"], \u0438\u0437\u0431\u0440\u0430\u0442\u044C: ["russian"], \u0438\u0437\u0431\u044B\u0442\u043E\u043A: ["russian"], \u0438\u0437\u0432\u043B\u0435\u0447\u044C: ["russian"], \u0438\u0437\u0432\u043D\u0435: ["russian"], \u0438\u0437\u0433\u0438\u0431: ["russian"], \u0438\u0437\u0433\u043D\u0430\u0442\u044C: ["russian"], \u0438\u0437\u0434\u0430\u043D\u0438\u0435: ["russian"], \u0438\u0437\u0434\u0435\u043B\u0438\u0435: ["russian"], \u0438\u0437\u043D\u0443\u0442\u0440\u0438: ["russian"], \u0438\u0437\u043E\u0431\u0438\u043B\u0438\u0435: ["russian"], \u0438\u0437\u043E\u043B\u044F\u0446\u0438\u044F: ["russian"], \u0438\u0437\u0440\u0435\u0434\u043A\u0430: ["russian"], \u0438\u0437\u0440\u044F\u0434\u043D\u043E: ["russian"], \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u0435: ["russian"], \u0438\u0437\u044A\u044F\u0442\u044C: ["russian"], \u0438\u0437\u044F\u0449\u043D\u044B\u0439: ["russian"], \u0438\u043A\u043E\u043D\u0430: ["russian"], \u0438\u043A\u0440\u0430: ["russian"], \u0438\u043B\u043B\u044E\u0437\u0438\u044F: ["russian"], \u0438\u043C\u0435\u043D\u043D\u043E: ["russian"], \u0438\u043C\u0435\u0442\u044C: ["russian"], \u0438\u043C\u0438\u0434\u0436: ["russian"], \u0438\u043C\u043F\u0435\u0440\u0438\u044F: ["russian"], \u0438\u043C\u043F\u0443\u043B\u044C\u0441: ["russian"], \u0438\u043D\u0430\u0447\u0435: ["russian"], \u0438\u043D\u0432\u0430\u043B\u0438\u0434: ["russian"], \u0438\u043D\u0434\u0435\u043A\u0441: ["russian"], \u0438\u043D\u0434\u0438\u0432\u0438\u0434: ["russian"], \u0438\u043D\u0435\u0440\u0446\u0438\u044F: ["russian"], \u0438\u043D\u0436\u0435\u043D\u0435\u0440: ["russian"], \u0438\u043D\u043E\u0433\u0434\u0430: ["russian"], \u0438\u043D\u043E\u0439: ["russian"], \u0438\u043D\u0441\u0442\u0438\u0442\u0443\u0442: ["russian"], \u0438\u043D\u0442\u0435\u0440\u0435\u0441: ["russian"], \u0438\u043D\u0442\u0440\u0438\u0433\u0430: ["russian"], \u0438\u043D\u0442\u0443\u0438\u0446\u0438\u044F: ["russian"], \u0438\u043D\u0444\u0430\u0440\u043A\u0442: ["russian"], \u0438\u043D\u0446\u0438\u0434\u0435\u043D\u0442: ["russian"], \u0438\u0440\u043E\u043D\u0438\u044F: ["russian"], \u0438\u0441\u043A\u0430\u0442\u044C: ["russian"], \u0438\u0441\u043F\u0443\u0433: ["russian"], \u0438\u0441\u0442\u043E\u0440\u0438\u044F: ["russian"], \u0438\u0442\u043E\u0433: ["russian"], \u0438\u044E\u043D\u044C: ["russian"], \u043A\u0430\u0431\u0435\u043B\u044C: ["russian"], \u043A\u0430\u0431\u0438\u043D\u0435\u0442: ["russian"], \u043A\u0430\u0431\u043B\u0443\u043A: ["russian"], \u043A\u0430\u0432\u0430\u043B\u0435\u0440: ["russian"], \u043A\u0430\u0434\u0440: ["russian"], \u043A\u0430\u0436\u0434\u044B\u0439: ["russian"], \u043A\u0430\u0436\u0435\u0442\u0441\u044F: ["russian"], \u043A\u0430\u0437\u0438\u043D\u043E: ["russian"], \u043A\u0430\u043B\u0438\u0442\u043A\u0430: ["russian"], \u043A\u0430\u043C\u0435\u043D\u044C: ["russian"], \u043A\u0430\u043C\u0438\u043D: ["russian"], \u043A\u0430\u043D\u0430\u043B: ["russian"], \u043A\u0430\u043D\u0434\u0438\u0434\u0430\u0442: ["russian"], \u043A\u0430\u043D\u0438\u043A\u0443\u043B\u044B: ["russian"], \u043A\u0430\u043D\u043E\u043D: ["russian"], \u043A\u0430\u043F\u0438\u0442\u0430\u043D: ["russian"], \u043A\u0430\u043F\u043B\u044F: ["russian"], \u043A\u0430\u043F\u043E\u0442: ["russian"], \u043A\u0430\u043F\u0443\u0441\u0442\u0430: ["russian"], \u043A\u0430\u0440\u0430\u043D\u0434\u0430\u0448: ["russian"], \u043A\u0430\u0440\u0435\u0442\u0430: ["russian"], \u043A\u0430\u0440\u043A\u0430\u0441: ["russian"], \u043A\u0430\u0440\u043C\u0430\u043D: ["russian"], \u043A\u0430\u0440\u0442\u0438\u043D\u0430: ["russian"], \u043A\u0430\u0440\u044C\u0435\u0440\u0430: ["russian"], \u043A\u0430\u0441\u043A\u0430: ["russian"], \u043A\u0430\u0441\u0441\u0435\u0442\u0430: ["russian"], \u043A\u0430\u0441\u0442\u0440\u044E\u043B\u044F: ["russian"], \u043A\u0430\u0442\u0430\u043B\u043E\u0433: ["russian"], \u043A\u0430\u0442\u0435\u0440: ["russian"], \u043A\u0430\u0442\u043E\u043A: ["russian"], \u043A\u0430\u0442\u0443\u0448\u043A\u0430: ["russian"], \u043A\u0430\u0444\u0435\u0434\u0440\u0430: ["russian"], \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E: ["russian"], \u043A\u0430\u0448\u0430: ["russian"], \u043A\u0430\u0448\u043B\u044F\u0442\u044C: ["russian"], \u043A\u0430\u044E\u0442\u0430: ["russian"], \u043A\u0432\u0430\u0434\u0440\u0430\u0442: ["russian"], \u043A\u0432\u0430\u0440\u0442\u0438\u0440\u0430: ["russian"], \u043A\u0432\u043E\u0442\u0430: ["russian"], \u043A\u0435\u043F\u043A\u0430: ["russian"], \u043A\u0438\u0432\u043D\u0443\u0442\u044C: ["russian"], \u043A\u0438\u043B\u043E\u043C\u0435\u0442\u0440: ["russian"], \u043A\u0438\u043D\u043E: ["russian"], \u043A\u0438\u043E\u0441\u043A: ["russian"], \u043A\u0438\u043F\u044F\u0442\u043E\u043A: ["russian"], \u043A\u0438\u0440\u043F\u0438\u0447: ["russian"], \u043A\u0438\u0441\u043B\u043E\u0442\u0430: ["russian"], \u043A\u0438\u0441\u0442\u044C: ["russian"], \u043A\u043B\u0430\u0432\u0438\u0448\u0430: ["russian"], \u043A\u043B\u0430\u043F\u0430\u043D: ["russian"], \u043A\u043B\u0430\u0441\u0441: ["russian"], \u043A\u043B\u0435\u0439: ["russian"], \u043A\u043B\u0435\u0442\u043A\u0430: ["russian"], \u043A\u043B\u0438\u0435\u043D\u0442: ["russian"], \u043A\u043B\u0438\u043C\u0430\u0442: ["russian"], \u043A\u043B\u0438\u043D\u0438\u043A\u0430: ["russian"], \u043A\u043B\u0438\u0447\u043A\u0430: ["russian"], \u043A\u043B\u043E\u0443\u043D: ["russian"], \u043A\u043B\u043E\u0447\u043E\u043A: ["russian"], \u043A\u043B\u0443\u0431: ["russian"], \u043A\u043B\u0443\u043C\u0431\u0430: ["russian"], \u043A\u043B\u044E\u0447: ["russian"], \u043A\u043D\u0438\u0433\u0430: ["russian"], \u043A\u043D\u043E\u043F\u043A\u0430: ["russian"], \u043A\u043D\u0443\u0442: ["russian"], \u043A\u043D\u044F\u0433\u0438\u043D\u044F: ["russian"], \u043A\u043D\u044F\u0437\u044C: ["russian"], \u043A\u043E\u0431\u0443\u0440\u0430: ["russian"], \u043A\u043E\u0433\u0434\u0430: ["russian"], \u043A\u043E\u0434\u0435\u043A\u0441: ["russian"], \u043A\u043E\u0436\u0430: ["russian"], \u043A\u043E\u043A\u0442\u0435\u0439\u043B\u044C: ["russian"], \u043A\u043E\u043B\u0435\u043D\u043E: ["russian"], \u043A\u043E\u043B\u043B\u0435\u0433\u0430: ["russian"], \u043A\u043E\u043B\u043E\u043D\u043D\u0430: ["russian"], \u043A\u043E\u043B\u043F\u0430\u043A: ["russian"], \u043A\u043E\u043B\u044C\u0446\u043E: ["russian"], \u043A\u043E\u043B\u044E\u0447\u0438\u0439: ["russian"], \u043A\u043E\u043B\u044F\u0441\u043A\u0430: ["russian"], \u043A\u043E\u043C\u0430\u043D\u0434\u0430: ["russian"], \u043A\u043E\u043C\u0435\u0434\u0438\u044F: ["russian"], \u043A\u043E\u043C\u0438\u0441\u0441\u0438\u044F: ["russian"], \u043A\u043E\u043C\u043C\u0443\u043D\u0430: ["russian"], \u043A\u043E\u043C\u043D\u0430\u0442\u0430: ["russian"], \u043A\u043E\u043C\u043E\u043A: ["russian"], \u043A\u043E\u043C\u043F\u0430\u043D\u0438\u044F: ["russian"], \u043A\u043E\u043C\u0444\u043E\u0440\u0442: ["russian"], \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440: ["russian"], \u043A\u043E\u043D\u0433\u0440\u0435\u0441\u0441: ["russian"], \u043A\u043E\u043D\u0435\u0447\u043D\u043E: ["russian"], \u043A\u043E\u043D\u043A\u0443\u0440\u0441: ["russian"], \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C: ["russian"], \u043A\u043E\u043D\u0446\u0435\u0440\u0442: ["russian"], \u043A\u043E\u043D\u044C: ["russian"], \u043A\u043E\u043D\u044E\u0448\u043D\u044F: ["russian"], \u043A\u043E\u043F\u0430\u0442\u044C: ["russian"], \u043A\u043E\u043F\u0435\u0439\u043A\u0430: ["russian"], \u043A\u043E\u043F\u044B\u0442\u043E: ["russian"], \u043A\u043E\u0440\u0430\u0431\u043B\u044C: ["russian"], \u043A\u043E\u0440\u0435\u043D\u044C: ["russian"], \u043A\u043E\u0440\u0437\u0438\u043D\u0430: ["russian"], \u043A\u043E\u0440\u0438\u0434\u043E\u0440: ["russian"], \u043A\u043E\u0440\u043C\u0438\u0442\u044C: ["russian"], \u043A\u043E\u0440\u043F\u0443\u0441: ["russian"], \u043A\u043E\u0441\u043C\u043E\u0441: ["russian"], \u043A\u043E\u0441\u0442\u044E\u043C: ["russian"], \u043A\u043E\u0441\u044F\u043A: ["russian"], \u043A\u043E\u0442\u0435\u043B: ["russian"], \u043A\u043E\u0442\u043B\u0435\u0442\u0430: ["russian"], \u043A\u043E\u0442\u043E\u0440\u044B\u0439: ["russian"], \u043A\u043E\u0442\u0442\u0435\u0434\u0436: ["russian"], \u043A\u043E\u0444\u0435: ["russian"], \u043A\u043E\u0444\u0442\u0430: ["russian"], \u043A\u043E\u0448\u043A\u0430: ["russian"], \u043A\u0440\u0430\u0436\u0430: ["russian"], \u043A\u0440\u0430\u0439: ["russian"], \u043A\u0440\u0430\u0441\u043D\u044B\u0439: ["russian"], \u043A\u0440\u0430\u0442\u043A\u0438\u0439: ["russian"], \u043A\u0440\u0435\u0434\u0438\u0442: ["russian"], \u043A\u0440\u0435\u043C: ["russian"], \u043A\u0440\u0435\u043F\u043A\u0438\u0439: ["russian"], \u043A\u0440\u0435\u0441\u043B\u043E: ["russian"], \u043A\u0440\u0438\u0432\u043E\u0439: ["russian"], \u043A\u0440\u0438\u0437\u0438\u0441: ["russian"], \u043A\u0440\u0438\u0441\u0442\u0430\u043B\u043B: ["russian"], \u043A\u0440\u0438\u0442\u0435\u0440\u0438\u0439: ["russian"], \u043A\u0440\u0438\u0447\u0430\u0442\u044C: ["russian"], \u043A\u0440\u043E\u0432\u044C: ["russian"], \u043A\u0440\u043E\u043A\u043E\u0434\u0438\u043B: ["russian"], \u043A\u0440\u043E\u043B\u0438\u043A: ["russian"], \u043A\u0440\u043E\u043C\u0435: ["russian"], \u043A\u0440\u043E\u043D\u0430: ["russian"], \u043A\u0440\u0443\u0433: ["russian"], \u043A\u0440\u0443\u0436\u043A\u0430: ["russian"], \u043A\u0440\u0443\u043F\u043D\u044B\u0439: ["russian"], \u043A\u0440\u0443\u0442\u043E\u0439: ["russian"], \u043A\u0440\u0443\u0448\u0435\u043D\u0438\u0435: ["russian"], \u043A\u0440\u044B\u043B\u043E: ["russian"], \u043A\u0440\u044B\u0448\u0430: ["russian"], \u043A\u0440\u044E\u0447\u043E\u043A: ["russian"], \u043A\u0441\u0442\u0430\u0442\u0438: ["russian"], \u043A\u0443\u0431\u0438\u043A: ["russian"], \u043A\u0443\u0434\u0430: ["russian"], \u043A\u0443\u0437\u043E\u0432: ["russian"], \u043A\u0443\u043A\u043B\u0430: ["russian"], \u043A\u0443\u043B\u0430\u043A: ["russian"], \u043A\u0443\u043B\u0438\u0441\u0430: ["russian"], \u043A\u0443\u043B\u044C\u0442\u0443\u0440\u0430: ["russian"], \u043A\u0443\u043C\u0438\u0440: ["russian"], \u043A\u0443\u043F\u0435: ["russian"], \u043A\u0443\u043F\u0438\u0442\u044C: ["russian"], \u043A\u0443\u043F\u043E\u043B: ["russian"], \u043A\u0443\u043F\u044E\u0440\u0430: ["russian"], \u043A\u0443\u0440\u0438\u0446\u0430: ["russian"], \u043A\u0443\u0440\u043E\u0440\u0442: ["russian"], \u043A\u0443\u0440\u0441: ["russian"], \u043A\u0443\u0440\u0442\u043A\u0430: ["russian"], \u043A\u0443\u0441\u043E\u043A: ["russian"], \u043A\u0443\u0441\u0442: ["russian"], \u043A\u0443\u0445\u043D\u044F: ["russian"], \u043A\u0443\u0448\u0430\u0442\u044C: ["russian"], \u043B\u0430\u0431\u0438\u0440\u0438\u043D\u0442: ["russian"], \u043B\u0430\u0432\u043A\u0430: ["russian"], \u043B\u0430\u0433\u0435\u0440\u044C: ["russian"], \u043B\u0430\u0434\u043D\u043E: ["russian"], \u043B\u0430\u0434\u043E\u043D\u044C: ["russian"], \u043B\u0430\u043F\u0430: ["russian"], \u043B\u0430\u0443\u0440\u0435\u0430\u0442: ["russian"], \u043B\u0433\u0430\u0442\u044C: ["russian"], \u043B\u0435\u0431\u0435\u0434\u044C: ["russian"], \u043B\u0435\u0432\u044B\u0439: ["russian"], \u043B\u0435\u0433\u0435\u043D\u0434\u0430: ["russian"], \u043B\u0435\u0433\u043A\u0438\u0439: ["russian"], \u043B\u0435\u0434\u044F\u043D\u043E\u0439: ["russian"], \u043B\u0435\u0436\u0430\u0442\u044C: ["russian"], \u043B\u0435\u0437\u0432\u0438\u0435: ["russian"], \u043B\u0435\u0437\u0442\u044C: ["russian"], \u043B\u0435\u043A\u0446\u0438\u044F: ["russian"], \u043B\u0435\u043D\u0438\u0432\u044B\u0439: ["russian"], \u043B\u0435\u043D\u0442\u0430: ["russian"], \u043B\u0435\u043F\u0435\u0441\u0442\u043E\u043A: ["russian"], \u043B\u0435\u0441\u043D\u043E\u0439: ["russian"], \u043B\u0435\u0441\u0442\u043D\u0438\u0446\u0430: ["russian"], \u043B\u0435\u0442\u0435\u0442\u044C: ["russian"], \u043B\u0435\u0442\u043E: ["russian"], \u043B\u0435\u0447\u0438\u0442\u044C: ["russian"], \u043B\u0438\u0433\u0430: ["russian"], \u043B\u0438\u0434\u0435\u0440: ["russian"], \u043B\u0438\u043B\u043E\u0432\u044B\u0439: ["russian"], \u043B\u0438\u043C\u043E\u043D: ["russian"], \u043B\u0438\u043D\u0438\u044F: ["russian"], \u043B\u0438\u043F\u043A\u0438\u0439: ["russian"], \u043B\u0438\u0441\u0442: ["russian"], \u043B\u0438\u0442\u0440: ["russian"], \u043B\u0438\u0445\u043E\u0439: ["russian"], \u043B\u0438\u0446\u043E: ["russian"], \u043B\u0438\u0448\u0438\u0442\u044C: ["russian"], \u043B\u0438\u0448\u043D\u0438\u0439: ["russian"], \u043B\u043E\u0432\u0438\u0442\u044C: ["russian"], \u043B\u043E\u0433\u0438\u043A\u0430: ["russian"], \u043B\u043E\u0434\u043A\u0430: ["russian"], \u043B\u043E\u0436\u044C: ["russian"], \u043B\u043E\u0437\u0443\u043D\u0433: ["russian"], \u043B\u043E\u043A\u043E\u0442\u044C: ["russian"], \u043B\u043E\u043F\u0430\u0442\u0430: ["russian"], \u043B\u043E\u0448\u0430\u0434\u044C: ["russian"], \u043B\u0443\u043A\u0430\u0432\u044B\u0439: ["russian"], \u043B\u0443\u043D\u0430: ["russian"], \u043B\u0443\u0447\u0448\u0438\u0439: ["russian"], \u043B\u044B\u0441\u044B\u0439: ["russian"], \u043B\u044C\u0433\u043E\u0442\u0430: ["russian"], \u043B\u044E\u0431\u0438\u0442\u044C: ["russian"], \u043B\u044E\u0431\u043E\u0439: ["russian"], \u043B\u044E\u0434\u0441\u043A\u043E\u0439: ["russian"], \u043B\u044E\u0441\u0442\u0440\u0430: ["russian"], \u043B\u044E\u0442\u044B\u0439: ["russian"], \u043B\u044F\u0433\u0443\u0448\u043A\u0430: ["russian"], \u043C\u0430\u0433\u0430\u0437\u0438\u043D: ["russian"], \u043C\u0430\u0433\u0438\u044F: ["russian"], \u043C\u0430\u0439\u043E\u0440: ["russian"], \u043C\u0430\u0439\u0441\u043A\u0438\u0439: ["russian"], \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C: ["russian"], \u043C\u0430\u043A\u0443\u0448\u043A\u0430: ["russian"], \u043C\u0430\u043B\u043E: ["russian"], \u043C\u0430\u043B\u044C\u0447\u0438\u043A: ["russian"], \u043C\u0430\u043C\u0430: ["russian"], \u043C\u0430\u043D\u0435\u0440\u0430: ["russian"], \u043C\u0430\u0440\u043A\u0430: ["russian"], \u043C\u0430\u0440\u0442: ["russian"], \u043C\u0430\u0440\u0448\u0440\u0443\u0442: ["russian"], \u043C\u0430\u0441\u0441\u0430: ["russian"], \u043C\u0430\u0441\u0442\u0435\u0440: ["russian"], \u043C\u0430\u0441\u0448\u0442\u0430\u0431: ["russian"], \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B: ["russian"], \u043C\u0430\u0442\u0447: ["russian"], \u043C\u0430\u0445\u0430\u0442\u044C: ["russian"], \u043C\u0430\u0448\u0438\u043D\u0430: ["russian"], \u043C\u0430\u044F\u043A: ["russian"], \u043C\u0435\u0431\u0435\u043B\u044C: ["russian"], \u043C\u0435\u0434\u0430\u043B\u044C: ["russian"], \u043C\u0435\u0434\u0432\u0435\u0434\u044C: ["russian"], \u043C\u0435\u0434\u0438\u0446\u0438\u043D\u0430: ["russian"], \u043C\u0435\u0434\u044C: ["russian"], \u043C\u0435\u0436\u0434\u0443: ["russian"], \u043C\u0435\u043B\u043A\u0438\u0439: ["russian"], \u043C\u0435\u043B\u043E\u0447\u044C: ["russian"], \u043C\u0435\u043C\u0443\u0430\u0440\u044B: ["russian"], \u043C\u0435\u043D\u044C\u0448\u0435: ["russian"], \u043C\u0435\u043D\u044E: ["russian"], \u043C\u0435\u043D\u044F\u0442\u044C: ["russian"], \u043C\u0435\u0440\u0430: ["russian"], \u043C\u0435\u0440\u0446\u0430\u0442\u044C: ["russian"], \u043C\u0435\u0441\u0442\u043E: ["russian"], \u043C\u0435\u0441\u044F\u0446: ["russian"], \u043C\u0435\u0442\u0430\u043B\u043B: ["russian"], \u043C\u0435\u0442\u043E\u0434: ["russian"], \u043C\u0435\u0442\u0440: ["russian"], \u043C\u0435\u0445\u0430\u043D\u0438\u0437\u043C: ["russian"], \u043C\u0435\u0445\u043E\u0432\u043E\u0439: ["russian"], \u043C\u0435\u0447\u0442\u0430\u0442\u044C: ["russian"], \u043C\u0435\u0448\u0430\u0442\u044C: ["russian"], \u043C\u0435\u0448\u043E\u043A: ["russian"], \u043C\u0438\u0433\u0440\u0430\u0446\u0438\u044F: ["russian"], \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D: ["russian"], \u043C\u0438\u043B\u0438\u0446\u0438\u044F: ["russian"], \u043C\u0438\u043B\u043B\u0438\u043E\u043D: ["russian"], \u043C\u0438\u043B\u043E\u0441\u0442\u044C: ["russian"], \u043C\u0438\u043B\u044F: ["russian"], \u043C\u0438\u043C\u043E: ["russian"], \u043C\u0438\u043D\u0435\u0440\u0430\u043B: ["russian"], \u043C\u0438\u043D\u0438\u0441\u0442\u0440: ["russian"], \u043C\u0438\u043D\u0443\u0442\u0430: ["russian"], \u043C\u0438\u0440\u043D\u044B\u0439: ["russian"], \u043C\u0438\u0441\u043A\u0430: ["russian"], \u043C\u0438\u0441\u0441\u0438\u044F: ["russian"], \u043C\u0438\u0442\u0438\u043D\u0433: ["russian"], \u043C\u0438\u0448\u0435\u043D\u044C: ["russian"], \u043C\u043B\u0430\u0434\u0448\u0438\u0439: ["russian"], \u043C\u043D\u0435\u043D\u0438\u0435: ["russian"], \u043C\u043D\u0438\u043C\u044B\u0439: ["russian"], \u043C\u043D\u043E\u0433\u043E: ["russian"], \u043C\u043E\u0433\u0443\u0447\u0438\u0439: ["russian"], \u043C\u043E\u0434\u0435\u043B\u044C: ["russian"], \u043C\u043E\u0436\u0435\u0442: ["russian"], \u043C\u043E\u0437\u0433: ["russian"], \u043C\u043E\u043A\u0440\u044B\u0439: ["russian"], \u043C\u043E\u043B\u0435\u043A\u0443\u043B\u0430: ["russian"], \u043C\u043E\u043B\u043D\u0438\u044F: ["russian"], \u043C\u043E\u043B\u043E\u0434\u043E\u0439: ["russian"], \u043C\u043E\u043B\u0447\u0430\u0442\u044C: ["russian"], \u043C\u043E\u043C\u0435\u043D\u0442: ["russian"], \u043C\u043E\u043D\u0435\u0442\u0430: ["russian"], \u043C\u043E\u043D\u0438\u0442\u043E\u0440: ["russian"], \u043C\u043E\u043D\u043E\u043B\u043E\u0433: ["russian"], \u043C\u043E\u043D\u0441\u0442\u0440: ["russian"], \u043C\u043E\u043D\u0442\u0430\u0436: ["russian"], \u043C\u043E\u0440\u0430\u043B\u044C: ["russian"], \u043C\u043E\u0440\u0435: ["russian"], \u043C\u043E\u0440\u043A\u043E\u0432\u044C: ["russian"], \u043C\u043E\u0440\u043E\u0437: ["russian"], \u043C\u043E\u0440\u0449\u0438\u043D\u0430: ["russian"], \u043C\u043E\u0441\u0442\u043E\u0432\u0430\u044F: ["russian"], \u043C\u043E\u0442\u0430\u0442\u044C: ["russian"], \u043C\u043E\u0442\u0438\u0432: ["russian"], \u043C\u043E\u0442\u043E\u0440: ["russian"], \u043C\u043E\u0445\u043D\u0430\u0442\u044B\u0439: ["russian"], \u043C\u0440\u0430\u043C\u043E\u0440: ["russian"], \u043C\u0440\u0430\u0447\u043D\u044B\u0439: ["russian"], \u043C\u0441\u0442\u0438\u0442\u044C: ["russian"], \u043C\u0443\u0434\u0440\u044B\u0439: ["russian"], \u043C\u0443\u0436\u0435\u0441\u0442\u0432\u043E: ["russian"], \u043C\u0443\u0436\u0447\u0438\u043D\u0430: ["russian"], \u043C\u0443\u0437\u0435\u0439: ["russian"], \u043C\u0443\u0437\u044B\u043A\u0430: ["russian"], \u043C\u0443\u043D\u0434\u0438\u0440: ["russian"], \u043C\u0443\u0440\u0430\u0432\u0435\u0439: ["russian"], \u043C\u0443\u0441\u043E\u0440: ["russian"], \u043C\u0443\u0445\u0430: ["russian"], \u043C\u0447\u0430\u0442\u044C\u0441\u044F: ["russian"], \u043C\u044B\u0441\u043B\u044C: ["russian"], \u043C\u044B\u0442\u044C\u0441\u044F: ["russian"], \u043C\u044B\u0448\u0446\u0430: ["russian"], \u043C\u044B\u0448\u044C: ["russian"], \u043C\u044E\u0437\u0438\u043A\u043B: ["russian"], \u043C\u044F\u0433\u043A\u0438\u0439: ["russian"], \u043C\u044F\u0441\u043E: ["russian"], \u043D\u0430\u0431\u043E\u0440: ["russian"], \u043D\u0430\u0432\u044B\u043A: ["russian"], \u043D\u0430\u0433\u043B\u044B\u0439: ["russian"], \u043D\u0430\u0433\u0440\u0443\u0437\u043A\u0430: ["russian"], \u043D\u0430\u0434\u0435\u0436\u0434\u0430: ["russian"], \u043D\u0430\u0434\u0437\u043E\u0440: ["russian"], \u043D\u0430\u0434\u043E: ["russian"], \u043D\u0430\u0435\u0434\u0438\u043D\u0435: ["russian"], \u043D\u0430\u0437\u0430\u0434: ["russian"], \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435: ["russian"], \u043D\u0430\u0437\u043B\u043E: ["russian"], \u043D\u0430\u0438\u0432\u043D\u044B\u0439: ["russian"], \u043D\u0430\u0439\u0442\u0438: ["russian"], \u043D\u0430\u043A\u043E\u043D\u0435\u0446: ["russian"], \u043D\u0430\u043B\u0435\u0432\u043E: ["russian"], \u043D\u0430\u043B\u0438\u0447\u0438\u0435: ["russian"], \u043D\u0430\u043B\u043E\u0433: ["russian"], \u043D\u0430\u043C\u0435\u0440\u0435\u043D: ["russian"], \u043D\u0430\u043D\u0435\u0441\u0442\u0438: ["russian"], \u043D\u0430\u043F\u0430\u0441\u0442\u044C: ["russian"], \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: ["russian"], \u043D\u0430\u0440\u043E\u0434: ["russian"], \u043D\u0430\u0441\u043B\u0435\u0434\u0438\u0435: ["russian"], \u043D\u0430\u0442\u0443\u0440\u0430: ["russian"], \u043D\u0430\u0443\u043A\u0430: ["russian"], \u043D\u0430\u0443\u0442\u0440\u043E: ["russian"], \u043D\u0430\u0447\u0430\u0442\u044C: ["russian"], \u043D\u0435\u0431\u043E: ["russian"], \u043D\u0435\u0432\u0430\u0436\u043D\u043E: ["russian"], \u043D\u0435\u0432\u0435\u0441\u0442\u0430: ["russian"], \u043D\u0435\u0433\u043E\u0434\u044F\u0439: ["russian"], \u043D\u0435\u0434\u0430\u0432\u043D\u043E: ["russian"], \u043D\u0435\u0434\u0435\u043B\u044F: ["russian"], \u043D\u0435\u0434\u043E\u043B\u0433\u043E: ["russian"], \u043D\u0435\u0434\u0440\u0430: ["russian"], \u043D\u0435\u0434\u0443\u0433: ["russian"], \u043D\u0435\u0436\u043D\u044B\u0439: ["russian"], \u043D\u0435\u0437\u0430\u0447\u0435\u043C: ["russian"], \u043D\u0435\u043A\u0442\u043E: ["russian"], \u043D\u0435\u043B\u0435\u043F\u044B\u0439: ["russian"], \u043D\u0435\u043B\u043E\u0432\u043A\u043E: ["russian"], \u043D\u0435\u043B\u044C\u0437\u044F: ["russian"], \u043D\u0435\u043C\u0430\u043B\u043E: ["russian"], \u043D\u0435\u043C\u043E\u0439: ["russian"], \u043D\u0435\u043F\u043B\u043E\u0445\u043E: ["russian"], \u043D\u0435\u0440\u0432\u043D\u044B\u0439: ["russian"], \u043D\u0435\u0440\u0435\u0434\u043A\u043E: ["russian"], \u043D\u0435\u0441\u0442\u0438\u0441\u044C: ["russian"], \u043D\u0435\u0443\u0434\u0430\u0447\u0430: ["russian"], \u043D\u0435\u0443\u0436\u0435\u043B\u0438: ["russian"], \u043D\u0435\u0444\u0442\u044C: ["russian"], \u043D\u0435\u044F\u0441\u043D\u044B\u0439: ["russian"], \u043D\u0438\u0433\u0434\u0435: ["russian"], \u043D\u0438\u0437\u043A\u0438\u0439: ["russian"], \u043D\u0438\u043A\u0430\u043A\u043E\u0439: ["russian"], \u043D\u0438\u043A\u043E\u0433\u0434\u0430: ["russian"], \u043D\u0438\u043A\u0443\u0434\u0430: ["russian"], \u043D\u0438\u0447\u0442\u043E: ["russian"], \u043D\u0438\u0447\u0443\u0442\u044C: ["russian"], \u043D\u0438\u0448\u0430: ["russian"], \u043D\u0438\u0449\u0438\u0439: ["russian"], \u043D\u043E\u0432\u043E\u0441\u0442\u044C: ["russian"], \u043D\u043E\u0432\u044B\u0439: ["russian"], \u043D\u043E\u0433\u0430: ["russian"], \u043D\u043E\u0433\u043E\u0442\u044C: ["russian"], \u043D\u043E\u0436\u043D\u0438\u0446\u044B: ["russian"], \u043D\u043E\u0437\u0434\u0440\u044F: ["russian"], \u043D\u043E\u043C\u0435\u0440: ["russian"], \u043D\u043E\u0441\u0438\u0442\u044C: ["russian"], \u043D\u043E\u0441\u043E\u043A: ["russian"], \u043D\u043E\u0447\u044C: ["russian"], \u043D\u043E\u044F\u0431\u0440\u044C: ["russian"], \u043D\u0440\u0430\u0432: ["russian"], \u043D\u0443\u043B\u044C: ["russian"], \u043D\u044B\u043D\u0447\u0435: ["russian"], \u043D\u044B\u0440\u044F\u0442\u044C: ["russian"], \u043D\u044E\u0430\u043D\u0441: ["russian"], \u043D\u044F\u043D\u044F: ["russian"], \u043E\u0431\u0430\u044F\u043D\u0438\u0435: ["russian"], \u043E\u0431\u0435\u0434: ["russian"], \u043E\u0431\u0435\u0437\u044C\u044F\u043D\u0430: ["russian"], \u043E\u0431\u0435\u0449\u0430\u0442\u044C: ["russian"], \u043E\u0431\u0436\u0435\u0447\u044C: ["russian"], \u043E\u0431\u0437\u043E\u0440: ["russian"], \u043E\u0431\u0438\u043B\u0438\u0435: ["russian"], \u043E\u0431\u0438\u0442\u0430\u0442\u044C: ["russian"], \u043E\u0431\u043B\u0430\u0441\u0442\u044C: ["russian"], \u043E\u0431\u043B\u0438\u043A: ["russian"], \u043E\u0431\u043B\u043E\u0436\u043A\u0430: ["russian"], \u043E\u0431\u043C\u0435\u043D: ["russian"], \u043E\u0431\u043C\u043E\u0440\u043E\u043A: ["russian"], \u043E\u0431\u043E\u0436\u0430\u0442\u044C: ["russian"], \u043E\u0431\u043E\u0438: ["russian"], \u043E\u0431\u043E\u043B\u043E\u0447\u043A\u0430: ["russian"], \u043E\u0431\u043E\u0440\u043E\u043D\u0430: ["russian"], \u043E\u0431\u043E\u0447\u0438\u043D\u0430: ["russian"], \u043E\u0431\u0440\u0430\u0437: ["russian"], \u043E\u0431\u0440\u0435\u0441\u0442\u0438: ["russian"], \u043E\u0431\u0440\u044B\u0432: ["russian"], \u043E\u0431\u0443\u0432\u044C: ["russian"], \u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435: ["russian"], \u043E\u0431\u0445\u043E\u0434: ["russian"], \u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E: ["russian"], \u043E\u0431\u0449\u0438\u0439: ["russian"], \u043E\u0431\u044A\u0435\u043A\u0442: ["russian"], \u043E\u0431\u044B\u0441\u043A: ["russian"], \u043E\u0431\u044B\u0447\u043D\u043E: ["russian"], \u043E\u0431\u044F\u0437\u0430\u0442\u044C: ["russian"], \u043E\u0432\u043E\u0449\u0438: ["russian"], \u043E\u0432\u0440\u0430\u0433: ["russian"], \u043E\u0432\u0446\u0430: ["russian"], \u043E\u0433\u043E\u0432\u043E\u0440\u043A\u0430: ["russian"], \u043E\u0433\u0440\u0430\u0434\u0430: ["russian"], \u043E\u0433\u0443\u0440\u0435\u0446: ["russian"], \u043E\u0434\u0435\u0436\u0434\u0430: ["russian"], \u043E\u0434\u0435\u044F\u043B\u043E: ["russian"], \u043E\u0434\u0438\u043D: ["russian"], \u043E\u0434\u043D\u0430\u043A\u043E: ["russian"], \u043E\u0434\u043E\u043B\u0435\u0442\u044C: ["russian"], \u043E\u0436\u0438\u0434\u0430\u0442\u044C: ["russian"], \u043E\u0437\u0435\u0440\u043E: ["russian"], \u043E\u043A\u0435\u0430\u043D: ["russian"], \u043E\u043A\u043D\u043E: ["russian"], \u043E\u043A\u043E\u043B\u043E: ["russian"], \u043E\u043A\u043E\u043F: ["russian"], \u043E\u043A\u0440\u0430\u0438\u043D\u0430: ["russian"], \u043E\u043A\u0442\u044F\u0431\u0440\u044C: ["russian"], \u043E\u043F\u0430\u0441\u043D\u044B\u0439: ["russian"], \u043E\u043F\u0435\u043A\u0430: ["russian"], \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F: ["russian"], \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435: ["russian"], \u043E\u043F\u043B\u0430\u0442\u0430: ["russian"], \u043E\u043F\u043E\u0440\u0430: ["russian"], \u043E\u043F\u043F\u043E\u043D\u0435\u043D\u0442: ["russian"], \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u043C: ["russian"], \u043E\u043F\u0442\u043E\u0432\u044B\u0439: ["russian"], \u043E\u043F\u0443\u0445\u043E\u043B\u044C: ["russian"], \u043E\u043F\u044B\u0442: ["russian"], \u043E\u0440\u0430\u0442\u043E\u0440: ["russian"], \u043E\u0440\u0431\u0438\u0442\u0430: ["russian"], \u043E\u0440\u0433\u0430\u043D: ["russian"], \u043E\u0440\u0434\u0435\u043D: ["russian"], \u043E\u0440\u0435\u043B: ["russian"], \u043E\u0440\u0438\u0433\u0438\u043D\u0430\u043B: ["russian"], \u043E\u0440\u0438\u0435\u043D\u0442\u0438\u0440: ["russian"], \u043E\u0440\u043A\u0435\u0441\u0442\u0440: ["russian"], \u043E\u0440\u0443\u0436\u0438\u0435: ["russian"], \u043E\u0441\u0435\u043D\u043D\u0438\u0439: ["russian"], \u043E\u0441\u043A\u043E\u043B\u043E\u043A: ["russian"], \u043E\u0441\u043C\u043E\u0442\u0440: ["russian"], \u043E\u0441\u0442\u0440\u043E\u0432: ["russian"], \u043E\u0442\u0431\u043E\u0440: ["russian"], \u043E\u0442\u0431\u044B\u0442\u044C: ["russian"], \u043E\u0442\u0432\u043B\u0435\u0447\u044C: ["russian"], \u043E\u0442\u0434\u0430\u0442\u044C: ["russian"], \u043E\u0442\u0434\u0435\u043B: ["russian"], \u043E\u0442\u0434\u044B\u0445: ["russian"], \u043E\u0442\u0435\u043B\u044C: ["russian"], \u043E\u0442\u0435\u0446: ["russian"], \u043E\u0442\u0437\u044B\u0432: ["russian"], \u043E\u0442\u043A\u0430\u0437: ["russian"], \u043E\u0442\u043A\u043B\u0438\u043A: ["russian"], \u043E\u0442\u043A\u0440\u044B\u0442\u044C: ["russian"], \u043E\u0442\u043A\u0443\u0434\u0430: ["russian"], \u043E\u0442\u043B\u0438\u0447\u0438\u0435: ["russian"], \u043E\u0442\u043D\u044B\u043D\u0435: ["russian"], \u043E\u0442\u043E\u0439\u0442\u0438: ["russian"], \u043E\u0442\u043F\u0443\u0441\u043A: ["russian"], \u043E\u0442\u0440\u0430\u0441\u043B\u044C: ["russian"], \u043E\u0442\u0440\u043E\u0441\u0442\u043E\u043A: ["russian"], \u043E\u0442\u0440\u044B\u0432\u043E\u043A: ["russian"], \u043E\u0442\u0440\u044F\u0434: ["russian"], \u043E\u0442\u0441\u0435\u043A: ["russian"], \u043E\u0442\u0441\u0442\u0430\u0432\u043A\u0430: ["russian"], \u043E\u0442\u0441\u044E\u0434\u0430: ["russian"], \u043E\u0442\u0442\u0435\u043D\u043E\u043A: ["russian"], \u043E\u0442\u0442\u043E\u0433\u043E: ["russian"], \u043E\u0442\u0447\u0435\u0433\u043E: ["russian"], \u043E\u0442\u044A\u0435\u0437\u0434: ["russian"], \u043E\u0444\u0438\u0441: ["russian"], \u043E\u0444\u0438\u0446\u0435\u0440: ["russian"], \u043E\u0445\u043E\u0442\u0430: ["russian"], \u043E\u0445\u0440\u0430\u043D\u0430: ["russian"], \u043E\u0446\u0435\u043D\u043A\u0430: ["russian"], \u043E\u0447\u0430\u0433: ["russian"], \u043E\u0447\u0435\u043D\u044C: ["russian"], \u043E\u0447\u0435\u0440\u0435\u0434\u044C: ["russian"], \u043E\u0447\u0438\u0449\u0430\u0442\u044C: ["russian"], \u043E\u0448\u0438\u0431\u043A\u0430: ["russian"], \u043E\u0449\u0443\u0449\u0435\u043D\u0438\u0435: ["russian"], \u043F\u0430\u0432\u0438\u043B\u044C\u043E\u043D: ["russian"], \u043F\u0430\u0434\u0430\u0442\u044C: ["russian"], \u043F\u0430\u0437\u0443\u0445\u0430: ["russian"], \u043F\u0430\u043A\u0435\u0442: ["russian"], \u043F\u0430\u043B\u0430\u0442\u0430: ["russian"], \u043F\u0430\u043B\u0435\u0446: ["russian"], \u043F\u0430\u043B\u0443\u0431\u0430: ["russian"], \u043F\u0430\u043B\u044C\u0442\u043E: ["russian"], \u043F\u0430\u043C\u044F\u0442\u044C: ["russian"], \u043F\u0430\u043D\u0435\u043B\u044C: ["russian"], \u043F\u0430\u043D\u0438\u043A\u0430: ["russian"], \u043F\u0430\u0440\u0430: ["russian"], \u043F\u0430\u0440\u0435\u043D\u044C: ["russian"], \u043F\u0430\u0440\u043E\u0445\u043E\u0434: ["russian"], \u043F\u0430\u0440\u0442\u0438\u044F: ["russian"], \u043F\u0430\u0440\u0443\u0441: ["russian"], \u043F\u0430\u0441\u043F\u043E\u0440\u0442: ["russian"], \u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440: ["russian"], \u043F\u0430\u0441\u0442\u0443\u0445: ["russian"], \u043F\u0430\u0442\u0435\u043D\u0442: ["russian"], \u043F\u0430\u0442\u0440\u043E\u043D: ["russian"], \u043F\u0430\u0443\u0437\u0430: ["russian"], \u043F\u0430\u0443\u043A: ["russian"], \u043F\u0430\u0443\u0442\u0438\u043D\u0430: ["russian"], \u043F\u0430\u0444\u043E\u0441: ["russian"], \u043F\u0430\u0445\u043D\u0443\u0442\u044C: ["russian"], \u043F\u0430\u0446\u0438\u0435\u043D\u0442: ["russian"], \u043F\u0430\u0447\u043A\u0430: ["russian"], \u043F\u0435\u0432\u0435\u0446: ["russian"], \u043F\u0435\u0434\u0430\u0433\u043E\u0433: ["russian"], \u043F\u0435\u0439\u0437\u0430\u0436: ["russian"], \u043F\u0435\u043D\u0441\u0438\u044F: ["russian"], \u043F\u0435\u043F\u0435\u043B: ["russian"], \u043F\u0435\u0440\u0432\u044B\u0439: ["russian"], \u043F\u0435\u0440\u0435\u0434: ["russian"], \u043F\u0435\u0440\u0438\u043E\u0434: ["russian"], \u043F\u0435\u0440\u043E: ["russian"], \u043F\u0435\u0440\u0440\u043E\u043D: ["russian"], \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u0436: ["russian"], \u043F\u0435\u0440\u0447\u0430\u0442\u043A\u0430: ["russian"], \u043F\u0435\u0441\u043D\u044F: ["russian"], \u043F\u0435\u0441\u043E\u043A: ["russian"], \u043F\u0435\u0442\u043B\u044F: ["russian"], \u043F\u0435\u0442\u0440\u0443\u0448\u043A\u0430: ["russian"], \u043F\u0435\u0442\u0443\u0445: ["russian"], \u043F\u0435\u0445\u043E\u0442\u0430: ["russian"], \u043F\u0435\u0447\u0430\u0442\u044C: ["russian"], \u043F\u0435\u0447\u0435\u043D\u044C: ["russian"], \u043F\u0435\u0448\u043A\u043E\u043C: ["russian"], \u043F\u0435\u0449\u0435\u0440\u0430: ["russian"], \u043F\u0438\u0430\u043D\u0438\u0441\u0442: ["russian"], \u043F\u0438\u0434\u0436\u0430\u043A: ["russian"], \u043F\u0438\u043B\u043E\u0442: ["russian"], \u043F\u0438\u043E\u043D\u0435\u0440: ["russian"], \u043F\u0438\u0440\u0430\u043C\u0438\u0434\u0430: ["russian"], \u043F\u0438\u0440\u043E\u0436\u043E\u043A: ["russian"], \u043F\u0438\u0441\u044C\u043C\u043E: ["russian"], \u043F\u0438\u0449\u0430: ["russian"], \u043F\u043B\u0430\u0432\u0430\u043D\u0438\u0435: ["russian"], \u043F\u043B\u0430\u043A\u0430\u0442\u044C: ["russian"], \u043F\u043B\u0430\u043C\u044F: ["russian"], \u043F\u043B\u0430\u043D: ["russian"], \u043F\u043B\u0430\u0441\u0442: ["russian"], \u043F\u043B\u0430\u0442\u0438\u0442\u044C: ["russian"], \u043F\u043B\u0435\u043D\u043D\u044B\u0439: ["russian"], \u043F\u043B\u0435\u0447\u043E: ["russian"], \u043F\u043B\u0438\u0442\u0430: ["russian"], \u043F\u043B\u043E\u0434: ["russian"], \u043F\u043B\u043E\u0441\u043A\u0438\u0439: ["russian"], \u043F\u043B\u043E\u0442\u043D\u044B\u0439: ["russian"], \u043F\u043B\u043E\u0445\u043E\u0439: ["russian"], \u043F\u043B\u043E\u0449\u0430\u0434\u044C: ["russian"], \u043F\u043B\u044B\u0442\u044C: ["russian"], \u043F\u043B\u044E\u0441: ["russian"], \u043F\u043B\u044F\u0436: ["russian"], \u043F\u043B\u044F\u0441\u0430\u0442\u044C: ["russian"], \u043F\u043E\u0431\u0435\u0434\u0430: ["russian"], \u043F\u043E\u0432\u0430\u0440: ["russian"], \u043F\u043E\u0432\u043E\u0434: ["russian"], \u043F\u043E\u0432\u0441\u044E\u0434\u0443: ["russian"], \u043F\u043E\u0432\u044F\u0437\u043A\u0430: ["russian"], \u043F\u043E\u0433\u043E\u0434\u0430: ["russian"], \u043F\u043E\u0433\u0440\u0435\u0431: ["russian"], \u043F\u043E\u0434\u0431\u043E\u0440: ["russian"], \u043F\u043E\u0434\u0432\u0438\u0433: ["russian"], \u043F\u043E\u0434\u0434\u0435\u043B\u043A\u0430: ["russian"], \u043F\u043E\u0434\u0436\u0430\u0442\u044C: ["russian"], \u043F\u043E\u0434\u043D\u043E\u0441: ["russian"], \u043F\u043E\u0434\u043F\u0438\u0441\u044C: ["russian"], \u043F\u043E\u0434\u0440\u0443\u0433\u0430: ["russian"], \u043F\u043E\u0434\u0445\u043E\u0434: ["russian"], \u043F\u043E\u0434\u0447\u0430\u0441: ["russian"], \u043F\u043E\u0434\u044A\u0435\u0437\u0434: ["russian"], \u043F\u043E\u0435\u0434\u0438\u043D\u043E\u043A: ["russian"], \u043F\u043E\u0435\u0437\u0434: ["russian"], \u043F\u043E\u0435\u0441\u0442\u044C: ["russian"], \u043F\u043E\u0435\u0445\u0430\u0442\u044C: ["russian"], \u043F\u043E\u0436\u0430\u043B\u0443\u0439: ["russian"], \u043F\u043E\u0436\u0438\u043B\u043E\u0439: ["russian"], \u043F\u043E\u0437\u0430\u0434\u0438: ["russian"], \u043F\u043E\u0437\u0432\u0430\u0442\u044C: ["russian"], \u043F\u043E\u0437\u0434\u043D\u0438\u0439: ["russian"], \u043F\u043E\u0437\u0438\u0446\u0438\u044F: ["russian"], \u043F\u043E\u0437\u043E\u0440: ["russian"], \u043F\u043E\u0438\u0441\u043A: ["russian"], \u043F\u043E\u0439\u043C\u0430\u0442\u044C: ["russian"], \u043F\u043E\u0439\u0442\u0438: ["russian"], \u043F\u043E\u043A\u043B\u043E\u043D: ["russian"], \u043F\u043E\u043A\u043E\u0439: ["russian"], \u043F\u043E\u043A\u0440\u044B\u0442\u044C: ["russian"], \u043F\u043E\u043B\u0434\u0435\u043D\u044C: ["russian"], \u043F\u043E\u043B\u0435\u0437\u043D\u044B\u0439: ["russian"], \u043F\u043E\u043B\u0437\u0442\u0438: ["russian"], \u043F\u043E\u043B\u043A: ["russian"], \u043F\u043E\u043B\u043D\u044B\u0439: ["russian"], \u043F\u043E\u043B\u043E\u0432\u0438\u043D\u0430: ["russian"], \u043F\u043E\u043B\u0442\u043E\u0440\u0430: ["russian"], \u043F\u043E\u043B\u044C\u0437\u0430: ["russian"], \u043F\u043E\u043B\u044F\u043D\u0430: ["russian"], \u043F\u043E\u043C\u0438\u0434\u043E\u0440: ["russian"], \u043F\u043E\u043C\u043D\u0438\u0442\u044C: ["russian"], \u043F\u043E\u043C\u043E\u0449\u044C: ["russian"], \u043F\u043E\u043F\u0430\u0441\u0442\u044C: ["russian"], \u043F\u043E\u043F\u0435\u0440\u0435\u043A: ["russian"], \u043F\u043E\u043F\u043B\u044B\u0442\u044C: ["russian"], \u043F\u043E\u043F\u043E\u043B\u0430\u043C: ["russian"], \u043F\u043E\u043F\u0440\u0430\u0432\u043A\u0430: ["russian"], \u043F\u043E\u043F\u0443\u0433\u0430\u0439: ["russian"], \u043F\u043E\u043F\u044B\u0442\u043A\u0430: ["russian"], \u043F\u043E\u0440\u043E\u0433: ["russian"], \u043F\u043E\u0440\u0442\u0440\u0435\u0442: ["russian"], \u043F\u043E\u0440\u0446\u0438\u044F: ["russian"], \u043F\u043E\u0440\u044B\u0432: ["russian"], \u043F\u043E\u0440\u044F\u0434\u043E\u043A: ["russian"], \u043F\u043E\u0441\u043B\u0435: ["russian"], \u043F\u043E\u0441\u043E\u043B: ["russian"], \u043F\u043E\u0441\u0440\u0435\u0434\u0438: ["russian"], \u043F\u043E\u0441\u0442\u0435\u043B\u044C: ["russian"], \u043F\u043E\u0441\u0443\u0434\u0430: ["russian"], \u043F\u043E\u0442\u043E\u043C: ["russian"], \u043F\u043E\u0445\u0432\u0430\u043B\u0430: ["russian"], \u043F\u043E\u0445\u043E\u0436\u0438\u0439: ["russian"], \u043F\u043E\u0446\u0435\u043B\u0443\u0439: ["russian"], \u043F\u043E\u0447\u0432\u0430: ["russian"], \u043F\u043E\u0447\u0435\u043C\u0443: ["russian"], \u043F\u043E\u0448\u043B\u0438\u043D\u0430: ["russian"], \u043F\u043E\u044D\u043C\u0430: ["russian"], \u043F\u043E\u044D\u0442\u043E\u043C\u0443: ["russian"], \u043F\u0440\u0430\u0432\u043E: ["russian"], \u043F\u0440\u0430\u0437\u0434\u043D\u0438\u043A: ["russian"], \u043F\u0440\u0430\u043A\u0442\u0438\u043A\u0430: ["russian"], \u043F\u0440\u0430\u0445: ["russian"], \u043F\u0440\u0435\u0433\u0440\u0430\u0434\u0430: ["russian"], \u043F\u0440\u0435\u0434\u043C\u0435\u0442: ["russian"], \u043F\u0440\u0435\u0436\u0434\u0435: ["russian"], \u043F\u0440\u0435\u043B\u0435\u0441\u0442\u044C: ["russian"], \u043F\u0440\u0435\u043C\u0438\u044F: ["russian"], \u043F\u0440\u0435\u043F\u0430\u0440\u0430\u0442: ["russian"], \u043F\u0440\u0435\u0441\u0441\u0430: ["russian"], \u043F\u0440\u0438\u0431\u044B\u0442\u044C: ["russian"], \u043F\u0440\u0438\u0436\u0430\u0442\u044C: ["russian"], \u043F\u0440\u0438\u0439\u0442\u0438: ["russian"], \u043F\u0440\u0438\u043A\u0430\u0437: ["russian"], \u043F\u0440\u0438\u043B\u0430\u0432\u043E\u043A: ["russian"], \u043F\u0440\u0438\u043C\u0435\u0440: ["russian"], \u043F\u0440\u0438\u043D\u044F\u0442\u044C: ["russian"], \u043F\u0440\u0438\u0440\u043E\u0434\u0430: ["russian"], \u043F\u0440\u0438\u0442\u043E\u043C: ["russian"], \u043F\u0440\u0438\u0445\u043E\u0436\u0430\u044F: ["russian"], \u043F\u0440\u0438\u0446\u0435\u043B: ["russian"], \u043F\u0440\u0438\u0447\u0438\u043D\u0430: ["russian"], \u043F\u0440\u0438\u044E\u0442: ["russian"], \u043F\u0440\u043E\u0433\u043D\u043E\u0437: ["russian"], \u043F\u0440\u043E\u0434\u0443\u043A\u0442: ["russian"], \u043F\u0440\u043E\u0435\u043A\u0442: ["russian"], \u043F\u0440\u043E\u0436\u0438\u0442\u044C: ["russian"], \u043F\u0440\u043E\u043A\u0430\u0442: ["russian"], \u043F\u0440\u043E\u043C\u044B\u0441\u0435\u043B: ["russian"], \u043F\u0440\u043E\u043F\u0443\u0441\u043A: ["russian"], \u043F\u0440\u043E\u0441\u0442\u043E: ["russian"], \u043F\u0440\u043E\u0442\u0438\u0432: ["russian"], \u043F\u0440\u043E\u0444\u0438\u043B\u044C: ["russian"], \u043F\u0440\u043E\u0446\u0435\u0441\u0441: ["russian"], \u043F\u0440\u043E\u0447\u0438\u0439: ["russian"], \u043F\u0440\u043E\u0448\u043B\u044B\u0439: ["russian"], \u043F\u0440\u043E\u0449\u0430\u0442\u044C: ["russian"], \u043F\u0440\u0443\u0436\u0438\u043D\u0430: ["russian"], \u043F\u0440\u0443\u0442: ["russian"], \u043F\u0440\u044B\u0436\u043E\u043A: ["russian"], \u043F\u0440\u044F\u043C\u043E\u0439: ["russian"], \u043F\u0442\u0438\u0446\u0430: ["russian"], \u043F\u0443\u0431\u043B\u0438\u043A\u0430: ["russian"], \u043F\u0443\u0433\u0430\u0442\u044C: ["russian"], \u043F\u0443\u0433\u043E\u0432\u0438\u0446\u0430: ["russian"], \u043F\u0443\u0437\u044B\u0440\u044C: ["russian"], \u043F\u0443\u043B\u044C\u0442: ["russian"], \u043F\u0443\u043B\u044F: ["russian"], \u043F\u0443\u043D\u043A\u0442: ["russian"], \u043F\u0443\u0441\u043A\u0430\u0442\u044C: ["russian"], \u043F\u0443\u0441\u0442\u043E\u0439: ["russian"], \u043F\u0443\u0442\u044C: ["russian"], \u043F\u0443\u0445\u043B\u044B\u0439: ["russian"], \u043F\u0443\u0447\u043E\u043A: ["russian"], \u043F\u0443\u0448\u0438\u0441\u0442\u044B\u0439: ["russian"], \u043F\u0443\u0448\u043A\u0430: ["russian"], \u043F\u0447\u0435\u043B\u0430: ["russian"], \u043F\u0448\u0435\u043D\u0438\u0446\u0430: ["russian"], \u043F\u044B\u043B\u0430\u0442\u044C: ["russian"], \u043F\u044B\u043B\u044C: ["russian"], \u043F\u044B\u0448\u043D\u044B\u0439: ["russian"], \u043F\u044C\u0435\u0441\u0430: ["russian"], \u043F\u044F\u0442\u043A\u0430: ["russian"], \u043F\u044F\u0442\u043D\u043E: ["russian"], \u043F\u044F\u0442\u044B\u0439: ["russian"], \u043F\u044F\u0442\u044C\u0441\u043E\u0442: ["russian"], \u0440\u0430\u0431\u043E\u0442\u0430: ["russian"], \u0440\u0430\u0432\u043D\u0438\u043D\u0430: ["russian"], \u0440\u0430\u0434\u0438: ["russian"], \u0440\u0430\u0434\u043E\u0441\u0442\u044C: ["russian"], \u0440\u0430\u0434\u0443\u0433\u0430: ["russian"], \u0440\u0430\u0437\u0431\u0438\u0442\u044C: ["russian"], \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435: ["russian"], \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440: ["russian"], \u0440\u0430\u0437\u0434\u0435\u043B: ["russian"], \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0435: ["russian"], \u0440\u0430\u0437\u043C\u0435\u0440: ["russian"], \u0440\u0430\u0437\u043D\u044B\u0439: ["russian"], \u0440\u0430\u0437\u0440\u044B\u0432: ["russian"], \u0440\u0430\u0437\u0443\u043C: ["russian"], \u0440\u0430\u0439\u043E\u043D: ["russian"], \u0440\u0430\u043A\u0435\u0442\u0430: ["russian"], \u0440\u0430\u043A\u043E\u0432\u0438\u043D\u0430: ["russian"], \u0440\u0430\u043C\u043A\u0430: ["russian"], \u0440\u0430\u043D\u043E: ["russian"], \u0440\u0430\u043F\u043E\u0440\u0442: ["russian"], \u0440\u0430\u0441\u043F\u0430\u0434: ["russian"], \u0440\u0430\u0441\u0441\u043A\u0430\u0437: ["russian"], \u0440\u0430\u0441\u0442\u0438: ["russian"], \u0440\u0430\u0441\u0445\u043E\u0434: ["russian"], \u0440\u0430\u0441\u0446\u0432\u0435\u0442: ["russian"], \u0440\u0430\u0446\u0438\u044F: ["russian"], \u0440\u0432\u0430\u043D\u0443\u0442\u044C: ["russian"], \u0440\u0432\u0430\u0442\u044C\u0441\u044F: ["russian"], \u0440\u0435\u0430\u043A\u0446\u0438\u044F: ["russian"], \u0440\u0435\u0431\u0440\u043E: ["russian"], \u0440\u0435\u0432\u0435\u0442\u044C: ["russian"], \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440: ["russian"], \u0440\u0435\u0434\u043A\u0438\u0439: ["russian"], \u0440\u0435\u0435\u0441\u0442\u0440: ["russian"], \u0440\u0435\u0436\u0438\u043C: ["russian"], \u0440\u0435\u0437\u0430\u0442\u044C: ["russian"], \u0440\u0435\u0437\u0435\u0440\u0432: ["russian"], \u0440\u0435\u0437\u0438\u043D\u0430: ["russian"], \u0440\u0435\u0437\u043A\u043E: ["russian"], \u0440\u0435\u0437\u043D\u043E\u0439: ["russian"], \u0440\u0435\u0439\u0441: ["russian"], \u0440\u0435\u043A\u043B\u0430\u043C\u0430: ["russian"], \u0440\u0435\u043A\u043E\u0440\u0434: ["russian"], \u0440\u0435\u043B\u0438\u0433\u0438\u044F: ["russian"], \u0440\u0435\u043B\u044C\u0441: ["russian"], \u0440\u0435\u043C\u0435\u043D\u044C: ["russian"], \u0440\u0435\u043C\u043E\u043D\u0442: ["russian"], \u0440\u0435\u043F\u043B\u0438\u043A\u0430: ["russian"], \u0440\u0435\u043F\u043E\u0440\u0442\u0430\u0436: ["russian"], \u0440\u0435\u0441\u043D\u0438\u0446\u0430: ["russian"], \u0440\u0435\u0441\u0442\u043E\u0440\u0430\u043D: ["russian"], \u0440\u0435\u0444\u043E\u0440\u043C\u0430: ["russian"], \u0440\u0435\u0446\u0435\u043F\u0442: ["russian"], \u0440\u0435\u0447\u044C: ["russian"], \u0440\u0435\u0448\u0435\u043D\u0438\u0435: ["russian"], \u0440\u0436\u0430\u0432\u044B\u0439: ["russian"], \u0440\u0438\u0441\u043A: ["russian"], \u0440\u0438\u0441\u0443\u043D\u043E\u043A: ["russian"], \u0440\u0438\u0442\u0443\u0430\u043B: ["russian"], \u0440\u0438\u0444\u043C\u0430: ["russian"], \u0440\u043E\u0431\u043A\u043E: ["russian"], \u0440\u043E\u0431\u043E\u0442: ["russian"], \u0440\u043E\u0432\u0435\u0441\u043D\u0438\u043A: ["russian"], \u0440\u043E\u0432\u043D\u043E: ["russian"], \u0440\u043E\u0434\u043D\u043E\u0439: ["russian"], \u0440\u043E\u0436\u0434\u0435\u043D\u0438\u0435: ["russian"], \u0440\u043E\u0437\u0430: ["russian"], \u0440\u043E\u0437\u043E\u0432\u044B\u0439: ["russian"], \u0440\u043E\u0437\u044B\u0441\u043A: ["russian"], \u0440\u043E\u043B\u044C: ["russian"], \u0440\u043E\u043C\u0430\u043D: ["russian"], \u0440\u043E\u0441\u043A\u043E\u0448\u044C: ["russian"], \u0440\u043E\u0441\u043F\u0438\u0441\u044C: ["russian"], \u0440\u043E\u0441\u0442: ["russian"], \u0440\u0443\u0431\u0430\u0448\u043A\u0430: ["russian"], \u0440\u0443\u0431\u0435\u0436: ["russian"], \u0440\u0443\u0431\u0438\u0442\u044C: ["russian"], \u0440\u0443\u0431\u0440\u0438\u043A\u0430: ["russian"], \u0440\u0443\u0434\u043D\u0438\u043A: ["russian"], \u0440\u0443\u043A\u0430: ["russian"], \u0440\u0443\u043A\u043E\u043F\u0438\u0441\u044C: ["russian"], \u0440\u0443\u043C\u044F\u043D\u044B\u0439: ["russian"], \u0440\u0443\u0441\u043B\u043E: ["russian"], \u0440\u0443\u0445\u043D\u0443\u0442\u044C: ["russian"], \u0440\u0443\u0447\u0435\u0439: ["russian"], \u0440\u0443\u0447\u043D\u043E\u0439: ["russian"], \u0440\u044B\u0431\u0430: ["russian"], \u0440\u044B\u0436\u0438\u0439: ["russian"], \u0440\u044B\u043D\u043E\u043A: ["russian"], \u0440\u044B\u0445\u043B\u044B\u0439: ["russian"], \u0440\u044B\u0446\u0430\u0440\u044C: ["russian"], \u0440\u044B\u0447\u0430\u0433: ["russian"], \u0440\u044E\u043A\u0437\u0430\u043A: ["russian"], \u0440\u044F\u0434\u043E\u043C: ["russian"], \u0441\u0430\u0434\u043E\u0432\u044B\u0439: ["russian"], \u0441\u0430\u0436\u0430\u0442\u044C: ["russian"], \u0441\u0430\u043B\u043E\u043D: ["russian"], \u0441\u0430\u043B\u0444\u0435\u0442\u043A\u0430: ["russian"], \u0441\u0430\u043B\u044E\u0442: ["russian"], \u0441\u0430\u043C\u0435\u0446: ["russian"], \u0441\u0430\u043C\u043E\u0432\u0430\u0440: ["russian"], \u0441\u0430\u043C\u044B\u0439: ["russian"], \u0441\u0430\u043D\u0438: ["russian"], \u0441\u0430\u043D\u043A\u0446\u0438\u044F: ["russian"], \u0441\u0430\u043F\u043E\u0433: ["russian"], \u0441\u0430\u0440\u0430\u0439: ["russian"], \u0441\u0430\u0442\u0438\u0440\u0430: ["russian"], \u0441\u0430\u0445\u0430\u0440: ["russian"], \u0441\u0431\u0438\u0442\u044C: ["russian"], \u0441\u0431\u043E\u043A\u0443: ["russian"], \u0441\u0431\u043E\u0440\u043D\u0430\u044F: ["russian"], \u0441\u0431\u044B\u0442: ["russian"], \u0441\u0432\u0430\u0434\u044C\u0431\u0430: ["russian"], \u0441\u0432\u0430\u043B\u043A\u0430: ["russian"], \u0441\u0432\u0430\u0440\u0438\u0442\u044C: ["russian"], \u0441\u0432\u0435\u0436\u0438\u0439: ["russian"], \u0441\u0432\u0435\u0440\u0445\u0443: ["russian"], \u0441\u0432\u0435\u0442: ["russian"], \u0441\u0432\u0435\u0447\u0430: ["russian"], \u0441\u0432\u0438\u043D\u044C\u044F: ["russian"], \u0441\u0432\u0438\u0441\u0442: ["russian"], \u0441\u0432\u0438\u0442\u0435\u0440: ["russian"], \u0441\u0432\u043E\u0431\u043E\u0434\u0430: ["russian"], \u0441\u0432\u043E\u0434\u043A\u0430: ["russian"], \u0441\u0432\u043E\u0439: ["russian"], \u0441\u0432\u044B\u0448\u0435: ["russian"], \u0441\u0432\u044F\u0437\u044C: ["russian"], \u0441\u0434\u0430\u0442\u044C\u0441\u044F: ["russian"], \u0441\u0434\u0435\u043B\u0430\u0442\u044C: ["russian"], \u0441\u0435\u0433\u043C\u0435\u043D\u0442: ["russian"], \u0441\u0435\u0433\u043E\u0434\u043D\u044F: ["russian"], \u0441\u0435\u0434\u043B\u043E: ["russian"], \u0441\u0435\u0434\u043E\u0439: ["russian"], \u0441\u0435\u0434\u044C\u043C\u043E\u0439: ["russian"], \u0441\u0435\u0437\u043E\u043D: ["russian"], \u0441\u0435\u0439\u0444: ["russian"], \u0441\u0435\u0439\u0447\u0430\u0441: ["russian"], \u0441\u0435\u043A\u0440\u0435\u0442: ["russian"], \u0441\u0435\u043A\u0442\u043E\u0440: ["russian"], \u0441\u0435\u043A\u0443\u043D\u0434\u0430: ["russian"], \u0441\u0435\u043C\u0438\u043D\u0430\u0440: ["russian"], \u0441\u0435\u043C\u044C\u044F: ["russian"], \u0441\u0435\u043D\u0430\u0442\u043E\u0440: ["russian"], \u0441\u0435\u043D\u043E: ["russian"], \u0441\u0435\u043D\u0441\u0430\u0446\u0438\u044F: ["russian"], \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C: ["russian"], \u0441\u0435\u0440\u0432\u0438\u0441: ["russian"], \u0441\u0435\u0440\u0434\u0446\u0435: ["russian"], \u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0430: ["russian"], \u0441\u0435\u0440\u0436\u0430\u043D\u0442: ["russian"], \u0441\u0435\u0440\u0438\u044F: ["russian"], \u0441\u0435\u0440\u044B\u0439: ["russian"], \u0441\u0435\u0441\u0441\u0438\u044F: ["russian"], \u0441\u0435\u0441\u0442\u044C: ["russian"], \u0441\u0435\u0442\u0435\u0432\u043E\u0439: ["russian"], \u0441\u0436\u0430\u0442\u044B\u0439: ["russian"], \u0441\u0436\u0435\u0447\u044C: ["russian"], \u0441\u0437\u0430\u0434\u0438: ["russian"], \u0441\u0438\u0433\u043D\u0430\u043B: ["russian"], \u0441\u0438\u0434\u0435\u043D\u044C\u0435: ["russian"], \u0441\u0438\u043B\u0430: ["russian"], \u0441\u0438\u043B\u0443\u044D\u0442: ["russian"], \u0441\u0438\u043B\u044C\u043D\u044B\u0439: ["russian"], \u0441\u0438\u043C\u0432\u043E\u043B: ["russian"], \u0441\u0438\u043C\u043F\u0430\u0442\u0438\u044F: ["russian"], \u0441\u0438\u043C\u0444\u043E\u043D\u0438\u044F: ["russian"], \u0441\u0438\u043D\u0438\u0439: ["russian"], \u0441\u0438\u043D\u0442\u0435\u0437: ["russian"], \u0441\u0438\u043D\u044F\u043A: ["russian"], \u0441\u0438\u0440\u0435\u043D\u044C: ["russian"], \u0441\u0438\u0441\u0442\u0435\u043C\u0430: ["russian"], \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044F: ["russian"], \u0441\u0438\u044F\u043D\u0438\u0435: ["russian"], \u0441\u043A\u0430\u0437\u0430\u0442\u044C: ["russian"], \u0441\u043A\u0430\u043B\u0430: ["russian"], \u0441\u043A\u0430\u043C\u0435\u0439\u043A\u0430: ["russian"], \u0441\u043A\u0430\u043D\u0434\u0430\u043B: ["russian"], \u0441\u043A\u0430\u0442\u0435\u0440\u0442\u044C: ["russian"], \u0441\u043A\u0430\u0447\u043E\u043A: ["russian"], \u0441\u043A\u0432\u0430\u0436\u0438\u043D\u0430: ["russian"], \u0441\u043A\u0432\u0435\u0440: ["russian"], \u0441\u043A\u0432\u043E\u0437\u044C: ["russian"], \u0441\u043A\u0435\u043B\u0435\u0442: ["russian"], \u0441\u043A\u0438\u0434\u043A\u0430: ["russian"], \u0441\u043A\u043B\u0430\u0434: ["russian"], \u0441\u043A\u043E\u043B\u044C\u043A\u043E: ["russian"], \u0441\u043A\u043E\u0440\u044B\u0439: ["russian"], \u0441\u043A\u043E\u0441\u0438\u0442\u044C: ["russian"], \u0441\u043A\u043E\u0442: ["russian"], \u0441\u043A\u0440\u0438\u043F\u043A\u0430: ["russian"], \u0441\u043A\u0443\u0434\u043D\u044B\u0439: ["russian"], \u0441\u043A\u0443\u043A\u0430: ["russian"], \u0441\u043B\u0430\u0431\u044B\u0439: ["russian"], \u0441\u043B\u0430\u0432\u0430: ["russian"], \u0441\u043B\u0430\u0434\u043A\u0438\u0439: ["russian"], \u0441\u043B\u0435\u0433\u043A\u0430: ["russian"], \u0441\u043B\u0435\u0434: ["russian"], \u0441\u043B\u0435\u0437\u0430: ["russian"], \u0441\u043B\u0435\u043F\u043E\u0439: ["russian"], \u0441\u043B\u0435\u0441\u0430\u0440\u044C: ["russian"], \u0441\u043B\u0438\u0448\u043A\u043E\u043C: ["russian"], \u0441\u043B\u043E\u0432\u043E: ["russian"], \u0441\u043B\u043E\u0433: ["russian"], \u0441\u043B\u043E\u0436\u043D\u044B\u0439: ["russian"], \u0441\u043B\u043E\u043C\u0430\u0442\u044C: ["russian"], \u0441\u043B\u0443\u0436\u0431\u0430: ["russian"], \u0441\u043B\u0443\u0445: ["russian"], \u0441\u043B\u0443\u0447\u0430\u0439: ["russian"], \u0441\u043B\u044B\u0448\u0430\u0442\u044C: ["russian"], \u0441\u043B\u044E\u043D\u0430: ["russian"], \u0441\u043C\u0435\u0436\u043D\u044B\u0439: ["russian"], \u0441\u043C\u0435\u043B\u044B\u0439: ["russian"], \u0441\u043C\u0435\u043D\u0438\u0442\u044C: ["russian"], \u0441\u043C\u0435\u0441\u044C: ["russian"], \u0441\u043C\u0435\u0442\u0430\u043D\u0430: ["russian"], \u0441\u043C\u0435\u0445: ["russian"], \u0441\u043C\u043E\u043B\u0430: ["russian"], \u0441\u043C\u0443\u0433\u043B\u044B\u0439: ["russian"], \u0441\u043C\u0443\u0442\u043D\u044B\u0439: ["russian"], \u0441\u043C\u0443\u0449\u0430\u0442\u044C: ["russian"], \u0441\u043C\u044B\u0441\u043B: ["russian"], \u0441\u043D\u0430\u0439\u043F\u0435\u0440: ["russian"], \u0441\u043D\u0430\u0440\u044F\u0434: ["russian"], \u0441\u043D\u0430\u0447\u0430\u043B\u0430: ["russian"], \u0441\u043D\u0435\u0433: ["russian"], \u0441\u043D\u0438\u0437\u0443: ["russian"], \u0441\u043D\u0438\u0442\u044C\u0441\u044F: ["russian"], "\u0441\u043D\u043E\uFFFD\uFFFD\u0430": ["russian"], \u0441\u043D\u044F\u0442\u044C: ["russian"], \u0441\u043E\u0431\u0430\u043A\u0430: ["russian"], \u0441\u043E\u0431\u043B\u0430\u0437\u043D: ["russian"], \u0441\u043E\u0431\u0440\u0430\u043D\u0438\u0435: ["russian"], \u0441\u043E\u0431\u044B\u0442\u0438\u0435: ["russian"], \u0441\u043E\u0432\u0435\u0441\u0442\u044C: ["russian"], \u0441\u043E\u0432\u0441\u0435\u043C: ["russian"], \u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0435: ["russian"], \u0441\u043E\u0437\u0434\u0430\u0442\u044C: ["russian"], \u0441\u043E\u0437\u043D\u0430\u043D\u0438\u0435: ["russian"], \u0441\u043E\u0437\u0440\u0435\u0442\u044C: ["russian"], \u0441\u043E\u0439\u0442\u0438\u0441\u044C: ["russian"], \u0441\u043E\u043A\u043E\u043B: ["russian"], \u0441\u043E\u043B\u0434\u0430\u0442: ["russian"], \u0441\u043E\u043B\u0435\u043D\u044B\u0439: ["russian"], \u0441\u043E\u043B\u043D\u0446\u0435: ["russian"], \u0441\u043E\u043B\u043E\u043C\u0430: ["russian"], \u0441\u043E\u043C\u043D\u0435\u043D\u0438\u0435: ["russian"], \u0441\u043E\u043D\u043D\u044B\u0439: ["russian"], \u0441\u043E\u043F\u0435\u0440\u043D\u0438\u043A: ["russian"], \u0441\u043E\u0440\u0430\u0442\u043D\u0438\u043A: ["russian"], \u0441\u043E\u0440\u0432\u0430\u0442\u044C: ["russian"], \u0441\u043E\u0441\u0435\u0434: ["russian"], \u0441\u043E\u0441\u0438\u0441\u043A\u0430: ["russian"], \u0441\u043E\u0441\u0442\u0430\u0432: ["russian"], \u0441\u043E\u0442\u043D\u044F: ["russian"], \u0441\u043E\u0443\u0441: ["russian"], \u0441\u043E\u044E\u0437: ["russian"], \u0441\u043F\u0430\u0434: ["russian"], \u0441\u043F\u0430\u043B\u044C\u043D\u044F: ["russian"], \u0441\u043F\u0430\u0441\u0442\u0438: ["russian"], \u0441\u043F\u0435\u043A\u0442\u0440: ["russian"], \u0441\u043F\u0435\u0440\u0432\u0430: ["russian"], \u0441\u043F\u0435\u0448\u0438\u0442\u044C: ["russian"], \u0441\u043F\u0438\u043D\u0430: ["russian"], \u0441\u043F\u0438\u0440\u0442: ["russian"], \u0441\u043F\u0438\u0441\u043E\u043A: ["russian"], \u0441\u043F\u0438\u0447\u043A\u0430: ["russian"], \u0441\u043F\u043B\u0430\u0432: ["russian"], \u0441\u043F\u043E\u043D\u0441\u043E\u0440: ["russian"], \u0441\u043F\u043E\u0440: ["russian"], \u0441\u043F\u043E\u0441\u043E\u0431: ["russian"], \u0441\u043F\u0440\u0430\u0432\u043A\u0430: ["russian"], \u0441\u043F\u0443\u0441\u0442\u044F: ["russian"], \u0441\u043F\u0443\u0442\u043D\u0438\u043A: ["russian"], \u0441\u0440\u0430\u0437\u0443: ["russian"], \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E: ["russian"], \u0441\u0440\u043E\u043A: ["russian"], \u0441\u0440\u044B\u0432: ["russian"], \u0441\u0441\u043E\u0440\u0430: ["russian"], \u0441\u0441\u044B\u043B\u043A\u0430: ["russian"], \u0441\u0442\u0430\u0432\u0438\u0442\u044C: ["russian"], \u0441\u0442\u0430\u0434\u0438\u044F: ["russian"], \u0441\u0442\u0430\u043A\u0430\u043D: ["russian"], \u0441\u0442\u0430\u043D\u0446\u0438\u044F: ["russian"], \u0441\u0442\u0430\u0440\u044B\u0439: ["russian"], \u0441\u0442\u0430\u044F: ["russian"], \u0441\u0442\u0435\u0431\u0435\u043B\u044C: ["russian"], \u0441\u0442\u0435\u043A\u043B\u043E: ["russian"], \u0441\u0442\u0435\u043D\u0430: ["russian"], \u0441\u0442\u0435\u043F\u0435\u043D\u044C: ["russian"], \u0441\u0442\u0435\u0440\u0435\u0442\u044C: ["russian"], \u0441\u0442\u0438\u043B\u044C: ["russian"], \u0441\u0442\u0438\u043C\u0443\u043B: ["russian"], \u0441\u0442\u0438\u0440\u0430\u0442\u044C: ["russian"], \u0441\u0442\u0438\u0445\u0438: ["russian"], \u0441\u0442\u043E\u0438\u0442\u044C: ["russian"], \u0441\u0442\u043E\u0439\u043A\u0430: ["russian"], \u0441\u0442\u043E\u043B: ["russian"], \u0441\u0442\u043E\u043D\u0430\u0442\u044C: ["russian"], \u0441\u0442\u043E\u043F\u0430: ["russian"], \u0441\u0442\u043E\u0440\u043E\u043D\u0430: ["russian"], \u0441\u0442\u043E\u044F\u043D\u043A\u0430: ["russian"], \u0441\u0442\u0440\u0430\u043D\u0430: ["russian"], \u0441\u0442\u0440\u0438\u0447\u044C: ["russian"], \u0441\u0442\u0440\u043E\u0433\u0438\u0439: ["russian"], \u0441\u0442\u0440\u0443\u044F: ["russian"], \u0441\u0442\u0443\u0434\u0435\u043D\u0442: ["russian"], \u0441\u0442\u0443\u043A: ["russian"], \u0441\u0442\u0443\u043F\u043D\u044F: ["russian"], \u0441\u0442\u044B\u0434\u043D\u043E: ["russian"], \u0441\u0443\u0431\u0431\u043E\u0442\u0430: ["russian"], \u0441\u0443\u0431\u044A\u0435\u043A\u0442: ["russian"], \u0441\u0443\u0432\u0435\u043D\u0438\u0440: ["russian"], \u0441\u0443\u0433\u0440\u043E\u0431: ["russian"], \u0441\u0443\u0433\u0443\u0431\u043E: ["russian"], \u0441\u0443\u0434\u0438\u0442\u044C: ["russian"], \u0441\u0443\u0434\u043D\u043E: ["russian"], \u0441\u0443\u0434\u044C\u0431\u0430: ["russian"], \u0441\u0443\u0435\u0442\u0430: ["russian"], \u0441\u0443\u043C\u0435\u0442\u044C: ["russian"], \u0441\u0443\u043C\u043C\u0430: ["russian"], \u0441\u0443\u043C\u0440\u0430\u043A: ["russian"], \u0441\u0443\u043D\u0434\u0443\u043A: ["russian"], \u0441\u0443\u043F\u0440\u0443\u0433: ["russian"], \u0441\u0443\u0440\u043E\u0432\u044B\u0439: ["russian"], \u0441\u0443\u0442\u043A\u0438: ["russian"], \u0441\u0443\u0445\u043E\u0439: ["russian"], \u0441\u0443\u0448\u0430: ["russian"], \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043E: ["russian"], \u0441\u0444\u0435\u0440\u0430: ["russian"], \u0441\u0445\u0435\u043C\u0430: ["russian"], \u0441\u0445\u043E\u0436\u0438\u0439: ["russian"], \u0441\u0446\u0435\u043D\u0430\u0440\u0438\u0439: ["russian"], \u0441\u0447\u0430\u0441\u0442\u044C\u0435: ["russian"], \u0441\u0447\u0438\u0442\u0430\u0442\u044C: ["russian"], \u0441\u044A\u0435\u0437\u0434: ["russian"], \u0441\u044B\u0433\u0440\u0430\u0442\u044C: ["russian"], \u0441\u044B\u0440\u043E\u0439: ["russian"], \u0441\u044B\u0442\u044B\u0439: ["russian"], \u0441\u044B\u0449\u0438\u043A: ["russian"], \u0441\u044E\u0434\u0430: ["russian"], \u0441\u044E\u0436\u0435\u0442: ["russian"], \u0441\u044E\u0440\u043F\u0440\u0438\u0437: ["russian"], \u0442\u0430\u0439\u043D\u0430: ["russian"], \u0442\u0430\u043A\u0436\u0435: ["russian"], \u0442\u0430\u043A\u043E\u0439: ["russian"], \u0442\u0430\u043A\u0441\u0438: ["russian"], \u0442\u0430\u043A\u0442\u0438\u043A\u0430: ["russian"], \u0442\u0430\u043B\u0438\u044F: ["russian"], \u0442\u0430\u043C\u043E\u0436\u043D\u044F: ["russian"], \u0442\u0430\u043D\u0435\u0446: ["russian"], \u0442\u0430\u0440\u0430\u043A\u0430\u043D: ["russian"], \u0442\u0430\u0440\u0435\u043B\u043A\u0430: ["russian"], \u0442\u0430\u0440\u0438\u0444: ["russian"], \u0442\u0430\u0449\u0438\u0442\u044C: ["russian"], \u0442\u0430\u044F\u0442\u044C: ["russian"], \u0442\u0432\u0430\u0440\u044C: ["russian"], \u0442\u0435\u0430\u0442\u0440: ["russian"], \u0442\u0435\u0437\u0438\u0441: ["russian"], \u0442\u0435\u043A\u0441\u0442: ["russian"], \u0442\u0435\u043A\u0443\u0449\u0438\u0439: ["russian"], \u0442\u0435\u043B\u0435\u0444\u043E\u043D: ["russian"], \u0442\u0435\u043C\u0430: ["russian"], \u0442\u0435\u043C\u043D\u043E\u0442\u0430: ["russian"], \u0442\u0435\u043D\u0435\u0432\u043E\u0439: ["russian"], \u0442\u0435\u043D\u043D\u0438\u0441: ["russian"], \u0442\u0435\u043E\u0440\u0438\u044F: ["russian"], \u0442\u0435\u043F\u0435\u0440\u044C: ["russian"], \u0442\u0435\u043F\u043B\u043E: ["russian"], \u0442\u0435\u0440\u0430\u043F\u0438\u044F: ["russian"], \u0442\u0435\u0440\u0437\u0430\u0442\u044C: ["russian"], \u0442\u0435\u0440\u043C\u0438\u043D: ["russian"], \u0442\u0435\u0440\u043F\u0435\u0442\u044C: ["russian"], \u0442\u0435\u0440\u0440\u0430\u0441\u0430: ["russian"], \u0442\u0435\u0440\u044F\u0442\u044C: ["russian"], \u0442\u0435\u0441\u043D\u044B\u0439: ["russian"], \u0442\u0435\u0442\u0440\u0430\u0434\u044C: ["russian"], \u0442\u0435\u0445\u043D\u0438\u043A\u0430: ["russian"], \u0442\u0435\u0447\u0435\u043D\u0438\u0435: ["russian"], \u0442\u0438\u0433\u0440: ["russian"], \u0442\u0438\u043F\u043E\u0432\u043E\u0439: ["russian"], \u0442\u0438\u0440\u0430\u0436: ["russian"], \u0442\u0438\u0442\u0443\u043B: ["russian"], \u0442\u0438\u0445\u0438\u0439: ["russian"], \u0442\u043A\u0430\u043D\u044C: ["russian"], \u0442\u043E\u0432\u0430\u0440\u0438\u0449: ["russian"], \u0442\u043E\u0436\u0435: ["russian"], \u0442\u043E\u043B\u043F\u0430: ["russian"], \u0442\u043E\u043B\u0441\u0442\u044B\u0439: ["russian"], \u0442\u043E\u043B\u0447\u043E\u043A: ["russian"], \u0442\u043E\u043B\u0449\u0438\u043D\u0430: ["russian"], \u0442\u043E\u043B\u044C\u043A\u043E: ["russian"], \u0442\u043E\u043D\u043A\u0438\u0439: ["russian"], \u0442\u043E\u043D\u043D\u0430: ["russian"], \u0442\u043E\u043F\u0438\u0442\u044C: ["russian"], \u0442\u043E\u043F\u043E\u0440: ["russian"], \u0442\u043E\u0440\u0433\u043E\u0432\u043B\u044F: ["russian"], \u0442\u043E\u0440\u043C\u043E\u0437: ["russian"], \u0442\u043E\u0440\u0447\u0430\u0442\u044C: ["russian"], \u0442\u043E\u0442\u0447\u0430\u0441: ["russian"], \u0442\u043E\u0447\u043A\u0430: ["russian"], \u0442\u043E\u0447\u043D\u043E: ["russian"], \u0442\u043E\u0449\u0438\u0439: ["russian"], \u0442\u0440\u0430\u0432\u0430: ["russian"], \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044F: ["russian"], \u0442\u0440\u0430\u043A\u0442\u043E\u0440: ["russian"], \u0442\u0440\u0430\u043C\u0432\u0430\u0439: ["russian"], \u0442\u0440\u0430\u043D\u0448\u0435\u044F: ["russian"], \u0442\u0440\u0430\u0441\u0441\u0430: ["russian"], \u0442\u0440\u0435\u0432\u043E\u0433\u0430: ["russian"], \u0442\u0440\u0435\u0437\u0432\u044B\u0439: ["russian"], \u0442\u0440\u0435\u043D\u0435\u0440: ["russian"], \u0442\u0440\u0435\u043F\u0435\u0442: ["russian"], \u0442\u0440\u0435\u0441\u043A: ["russian"], \u0442\u0440\u0435\u0442\u0438\u0439: ["russian"], \u0442\u0440\u0435\u0449\u0438\u043D\u0430: ["russian"], \u0442\u0440\u0438\u0431\u0443\u043D\u0430: ["russian"], \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C: ["russian"], \u0442\u0440\u0438\u0441\u0442\u0430: ["russian"], \u0442\u0440\u0438\u0443\u043C\u0444: ["russian"], \u0442\u0440\u043E\u0433\u0430\u0442\u044C: ["russian"], \u0442\u0440\u043E\u0439\u043A\u0430: ["russian"], \u0442\u0440\u043E\u043D\u0443\u0442\u044C: ["russian"], \u0442\u0440\u043E\u043F\u0430: ["russian"], \u0442\u0440\u043E\u0442\u0443\u0430\u0440: ["russian"], \u0442\u0440\u0443\u0431\u043A\u0430: ["russian"], \u0442\u0440\u0443\u0434: ["russian"], \u0442\u0440\u044E\u043A: ["russian"], \u0442\u0440\u044F\u043F\u043A\u0430: ["russian"], \u0442\u0443\u0433\u043E: ["russian"], \u0442\u0443\u043B\u043E\u0432\u0438\u0449\u0435: ["russian"], \u0442\u0443\u043C\u0430\u043D: ["russian"], \u0442\u0443\u043C\u0431\u043E\u0447\u043A\u0430: ["russian"], \u0442\u0443\u043D\u0434\u0440\u0430: ["russian"], \u0442\u0443\u043F\u0438\u043A: ["russian"], \u0442\u0443\u0440\u0438\u0441\u0442: ["russian"], \u0442\u0443\u0440\u043D\u0438\u0440: ["russian"], \u0442\u0443\u0441\u043A\u043B\u044B\u0439: ["russian"], \u0442\u0443\u0444\u043B\u044F: ["russian"], \u0442\u0443\u0447\u0430: ["russian"], \u0442\u044B\u0441\u044F\u0447\u0430: ["russian"], \u0442\u044F\u0433\u0430: ["russian"], \u0442\u044F\u0436\u0435\u043B\u043E: ["russian"], \u0443\u0431\u0435\u0436\u0430\u0442\u044C: ["russian"], \u0443\u0431\u043E\u0433\u0438\u0439: ["russian"], \u0443\u0431\u043E\u0440\u043A\u0430: ["russian"], \u0443\u0432\u0430\u0436\u0435\u043D\u0438\u0435: ["russian"], \u0443\u0432\u0435\u0437\u0442\u0438: ["russian"], \u0443\u0432\u043E\u043B\u0438\u0442\u044C: ["russian"], \u0443\u0433\u0430\u0434\u0430\u0442\u044C: ["russian"], \u0443\u0433\u043E\u043B: ["russian"], \u0443\u0433\u043E\u0449\u0430\u0442\u044C: ["russian"], \u0443\u0433\u0440\u043E\u0437\u0430: ["russian"], \u0443\u0433\u0440\u044E\u043C\u044B\u0439: ["russian"], \u0443\u0434\u0430\u0440: ["russian"], \u0443\u0434\u0430\u0447\u043D\u044B\u0439: ["russian"], \u0443\u0434\u0435\u043B\u044F\u0442\u044C: ["russian"], \u0443\u0434\u0438\u0432\u0438\u0442\u044C: ["russian"], \u0443\u0434\u043E\u0431\u043D\u044B\u0439: ["russian"], \u0443\u0434\u043E\u0447\u043A\u0430: ["russian"], \u0443\u0435\u0437\u0436\u0430\u0442\u044C: ["russian"], \u0443\u0436\u0438\u043D: ["russian"], \u0443\u0437\u0435\u043B: ["russian"], \u0443\u0437\u043A\u0438\u0439: ["russian"], \u0443\u0439\u0442\u0438: ["russian"], \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0435: ["russian"], \u0443\u043A\u043B\u043E\u043D: ["russian"], \u0443\u043A\u0440\u0430\u0441\u0442\u044C: ["russian"], \u0443\u043A\u0443\u0441\u0438\u0442\u044C: ["russian"], \u0443\u043B\u0435\u0442\u0430\u0442\u044C: ["russian"], \u0443\u043B\u0438\u0446\u0430: ["russian"], \u0443\u043B\u044B\u0431\u043A\u0430: ["russian"], \u0443\u043C\u0435\u043B\u043E: ["russian"], \u0443\u043C\u0435\u043D\u0438\u0435: ["russian"], \u0443\u043C\u043D\u044B\u0439: ["russian"], \u0443\u043C\u043E\u043B\u044F\u0442\u044C: ["russian"], \u0443\u043D\u0435\u0441\u0442\u0438: ["russian"], \u0443\u043D\u0438\u0436\u0430\u0442\u044C: ["russian"], \u0443\u043D\u044B\u043B\u044B\u0439: ["russian"], \u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0430: ["russian"], \u0443\u043F\u0430\u0441\u0442\u044C: ["russian"], \u0443\u043F\u043E\u0440\u043D\u043E: ["russian"], \u0443\u043F\u0440\u0435\u043A: ["russian"], \u0443\u0440\u043D\u0430: ["russian"], \u0443\u0440\u043E\u0432\u0435\u043D\u044C: ["russian"], \u0443\u0440\u043E\u0436\u0430\u0439: ["russian"], \u0443\u0440\u043E\u043D\u0438\u0442\u044C: ["russian"], \u0443\u0441\u0430\u0434\u044C\u0431\u0430: ["russian"], \u0443\u0441\u0430\u0442\u044B\u0439: ["russian"], \u0443\u0441\u0432\u043E\u0438\u0442\u044C: ["russian"], \u0443\u0441\u0438\u043B\u0438\u0435: ["russian"], \u0443\u0441\u043B\u043E\u0432\u0438\u0435: ["russian"], \u0443\u0441\u043B\u0443\u0433\u0430: ["russian"], \u0443\u0441\u043C\u0435\u0448\u043A\u0430: ["russian"], \u0443\u0441\u043F\u0435\u0442\u044C: ["russian"], \u0443\u0441\u0442\u0430\u0432: ["russian"], \u0443\u0441\u0442\u043E\u044F\u0442\u044C: ["russian"], \u0443\u0442\u0435\u0447\u043A\u0430: ["russian"], \u0443\u0442\u0435\u0448\u0430\u0442\u044C: ["russian"], \u0443\u0442\u0440\u043E: ["russian"], \u0443\u0446\u0435\u043B\u0435\u0442\u044C: ["russian"], \u0443\u0447\u0430\u0441\u0442\u0438\u0435: ["russian"], \u0443\u0447\u0435\u043D\u0438\u043A: ["russian"], \u0443\u0447\u0435\u0441\u0442\u044C: ["russian"], \u0443\u0449\u0435\u043B\u044C\u0435: ["russian"], \u0443\u0449\u0435\u0440\u0431: ["russian"], \u0443\u044E\u0442\u043D\u044B\u0439: ["russian"], \u0444\u0430\u0431\u0440\u0438\u043A\u0430: ["russian"], \u0444\u0430\u0432\u043E\u0440\u0438\u0442: ["russian"], \u0444\u0430\u043A\u0435\u043B: ["russian"], \u0444\u0430\u043A\u0442: ["russian"], \u0444\u0430\u043C\u0438\u043B\u0438\u044F: ["russian"], \u0444\u0430\u043D\u0442\u0430\u0437\u0438\u044F: ["russian"], \u0444\u0430\u0441\u0430\u0434: ["russian"], \u0444\u0435\u0432\u0440\u0430\u043B\u044C: ["russian"], \u0444\u0435\u043D\u043E\u043C\u0435\u043D: ["russian"], \u0444\u0435\u0440\u043C\u0435\u0440: ["russian"], \u0444\u0438\u0433\u0443\u0440\u0430: ["russian"], \u0444\u0438\u0437\u0438\u043A\u0430: ["russian"], \u0444\u0438\u043B\u0438\u0430\u043B: ["russian"], \u0444\u0438\u043B\u043E\u0441\u043E\u0444: ["russian"], \u0444\u0438\u043B\u044C\u043C: ["russian"], \u0444\u0438\u043D\u0430\u043B: ["russian"], \u0444\u043B\u0430\u0433: ["russian"], \u0444\u043B\u043E\u0442: ["russian"], \u0444\u043E\u0439\u0435: ["russian"], \u0444\u043E\u043A\u0443\u0441: ["russian"], \u0444\u043E\u043D\u0430\u0440\u044C: ["russian"], \u0444\u043E\u043D\u0434: ["russian"], \u0444\u043E\u043D\u0442\u0430\u043D: ["russian"], \u0444\u043E\u0440\u043C\u0430: ["russian"], \u0444\u043E\u0440\u0443\u043C: ["russian"], \u0444\u043E\u0442\u043E: ["russian"], \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442: ["russian"], \u0444\u0440\u0430\u0437\u0430: ["russian"], \u0444\u0440\u0430\u043A\u0446\u0438\u044F: ["russian"], \u0444\u0440\u043E\u043D\u0442: ["russian"], \u0444\u0440\u0443\u043A\u0442: ["russian"], \u0444\u0443\u043D\u043A\u0446\u0438\u044F: ["russian"], \u0444\u0443\u0440\u0430\u0436\u043A\u0430: ["russian"], \u0444\u0443\u0442\u0431\u043E\u043B: ["russian"], \u0444\u0443\u0442\u043B\u044F\u0440: ["russian"], \u0445\u0430\u043B\u0430\u0442: ["russian"], \u0445\u0430\u043E\u0441: ["russian"], \u0445\u0430\u0440\u0430\u043A\u0442\u0435\u0440: ["russian"], \u0445\u0430\u0442\u0430: ["russian"], \u0445\u0432\u0430\u043B\u0438\u0442\u044C: ["russian"], \u0445\u0432\u0430\u0442\u0430\u0442\u044C: ["russian"], \u0445\u0432\u043E\u0439\u043D\u044B\u0439: ["russian"], \u0445\u0432\u043E\u0441\u0442: ["russian"], \u0445\u0438\u043C\u0438\u044F: ["russian"], \u0445\u0438\u0440\u0443\u0440\u0433: ["russian"], \u0445\u0438\u0442\u0440\u044B\u0439: ["russian"], \u0445\u0438\u0449\u043D\u0438\u043A: ["russian"], \u0445\u043B\u0435\u0431: ["russian"], \u0445\u043B\u044B\u043D\u0443\u0442\u044C: ["russian"], \u0445\u043C\u0443\u0440\u044B\u0439: ["russian"], \u0445\u043E\u0434\u0438\u0442\u044C: ["russian"], \u0445\u043E\u0437\u044F\u0438\u043D: ["russian"], \u0445\u043E\u043A\u043A\u0435\u0439: ["russian"], \u0445\u043E\u043B\u043C: ["russian"], \u0445\u043E\u043B\u0441\u0442: ["russian"], \u0445\u043E\u0440\u043E\u0448\u043E: ["russian"], \u0445\u043E\u0442\u0435\u0442\u044C: ["russian"], \u0445\u0440\u0430\u0431\u0440\u044B\u0439: ["russian"], \u0445\u0440\u0430\u043C: ["russian"], \u0445\u0440\u0430\u043D\u0438\u0442\u044C: ["russian"], \u0445\u0440\u0435\u0431\u0435\u0442: ["russian"], \u0445\u0440\u0435\u043D: ["russian"], \u0445\u0440\u0438\u043F\u043B\u043E: ["russian"], \u0445\u0440\u043E\u043D\u0438\u043A\u0430: ["russian"], \u0445\u0440\u0443\u043F\u043A\u0438\u0439: ["russian"], \u0445\u0443\u0434\u043E\u0436\u043D\u0438\u043A: ["russian"], \u0445\u0443\u0434\u0448\u0438\u0439: ["russian"], \u0445\u0443\u043B\u0438\u0433\u0430\u043D: ["russian"], \u0445\u0443\u0442\u043E\u0440: ["russian"], \u0446\u0430\u0440\u044C: ["russian"], \u0446\u0432\u0435\u0442\u043E\u043A: ["russian"], \u0446\u0435\u043B\u0435\u0432\u043E\u0439: ["russian"], \u0446\u0435\u043B\u0438\u043A\u043E\u043C: ["russian"], \u0446\u0435\u043B\u043E\u0435: ["russian"], \u0446\u0435\u043B\u044C: ["russian"], \u0446\u0435\u043D\u0437\u0443\u0440\u0430: ["russian"], \u0446\u0435\u043D\u0438\u0442\u044C: ["russian"], \u0446\u0435\u043D\u0442\u0440: ["russian"], \u0446\u0435\u043F\u043D\u043E\u0439: ["russian"], \u0446\u0438\u043A\u043B: ["russian"], \u0446\u0438\u043B\u0438\u043D\u0434\u0440: ["russian"], \u0446\u0438\u0440\u043A: ["russian"], \u0446\u0438\u0442\u0430\u0442\u0430: ["russian"], \u0446\u0438\u0444\u0440\u0430: ["russian"], \u0447\u0430\u0439\u043D\u0438\u043A: ["russian"], \u0447\u0430\u0441\u044B: ["russian"], \u0447\u0430\u0448\u043A\u0430: ["russian"], \u0447\u0435\u043B\u043E\u0432\u0435\u043A: ["russian"], \u0447\u0435\u043B\u044E\u0441\u0442\u044C: ["russian"], \u0447\u0435\u043C\u043E\u0434\u0430\u043D: ["russian"], \u0447\u0435\u043C\u043F\u0438\u043E\u043D: ["russian"], \u0447\u0435\u043F\u0443\u0445\u0430: ["russian"], \u0447\u0435\u0440\u0432\u044C: ["russian"], \u0447\u0435\u0440\u0434\u0430\u043A: ["russian"], \u0447\u0435\u0440\u0435\u0437: ["russian"], \u0447\u0435\u0440\u043D\u0438\u043B\u0430: ["russian"], \u0447\u0435\u0440\u0442\u0430: ["russian"], \u0447\u0435\u0441\u043D\u043E\u043A: ["russian"], \u0447\u0435\u0441\u0442\u043D\u043E: ["russian"], \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044C: ["russian"], \u0447\u0435\u0442\u044B\u0440\u0435: ["russian"], \u0447\u0438\u0441\u043B\u043E: ["russian"], \u0447\u0438\u0441\u0442\u044B\u0439: ["russian"], \u0447\u0438\u0442\u0430\u0442\u0435\u043B\u044C: ["russian"], \u0447\u0442\u0435\u043D\u0438\u0435: ["russian"], \u0447\u0442\u043E\u0431\u044B: ["russian"], \u0447\u0443\u0432\u0441\u0442\u0432\u043E: ["russian"], \u0447\u0443\u0434\u0430\u043A: ["russian"], \u0447\u0443\u0434\u043D\u044B\u0439: ["russian"], \u0447\u0443\u0434\u043E: ["russian"], \u0447\u0443\u0436\u043E\u0439: ["russian"], \u0447\u0443\u043B\u043E\u043A: ["russian"], \u0447\u0443\u043C\u0430: ["russian"], \u0447\u0443\u0448\u044C: ["russian"], \u0447\u0443\u044F\u0442\u044C: ["russian"], \u0448\u0430\u0433\u0430\u0442\u044C: ["russian"], \u0448\u0430\u043D\u0441: ["russian"], \u0448\u0430\u043F\u043A\u0430: ["russian"], \u0448\u0430\u0440\u0438\u043A: ["russian"], \u0448\u0430\u0440\u0444: ["russian"], \u0448\u0430\u0445\u043C\u0430\u0442\u044B: ["russian"], \u0448\u0430\u0448\u043B\u044B\u043A: ["russian"], \u0448\u0435\u0434\u0435\u0432\u0440: ["russian"], \u0448\u0435\u043F\u0442\u0430\u0442\u044C: ["russian"], \u0448\u0435\u0440\u0441\u0442\u044C: ["russian"], \u0448\u0435\u0441\u0442\u043E\u0439: ["russian"], \u0448\u0438\u043D\u0435\u043B\u044C: ["russian"], \u0448\u0438\u0440\u0438\u043D\u0430: ["russian"], \u0448\u0438\u0448\u043A\u0430: ["russian"], \u0448\u043A\u0430\u0444: ["russian"], \u0448\u043A\u043E\u043B\u0430: ["russian"], \u0448\u043A\u0443\u0440\u0430: ["russian"], \u0448\u043B\u0430\u043D\u0433: ["russian"], \u0448\u043B\u0435\u043C: ["russian"], \u0448\u043D\u0443\u0440: ["russian"], \u0448\u043E\u043A\u043E\u043B\u0430\u0434: ["russian"], \u0448\u043E\u0440\u043E\u0445: ["russian"], \u0448\u043E\u0441\u0441\u0435: ["russian"], \u0448\u043F\u0438\u043E\u043D: ["russian"], \u0448\u043F\u0440\u0438\u0446: ["russian"], \u0448\u0442\u0430\u0431: ["russian"], \u0448\u0442\u0430\u043C\u043C: ["russian"], \u0448\u0442\u0430\u043D\u044B: ["russian"], \u0448\u0442\u0430\u0442\u043D\u044B\u0439: ["russian"], \u0448\u0442\u043E\u0440\u0430: ["russian"], \u0448\u0442\u0440\u0430\u0444: ["russian"], \u0448\u0442\u0443\u0440\u043C: ["russian"], \u0448\u0442\u044B\u043A: ["russian"], \u0448\u0443\u043C\u043D\u043E: ["russian"], \u0448\u0443\u0440\u0448\u0430\u0442\u044C: ["russian"], \u0448\u0443\u0442\u0438\u0442\u044C: ["russian"], \u0448\u0443\u0442\u043A\u0430: ["russian"], \u0449\u0435\u0434\u0440\u044B\u0439: ["russian"], \u0449\u0435\u043A\u0430: ["russian"], \u0449\u0435\u043D\u043E\u043A: ["russian"], \u044D\u043A\u0437\u0430\u043C\u0435\u043D: ["russian"], \u044D\u043A\u0438\u043F\u0430\u0436: ["russian"], \u044D\u043A\u043E\u043D\u043E\u043C\u0438\u044F: ["russian"], \u044D\u043A\u0440\u0430\u043D: ["russian"], \u044D\u043A\u0441\u043F\u0435\u0440\u0442: ["russian"], \u044D\u043B\u0435\u043C\u0435\u043D\u0442: ["russian"], \u044D\u043B\u0438\u0442\u043D\u044B\u0439: ["russian"], \u044D\u043C\u043E\u0446\u0438\u044F: ["russian"], \u044D\u043D\u0435\u0440\u0433\u0438\u044F: ["russian"], \u044D\u043F\u0438\u0437\u043E\u0434: ["russian"], \u044D\u043F\u043E\u0445\u0430: ["russian"], \u044D\u0441\u043A\u0438\u0437: ["russian"], \u044D\u0441\u0442\u0440\u0430\u0434\u0430: ["russian"], \u044D\u0442\u0430\u043F: ["russian"], \u044D\u0442\u0438\u043A\u0430: ["russian"], \u044D\u0442\u043E\u0442: ["russian"], \u044D\u0444\u0438\u0440: ["russian"], \u044D\u0444\u0444\u0435\u043A\u0442: ["russian"], \u044D\u0448\u0435\u043B\u043E\u043D: ["russian"], \u044E\u0431\u0438\u043B\u0435\u0439: ["russian"], \u044E\u0431\u043A\u0430: ["russian"], \u044E\u0436\u043D\u044B\u0439: ["russian"], \u044E\u043C\u043E\u0440: ["russian"], \u044E\u043D\u043E\u0441\u0442\u044C: ["russian"], \u044E\u0440\u0438\u0441\u0442: ["russian"], \u044E\u0441\u0442\u0438\u0446\u0438\u044F: ["russian"], \u044F\u0431\u043B\u043E\u043A\u043E: ["russian"], \u044F\u0432\u043B\u0435\u043D\u0438\u0435: ["russian"], \u044F\u0433\u043E\u0434\u0430: ["russian"], \u044F\u0434\u0440\u043E: ["russian"], \u044F\u0437\u044B\u043A: ["russian"], \u044F\u0439\u0446\u043E: ["russian"], \u044F\u043A\u043E\u0431\u044B: ["russian"], \u044F\u043A\u043E\u0440\u044C: ["russian"], \u044F\u043D\u0432\u0430\u0440\u044C: ["russian"], \u044F\u0440\u043A\u0438\u0439: ["russian"], \u044F\u0440\u043C\u0430\u0440\u043A\u0430: ["russian"], \u044F\u0440\u043E\u0441\u0442\u044C: ["russian"], \u044F\u0441\u043D\u044B\u0439: ["russian"], \u044F\u0445\u0442\u0430: ["russian"], \u044F\u0447\u0435\u0439\u043A\u0430: ["russian"], \u044F\u0449\u0438\u043A: ["russian"], a\u0301baco: ["spanish"], abdomen: ["spanish"], abeja: ["spanish"], abierto: ["spanish"], abogado: ["spanish"], abono: ["spanish"], aborto: ["spanish"], abrazo: ["spanish"], abrir: ["spanish"], abuelo: ["spanish"], abuso: ["spanish"], acabar: ["spanish"], academia: ["spanish"], acceso: ["spanish"], accio\u0301n: ["spanish"], aceite: ["spanish"], acelga: ["spanish"], acento: ["spanish"], aceptar: ["spanish"], a\u0301cido: ["spanish"], aclarar: ["spanish"], acne\u0301: ["spanish"], acoger: ["spanish"], acoso: ["spanish"], activo: ["spanish"], acto: ["spanish"], actriz: ["spanish"], actuar: ["spanish"], acudir: ["spanish"], acuerdo: ["spanish"], acusar: ["spanish"], adicto: ["spanish"], admitir: ["spanish"], adoptar: ["spanish"], adorno: ["spanish"], aduana: ["spanish"], adulto: ["spanish"], ae\u0301reo: ["spanish"], afectar: ["spanish"], aficio\u0301n: ["spanish"], afinar: ["spanish"], afirmar: ["spanish"], a\u0301gil: ["spanish"], agitar: ["spanish"], agoni\u0301a: ["spanish"], agosto: ["spanish"], agotar: ["spanish"], agregar: ["spanish"], agrio: ["spanish"], agua: ["spanish"], agudo: ["spanish"], a\u0301guila: ["spanish"], aguja: ["spanish"], ahogo: ["spanish"], ahorro: ["spanish"], aire: ["spanish"], aislar: ["spanish"], ajedrez: ["spanish"], ajeno: ["spanish"], ajuste: ["spanish"], alacra\u0301n: ["spanish"], alambre: ["spanish"], alarma: ["spanish"], alba: ["spanish"], a\u0301lbum: ["spanish"], alcalde: ["spanish"], aldea: ["spanish"], alegre: ["spanish"], alejar: ["spanish"], alerta: ["spanish"], aleta: ["spanish"], alfiler: ["spanish"], alga: ["spanish"], algodo\u0301n: ["spanish"], aliado: ["spanish"], aliento: ["spanish"], alivio: ["spanish"], alma: ["spanish"], almeja: ["spanish"], almi\u0301bar: ["spanish"], altar: ["spanish"], alteza: ["spanish"], altivo: ["spanish"], alto: ["spanish"], altura: ["spanish"], alumno: ["spanish"], alzar: ["spanish"], amable: ["spanish"], amante: ["spanish"], amapola: ["spanish"], amargo: ["spanish"], amasar: ["spanish"], a\u0301mbar: ["spanish"], a\u0301mbito: ["spanish"], ameno: ["spanish"], amigo: ["spanish", "turkish"], amistad: ["spanish"], amor: ["spanish"], amparo: ["spanish"], amplio: ["spanish"], ancho: ["spanish"], anciano: ["spanish"], ancla: ["spanish"], andar: ["spanish"], ande\u0301n: ["spanish"], anemia: ["spanish"], a\u0301ngulo: ["spanish"], anillo: ["spanish"], a\u0301nimo: ["spanish"], ani\u0301s: ["spanish"], anotar: ["spanish"], antena: ["spanish"], antiguo: ["spanish"], antojo: ["spanish"], anual: ["spanish"], anular: ["spanish"], anuncio: ["spanish"], an\u0303adir: ["spanish"], an\u0303ejo: ["spanish"], an\u0303o: ["spanish"], apagar: ["spanish"], aparato: ["spanish"], apetito: ["spanish"], apio: ["spanish"], aplicar: ["spanish"], apodo: ["spanish"], aporte: ["spanish"], apoyo: ["spanish"], aprender: ["spanish"], aprobar: ["spanish"], apuesta: ["spanish"], apuro: ["spanish"], arado: ["spanish"], aran\u0303a: ["spanish"], arar: ["spanish"], a\u0301rbitro: ["spanish"], a\u0301rbol: ["spanish"], arbusto: ["spanish"], archivo: ["spanish"], arco: ["spanish"], arder: ["spanish"], ardilla: ["spanish"], arduo: ["spanish"], a\u0301rea: ["spanish"], a\u0301rido: ["spanish"], aries: ["spanish"], armoni\u0301a: ["spanish"], arne\u0301s: ["spanish"], aroma: ["spanish", "turkish"], arpa: ["spanish"], arpo\u0301n: ["spanish"], arreglo: ["spanish"], arroz: ["spanish"], arruga: ["spanish"], arte: ["spanish"], artista: ["spanish"], asa: ["spanish"], asado: ["spanish"], asalto: ["spanish"], ascenso: ["spanish"], asegurar: ["spanish"], aseo: ["spanish"], asesor: ["spanish"], asiento: ["spanish"], asilo: ["spanish"], asistir: ["spanish"], asno: ["spanish"], asombro: ["spanish"], a\u0301spero: ["spanish"], astilla: ["spanish"], astro: ["spanish"], astuto: ["spanish"], asumir: ["spanish"], asunto: ["spanish"], atajo: ["spanish"], ataque: ["spanish"], atar: ["spanish"], atento: ["spanish"], ateo: ["spanish"], a\u0301tico: ["spanish"], atleta: ["spanish"], a\u0301tomo: ["spanish"], atraer: ["spanish"], atroz: ["spanish"], atu\u0301n: ["spanish"], audaz: ["spanish"], audio: ["spanish"], auge: ["spanish"], aula: ["spanish"], aumento: ["spanish"], ausente: ["spanish"], autor: ["spanish"], aval: ["spanish"], avance: ["spanish"], avaro: ["spanish"], ave: ["spanish"], avellana: ["spanish"], avena: ["spanish"], avestruz: ["spanish"], avio\u0301n: ["spanish"], aviso: ["spanish"], ayer: ["spanish"], ayuda: ["spanish"], ayuno: ["spanish"], azafra\u0301n: ["spanish"], azar: ["spanish"], azote: ["spanish"], azu\u0301car: ["spanish"], azufre: ["spanish"], azul: ["spanish"], baba: ["spanish"], babor: ["spanish"], bache: ["spanish"], bahi\u0301a: ["spanish"], baile: ["spanish"], bajar: ["spanish"], balanza: ["spanish"], balco\u0301n: ["spanish"], balde: ["spanish"], bambu\u0301: ["spanish"], banco: ["spanish"], banda: ["spanish"], ban\u0303o: ["spanish"], barba: ["spanish"], barco: ["spanish"], barniz: ["spanish"], barro: ["spanish"], ba\u0301scula: ["spanish"], basto\u0301n: ["spanish"], basura: ["spanish"], batalla: ["spanish"], bateri\u0301a: ["spanish"], batir: ["spanish"], batuta: ["spanish"], bau\u0301l: ["spanish"], bazar: ["spanish"], bebe\u0301: ["spanish"], bebida: ["spanish"], bello: ["spanish"], besar: ["spanish"], beso: ["spanish"], bestia: ["spanish"], bicho: ["spanish"], bien: ["spanish"], bingo: ["spanish"], blanco: ["spanish"], bloque: ["spanish"], blusa: ["spanish"], boa: ["spanish"], bobina: ["spanish"], bobo: ["spanish"], boca: ["spanish"], bocina: ["spanish"], boda: ["spanish"], bodega: ["spanish"], boina: ["spanish"], bola: ["spanish"], bolero: ["spanish", "turkish"], bolsa: ["spanish"], bomba: ["spanish"], bondad: ["spanish"], bonito: ["spanish"], bono: ["spanish"], bonsa\u0301i: ["spanish"], borde: ["spanish"], borrar: ["spanish"], bosque: ["spanish"], bote: ["spanish"], boti\u0301n: ["spanish"], bo\u0301veda: ["spanish"], bozal: ["spanish"], bravo: ["spanish"], brazo: ["spanish"], brecha: ["spanish"], breve: ["spanish"], brillo: ["spanish"], brinco: ["spanish"], brisa: ["spanish"], broca: ["spanish"], broma: ["spanish"], bronce: ["spanish"], brote: ["spanish"], bruja: ["spanish"], brusco: ["spanish"], bruto: ["spanish"], buceo: ["spanish"], bucle: ["spanish"], bueno: ["spanish"], buey: ["spanish"], bufanda: ["spanish"], bufo\u0301n: ["spanish"], bu\u0301ho: ["spanish"], buitre: ["spanish"], bulto: ["spanish"], burbuja: ["spanish"], burla: ["spanish"], burro: ["spanish"], buscar: ["spanish"], butaca: ["spanish"], buzo\u0301n: ["spanish"], caballo: ["spanish"], cabeza: ["spanish"], cabina: ["spanish"], cabra: ["spanish"], cacao: ["spanish"], cada\u0301ver: ["spanish"], cadena: ["spanish"], caer: ["spanish"], cafe\u0301: ["spanish"], cai\u0301da: ["spanish"], caima\u0301n: ["spanish"], caja: ["spanish"], cajo\u0301n: ["spanish"], cal: ["spanish"], calamar: ["spanish"], calcio: ["spanish"], caldo: ["spanish"], calidad: ["spanish"], calle: ["spanish"], calma: ["spanish"], calor: ["spanish"], calvo: ["spanish"], cama: ["spanish"], cambio: ["spanish"], camello: ["spanish"], camino: ["spanish"], campo: ["spanish"], ca\u0301ncer: ["spanish"], candil: ["spanish"], canela: ["spanish"], canguro: ["spanish"], canica: ["spanish"], canto: ["spanish"], can\u0303a: ["spanish"], can\u0303o\u0301n: ["spanish"], caoba: ["spanish"], caos: ["spanish"], capaz: ["spanish"], capita\u0301n: ["spanish"], capote: ["spanish"], captar: ["spanish"], capucha: ["spanish"], cara: ["spanish"], carbo\u0301n: ["spanish"], ca\u0301rcel: ["spanish"], careta: ["spanish"], carga: ["spanish"], carin\u0303o: ["spanish"], carne: ["spanish"], carpeta: ["spanish"], carro: ["spanish"], carta: ["spanish"], casa: ["spanish"], casco: ["spanish"], casero: ["spanish"], caspa: ["spanish"], castor: ["spanish"], catorce: ["spanish"], catre: ["spanish"], caudal: ["spanish"], causa: ["spanish"], cazo: ["spanish"], cebolla: ["spanish"], ceder: ["spanish"], cedro: ["spanish"], celda: ["spanish"], ce\u0301lebre: ["spanish"], celoso: ["spanish"], ce\u0301lula: ["spanish"], cemento: ["spanish"], ceniza: ["spanish"], centro: ["spanish"], cerca: ["spanish"], cerdo: ["spanish"], cereza: ["spanish"], cero: ["spanish"], cerrar: ["spanish"], certeza: ["spanish"], ce\u0301sped: ["spanish"], cetro: ["spanish"], chacal: ["spanish"], chaleco: ["spanish"], champu\u0301: ["spanish"], chancla: ["spanish"], chapa: ["spanish"], charla: ["spanish"], chico: ["spanish"], chiste: ["spanish"], chivo: ["spanish"], choque: ["spanish"], choza: ["spanish"], chuleta: ["spanish"], chupar: ["spanish"], ciclo\u0301n: ["spanish"], ciego: ["spanish"], cielo: ["spanish"], cien: ["spanish"], cierto: ["spanish"], cifra: ["spanish"], cigarro: ["spanish"], cima: ["spanish"], cinco: ["spanish"], cine: ["spanish"], cinta: ["spanish"], cipre\u0301s: ["spanish"], circo: ["spanish"], ciruela: ["spanish"], cisne: ["spanish"], cita: ["spanish"], ciudad: ["spanish"], clamor: ["spanish"], clan: ["spanish"], claro: ["spanish"], clase: ["spanish"], clave: ["spanish"], cliente: ["spanish"], clima: ["spanish"], cli\u0301nica: ["spanish"], cobre: ["spanish"], coccio\u0301n: ["spanish"], cochino: ["spanish"], cocina: ["spanish"], coco: ["spanish"], co\u0301digo: ["spanish"], codo: ["spanish"], cofre: ["spanish"], coger: ["spanish"], cohete: ["spanish"], coji\u0301n: ["spanish"], cojo: ["spanish"], cola: ["spanish"], colcha: ["spanish"], colegio: ["spanish"], colgar: ["spanish"], colina: ["spanish"], collar: ["spanish"], colmo: ["spanish"], columna: ["spanish"], combate: ["spanish"], comer: ["spanish"], comida: ["spanish"], co\u0301modo: ["spanish"], compra: ["spanish"], conde: ["spanish"], conejo: ["spanish"], conga: ["spanish"], conocer: ["spanish"], consejo: ["spanish"], contar: ["spanish"], copa: ["spanish"], copia: ["spanish"], corazo\u0301n: ["spanish"], corbata: ["spanish"], corcho: ["spanish"], cordo\u0301n: ["spanish"], corona: ["spanish"], correr: ["spanish"], coser: ["spanish"], cosmos: ["spanish"], costa: ["spanish"], cra\u0301neo: ["spanish"], cra\u0301ter: ["spanish"], crear: ["spanish"], crecer: ["spanish"], crei\u0301do: ["spanish"], crema: ["spanish"], cri\u0301a: ["spanish"], crimen: ["spanish"], cripta: ["spanish"], crisis: ["spanish"], cromo: ["spanish"], cro\u0301nica: ["spanish"], croqueta: ["spanish"], crudo: ["spanish"], cruz: ["spanish"], cuadro: ["spanish"], cuarto: ["spanish"], cuatro: ["spanish"], cubo: ["spanish"], cubrir: ["spanish"], cuchara: ["spanish"], cuello: ["spanish"], cuento: ["spanish"], cuerda: ["spanish"], cuesta: ["spanish"], cueva: ["spanish"], cuidar: ["spanish"], culebra: ["spanish"], culpa: ["spanish"], culto: ["spanish"], cumbre: ["spanish"], cumplir: ["spanish"], cuna: ["spanish"], cuneta: ["spanish"], cuota: ["spanish"], cupo\u0301n: ["spanish"], cu\u0301pula: ["spanish"], curar: ["spanish"], curioso: ["spanish"], curso: ["spanish"], curva: ["spanish"], cutis: ["spanish"], dama: ["spanish"], danza: ["spanish"], dar: ["spanish"], dardo: ["spanish"], da\u0301til: ["spanish"], deber: ["spanish"], de\u0301bil: ["spanish"], de\u0301cada: ["spanish"], decir: ["spanish"], dedo: ["spanish"], defensa: ["spanish"], definir: ["spanish"], dejar: ["spanish"], delfi\u0301n: ["spanish"], delgado: ["spanish"], delito: ["spanish"], demora: ["spanish"], denso: ["spanish"], dental: ["spanish"], deporte: ["spanish"], derecho: ["spanish"], derrota: ["spanish"], desayuno: ["spanish"], deseo: ["spanish"], desfile: ["spanish"], desnudo: ["spanish"], destino: ["spanish"], desvi\u0301o: ["spanish"], detalle: ["spanish"], detener: ["spanish"], deuda: ["spanish"], di\u0301a: ["spanish"], diablo: ["spanish"], diadema: ["spanish"], diamante: ["spanish"], diana: ["spanish"], diario: ["spanish"], dibujo: ["spanish"], dictar: ["spanish"], diente: ["spanish"], dieta: ["spanish"], diez: ["spanish"], difi\u0301cil: ["spanish"], digno: ["spanish"], dilema: ["spanish"], diluir: ["spanish"], dinero: ["spanish"], directo: ["spanish"], dirigir: ["spanish"], disco: ["spanish"], disen\u0303o: ["spanish"], disfraz: ["spanish"], diva: ["spanish"], divino: ["spanish"], doble: ["spanish"], doce: ["spanish"], dolor: ["spanish"], domingo: ["spanish"], don: ["spanish"], donar: ["spanish"], dorado: ["spanish"], dormir: ["spanish"], dorso: ["spanish"], dos: ["spanish"], dosis: ["spanish"], drago\u0301n: ["spanish"], droga: ["spanish"], ducha: ["spanish"], duda: ["spanish"], duelo: ["spanish"], duen\u0303o: ["spanish"], dulce: ["spanish"], du\u0301o: ["spanish"], duque: ["spanish"], durar: ["spanish"], dureza: ["spanish"], duro: ["spanish"], e\u0301bano: ["spanish"], ebrio: ["spanish"], echar: ["spanish"], eco: ["spanish"], ecuador: ["spanish"], edad: ["spanish"], edicio\u0301n: ["spanish"], edificio: ["spanish"], editor: ["spanish"], educar: ["spanish"], efecto: ["spanish"], eficaz: ["spanish"], eje: ["spanish"], ejemplo: ["spanish"], elefante: ["spanish"], elegir: ["spanish"], elemento: ["spanish"], elevar: ["spanish"], elipse: ["spanish"], e\u0301lite: ["spanish"], elixir: ["spanish"], elogio: ["spanish"], eludir: ["spanish"], embudo: ["spanish"], emitir: ["spanish"], emocio\u0301n: ["spanish"], empate: ["spanish"], empen\u0303o: ["spanish"], empleo: ["spanish"], empresa: ["spanish"], enano: ["spanish"], encargo: ["spanish"], enchufe: ["spanish"], enci\u0301a: ["spanish"], enemigo: ["spanish"], enero: ["spanish"], enfado: ["spanish"], enfermo: ["spanish"], engan\u0303o: ["spanish"], enigma: ["spanish"], enlace: ["spanish"], enorme: ["spanish"], enredo: ["spanish"], ensayo: ["spanish"], ensen\u0303ar: ["spanish"], entero: ["spanish"], entrar: ["spanish"], envase: ["spanish"], envi\u0301o: ["spanish"], e\u0301poca: ["spanish"], equipo: ["spanish"], erizo: ["spanish"], escala: ["spanish"], escena: ["spanish"], escolar: ["spanish"], escribir: ["spanish"], escudo: ["spanish"], esencia: ["spanish"], esfera: ["spanish"], esfuerzo: ["spanish"], espada: ["spanish"], espejo: ["spanish"], espi\u0301a: ["spanish"], esposa: ["spanish"], espuma: ["spanish"], esqui\u0301: ["spanish"], estar: ["spanish"], este: ["spanish"], estilo: ["spanish"], estufa: ["spanish"], etapa: ["spanish"], eterno: ["spanish"], e\u0301tica: ["spanish"], etnia: ["spanish"], evadir: ["spanish"], evaluar: ["spanish"], evento: ["spanish"], evitar: ["spanish"], exacto: ["spanish"], examen: ["spanish"], exceso: ["spanish"], excusa: ["spanish"], exento: ["spanish"], exigir: ["spanish"], exilio: ["spanish"], existir: ["spanish"], e\u0301xito: ["spanish"], experto: ["spanish"], explicar: ["spanish"], exponer: ["spanish"], extremo: ["spanish"], fa\u0301brica: ["spanish"], fa\u0301bula: ["spanish"], fachada: ["spanish"], fa\u0301cil: ["spanish"], factor: ["spanish"], faena: ["spanish"], faja: ["spanish"], falda: ["spanish"], fallo: ["spanish"], falso: ["spanish"], faltar: ["spanish"], fama: ["spanish"], familia: ["spanish"], famoso: ["spanish"], farao\u0301n: ["spanish"], farmacia: ["spanish"], farol: ["spanish"], farsa: ["spanish"], fase: ["spanish"], fatiga: ["spanish"], fauna: ["spanish", "turkish"], favor: ["spanish"], fax: ["spanish"], febrero: ["spanish"], fecha: ["spanish"], feliz: ["spanish"], feo: ["spanish"], feria: ["spanish"], feroz: ["spanish"], fe\u0301rtil: ["spanish"], fervor: ["spanish"], festi\u0301n: ["spanish"], fiable: ["spanish"], fianza: ["spanish"], fiar: ["spanish"], fibra: ["spanish"], ficcio\u0301n: ["spanish"], ficha: ["spanish"], fideo: ["spanish"], fiebre: ["spanish"], fiel: ["spanish"], fiera: ["spanish"], fiesta: ["spanish"], figura: ["spanish"], fijar: ["spanish"], fijo: ["spanish"], fila: ["spanish"], filete: ["spanish"], filial: ["spanish"], filtro: ["spanish"], fin: ["spanish"], finca: ["spanish"], fingir: ["spanish"], finito: ["spanish"], firma: ["spanish"], flaco: ["spanish"], flauta: ["spanish"], flecha: ["spanish"], flor: ["spanish"], flota: ["spanish"], fluir: ["spanish"], flujo: ["spanish"], flu\u0301or: ["spanish"], fobia: ["spanish"], foca: ["spanish"], fogata: ["spanish"], fogo\u0301n: ["spanish"], folio: ["spanish"], folleto: ["spanish"], fondo: ["spanish"], forma: ["spanish"], forro: ["spanish"], fortuna: ["spanish"], forzar: ["spanish"], fosa: ["spanish"], foto: ["spanish"], fracaso: ["spanish"], fra\u0301gil: ["spanish"], franja: ["spanish"], frase: ["spanish"], fraude: ["spanish"], frei\u0301r: ["spanish"], freno: ["spanish"], fresa: ["spanish"], fri\u0301o: ["spanish"], frito: ["spanish"], fruta: ["spanish"], fuego: ["spanish"], fuente: ["spanish"], fuerza: ["spanish"], fuga: ["spanish"], fumar: ["spanish"], funcio\u0301n: ["spanish"], funda: ["spanish"], furgo\u0301n: ["spanish"], furia: ["spanish"], fusil: ["spanish"], fu\u0301tbol: ["spanish"], futuro: ["spanish"], gacela: ["spanish"], gafas: ["spanish"], gaita: ["spanish"], gajo: ["spanish"], gala: ["spanish"], galeri\u0301a: ["spanish"], gallo: ["spanish"], gamba: ["spanish"], ganar: ["spanish"], gancho: ["spanish"], ganga: ["spanish"], ganso: ["spanish"], garaje: ["spanish"], garza: ["spanish"], gasolina: ["spanish"], gastar: ["spanish"], gato: ["spanish"], gavila\u0301n: ["spanish"], gemelo: ["spanish"], gemir: ["spanish"], gen: ["spanish"], ge\u0301nero: ["spanish"], genio: ["spanish"], gente: ["spanish"], geranio: ["spanish"], gerente: ["spanish"], germen: ["spanish"], gesto: ["spanish"], gigante: ["spanish"], gimnasio: ["spanish"], girar: ["spanish"], giro: ["spanish"], glaciar: ["spanish"], globo: ["spanish"], gloria: ["spanish"], gol: ["spanish"], golfo: ["spanish"], goloso: ["spanish"], golpe: ["spanish"], goma: ["spanish"], gordo: ["spanish"], gorila: ["spanish"], gorra: ["spanish"], gota: ["spanish"], goteo: ["spanish"], gozar: ["spanish"], grada: ["spanish"], gra\u0301fico: ["spanish"], grano: ["spanish"], grasa: ["spanish"], gratis: ["spanish"], grave: ["spanish"], grieta: ["spanish"], grillo: ["spanish"], gripe: ["spanish"], gris: ["spanish"], grito: ["spanish"], grosor: ["spanish"], gru\u0301a: ["spanish"], grueso: ["spanish"], grumo: ["spanish"], grupo: ["spanish"], guante: ["spanish"], guapo: ["spanish"], guardia: ["spanish"], guerra: ["spanish"], gui\u0301a: ["spanish"], guin\u0303o: ["spanish"], guion: ["spanish"], guiso: ["spanish"], guitarra: ["spanish"], gusano: ["spanish"], gustar: ["spanish"], haber: ["spanish", "turkish"], ha\u0301bil: ["spanish"], hablar: ["spanish"], hacer: ["spanish"], hacha: ["spanish"], hada: ["spanish"], hallar: ["spanish"], hamaca: ["spanish"], harina: ["spanish"], haz: ["spanish"], hazan\u0303a: ["spanish"], hebilla: ["spanish"], hebra: ["spanish"], hecho: ["spanish"], helado: ["spanish"], helio: ["spanish"], hembra: ["spanish"], herir: ["spanish"], hermano: ["spanish"], he\u0301roe: ["spanish"], hervir: ["spanish"], hielo: ["spanish"], hierro: ["spanish"], hi\u0301gado: ["spanish"], higiene: ["spanish"], hijo: ["spanish"], himno: ["spanish"], historia: ["spanish"], hocico: ["spanish"], hogar: ["spanish"], hoguera: ["spanish"], hoja: ["spanish"], hombre: ["spanish"], hongo: ["spanish"], honor: ["spanish"], honra: ["spanish"], hora: ["spanish"], hormiga: ["spanish"], horno: ["spanish"], hostil: ["spanish"], hoyo: ["spanish"], hueco: ["spanish"], huelga: ["spanish"], huerta: ["spanish"], hueso: ["spanish"], huevo: ["spanish"], huida: ["spanish"], huir: ["spanish"], humano: ["spanish"], hu\u0301medo: ["spanish"], humilde: ["spanish"], humo: ["spanish"], hundir: ["spanish"], huraca\u0301n: ["spanish"], hurto: ["spanish"], icono: ["spanish"], ideal: ["spanish"], idioma: ["spanish"], i\u0301dolo: ["spanish"], iglesia: ["spanish"], iglu\u0301: ["spanish"], igual: ["spanish"], ilegal: ["spanish"], ilusio\u0301n: ["spanish"], imagen: ["spanish"], ima\u0301n: ["spanish"], imitar: ["spanish"], impar: ["spanish"], imperio: ["spanish"], imponer: ["spanish"], impulso: ["spanish"], incapaz: ["spanish"], i\u0301ndice: ["spanish"], inerte: ["spanish"], infiel: ["spanish"], informe: ["spanish"], ingenio: ["spanish"], inicio: ["spanish"], inmenso: ["spanish"], inmune: ["spanish"], innato: ["spanish"], insecto: ["spanish"], instante: ["spanish"], intere\u0301s: ["spanish"], i\u0301ntimo: ["spanish"], intuir: ["spanish"], inu\u0301til: ["spanish"], invierno: ["spanish"], ira: ["spanish"], iris: ["spanish"], ironi\u0301a: ["spanish"], isla: ["spanish"], islote: ["spanish"], jabali\u0301: ["spanish"], jabo\u0301n: ["spanish"], jamo\u0301n: ["spanish"], jarabe: ["spanish"], jardi\u0301n: ["spanish"], jarra: ["spanish"], jaula: ["spanish"], jazmi\u0301n: ["spanish"], jefe: ["spanish"], jeringa: ["spanish"], jinete: ["spanish"], jornada: ["spanish"], joroba: ["spanish"], joven: ["spanish"], joya: ["spanish"], juerga: ["spanish"], jueves: ["spanish"], juez: ["spanish"], jugador: ["spanish"], jugo: ["spanish"], juguete: ["spanish"], juicio: ["spanish"], junco: ["spanish"], jungla: ["spanish"], junio: ["spanish"], juntar: ["spanish"], ju\u0301piter: ["spanish"], jurar: ["spanish"], justo: ["spanish"], juvenil: ["spanish"], juzgar: ["spanish"], kilo: ["spanish"], koala: ["spanish"], labio: ["spanish"], lacio: ["spanish"], lacra: ["spanish"], lado: ["spanish"], ladro\u0301n: ["spanish"], lagarto: ["spanish"], la\u0301grima: ["spanish"], laguna: ["spanish"], laico: ["spanish"], lamer: ["spanish"], la\u0301mina: ["spanish"], la\u0301mpara: ["spanish"], lana: ["spanish"], lancha: ["spanish"], langosta: ["spanish"], lanza: ["spanish"], la\u0301piz: ["spanish"], largo: ["spanish"], larva: ["spanish"], la\u0301stima: ["spanish"], lata: ["spanish"], la\u0301tex: ["spanish"], latir: ["spanish"], laurel: ["spanish"], lavar: ["spanish"], lazo: ["spanish"], leal: ["spanish"], leccio\u0301n: ["spanish"], leche: ["spanish"], lector: ["spanish"], leer: ["spanish"], legio\u0301n: ["spanish"], legumbre: ["spanish"], lejano: ["spanish"], lengua: ["spanish"], lento: ["spanish"], len\u0303a: ["spanish"], leo\u0301n: ["spanish"], leopardo: ["spanish"], lesio\u0301n: ["spanish"], letal: ["spanish"], letra: ["spanish"], leve: ["spanish"], leyenda: ["spanish"], libertad: ["spanish"], libro: ["spanish"], licor: ["spanish"], li\u0301der: ["spanish"], lidiar: ["spanish"], lienzo: ["spanish"], liga: ["spanish"], ligero: ["spanish"], lima: ["spanish"], li\u0301mite: ["spanish"], limo\u0301n: ["spanish"], limpio: ["spanish"], lince: ["spanish"], lindo: ["spanish"], li\u0301nea: ["spanish"], lingote: ["spanish"], lino: ["spanish"], linterna: ["spanish"], li\u0301quido: ["spanish"], liso: ["spanish"], lista: ["spanish"], litera: ["spanish"], litio: ["spanish"], litro: ["spanish"], llaga: ["spanish"], llama: ["spanish"], llanto: ["spanish"], llave: ["spanish"], llegar: ["spanish"], llenar: ["spanish"], llevar: ["spanish"], llorar: ["spanish"], llover: ["spanish"], lluvia: ["spanish"], lobo: ["spanish"], locio\u0301n: ["spanish"], loco: ["spanish"], locura: ["spanish"], lo\u0301gica: ["spanish"], logro: ["spanish"], lombriz: ["spanish"], lomo: ["spanish"], lonja: ["spanish"], lote: ["spanish"], lucha: ["spanish"], lucir: ["spanish"], lugar: ["spanish"], lujo: ["spanish"], luna: ["spanish"], lunes: ["spanish"], lupa: ["spanish"], lustro: ["spanish"], luto: ["spanish"], luz: ["spanish"], maceta: ["spanish"], macho: ["spanish"], madera: ["spanish"], madre: ["spanish"], maduro: ["spanish"], maestro: ["spanish"], mafia: ["spanish"], magia: ["spanish"], mago: ["spanish"], mai\u0301z: ["spanish"], maldad: ["spanish"], maleta: ["spanish"], malla: ["spanish"], malo: ["spanish"], mama\u0301: ["spanish"], mambo: ["spanish"], mamut: ["spanish"], manco: ["spanish"], mando: ["spanish"], manejar: ["spanish"], manga: ["spanish"], maniqui\u0301: ["spanish"], manjar: ["spanish"], mano: ["spanish"], manso: ["spanish"], manta: ["spanish"], man\u0303ana: ["spanish"], mapa: ["spanish"], ma\u0301quina: ["spanish"], mar: ["spanish"], marco: ["spanish"], marea: ["spanish"], marfil: ["spanish"], margen: ["spanish"], marido: ["spanish"], ma\u0301rmol: ["spanish"], marro\u0301n: ["spanish"], martes: ["spanish"], marzo: ["spanish"], masa: ["spanish"], ma\u0301scara: ["spanish"], masivo: ["spanish"], matar: ["spanish"], materia: ["spanish"], matiz: ["spanish"], matriz: ["spanish"], ma\u0301ximo: ["spanish"], mayor: ["spanish"], mazorca: ["spanish"], mecha: ["spanish"], medalla: ["spanish"], medio: ["spanish"], me\u0301dula: ["spanish"], mejilla: ["spanish"], mejor: ["spanish"], melena: ["spanish"], melo\u0301n: ["spanish"], memoria: ["spanish"], menor: ["spanish"], mensaje: ["spanish"], mente: ["spanish"], menu\u0301: ["spanish"], mercado: ["spanish"], merengue: ["spanish"], me\u0301rito: ["spanish"], mes: ["spanish"], meso\u0301n: ["spanish"], meta: ["spanish"], meter: ["spanish"], me\u0301todo: ["spanish"], metro: ["spanish"], mezcla: ["spanish"], miedo: ["spanish"], miel: ["spanish"], miembro: ["spanish"], miga: ["spanish"], mil: ["spanish"], milagro: ["spanish"], militar: ["spanish"], millo\u0301n: ["spanish"], mimo: ["spanish"], mina: ["spanish"], minero: ["spanish"], mi\u0301nimo: ["spanish"], minuto: ["spanish"], miope: ["spanish"], mirar: ["spanish"], misa: ["spanish"], miseria: ["spanish"], misil: ["spanish"], mismo: ["spanish"], mitad: ["spanish"], mito: ["spanish"], mochila: ["spanish"], mocio\u0301n: ["spanish"], moda: ["spanish"], modelo: ["spanish"], moho: ["spanish"], mojar: ["spanish"], molde: ["spanish"], moler: ["spanish"], molino: ["spanish"], momento: ["spanish"], momia: ["spanish"], monarca: ["spanish"], moneda: ["spanish"], monja: ["spanish"], monto: ["spanish"], mon\u0303o: ["spanish"], morada: ["spanish"], morder: ["spanish"], moreno: ["spanish"], morir: ["spanish"], morro: ["spanish"], morsa: ["spanish"], mortal: ["spanish"], mosca: ["spanish"], mostrar: ["spanish"], motivo: ["spanish"], mover: ["spanish"], mo\u0301vil: ["spanish"], mozo: ["spanish"], mucho: ["spanish"], mudar: ["spanish"], mueble: ["spanish"], muela: ["spanish"], muerte: ["spanish"], muestra: ["spanish"], mugre: ["spanish"], mujer: ["spanish"], mula: ["spanish"], muleta: ["spanish"], multa: ["spanish"], mundo: ["spanish"], mun\u0303eca: ["spanish"], mural: ["spanish"], muro: ["spanish"], mu\u0301sculo: ["spanish"], museo: ["spanish"], musgo: ["spanish"], mu\u0301sica: ["spanish"], muslo: ["spanish"], na\u0301car: ["spanish"], nacio\u0301n: ["spanish"], nadar: ["spanish"], naipe: ["spanish"], naranja: ["spanish"], nariz: ["spanish"], narrar: ["spanish"], nasal: ["spanish"], natal: ["spanish"], nativo: ["spanish"], natural: ["spanish"], na\u0301usea: ["spanish"], naval: ["spanish"], nave: ["spanish"], navidad: ["spanish"], necio: ["spanish"], ne\u0301ctar: ["spanish"], negar: ["spanish"], negocio: ["spanish"], negro: ["spanish"], neo\u0301n: ["spanish"], nervio: ["spanish"], neto: ["spanish"], neutro: ["spanish"], nevar: ["spanish"], nevera: ["spanish"], nicho: ["spanish"], nido: ["spanish"], niebla: ["spanish"], nieto: ["spanish"], nin\u0303ez: ["spanish"], nin\u0303o: ["spanish"], ni\u0301tido: ["spanish"], nivel: ["spanish"], nobleza: ["spanish"], noche: ["spanish"], no\u0301mina: ["spanish"], noria: ["spanish"], norma: ["spanish"], norte: ["spanish"], nota: ["spanish"], noticia: ["spanish"], novato: ["spanish"], novela: ["spanish"], novio: ["spanish"], nube: ["spanish"], nuca: ["spanish"], nu\u0301cleo: ["spanish"], nudillo: ["spanish"], nudo: ["spanish"], nuera: ["spanish"], nueve: ["spanish"], nuez: ["spanish"], nulo: ["spanish"], nu\u0301mero: ["spanish"], nutria: ["spanish"], oasis: ["spanish"], obeso: ["spanish"], obispo: ["spanish"], objeto: ["spanish"], obra: ["spanish"], obrero: ["spanish"], observar: ["spanish"], obtener: ["spanish"], obvio: ["spanish"], oca: ["spanish"], ocaso: ["spanish"], oce\u0301ano: ["spanish"], ochenta: ["spanish"], ocho: ["spanish"], ocio: ["spanish"], ocre: ["spanish"], octavo: ["spanish"], octubre: ["spanish"], oculto: ["spanish"], ocupar: ["spanish"], ocurrir: ["spanish"], odiar: ["spanish"], odio: ["spanish"], odisea: ["spanish"], oeste: ["spanish"], ofensa: ["spanish"], oferta: ["spanish"], oficio: ["spanish"], ofrecer: ["spanish"], ogro: ["spanish"], oi\u0301do: ["spanish"], oi\u0301r: ["spanish"], ojo: ["spanish"], ola: ["spanish"], oleada: ["spanish"], olfato: ["spanish"], olivo: ["spanish"], olla: ["spanish"], olmo: ["spanish"], olor: ["spanish"], olvido: ["spanish"], ombligo: ["spanish"], onda: ["spanish"], onza: ["spanish"], opaco: ["spanish"], opcio\u0301n: ["spanish"], o\u0301pera: ["spanish"], opinar: ["spanish"], oponer: ["spanish"], optar: ["spanish"], o\u0301ptica: ["spanish"], opuesto: ["spanish"], oracio\u0301n: ["spanish"], orador: ["spanish"], oral: ["spanish", "turkish"], o\u0301rbita: ["spanish"], orca: ["spanish"], orden: ["spanish"], oreja: ["spanish"], o\u0301rgano: ["spanish"], orgi\u0301a: ["spanish"], orgullo: ["spanish"], oriente: ["spanish"], origen: ["spanish"], orilla: ["spanish"], oro: ["spanish"], orquesta: ["spanish"], oruga: ["spanish"], osadi\u0301a: ["spanish"], oscuro: ["spanish"], osezno: ["spanish"], oso: ["spanish"], ostra: ["spanish"], oton\u0303o: ["spanish"], otro: ["spanish"], oveja: ["spanish"], o\u0301vulo: ["spanish"], o\u0301xido: ["spanish"], oxi\u0301geno: ["spanish"], oyente: ["spanish"], ozono: ["spanish"], pacto: ["spanish"], padre: ["spanish"], paella: ["spanish"], pa\u0301gina: ["spanish"], pago: ["spanish"], pai\u0301s: ["spanish"], pa\u0301jaro: ["spanish"], palabra: ["spanish"], palco: ["spanish"], paleta: ["spanish"], pa\u0301lido: ["spanish"], palma: ["spanish"], paloma: ["spanish"], palpar: ["spanish"], pan: ["spanish"], panal: ["spanish"], pa\u0301nico: ["spanish"], pantera: ["spanish"], pan\u0303uelo: ["spanish"], papa\u0301: ["spanish"], papel: ["spanish"], papilla: ["spanish"], paquete: ["spanish"], parar: ["spanish"], parcela: ["spanish"], pared: ["spanish"], parir: ["spanish"], paro: ["spanish"], pa\u0301rpado: ["spanish"], parque: ["spanish"], pa\u0301rrafo: ["spanish"], parte: ["spanish"], pasar: ["spanish"], paseo: ["spanish"], pasio\u0301n: ["spanish"], paso: ["spanish"], pasta: ["spanish"], pata: ["spanish"], patio: ["spanish"], patria: ["spanish"], pausa: ["spanish"], pauta: ["spanish"], pavo: ["spanish"], payaso: ["spanish"], peato\u0301n: ["spanish"], pecado: ["spanish"], pecera: ["spanish"], pecho: ["spanish"], pedal: ["spanish", "turkish"], pedir: ["spanish"], pegar: ["spanish"], peine: ["spanish"], pelar: ["spanish"], peldan\u0303o: ["spanish"], pelea: ["spanish"], peligro: ["spanish"], pellejo: ["spanish"], pelo: ["spanish"], peluca: ["spanish"], pena: ["spanish", "turkish"], pensar: ["spanish"], pen\u0303o\u0301n: ["spanish"], peo\u0301n: ["spanish"], peor: ["spanish"], pepino: ["spanish"], pequen\u0303o: ["spanish"], pera: ["spanish"], percha: ["spanish"], perder: ["spanish"], pereza: ["spanish"], perfil: ["spanish"], perico: ["spanish"], perla: ["spanish"], permiso: ["spanish"], perro: ["spanish"], persona: ["spanish"], pesa: ["spanish"], pesca: ["spanish"], pe\u0301simo: ["spanish"], pestan\u0303a: ["spanish"], pe\u0301talo: ["spanish"], petro\u0301leo: ["spanish"], pez: ["spanish"], pezun\u0303a: ["spanish"], picar: ["spanish"], picho\u0301n: ["spanish"], pie: ["spanish"], piedra: ["spanish"], pierna: ["spanish"], pieza: ["spanish"], pijama: ["spanish"], pilar: ["spanish"], piloto: ["spanish"], pimienta: ["spanish"], pino: ["spanish"], pintor: ["spanish"], pinza: ["spanish"], pin\u0303a: ["spanish"], piojo: ["spanish"], pipa: ["spanish"], pirata: ["spanish"], pisar: ["spanish"], piscina: ["spanish"], piso: ["spanish"], pista: ["spanish"], pito\u0301n: ["spanish"], pizca: ["spanish"], placa: ["spanish"], plan: ["spanish"], plata: ["spanish"], playa: ["spanish"], plaza: ["spanish"], pleito: ["spanish"], pleno: ["spanish"], plomo: ["spanish"], pluma: ["spanish"], plural: ["spanish"], pobre: ["spanish"], poco: ["spanish"], poder: ["spanish"], podio: ["spanish"], poema: ["spanish"], poesi\u0301a: ["spanish"], poeta: ["spanish"], polen: ["spanish", "turkish"], polici\u0301a: ["spanish"], pollo: ["spanish"], polvo: ["spanish"], pomada: ["spanish"], pomelo: ["spanish"], pomo: ["spanish"], pompa: ["spanish", "turkish"], poner: ["spanish"], porcio\u0301n: ["spanish"], portal: ["spanish"], posada: ["spanish"], poseer: ["spanish"], posible: ["spanish"], poste: ["spanish"], potencia: ["spanish"], potro: ["spanish"], pozo: ["spanish"], prado: ["spanish"], precoz: ["spanish"], pregunta: ["spanish"], premio: ["spanish"], prensa: ["spanish"], preso: ["spanish"], previo: ["spanish"], primo: ["spanish"], pri\u0301ncipe: ["spanish"], prisio\u0301n: ["spanish"], privar: ["spanish"], proa: ["spanish"], probar: ["spanish"], proceso: ["spanish"], producto: ["spanish"], proeza: ["spanish"], profesor: ["spanish"], programa: ["spanish"], prole: ["spanish"], promesa: ["spanish"], pronto: ["spanish"], propio: ["spanish"], pro\u0301ximo: ["spanish"], prueba: ["spanish"], pu\u0301blico: ["spanish"], puchero: ["spanish"], pudor: ["spanish"], pueblo: ["spanish"], puerta: ["spanish"], puesto: ["spanish"], pulga: ["spanish"], pulir: ["spanish"], pulmo\u0301n: ["spanish"], pulpo: ["spanish"], pulso: ["spanish"], puma: ["spanish"], punto: ["spanish"], pun\u0303al: ["spanish"], pun\u0303o: ["spanish"], pupa: ["spanish"], pupila: ["spanish"], pure\u0301: ["spanish"], quedar: ["spanish"], queja: ["spanish"], quemar: ["spanish"], querer: ["spanish"], queso: ["spanish"], quieto: ["spanish"], qui\u0301mica: ["spanish"], quince: ["spanish"], quitar: ["spanish"], ra\u0301bano: ["spanish"], rabia: ["spanish"], rabo: ["spanish"], racio\u0301n: ["spanish"], radical: ["spanish"], rai\u0301z: ["spanish"], rama: ["spanish"], rampa: ["spanish", "turkish"], rancho: ["spanish"], rango: ["spanish"], rapaz: ["spanish"], ra\u0301pido: ["spanish"], rapto: ["spanish"], rasgo: ["spanish"], raspa: ["spanish"], rato: ["spanish"], rayo: ["spanish"], raza: ["spanish"], razo\u0301n: ["spanish"], reaccio\u0301n: ["spanish"], realidad: ["spanish"], reban\u0303o: ["spanish"], rebote: ["spanish"], recaer: ["spanish"], receta: ["spanish"], rechazo: ["spanish"], recoger: ["spanish"], recreo: ["spanish"], recto: ["spanish"], recurso: ["spanish"], red: ["spanish"], redondo: ["spanish"], reducir: ["spanish"], reflejo: ["spanish"], reforma: ["spanish"], refra\u0301n: ["spanish"], refugio: ["spanish"], regalo: ["spanish"], regir: ["spanish"], regla: ["spanish"], regreso: ["spanish"], rehe\u0301n: ["spanish"], reino: ["spanish"], rei\u0301r: ["spanish"], reja: ["spanish"], relato: ["spanish"], relevo: ["spanish"], relieve: ["spanish"], relleno: ["spanish"], reloj: ["spanish"], remar: ["spanish"], remedio: ["spanish"], remo: ["spanish"], rencor: ["spanish"], rendir: ["spanish"], renta: ["spanish"], reparto: ["spanish"], repetir: ["spanish"], reposo: ["spanish"], reptil: ["spanish"], res: ["spanish"], rescate: ["spanish"], resina: ["spanish"], respeto: ["spanish"], resto: ["spanish"], resumen: ["spanish"], retiro: ["spanish"], retorno: ["spanish"], retrato: ["spanish"], reunir: ["spanish"], reve\u0301s: ["spanish"], revista: ["spanish"], rey: ["spanish"], rezar: ["spanish"], rico: ["spanish"], riego: ["spanish"], rienda: ["spanish"], riesgo: ["spanish"], rifa: ["spanish"], ri\u0301gido: ["spanish"], rigor: ["spanish"], rinco\u0301n: ["spanish"], rin\u0303o\u0301n: ["spanish"], ri\u0301o: ["spanish"], riqueza: ["spanish"], risa: ["spanish"], ritmo: ["spanish"], rito: ["spanish"], rizo: ["spanish"], roble: ["spanish"], roce: ["spanish"], rociar: ["spanish"], rodar: ["spanish"], rodeo: ["spanish"], rodilla: ["spanish"], roer: ["spanish"], rojizo: ["spanish"], rojo: ["spanish"], romero: ["spanish"], romper: ["spanish"], ron: ["spanish"], ronco: ["spanish"], ronda: ["spanish"], ropa: ["spanish"], ropero: ["spanish"], rosa: ["spanish"], rosca: ["spanish"], rostro: ["spanish"], rotar: ["spanish"], rubi\u0301: ["spanish"], rubor: ["spanish"], rudo: ["spanish"], rueda: ["spanish"], rugir: ["spanish"], ruido: ["spanish"], ruina: ["spanish"], ruleta: ["spanish"], rulo: ["spanish", "turkish"], rumbo: ["spanish"], rumor: ["spanish"], ruptura: ["spanish"], ruta: ["spanish"], rutina: ["spanish"], sa\u0301bado: ["spanish"], saber: ["spanish"], sabio: ["spanish"], sable: ["spanish"], sacar: ["spanish"], sagaz: ["spanish"], sagrado: ["spanish"], sala: ["spanish"], saldo: ["spanish"], salero: ["spanish"], salir: ["spanish"], salmo\u0301n: ["spanish"], salo\u0301n: ["spanish"], salsa: ["spanish"], salto: ["spanish"], salud: ["spanish"], salvar: ["spanish"], samba: ["spanish"], sancio\u0301n: ["spanish"], sandi\u0301a: ["spanish"], sanear: ["spanish"], sangre: ["spanish"], sanidad: ["spanish"], sano: ["spanish"], santo: ["spanish"], sapo: ["spanish"], saque: ["spanish"], sardina: ["spanish"], sarte\u0301n: ["spanish"], sastre: ["spanish"], sata\u0301n: ["spanish"], sauna: ["spanish"], saxofo\u0301n: ["spanish"], seccio\u0301n: ["spanish"], seco: ["spanish"], secreto: ["spanish"], secta: ["spanish"], sed: ["spanish"], seguir: ["spanish"], seis: ["spanish"], sello: ["spanish"], selva: ["spanish"], semana: ["spanish"], semilla: ["spanish"], senda: ["spanish"], sensor: ["spanish"], sen\u0303al: ["spanish"], sen\u0303or: ["spanish"], separar: ["spanish"], sepia: ["spanish"], sequi\u0301a: ["spanish"], ser: ["spanish"], serie: ["spanish"], sermo\u0301n: ["spanish"], servir: ["spanish"], sesenta: ["spanish"], sesio\u0301n: ["spanish"], seta: ["spanish"], setenta: ["spanish"], severo: ["spanish"], sexo: ["spanish"], sexto: ["spanish"], sidra: ["spanish"], siesta: ["spanish"], siete: ["spanish"], siglo: ["spanish"], signo: ["spanish"], si\u0301laba: ["spanish"], silbar: ["spanish"], silencio: ["spanish"], silla: ["spanish"], si\u0301mbolo: ["spanish"], simio: ["spanish"], sirena: ["spanish"], sistema: ["spanish"], sitio: ["spanish"], situar: ["spanish"], sobre: ["spanish"], socio: ["spanish"], sodio: ["spanish"], sol: ["spanish"], solapa: ["spanish"], soldado: ["spanish"], soledad: ["spanish"], so\u0301lido: ["spanish"], soltar: ["spanish"], solucio\u0301n: ["spanish"], sombra: ["spanish"], sondeo: ["spanish"], sonido: ["spanish"], sonoro: ["spanish"], sonrisa: ["spanish"], sopa: ["spanish"], soplar: ["spanish"], soporte: ["spanish"], sordo: ["spanish"], sorpresa: ["spanish"], sorteo: ["spanish"], soste\u0301n: ["spanish"], so\u0301tano: ["spanish"], suave: ["spanish"], subir: ["spanish"], suceso: ["spanish"], sudor: ["spanish"], suegra: ["spanish"], suelo: ["spanish"], suen\u0303o: ["spanish"], suerte: ["spanish"], sufrir: ["spanish"], sujeto: ["spanish"], sulta\u0301n: ["spanish"], sumar: ["spanish"], superar: ["spanish"], suplir: ["spanish"], suponer: ["spanish"], supremo: ["spanish"], sur: ["spanish"], surco: ["spanish"], suren\u0303o: ["spanish"], surgir: ["spanish"], susto: ["spanish"], sutil: ["spanish"], tabaco: ["spanish"], tabique: ["spanish"], tabla: ["spanish"], tabu\u0301: ["spanish"], taco: ["spanish"], tacto: ["spanish"], tajo: ["spanish"], talar: ["spanish"], talco: ["spanish"], talento: ["spanish"], talla: ["spanish"], talo\u0301n: ["spanish"], taman\u0303o: ["spanish"], tambor: ["spanish"], tango: ["spanish"], tanque: ["spanish"], tapa: ["spanish"], tapete: ["spanish"], tapia: ["spanish"], tapo\u0301n: ["spanish"], taquilla: ["spanish"], tarde: ["spanish"], tarea: ["spanish"], tarifa: ["spanish"], tarjeta: ["spanish"], tarot: ["spanish"], tarro: ["spanish"], tarta: ["spanish"], tatuaje: ["spanish"], tauro: ["spanish"], taza: ["spanish"], tazo\u0301n: ["spanish"], teatro: ["spanish"], techo: ["spanish"], tecla: ["spanish"], te\u0301cnica: ["spanish"], tejado: ["spanish"], tejer: ["spanish"], tejido: ["spanish"], tela: ["spanish"], tele\u0301fono: ["spanish"], tema: ["spanish"], temor: ["spanish"], templo: ["spanish"], tenaz: ["spanish"], tender: ["spanish"], tener: ["spanish"], tenis: ["spanish"], tenso: ["spanish"], teori\u0301a: ["spanish"], terapia: ["spanish"], terco: ["spanish"], te\u0301rmino: ["spanish"], ternura: ["spanish"], terror: ["spanish"], tesis: ["spanish"], tesoro: ["spanish"], testigo: ["spanish"], tetera: ["spanish"], texto: ["spanish"], tez: ["spanish"], tibio: ["spanish"], tiburo\u0301n: ["spanish"], tiempo: ["spanish"], tienda: ["spanish"], tierra: ["spanish"], tieso: ["spanish"], tigre: ["spanish"], tijera: ["spanish"], tilde: ["spanish"], timbre: ["spanish"], ti\u0301mido: ["spanish"], timo: ["spanish"], tinta: ["spanish"], ti\u0301o: ["spanish"], ti\u0301pico: ["spanish"], tipo: ["spanish"], tira: ["spanish"], tiro\u0301n: ["spanish"], tita\u0301n: ["spanish"], ti\u0301tere: ["spanish"], ti\u0301tulo: ["spanish"], tiza: ["spanish"], toalla: ["spanish"], tobillo: ["spanish"], tocar: ["spanish"], tocino: ["spanish"], todo: ["spanish"], toga: ["spanish"], toldo: ["spanish"], tomar: ["spanish", "turkish"], tono: ["spanish"], tonto: ["spanish"], topar: ["spanish"], tope: ["spanish"], toque: ["spanish"], to\u0301rax: ["spanish"], torero: ["spanish"], tormenta: ["spanish"], torneo: ["spanish"], toro: ["spanish"], torpedo: ["spanish"], torre: ["spanish"], torso: ["spanish"], tortuga: ["spanish"], tos: ["spanish"], tosco: ["spanish"], toser: ["spanish"], to\u0301xico: ["spanish"], trabajo: ["spanish"], tractor: ["spanish"], traer: ["spanish"], tra\u0301fico: ["spanish"], trago: ["spanish"], traje: ["spanish"], tramo: ["spanish"], trance: ["spanish"], trato: ["spanish"], trauma: ["spanish"], trazar: ["spanish"], tre\u0301bol: ["spanish"], tregua: ["spanish"], treinta: ["spanish"], tren: ["spanish"], trepar: ["spanish"], tres: ["spanish"], tribu: ["spanish"], trigo: ["spanish"], tripa: ["spanish"], triste: ["spanish"], triunfo: ["spanish"], trofeo: ["spanish"], trompa: ["spanish"], tronco: ["spanish"], tropa: ["spanish"], trote: ["spanish"], trozo: ["spanish"], truco: ["spanish"], trueno: ["spanish"], trufa: ["spanish"], tuberi\u0301a: ["spanish"], tubo: ["spanish"], tuerto: ["spanish"], tumba: ["spanish"], tumor: ["spanish"], tu\u0301nel: ["spanish"], tu\u0301nica: ["spanish"], turbina: ["spanish"], turismo: ["spanish"], turno: ["spanish"], tutor: ["spanish"], ubicar: ["spanish"], u\u0301lcera: ["spanish"], umbral: ["spanish"], unidad: ["spanish"], unir: ["spanish"], universo: ["spanish"], uno: ["spanish"], untar: ["spanish"], un\u0303a: ["spanish"], urbano: ["spanish"], urbe: ["spanish"], urgente: ["spanish"], urna: ["spanish"], usar: ["spanish"], usuario: ["spanish"], u\u0301til: ["spanish"], utopi\u0301a: ["spanish"], uva: ["spanish"], vaca: ["spanish"], vaci\u0301o: ["spanish"], vacuna: ["spanish"], vagar: ["spanish"], vago: ["spanish"], vaina: ["spanish"], vajilla: ["spanish"], vale: ["spanish"], va\u0301lido: ["spanish"], valle: ["spanish"], valor: ["spanish"], va\u0301lvula: ["spanish"], vampiro: ["spanish"], vara: ["spanish"], variar: ["spanish"], varo\u0301n: ["spanish"], vaso: ["spanish"], vecino: ["spanish"], vector: ["spanish"], vehi\u0301culo: ["spanish"], veinte: ["spanish"], vejez: ["spanish"], vela: ["spanish"], velero: ["spanish"], veloz: ["spanish"], vena: ["spanish"], vencer: ["spanish"], venda: ["spanish"], veneno: ["spanish"], vengar: ["spanish"], venir: ["spanish"], venta: ["spanish"], venus: ["spanish"], ver: ["spanish"], verano: ["spanish"], verbo: ["spanish"], verde: ["spanish"], vereda: ["spanish"], verja: ["spanish"], verso: ["spanish"], verter: ["spanish"], vi\u0301a: ["spanish"], viaje: ["spanish"], vibrar: ["spanish"], vicio: ["spanish"], vi\u0301ctima: ["spanish"], vida: ["spanish"], vi\u0301deo: ["spanish"], vidrio: ["spanish"], viejo: ["spanish"], viernes: ["spanish"], vigor: ["spanish"], vil: ["spanish"], villa: ["spanish"], vinagre: ["spanish"], vino: ["spanish"], vin\u0303edo: ["spanish"], violi\u0301n: ["spanish"], viral: ["spanish"], virgo: ["spanish"], virtud: ["spanish"], visor: ["spanish"], vi\u0301spera: ["spanish"], vista: ["spanish"], vitamina: ["spanish"], viudo: ["spanish"], vivaz: ["spanish"], vivero: ["spanish"], vivir: ["spanish"], vivo: ["spanish"], volca\u0301n: ["spanish"], volumen: ["spanish"], volver: ["spanish"], voraz: ["spanish"], votar: ["spanish"], voto: ["spanish"], voz: ["spanish"], vuelo: ["spanish"], vulgar: ["spanish"], yacer: ["spanish"], yate: ["spanish"], yegua: ["spanish"], yema: ["spanish"], yerno: ["spanish"], yeso: ["spanish"], yodo: ["spanish"], yoga: ["spanish"], yogur: ["spanish"], zafiro: ["spanish"], zanja: ["spanish"], zapato: ["spanish"], zarza: ["spanish"], zona: ["spanish"], zorro: ["spanish"], zumo: ["spanish"], zurdo: ["spanish"], abajur: ["turkish"], abak\u00FCs: ["turkish"], abart\u0131: ["turkish"], abdal: ["turkish"], abdest: ["turkish"], abiye: ["turkish"], abluka: ["turkish"], abone: ["turkish"], absorbe: ["turkish"], abs\u00FCrt: ["turkish"], acayip: ["turkish"], acele: ["turkish"], acemi: ["turkish"], a\u00E7\u0131kg\u00F6z: ["turkish"], adalet: ["turkish"], adam: ["turkish"], adezyon: ["turkish"], adisyon: ["turkish"], adliye: ["turkish"], adres: ["turkish"], afacan: ["turkish"], afili: ["turkish"], afi\u015F: ["turkish"], afiyet: ["turkish"], aforizm: ["turkish"], afra: ["turkish"], a\u011Fa\u00E7: ["turkish"], a\u011F\u0131r: ["turkish"], ahbap: ["turkish"], ahkam: ["turkish"], ahlak: ["turkish"], ahtapot: ["turkish"], aidat: ["turkish"], aile: ["turkish"], ajan: ["turkish"], akademi: ["turkish"], akarsu: ["turkish"], akba\u015F: ["turkish"], akci\u011Fer: ["turkish"], akdeniz: ["turkish"], ak\u0131bet: ["turkish"], ak\u0131l: ["turkish"], ak\u0131nt\u0131: ["turkish"], akide: ["turkish"], akrep: ["turkish"], akrobasi: ["turkish"], aksiyon: ["turkish"], ak\u015Fam: ["turkish"], aktif: ["turkish"], akt\u00F6r: ["turkish"], aktris: ["turkish"], akustik: ["turkish"], alaca: ["turkish"], alb\u00FCm: ["turkish"], al\u00E7ak: ["turkish"], aldanma: ["turkish"], aleni: ["turkish"], alet: ["turkish"], alfabe: ["turkish"], alg\u0131lama: ["turkish"], al\u0131ngan: ["turkish"], alk\u0131\u015F: ["turkish"], alkol: ["turkish"], alpay: ["turkish"], alperen: ["turkish"], alt\u0131n: ["turkish"], alt\u00FCst: ["turkish"], altyap\u0131: ["turkish"], alyuvar: ["turkish"], amade: ["turkish"], amat\u00F6r: ["turkish"], amazon: ["turkish"], ambalaj: ["turkish"], amblem: ["turkish"], ambulans: ["turkish"], amca: ["turkish"], amel: ["turkish"], amir: ["turkish"], amiyane: ["turkish"], amorti: ["turkish"], ampul: ["turkish"], anadolu: ["turkish"], anahtar: ["turkish"], anakonda: ["turkish"], anaokul: ["turkish"], anapara: ["turkish"], anar\u015Fi: ["turkish"], anatomi: ["turkish"], anayasa: ["turkish"], anekdot: ["turkish"], anestezi: ["turkish"], angaje: ["turkish"], anka: ["turkish"], anket: ["turkish"], anlaml\u0131: ["turkish"], anne: ["turkish"], anomali: ["turkish"], anonim: ["turkish"], anten: ["turkish"], antla\u015Fma: ["turkish"], apse: ["turkish"], araba: ["turkish"], arac\u0131: ["turkish"], araf: ["turkish"], arbede: ["turkish"], arda: ["turkish"], arefe: ["turkish"], argo: ["turkish"], arg\u00FCman: ["turkish"], arkada\u015F: ["turkish"], armoni: ["turkish"], arsa: ["turkish"], ars\u0131z: ["turkish"], art\u0131: ["turkish"], aruz: ["turkish"], asans\u00F6r: ["turkish"], asayi\u015F: ["turkish"], asgari: ["turkish"], asil: ["turkish"], asker: ["turkish"], ask\u0131: ["turkish"], aslan: ["turkish"], asosyal: ["turkish"], astsubay: ["turkish"], asya: ["turkish"], a\u015F\u00E7\u0131: ["turkish"], a\u015F\u0131r\u0131: ["turkish"], a\u015Fure: ["turkish"], atabey: ["turkish"], ataman: ["turkish"], ate\u015F: ["turkish"], atmaca: ["turkish"], atmosfer: ["turkish"], at\u00F6lye: ["turkish"], avc\u0131: ["turkish"], avdet: ["turkish"], avize: ["turkish"], avlu: ["turkish"], avokado: ["turkish"], avrupa: ["turkish"], avukat: ["turkish"], ayaz: ["turkish"], ay\u00E7i\u00E7e\u011Fi: ["turkish"], ayd\u0131n: ["turkish"], ayg\u0131t: ["turkish"], ayna: ["turkish"], ayran: ["turkish"], ayr\u0131nt\u0131: ["turkish"], azim: ["turkish"], baca: ["turkish"], bagaj: ["turkish"], ba\u011Flant\u0131: ["turkish"], bahad\u0131r: ["turkish"], bah\u00E7e: ["turkish"], baki: ["turkish"], bakkal: ["turkish"], baklava: ["turkish"], bakteri: ["turkish"], bal\u00E7\u0131k: ["turkish"], balina: ["turkish"], balo: ["turkish"], balta: ["turkish"], bant: ["turkish"], banyo: ["turkish"], bardak: ["turkish"], bar\u0131\u015F: ["turkish"], ba\u015Fbu\u011F: ["turkish"], ba\u015F\u0131bo\u015F: ["turkish"], ba\u015Fkan: ["turkish"], ba\u015Fl\u0131k: ["turkish"], bavul: ["turkish"], bay\u0131nd\u0131r: ["turkish"], bayku\u015F: ["turkish"], bazlama: ["turkish"], bedel: ["turkish"], beg\u00FCm: ["turkish"], bek\u00E7i: ["turkish"], bekle: ["turkish"], belge: ["turkish"], belki: ["turkish"], bencil: ["turkish"], benek: ["turkish"], bengi: ["turkish"], berjer: ["turkish"], berk: ["turkish"], berrak: ["turkish"], be\u015Fik: ["turkish"], beyin: ["turkish"], beyo\u011Flu: ["turkish"], b\u0131\u00E7ak: ["turkish"], biberiye: ["turkish"], bidon: ["turkish"], bihaber: ["turkish"], bikini: ["turkish"], bilezik: ["turkish"], bilin\u00E7: ["turkish"], bilye: ["turkish"], bina: ["turkish"], binba\u015F\u0131: ["turkish"], biny\u0131l: ["turkish"], bisiklet: ["turkish"], bisk\u00FCvi: ["turkish"], bitki: ["turkish"], bizzat: ["turkish"], bodrum: ["turkish"], bo\u011Faz: ["turkish"], boh\u00E7a: ["turkish"], boncuk: ["turkish"], bonfile: ["turkish"], borsa: ["turkish"], boru: ["turkish"], bostan: ["turkish"], bo\u015Fbo\u011Faz: ["turkish"], botanik: ["turkish"], boya: ["turkish"], boykot: ["turkish"], boynuz: ["turkish"], bozgun: ["turkish"], bozk\u0131r: ["turkish"], b\u00F6l\u00FCm: ["turkish"], b\u00F6rek: ["turkish"], bu\u00E7uk: ["turkish"], bug\u00FCn: ["turkish"], bu\u011Fday: ["turkish"], buhar: ["turkish"], buhran: ["turkish"], bulvar: ["turkish"], buram: ["turkish"], bur\u00E7ak: ["turkish"], burs: ["turkish"], burun: ["turkish"], buzda\u011F\u0131: ["turkish"], buzk\u0131ran: ["turkish"], b\u00FCc\u00FCr: ["turkish"], b\u00FCfe: ["turkish"], b\u00FClten: ["turkish"], b\u00FCt\u00E7e: ["turkish"], b\u00FCt\u00FCn: ["turkish"], b\u00FCy\u00FCk: ["turkish"], cac\u0131k: ["turkish"], cad\u0131: ["turkish"], cahil: ["turkish"], cambaz: ["turkish"], canh\u0131ra\u015F: ["turkish"], casus: ["turkish"], cazibe: ["turkish"], cehalet: ["turkish"], cehennem: ["turkish"], ceket: ["turkish"], cemre: ["turkish"], cenin: ["turkish"], cennet: ["turkish"], cepken: ["turkish"], cerrah: ["turkish"], cesur: ["turkish"], cetvel: ["turkish"], cevher: ["turkish"], ceylan: ["turkish"], c\u0131l\u0131z: ["turkish"], c\u0131va: ["turkish"], cilt: ["turkish"], cisim: ["turkish"], ciyak: ["turkish"], co\u011Frafya: ["turkish"], c\u00F6mert: ["turkish"], cumba: ["turkish"], c\u00FCzdan: ["turkish"], \u00E7abucak: ["turkish"], \u00E7ad\u0131r: ["turkish"], \u00E7a\u011Fda\u015F: ["turkish"], \u00E7a\u011Flayan: ["turkish"], \u00E7a\u011Fr\u0131: ["turkish"], \u00E7akmak: ["turkish"], \u00E7al\u0131\u015Fkan: ["turkish"], \u00E7ama\u015F\u0131r: ["turkish"], \u00E7apa: ["turkish"], \u00E7aput: ["turkish"], \u00E7ar\u0131k: ["turkish"], \u00E7arpan: ["turkish"], \u00E7ar\u015Faf: ["turkish"], \u00E7ayhane: ["turkish"], \u00E7ekirdek: ["turkish"], \u00E7elebi: ["turkish"], \u00E7ember: ["turkish"], \u00E7enet: ["turkish"], \u00E7engel: ["turkish"], \u00E7er\u00E7eve: ["turkish"], \u00E7erez: ["turkish"], \u00E7e\u015Fit: ["turkish"], \u00E7e\u015Fme: ["turkish"], \u00E7ete: ["turkish"], \u00E7evre: ["turkish"], \u00E7eyiz: ["turkish"], \u00E7eyrek: ["turkish"], \u00E7\u0131\u011F\u0131r: ["turkish"], \u00E7\u0131lg\u0131n: ["turkish"], \u00E7\u0131ng\u0131rak: ["turkish"], \u00E7ift: ["turkish"], \u00E7i\u011Fdem: ["turkish"], \u00E7ikolata: ["turkish"], \u00E7ilek: ["turkish"], \u00E7imen: ["turkish"], \u00E7ivi: ["turkish"], \u00E7oban: ["turkish"], \u00E7ocuk: ["turkish"], \u00E7okgen: ["turkish"], \u00E7omak: ["turkish"], \u00E7orba: ["turkish"], \u00E7\u00F6zelti: ["turkish"], \u00E7ubuk: ["turkish"], \u00E7ukur: ["turkish"], \u00E7uval: ["turkish"], \u00E7\u00FCr\u00FCk: ["turkish"], da\u011Fba\u015F\u0131: ["turkish"], da\u011F\u0131l\u0131m: ["turkish"], daktilo: ["turkish"], dald\u0131r\u0131\u015F: ["turkish"], dalga: ["turkish"], dalkavuk: ["turkish"], damak: ["turkish"], dam\u0131tma: ["turkish"], damla: ["turkish"], dana: ["turkish"], dandik: ["turkish"], dan\u0131\u015Fman: ["turkish"], daniska: ["turkish"], dantel: ["turkish"], darge\u00E7it: ["turkish"], darphane: ["turkish"], davet: ["turkish"], day\u0131: ["turkish"], defter: ["turkish"], de\u011Fer: ["turkish"], de\u011Firmen: ["turkish"], deh\u015Fet: ["turkish"], delge\u00E7: ["turkish"], demir: ["turkish"], deneyim: ["turkish"], denge: ["turkish"], depo: ["turkish"], deprem: ["turkish"], derdest: ["turkish"], dere: ["turkish"], derhal: ["turkish"], derman: ["turkish"], dernek: ["turkish"], dervi\u015F: ["turkish"], desen: ["turkish"], destan: ["turkish"], d\u0131\u015Far\u0131: ["turkish"], d\u0131\u015Fb\u00FCkey: ["turkish"], dijital: ["turkish"], dikba\u015Fl\u0131: ["turkish"], dilek\u00E7e: ["turkish"], dima\u011F: ["turkish"], dinamik: ["turkish"], dindar: ["turkish"], dinleme: ["turkish"], dinozor: ["turkish"], dip\u00E7ik: ["turkish"], dipnot: ["turkish"], direni\u015F: ["turkish"], dirsek: ["turkish"], disiplin: ["turkish"], divri\u011Fi: ["turkish"], diz\u00FCst\u00FC: ["turkish"], dobra: ["turkish"], dodurga: ["turkish"], do\u011Falgaz: ["turkish"], dok\u00FCman: ["turkish"], dolap: ["turkish"], donan\u0131m: ["turkish"], dondurma: ["turkish"], don\u00F6r: ["turkish"], doruk: ["turkish"], dosdo\u011Fru: ["turkish"], dost: ["turkish"], dosya: ["turkish"], dozer: ["turkish"], d\u00F6k\u00FCm: ["turkish"], d\u00F6nence: ["turkish"], d\u00F6rtyol: ["turkish"], d\u00F6vme: ["turkish"], dram: ["turkish"], dublaj: ["turkish"], durum: ["turkish"], duvak: ["turkish"], duyarga: ["turkish"], duyma: ["turkish"], duyuru: ["turkish"], d\u00FC\u011Fme: ["turkish"], d\u00FC\u011F\u00FCm: ["turkish"], d\u00FCkkan: ["turkish"], d\u00FCn\u00FCr: ["turkish"], d\u00FCped\u00FCz: ["turkish"], d\u00FCrb\u00FCn: ["turkish"], d\u00FC\u015F\u00FCn\u00FCr: ["turkish"], d\u00FCzayak: ["turkish"], d\u00FCzeltme: ["turkish"], ebeveyn: ["turkish"], ebru: ["turkish"], ecel: ["turkish"], ecnebi: ["turkish"], ecza: ["turkish"], edat: ["turkish"], edilgen: ["turkish"], efendi: ["turkish"], efor: ["turkish"], efsane: ["turkish"], egemen: ["turkish"], egzersiz: ["turkish"], e\u011Frelti: ["turkish"], ekarte: ["turkish"], ekip: ["turkish"], eklem: ["turkish"], ekmek: ["turkish"], ekol: ["turkish"], ekonomi: ["turkish"], ekose: ["turkish"], ekran: ["turkish"], ekvator: ["turkish"], elaman: ["turkish"], elastik: ["turkish"], elbet: ["turkish"], elbise: ["turkish"], el\u00E7i: ["turkish"], eldiven: ["turkish"], eleba\u015F\u0131: ["turkish"], ele\u015Ftiri: ["turkish"], elma: ["turkish"], elo\u011Flu: ["turkish"], elveda: ["turkish"], emare: ["turkish"], emek\u00E7i: ["turkish"], emisyon: ["turkish"], emniyet: ["turkish"], empati: ["turkish"], emsal: ["turkish"], emzik: ["turkish"], end\u00FCstri: ["turkish"], enerji: ["turkish"], engebe: ["turkish"], eni\u015Fte: ["turkish"], enkaz: ["turkish"], entari: ["turkish"], entegre: ["turkish"], entrika: ["turkish"], enzim: ["turkish"], erdem: ["turkish"], ergen: ["turkish"], erguvan: ["turkish"], erkek: ["turkish"], erozyon: ["turkish"], ertesi: ["turkish"], erzak: ["turkish"], esaret: ["turkish"], esenlik: ["turkish"], eser: ["turkish"], eski: ["turkish"], esnek: ["turkish"], e\u015Farp: ["turkish"], e\u015Fofman: ["turkish"], e\u015Fraf: ["turkish"], e\u015Fya: ["turkish"], e\u015Fzaman: ["turkish"], etik: ["turkish"], etken: ["turkish"], etkinlik: ["turkish"], et\u00FCt: ["turkish"], evet: ["turkish"], evire: ["turkish"], evrak: ["turkish"], evrim: ["turkish"], eyalet: ["turkish"], eyvah: ["turkish"], ezber: ["turkish"], fabrika: ["turkish"], fanus: ["turkish"], fason: ["turkish"], fasulye: ["turkish"], fatih: ["turkish"], fatura: ["turkish"], fayans: ["turkish"], fayton: ["turkish"], faz\u0131l: ["turkish"], fazilet: ["turkish"], felsefe: ["turkish"], fener: ["turkish"], feribot: ["turkish"], fersah: ["turkish"], fesih: ["turkish"], feveran: ["turkish"], feza: ["turkish"], f\u0131\u00E7\u0131: ["turkish"], f\u0131ld\u0131r: ["turkish"], f\u0131nd\u0131k: ["turkish"], f\u0131r\u00E7a: ["turkish"], f\u0131rsat: ["turkish"], f\u0131rt\u0131na: ["turkish"], f\u0131t\u0131k: ["turkish"], fidan: ["turkish"], fidye: ["turkish"], fig\u00FCr: ["turkish"], fihrist: ["turkish"], fikir: ["turkish"], fildi\u015Fi: ["turkish"], filtre: ["turkish"], fincan: ["turkish"], firuze: ["turkish"], fitil: ["turkish"], fiyaka: ["turkish"], fizik: ["turkish"], fla\u015F: ["turkish"], fl\u00FCt: ["turkish"], fosil: ["turkish"], fren: ["turkish"], fukara: ["turkish"], futbol: ["turkish"], garabet: ["turkish"], gariban: ["turkish"], garnit\u00FCr: ["turkish"], gazi: ["turkish"], gece: ["turkish"], gedik: ["turkish"], gelenek: ["turkish"], gelin: ["turkish"], gemi: ["turkish"], gen\u00E7: ["turkish"], geni\u015F: ["turkish"], geometri: ["turkish"], ger\u00E7ek: ["turkish"], gevrek: ["turkish"], gezegen: ["turkish"], gezgin: ["turkish"], geziyolu: ["turkish"], g\u0131c\u0131k: ["turkish"], g\u0131da: ["turkish"], g\u0131ybet: ["turkish"], girdap: ["turkish"], giri\u015Fim: ["turkish"], gitar: ["turkish"], giyecek: ["turkish"], giysi: ["turkish"], gizem: ["turkish"], gofret: ["turkish"], goril: ["turkish"], g\u00F6bek: ["turkish"], g\u00F6\u00E7ebe: ["turkish"], g\u00F6\u011F\u00FCs: ["turkish"], g\u00F6kdelen: ["turkish"], g\u00F6kmen: ["turkish"], g\u00F6ky\u00FCz\u00FC: ["turkish"], g\u00F6lge: ["turkish"], g\u00F6mlek: ["turkish"], g\u00F6n\u00FCl: ["turkish"], g\u00F6renek: ["turkish"], g\u00F6rkemli: ["turkish"], g\u00F6rsel: ["turkish"], g\u00F6steri: ["turkish"], g\u00F6vde: ["turkish"], g\u00F6zalt\u0131: ["turkish"], g\u00F6zc\u00FC: ["turkish"], g\u00F6zda\u011F\u0131: ["turkish"], g\u00F6zleme: ["turkish"], g\u00F6zya\u015F\u0131: ["turkish"], grup: ["turkish"], gurbet: ["turkish"], gus\u00FCl: ["turkish"], g\u00FCbre: ["turkish"], g\u00FCfte: ["turkish"], g\u00FCm\u00FC\u015F: ["turkish"], g\u00FCnayd\u0131n: ["turkish"], g\u00FCncel: ["turkish"], g\u00FCnd\u00FCz: ["turkish"], g\u00FCne\u015F: ["turkish"], g\u00FCny\u00FCz\u00FC: ["turkish"], g\u00FCrb\u00FCz: ["turkish"], g\u00FCvercin: ["turkish"], g\u00FCzel: ["turkish"], hacamat: ["turkish"], hacim: ["turkish"], hademe: ["turkish"], haf\u0131z: ["turkish"], hafriyat: ["turkish"], hafta: ["turkish"], hakan: ["turkish"], hakem: ["turkish"], hakikat: ["turkish"], haksever: ["turkish"], hal\u0131: ["turkish"], han\u00E7er: ["turkish"], hane: ["turkish"], hapis: ["turkish"], hap\u015F\u0131r\u0131k: ["turkish"], harf: ["turkish"], haseki: ["turkish"], hasret: ["turkish"], hatun: ["turkish"], havu\u00E7: ["turkish"], haylaz: ["turkish"], haysiyet: ["turkish"], hayvan: ["turkish"], hedef: ["turkish"], hemen: ["turkish"], hemfikir: ["turkish"], hendek: ["turkish"], hepsi: ["turkish"], hergele: ["turkish"], herhangi: ["turkish"], hesap: ["turkish"], heyecan: ["turkish"], heykel: ["turkish"], hezimet: ["turkish"], h\u0131\u00E7k\u0131r\u0131k: ["turkish"], h\u0131z\u00F6l\u00E7er: ["turkish"], hicviye: ["turkish"], hikaye: ["turkish"], hikmet: ["turkish"], hile: ["turkish"], hisse: ["turkish"], hobi: ["turkish"], hoca: ["turkish"], horlama: ["turkish"], ho\u015Fbe\u015F: ["turkish"], ho\u015Fg\u00F6r\u00FC: ["turkish"], hoyrat: ["turkish"], h\u00F6rg\u00FC\u00E7: ["turkish"], h\u00F6y\u00FCk: ["turkish"], hudut: ["turkish"], hukuk: ["turkish"], hunhar: ["turkish"], hurda: ["turkish"], huysuz: ["turkish"], huzur: ["turkish"], h\u00FCcum: ["turkish"], h\u00FCk\u00FCmet: ["turkish"], h\u00FCnkar: ["turkish"], h\u00FCviyet: ["turkish"], \u0131rmak: ["turkish"], \u0131s\u0131\u00F6l\u00E7er: ["turkish"], \u0131s\u0131t\u0131c\u0131: ["turkish"], \u0131spanak: ["turkish"], \u0131srar: ["turkish"], \u0131\u015F\u0131ldak: ["turkish"], \u0131zd\u0131rap: ["turkish"], \u0131zgara: ["turkish"], ibadet: ["turkish"], icat: ["turkish"], i\u00E7b\u00FCkey: ["turkish"], i\u00E7ecek: ["turkish"], i\u00E7g\u00FCd\u00FC: ["turkish"], i\u00E7sel: ["turkish"], idman: ["turkish"], iftihar: ["turkish"], i\u011Fne: ["turkish"], ihanet: ["turkish"], ihbar: ["turkish"], ihdas: ["turkish"], ihmal: ["turkish"], ihracat: ["turkish"], ihsan: ["turkish"], ikilem: ["turkish"], ikindi: ["turkish"], ikircik: ["turkish"], iklim: ["turkish"], iksir: ["turkish"], iktibas: ["turkish"], ila\u00E7: ["turkish"], il\u00E7e: ["turkish"], ileri: ["turkish"], ileti\u015Fim: ["turkish"], ilgi: ["turkish"], ilhak: ["turkish"], ilkbahar: ["turkish"], ilkokul: ["turkish"], ilmek: ["turkish"], imkan: ["turkish"], imle\u00E7: ["turkish"], imsak: ["turkish"], imtihan: ["turkish"], imza: ["turkish"], ince: ["turkish"], inkar: ["turkish"], in\u015Fa: ["turkish"], ipek: ["turkish"], ipucu: ["turkish"], irade: ["turkish"], irfan: ["turkish"], irmik: ["turkish"], isabet: ["turkish"], iskele: ["turkish"], israf: ["turkish"], isyan: ["turkish"], i\u015F\u00E7i: ["turkish"], i\u015Fgal: ["turkish"], i\u015Fg\u00FCzar: ["turkish"], i\u015Flem: ["turkish"], itibar: ["turkish"], itiraf: ["turkish"], ivedi: ["turkish"], ivme: ["turkish"], iyile\u015Fme: ["turkish"], iyimser: ["turkish"], izbandut: ["turkish"], izci: ["turkish"], izdiham: ["turkish"], izin: ["turkish"], jakoben: ["turkish"], jandarma: ["turkish"], jargon: ["turkish"], kabaday\u0131: ["turkish"], kablo: ["turkish"], kabus: ["turkish"], ka\u00E7amak: ["turkish"], kadeh: ["turkish"], kad\u0131n: ["turkish"], kadraj: ["turkish"], kafa: ["turkish"], kafkas: ["turkish"], ka\u011F\u0131t: ["turkish"], ka\u011Fn\u0131: ["turkish"], kahkaha: ["turkish"], kahraman: ["turkish"], kahvalt\u0131: ["turkish"], kak\u00FCl: ["turkish"], kald\u0131r\u0131m: ["turkish"], kale: ["turkish"], kalibre: ["turkish"], kalkan: ["turkish"], kalpak: ["turkish"], kam\u0131\u015F: ["turkish"], kamyon: ["turkish"], kanat: ["turkish"], kanda\u015F: ["turkish"], kanepe: ["turkish"], kanser: ["turkish"], kanun: ["turkish"], kaos: ["turkish"], kap\u0131: ["turkish"], kapl\u0131ca: ["turkish"], kaptan: ["turkish"], karanl\u0131k: ["turkish"], karde\u015F: ["turkish"], karga: ["turkish"], kar\u0131nca: ["turkish"], karma\u015Fa: ["turkish"], kar\u015F\u0131t: ["turkish"], kas\u0131rga: ["turkish"], kask: ["turkish"], kasvet: ["turkish"], katk\u0131: ["turkish"], katman: ["turkish"], kavram: ["turkish"], kaygan: ["turkish"], kaynak\u00E7a: ["turkish"], kayyum: ["turkish"], kedi: ["turkish"], kehanet: ["turkish"], kekik: ["turkish"], kelebek: ["turkish"], kenar: ["turkish"], kerkenez: ["turkish"], kerpi\u00E7: ["turkish"], kesirli: ["turkish"], kesmece: ["turkish"], kestane: ["turkish"], ke\u015Fkek: ["turkish"], ket\u00E7ap: ["turkish"], keyfiyet: ["turkish"], k\u0131ble: ["turkish"], k\u0131demli: ["turkish"], k\u0131lavuz: ["turkish"], k\u0131l\u00E7\u0131k: ["turkish"], k\u0131l\u0131f: ["turkish"], k\u0131ra\u00E7: ["turkish"], k\u0131rm\u0131z\u0131: ["turkish"], k\u0131rsal: ["turkish"], k\u0131sayol: ["turkish"], k\u0131s\u0131m: ["turkish"], k\u0131skan\u00E7: ["turkish"], k\u0131smet: ["turkish"], k\u0131\u015Fla: ["turkish"], k\u0131van\u00E7: ["turkish"], k\u0131v\u0131lc\u0131m: ["turkish"], k\u0131vr\u0131k: ["turkish"], k\u0131yafet: ["turkish"], k\u0131ymetli: ["turkish"], k\u0131zak: ["turkish"], k\u0131z\u0131lc\u0131k: ["turkish"], kibar: ["turkish"], kinaye: ["turkish"], kira: ["turkish"], kiremit: ["turkish"], kirli: ["turkish"], kirpik: ["turkish"], ki\u015Fisel: ["turkish"], kitap: ["turkish"], ko\u00E7ba\u015F\u0131: ["turkish"], kodaman: ["turkish"], ko\u011Fu\u015F: ["turkish"], kokteyl: ["turkish"], kolayc\u0131: ["turkish"], kolbast\u0131: ["turkish"], kolonya: ["turkish"], koltuk: ["turkish"], kolye: ["turkish"], kombine: ["turkish"], komedyen: ["turkish"], komiser: ["turkish"], komposto: ["turkish"], kom\u015Fu: ["turkish"], komuta: ["turkish"], konak: ["turkish"], konfor: ["turkish"], koni: ["turkish"], kons\u00FCl: ["turkish"], kopya: ["turkish"], korkusuz: ["turkish"], korna: ["turkish"], korse: ["turkish"], korunak: ["turkish"], korvet: ["turkish"], kost\u00FCm: ["turkish"], ko\u015Ful: ["turkish"], koyu: ["turkish"], kozmik: ["turkish"], k\u00F6fte: ["turkish"], k\u00F6kensel: ["turkish"], k\u00F6pr\u00FCc\u00FCk: ["turkish"], k\u00F6p\u00FCk: ["turkish"], k\u00F6rd\u00FC\u011F\u00FCm: ["turkish"], k\u00F6rfez: ["turkish"], k\u00F6stebek: ["turkish"], k\u00F6\u015Fegen: ["turkish"], k\u00F6t\u00FC: ["turkish"], kravat: ["turkish"], kriter: ["turkish"], kuantum: ["turkish"], kudurma: ["turkish"], kulu\u00E7ka: ["turkish"], kul\u00FCbe: ["turkish"], kumanya: ["turkish"], kumbara: ["turkish"], kumlu: ["turkish"], kumpir: ["turkish"], kumral: ["turkish"], kundura: ["turkish"], kupa: ["turkish"], kupkuru: ["turkish"], kuramsal: ["turkish"], kurba\u011Fa: ["turkish"], kurdele: ["turkish"], kurgu: ["turkish"], kurmay: ["turkish"], kur\u015Fun: ["turkish"], kurtulu\u015F: ["turkish"], kurultay: ["turkish"], kurye: ["turkish"], kusursuz: ["turkish"], ku\u015Fak: ["turkish"], ku\u015Fba\u015F\u0131: ["turkish"], ku\u015Fkulu: ["turkish"], kutlama: ["turkish"], kutsal: ["turkish"], kutup: ["turkish"], kuver: ["turkish"], kuyruk: ["turkish"], kuzey: ["turkish"], kuzgun: ["turkish"], k\u00FC\u00E7\u00FCk: ["turkish"], k\u00FCl\u00E7e: ["turkish"], k\u00FClfet: ["turkish"], k\u00FClliye: ["turkish"], k\u00FClt\u00FCrel: ["turkish"], k\u00FCmes: ["turkish"], k\u00FCnefe: ["turkish"], k\u00FCresel: ["turkish"], k\u00FCtle: ["turkish"], lahana: ["turkish"], lahmacun: ["turkish"], lamba: ["turkish"], lansman: ["turkish"], lava\u015F: ["turkish"], lay\u0131k: ["turkish"], le\u011Fen: ["turkish"], levent: ["turkish"], leziz: ["turkish"], lezzet: ["turkish"], lider: ["turkish"], likide: ["turkish"], liman: ["turkish"], liste: ["turkish"], litre: ["turkish"], liyakat: ["turkish"], lodos: ["turkish"], lokanta: ["turkish"], lokman: ["turkish"], lokum: ["turkish"], lunapark: ["turkish"], l\u00FCtfen: ["turkish"], l\u00FCzum: ["turkish"], nokta: ["turkish"], mabet: ["turkish"], macera: ["turkish"], macun: ["turkish"], madalya: ["turkish"], madde: ["turkish"], madem: ["turkish"], ma\u011Fara: ["turkish"], ma\u011Fdur: ["turkish"], ma\u011Ffiret: ["turkish"], ma\u011Flup: ["turkish"], mahalle: ["turkish"], mahcup: ["turkish"], mahir: ["turkish"], mahkeme: ["turkish"], mahlas: ["turkish"], mahrum: ["turkish"], mahsul: ["turkish"], makas: ["turkish"], makbuz: ["turkish"], makine: ["turkish"], makro: ["turkish"], maksat: ["turkish"], makul: ["turkish"], maliye: ["turkish"], manav: ["turkish"], mangal: ["turkish"], manidar: ["turkish"], manken: ["turkish"], mant\u0131k: ["turkish"], manzara: ["turkish"], mare\u015Fal: ["turkish"], margarin: ["turkish"], marifet: ["turkish"], marmelat: ["turkish"], masa\u00FCst\u00FC: ["turkish"], masmavi: ["turkish"], masraf: ["turkish"], masum: ["turkish"], matah: ["turkish"], materyal: ["turkish"], matrak: ["turkish"], maval: ["turkish"], mavra: ["turkish"], maydanoz: ["turkish"], mayho\u015F: ["turkish"], maytap: ["turkish"], mazbata: ["turkish"], mazeret: ["turkish"], mazlum: ["turkish"], mazot: ["turkish"], mazur: ["turkish"], mebla\u011F: ["turkish"], mebus: ["turkish"], mecaz: ["turkish"], mecbur: ["turkish"], meclis: ["turkish"], mecmua: ["turkish"], mecnun: ["turkish"], me\u00E7hul: ["turkish"], medeni: ["turkish"], mehtap: ["turkish"], mekanik: ["turkish"], melodi: ["turkish"], meltem: ["turkish"], memur: ["turkish"], mendil: ["turkish"], menek\u015Fe: ["turkish"], mente\u015Fe: ["turkish"], merakl\u0131: ["turkish"], mercek: ["turkish"], merdiven: ["turkish"], merhaba: ["turkish"], merinos: ["turkish"], merkez: ["turkish"], mermi: ["turkish"], mert: ["turkish"], mesafe: ["turkish"], mesele: ["turkish"], mesken: ["turkish"], meslek: ["turkish"], me\u015Fale: ["turkish"], me\u015Fgul: ["turkish"], me\u015Fhur: ["turkish"], metafor: ["turkish"], metin: ["turkish"], metre: ["turkish"], mevcut: ["turkish"], mevkida\u015F: ["turkish"], meydan: ["turkish"], meyil: ["turkish"], meyve: ["turkish"], meziyet: ["turkish"], mezun: ["turkish"], m\u0131knat\u0131s: ["turkish"], m\u0131sra: ["turkish"], m\u0131z\u0131ka: ["turkish"], mi\u011Ffer: ["turkish"], mihrak: ["turkish"], miktar: ["turkish"], milat: ["turkish"], milli: ["turkish"], mimar: ["turkish"], minare: ["turkish"], mineral: ["turkish"], minik: ["turkish"], minyon: ["turkish"], mirliva: ["turkish"], misafir: ["turkish"], miskin: ["turkish"], miting: ["turkish"], miyop: ["turkish"], mizah: ["turkish"], mobilya: ["turkish"], monit\u00F6r: ["turkish"], mor\u00F6tesi: ["turkish"], motive: ["turkish"], mozaik: ["turkish"], muavin: ["turkish"], mucize: ["turkish"], muhaf\u0131z: ["turkish"], muhte\u015Fem: ["turkish"], mukayese: ["turkish"], mumya: ["turkish"], musluk: ["turkish"], mu\u015Famba: ["turkish"], mutab\u0131k: ["turkish"], mutfak: ["turkish"], mutlu: ["turkish"], muzaffer: ["turkish"], muzdarip: ["turkish"], m\u00FCbarek: ["turkish"], m\u00FCcadele: ["turkish"], m\u00FCd\u00FCr: ["turkish"], m\u00FCfredat: ["turkish"], m\u00FCft\u00FC: ["turkish"], m\u00FChendis: ["turkish"], m\u00FChim: ["turkish"], m\u00FChlet: ["turkish"], m\u00FCkemmel: ["turkish"], m\u00FClk: ["turkish"], m\u00FCmk\u00FCn: ["turkish"], m\u00FCmtaz: ["turkish"], m\u00FCsrif: ["turkish"], m\u00FCstesna: ["turkish"], m\u00FC\u015Fahit: ["turkish"], m\u00FC\u015Fteri: ["turkish"], m\u00FCtercim: ["turkish"], m\u00FCthi\u015F: ["turkish"], m\u00FCze: ["turkish"], m\u00FCzik: ["turkish"], nab\u0131z: ["turkish"], nadas: ["turkish"], nadir: ["turkish"], naho\u015F: ["turkish"], nakarat: ["turkish"], nak\u0131\u015F: ["turkish"], nalbur: ["turkish"], namlu: ["turkish"], namus: ["turkish"], nank\u00F6r: ["turkish"], nargile: ["turkish"], narkoz: ["turkish"], nas\u0131l: ["turkish"], nasip: ["turkish"], naylon: ["turkish"], nazar: ["turkish"], naz\u0131m: ["turkish"], nazik: ["turkish"], neden: ["turkish"], nefes: ["turkish"], negatif: ["turkish"], neon: ["turkish"], nept\u00FCn: ["turkish"], nerede: ["turkish"], nesil: ["turkish"], nesnel: ["turkish"], ne\u015Feli: ["turkish"], netice: ["turkish"], nevresim: ["turkish"], neyse: ["turkish"], neyzen: ["turkish"], nezaket: ["turkish"], nezih: ["turkish"], nezle: ["turkish"], nicel: ["turkish"], nil\u00FCfer: ["turkish"], nimet: ["turkish"], nisan: ["turkish"], nispet: ["turkish"], nitekim: ["turkish"], nizam: ["turkish"], nohut: ["turkish"], noksan: ["turkish"], nostalji: ["turkish"], noter: ["turkish"], n\u00F6bet: ["turkish"], numara: ["turkish"], numune: ["turkish"], nutuk: ["turkish"], n\u00FCfus: ["turkish"], obaba\u015F\u0131: ["turkish"], obez: ["turkish"], obje: ["turkish"], ocak: ["turkish"], odun: ["turkish"], ofansif: ["turkish"], ofis: ["turkish"], o\u011Flak: ["turkish"], o\u011Fuz: ["turkish"], ok\u00E7u: ["turkish"], oklava: ["turkish"], oksijen: ["turkish"], okul: ["turkish"], okumu\u015F: ["turkish"], okutman: ["turkish"], okuyucu: ["turkish"], okyanus: ["turkish"], ola\u011Fan: ["turkish"], olanak: ["turkish"], olas\u0131: ["turkish"], olay: ["turkish"], olgun: ["turkish"], olimpik: ["turkish"], olumlu: ["turkish"], omlet: ["turkish"], omurga: ["turkish"], onar\u0131m: ["turkish"], onursal: ["turkish"], optik: ["turkish"], orant\u0131: ["turkish"], ordu: ["turkish"], organik: ["turkish"], orijin: ["turkish"], orkide: ["turkish"], orman: ["turkish"], orta: ["turkish"], oru\u00E7: ["turkish"], ota\u011F: ["turkish"], otantik: ["turkish"], otel: ["turkish"], otoban: ["turkish"], otogar: ["turkish"], otomobil: ["turkish"], otonom: ["turkish"], otopark: ["turkish"], otorite: ["turkish"], otoyol: ["turkish"], oturum: ["turkish"], oyuk: ["turkish"], oyuncak: ["turkish"], ozan: ["turkish"], \u00F6deme: ["turkish"], \u00F6denek: ["turkish"], \u00F6dev: ["turkish"], \u00F6d\u00FCl: ["turkish"], \u00F6d\u00FCn\u00E7: ["turkish"], \u00F6fke: ["turkish"], \u00F6\u011Flen: ["turkish"], \u00F6\u011Frenci: ["turkish"], \u00F6\u011F\u00FCn: ["turkish"], \u00F6\u011F\u00FCt\u00FCc\u00FC: ["turkish"], \u00F6ks\u00FCr\u00FCk: ["turkish"], \u00F6l\u00E7me: ["turkish"], \u00F6l\u00E7\u00FC: ["turkish"], \u00F6l\u00FCms\u00FCz: ["turkish"], \u00F6m\u00FCr: ["turkish"], \u00F6nayak: ["turkish"], \u00F6nc\u00FC: ["turkish"], \u00F6nder: ["turkish"], \u00F6nem: ["turkish"], \u00F6nerge: ["turkish"], \u00F6ng\u00F6r\u00FC: ["turkish"], \u00F6nl\u00FCk: ["turkish"], \u00F6nsezi: ["turkish"], \u00F6p\u00FCc\u00FCk: ["turkish"], \u00F6rdek: ["turkish"], \u00F6rg\u00FC: ["turkish"], \u00F6rtbas: ["turkish"], \u00F6rtme: ["turkish"], \u00F6rt\u00FC: ["turkish"], \u00F6r\u00FCmcek: ["turkish"], \u00F6r\u00FCnt\u00FC: ["turkish"], \u00F6teberi: ["turkish"], \u00F6teki: ["turkish"], \u00F6v\u00FCn\u00E7: ["turkish"], \u00F6yk\u00FC: ["turkish"], \u00F6yleyse: ["turkish"], \u00F6z\u00E7ekim: ["turkish"], \u00F6zdeyi\u015F: ["turkish"], \u00F6zel: ["turkish"], \u00F6zenti: ["turkish"], \u00F6zerk: ["turkish"], \u00F6zg\u00FCrl\u00FCk: ["turkish"], \u00F6zlem: ["turkish"], \u00F6zl\u00FC: ["turkish"], \u00F6zne: ["turkish"], \u00F6zsever: ["turkish"], \u00F6z\u00FCmseme: ["turkish"], \u00F6z\u00FCr: ["turkish"], \u00F6zveri: ["turkish"], pabu\u00E7: ["turkish"], padi\u015Fah: ["turkish"], palamut: ["turkish"], palmiye: ["turkish"], palto: ["turkish"], palya\u00E7o: ["turkish"], pamuk: ["turkish"], panay\u0131r: ["turkish"], pancar: ["turkish"], panik: ["turkish"], panjur: ["turkish"], pankart: ["turkish"], pano: ["turkish"], pansuman: ["turkish"], pantolon: ["turkish"], panzehir: ["turkish"], papatya: ["turkish"], papyon: ["turkish"], para\u015F\u00FCt: ["turkish"], par\u00E7a: ["turkish"], pard\u00F6s\u00FC: ["turkish"], parf\u00FCm: ["turkish"], par\u0131lt\u0131: ["turkish"], parkur: ["turkish"], parmak: ["turkish"], parodi: ["turkish"], parsel: ["turkish"], partner: ["turkish"], pasaport: ["turkish"], pasif: ["turkish"], paskalya: ["turkish"], past\u0131rma: ["turkish"], pa\u015Fa: ["turkish"], patates: ["turkish"], paten: ["turkish"], patika: ["turkish"], patl\u0131can: ["turkish"], patolog: ["turkish"], payanda: ["turkish"], payda\u015F: ["turkish"], payidar: ["turkish"], payla\u015Fma: ["turkish"], paytak: ["turkish"], pe\u00E7ete: ["turkish"], peder: ["turkish"], pehlivan: ["turkish"], pekala: ["turkish"], pekmez: ["turkish"], pelerin: ["turkish"], pelikan: ["turkish"], pel\u00FC\u015F: ["turkish"], pembe: ["turkish"], pencere: ["turkish"], pense: ["turkish"], per\u00E7in: ["turkish"], perde: ["turkish"], pergel: ["turkish"], peri\u015Fan: ["turkish"], peron: ["turkish"], personel: ["turkish"], per\u015Fembe: ["turkish"], peruk: ["turkish"], pervane: ["turkish"], pespaye: ["turkish"], pestil: ["turkish"], pe\u015Fin: ["turkish"], petek: ["turkish"], petrol: ["turkish"], petunya: ["turkish"], peynir: ["turkish"], peyzaj: ["turkish"], p\u0131nar: ["turkish"], p\u0131rasa: ["turkish"], p\u0131rlanta: ["turkish"], pide: ["turkish"], pikap: ["turkish"], pilav: ["turkish"], pili\u00E7: ["turkish"], pipet: ["turkish"], pipo: ["turkish"], piramit: ["turkish"], pirin\u00E7: ["turkish"], pirzola: ["turkish"], pist: ["turkish"], pi\u015Fik: ["turkish"], pi\u015Fman: ["turkish"], piyasa: ["turkish"], piyes: ["turkish"], plaj: ["turkish"], plaket: ["turkish"], planlama: ["turkish"], platform: ["turkish"], plazma: ["turkish"], podyum: ["turkish"], po\u011Fa\u00E7a: ["turkish"], polat: ["turkish"], politika: ["turkish"], pop\u00FCler: ["turkish"], porselen: ["turkish"], portakal: ["turkish"], poster: ["turkish"], po\u015Fet: ["turkish"], poyraz: ["turkish"], pozitif: ["turkish"], pranga: ["turkish"], pratik: ["turkish"], prenses: ["turkish"], prim: ["turkish"], profil: ["turkish"], proje: ["turkish"], protokol: ["turkish"], puan: ["turkish"], pudra: ["turkish"], pusula: ["turkish"], p\u00FCre: ["turkish"], p\u00FCr\u00FCz: ["turkish"], p\u00FCst\u00FCl: ["turkish"], p\u00FCs\u00FCr: ["turkish"], racon: ["turkish"], radikal: ["turkish"], radyo: ["turkish"], rafadan: ["turkish"], rafine: ["turkish"], ra\u011Fbet: ["turkish"], rahat: ["turkish"], rahle: ["turkish"], rakam: ["turkish"], raket: ["turkish"], rakip: ["turkish"], rakun: ["turkish"], ralli: ["turkish"], randevu: ["turkish"], ranza: ["turkish"], rapor: ["turkish"], rastgele: ["turkish"], rasyonel: ["turkish"], raz\u0131: ["turkish"], realite: ["turkish"], re\u00E7ine: ["turkish"], refah: ["turkish"], referans: ["turkish"], refik: ["turkish"], rehber: ["turkish"], rehin: ["turkish"], reis: ["turkish"], rekabet: ["turkish"], reklam: ["turkish"], rekor: ["turkish"], rekt\u00F6r: ["turkish"], renk: ["turkish"], resim: ["turkish"], resmen: ["turkish"], restoran: ["turkish"], retorik: ["turkish"], reva\u00E7: ["turkish"], reyon: ["turkish"], rezalet: ["turkish"], rezerv: ["turkish"], rezil: ["turkish"], r\u0131ht\u0131m: ["turkish"], r\u0131za: ["turkish"], ritim: ["turkish"], rit\u00FCel: ["turkish"], rivayet: ["turkish"], roman: ["turkish"], rozet: ["turkish"], r\u00F6portaj: ["turkish"], r\u00F6tar: ["turkish"], ruble: ["turkish"], ruhban: ["turkish"], ruhsat: ["turkish"], rulet: ["turkish"], runik: ["turkish"], rutin: ["turkish"], rutubet: ["turkish"], r\u00FC\u015Fvet: ["turkish"], r\u00FCtbe: ["turkish"], r\u00FCya: ["turkish"], r\u00FCzgar: ["turkish"], sabah: ["turkish"], sab\u0131ka: ["turkish"], sabit: ["turkish"], sabun: ["turkish"], sa\u00E7ma: ["turkish"], sade: ["turkish"], sad\u0131k: ["turkish"], safahat: ["turkish"], safdil: ["turkish"], safkan: ["turkish"], sa\u011Fanak: ["turkish"], sa\u011Fduyu: ["turkish"], sa\u011Flam: ["turkish"], saha: ["turkish"], sahiden: ["turkish"], sahne: ["turkish"], sakal: ["turkish"], sak\u0131z: ["turkish"], sakin: ["turkish"], saklama: ["turkish"], saksa\u011Fan: ["turkish"], salamura: ["turkish"], sal\u00E7a: ["turkish"], salg\u0131: ["turkish"], sal\u0131n\u0131m: ["turkish"], salk\u0131m: ["turkish"], saltanat: ["turkish"], sanat\u00E7\u0131: ["turkish"], sancak: ["turkish"], sandalye: ["turkish"], saniye: ["turkish"], saplant\u0131: ["turkish"], saps\u0131z: ["turkish"], saray: ["turkish"], sar\u0131\u015F\u0131n: ["turkish"], sark\u0131k: ["turkish"], sarma\u015F\u0131k: ["turkish"], sat\u0131r: ["turkish"], sava\u015F\u0131m: ["turkish"], savunma: ["turkish"], saydam: ["turkish"], sayfa: ["turkish"], sayg\u0131n: ["turkish"], say\u0131sal: ["turkish"], sebep: ["turkish"], se\u00E7enek: ["turkish"], se\u00E7im: ["turkish"], se\u00E7kin: ["turkish"], se\u00E7men: ["turkish"], sedir: ["turkish"], sedye: ["turkish"], sefer: ["turkish"], sehpa: ["turkish"], sekizgen: ["turkish"], selekt\u00F6r: ["turkish"], selvi: ["turkish"], semavi: ["turkish"], sembol: ["turkish"], seminer: ["turkish"], senaryo: ["turkish"], sendika: ["turkish"], senkron: ["turkish"], sens\u00F6r: ["turkish"], sentez: ["turkish"], sepet: ["turkish"], seramik: ["turkish"], serbest: ["turkish"], serdar: ["turkish"], seremoni: ["turkish"], sergi: ["turkish"], serhat: ["turkish"], serin: ["turkish"], sermaye: ["turkish"], serpu\u015F: ["turkish"], sersem: ["turkish"], ser\u00FCven: ["turkish"], sesli: ["turkish"], seste\u015F: ["turkish"], sevap: ["turkish"], seviye: ["turkish"], seyahat: ["turkish"], seyirci: ["turkish"], sezon: ["turkish"], s\u0131cak: ["turkish"], s\u0131fat: ["turkish"], s\u0131hhi: ["turkish"], s\u0131nanma: ["turkish"], s\u0131n\u0131r: ["turkish"], s\u0131radan: ["turkish"], s\u0131rda\u015F: ["turkish"], s\u0131rma: ["turkish"], s\u0131rt\u00FCst\u00FC: ["turkish"], s\u0131zg\u0131t: ["turkish"], siftah: ["turkish"], sigorta: ["turkish"], sihirbaz: ["turkish"], silah: ["turkish"], silecek: ["turkish"], silindir: ["turkish"], simetri: ["turkish"], simge: ["turkish"], simit: ["turkish"], sincap: ["turkish"], sindirim: ["turkish"], sinema: ["turkish"], sinirli: ["turkish"], sipari\u015F: ["turkish"], sirke: ["turkish"], siroz: ["turkish"], sistem: ["turkish"], sivilce: ["turkish"], siyasi: ["turkish"], soba: ["turkish"], sofra: ["turkish"], so\u011Fuk: ["turkish"], sohbet: ["turkish"], sokak: ["turkish"], solfej: ["turkish"], solunum: ["turkish"], somut: ["turkish"], sonbahar: ["turkish"], sonraki: ["turkish"], sonsuz: ["turkish"], sorunsuz: ["turkish"], sosyete: ["turkish"], soya\u011Fac\u0131: ["turkish"], soyda\u015F: ["turkish"], soygun: ["turkish"], soytar\u0131: ["turkish"], s\u00F6\u011F\u00FC\u015F: ["turkish"], s\u00F6m\u00FCrge: ["turkish"], s\u00F6n\u00FCk: ["turkish"], s\u00F6ylem: ["turkish"], s\u00F6zc\u00FCk: ["turkish"], s\u00F6zde: ["turkish"], spatula: ["turkish"], spektrum: ["turkish"], spiker: ["turkish"], sporcu: ["turkish"], sprey: ["turkish"], stabil: ["turkish"], stat\u00FC: ["turkish"], stok: ["turkish"], stopaj: ["turkish"], strateji: ["turkish"], subay: ["turkish"], sucuk: ["turkish"], su\u00E7\u00FCst\u00FC: ["turkish"], suhulet: ["turkish"], sulama: ["turkish"], sungur: ["turkish"], sunucu: ["turkish"], surat: ["turkish"], susam: ["turkish"], suskun: ["turkish"], s\u00FCkse: ["turkish"], s\u00FCkut: ["turkish"], s\u00FClale: ["turkish"], s\u00FCnger: ["turkish"], s\u00FCp\u00FCrge: ["turkish"], s\u00FCrahi: ["turkish"], s\u00FCre\u00E7: ["turkish"], s\u00FCrg\u00FCn: ["turkish"], s\u00FCr\u00FCm: ["turkish"], s\u00FCsleme: ["turkish"], s\u00FCtanne: ["turkish"], s\u00FCtla\u00E7: ["turkish"], s\u00FCtun: ["turkish"], s\u00FCvari: ["turkish"], \u015Fahane: ["turkish"], \u015Fahbaz: ["turkish"], \u015Fahit: ["turkish"], \u015Fahsiyet: ["turkish"], \u015Fak\u0131ma: ["turkish"], \u015Faklaban: ["turkish"], \u015Fakrak: ["turkish"], \u015Famar: ["turkish"], \u015Fampiyon: ["turkish"], \u015Fansl\u0131: ["turkish"], \u015Fantiye: ["turkish"], \u015Fapka: ["turkish"], \u015Fark\u0131c\u0131: ["turkish"], \u015Fartname: ["turkish"], \u015Fa\u015F\u0131rma: ["turkish"], \u015Fa\u015Fk\u0131n: ["turkish"], \u015Fatafat: ["turkish"], \u015Fayet: ["turkish"], \u015Febeke: ["turkish"], \u015Fefkat: ["turkish"], \u015Feftali: ["turkish"], \u015Fehir: ["turkish"], \u015Fehvet: ["turkish"], \u015Feker: ["turkish"], \u015Fekil: ["turkish"], \u015Felale: ["turkish"], \u015Fema: ["turkish"], \u015Femsiye: ["turkish"], \u015Ferbet: ["turkish"], \u015Feref: ["turkish"], \u015Ferit: ["turkish"], \u015F\u0131mar\u0131k: ["turkish"], \u015F\u0131p\u0131d\u0131k: ["turkish"], \u015Fifre: ["turkish"], \u015Fimdi: ["turkish"], \u015Fim\u015Fek: ["turkish"], \u015Fip\u015Fak: ["turkish"], \u015Firin: ["turkish"], \u015Fi\u015Fe: ["turkish"], \u015Fi\u015Firme: ["turkish"], \u015Fofben: ["turkish"], \u015F\u00F6hret: ["turkish"], \u015F\u00F6len: ["turkish"], \u015F\u00FCphe: ["turkish"], tabaka: ["turkish"], tabure: ["turkish"], tadilat: ["turkish"], taharet: ["turkish"], tah\u0131l: ["turkish"], tahkim: ["turkish"], tahlil: ["turkish"], tahmin: ["turkish"], tahrifat: ["turkish"], tahsilat: ["turkish"], tahta: ["turkish"], taklit: ["turkish"], takoz: ["turkish"], taksici: ["turkish"], taktik: ["turkish"], takvim: ["turkish"], talebe: ["turkish"], talip: ["turkish"], tamamen: ["turkish"], tamirci: ["turkish"], tamtak\u0131r: ["turkish"], tand\u0131r: ["turkish"], tanecik: ["turkish"], tan\u0131t\u0131m: ["turkish"], tanr\u0131: ["turkish"], tansiyon: ["turkish"], tapan: ["turkish"], tap\u0131nak: ["turkish"], taptaze: ["turkish"], tapu: ["turkish"], tarafgir: ["turkish"], tarhana: ["turkish"], tar\u0131m: ["turkish"], tarih: ["turkish"], tarla: ["turkish"], tartak: ["turkish"], tarumar: ["turkish"], tasar\u0131m: ["turkish"], tasdik: ["turkish"], taslak: ["turkish"], tastamam: ["turkish"], ta\u015Feron: ["turkish"], ta\u015F\u0131nmaz: ["turkish"], ta\u015Fra: ["turkish"], tatava: ["turkish"], tatbikat: ["turkish"], tatil: ["turkish"], tatl\u0131: ["turkish"], tavsiye: ["turkish"], tav\u015Fan: ["turkish"], tavuk: ["turkish"], taze: ["turkish"], taziye: ["turkish"], tazminat: ["turkish"], tebe\u015Fir: ["turkish"], tebrik: ["turkish"], tecr\u00FCbe: ["turkish"], te\u00E7hizat: ["turkish"], tedarik: ["turkish"], tedbir: ["turkish"], tefti\u015F: ["turkish"], te\u011Fet: ["turkish"], te\u011Fmen: ["turkish"], tehdit: ["turkish"], tehlike: ["turkish"], tekd\u00FCze: ["turkish"], tekerlek: ["turkish"], tekme: ["turkish"], teknik: ["turkish"], tekrar: ["turkish"], telef: ["turkish"], telsiz: ["turkish"], telve: ["turkish"], temas: ["turkish"], tembel: ["turkish"], temiz: ["turkish"], temkin: ["turkish"], temsilci: ["turkish"], tendon: ["turkish"], teneke: ["turkish"], tenha: ["turkish"], tenkit: ["turkish"], tepeg\u00F6z: ["turkish"], tepki: ["turkish"], terazi: ["turkish"], terbiye: ["turkish"], tercih: ["turkish"], tereya\u011F\u0131: ["turkish"], terfi: ["turkish"], terim: ["turkish"], terminal: ["turkish"], tersane: ["turkish"], tertip: ["turkish"], tesad\u00FCf: ["turkish"], tescil: ["turkish"], tesir: ["turkish"], teslimat: ["turkish"], tespit: ["turkish"], testere: ["turkish"], te\u015Fekk\u00FCr: ["turkish"], te\u015Fhir: ["turkish"], te\u015Frif: ["turkish"], te\u015Fvik: ["turkish"], teyze: ["turkish"], tezah\u00FCr: ["turkish"], tezgah: ["turkish"], t\u0131bbi: ["turkish"], t\u0131ka\u00E7: ["turkish"], t\u0131k\u0131\u015F\u0131k: ["turkish"], t\u0131knaz: ["turkish"], t\u0131ls\u0131m: ["turkish"], t\u0131pk\u0131: ["turkish"], t\u0131ra\u015F: ["turkish"], t\u0131r\u0131\u015Fka: ["turkish"], t\u0131rman\u0131\u015F: ["turkish"], t\u0131rnak: ["turkish"], t\u0131rpan: ["turkish"], t\u0131slama: ["turkish"], ticaret: ["turkish"], tilki: ["turkish"], tiryaki: ["turkish"], titre\u015Fim: ["turkish"], tohum: ["turkish"], tokat: ["turkish"], tolere: ["turkish"], tombak: ["turkish"], tomurcuk: ["turkish"], topa\u00E7: ["turkish"], toplum: ["turkish"], toprak: ["turkish"], toptan: ["turkish"], toraman: ["turkish"], torpido: ["turkish"], tortu: ["turkish"], tosba\u011Fa: ["turkish"], toynak: ["turkish"], t\u00F6ren: ["turkish"], trafik: ["turkish"], trajedi: ["turkish"], tramvay: ["turkish"], trib\u00FCn: ["turkish"], triko: ["turkish"], tugay: ["turkish"], tu\u011Fla: ["turkish"], tu\u011Frul: ["turkish"], tuhaf: ["turkish"], tulumba: ["turkish"], tun\u00E7: ["turkish"], turan: ["turkish"], turkuaz: ["turkish"], turnusol: ["turkish"], tur\u015Fu: ["turkish"], turuncu: ["turkish"], tutanak: ["turkish"], tutkal: ["turkish"], tutsak: ["turkish"], tutum: ["turkish"], tuyu\u011F: ["turkish"], tuzlu: ["turkish"], t\u00FCccar: ["turkish"], t\u00FCfek: ["turkish"], t\u00FCkenmez: ["turkish"], t\u00FClbent: ["turkish"], t\u00FCmle\u00E7: ["turkish"], t\u00FCnel: ["turkish"], t\u00FCrbin: ["turkish"], t\u00FCrev: ["turkish"], t\u00FCrk: ["turkish"], t\u00FCz\u00FCk: ["turkish"], ucube: ["turkish"], ucuz: ["turkish"], u\u00E7ak: ["turkish"], u\u00E7urtma: ["turkish"], ufuk: ["turkish"], u\u011Frak: ["turkish"], u\u011Fur: ["turkish"], ukala: ["turkish"], ula\u015F\u0131m: ["turkish"], ulema: ["turkish"], ulus: ["turkish"], ulvi: ["turkish"], umursama: ["turkish"], umut: ["turkish"], unutkan: ["turkish"], uslu: ["turkish"], ustaba\u015F\u0131: ["turkish"], ustura: ["turkish"], usul: ["turkish"], utanga\u00E7: ["turkish"], uyan\u0131k: ["turkish"], uyar\u0131: ["turkish"], uydu: ["turkish"], uygar: ["turkish"], uygulama: ["turkish"], uykusuz: ["turkish"], uysal: ["turkish"], uyu\u015Fma: ["turkish"], uzant\u0131: ["turkish"], uzay: ["turkish"], uzg\u00F6ren: ["turkish"], uzla\u015Fma: ["turkish"], uzman: ["turkish"], uzun: ["turkish"], \u00FCcra: ["turkish"], \u00FCcret: ["turkish"], \u00FC\u00E7budak: ["turkish"], \u00FC\u00E7gen: ["turkish"], \u00FC\u00E7ka\u011F\u0131t: ["turkish"], \u00FC\u00E7leme: ["turkish"], \u00FCf\u00FCr\u00FCk: ["turkish"], \u00FClke: ["turkish"], \u00FCmit: ["turkish"], \u00FCniforma: ["turkish"], \u00FCnite: ["turkish"], \u00FCnlem: ["turkish"], \u00FCretken: ["turkish"], \u00FCr\u00FCn: ["turkish"], \u00FCslup: ["turkish"], \u00FCstel: ["turkish"], \u00FCst\u00FCn: ["turkish"], \u00FC\u015Fenge\u00E7: ["turkish"], \u00FC\u015F\u00FCme: ["turkish"], \u00FCtopya: ["turkish"], \u00FCvey: ["turkish"], \u00FCzengi: ["turkish"], \u00FCzg\u00FCn: ["turkish"], \u00FCz\u00FCm: ["turkish"], vaka: ["turkish"], vakfiye: ["turkish"], vak\u0131f: ["turkish"], vakit: ["turkish"], vakum: ["turkish"], vapur: ["turkish"], varil: ["turkish"], varl\u0131k: ["turkish"], varsay\u0131m: ["turkish"], varyemez: ["turkish"], vas\u0131ta: ["turkish"], vasiyet: ["turkish"], vatanda\u015F: ["turkish"], vazife: ["turkish"], vazo: ["turkish"], veciz: ["turkish"], vefa: ["turkish"], vehim: ["turkish"], veliaht: ["turkish"], veresiye: ["turkish"], verimli: ["turkish"], verka\u00E7: ["turkish"], vernik: ["turkish"], vertigo: ["turkish"], vesait: ["turkish"], vesika: ["turkish"], vestiyer: ["turkish"], veznedar: ["turkish"], vicdan: ["turkish"], vilayet: ["turkish"], virane: ["turkish"], virg\u00FCl: ["turkish"], vi\u015Fne: ["turkish"], vites: ["turkish"], vokal: ["turkish"], volkan: ["turkish"], vurma: ["turkish"], vurucu: ["turkish"], v\u00FCcut: ["turkish"], yabanc\u0131: ["turkish"], yabgu: ["turkish"], ya\u011F\u0131\u015F: ["turkish"], ya\u011Fl\u0131: ["turkish"], ya\u011Fmur: ["turkish"], yakamoz: ["turkish"], yak\u0131n: ["turkish"], yakla\u015F\u0131k: ["turkish"], yal\u00E7\u0131n: ["turkish"], yal\u0131t\u0131m: ["turkish"], yaman: ["turkish"], yanarda\u011F: ["turkish"], yang\u0131n: ["turkish"], yan\u0131t: ["turkish"], yank\u0131: ["turkish"], yanl\u0131\u015F: ["turkish"], yans\u0131ma: ["turkish"], yapay: ["turkish"], yapboz: ["turkish"], yap\u0131mc\u0131: ["turkish"], yaprak: ["turkish"], yarat\u0131k: ["turkish"], yarbay: ["turkish"], yard\u0131m: ["turkish"], yarg\u0131\u00E7: ["turkish"], yar\u0131\u00E7ap: ["turkish"], yasemin: ["turkish"], yast\u0131k: ["turkish"], ya\u015Fam: ["turkish"], yatak: ["turkish"], yat\u0131r\u0131m: ["turkish"], yavru: ["turkish"], yaygara: ["turkish"], yay\u0131nc\u0131: ["turkish"], yayla: ["turkish"], yaz\u0131l\u0131m: ["turkish"], yekpare: ["turkish"], yekv\u00FCcut: ["turkish"], yelkovan: ["turkish"], yelpaze: ["turkish"], yemek: ["turkish"], yemi\u015F: ["turkish"], yenge\u00E7: ["turkish"], yeni\u00E7eri: ["turkish"], yeralt\u0131: ["turkish"], yerk\u00FCre: ["turkish"], yerle\u015Fke: ["turkish"], yery\u00FCz\u00FC: ["turkish"], ye\u015Fil: ["turkish"], yetenek: ["turkish"], yetkili: ["turkish"], y\u0131\u011F\u0131nak: ["turkish"], y\u0131kama: ["turkish"], y\u0131lba\u015F\u0131: ["turkish"], y\u0131ld\u0131r\u0131m: ["turkish"], y\u0131lk\u0131: ["turkish"], y\u0131lmaz: ["turkish"], y\u0131rt\u0131c\u0131: ["turkish"], yi\u011Fit: ["turkish"], yo\u011Furt: ["turkish"], yoku\u015F: ["turkish"], yolcu: ["turkish"], yolda\u015F: ["turkish"], yolge\u00E7en: ["turkish"], yolkesen: ["turkish"], yol\u00FCst\u00FC: ["turkish"], yordam: ["turkish"], yorgan: ["turkish"], yorumcu: ["turkish"], yosun: ["turkish"], y\u00F6nde\u015F: ["turkish"], y\u00F6netim: ["turkish"], y\u00F6nl\u00FC: ["turkish"], y\u00F6ntem: ["turkish"], y\u00F6resel: ["turkish"], y\u00F6r\u00FCnge: ["turkish"], yufka: ["turkish"], yukar\u0131: ["turkish"], yumruk: ["turkish"], yumurta: ["turkish"], yuvarlak: ["turkish"], y\u00FCcelme: ["turkish"], y\u00FCk\u00E7eker: ["turkish"], y\u00FCklem: ["turkish"], y\u00FCksek: ["turkish"], y\u00FCrek: ["turkish"], y\u00FCr\u00FCtme: ["turkish"], y\u00FCzde: ["turkish"], y\u00FCzeysel: ["turkish"], y\u00FCzge\u00E7: ["turkish"], y\u00FCz\u00FCst\u00FC: ["turkish"], y\u00FCzy\u0131l: ["turkish"], zab\u0131ta: ["turkish"], zafer: ["turkish"], zahmet: ["turkish"], zambak: ["turkish"], zaptiye: ["turkish"], zarafet: ["turkish"], zaruret: ["turkish"], zeka: ["turkish"], zekice: ["turkish"], zemberek: ["turkish"], zemin: ["turkish"], zencefil: ["turkish"], zeplin: ["turkish"], zeytin: ["turkish"], z\u0131b\u0131n: ["turkish"], z\u0131lg\u0131t: ["turkish"], z\u0131mb\u0131rt\u0131: ["turkish"], z\u0131mpara: ["turkish"], z\u0131pk\u0131n: ["turkish"], zigon: ["turkish"], zihinsel: ["turkish"], zihniyet: ["turkish"], zincir: ["turkish"], zindan: ["turkish"], zirzop: ["turkish"], ziyaret: ["turkish"], ziynet: ["turkish"], zoraki: ["turkish"], zorlu: ["turkish"], zorunlu: ["turkish"], z\u00FC\u011F\u00FCrt: ["turkish"], z\u00FCmre: ["turkish"] };
}
});
// node_modules/bip39-mnemonic/wordlist/chinese_simplified.json
var require_chinese_simplified = __commonJS({
"node_modules/bip39-mnemonic/wordlist/chinese_simplified.json"(exports2, module2) {
module2.exports = ["\u7684", "\u4E00", "\u662F", "\u5728", "\u4E0D", "\u4E86", "\u6709", "\u548C", "\u4EBA", "\u8FD9", "\u4E2D", "\u5927", "\u4E3A", "\u4E0A", "\u4E2A", "\u56FD", "\u6211", "\u4EE5", "\u8981", "\u4ED6", "\u65F6", "\u6765", "\u7528", "\u4EEC", "\u751F", "\u5230", "\u4F5C", "\u5730", "\u4E8E", "\u51FA", "\u5C31", "\u5206", "\u5BF9", "\u6210", "\u4F1A", "\u53EF", "\u4E3B", "\u53D1", "\u5E74", "\u52A8", "\u540C", "\u5DE5", "\u4E5F", "\u80FD", "\u4E0B", "\u8FC7", "\u5B50", "\u8BF4", "\u4EA7", "\u79CD", "\u9762", "\u800C", "\u65B9", "\u540E", "\u591A", "\u5B9A", "\u884C", "\u5B66", "\u6CD5", "\u6240", "\u6C11", "\u5F97", "\u7ECF", "\u5341", "\u4E09", "\u4E4B", "\u8FDB", "\u7740", "\u7B49", "\u90E8", "\u5EA6", "\u5BB6", "\u7535", "\u529B", "\u91CC", "\u5982", "\u6C34", "\u5316", "\u9AD8", "\u81EA", "\u4E8C", "\u7406", "\u8D77", "\u5C0F", "\u7269", "\u73B0", "\u5B9E", "\u52A0", "\u91CF", "\u90FD", "\u4E24", "\u4F53", "\u5236", "\u673A", "\u5F53", "\u4F7F", "\u70B9", "\u4ECE", "\u4E1A", "\u672C", "\u53BB", "\u628A", "\u6027", "\u597D", "\u5E94", "\u5F00", "\u5B83", "\u5408", "\u8FD8", "\u56E0", "\u7531", "\u5176", "\u4E9B", "\u7136", "\u524D", "\u5916", "\u5929", "\u653F", "\u56DB", "\u65E5", "\u90A3", "\u793E", "\u4E49", "\u4E8B", "\u5E73", "\u5F62", "\u76F8", "\u5168", "\u8868", "\u95F4", "\u6837", "\u4E0E", "\u5173", "\u5404", "\u91CD", "\u65B0", "\u7EBF", "\u5185", "\u6570", "\u6B63", "\u5FC3", "\u53CD", "\u4F60", "\u660E", "\u770B", "\u539F", "\u53C8", "\u4E48", "\u5229", "\u6BD4", "\u6216", "\u4F46", "\u8D28", "\u6C14", "\u7B2C", "\u5411", "\u9053", "\u547D", "\u6B64", "\u53D8", "\u6761", "\u53EA", "\u6CA1", "\u7ED3", "\u89E3", "\u95EE", "\u610F", "\u5EFA", "\u6708", "\u516C", "\u65E0", "\u7CFB", "\u519B", "\u5F88", "\u60C5", "\u8005", "\u6700", "\u7ACB", "\u4EE3", "\u60F3", "\u5DF2", "\u901A", "\u5E76", "\u63D0", "\u76F4", "\u9898", "\u515A", "\u7A0B", "\u5C55", "\u4E94", "\u679C", "\u6599", "\u8C61", "\u5458", "\u9769", "\u4F4D", "\u5165", "\u5E38", "\u6587", "\u603B", "\u6B21", "\u54C1", "\u5F0F", "\u6D3B", "\u8BBE", "\u53CA", "\u7BA1", "\u7279", "\u4EF6", "\u957F", "\u6C42", "\u8001", "\u5934", "\u57FA", "\u8D44", "\u8FB9", "\u6D41", "\u8DEF", "\u7EA7", "\u5C11", "\u56FE", "\u5C71", "\u7EDF", "\u63A5", "\u77E5", "\u8F83", "\u5C06", "\u7EC4", "\u89C1", "\u8BA1", "\u522B", "\u5979", "\u624B", "\u89D2", "\u671F", "\u6839", "\u8BBA", "\u8FD0", "\u519C", "\u6307", "\u51E0", "\u4E5D", "\u533A", "\u5F3A", "\u653E", "\u51B3", "\u897F", "\u88AB", "\u5E72", "\u505A", "\u5FC5", "\u6218", "\u5148", "\u56DE", "\u5219", "\u4EFB", "\u53D6", "\u636E", "\u5904", "\u961F", "\u5357", "\u7ED9", "\u8272", "\u5149", "\u95E8", "\u5373", "\u4FDD", "\u6CBB", "\u5317", "\u9020", "\u767E", "\u89C4", "\u70ED", "\u9886", "\u4E03", "\u6D77", "\u53E3", "\u4E1C", "\u5BFC", "\u5668", "\u538B", "\u5FD7", "\u4E16", "\u91D1", "\u589E", "\u4E89", "\u6D4E", "\u9636", "\u6CB9", "\u601D", "\u672F", "\u6781", "\u4EA4", "\u53D7", "\u8054", "\u4EC0", "\u8BA4", "\u516D", "\u5171", "\u6743", "\u6536", "\u8BC1", "\u6539", "\u6E05", "\u7F8E", "\u518D", "\u91C7", "\u8F6C", "\u66F4", "\u5355", "\u98CE", "\u5207", "\u6253", "\u767D", "\u6559", "\u901F", "\u82B1", "\u5E26", "\u5B89", "\u573A", "\u8EAB", "\u8F66", "\u4F8B", "\u771F", "\u52A1", "\u5177", "\u4E07", "\u6BCF", "\u76EE", "\u81F3", "\u8FBE", "\u8D70", "\u79EF", "\u793A", "\u8BAE", "\u58F0", "\u62A5", "\u6597", "\u5B8C", "\u7C7B", "\u516B", "\u79BB", "\u534E", "\u540D", "\u786E", "\u624D", "\u79D1", "\u5F20", "\u4FE1", "\u9A6C", "\u8282", "\u8BDD", "\u7C73", "\u6574", "\u7A7A", "\u5143", "\u51B5", "\u4ECA", "\u96C6", "\u6E29", "\u4F20", "\u571F", "\u8BB8", "\u6B65", "\u7FA4", "\u5E7F", "\u77F3", "\u8BB0", "\u9700", "\u6BB5", "\u7814", "\u754C", "\u62C9", "\u6797", "\u5F8B", "\u53EB", "\u4E14", "\u7A76", "\u89C2", "\u8D8A", "\u7EC7", "\u88C5", "\u5F71", "\u7B97", "\u4F4E", "\u6301", "\u97F3", "\u4F17", "\u4E66", "\u5E03", "\u590D", "\u5BB9", "\u513F", "\u987B", "\u9645", "\u5546", "\u975E", "\u9A8C", "\u8FDE", "\u65AD", "\u6DF1", "\u96BE", "\u8FD1", "\u77FF", "\u5343", "\u5468", "\u59D4", "\u7D20", "\u6280", "\u5907", "\u534A", "\u529E", "\u9752", "\u7701", "\u5217", "\u4E60", "\u54CD", "\u7EA6", "\u652F", "\u822C", "\u53F2", "\u611F", "\u52B3", "\u4FBF", "\u56E2", "\u5F80", "\u9178", "\u5386", "\u5E02", "\u514B", "\u4F55", "\u9664", "\u6D88", "\u6784", "\u5E9C", "\u79F0", "\u592A", "\u51C6", "\u7CBE", "\u503C", "\u53F7", "\u7387", "\u65CF", "\u7EF4", "\u5212", "\u9009", "\u6807", "\u5199", "\u5B58", "\u5019", "\u6BDB", "\u4EB2", "\u5FEB", "\u6548", "\u65AF", "\u9662", "\u67E5", "\u6C5F", "\u578B", "\u773C", "\u738B", "\u6309", "\u683C", "\u517B", "\u6613", "\u7F6E", "\u6D3E", "\u5C42", "\u7247", "\u59CB", "\u5374", "\u4E13", "\u72B6", "\u80B2", "\u5382", "\u4EAC", "\u8BC6", "\u9002", "\u5C5E", "\u5706", "\u5305", "\u706B", "\u4F4F", "\u8C03", "\u6EE1", "\u53BF", "\u5C40", "\u7167", "\u53C2", "\u7EA2", "\u7EC6", "\u5F15", "\u542C", "\u8BE5", "\u94C1", "\u4EF7", "\u4E25", "\u9996", "\u5E95", "\u6DB2", "\u5B98", "\u5FB7", "\u968F", "\u75C5", "\u82CF", "\u5931", "\u5C14", "\u6B7B", "\u8BB2", "\u914D", "\u5973", "\u9EC4", "\u63A8", "\u663E", "\u8C08", "\u7F6A", "\u795E", "\u827A", "\u5462", "\u5E2D", "\u542B", "\u4F01", "\u671B", "\u5BC6", "\u6279", "\u8425", "\u9879", "\u9632", "\u4E3E", "\u7403", "\u82F1", "\u6C27", "\u52BF", "\u544A", "\u674E", "\u53F0", "\u843D", "\u6728", "\u5E2E", "\u8F6E", "\u7834", "\u4E9A", "\u5E08", "\u56F4", "\u6CE8", "\u8FDC", "\u5B57", "\u6750", "\u6392", "\u4F9B", "\u6CB3", "\u6001", "\u5C01", "\u53E6", "\u65BD", "\u51CF", "\u6811", "\u6EB6", "\u600E", "\u6B62", "\u6848", "\u8A00", "\u58EB", "\u5747", "\u6B66", "\u56FA", "\u53F6", "\u9C7C", "\u6CE2", "\u89C6", "\u4EC5", "\u8D39", "\u7D27", "\u7231", "\u5DE6", "\u7AE0", "\u65E9", "\u671D", "\u5BB3", "\u7EED", "\u8F7B", "\u670D", "\u8BD5", "\u98DF", "\u5145", "\u5175", "\u6E90", "\u5224", "\u62A4", "\u53F8", "\u8DB3", "\u67D0", "\u7EC3", "\u5DEE", "\u81F4", "\u677F", "\u7530", "\u964D", "\u9ED1", "\u72AF", "\u8D1F", "\u51FB", "\u8303", "\u7EE7", "\u5174", "\u4F3C", "\u4F59", "\u575A", "\u66F2", "\u8F93", "\u4FEE", "\u6545", "\u57CE", "\u592B", "\u591F", "\u9001", "\u7B14", "\u8239", "\u5360", "\u53F3", "\u8D22", "\u5403", "\u5BCC", "\u6625", "\u804C", "\u89C9", "\u6C49", "\u753B", "\u529F", "\u5DF4", "\u8DDF", "\u867D", "\u6742", "\u98DE", "\u68C0", "\u5438", "\u52A9", "\u5347", "\u9633", "\u4E92", "\u521D", "\u521B", "\u6297", "\u8003", "\u6295", "\u574F", "\u7B56", "\u53E4", "\u5F84", "\u6362", "\u672A", "\u8DD1", "\u7559", "\u94A2", "\u66FE", "\u7AEF", "\u8D23", "\u7AD9", "\u7B80", "\u8FF0", "\u94B1", "\u526F", "\u5C3D", "\u5E1D", "\u5C04", "\u8349", "\u51B2", "\u627F", "\u72EC", "\u4EE4", "\u9650", "\u963F", "\u5BA3", "\u73AF", "\u53CC", "\u8BF7", "\u8D85", "\u5FAE", "\u8BA9", "\u63A7", "\u5DDE", "\u826F", "\u8F74", "\u627E", "\u5426", "\u7EAA", "\u76CA", "\u4F9D", "\u4F18", "\u9876", "\u7840", "\u8F7D", "\u5012", "\u623F", "\u7A81", "\u5750", "\u7C89", "\u654C", "\u7565", "\u5BA2", "\u8881", "\u51B7", "\u80DC", "\u7EDD", "\u6790", "\u5757", "\u5242", "\u6D4B", "\u4E1D", "\u534F", "\u8BC9", "\u5FF5", "\u9648", "\u4ECD", "\u7F57", "\u76D0", "\u53CB", "\u6D0B", "\u9519", "\u82E6", "\u591C", "\u5211", "\u79FB", "\u9891", "\u9010", "\u9760", "\u6DF7", "\u6BCD", "\u77ED", "\u76AE", "\u7EC8", "\u805A", "\u6C7D", "\u6751", "\u4E91", "\u54EA", "\u65E2", "\u8DDD", "\u536B", "\u505C", "\u70C8", "\u592E", "\u5BDF", "\u70E7", "\u8FC5", "\u5883", "\u82E5", "\u5370", "\u6D32", "\u523B", "\u62EC", "\u6FC0", "\u5B54", "\u641E", "\u751A", "\u5BA4", "\u5F85", "\u6838", "\u6821", "\u6563", "\u4FB5", "\u5427", "\u7532", "\u6E38", "\u4E45", "\u83DC", "\u5473", "\u65E7", "\u6A21", "\u6E56", "\u8D27", "\u635F", "\u9884", "\u963B", "\u6BEB", "\u666E", "\u7A33", "\u4E59", "\u5988", "\u690D", "\u606F", "\u6269", "\u94F6", "\u8BED", "\u6325", "\u9152", "\u5B88", "\u62FF", "\u5E8F", "\u7EB8", "\u533B", "\u7F3A", "\u96E8", "\u5417", "\u9488", "\u5218", "\u554A", "\u6025", "\u5531", "\u8BEF", "\u8BAD", "\u613F", "\u5BA1", "\u9644", "\u83B7", "\u8336", "\u9C9C", "\u7CAE", "\u65A4", "\u5B69", "\u8131", "\u786B", "\u80A5", "\u5584", "\u9F99", "\u6F14", "\u7236", "\u6E10", "\u8840", "\u6B22", "\u68B0", "\u638C", "\u6B4C", "\u6C99", "\u521A", "\u653B", "\u8C13", "\u76FE", "\u8BA8", "\u665A", "\u7C92", "\u4E71", "\u71C3", "\u77DB", "\u4E4E", "\u6740", "\u836F", "\u5B81", "\u9C81", "\u8D35", "\u949F", "\u7164", "\u8BFB", "\u73ED", "\u4F2F", "\u9999", "\u4ECB", "\u8FEB", "\u53E5", "\u4E30", "\u57F9", "\u63E1", "\u5170", "\u62C5", "\u5F26", "\u86CB", "\u6C89", "\u5047", "\u7A7F", "\u6267", "\u7B54", "\u4E50", "\u8C01", "\u987A", "\u70DF", "\u7F29", "\u5F81", "\u8138", "\u559C", "\u677E", "\u811A", "\u56F0", "\u5F02", "\u514D", "\u80CC", "\u661F", "\u798F", "\u4E70", "\u67D3", "\u4E95", "\u6982", "\u6162", "\u6015", "\u78C1", "\u500D", "\u7956", "\u7687", "\u4FC3", "\u9759", "\u8865", "\u8BC4", "\u7FFB", "\u8089", "\u8DF5", "\u5C3C", "\u8863", "\u5BBD", "\u626C", "\u68C9", "\u5E0C", "\u4F24", "\u64CD", "\u5782", "\u79CB", "\u5B9C", "\u6C22", "\u5957", "\u7763", "\u632F", "\u67B6", "\u4EAE", "\u672B", "\u5BAA", "\u5E86", "\u7F16", "\u725B", "\u89E6", "\u6620", "\u96F7", "\u9500", "\u8BD7", "\u5EA7", "\u5C45", "\u6293", "\u88C2", "\u80DE", "\u547C", "\u5A18", "\u666F", "\u5A01", "\u7EFF", "\u6676", "\u539A", "\u76DF", "\u8861", "\u9E21", "\u5B59", "\u5EF6", "\u5371", "\u80F6", "\u5C4B", "\u4E61", "\u4E34", "\u9646", "\u987E", "\u6389", "\u5440", "\u706F", "\u5C81", "\u63AA", "\u675F", "\u8010", "\u5267", "\u7389", "\u8D75", "\u8DF3", "\u54E5", "\u5B63", "\u8BFE", "\u51EF", "\u80E1", "\u989D", "\u6B3E", "\u7ECD", "\u5377", "\u9F50", "\u4F1F", "\u84B8", "\u6B96", "\u6C38", "\u5B97", "\u82D7", "\u5DDD", "\u7089", "\u5CA9", "\u5F31", "\u96F6", "\u6768", "\u594F", "\u6CBF", "\u9732", "\u6746", "\u63A2", "\u6ED1", "\u9547", "\u996D", "\u6D53", "\u822A", "\u6000", "\u8D76", "\u5E93", "\u593A", "\u4F0A", "\u7075", "\u7A0E", "\u9014", "\u706D", "\u8D5B", "\u5F52", "\u53EC", "\u9F13", "\u64AD", "\u76D8", "\u88C1", "\u9669", "\u5EB7", "\u552F", "\u5F55", "\u83CC", "\u7EAF", "\u501F", "\u7CD6", "\u76D6", "\u6A2A", "\u7B26", "\u79C1", "\u52AA", "\u5802", "\u57DF", "\u67AA", "\u6DA6", "\u5E45", "\u54C8", "\u7ADF", "\u719F", "\u866B", "\u6CFD", "\u8111", "\u58E4", "\u78B3", "\u6B27", "\u904D", "\u4FA7", "\u5BE8", "\u6562", "\u5F7B", "\u8651", "\u659C", "\u8584", "\u5EAD", "\u7EB3", "\u5F39", "\u9972", "\u4F38", "\u6298", "\u9EA6", "\u6E7F", "\u6697", "\u8377", "\u74E6", "\u585E", "\u5E8A", "\u7B51", "\u6076", "\u6237", "\u8BBF", "\u5854", "\u5947", "\u900F", "\u6881", "\u5200", "\u65CB", "\u8FF9", "\u5361", "\u6C2F", "\u9047", "\u4EFD", "\u6BD2", "\u6CE5", "\u9000", "\u6D17", "\u6446", "\u7070", "\u5F69", "\u5356", "\u8017", "\u590F", "\u62E9", "\u5FD9", "\u94DC", "\u732E", "\u786C", "\u4E88", "\u7E41", "\u5708", "\u96EA", "\u51FD", "\u4EA6", "\u62BD", "\u7BC7", "\u9635", "\u9634", "\u4E01", "\u5C3A", "\u8FFD", "\u5806", "\u96C4", "\u8FCE", "\u6CDB", "\u7238", "\u697C", "\u907F", "\u8C0B", "\u5428", "\u91CE", "\u732A", "\u65D7", "\u7D2F", "\u504F", "\u5178", "\u9986", "\u7D22", "\u79E6", "\u8102", "\u6F6E", "\u7237", "\u8C46", "\u5FFD", "\u6258", "\u60CA", "\u5851", "\u9057", "\u6108", "\u6731", "\u66FF", "\u7EA4", "\u7C97", "\u503E", "\u5C1A", "\u75DB", "\u695A", "\u8C22", "\u594B", "\u8D2D", "\u78E8", "\u541B", "\u6C60", "\u65C1", "\u788E", "\u9AA8", "\u76D1", "\u6355", "\u5F1F", "\u66B4", "\u5272", "\u8D2F", "\u6B8A", "\u91CA", "\u8BCD", "\u4EA1", "\u58C1", "\u987F", "\u5B9D", "\u5348", "\u5C18", "\u95FB", "\u63ED", "\u70AE", "\u6B8B", "\u51AC", "\u6865", "\u5987", "\u8B66", "\u7EFC", "\u62DB", "\u5434", "\u4ED8", "\u6D6E", "\u906D", "\u5F90", "\u60A8", "\u6447", "\u8C37", "\u8D5E", "\u7BB1", "\u9694", "\u8BA2", "\u7537", "\u5439", "\u56ED", "\u7EB7", "\u5510", "\u8D25", "\u5B8B", "\u73BB", "\u5DE8", "\u8015", "\u5766", "\u8363", "\u95ED", "\u6E7E", "\u952E", "\u51E1", "\u9A7B", "\u9505", "\u6551", "\u6069", "\u5265", "\u51DD", "\u78B1", "\u9F7F", "\u622A", "\u70BC", "\u9EBB", "\u7EBA", "\u7981", "\u5E9F", "\u76DB", "\u7248", "\u7F13", "\u51C0", "\u775B", "\u660C", "\u5A5A", "\u6D89", "\u7B52", "\u5634", "\u63D2", "\u5CB8", "\u6717", "\u5E84", "\u8857", "\u85CF", "\u59D1", "\u8D38", "\u8150", "\u5974", "\u5566", "\u60EF", "\u4E58", "\u4F19", "\u6062", "\u5300", "\u7EB1", "\u624E", "\u8FA9", "\u8033", "\u5F6A", "\u81E3", "\u4EBF", "\u7483", "\u62B5", "\u8109", "\u79C0", "\u8428", "\u4FC4", "\u7F51", "\u821E", "\u5E97", "\u55B7", "\u7EB5", "\u5BF8", "\u6C57", "\u6302", "\u6D2A", "\u8D3A", "\u95EA", "\u67EC", "\u7206", "\u70EF", "\u6D25", "\u7A3B", "\u5899", "\u8F6F", "\u52C7", "\u50CF", "\u6EDA", "\u5398", "\u8499", "\u82B3", "\u80AF", "\u5761", "\u67F1", "\u8361", "\u817F", "\u4EEA", "\u65C5", "\u5C3E", "\u8F67", "\u51B0", "\u8D21", "\u767B", "\u9ECE", "\u524A", "\u94BB", "\u52D2", "\u9003", "\u969C", "\u6C28", "\u90ED", "\u5CF0", "\u5E01", "\u6E2F", "\u4F0F", "\u8F68", "\u4EA9", "\u6BD5", "\u64E6", "\u83AB", "\u523A", "\u6D6A", "\u79D8", "\u63F4", "\u682A", "\u5065", "\u552E", "\u80A1", "\u5C9B", "\u7518", "\u6CE1", "\u7761", "\u7AE5", "\u94F8", "\u6C64", "\u9600", "\u4F11", "\u6C47", "\u820D", "\u7267", "\u7ED5", "\u70B8", "\u54F2", "\u78F7", "\u7EE9", "\u670B", "\u6DE1", "\u5C16", "\u542F", "\u9677", "\u67F4", "\u5448", "\u5F92", "\u989C", "\u6CEA", "\u7A0D", "\u5FD8", "\u6CF5", "\u84DD", "\u62D6", "\u6D1E", "\u6388", "\u955C", "\u8F9B", "\u58EE", "\u950B", "\u8D2B", "\u865A", "\u5F2F", "\u6469", "\u6CF0", "\u5E7C", "\u5EF7", "\u5C0A", "\u7A97", "\u7EB2", "\u5F04", "\u96B6", "\u7591", "\u6C0F", "\u5BAB", "\u59D0", "\u9707", "\u745E", "\u602A", "\u5C24", "\u7434", "\u5FAA", "\u63CF", "\u819C", "\u8FDD", "\u5939", "\u8170", "\u7F18", "\u73E0", "\u7A77", "\u68EE", "\u679D", "\u7AF9", "\u6C9F", "\u50AC", "\u7EF3", "\u5FC6", "\u90A6", "\u5269", "\u5E78", "\u6D46", "\u680F", "\u62E5", "\u7259", "\u8D2E", "\u793C", "\u6EE4", "\u94A0", "\u7EB9", "\u7F62", "\u62CD", "\u54B1", "\u558A", "\u8896", "\u57C3", "\u52E4", "\u7F5A", "\u7126", "\u6F5C", "\u4F0D", "\u58A8", "\u6B32", "\u7F1D", "\u59D3", "\u520A", "\u9971", "\u4EFF", "\u5956", "\u94DD", "\u9B3C", "\u4E3D", "\u8DE8", "\u9ED8", "\u6316", "\u94FE", "\u626B", "\u559D", "\u888B", "\u70AD", "\u6C61", "\u5E55", "\u8BF8", "\u5F27", "\u52B1", "\u6885", "\u5976", "\u6D01", "\u707E", "\u821F", "\u9274", "\u82EF", "\u8BBC", "\u62B1", "\u6BC1", "\u61C2", "\u5BD2", "\u667A", "\u57D4", "\u5BC4", "\u5C4A", "\u8DC3", "\u6E21", "\u6311", "\u4E39", "\u8270", "\u8D1D", "\u78B0", "\u62D4", "\u7239", "\u6234", "\u7801", "\u68A6", "\u82BD", "\u7194", "\u8D64", "\u6E14", "\u54ED", "\u656C", "\u9897", "\u5954", "\u94C5", "\u4EF2", "\u864E", "\u7A00", "\u59B9", "\u4E4F", "\u73CD", "\u7533", "\u684C", "\u9075", "\u5141", "\u9686", "\u87BA", "\u4ED3", "\u9B4F", "\u9510", "\u6653", "\u6C2E", "\u517C", "\u9690", "\u788D", "\u8D6B", "\u62E8", "\u5FE0", "\u8083", "\u7F38", "\u7275", "\u62A2", "\u535A", "\u5DE7", "\u58F3", "\u5144", "\u675C", "\u8BAF", "\u8BDA", "\u78A7", "\u7965", "\u67EF", "\u9875", "\u5DE1", "\u77E9", "\u60B2", "\u704C", "\u9F84", "\u4F26", "\u7968", "\u5BFB", "\u6842", "\u94FA", "\u5723", "\u6050", "\u6070", "\u90D1", "\u8DA3", "\u62AC", "\u8352", "\u817E", "\u8D34", "\u67D4", "\u6EF4", "\u731B", "\u9614", "\u8F86", "\u59BB", "\u586B", "\u64A4", "\u50A8", "\u7B7E", "\u95F9", "\u6270", "\u7D2B", "\u7802", "\u9012", "\u620F", "\u540A", "\u9676", "\u4F10", "\u5582", "\u7597", "\u74F6", "\u5A46", "\u629A", "\u81C2", "\u6478", "\u5FCD", "\u867E", "\u8721", "\u90BB", "\u80F8", "\u5DE9", "\u6324", "\u5076", "\u5F03", "\u69FD", "\u52B2", "\u4E73", "\u9093", "\u5409", "\u4EC1", "\u70C2", "\u7816", "\u79DF", "\u4E4C", "\u8230", "\u4F34", "\u74DC", "\u6D45", "\u4E19", "\u6682", "\u71E5", "\u6A61", "\u67F3", "\u8FF7", "\u6696", "\u724C", "\u79E7", "\u80C6", "\u8BE6", "\u7C27", "\u8E0F", "\u74F7", "\u8C31", "\u5446", "\u5BBE", "\u7CCA", "\u6D1B", "\u8F89", "\u6124", "\u7ADE", "\u9699", "\u6012", "\u7C98", "\u4E43", "\u7EEA", "\u80A9", "\u7C4D", "\u654F", "\u6D82", "\u7199", "\u7686", "\u4FA6", "\u60AC", "\u6398", "\u4EAB", "\u7EA0", "\u9192", "\u72C2", "\u9501", "\u6DC0", "\u6068", "\u7272", "\u9738", "\u722C", "\u8D4F", "\u9006", "\u73A9", "\u9675", "\u795D", "\u79D2", "\u6D59", "\u8C8C", "\u5F79", "\u5F7C", "\u6089", "\u9E2D", "\u8D8B", "\u51E4", "\u6668", "\u755C", "\u8F88", "\u79E9", "\u5375", "\u7F72", "\u68AF", "\u708E", "\u6EE9", "\u68CB", "\u9A71", "\u7B5B", "\u5CE1", "\u5192", "\u5565", "\u5BFF", "\u8BD1", "\u6D78", "\u6CC9", "\u5E3D", "\u8FDF", "\u7845", "\u7586", "\u8D37", "\u6F0F", "\u7A3F", "\u51A0", "\u5AE9", "\u80C1", "\u82AF", "\u7262", "\u53DB", "\u8680", "\u5965", "\u9E23", "\u5CAD", "\u7F8A", "\u51ED", "\u4E32", "\u5858", "\u7ED8", "\u9175", "\u878D", "\u76C6", "\u9521", "\u5E99", "\u7B79", "\u51BB", "\u8F85", "\u6444", "\u88AD", "\u7B4B", "\u62D2", "\u50DA", "\u65F1", "\u94BE", "\u9E1F", "\u6F06", "\u6C88", "\u7709", "\u758F", "\u6DFB", "\u68D2", "\u7A57", "\u785D", "\u97E9", "\u903C", "\u626D", "\u4FA8", "\u51C9", "\u633A", "\u7897", "\u683D", "\u7092", "\u676F", "\u60A3", "\u998F", "\u529D", "\u8C6A", "\u8FBD", "\u52C3", "\u9E3F", "\u65E6", "\u540F", "\u62DC", "\u72D7", "\u57CB", "\u8F8A", "\u63A9", "\u996E", "\u642C", "\u9A82", "\u8F9E", "\u52FE", "\u6263", "\u4F30", "\u848B", "\u7ED2", "\u96FE", "\u4E08", "\u6735", "\u59C6", "\u62DF", "\u5B87", "\u8F91", "\u9655", "\u96D5", "\u507F", "\u84C4", "\u5D07", "\u526A", "\u5021", "\u5385", "\u54AC", "\u9A76", "\u85AF", "\u5237", "\u65A5", "\u756A", "\u8D4B", "\u5949", "\u4F5B", "\u6D47", "\u6F2B", "\u66FC", "\u6247", "\u9499", "\u6843", "\u6276", "\u4ED4", "\u8FD4", "\u4FD7", "\u4E8F", "\u8154", "\u978B", "\u68F1", "\u8986", "\u6846", "\u6084", "\u53D4", "\u649E", "\u9A97", "\u52D8", "\u65FA", "\u6CB8", "\u5B64", "\u5410", "\u5B5F", "\u6E20", "\u5C48", "\u75BE", "\u5999", "\u60DC", "\u4EF0", "\u72E0", "\u80C0", "\u8C10", "\u629B", "\u9709", "\u6851", "\u5C97", "\u561B", "\u8870", "\u76D7", "\u6E17", "\u810F", "\u8D56", "\u6D8C", "\u751C", "\u66F9", "\u9605", "\u808C", "\u54E9", "\u5389", "\u70C3", "\u7EAC", "\u6BC5", "\u6628", "\u4F2A", "\u75C7", "\u716E", "\u53F9", "\u9489", "\u642D", "\u830E", "\u7B3C", "\u9177", "\u5077", "\u5F13", "\u9525", "\u6052", "\u6770", "\u5751", "\u9F3B", "\u7FFC", "\u7EB6", "\u53D9", "\u72F1", "\u902E", "\u7F50", "\u7EDC", "\u68DA", "\u6291", "\u81A8", "\u852C", "\u5BFA", "\u9AA4", "\u7A46", "\u51B6", "\u67AF", "\u518C", "\u5C38", "\u51F8", "\u7EC5", "\u576F", "\u727A", "\u7130", "\u8F70", "\u6B23", "\u664B", "\u7626", "\u5FA1", "\u952D", "\u9526", "\u4E27", "\u65EC", "\u953B", "\u5784", "\u641C", "\u6251", "\u9080", "\u4EAD", "\u916F", "\u8FC8", "\u8212", "\u8106", "\u9176", "\u95F2", "\u5FE7", "\u915A", "\u987D", "\u7FBD", "\u6DA8", "\u5378", "\u4ED7", "\u966A", "\u8F9F", "\u60E9", "\u676D", "\u59DA", "\u809A", "\u6349", "\u98D8", "\u6F02", "\u6606", "\u6B3A", "\u543E", "\u90CE", "\u70F7", "\u6C41", "\u5475", "\u9970", "\u8427", "\u96C5", "\u90AE", "\u8FC1", "\u71D5", "\u6492", "\u59FB", "\u8D74", "\u5BB4", "\u70E6", "\u503A", "\u5E10", "\u6591", "\u94C3", "\u65E8", "\u9187", "\u8463", "\u997C", "\u96CF", "\u59FF", "\u62CC", "\u5085", "\u8179", "\u59A5", "\u63C9", "\u8D24", "\u62C6", "\u6B6A", "\u8461", "\u80FA", "\u4E22", "\u6D69", "\u5FBD", "\u6602", "\u57AB", "\u6321", "\u89C8", "\u8D2A", "\u6170", "\u7F34", "\u6C6A", "\u614C", "\u51AF", "\u8BFA", "\u59DC", "\u8C0A", "\u51F6", "\u52A3", "\u8BEC", "\u8000", "\u660F", "\u8EBA", "\u76C8", "\u9A91", "\u4E54", "\u6EAA", "\u4E1B", "\u5362", "\u62B9", "\u95F7", "\u54A8", "\u522E", "\u9A7E", "\u7F06", "\u609F", "\u6458", "\u94D2", "\u63B7", "\u9887", "\u5E7B", "\u67C4", "\u60E0", "\u60E8", "\u4F73", "\u4EC7", "\u814A", "\u7A9D", "\u6DA4", "\u5251", "\u77A7", "\u5821", "\u6CFC", "\u8471", "\u7F69", "\u970D", "\u635E", "\u80CE", "\u82CD", "\u6EE8", "\u4FE9", "\u6345", "\u6E58", "\u780D", "\u971E", "\u90B5", "\u8404", "\u75AF", "\u6DEE", "\u9042", "\u718A", "\u7CAA", "\u70D8", "\u5BBF", "\u6863", "\u6208", "\u9A73", "\u5AC2", "\u88D5", "\u5F99", "\u7BAD", "\u6350", "\u80A0", "\u6491", "\u6652", "\u8FA8", "\u6BBF", "\u83B2", "\u644A", "\u6405", "\u9171", "\u5C4F", "\u75AB", "\u54C0", "\u8521", "\u5835", "\u6CAB", "\u76B1", "\u7545", "\u53E0", "\u9601", "\u83B1", "\u6572", "\u8F96", "\u94A9", "\u75D5", "\u575D", "\u5DF7", "\u997F", "\u7978", "\u4E18", "\u7384", "\u6E9C", "\u66F0", "\u903B", "\u5F6D", "\u5C1D", "\u537F", "\u59A8", "\u8247", "\u541E", "\u97E6", "\u6028", "\u77EE", "\u6B47"];
}
});
// node_modules/bip39-mnemonic/wordlist/chinese_traditional.json
var require_chinese_traditional = __commonJS({
"node_modules/bip39-mnemonic/wordlist/chinese_traditional.json"(exports2, module2) {
module2.exports = ["\u7684", "\u4E00", "\u662F", "\u5728", "\u4E0D", "\u4E86", "\u6709", "\u548C", "\u4EBA", "\u9019", "\u4E2D", "\u5927", "\u70BA", "\u4E0A", "\u500B", "\u570B", "\u6211", "\u4EE5", "\u8981", "\u4ED6", "\u6642", "\u4F86", "\u7528", "\u5011", "\u751F", "\u5230", "\u4F5C", "\u5730", "\u65BC", "\u51FA", "\u5C31", "\u5206", "\u5C0D", "\u6210", "\u6703", "\u53EF", "\u4E3B", "\u767C", "\u5E74", "\u52D5", "\u540C", "\u5DE5", "\u4E5F", "\u80FD", "\u4E0B", "\u904E", "\u5B50", "\u8AAA", "\u7522", "\u7A2E", "\u9762", "\u800C", "\u65B9", "\u5F8C", "\u591A", "\u5B9A", "\u884C", "\u5B78", "\u6CD5", "\u6240", "\u6C11", "\u5F97", "\u7D93", "\u5341", "\u4E09", "\u4E4B", "\u9032", "\u8457", "\u7B49", "\u90E8", "\u5EA6", "\u5BB6", "\u96FB", "\u529B", "\u88E1", "\u5982", "\u6C34", "\u5316", "\u9AD8", "\u81EA", "\u4E8C", "\u7406", "\u8D77", "\u5C0F", "\u7269", "\u73FE", "\u5BE6", "\u52A0", "\u91CF", "\u90FD", "\u5169", "\u9AD4", "\u5236", "\u6A5F", "\u7576", "\u4F7F", "\u9EDE", "\u5F9E", "\u696D", "\u672C", "\u53BB", "\u628A", "\u6027", "\u597D", "\u61C9", "\u958B", "\u5B83", "\u5408", "\u9084", "\u56E0", "\u7531", "\u5176", "\u4E9B", "\u7136", "\u524D", "\u5916", "\u5929", "\u653F", "\u56DB", "\u65E5", "\u90A3", "\u793E", "\u7FA9", "\u4E8B", "\u5E73", "\u5F62", "\u76F8", "\u5168", "\u8868", "\u9593", "\u6A23", "\u8207", "\u95DC", "\u5404", "\u91CD", "\u65B0", "\u7DDA", "\u5167", "\u6578", "\u6B63", "\u5FC3", "\u53CD", "\u4F60", "\u660E", "\u770B", "\u539F", "\u53C8", "\u9EBC", "\u5229", "\u6BD4", "\u6216", "\u4F46", "\u8CEA", "\u6C23", "\u7B2C", "\u5411", "\u9053", "\u547D", "\u6B64", "\u8B8A", "\u689D", "\u53EA", "\u6C92", "\u7D50", "\u89E3", "\u554F", "\u610F", "\u5EFA", "\u6708", "\u516C", "\u7121", "\u7CFB", "\u8ECD", "\u5F88", "\u60C5", "\u8005", "\u6700", "\u7ACB", "\u4EE3", "\u60F3", "\u5DF2", "\u901A", "\u4E26", "\u63D0", "\u76F4", "\u984C", "\u9EE8", "\u7A0B", "\u5C55", "\u4E94", "\u679C", "\u6599", "\u8C61", "\u54E1", "\u9769", "\u4F4D", "\u5165", "\u5E38", "\u6587", "\u7E3D", "\u6B21", "\u54C1", "\u5F0F", "\u6D3B", "\u8A2D", "\u53CA", "\u7BA1", "\u7279", "\u4EF6", "\u9577", "\u6C42", "\u8001", "\u982D", "\u57FA", "\u8CC7", "\u908A", "\u6D41", "\u8DEF", "\u7D1A", "\u5C11", "\u5716", "\u5C71", "\u7D71", "\u63A5", "\u77E5", "\u8F03", "\u5C07", "\u7D44", "\u898B", "\u8A08", "\u5225", "\u5979", "\u624B", "\u89D2", "\u671F", "\u6839", "\u8AD6", "\u904B", "\u8FB2", "\u6307", "\u5E7E", "\u4E5D", "\u5340", "\u5F37", "\u653E", "\u6C7A", "\u897F", "\u88AB", "\u5E79", "\u505A", "\u5FC5", "\u6230", "\u5148", "\u56DE", "\u5247", "\u4EFB", "\u53D6", "\u64DA", "\u8655", "\u968A", "\u5357", "\u7D66", "\u8272", "\u5149", "\u9580", "\u5373", "\u4FDD", "\u6CBB", "\u5317", "\u9020", "\u767E", "\u898F", "\u71B1", "\u9818", "\u4E03", "\u6D77", "\u53E3", "\u6771", "\u5C0E", "\u5668", "\u58D3", "\u5FD7", "\u4E16", "\u91D1", "\u589E", "\u722D", "\u6FDF", "\u968E", "\u6CB9", "\u601D", "\u8853", "\u6975", "\u4EA4", "\u53D7", "\u806F", "\u4EC0", "\u8A8D", "\u516D", "\u5171", "\u6B0A", "\u6536", "\u8B49", "\u6539", "\u6E05", "\u7F8E", "\u518D", "\u63A1", "\u8F49", "\u66F4", "\u55AE", "\u98A8", "\u5207", "\u6253", "\u767D", "\u6559", "\u901F", "\u82B1", "\u5E36", "\u5B89", "\u5834", "\u8EAB", "\u8ECA", "\u4F8B", "\u771F", "\u52D9", "\u5177", "\u842C", "\u6BCF", "\u76EE", "\u81F3", "\u9054", "\u8D70", "\u7A4D", "\u793A", "\u8B70", "\u8072", "\u5831", "\u9B25", "\u5B8C", "\u985E", "\u516B", "\u96E2", "\u83EF", "\u540D", "\u78BA", "\u624D", "\u79D1", "\u5F35", "\u4FE1", "\u99AC", "\u7BC0", "\u8A71", "\u7C73", "\u6574", "\u7A7A", "\u5143", "\u6CC1", "\u4ECA", "\u96C6", "\u6EAB", "\u50B3", "\u571F", "\u8A31", "\u6B65", "\u7FA4", "\u5EE3", "\u77F3", "\u8A18", "\u9700", "\u6BB5", "\u7814", "\u754C", "\u62C9", "\u6797", "\u5F8B", "\u53EB", "\u4E14", "\u7A76", "\u89C0", "\u8D8A", "\u7E54", "\u88DD", "\u5F71", "\u7B97", "\u4F4E", "\u6301", "\u97F3", "\u773E", "\u66F8", "\u5E03", "\u590D", "\u5BB9", "\u5152", "\u9808", "\u969B", "\u5546", "\u975E", "\u9A57", "\u9023", "\u65B7", "\u6DF1", "\u96E3", "\u8FD1", "\u7926", "\u5343", "\u9031", "\u59D4", "\u7D20", "\u6280", "\u5099", "\u534A", "\u8FA6", "\u9752", "\u7701", "\u5217", "\u7FD2", "\u97FF", "\u7D04", "\u652F", "\u822C", "\u53F2", "\u611F", "\u52DE", "\u4FBF", "\u5718", "\u5F80", "\u9178", "\u6B77", "\u5E02", "\u514B", "\u4F55", "\u9664", "\u6D88", "\u69CB", "\u5E9C", "\u7A31", "\u592A", "\u6E96", "\u7CBE", "\u503C", "\u865F", "\u7387", "\u65CF", "\u7DAD", "\u5283", "\u9078", "\u6A19", "\u5BEB", "\u5B58", "\u5019", "\u6BDB", "\u89AA", "\u5FEB", "\u6548", "\u65AF", "\u9662", "\u67E5", "\u6C5F", "\u578B", "\u773C", "\u738B", "\u6309", "\u683C", "\u990A", "\u6613", "\u7F6E", "\u6D3E", "\u5C64", "\u7247", "\u59CB", "\u537B", "\u5C08", "\u72C0", "\u80B2", "\u5EE0", "\u4EAC", "\u8B58", "\u9069", "\u5C6C", "\u5713", "\u5305", "\u706B", "\u4F4F", "\u8ABF", "\u6EFF", "\u7E23", "\u5C40", "\u7167", "\u53C3", "\u7D05", "\u7D30", "\u5F15", "\u807D", "\u8A72", "\u9435", "\u50F9", "\u56B4", "\u9996", "\u5E95", "\u6DB2", "\u5B98", "\u5FB7", "\u96A8", "\u75C5", "\u8607", "\u5931", "\u723E", "\u6B7B", "\u8B1B", "\u914D", "\u5973", "\u9EC3", "\u63A8", "\u986F", "\u8AC7", "\u7F6A", "\u795E", "\u85DD", "\u5462", "\u5E2D", "\u542B", "\u4F01", "\u671B", "\u5BC6", "\u6279", "\u71DF", "\u9805", "\u9632", "\u8209", "\u7403", "\u82F1", "\u6C27", "\u52E2", "\u544A", "\u674E", "\u53F0", "\u843D", "\u6728", "\u5E6B", "\u8F2A", "\u7834", "\u4E9E", "\u5E2B", "\u570D", "\u6CE8", "\u9060", "\u5B57", "\u6750", "\u6392", "\u4F9B", "\u6CB3", "\u614B", "\u5C01", "\u53E6", "\u65BD", "\u6E1B", "\u6A39", "\u6EB6", "\u600E", "\u6B62", "\u6848", "\u8A00", "\u58EB", "\u5747", "\u6B66", "\u56FA", "\u8449", "\u9B5A", "\u6CE2", "\u8996", "\u50C5", "\u8CBB", "\u7DCA", "\u611B", "\u5DE6", "\u7AE0", "\u65E9", "\u671D", "\u5BB3", "\u7E8C", "\u8F15", "\u670D", "\u8A66", "\u98DF", "\u5145", "\u5175", "\u6E90", "\u5224", "\u8B77", "\u53F8", "\u8DB3", "\u67D0", "\u7DF4", "\u5DEE", "\u81F4", "\u677F", "\u7530", "\u964D", "\u9ED1", "\u72AF", "\u8CA0", "\u64CA", "\u8303", "\u7E7C", "\u8208", "\u4F3C", "\u9918", "\u5805", "\u66F2", "\u8F38", "\u4FEE", "\u6545", "\u57CE", "\u592B", "\u5920", "\u9001", "\u7B46", "\u8239", "\u4F54", "\u53F3", "\u8CA1", "\u5403", "\u5BCC", "\u6625", "\u8077", "\u89BA", "\u6F22", "\u756B", "\u529F", "\u5DF4", "\u8DDF", "\u96D6", "\u96DC", "\u98DB", "\u6AA2", "\u5438", "\u52A9", "\u6607", "\u967D", "\u4E92", "\u521D", "\u5275", "\u6297", "\u8003", "\u6295", "\u58DE", "\u7B56", "\u53E4", "\u5F91", "\u63DB", "\u672A", "\u8DD1", "\u7559", "\u92FC", "\u66FE", "\u7AEF", "\u8CAC", "\u7AD9", "\u7C21", "\u8FF0", "\u9322", "\u526F", "\u76E1", "\u5E1D", "\u5C04", "\u8349", "\u885D", "\u627F", "\u7368", "\u4EE4", "\u9650", "\u963F", "\u5BA3", "\u74B0", "\u96D9", "\u8ACB", "\u8D85", "\u5FAE", "\u8B93", "\u63A7", "\u5DDE", "\u826F", "\u8EF8", "\u627E", "\u5426", "\u7D00", "\u76CA", "\u4F9D", "\u512A", "\u9802", "\u790E", "\u8F09", "\u5012", "\u623F", "\u7A81", "\u5750", "\u7C89", "\u6575", "\u7565", "\u5BA2", "\u8881", "\u51B7", "\u52DD", "\u7D55", "\u6790", "\u584A", "\u5291", "\u6E2C", "\u7D72", "\u5354", "\u8A34", "\u5FF5", "\u9673", "\u4ECD", "\u7F85", "\u9E7D", "\u53CB", "\u6D0B", "\u932F", "\u82E6", "\u591C", "\u5211", "\u79FB", "\u983B", "\u9010", "\u9760", "\u6DF7", "\u6BCD", "\u77ED", "\u76AE", "\u7D42", "\u805A", "\u6C7D", "\u6751", "\u96F2", "\u54EA", "\u65E2", "\u8DDD", "\u885B", "\u505C", "\u70C8", "\u592E", "\u5BDF", "\u71D2", "\u8FC5", "\u5883", "\u82E5", "\u5370", "\u6D32", "\u523B", "\u62EC", "\u6FC0", "\u5B54", "\u641E", "\u751A", "\u5BA4", "\u5F85", "\u6838", "\u6821", "\u6563", "\u4FB5", "\u5427", "\u7532", "\u904A", "\u4E45", "\u83DC", "\u5473", "\u820A", "\u6A21", "\u6E56", "\u8CA8", "\u640D", "\u9810", "\u963B", "\u6BEB", "\u666E", "\u7A69", "\u4E59", "\u5ABD", "\u690D", "\u606F", "\u64F4", "\u9280", "\u8A9E", "\u63EE", "\u9152", "\u5B88", "\u62FF", "\u5E8F", "\u7D19", "\u91AB", "\u7F3A", "\u96E8", "\u55CE", "\u91DD", "\u5289", "\u554A", "\u6025", "\u5531", "\u8AA4", "\u8A13", "\u9858", "\u5BE9", "\u9644", "\u7372", "\u8336", "\u9BAE", "\u7CE7", "\u65A4", "\u5B69", "\u812B", "\u786B", "\u80A5", "\u5584", "\u9F8D", "\u6F14", "\u7236", "\u6F38", "\u8840", "\u6B61", "\u68B0", "\u638C", "\u6B4C", "\u6C99", "\u525B", "\u653B", "\u8B02", "\u76FE", "\u8A0E", "\u665A", "\u7C92", "\u4E82", "\u71C3", "\u77DB", "\u4E4E", "\u6BBA", "\u85E5", "\u5BE7", "\u9B6F", "\u8CB4", "\u9418", "\u7164", "\u8B80", "\u73ED", "\u4F2F", "\u9999", "\u4ECB", "\u8FEB", "\u53E5", "\u8C50", "\u57F9", "\u63E1", "\u862D", "\u64D4", "\u5F26", "\u86CB", "\u6C89", "\u5047", "\u7A7F", "\u57F7", "\u7B54", "\u6A02", "\u8AB0", "\u9806", "\u7159", "\u7E2E", "\u5FB5", "\u81C9", "\u559C", "\u677E", "\u8173", "\u56F0", "\u7570", "\u514D", "\u80CC", "\u661F", "\u798F", "\u8CB7", "\u67D3", "\u4E95", "\u6982", "\u6162", "\u6015", "\u78C1", "\u500D", "\u7956", "\u7687", "\u4FC3", "\u975C", "\u88DC", "\u8A55", "\u7FFB", "\u8089", "\u8E10", "\u5C3C", "\u8863", "\u5BEC", "\u63DA", "\u68C9", "\u5E0C", "\u50B7", "\u64CD", "\u5782", "\u79CB", "\u5B9C", "\u6C2B", "\u5957", "\u7763", "\u632F", "\u67B6", "\u4EAE", "\u672B", "\u61B2", "\u6176", "\u7DE8", "\u725B", "\u89F8", "\u6620", "\u96F7", "\u92B7", "\u8A69", "\u5EA7", "\u5C45", "\u6293", "\u88C2", "\u80DE", "\u547C", "\u5A18", "\u666F", "\u5A01", "\u7DA0", "\u6676", "\u539A", "\u76DF", "\u8861", "\u96DE", "\u5B6B", "\u5EF6", "\u5371", "\u81A0", "\u5C4B", "\u9109", "\u81E8", "\u9678", "\u9867", "\u6389", "\u5440", "\u71C8", "\u6B72", "\u63AA", "\u675F", "\u8010", "\u5287", "\u7389", "\u8D99", "\u8DF3", "\u54E5", "\u5B63", "\u8AB2", "\u51F1", "\u80E1", "\u984D", "\u6B3E", "\u7D39", "\u5377", "\u9F4A", "\u5049", "\u84B8", "\u6B96", "\u6C38", "\u5B97", "\u82D7", "\u5DDD", "\u7210", "\u5CA9", "\u5F31", "\u96F6", "\u694A", "\u594F", "\u6CBF", "\u9732", "\u687F", "\u63A2", "\u6ED1", "\u93AE", "\u98EF", "\u6FC3", "\u822A", "\u61F7", "\u8D95", "\u5EAB", "\u596A", "\u4F0A", "\u9748", "\u7A05", "\u9014", "\u6EC5", "\u8CFD", "\u6B78", "\u53EC", "\u9F13", "\u64AD", "\u76E4", "\u88C1", "\u96AA", "\u5EB7", "\u552F", "\u9304", "\u83CC", "\u7D14", "\u501F", "\u7CD6", "\u84CB", "\u6A6B", "\u7B26", "\u79C1", "\u52AA", "\u5802", "\u57DF", "\u69CD", "\u6F64", "\u5E45", "\u54C8", "\u7ADF", "\u719F", "\u87F2", "\u6FA4", "\u8166", "\u58E4", "\u78B3", "\u6B50", "\u904D", "\u5074", "\u5BE8", "\u6562", "\u5FB9", "\u616E", "\u659C", "\u8584", "\u5EAD", "\u7D0D", "\u5F48", "\u98FC", "\u4F38", "\u6298", "\u9EA5", "\u6FD5", "\u6697", "\u8377", "\u74E6", "\u585E", "\u5E8A", "\u7BC9", "\u60E1", "\u6236", "\u8A2A", "\u5854", "\u5947", "\u900F", "\u6881", "\u5200", "\u65CB", "\u8DE1", "\u5361", "\u6C2F", "\u9047", "\u4EFD", "\u6BD2", "\u6CE5", "\u9000", "\u6D17", "\u64FA", "\u7070", "\u5F69", "\u8CE3", "\u8017", "\u590F", "\u64C7", "\u5FD9", "\u9285", "\u737B", "\u786C", "\u4E88", "\u7E41", "\u5708", "\u96EA", "\u51FD", "\u4EA6", "\u62BD", "\u7BC7", "\u9663", "\u9670", "\u4E01", "\u5C3A", "\u8FFD", "\u5806", "\u96C4", "\u8FCE", "\u6CDB", "\u7238", "\u6A13", "\u907F", "\u8B00", "\u5678", "\u91CE", "\u8C6C", "\u65D7", "\u7D2F", "\u504F", "\u5178", "\u9928", "\u7D22", "\u79E6", "\u8102", "\u6F6E", "\u723A", "\u8C46", "\u5FFD", "\u6258", "\u9A5A", "\u5851", "\u907A", "\u6108", "\u6731", "\u66FF", "\u7E96", "\u7C97", "\u50BE", "\u5C1A", "\u75DB", "\u695A", "\u8B1D", "\u596E", "\u8CFC", "\u78E8", "\u541B", "\u6C60", "\u65C1", "\u788E", "\u9AA8", "\u76E3", "\u6355", "\u5F1F", "\u66B4", "\u5272", "\u8CAB", "\u6B8A", "\u91CB", "\u8A5E", "\u4EA1", "\u58C1", "\u9813", "\u5BF6", "\u5348", "\u5875", "\u805E", "\u63ED", "\u70AE", "\u6B98", "\u51AC", "\u6A4B", "\u5A66", "\u8B66", "\u7D9C", "\u62DB", "\u5433", "\u4ED8", "\u6D6E", "\u906D", "\u5F90", "\u60A8", "\u6416", "\u8C37", "\u8D0A", "\u7BB1", "\u9694", "\u8A02", "\u7537", "\u5439", "\u5712", "\u7D1B", "\u5510", "\u6557", "\u5B8B", "\u73BB", "\u5DE8", "\u8015", "\u5766", "\u69AE", "\u9589", "\u7063", "\u9375", "\u51E1", "\u99D0", "\u934B", "\u6551", "\u6069", "\u525D", "\u51DD", "\u9E7C", "\u9F52", "\u622A", "\u7149", "\u9EBB", "\u7D21", "\u7981", "\u5EE2", "\u76DB", "\u7248", "\u7DE9", "\u6DE8", "\u775B", "\u660C", "\u5A5A", "\u6D89", "\u7B52", "\u5634", "\u63D2", "\u5CB8", "\u6717", "\u838A", "\u8857", "\u85CF", "\u59D1", "\u8CBF", "\u8150", "\u5974", "\u5566", "\u6163", "\u4E58", "\u5925", "\u6062", "\u52FB", "\u7D17", "\u624E", "\u8FAF", "\u8033", "\u5F6A", "\u81E3", "\u5104", "\u7483", "\u62B5", "\u8108", "\u79C0", "\u85A9", "\u4FC4", "\u7DB2", "\u821E", "\u5E97", "\u5674", "\u7E31", "\u5BF8", "\u6C57", "\u639B", "\u6D2A", "\u8CC0", "\u9583", "\u67EC", "\u7206", "\u70EF", "\u6D25", "\u7A3B", "\u7246", "\u8EDF", "\u52C7", "\u50CF", "\u6EFE", "\u5398", "\u8499", "\u82B3", "\u80AF", "\u5761", "\u67F1", "\u76EA", "\u817F", "\u5100", "\u65C5", "\u5C3E", "\u8ECB", "\u51B0", "\u8CA2", "\u767B", "\u9ECE", "\u524A", "\u947D", "\u52D2", "\u9003", "\u969C", "\u6C28", "\u90ED", "\u5CF0", "\u5E63", "\u6E2F", "\u4F0F", "\u8ECC", "\u755D", "\u7562", "\u64E6", "\u83AB", "\u523A", "\u6D6A", "\u79D8", "\u63F4", "\u682A", "\u5065", "\u552E", "\u80A1", "\u5CF6", "\u7518", "\u6CE1", "\u7761", "\u7AE5", "\u9444", "\u6E6F", "\u95A5", "\u4F11", "\u532F", "\u820D", "\u7267", "\u7E5E", "\u70B8", "\u54F2", "\u78F7", "\u7E3E", "\u670B", "\u6DE1", "\u5C16", "\u555F", "\u9677", "\u67F4", "\u5448", "\u5F92", "\u984F", "\u6DDA", "\u7A0D", "\u5FD8", "\u6CF5", "\u85CD", "\u62D6", "\u6D1E", "\u6388", "\u93E1", "\u8F9B", "\u58EF", "\u92D2", "\u8CA7", "\u865B", "\u5F4E", "\u6469", "\u6CF0", "\u5E7C", "\u5EF7", "\u5C0A", "\u7A97", "\u7DB1", "\u5F04", "\u96B8", "\u7591", "\u6C0F", "\u5BAE", "\u59D0", "\u9707", "\u745E", "\u602A", "\u5C24", "\u7434", "\u5FAA", "\u63CF", "\u819C", "\u9055", "\u593E", "\u8170", "\u7DE3", "\u73E0", "\u7AAE", "\u68EE", "\u679D", "\u7AF9", "\u6E9D", "\u50AC", "\u7E69", "\u61B6", "\u90A6", "\u5269", "\u5E78", "\u6F3F", "\u6B04", "\u64C1", "\u7259", "\u8CAF", "\u79AE", "\u6FFE", "\u9209", "\u7D0B", "\u7F77", "\u62CD", "\u54B1", "\u558A", "\u8896", "\u57C3", "\u52E4", "\u7F70", "\u7126", "\u6F5B", "\u4F0D", "\u58A8", "\u6B32", "\u7E2B", "\u59D3", "\u520A", "\u98FD", "\u4EFF", "\u734E", "\u92C1", "\u9B3C", "\u9E97", "\u8DE8", "\u9ED8", "\u6316", "\u93C8", "\u6383", "\u559D", "\u888B", "\u70AD", "\u6C61", "\u5E55", "\u8AF8", "\u5F27", "\u52F5", "\u6885", "\u5976", "\u6F54", "\u707D", "\u821F", "\u9451", "\u82EF", "\u8A1F", "\u62B1", "\u6BC0", "\u61C2", "\u5BD2", "\u667A", "\u57D4", "\u5BC4", "\u5C46", "\u8E8D", "\u6E21", "\u6311", "\u4E39", "\u8271", "\u8C9D", "\u78B0", "\u62D4", "\u7239", "\u6234", "\u78BC", "\u5922", "\u82BD", "\u7194", "\u8D64", "\u6F01", "\u54ED", "\u656C", "\u9846", "\u5954", "\u925B", "\u4EF2", "\u864E", "\u7A00", "\u59B9", "\u4E4F", "\u73CD", "\u7533", "\u684C", "\u9075", "\u5141", "\u9686", "\u87BA", "\u5009", "\u9B4F", "\u92B3", "\u66C9", "\u6C2E", "\u517C", "\u96B1", "\u7919", "\u8D6B", "\u64A5", "\u5FE0", "\u8085", "\u7F38", "\u727D", "\u6436", "\u535A", "\u5DE7", "\u6BBC", "\u5144", "\u675C", "\u8A0A", "\u8AA0", "\u78A7", "\u7965", "\u67EF", "\u9801", "\u5DE1", "\u77E9", "\u60B2", "\u704C", "\u9F61", "\u502B", "\u7968", "\u5C0B", "\u6842", "\u92EA", "\u8056", "\u6050", "\u6070", "\u912D", "\u8DA3", "\u62AC", "\u8352", "\u9A30", "\u8CBC", "\u67D4", "\u6EF4", "\u731B", "\u95CA", "\u8F1B", "\u59BB", "\u586B", "\u64A4", "\u5132", "\u7C3D", "\u9B27", "\u64FE", "\u7D2B", "\u7802", "\u905E", "\u6232", "\u540A", "\u9676", "\u4F10", "\u9935", "\u7642", "\u74F6", "\u5A46", "\u64AB", "\u81C2", "\u6478", "\u5FCD", "\u8766", "\u881F", "\u9130", "\u80F8", "\u978F", "\u64E0", "\u5076", "\u68C4", "\u69FD", "\u52C1", "\u4E73", "\u9127", "\u5409", "\u4EC1", "\u721B", "\u78DA", "\u79DF", "\u70CF", "\u8266", "\u4F34", "\u74DC", "\u6DFA", "\u4E19", "\u66AB", "\u71E5", "\u6A61", "\u67F3", "\u8FF7", "\u6696", "\u724C", "\u79E7", "\u81BD", "\u8A73", "\u7C27", "\u8E0F", "\u74F7", "\u8B5C", "\u5446", "\u8CD3", "\u7CCA", "\u6D1B", "\u8F1D", "\u61A4", "\u7AF6", "\u9699", "\u6012", "\u7C98", "\u4E43", "\u7DD2", "\u80A9", "\u7C4D", "\u654F", "\u5857", "\u7199", "\u7686", "\u5075", "\u61F8", "\u6398", "\u4EAB", "\u7CFE", "\u9192", "\u72C2", "\u9396", "\u6DC0", "\u6068", "\u7272", "\u9738", "\u722C", "\u8CDE", "\u9006", "\u73A9", "\u9675", "\u795D", "\u79D2", "\u6D59", "\u8C8C", "\u5F79", "\u5F7C", "\u6089", "\u9D28", "\u8DA8", "\u9CF3", "\u6668", "\u755C", "\u8F29", "\u79E9", "\u5375", "\u7F72", "\u68AF", "\u708E", "\u7058", "\u68CB", "\u9A45", "\u7BE9", "\u5CFD", "\u5192", "\u5565", "\u58FD", "\u8B6F", "\u6D78", "\u6CC9", "\u5E3D", "\u9072", "\u77FD", "\u7586", "\u8CB8", "\u6F0F", "\u7A3F", "\u51A0", "\u5AE9", "\u8105", "\u82AF", "\u7262", "\u53DB", "\u8755", "\u5967", "\u9CF4", "\u5DBA", "\u7F8A", "\u6191", "\u4E32", "\u5858", "\u7E6A", "\u9175", "\u878D", "\u76C6", "\u932B", "\u5EDF", "\u7C4C", "\u51CD", "\u8F14", "\u651D", "\u8972", "\u7B4B", "\u62D2", "\u50DA", "\u65F1", "\u9240", "\u9CE5", "\u6F06", "\u6C88", "\u7709", "\u758F", "\u6DFB", "\u68D2", "\u7A57", "\u785D", "\u97D3", "\u903C", "\u626D", "\u50D1", "\u6DBC", "\u633A", "\u7897", "\u683D", "\u7092", "\u676F", "\u60A3", "\u993E", "\u52F8", "\u8C6A", "\u907C", "\u52C3", "\u9D3B", "\u65E6", "\u540F", "\u62DC", "\u72D7", "\u57CB", "\u8F25", "\u63A9", "\u98F2", "\u642C", "\u7F75", "\u8FAD", "\u52FE", "\u6263", "\u4F30", "\u8523", "\u7D68", "\u9727", "\u4E08", "\u6735", "\u59C6", "\u64EC", "\u5B87", "\u8F2F", "\u965D", "\u96D5", "\u511F", "\u84C4", "\u5D07", "\u526A", "\u5021", "\u5EF3", "\u54AC", "\u99DB", "\u85AF", "\u5237", "\u65A5", "\u756A", "\u8CE6", "\u5949", "\u4F5B", "\u6F86", "\u6F2B", "\u66FC", "\u6247", "\u9223", "\u6843", "\u6276", "\u4ED4", "\u8FD4", "\u4FD7", "\u8667", "\u8154", "\u978B", "\u68F1", "\u8986", "\u6846", "\u6084", "\u53D4", "\u649E", "\u9A19", "\u52D8", "\u65FA", "\u6CB8", "\u5B64", "\u5410", "\u5B5F", "\u6E20", "\u5C48", "\u75BE", "\u5999", "\u60DC", "\u4EF0", "\u72E0", "\u8139", "\u8AE7", "\u62CB", "\u9EF4", "\u6851", "\u5D17", "\u561B", "\u8870", "\u76DC", "\u6EF2", "\u81DF", "\u8CF4", "\u6E67", "\u751C", "\u66F9", "\u95B1", "\u808C", "\u54E9", "\u53B2", "\u70F4", "\u7DEF", "\u6BC5", "\u6628", "\u507D", "\u75C7", "\u716E", "\u5606", "\u91D8", "\u642D", "\u8396", "\u7C60", "\u9177", "\u5077", "\u5F13", "\u9310", "\u6046", "\u5091", "\u5751", "\u9F3B", "\u7FFC", "\u7DB8", "\u6558", "\u7344", "\u902E", "\u7F50", "\u7D61", "\u68DA", "\u6291", "\u81A8", "\u852C", "\u5BFA", "\u9A5F", "\u7A46", "\u51B6", "\u67AF", "\u518A", "\u5C4D", "\u51F8", "\u7D33", "\u576F", "\u72A7", "\u7130", "\u8F5F", "\u6B23", "\u6649", "\u7626", "\u79A6", "\u9320", "\u9326", "\u55AA", "\u65EC", "\u935B", "\u58DF", "\u641C", "\u64B2", "\u9080", "\u4EAD", "\u916F", "\u9081", "\u8212", "\u8106", "\u9176", "\u9592", "\u6182", "\u915A", "\u9811", "\u7FBD", "\u6F32", "\u5378", "\u4ED7", "\u966A", "\u95E2", "\u61F2", "\u676D", "\u59DA", "\u809A", "\u6349", "\u98C4", "\u6F02", "\u6606", "\u6B3A", "\u543E", "\u90CE", "\u70F7", "\u6C41", "\u5475", "\u98FE", "\u856D", "\u96C5", "\u90F5", "\u9077", "\u71D5", "\u6492", "\u59FB", "\u8D74", "\u5BB4", "\u7169", "\u50B5", "\u5E33", "\u6591", "\u9234", "\u65E8", "\u9187", "\u8463", "\u9905", "\u96DB", "\u59FF", "\u62CC", "\u5085", "\u8179", "\u59A5", "\u63C9", "\u8CE2", "\u62C6", "\u6B6A", "\u8461", "\u80FA", "\u4E1F", "\u6D69", "\u5FBD", "\u6602", "\u588A", "\u64CB", "\u89BD", "\u8CAA", "\u6170", "\u7E73", "\u6C6A", "\u614C", "\u99AE", "\u8AFE", "\u59DC", "\u8ABC", "\u5147", "\u52A3", "\u8AA3", "\u8000", "\u660F", "\u8EBA", "\u76C8", "\u9A0E", "\u55AC", "\u6EAA", "\u53E2", "\u76E7", "\u62B9", "\u60B6", "\u8AEE", "\u522E", "\u99D5", "\u7E9C", "\u609F", "\u6458", "\u927A", "\u64F2", "\u9817", "\u5E7B", "\u67C4", "\u60E0", "\u6158", "\u4F73", "\u4EC7", "\u81D8", "\u7AA9", "\u6ECC", "\u528D", "\u77A7", "\u5821", "\u6F51", "\u8525", "\u7F69", "\u970D", "\u6488", "\u80CE", "\u84BC", "\u6FF1", "\u5006", "\u6345", "\u6E58", "\u780D", "\u971E", "\u90B5", "\u8404", "\u760B", "\u6DEE", "\u9042", "\u718A", "\u7CDE", "\u70D8", "\u5BBF", "\u6A94", "\u6208", "\u99C1", "\u5AC2", "\u88D5", "\u5F99", "\u7BAD", "\u6350", "\u8178", "\u6490", "\u66EC", "\u8FA8", "\u6BBF", "\u84EE", "\u6524", "\u652A", "\u91AC", "\u5C4F", "\u75AB", "\u54C0", "\u8521", "\u5835", "\u6CAB", "\u76BA", "\u66A2", "\u758A", "\u95A3", "\u840A", "\u6572", "\u8F44", "\u9264", "\u75D5", "\u58E9", "\u5DF7", "\u9913", "\u798D", "\u4E18", "\u7384", "\u6E9C", "\u66F0", "\u908F", "\u5F6D", "\u5617", "\u537F", "\u59A8", "\u8247", "\u541E", "\u97CB", "\u6028", "\u77EE", "\u6B47"];
}
});
// node_modules/bip39-mnemonic/wordlist/czech.json
var require_czech = __commonJS({
"node_modules/bip39-mnemonic/wordlist/czech.json"(exports2, module2) {
module2.exports = ["abdikace", "abeceda", "adresa", "agrese", "akce", "aktovka", "alej", "alkohol", "amputace", "ananas", "andulka", "anekdota", "anketa", "antika", "anulovat", "archa", "arogance", "asfalt", "asistent", "aspirace", "astma", "astronom", "atlas", "atletika", "atol", "autobus", "azyl", "babka", "bachor", "bacil", "baculka", "badatel", "bageta", "bagr", "bahno", "bakterie", "balada", "baletka", "balkon", "balonek", "balvan", "balza", "bambus", "bankomat", "barbar", "baret", "barman", "baroko", "barva", "baterka", "batoh", "bavlna", "bazalka", "bazilika", "bazuka", "bedna", "beran", "beseda", "bestie", "beton", "bezinka", "bezmoc", "beztak", "bicykl", "bidlo", "biftek", "bikiny", "bilance", "biograf", "biolog", "bitva", "bizon", "blahobyt", "blatouch", "blecha", "bledule", "blesk", "blikat", "blizna", "blokovat", "bloudit", "blud", "bobek", "bobr", "bodlina", "bodnout", "bohatost", "bojkot", "bojovat", "bokorys", "bolest", "borec", "borovice", "bota", "boubel", "bouchat", "bouda", "boule", "bourat", "boxer", "bradavka", "brambora", "branka", "bratr", "brepta", "briketa", "brko", "brloh", "bronz", "broskev", "brunetka", "brusinka", "brzda", "brzy", "bublina", "bubnovat", "buchta", "buditel", "budka", "budova", "bufet", "bujarost", "bukvice", "buldok", "bulva", "bunda", "bunkr", "burza", "butik", "buvol", "buzola", "bydlet", "bylina", "bytovka", "bzukot", "capart", "carevna", "cedr", "cedule", "cejch", "cejn", "cela", "celer", "celkem", "celnice", "cenina", "cennost", "cenovka", "centrum", "cenzor", "cestopis", "cetka", "chalupa", "chapadlo", "charita", "chata", "chechtat", "chemie", "chichot", "chirurg", "chlad", "chleba", "chlubit", "chmel", "chmura", "chobot", "chochol", "chodba", "cholera", "chomout", "chopit", "choroba", "chov", "chrapot", "chrlit", "chrt", "chrup", "chtivost", "chudina", "chutnat", "chvat", "chvilka", "chvost", "chyba", "chystat", "chytit", "cibule", "cigareta", "cihelna", "cihla", "cinkot", "cirkus", "cisterna", "citace", "citrus", "cizinec", "cizost", "clona", "cokoliv", "couvat", "ctitel", "ctnost", "cudnost", "cuketa", "cukr", "cupot", "cvaknout", "cval", "cvik", "cvrkot", "cyklista", "daleko", "dareba", "datel", "datum", "dcera", "debata", "dechovka", "decibel", "deficit", "deflace", "dekl", "dekret", "demokrat", "deprese", "derby", "deska", "detektiv", "dikobraz", "diktovat", "dioda", "diplom", "disk", "displej", "divadlo", "divoch", "dlaha", "dlouho", "dluhopis", "dnes", "dobro", "dobytek", "docent", "dochutit", "dodnes", "dohled", "dohoda", "dohra", "dojem", "dojnice", "doklad", "dokola", "doktor", "dokument", "dolar", "doleva", "dolina", "doma", "dominant", "domluvit", "domov", "donutit", "dopad", "dopis", "doplnit", "doposud", "doprovod", "dopustit", "dorazit", "dorost", "dort", "dosah", "doslov", "dostatek", "dosud", "dosyta", "dotaz", "dotek", "dotknout", "doufat", "doutnat", "dovozce", "dozadu", "doznat", "dozorce", "drahota", "drak", "dramatik", "dravec", "draze", "drdol", "drobnost", "drogerie", "drozd", "drsnost", "drtit", "drzost", "duben", "duchovno", "dudek", "duha", "duhovka", "dusit", "dusno", "dutost", "dvojice", "dvorec", "dynamit", "ekolog", "ekonomie", "elektron", "elipsa", "email", "emise", "emoce", "empatie", "epizoda", "epocha", "epopej", "epos", "esej", "esence", "eskorta", "eskymo", "etiketa", "euforie", "evoluce", "exekuce", "exkurze", "expedice", "exploze", "export", "extrakt", "facka", "fajfka", "fakulta", "fanatik", "fantazie", "farmacie", "favorit", "fazole", "federace", "fejeton", "fenka", "fialka", "figurant", "filozof", "filtr", "finance", "finta", "fixace", "fjord", "flanel", "flirt", "flotila", "fond", "fosfor", "fotbal", "fotka", "foton", "frakce", "freska", "fronta", "fukar", "funkce", "fyzika", "galeje", "garant", "genetika", "geolog", "gilotina", "glazura", "glejt", "golem", "golfista", "gotika", "graf", "gramofon", "granule", "grep", "gril", "grog", "groteska", "guma", "hadice", "hadr", "hala", "halenka", "hanba", "hanopis", "harfa", "harpuna", "havran", "hebkost", "hejkal", "hejno", "hejtman", "hektar", "helma", "hematom", "herec", "herna", "heslo", "hezky", "historik", "hladovka", "hlasivky", "hlava", "hledat", "hlen", "hlodavec", "hloh", "hloupost", "hltat", "hlubina", "hluchota", "hmat", "hmota", "hmyz", "hnis", "hnojivo", "hnout", "hoblina", "hoboj", "hoch", "hodiny", "hodlat", "hodnota", "hodovat", "hojnost", "hokej", "holinka", "holka", "holub", "homole", "honitba", "honorace", "horal", "horda", "horizont", "horko", "horlivec", "hormon", "hornina", "horoskop", "horstvo", "hospoda", "hostina", "hotovost", "houba", "houf", "houpat", "houska", "hovor", "hradba", "hranice", "hravost", "hrazda", "hrbolek", "hrdina", "hrdlo", "hrdost", "hrnek", "hrobka", "hromada", "hrot", "hrouda", "hrozen", "hrstka", "hrubost", "hryzat", "hubenost", "hubnout", "hudba", "hukot", "humr", "husita", "hustota", "hvozd", "hybnost", "hydrant", "hygiena", "hymna", "hysterik", "idylka", "ihned", "ikona", "iluze", "imunita", "infekce", "inflace", "inkaso", "inovace", "inspekce", "internet", "invalida", "investor", "inzerce", "ironie", "jablko", "jachta", "jahoda", "jakmile", "jakost", "jalovec", "jantar", "jarmark", "jaro", "jasan", "jasno", "jatka", "javor", "jazyk", "jedinec", "jedle", "jednatel", "jehlan", "jekot", "jelen", "jelito", "jemnost", "jenom", "jepice", "jeseter", "jevit", "jezdec", "jezero", "jinak", "jindy", "jinoch", "jiskra", "jistota", "jitrnice", "jizva", "jmenovat", "jogurt", "jurta", "kabaret", "kabel", "kabinet", "kachna", "kadet", "kadidlo", "kahan", "kajak", "kajuta", "kakao", "kaktus", "kalamita", "kalhoty", "kalibr", "kalnost", "kamera", "kamkoliv", "kamna", "kanibal", "kanoe", "kantor", "kapalina", "kapela", "kapitola", "kapka", "kaple", "kapota", "kapr", "kapusta", "kapybara", "karamel", "karotka", "karton", "kasa", "katalog", "katedra", "kauce", "kauza", "kavalec", "kazajka", "kazeta", "kazivost", "kdekoliv", "kdesi", "kedluben", "kemp", "keramika", "kino", "klacek", "kladivo", "klam", "klapot", "klasika", "klaun", "klec", "klenba", "klepat", "klesnout", "klid", "klima", "klisna", "klobouk", "klokan", "klopa", "kloub", "klubovna", "klusat", "kluzkost", "kmen", "kmitat", "kmotr", "kniha", "knot", "koalice", "koberec", "kobka", "kobliha", "kobyla", "kocour", "kohout", "kojenec", "kokos", "koktejl", "kolaps", "koleda", "kolize", "kolo", "komando", "kometa", "komik", "komnata", "komora", "kompas", "komunita", "konat", "koncept", "kondice", "konec", "konfese", "kongres", "konina", "konkurs", "kontakt", "konzerva", "kopanec", "kopie", "kopnout", "koprovka", "korbel", "korektor", "kormidlo", "koroptev", "korpus", "koruna", "koryto", "korzet", "kosatec", "kostka", "kotel", "kotleta", "kotoul", "koukat", "koupelna", "kousek", "kouzlo", "kovboj", "koza", "kozoroh", "krabice", "krach", "krajina", "kralovat", "krasopis", "kravata", "kredit", "krejcar", "kresba", "kreveta", "kriket", "kritik", "krize", "krkavec", "krmelec", "krmivo", "krocan", "krok", "kronika", "kropit", "kroupa", "krovka", "krtek", "kruhadlo", "krupice", "krutost", "krvinka", "krychle", "krypta", "krystal", "kryt", "kudlanka", "kufr", "kujnost", "kukla", "kulajda", "kulich", "kulka", "kulomet", "kultura", "kuna", "kupodivu", "kurt", "kurzor", "kutil", "kvalita", "kvasinka", "kvestor", "kynolog", "kyselina", "kytara", "kytice", "kytka", "kytovec", "kyvadlo", "labrador", "lachtan", "ladnost", "laik", "lakomec", "lamela", "lampa", "lanovka", "lasice", "laso", "lastura", "latinka", "lavina", "lebka", "leckdy", "leden", "lednice", "ledovka", "ledvina", "legenda", "legie", "legrace", "lehce", "lehkost", "lehnout", "lektvar", "lenochod", "lentilka", "lepenka", "lepidlo", "letadlo", "letec", "letmo", "letokruh", "levhart", "levitace", "levobok", "libra", "lichotka", "lidojed", "lidskost", "lihovina", "lijavec", "lilek", "limetka", "linie", "linka", "linoleum", "listopad", "litina", "litovat", "lobista", "lodivod", "logika", "logoped", "lokalita", "loket", "lomcovat", "lopata", "lopuch", "lord", "losos", "lotr", "loudal", "louh", "louka", "louskat", "lovec", "lstivost", "lucerna", "lucifer", "lump", "lusk", "lustrace", "lvice", "lyra", "lyrika", "lysina", "madam", "madlo", "magistr", "mahagon", "majetek", "majitel", "majorita", "makak", "makovice", "makrela", "malba", "malina", "malovat", "malvice", "maminka", "mandle", "manko", "marnost", "masakr", "maskot", "masopust", "matice", "matrika", "maturita", "mazanec", "mazivo", "mazlit", "mazurka", "mdloba", "mechanik", "meditace", "medovina", "melasa", "meloun", "mentolka", "metla", "metoda", "metr", "mezera", "migrace", "mihnout", "mihule", "mikina", "mikrofon", "milenec", "milimetr", "milost", "mimika", "mincovna", "minibar", "minomet", "minulost", "miska", "mistr", "mixovat", "mladost", "mlha", "mlhovina", "mlok", "mlsat", "mluvit", "mnich", "mnohem", "mobil", "mocnost", "modelka", "modlitba", "mohyla", "mokro", "molekula", "momentka", "monarcha", "monokl", "monstrum", "montovat", "monzun", "mosaz", "moskyt", "most", "motivace", "motorka", "motyka", "moucha", "moudrost", "mozaika", "mozek", "mozol", "mramor", "mravenec", "mrkev", "mrtvola", "mrzet", "mrzutost", "mstitel", "mudrc", "muflon", "mulat", "mumie", "munice", "muset", "mutace", "muzeum", "muzikant", "myslivec", "mzda", "nabourat", "nachytat", "nadace", "nadbytek", "nadhoz", "nadobro", "nadpis", "nahlas", "nahnat", "nahodile", "nahradit", "naivita", "najednou", "najisto", "najmout", "naklonit", "nakonec", "nakrmit", "nalevo", "namazat", "namluvit", "nanometr", "naoko", "naopak", "naostro", "napadat", "napevno", "naplnit", "napnout", "naposled", "naprosto", "narodit", "naruby", "narychlo", "nasadit", "nasekat", "naslepo", "nastat", "natolik", "navenek", "navrch", "navzdory", "nazvat", "nebe", "nechat", "necky", "nedaleko", "nedbat", "neduh", "negace", "nehet", "nehoda", "nejen", "nejprve", "neklid", "nelibost", "nemilost", "nemoc", "neochota", "neonka", "nepokoj", "nerost", "nerv", "nesmysl", "nesoulad", "netvor", "neuron", "nevina", "nezvykle", "nicota", "nijak", "nikam", "nikdy", "nikl", "nikterak", "nitro", "nocleh", "nohavice", "nominace", "nora", "norek", "nositel", "nosnost", "nouze", "noviny", "novota", "nozdra", "nuda", "nudle", "nuget", "nutit", "nutnost", "nutrie", "nymfa", "obal", "obarvit", "obava", "obdiv", "obec", "obehnat", "obejmout", "obezita", "obhajoba", "obilnice", "objasnit", "objekt", "obklopit", "oblast", "oblek", "obliba", "obloha", "obluda", "obnos", "obohatit", "obojek", "obout", "obrazec", "obrna", "obruba", "obrys", "obsah", "obsluha", "obstarat", "obuv", "obvaz", "obvinit", "obvod", "obvykle", "obyvatel", "obzor", "ocas", "ocel", "ocenit", "ochladit", "ochota", "ochrana", "ocitnout", "odboj", "odbyt", "odchod", "odcizit", "odebrat", "odeslat", "odevzdat", "odezva", "odhadce", "odhodit", "odjet", "odjinud", "odkaz", "odkoupit", "odliv", "odluka", "odmlka", "odolnost", "odpad", "odpis", "odplout", "odpor", "odpustit", "odpykat", "odrazka", "odsoudit", "odstup", "odsun", "odtok", "odtud", "odvaha", "odveta", "odvolat", "odvracet", "odznak", "ofina", "ofsajd", "ohlas", "ohnisko", "ohrada", "ohrozit", "ohryzek", "okap", "okenice", "oklika", "okno", "okouzlit", "okovy", "okrasa", "okres", "okrsek", "okruh", "okupant", "okurka", "okusit", "olejnina", "olizovat", "omak", "omeleta", "omezit", "omladina", "omlouvat", "omluva", "omyl", "onehdy", "opakovat", "opasek", "operace", "opice", "opilost", "opisovat", "opora", "opozice", "opravdu", "oproti", "orbital", "orchestr", "orgie", "orlice", "orloj", "ortel", "osada", "oschnout", "osika", "osivo", "oslava", "oslepit", "oslnit", "oslovit", "osnova", "osoba", "osolit", "ospalec", "osten", "ostraha", "ostuda", "ostych", "osvojit", "oteplit", "otisk", "otop", "otrhat", "otrlost", "otrok", "otruby", "otvor", "ovanout", "ovar", "oves", "ovlivnit", "ovoce", "oxid", "ozdoba", "pachatel", "pacient", "padouch", "pahorek", "pakt", "palanda", "palec", "palivo", "paluba", "pamflet", "pamlsek", "panenka", "panika", "panna", "panovat", "panstvo", "pantofle", "paprika", "parketa", "parodie", "parta", "paruka", "paryba", "paseka", "pasivita", "pastelka", "patent", "patrona", "pavouk", "pazneht", "pazourek", "pecka", "pedagog", "pejsek", "peklo", "peloton", "penalta", "pendrek", "penze", "periskop", "pero", "pestrost", "petarda", "petice", "petrolej", "pevnina", "pexeso", "pianista", "piha", "pijavice", "pikle", "piknik", "pilina", "pilnost", "pilulka", "pinzeta", "pipeta", "pisatel", "pistole", "pitevna", "pivnice", "pivovar", "placenta", "plakat", "plamen", "planeta", "plastika", "platit", "plavidlo", "plaz", "plech", "plemeno", "plenta", "ples", "pletivo", "plevel", "plivat", "plnit", "plno", "plocha", "plodina", "plomba", "plout", "pluk", "plyn", "pobavit", "pobyt", "pochod", "pocit", "poctivec", "podat", "podcenit", "podepsat", "podhled", "podivit", "podklad", "podmanit", "podnik", "podoba", "podpora", "podraz", "podstata", "podvod", "podzim", "poezie", "pohanka", "pohnutka", "pohovor", "pohroma", "pohyb", "pointa", "pojistka", "pojmout", "pokazit", "pokles", "pokoj", "pokrok", "pokuta", "pokyn", "poledne", "polibek", "polknout", "poloha", "polynom", "pomalu", "pominout", "pomlka", "pomoc", "pomsta", "pomyslet", "ponechat", "ponorka", "ponurost", "popadat", "popel", "popisek", "poplach", "poprosit", "popsat", "popud", "poradce", "porce", "porod", "porucha", "poryv", "posadit", "posed", "posila", "poskok", "poslanec", "posoudit", "pospolu", "postava", "posudek", "posyp", "potah", "potkan", "potlesk", "potomek", "potrava", "potupa", "potvora", "poukaz", "pouto", "pouzdro", "povaha", "povidla", "povlak", "povoz", "povrch", "povstat", "povyk", "povzdech", "pozdrav", "pozemek", "poznatek", "pozor", "pozvat", "pracovat", "prahory", "praktika", "prales", "praotec", "praporek", "prase", "pravda", "princip", "prkno", "probudit", "procento", "prodej", "profese", "prohra", "projekt", "prolomit", "promile", "pronikat", "propad", "prorok", "prosba", "proton", "proutek", "provaz", "prskavka", "prsten", "prudkost", "prut", "prvek", "prvohory", "psanec", "psovod", "pstruh", "ptactvo", "puberta", "puch", "pudl", "pukavec", "puklina", "pukrle", "pult", "pumpa", "punc", "pupen", "pusa", "pusinka", "pustina", "putovat", "putyka", "pyramida", "pysk", "pytel", "racek", "rachot", "radiace", "radnice", "radon", "raft", "ragby", "raketa", "rakovina", "rameno", "rampouch", "rande", "rarach", "rarita", "rasovna", "rastr", "ratolest", "razance", "razidlo", "reagovat", "reakce", "recept", "redaktor", "referent", "reflex", "rejnok", "reklama", "rekord", "rekrut", "rektor", "reputace", "revize", "revma", "revolver", "rezerva", "riskovat", "riziko", "robotika", "rodokmen", "rohovka", "rokle", "rokoko", "romaneto", "ropovod", "ropucha", "rorejs", "rosol", "rostlina", "rotmistr", "rotoped", "rotunda", "roubenka", "roucho", "roup", "roura", "rovina", "rovnice", "rozbor", "rozchod", "rozdat", "rozeznat", "rozhodce", "rozinka", "rozjezd", "rozkaz", "rozloha", "rozmar", "rozpad", "rozruch", "rozsah", "roztok", "rozum", "rozvod", "rubrika", "ruchadlo", "rukavice", "rukopis", "ryba", "rybolov", "rychlost", "rydlo", "rypadlo", "rytina", "ryzost", "sadista", "sahat", "sako", "samec", "samizdat", "samota", "sanitka", "sardinka", "sasanka", "satelit", "sazba", "sazenice", "sbor", "schovat", "sebranka", "secese", "sedadlo", "sediment", "sedlo", "sehnat", "sejmout", "sekera", "sekta", "sekunda", "sekvoje", "semeno", "seno", "servis", "sesadit", "seshora", "seskok", "seslat", "sestra", "sesuv", "sesypat", "setba", "setina", "setkat", "setnout", "setrvat", "sever", "seznam", "shoda", "shrnout", "sifon", "silnice", "sirka", "sirotek", "sirup", "situace", "skafandr", "skalisko", "skanzen", "skaut", "skeptik", "skica", "skladba", "sklenice", "sklo", "skluz", "skoba", "skokan", "skoro", "skripta", "skrz", "skupina", "skvost", "skvrna", "slabika", "sladidlo", "slanina", "slast", "slavnost", "sledovat", "slepec", "sleva", "slezina", "slib", "slina", "sliznice", "slon", "sloupek", "slovo", "sluch", "sluha", "slunce", "slupka", "slza", "smaragd", "smetana", "smilstvo", "smlouva", "smog", "smrad", "smrk", "smrtka", "smutek", "smysl", "snad", "snaha", "snob", "sobota", "socha", "sodovka", "sokol", "sopka", "sotva", "souboj", "soucit", "soudce", "souhlas", "soulad", "soumrak", "souprava", "soused", "soutok", "souviset", "spalovna", "spasitel", "spis", "splav", "spodek", "spojenec", "spolu", "sponzor", "spornost", "spousta", "sprcha", "spustit", "sranda", "sraz", "srdce", "srna", "srnec", "srovnat", "srpen", "srst", "srub", "stanice", "starosta", "statika", "stavba", "stehno", "stezka", "stodola", "stolek", "stopa", "storno", "stoupat", "strach", "stres", "strhnout", "strom", "struna", "studna", "stupnice", "stvol", "styk", "subjekt", "subtropy", "suchar", "sudost", "sukno", "sundat", "sunout", "surikata", "surovina", "svah", "svalstvo", "svetr", "svatba", "svazek", "svisle", "svitek", "svoboda", "svodidlo", "svorka", "svrab", "sykavka", "sykot", "synek", "synovec", "sypat", "sypkost", "syrovost", "sysel", "sytost", "tabletka", "tabule", "tahoun", "tajemno", "tajfun", "tajga", "tajit", "tajnost", "taktika", "tamhle", "tampon", "tancovat", "tanec", "tanker", "tapeta", "tavenina", "tazatel", "technika", "tehdy", "tekutina", "telefon", "temnota", "tendence", "tenista", "tenor", "teplota", "tepna", "teprve", "terapie", "termoska", "textil", "ticho", "tiskopis", "titulek", "tkadlec", "tkanina", "tlapka", "tleskat", "tlukot", "tlupa", "tmel", "toaleta", "topinka", "topol", "torzo", "touha", "toulec", "tradice", "traktor", "tramp", "trasa", "traverza", "trefit", "trest", "trezor", "trhavina", "trhlina", "trochu", "trojice", "troska", "trouba", "trpce", "trpitel", "trpkost", "trubec", "truchlit", "truhlice", "trus", "trvat", "tudy", "tuhnout", "tuhost", "tundra", "turista", "turnaj", "tuzemsko", "tvaroh", "tvorba", "tvrdost", "tvrz", "tygr", "tykev", "ubohost", "uboze", "ubrat", "ubrousek", "ubrus", "ubytovna", "ucho", "uctivost", "udivit", "uhradit", "ujednat", "ujistit", "ujmout", "ukazatel", "uklidnit", "uklonit", "ukotvit", "ukrojit", "ulice", "ulita", "ulovit", "umyvadlo", "unavit", "uniforma", "uniknout", "upadnout", "uplatnit", "uplynout", "upoutat", "upravit", "uran", "urazit", "usednout", "usilovat", "usmrtit", "usnadnit", "usnout", "usoudit", "ustlat", "ustrnout", "utahovat", "utkat", "utlumit", "utonout", "utopenec", "utrousit", "uvalit", "uvolnit", "uvozovka", "uzdravit", "uzel", "uzenina", "uzlina", "uznat", "vagon", "valcha", "valoun", "vana", "vandal", "vanilka", "varan", "varhany", "varovat", "vcelku", "vchod", "vdova", "vedro", "vegetace", "vejce", "velbloud", "veletrh", "velitel", "velmoc", "velryba", "venkov", "veranda", "verze", "veselka", "veskrze", "vesnice", "vespodu", "vesta", "veterina", "veverka", "vibrace", "vichr", "videohra", "vidina", "vidle", "vila", "vinice", "viset", "vitalita", "vize", "vizitka", "vjezd", "vklad", "vkus", "vlajka", "vlak", "vlasec", "vlevo", "vlhkost", "vliv", "vlnovka", "vloupat", "vnucovat", "vnuk", "voda", "vodivost", "vodoznak", "vodstvo", "vojensky", "vojna", "vojsko", "volant", "volba", "volit", "volno", "voskovka", "vozidlo", "vozovna", "vpravo", "vrabec", "vracet", "vrah", "vrata", "vrba", "vrcholek", "vrhat", "vrstva", "vrtule", "vsadit", "vstoupit", "vstup", "vtip", "vybavit", "vybrat", "vychovat", "vydat", "vydra", "vyfotit", "vyhledat", "vyhnout", "vyhodit", "vyhradit", "vyhubit", "vyjasnit", "vyjet", "vyjmout", "vyklopit", "vykonat", "vylekat", "vymazat", "vymezit", "vymizet", "vymyslet", "vynechat", "vynikat", "vynutit", "vypadat", "vyplatit", "vypravit", "vypustit", "vyrazit", "vyrovnat", "vyrvat", "vyslovit", "vysoko", "vystavit", "vysunout", "vysypat", "vytasit", "vytesat", "vytratit", "vyvinout", "vyvolat", "vyvrhel", "vyzdobit", "vyznat", "vzadu", "vzbudit", "vzchopit", "vzdor", "vzduch", "vzdychat", "vzestup", "vzhledem", "vzkaz", "vzlykat", "vznik", "vzorek", "vzpoura", "vztah", "vztek", "xylofon", "zabrat", "zabydlet", "zachovat", "zadarmo", "zadusit", "zafoukat", "zahltit", "zahodit", "zahrada", "zahynout", "zajatec", "zajet", "zajistit", "zaklepat", "zakoupit", "zalepit", "zamezit", "zamotat", "zamyslet", "zanechat", "zanikat", "zaplatit", "zapojit", "zapsat", "zarazit", "zastavit", "zasunout", "zatajit", "zatemnit", "zatknout", "zaujmout", "zavalit", "zavelet", "zavinit", "zavolat", "zavrtat", "zazvonit", "zbavit", "zbrusu", "zbudovat", "zbytek", "zdaleka", "zdarma", "zdatnost", "zdivo", "zdobit", "zdroj", "zdvih", "zdymadlo", "zelenina", "zeman", "zemina", "zeptat", "zezadu", "zezdola", "zhatit", "zhltnout", "zhluboka", "zhotovit", "zhruba", "zima", "zimnice", "zjemnit", "zklamat", "zkoumat", "zkratka", "zkumavka", "zlato", "zlehka", "zloba", "zlom", "zlost", "zlozvyk", "zmapovat", "zmar", "zmatek", "zmije", "zmizet", "zmocnit", "zmodrat", "zmrzlina", "zmutovat", "znak", "znalost", "znamenat", "znovu", "zobrazit", "zotavit", "zoubek", "zoufale", "zplodit", "zpomalit", "zprava", "zprostit", "zprudka", "zprvu", "zrada", "zranit", "zrcadlo", "zrnitost", "zrno", "zrovna", "zrychlit", "zrzavost", "zticha", "ztratit", "zubovina", "zubr", "zvednout", "zvenku", "zvesela", "zvon", "zvrat", "zvukovod", "zvyk"];
}
});
// node_modules/bip39-mnemonic/wordlist/english.json
var require_english = __commonJS({
"node_modules/bip39-mnemonic/wordlist/english.json"(exports2, module2) {
module2.exports = ["abandon", "ability", "able", "about", "above", "absent", "absorb", "abstract", "absurd", "abuse", "access", "accident", "account", "accuse", "achieve", "acid", "acoustic", "acquire", "across", "act", "action", "actor", "actress", "actual", "adapt", "add", "addict", "address", "adjust", "admit", "adult", "advance", "advice", "aerobic", "affair", "afford", "afraid", "again", "age", "agent", "agree", "ahead", "aim", "air", "airport", "aisle", "alarm", "album", "alcohol", "alert", "alien", "all", "alley", "allow", "almost", "alone", "alpha", "already", "also", "alter", "always", "amateur", "amazing", "among", "amount", "amused", "analyst", "anchor", "ancient", "anger", "angle", "angry", "animal", "ankle", "announce", "annual", "another", "answer", "antenna", "antique", "anxiety", "any", "apart", "apology", "appear", "apple", "approve", "april", "arch", "arctic", "area", "arena", "argue", "arm", "armed", "armor", "army", "around", "arrange", "arrest", "arrive", "arrow", "art", "artefact", "artist", "artwork", "ask", "aspect", "assault", "asset", "assist", "assume", "asthma", "athlete", "atom", "attack", "attend", "attitude", "attract", "auction", "audit", "august", "aunt", "author", "auto", "autumn", "average", "avocado", "avoid", "awake", "aware", "away", "awesome", "awful", "awkward", "axis", "baby", "bachelor", "bacon", "badge", "bag", "balance", "balcony", "ball", "bamboo", "banana", "banner", "bar", "barely", "bargain", "barrel", "base", "basic", "basket", "battle", "beach", "bean", "beauty", "because", "become", "beef", "before", "begin", "behave", "behind", "believe", "below", "belt", "bench", "benefit", "best", "betray", "better", "between", "beyond", "bicycle", "bid", "bike", "bind", "biology", "bird", "birth", "bitter", "black", "blade", "blame", "blanket", "blast", "bleak", "bless", "blind", "blood", "blossom", "blouse", "blue", "blur", "blush", "board", "boat", "body", "boil", "bomb", "bone", "bonus", "book", "boost", "border", "boring", "borrow", "boss", "bottom", "bounce", "box", "boy", "bracket", "brain", "brand", "brass", "brave", "bread", "breeze", "brick", "bridge", "brief", "bright", "bring", "brisk", "broccoli", "broken", "bronze", "broom", "brother", "brown", "brush", "bubble", "buddy", "budget", "buffalo", "build", "bulb", "bulk", "bullet", "bundle", "bunker", "burden", "burger", "burst", "bus", "business", "busy", "butter", "buyer", "buzz", "cabbage", "cabin", "cable", "cactus", "cage", "cake", "call", "calm", "camera", "camp", "can", "canal", "cancel", "candy", "cannon", "canoe", "canvas", "canyon", "capable", "capital", "captain", "car", "carbon", "card", "cargo", "carpet", "carry", "cart", "case", "cash", "casino", "castle", "casual", "cat", "catalog", "catch", "category", "cattle", "caught", "cause", "caution", "cave", "ceiling", "celery", "cement", "census", "century", "cereal", "certain", "chair", "chalk", "champion", "change", "chaos", "chapter", "charge", "chase", "chat", "cheap", "check", "cheese", "chef", "cherry", "chest", "chicken", "chief", "child", "chimney", "choice", "choose", "chronic", "chuckle", "chunk", "churn", "cigar", "cinnamon", "circle", "citizen", "city", "civil", "claim", "clap", "clarify", "claw", "clay", "clean", "clerk", "clever", "click", "client", "cliff", "climb", "clinic", "clip", "clock", "clog", "close", "cloth", "cloud", "clown", "club", "clump", "cluster", "clutch", "coach", "coast", "coconut", "code", "coffee", "coil", "coin", "collect", "color", "column", "combine", "come", "comfort", "comic", "common", "company", "concert", "conduct", "confirm", "congress", "connect", "consider", "control", "convince", "cook", "cool", "copper", "copy", "coral", "core", "corn", "correct", "cost", "cotton", "couch", "country", "couple", "course", "cousin", "cover", "coyote", "crack", "cradle", "craft", "cram", "crane", "crash", "crater", "crawl", "crazy", "cream", "credit", "creek", "crew", "cricket", "crime", "crisp", "critic", "crop", "cross", "crouch", "crowd", "crucial", "cruel", "cruise", "crumble", "crunch", "crush", "cry", "crystal", "cube", "culture", "cup", "cupboard", "curious", "current", "curtain", "curve", "cushion", "custom", "cute", "cycle", "dad", "damage", "damp", "dance", "danger", "daring", "dash", "daughter", "dawn", "day", "deal", "debate", "debris", "decade", "december", "decide", "decline", "decorate", "decrease", "deer", "defense", "define", "defy", "degree", "delay", "deliver", "demand", "demise", "denial", "dentist", "deny", "depart", "depend", "deposit", "depth", "deputy", "derive", "describe", "desert", "design", "desk", "despair", "destroy", "detail", "detect", "develop", "device", "devote", "diagram", "dial", "diamond", "diary", "dice", "diesel", "diet", "differ", "digital", "dignity", "dilemma", "dinner", "dinosaur", "direct", "dirt", "disagree", "discover", "disease", "dish", "dismiss", "disorder", "display", "distance", "divert", "divide", "divorce", "dizzy", "doctor", "document", "dog", "doll", "dolphin", "domain", "donate", "donkey", "donor", "door", "dose", "double", "dove", "draft", "dragon", "drama", "drastic", "draw", "dream", "dress", "drift", "drill", "drink", "drip", "drive", "drop", "drum", "dry", "duck", "dumb", "dune", "during", "dust", "dutch", "duty", "dwarf", "dynamic", "eager", "eagle", "early", "earn", "earth", "easily", "east", "easy", "echo", "ecology", "economy", "edge", "edit", "educate", "effort", "egg", "eight", "either", "elbow", "elder", "electric", "elegant", "element", "elephant", "elevator", "elite", "else", "embark", "embody", "embrace", "emerge", "emotion", "employ", "empower", "empty", "enable", "enact", "end", "endless", "endorse", "enemy", "energy", "enforce", "engage", "engine", "enhance", "enjoy", "enlist", "enough", "enrich", "enroll", "ensure", "enter", "entire", "entry", "envelope", "episode", "equal", "equip", "era", "erase", "erode", "erosion", "error", "erupt", "escape", "essay", "essence", "estate", "eternal", "ethics", "evidence", "evil", "evoke", "evolve", "exact", "example", "excess", "exchange", "excite", "exclude", "excuse", "execute", "exercise", "exhaust", "exhibit", "exile", "exist", "exit", "exotic", "expand", "expect", "expire", "explain", "expose", "express", "extend", "extra", "eye", "eyebrow", "fabric", "face", "faculty", "fade", "faint", "faith", "fall", "false", "fame", "family", "famous", "fan", "fancy", "fantasy", "farm", "fashion", "fat", "fatal", "father", "fatigue", "fault", "favorite", "feature", "february", "federal", "fee", "feed", "feel", "female", "fence", "festival", "fetch", "fever", "few", "fiber", "fiction", "field", "figure", "file", "film", "filter", "final", "find", "fine", "finger", "finish", "fire", "firm", "first", "fiscal", "fish", "fit", "fitness", "fix", "flag", "flame", "flash", "flat", "flavor", "flee", "flight", "flip", "float", "flock", "floor", "flower", "fluid", "flush", "fly", "foam", "focus", "fog", "foil", "fold", "follow", "food", "foot", "force", "forest", "forget", "fork", "fortune", "forum", "forward", "fossil", "foster", "found", "fox", "fragile", "frame", "frequent", "fresh", "friend", "fringe", "frog", "front", "frost", "frown", "frozen", "fruit", "fuel", "fun", "funny", "furnace", "fury", "future", "gadget", "gain", "galaxy", "gallery", "game", "gap", "garage", "garbage", "garden", "garlic", "garment", "gas", "gasp", "gate", "gather", "gauge", "gaze", "general", "genius", "genre", "gentle", "genuine", "gesture", "ghost", "giant", "gift", "giggle", "ginger", "giraffe", "girl", "give", "glad", "glance", "glare", "glass", "glide", "glimpse", "globe", "gloom", "glory", "glove", "glow", "glue", "goat", "goddess", "gold", "good", "goose", "gorilla", "gospel", "gossip", "govern", "gown", "grab", "grace", "grain", "grant", "grape", "grass", "gravity", "great", "green", "grid", "grief", "grit", "grocery", "group", "grow", "grunt", "guard", "guess", "guide", "guilt", "guitar", "gun", "gym", "habit", "hair", "half", "hammer", "hamster", "hand", "happy", "harbor", "hard", "harsh", "harvest", "hat", "have", "hawk", "hazard", "head", "health", "heart", "heavy", "hedgehog", "height", "hello", "helmet", "help", "hen", "hero", "hidden", "high", "hill", "hint", "hip", "hire", "history", "hobby", "hockey", "hold", "hole", "holiday", "hollow", "home", "honey", "hood", "hope", "horn", "horror", "horse", "hospital", "host", "hotel", "hour", "hover", "hub", "huge", "human", "humble", "humor", "hundred", "hungry", "hunt", "hurdle", "hurry", "hurt", "husband", "hybrid", "ice", "icon", "idea", "identify", "idle", "ignore", "ill", "illegal", "illness", "image", "imitate", "immense", "immune", "impact", "impose", "improve", "impulse", "inch", "include", "income", "increase", "index", "indicate", "indoor", "industry", "infant", "inflict", "inform", "inhale", "inherit", "initial", "inject", "injury", "inmate", "inner", "innocent", "input", "inquiry", "insane", "insect", "inside", "inspire", "install", "intact", "interest", "into", "invest", "invite", "involve", "iron", "island", "isolate", "issue", "item", "ivory", "jacket", "jaguar", "jar", "jazz", "jealous", "jeans", "jelly", "jewel", "job", "join", "joke", "journey", "joy", "judge", "juice", "jump", "jungle", "junior", "junk", "just", "kangaroo", "keen", "keep", "ketchup", "key", "kick", "kid", "kidney", "kind", "kingdom", "kiss", "kit", "kitchen", "kite", "kitten", "kiwi", "knee", "knife", "knock", "know", "lab", "label", "labor", "ladder", "lady", "lake", "lamp", "language", "laptop", "large", "later", "latin", "laugh", "laundry", "lava", "law", "lawn", "lawsuit", "layer", "lazy", "leader", "leaf", "learn", "leave", "lecture", "left", "leg", "legal", "legend", "leisure", "lemon", "lend", "length", "lens", "leopard", "lesson", "letter", "level", "liar", "liberty", "library", "license", "life", "lift", "light", "like", "limb", "limit", "link", "lion", "liquid", "list", "little", "live", "lizard", "load", "loan", "lobster", "local", "lock", "logic", "lonely", "long", "loop", "lottery", "loud", "lounge", "love", "loyal", "lucky", "luggage", "lumber", "lunar", "lunch", "luxury", "lyrics", "machine", "mad", "magic", "magnet", "maid", "mail", "main", "major", "make", "mammal", "man", "manage", "mandate", "mango", "mansion", "manual", "maple", "marble", "march", "margin", "marine", "market", "marriage", "mask", "mass", "master", "match", "material", "math", "matrix", "matter", "maximum", "maze", "meadow", "mean", "measure", "meat", "mechanic", "medal", "media", "melody", "melt", "member", "memory", "mention", "menu", "mercy", "merge", "merit", "merry", "mesh", "message", "metal", "method", "middle", "midnight", "milk", "million", "mimic", "mind", "minimum", "minor", "minute", "miracle", "mirror", "misery", "miss", "mistake", "mix", "mixed", "mixture", "mobile", "model", "modify", "mom", "moment", "monitor", "monkey", "monster", "month", "moon", "moral", "more", "morning", "mosquito", "mother", "motion", "motor", "mountain", "mouse", "move", "movie", "much", "muffin", "mule", "multiply", "muscle", "museum", "mushroom", "music", "must", "mutual", "myself", "mystery", "myth", "naive", "name", "napkin", "narrow", "nasty", "nation", "nature", "near", "neck", "need", "negative", "neglect", "neither", "nephew", "nerve", "nest", "net", "network", "neutral", "never", "news", "next", "nice", "night", "noble", "noise", "nominee", "noodle", "normal", "north", "nose", "notable", "note", "nothing", "notice", "novel", "now", "nuclear", "number", "nurse", "nut", "oak", "obey", "object", "oblige", "obscure", "observe", "obtain", "obvious", "occur", "ocean", "october", "odor", "off", "offer", "office", "often", "oil", "okay", "old", "olive", "olympic", "omit", "once", "one", "onion", "online", "only", "open", "opera", "opinion", "oppose", "option", "orange", "orbit", "orchard", "order", "ordinary", "organ", "orient", "original", "orphan", "ostrich", "other", "outdoor", "outer", "output", "outside", "oval", "oven", "over", "own", "owner", "oxygen", "oyster", "ozone", "pact", "paddle", "page", "pair", "palace", "palm", "panda", "panel", "panic", "panther", "paper", "parade", "parent", "park", "parrot", "party", "pass", "patch", "path", "patient", "patrol", "pattern", "pause", "pave", "payment", "peace", "peanut", "pear", "peasant", "pelican", "pen", "penalty", "pencil", "people", "pepper", "perfect", "permit", "person", "pet", "phone", "photo", "phrase", "physical", "piano", "picnic", "picture", "piece", "pig", "pigeon", "pill", "pilot", "pink", "pioneer", "pipe", "pistol", "pitch", "pizza", "place", "planet", "plastic", "plate", "play", "please", "pledge", "pluck", "plug", "plunge", "poem", "poet", "point", "polar", "pole", "police", "pond", "pony", "pool", "popular", "portion", "position", "possible", "post", "potato", "pottery", "poverty", "powder", "power", "practice", "praise", "predict", "prefer", "prepare", "present", "pretty", "prevent", "price", "pride", "primary", "print", "priority", "prison", "private", "prize", "problem", "process", "produce", "profit", "program", "project", "promote", "proof", "property", "prosper", "protect", "proud", "provide", "public", "pudding", "pull", "pulp", "pulse", "pumpkin", "punch", "pupil", "puppy", "purchase", "purity", "purpose", "purse", "push", "put", "puzzle", "pyramid", "quality", "quantum", "quarter", "question", "quick", "quit", "quiz", "quote", "rabbit", "raccoon", "race", "rack", "radar", "radio", "rail", "rain", "raise", "rally", "ramp", "ranch", "random", "range", "rapid", "rare", "rate", "rather", "raven", "raw", "razor", "ready", "real", "reason", "rebel", "rebuild", "recall", "receive", "recipe", "record", "recycle", "reduce", "reflect", "reform", "refuse", "region", "regret", "regular", "reject", "relax", "release", "relief", "rely", "remain", "remember", "remind", "remove", "render", "renew", "rent", "reopen", "repair", "repeat", "replace", "report", "require", "rescue", "resemble", "resist", "resource", "response", "result", "retire", "retreat", "return", "reunion", "reveal", "review", "reward", "rhythm", "rib", "ribbon", "rice", "rich", "ride", "ridge", "rifle", "right", "rigid", "ring", "riot", "ripple", "risk", "ritual", "rival", "river", "road", "roast", "robot", "robust", "rocket", "romance", "roof", "rookie", "room", "rose", "rotate", "rough", "round", "route", "royal", "rubber", "rude", "rug", "rule", "run", "runway", "rural", "sad", "saddle", "sadness", "safe", "sail", "salad", "salmon", "salon", "salt", "salute", "same", "sample", "sand", "satisfy", "satoshi", "sauce", "sausage", "save", "say", "scale", "scan", "scare", "scatter", "scene", "scheme", "school", "science", "scissors", "scorpion", "scout", "scrap", "screen", "script", "scrub", "sea", "search", "season", "seat", "second", "secret", "section", "security", "seed", "seek", "segment", "select", "sell", "seminar", "senior", "sense", "sentence", "series", "service", "session", "settle", "setup", "seven", "shadow", "shaft", "shallow", "share", "shed", "shell", "sheriff", "shield", "shift", "shine", "ship", "shiver", "shock", "shoe", "shoot", "shop", "short", "shoulder", "shove", "shrimp", "shrug", "shuffle", "shy", "sibling", "sick", "side", "siege", "sight", "sign", "silent", "silk", "silly", "silver", "similar", "simple", "since", "sing", "siren", "sister", "situate", "six", "size", "skate", "sketch", "ski", "skill", "skin", "skirt", "skull", "slab", "slam", "sleep", "slender", "slice", "slide", "slight", "slim", "slogan", "slot", "slow", "slush", "small", "smart", "smile", "smoke", "smooth", "snack", "snake", "snap", "sniff", "snow", "soap", "soccer", "social", "sock", "soda", "soft", "solar", "soldier", "solid", "solution", "solve", "someone", "song", "soon", "sorry", "sort", "soul", "sound", "soup", "source", "south", "space", "spare", "spatial", "spawn", "speak", "special", "speed", "spell", "spend", "sphere", "spice", "spider", "spike", "spin", "spirit", "split", "spoil", "sponsor", "spoon", "sport", "spot", "spray", "spread", "spring", "spy", "square", "squeeze", "squirrel", "stable", "stadium", "staff", "stage", "stairs", "stamp", "stand", "start", "state", "stay", "steak", "steel", "stem", "step", "stereo", "stick", "still", "sting", "stock", "stomach", "stone", "stool", "story", "stove", "strategy", "street", "strike", "strong", "struggle", "student", "stuff", "stumble", "style", "subject", "submit", "subway", "success", "such", "sudden", "suffer", "sugar", "suggest", "suit", "summer", "sun", "sunny", "sunset", "super", "supply", "supreme", "sure", "surface", "surge", "surprise", "surround", "survey", "suspect", "sustain", "swallow", "swamp", "swap", "swarm", "swear", "sweet", "swift", "swim", "swing", "switch", "sword", "symbol", "symptom", "syrup", "system", "table", "tackle", "tag", "tail", "talent", "talk", "tank", "tape", "target", "task", "taste", "tattoo", "taxi", "teach", "team", "tell", "ten", "tenant", "tennis", "tent", "term", "test", "text", "thank", "that", "theme", "then", "theory", "there", "they", "thing", "this", "thought", "three", "thrive", "throw", "thumb", "thunder", "ticket", "tide", "tiger", "tilt", "timber", "time", "tiny", "tip", "tired", "tissue", "title", "toast", "tobacco", "today", "toddler", "toe", "together", "toilet", "token", "tomato", "tomorrow", "tone", "tongue", "tonight", "tool", "tooth", "top", "topic", "topple", "torch", "tornado", "tortoise", "toss", "total", "tourist", "toward", "tower", "town", "toy", "track", "trade", "traffic", "tragic", "train", "transfer", "trap", "trash", "travel", "tray", "treat", "tree", "trend", "trial", "tribe", "trick", "trigger", "trim", "trip", "trophy", "trouble", "truck", "true", "truly", "trumpet", "trust", "truth", "try", "tube", "tuition", "tumble", "tuna", "tunnel", "turkey", "turn", "turtle", "twelve", "twenty", "twice", "twin", "twist", "two", "type", "typical", "ugly", "umbrella", "unable", "unaware", "uncle", "uncover", "under", "undo", "unfair", "unfold", "unhappy", "uniform", "unique", "unit", "universe", "unknown", "unlock", "until", "unusual", "unveil", "update", "upgrade", "uphold", "upon", "upper", "upset", "urban", "urge", "usage", "use", "used", "useful", "useless", "usual", "utility", "vacant", "vacuum", "vague", "valid", "valley", "valve", "van", "vanish", "vapor", "various", "vast", "vault", "vehicle", "velvet", "vendor", "venture", "venue", "verb", "verify", "version", "very", "vessel", "veteran", "viable", "vibrant", "vicious", "victory", "video", "view", "village", "vintage", "violin", "virtual", "virus", "visa", "visit", "visual", "vital", "vivid", "vocal", "voice", "void", "volcano", "volume", "vote", "voyage", "wage", "wagon", "wait", "walk", "wall", "walnut", "want", "warfare", "warm", "warrior", "wash", "wasp", "waste", "water", "wave", "way", "wealth", "weapon", "wear", "weasel", "weather", "web", "wedding", "weekend", "weird", "welcome", "west", "wet", "whale", "what", "wheat", "wheel", "when", "where", "whip", "whisper", "wide", "width", "wife", "wild", "will", "win", "window", "wine", "wing", "wink", "winner", "winter", "wire", "wisdom", "wise", "wish", "witness", "wolf", "woman", "wonder", "wood", "wool", "word", "work", "world", "worry", "worth", "wrap", "wreck", "wrestle", "wrist", "write", "wrong", "yard", "year", "yellow", "you", "young", "youth", "zebra", "zero", "zone", "zoo"];
}
});
// node_modules/bip39-mnemonic/wordlist/french.json
var require_french = __commonJS({
"node_modules/bip39-mnemonic/wordlist/french.json"(exports2, module2) {
module2.exports = ["abaisser", "abandon", "abdiquer", "abeille", "abolir", "aborder", "aboutir", "aboyer", "abrasif", "abreuver", "abriter", "abroger", "abrupt", "absence", "absolu", "absurde", "abusif", "abyssal", "acade\u0301mie", "acajou", "acarien", "accabler", "accepter", "acclamer", "accolade", "accroche", "accuser", "acerbe", "achat", "acheter", "aciduler", "acier", "acompte", "acque\u0301rir", "acronyme", "acteur", "actif", "actuel", "adepte", "ade\u0301quat", "adhe\u0301sif", "adjectif", "adjuger", "admettre", "admirer", "adopter", "adorer", "adoucir", "adresse", "adroit", "adulte", "adverbe", "ae\u0301rer", "ae\u0301ronef", "affaire", "affecter", "affiche", "affreux", "affubler", "agacer", "agencer", "agile", "agiter", "agrafer", "agre\u0301able", "agrume", "aider", "aiguille", "ailier", "aimable", "aisance", "ajouter", "ajuster", "alarmer", "alchimie", "alerte", "alge\u0300bre", "algue", "alie\u0301ner", "aliment", "alle\u0301ger", "alliage", "allouer", "allumer", "alourdir", "alpaga", "altesse", "alve\u0301ole", "amateur", "ambigu", "ambre", "ame\u0301nager", "amertume", "amidon", "amiral", "amorcer", "amour", "amovible", "amphibie", "ampleur", "amusant", "analyse", "anaphore", "anarchie", "anatomie", "ancien", "ane\u0301antir", "angle", "angoisse", "anguleux", "animal", "annexer", "annonce", "annuel", "anodin", "anomalie", "anonyme", "anormal", "antenne", "antidote", "anxieux", "apaiser", "ape\u0301ritif", "aplanir", "apologie", "appareil", "appeler", "apporter", "appuyer", "aquarium", "aqueduc", "arbitre", "arbuste", "ardeur", "ardoise", "argent", "arlequin", "armature", "armement", "armoire", "armure", "arpenter", "arracher", "arriver", "arroser", "arsenic", "arte\u0301riel", "article", "aspect", "asphalte", "aspirer", "assaut", "asservir", "assiette", "associer", "assurer", "asticot", "astre", "astuce", "atelier", "atome", "atrium", "atroce", "attaque", "attentif", "attirer", "attraper", "aubaine", "auberge", "audace", "audible", "augurer", "aurore", "automne", "autruche", "avaler", "avancer", "avarice", "avenir", "averse", "aveugle", "aviateur", "avide", "avion", "aviser", "avoine", "avouer", "avril", "axial", "axiome", "badge", "bafouer", "bagage", "baguette", "baignade", "balancer", "balcon", "baleine", "balisage", "bambin", "bancaire", "bandage", "banlieue", "bannie\u0300re", "banquier", "barbier", "baril", "baron", "barque", "barrage", "bassin", "bastion", "bataille", "bateau", "batterie", "baudrier", "bavarder", "belette", "be\u0301lier", "belote", "be\u0301ne\u0301fice", "berceau", "berger", "berline", "bermuda", "besace", "besogne", "be\u0301tail", "beurre", "biberon", "bicycle", "bidule", "bijou", "bilan", "bilingue", "billard", "binaire", "biologie", "biopsie", "biotype", "biscuit", "bison", "bistouri", "bitume", "bizarre", "blafard", "blague", "blanchir", "blessant", "blinder", "blond", "bloquer", "blouson", "bobard", "bobine", "boire", "boiser", "bolide", "bonbon", "bondir", "bonheur", "bonifier", "bonus", "bordure", "borne", "botte", "boucle", "boueux", "bougie", "boulon", "bouquin", "bourse", "boussole", "boutique", "boxeur", "branche", "brasier", "brave", "brebis", "bre\u0300che", "breuvage", "bricoler", "brigade", "brillant", "brioche", "brique", "brochure", "broder", "bronzer", "brousse", "broyeur", "brume", "brusque", "brutal", "bruyant", "buffle", "buisson", "bulletin", "bureau", "burin", "bustier", "butiner", "butoir", "buvable", "buvette", "cabanon", "cabine", "cachette", "cadeau", "cadre", "cafe\u0301ine", "caillou", "caisson", "calculer", "calepin", "calibre", "calmer", "calomnie", "calvaire", "camarade", "came\u0301ra", "camion", "campagne", "canal", "caneton", "canon", "cantine", "canular", "capable", "caporal", "caprice", "capsule", "capter", "capuche", "carabine", "carbone", "caresser", "caribou", "carnage", "carotte", "carreau", "carton", "cascade", "casier", "casque", "cassure", "causer", "caution", "cavalier", "caverne", "caviar", "ce\u0301dille", "ceinture", "ce\u0301leste", "cellule", "cendrier", "censurer", "central", "cercle", "ce\u0301re\u0301bral", "cerise", "cerner", "cerveau", "cesser", "chagrin", "chaise", "chaleur", "chambre", "chance", "chapitre", "charbon", "chasseur", "chaton", "chausson", "chavirer", "chemise", "chenille", "che\u0301quier", "chercher", "cheval", "chien", "chiffre", "chignon", "chime\u0300re", "chiot", "chlorure", "chocolat", "choisir", "chose", "chouette", "chrome", "chute", "cigare", "cigogne", "cimenter", "cine\u0301ma", "cintrer", "circuler", "cirer", "cirque", "citerne", "citoyen", "citron", "civil", "clairon", "clameur", "claquer", "classe", "clavier", "client", "cligner", "climat", "clivage", "cloche", "clonage", "cloporte", "cobalt", "cobra", "cocasse", "cocotier", "coder", "codifier", "coffre", "cogner", "cohe\u0301sion", "coiffer", "coincer", "cole\u0300re", "colibri", "colline", "colmater", "colonel", "combat", "come\u0301die", "commande", "compact", "concert", "conduire", "confier", "congeler", "connoter", "consonne", "contact", "convexe", "copain", "copie", "corail", "corbeau", "cordage", "corniche", "corpus", "correct", "corte\u0300ge", "cosmique", "costume", "coton", "coude", "coupure", "courage", "couteau", "couvrir", "coyote", "crabe", "crainte", "cravate", "crayon", "cre\u0301ature", "cre\u0301diter", "cre\u0301meux", "creuser", "crevette", "cribler", "crier", "cristal", "crite\u0300re", "croire", "croquer", "crotale", "crucial", "cruel", "crypter", "cubique", "cueillir", "cuille\u0300re", "cuisine", "cuivre", "culminer", "cultiver", "cumuler", "cupide", "curatif", "curseur", "cyanure", "cycle", "cylindre", "cynique", "daigner", "damier", "danger", "danseur", "dauphin", "de\u0301battre", "de\u0301biter", "de\u0301border", "de\u0301brider", "de\u0301butant", "de\u0301caler", "de\u0301cembre", "de\u0301chirer", "de\u0301cider", "de\u0301clarer", "de\u0301corer", "de\u0301crire", "de\u0301cupler", "de\u0301dale", "de\u0301ductif", "de\u0301esse", "de\u0301fensif", "de\u0301filer", "de\u0301frayer", "de\u0301gager", "de\u0301givrer", "de\u0301glutir", "de\u0301grafer", "de\u0301jeuner", "de\u0301lice", "de\u0301loger", "demander", "demeurer", "de\u0301molir", "de\u0301nicher", "de\u0301nouer", "dentelle", "de\u0301nuder", "de\u0301part", "de\u0301penser", "de\u0301phaser", "de\u0301placer", "de\u0301poser", "de\u0301ranger", "de\u0301rober", "de\u0301sastre", "descente", "de\u0301sert", "de\u0301signer", "de\u0301sobe\u0301ir", "dessiner", "destrier", "de\u0301tacher", "de\u0301tester", "de\u0301tourer", "de\u0301tresse", "devancer", "devenir", "deviner", "devoir", "diable", "dialogue", "diamant", "dicter", "diffe\u0301rer", "dige\u0301rer", "digital", "digne", "diluer", "dimanche", "diminuer", "dioxyde", "directif", "diriger", "discuter", "disposer", "dissiper", "distance", "divertir", "diviser", "docile", "docteur", "dogme", "doigt", "domaine", "domicile", "dompter", "donateur", "donjon", "donner", "dopamine", "dortoir", "dorure", "dosage", "doseur", "dossier", "dotation", "douanier", "double", "douceur", "douter", "doyen", "dragon", "draper", "dresser", "dribbler", "droiture", "duperie", "duplexe", "durable", "durcir", "dynastie", "e\u0301blouir", "e\u0301carter", "e\u0301charpe", "e\u0301chelle", "e\u0301clairer", "e\u0301clipse", "e\u0301clore", "e\u0301cluse", "e\u0301cole", "e\u0301conomie", "e\u0301corce", "e\u0301couter", "e\u0301craser", "e\u0301cre\u0301mer", "e\u0301crivain", "e\u0301crou", "e\u0301cume", "e\u0301cureuil", "e\u0301difier", "e\u0301duquer", "effacer", "effectif", "effigie", "effort", "effrayer", "effusion", "e\u0301galiser", "e\u0301garer", "e\u0301jecter", "e\u0301laborer", "e\u0301largir", "e\u0301lectron", "e\u0301le\u0301gant", "e\u0301le\u0301phant", "e\u0301le\u0300ve", "e\u0301ligible", "e\u0301litisme", "e\u0301loge", "e\u0301lucider", "e\u0301luder", "emballer", "embellir", "embryon", "e\u0301meraude", "e\u0301mission", "emmener", "e\u0301motion", "e\u0301mouvoir", "empereur", "employer", "emporter", "emprise", "e\u0301mulsion", "encadrer", "enche\u0300re", "enclave", "encoche", "endiguer", "endosser", "endroit", "enduire", "e\u0301nergie", "enfance", "enfermer", "enfouir", "engager", "engin", "englober", "e\u0301nigme", "enjamber", "enjeu", "enlever", "ennemi", "ennuyeux", "enrichir", "enrobage", "enseigne", "entasser", "entendre", "entier", "entourer", "entraver", "e\u0301nume\u0301rer", "envahir", "enviable", "envoyer", "enzyme", "e\u0301olien", "e\u0301paissir", "e\u0301pargne", "e\u0301patant", "e\u0301paule", "e\u0301picerie", "e\u0301pide\u0301mie", "e\u0301pier", "e\u0301pilogue", "e\u0301pine", "e\u0301pisode", "e\u0301pitaphe", "e\u0301poque", "e\u0301preuve", "e\u0301prouver", "e\u0301puisant", "e\u0301querre", "e\u0301quipe", "e\u0301riger", "e\u0301rosion", "erreur", "e\u0301ruption", "escalier", "espadon", "espe\u0300ce", "espie\u0300gle", "espoir", "esprit", "esquiver", "essayer", "essence", "essieu", "essorer", "estime", "estomac", "estrade", "e\u0301tage\u0300re", "e\u0301taler", "e\u0301tanche", "e\u0301tatique", "e\u0301teindre", "e\u0301tendoir", "e\u0301ternel", "e\u0301thanol", "e\u0301thique", "ethnie", "e\u0301tirer", "e\u0301toffer", "e\u0301toile", "e\u0301tonnant", "e\u0301tourdir", "e\u0301trange", "e\u0301troit", "e\u0301tude", "euphorie", "e\u0301valuer", "e\u0301vasion", "e\u0301ventail", "e\u0301vidence", "e\u0301viter", "e\u0301volutif", "e\u0301voquer", "exact", "exage\u0301rer", "exaucer", "exceller", "excitant", "exclusif", "excuse", "exe\u0301cuter", "exemple", "exercer", "exhaler", "exhorter", "exigence", "exiler", "exister", "exotique", "expe\u0301dier", "explorer", "exposer", "exprimer", "exquis", "extensif", "extraire", "exulter", "fable", "fabuleux", "facette", "facile", "facture", "faiblir", "falaise", "fameux", "famille", "farceur", "farfelu", "farine", "farouche", "fasciner", "fatal", "fatigue", "faucon", "fautif", "faveur", "favori", "fe\u0301brile", "fe\u0301conder", "fe\u0301de\u0301rer", "fe\u0301lin", "femme", "fe\u0301mur", "fendoir", "fe\u0301odal", "fermer", "fe\u0301roce", "ferveur", "festival", "feuille", "feutre", "fe\u0301vrier", "fiasco", "ficeler", "fictif", "fide\u0300le", "figure", "filature", "filetage", "filie\u0300re", "filleul", "filmer", "filou", "filtrer", "financer", "finir", "fiole", "firme", "fissure", "fixer", "flairer", "flamme", "flasque", "flatteur", "fle\u0301au", "fle\u0300che", "fleur", "flexion", "flocon", "flore", "fluctuer", "fluide", "fluvial", "folie", "fonderie", "fongible", "fontaine", "forcer", "forgeron", "formuler", "fortune", "fossile", "foudre", "fouge\u0300re", "fouiller", "foulure", "fourmi", "fragile", "fraise", "franchir", "frapper", "frayeur", "fre\u0301gate", "freiner", "frelon", "fre\u0301mir", "fre\u0301ne\u0301sie", "fre\u0300re", "friable", "friction", "frisson", "frivole", "froid", "fromage", "frontal", "frotter", "fruit", "fugitif", "fuite", "fureur", "furieux", "furtif", "fusion", "futur", "gagner", "galaxie", "galerie", "gambader", "garantir", "gardien", "garnir", "garrigue", "gazelle", "gazon", "ge\u0301ant", "ge\u0301latine", "ge\u0301lule", "gendarme", "ge\u0301ne\u0301ral", "ge\u0301nie", "genou", "gentil", "ge\u0301ologie", "ge\u0301ome\u0300tre", "ge\u0301ranium", "germe", "gestuel", "geyser", "gibier", "gicler", "girafe", "givre", "glace", "glaive", "glisser", "globe", "gloire", "glorieux", "golfeur", "gomme", "gonfler", "gorge", "gorille", "goudron", "gouffre", "goulot", "goupille", "gourmand", "goutte", "graduel", "graffiti", "graine", "grand", "grappin", "gratuit", "gravir", "grenat", "griffure", "griller", "grimper", "grogner", "gronder", "grotte", "groupe", "gruger", "grutier", "gruye\u0300re", "gue\u0301pard", "guerrier", "guide", "guimauve", "guitare", "gustatif", "gymnaste", "gyrostat", "habitude", "hachoir", "halte", "hameau", "hangar", "hanneton", "haricot", "harmonie", "harpon", "hasard", "he\u0301lium", "he\u0301matome", "herbe", "he\u0301risson", "hermine", "he\u0301ron", "he\u0301siter", "heureux", "hiberner", "hibou", "hilarant", "histoire", "hiver", "homard", "hommage", "homoge\u0300ne", "honneur", "honorer", "honteux", "horde", "horizon", "horloge", "hormone", "horrible", "houleux", "housse", "hublot", "huileux", "humain", "humble", "humide", "humour", "hurler", "hydromel", "hygie\u0300ne", "hymne", "hypnose", "idylle", "ignorer", "iguane", "illicite", "illusion", "image", "imbiber", "imiter", "immense", "immobile", "immuable", "impact", "impe\u0301rial", "implorer", "imposer", "imprimer", "imputer", "incarner", "incendie", "incident", "incliner", "incolore", "indexer", "indice", "inductif", "ine\u0301dit", "ineptie", "inexact", "infini", "infliger", "informer", "infusion", "inge\u0301rer", "inhaler", "inhiber", "injecter", "injure", "innocent", "inoculer", "inonder", "inscrire", "insecte", "insigne", "insolite", "inspirer", "instinct", "insulter", "intact", "intense", "intime", "intrigue", "intuitif", "inutile", "invasion", "inventer", "inviter", "invoquer", "ironique", "irradier", "irre\u0301el", "irriter", "isoler", "ivoire", "ivresse", "jaguar", "jaillir", "jambe", "janvier", "jardin", "jauger", "jaune", "javelot", "jetable", "jeton", "jeudi", "jeunesse", "joindre", "joncher", "jongler", "joueur", "jouissif", "journal", "jovial", "joyau", "joyeux", "jubiler", "jugement", "junior", "jupon", "juriste", "justice", "juteux", "juve\u0301nile", "kayak", "kimono", "kiosque", "label", "labial", "labourer", "lace\u0301rer", "lactose", "lagune", "laine", "laisser", "laitier", "lambeau", "lamelle", "lampe", "lanceur", "langage", "lanterne", "lapin", "largeur", "larme", "laurier", "lavabo", "lavoir", "lecture", "le\u0301gal", "le\u0301ger", "le\u0301gume", "lessive", "lettre", "levier", "lexique", "le\u0301zard", "liasse", "libe\u0301rer", "libre", "licence", "licorne", "lie\u0300ge", "lie\u0300vre", "ligature", "ligoter", "ligue", "limer", "limite", "limonade", "limpide", "line\u0301aire", "lingot", "lionceau", "liquide", "lisie\u0300re", "lister", "lithium", "litige", "littoral", "livreur", "logique", "lointain", "loisir", "lombric", "loterie", "louer", "lourd", "loutre", "louve", "loyal", "lubie", "lucide", "lucratif", "lueur", "lugubre", "luisant", "lumie\u0300re", "lunaire", "lundi", "luron", "lutter", "luxueux", "machine", "magasin", "magenta", "magique", "maigre", "maillon", "maintien", "mairie", "maison", "majorer", "malaxer", "male\u0301fice", "malheur", "malice", "mallette", "mammouth", "mandater", "maniable", "manquant", "manteau", "manuel", "marathon", "marbre", "marchand", "mardi", "maritime", "marqueur", "marron", "marteler", "mascotte", "massif", "mate\u0301riel", "matie\u0300re", "matraque", "maudire", "maussade", "mauve", "maximal", "me\u0301chant", "me\u0301connu", "me\u0301daille", "me\u0301decin", "me\u0301diter", "me\u0301duse", "meilleur", "me\u0301lange", "me\u0301lodie", "membre", "me\u0301moire", "menacer", "mener", "menhir", "mensonge", "mentor", "mercredi", "me\u0301rite", "merle", "messager", "mesure", "me\u0301tal", "me\u0301te\u0301ore", "me\u0301thode", "me\u0301tier", "meuble", "miauler", "microbe", "miette", "mignon", "migrer", "milieu", "million", "mimique", "mince", "mine\u0301ral", "minimal", "minorer", "minute", "miracle", "miroiter", "missile", "mixte", "mobile", "moderne", "moelleux", "mondial", "moniteur", "monnaie", "monotone", "monstre", "montagne", "monument", "moqueur", "morceau", "morsure", "mortier", "moteur", "motif", "mouche", "moufle", "moulin", "mousson", "mouton", "mouvant", "multiple", "munition", "muraille", "mure\u0300ne", "murmure", "muscle", "muse\u0301um", "musicien", "mutation", "muter", "mutuel", "myriade", "myrtille", "myste\u0300re", "mythique", "nageur", "nappe", "narquois", "narrer", "natation", "nation", "nature", "naufrage", "nautique", "navire", "ne\u0301buleux", "nectar", "ne\u0301faste", "ne\u0301gation", "ne\u0301gliger", "ne\u0301gocier", "neige", "nerveux", "nettoyer", "neurone", "neutron", "neveu", "niche", "nickel", "nitrate", "niveau", "noble", "nocif", "nocturne", "noirceur", "noisette", "nomade", "nombreux", "nommer", "normatif", "notable", "notifier", "notoire", "nourrir", "nouveau", "novateur", "novembre", "novice", "nuage", "nuancer", "nuire", "nuisible", "nume\u0301ro", "nuptial", "nuque", "nutritif", "obe\u0301ir", "objectif", "obliger", "obscur", "observer", "obstacle", "obtenir", "obturer", "occasion", "occuper", "oce\u0301an", "octobre", "octroyer", "octupler", "oculaire", "odeur", "odorant", "offenser", "officier", "offrir", "ogive", "oiseau", "oisillon", "olfactif", "olivier", "ombrage", "omettre", "onctueux", "onduler", "one\u0301reux", "onirique", "opale", "opaque", "ope\u0301rer", "opinion", "opportun", "opprimer", "opter", "optique", "orageux", "orange", "orbite", "ordonner", "oreille", "organe", "orgueil", "orifice", "ornement", "orque", "ortie", "osciller", "osmose", "ossature", "otarie", "ouragan", "ourson", "outil", "outrager", "ouvrage", "ovation", "oxyde", "oxyge\u0300ne", "ozone", "paisible", "palace", "palmare\u0300s", "palourde", "palper", "panache", "panda", "pangolin", "paniquer", "panneau", "panorama", "pantalon", "papaye", "papier", "papoter", "papyrus", "paradoxe", "parcelle", "paresse", "parfumer", "parler", "parole", "parrain", "parsemer", "partager", "parure", "parvenir", "passion", "paste\u0300que", "paternel", "patience", "patron", "pavillon", "pavoiser", "payer", "paysage", "peigne", "peintre", "pelage", "pe\u0301lican", "pelle", "pelouse", "peluche", "pendule", "pe\u0301ne\u0301trer", "pe\u0301nible", "pensif", "pe\u0301nurie", "pe\u0301pite", "pe\u0301plum", "perdrix", "perforer", "pe\u0301riode", "permuter", "perplexe", "persil", "perte", "peser", "pe\u0301tale", "petit", "pe\u0301trir", "peuple", "pharaon", "phobie", "phoque", "photon", "phrase", "physique", "piano", "pictural", "pie\u0300ce", "pierre", "pieuvre", "pilote", "pinceau", "pipette", "piquer", "pirogue", "piscine", "piston", "pivoter", "pixel", "pizza", "placard", "plafond", "plaisir", "planer", "plaque", "plastron", "plateau", "pleurer", "plexus", "pliage", "plomb", "plonger", "pluie", "plumage", "pochette", "poe\u0301sie", "poe\u0300te", "pointe", "poirier", "poisson", "poivre", "polaire", "policier", "pollen", "polygone", "pommade", "pompier", "ponctuel", "ponde\u0301rer", "poney", "portique", "position", "posse\u0301der", "posture", "potager", "poteau", "potion", "pouce", "poulain", "poumon", "pourpre", "poussin", "pouvoir", "prairie", "pratique", "pre\u0301cieux", "pre\u0301dire", "pre\u0301fixe", "pre\u0301lude", "pre\u0301nom", "pre\u0301sence", "pre\u0301texte", "pre\u0301voir", "primitif", "prince", "prison", "priver", "proble\u0300me", "proce\u0301der", "prodige", "profond", "progre\u0300s", "proie", "projeter", "prologue", "promener", "propre", "prospe\u0300re", "prote\u0301ger", "prouesse", "proverbe", "prudence", "pruneau", "psychose", "public", "puceron", "puiser", "pulpe", "pulsar", "punaise", "punitif", "pupitre", "purifier", "puzzle", "pyramide", "quasar", "querelle", "question", "quie\u0301tude", "quitter", "quotient", "racine", "raconter", "radieux", "ragondin", "raideur", "raisin", "ralentir", "rallonge", "ramasser", "rapide", "rasage", "ratisser", "ravager", "ravin", "rayonner", "re\u0301actif", "re\u0301agir", "re\u0301aliser", "re\u0301animer", "recevoir", "re\u0301citer", "re\u0301clamer", "re\u0301colter", "recruter", "reculer", "recycler", "re\u0301diger", "redouter", "refaire", "re\u0301flexe", "re\u0301former", "refrain", "refuge", "re\u0301galien", "re\u0301gion", "re\u0301glage", "re\u0301gulier", "re\u0301ite\u0301rer", "rejeter", "rejouer", "relatif", "relever", "relief", "remarque", "reme\u0300de", "remise", "remonter", "remplir", "remuer", "renard", "renfort", "renifler", "renoncer", "rentrer", "renvoi", "replier", "reporter", "reprise", "reptile", "requin", "re\u0301serve", "re\u0301sineux", "re\u0301soudre", "respect", "rester", "re\u0301sultat", "re\u0301tablir", "retenir", "re\u0301ticule", "retomber", "retracer", "re\u0301union", "re\u0301ussir", "revanche", "revivre", "re\u0301volte", "re\u0301vulsif", "richesse", "rideau", "rieur", "rigide", "rigoler", "rincer", "riposter", "risible", "risque", "rituel", "rival", "rivie\u0300re", "rocheux", "romance", "rompre", "ronce", "rondin", "roseau", "rosier", "rotatif", "rotor", "rotule", "rouge", "rouille", "rouleau", "routine", "royaume", "ruban", "rubis", "ruche", "ruelle", "rugueux", "ruiner", "ruisseau", "ruser", "rustique", "rythme", "sabler", "saboter", "sabre", "sacoche", "safari", "sagesse", "saisir", "salade", "salive", "salon", "saluer", "samedi", "sanction", "sanglier", "sarcasme", "sardine", "saturer", "saugrenu", "saumon", "sauter", "sauvage", "savant", "savonner", "scalpel", "scandale", "sce\u0301le\u0301rat", "sce\u0301nario", "sceptre", "sche\u0301ma", "science", "scinder", "score", "scrutin", "sculpter", "se\u0301ance", "se\u0301cable", "se\u0301cher", "secouer", "se\u0301cre\u0301ter", "se\u0301datif", "se\u0301duire", "seigneur", "se\u0301jour", "se\u0301lectif", "semaine", "sembler", "semence", "se\u0301minal", "se\u0301nateur", "sensible", "sentence", "se\u0301parer", "se\u0301quence", "serein", "sergent", "se\u0301rieux", "serrure", "se\u0301rum", "service", "se\u0301same", "se\u0301vir", "sevrage", "sextuple", "side\u0301ral", "sie\u0300cle", "sie\u0301ger", "siffler", "sigle", "signal", "silence", "silicium", "simple", "since\u0300re", "sinistre", "siphon", "sirop", "sismique", "situer", "skier", "social", "socle", "sodium", "soigneux", "soldat", "soleil", "solitude", "soluble", "sombre", "sommeil", "somnoler", "sonde", "songeur", "sonnette", "sonore", "sorcier", "sortir", "sosie", "sottise", "soucieux", "soudure", "souffle", "soulever", "soupape", "source", "soutirer", "souvenir", "spacieux", "spatial", "spe\u0301cial", "sphe\u0300re", "spiral", "stable", "station", "sternum", "stimulus", "stipuler", "strict", "studieux", "stupeur", "styliste", "sublime", "substrat", "subtil", "subvenir", "succe\u0300s", "sucre", "suffixe", "sugge\u0301rer", "suiveur", "sulfate", "superbe", "supplier", "surface", "suricate", "surmener", "surprise", "sursaut", "survie", "suspect", "syllabe", "symbole", "syme\u0301trie", "synapse", "syntaxe", "syste\u0300me", "tabac", "tablier", "tactile", "tailler", "talent", "talisman", "talonner", "tambour", "tamiser", "tangible", "tapis", "taquiner", "tarder", "tarif", "tartine", "tasse", "tatami", "tatouage", "taupe", "taureau", "taxer", "te\u0301moin", "temporel", "tenaille", "tendre", "teneur", "tenir", "tension", "terminer", "terne", "terrible", "te\u0301tine", "texte", "the\u0300me", "the\u0301orie", "the\u0301rapie", "thorax", "tibia", "tie\u0300de", "timide", "tirelire", "tiroir", "tissu", "titane", "titre", "tituber", "toboggan", "tole\u0301rant", "tomate", "tonique", "tonneau", "toponyme", "torche", "tordre", "tornade", "torpille", "torrent", "torse", "tortue", "totem", "toucher", "tournage", "tousser", "toxine", "traction", "trafic", "tragique", "trahir", "train", "trancher", "travail", "tre\u0300fle", "tremper", "tre\u0301sor", "treuil", "triage", "tribunal", "tricoter", "trilogie", "triomphe", "tripler", "triturer", "trivial", "trombone", "tronc", "tropical", "troupeau", "tuile", "tulipe", "tumulte", "tunnel", "turbine", "tuteur", "tutoyer", "tuyau", "tympan", "typhon", "typique", "tyran", "ubuesque", "ultime", "ultrason", "unanime", "unifier", "union", "unique", "unitaire", "univers", "uranium", "urbain", "urticant", "usage", "usine", "usuel", "usure", "utile", "utopie", "vacarme", "vaccin", "vagabond", "vague", "vaillant", "vaincre", "vaisseau", "valable", "valise", "vallon", "valve", "vampire", "vanille", "vapeur", "varier", "vaseux", "vassal", "vaste", "vecteur", "vedette", "ve\u0301ge\u0301tal", "ve\u0301hicule", "veinard", "ve\u0301loce", "vendredi", "ve\u0301ne\u0301rer", "venger", "venimeux", "ventouse", "verdure", "ve\u0301rin", "vernir", "verrou", "verser", "vertu", "veston", "ve\u0301te\u0301ran", "ve\u0301tuste", "vexant", "vexer", "viaduc", "viande", "victoire", "vidange", "vide\u0301o", "vignette", "vigueur", "vilain", "village", "vinaigre", "violon", "vipe\u0300re", "virement", "virtuose", "virus", "visage", "viseur", "vision", "visqueux", "visuel", "vital", "vitesse", "viticole", "vitrine", "vivace", "vivipare", "vocation", "voguer", "voile", "voisin", "voiture", "volaille", "volcan", "voltiger", "volume", "vorace", "vortex", "voter", "vouloir", "voyage", "voyelle", "wagon", "xe\u0301non", "yacht", "ze\u0300bre", "ze\u0301nith", "zeste", "zoologie"];
}
});
// node_modules/bip39-mnemonic/wordlist/italian.json
var require_italian = __commonJS({
"node_modules/bip39-mnemonic/wordlist/italian.json"(exports2, module2) {
module2.exports = ["abaco", "abbaglio", "abbinato", "abete", "abisso", "abolire", "abrasivo", "abrogato", "accadere", "accenno", "accusato", "acetone", "achille", "acido", "acqua", "acre", "acrilico", "acrobata", "acuto", "adagio", "addebito", "addome", "adeguato", "aderire", "adipe", "adottare", "adulare", "affabile", "affetto", "affisso", "affranto", "aforisma", "afoso", "africano", "agave", "agente", "agevole", "aggancio", "agire", "agitare", "agonismo", "agricolo", "agrumeto", "aguzzo", "alabarda", "alato", "albatro", "alberato", "albo", "albume", "alce", "alcolico", "alettone", "alfa", "algebra", "aliante", "alibi", "alimento", "allagato", "allegro", "allievo", "allodola", "allusivo", "almeno", "alogeno", "alpaca", "alpestre", "altalena", "alterno", "alticcio", "altrove", "alunno", "alveolo", "alzare", "amalgama", "amanita", "amarena", "ambito", "ambrato", "ameba", "america", "ametista", "amico", "ammasso", "ammenda", "ammirare", "ammonito", "amore", "ampio", "ampliare", "amuleto", "anacardo", "anagrafe", "analista", "anarchia", "anatra", "anca", "ancella", "ancora", "andare", "andrea", "anello", "angelo", "angolare", "angusto", "anima", "annegare", "annidato", "anno", "annuncio", "anonimo", "anticipo", "anzi", "apatico", "apertura", "apode", "apparire", "appetito", "appoggio", "approdo", "appunto", "aprile", "arabica", "arachide", "aragosta", "araldica", "arancio", "aratura", "arazzo", "arbitro", "archivio", "ardito", "arenile", "argento", "argine", "arguto", "aria", "armonia", "arnese", "arredato", "arringa", "arrosto", "arsenico", "arso", "artefice", "arzillo", "asciutto", "ascolto", "asepsi", "asettico", "asfalto", "asino", "asola", "aspirato", "aspro", "assaggio", "asse", "assoluto", "assurdo", "asta", "astenuto", "astice", "astratto", "atavico", "ateismo", "atomico", "atono", "attesa", "attivare", "attorno", "attrito", "attuale", "ausilio", "austria", "autista", "autonomo", "autunno", "avanzato", "avere", "avvenire", "avviso", "avvolgere", "azione", "azoto", "azzimo", "azzurro", "babele", "baccano", "bacino", "baco", "badessa", "badilata", "bagnato", "baita", "balcone", "baldo", "balena", "ballata", "balzano", "bambino", "bandire", "baraonda", "barbaro", "barca", "baritono", "barlume", "barocco", "basilico", "basso", "batosta", "battuto", "baule", "bava", "bavosa", "becco", "beffa", "belgio", "belva", "benda", "benevole", "benigno", "benzina", "bere", "berlina", "beta", "bibita", "bici", "bidone", "bifido", "biga", "bilancia", "bimbo", "binocolo", "biologo", "bipede", "bipolare", "birbante", "birra", "biscotto", "bisesto", "bisnonno", "bisonte", "bisturi", "bizzarro", "blando", "blatta", "bollito", "bonifico", "bordo", "bosco", "botanico", "bottino", "bozzolo", "braccio", "bradipo", "brama", "branca", "bravura", "bretella", "brevetto", "brezza", "briglia", "brillante", "brindare", "broccolo", "brodo", "bronzina", "brullo", "bruno", "bubbone", "buca", "budino", "buffone", "buio", "bulbo", "buono", "burlone", "burrasca", "bussola", "busta", "cadetto", "caduco", "calamaro", "calcolo", "calesse", "calibro", "calmo", "caloria", "cambusa", "camerata", "camicia", "cammino", "camola", "campale", "canapa", "candela", "cane", "canino", "canotto", "cantina", "capace", "capello", "capitolo", "capogiro", "cappero", "capra", "capsula", "carapace", "carcassa", "cardo", "carisma", "carovana", "carretto", "cartolina", "casaccio", "cascata", "caserma", "caso", "cassone", "castello", "casuale", "catasta", "catena", "catrame", "cauto", "cavillo", "cedibile", "cedrata", "cefalo", "celebre", "cellulare", "cena", "cenone", "centesimo", "ceramica", "cercare", "certo", "cerume", "cervello", "cesoia", "cespo", "ceto", "chela", "chiaro", "chicca", "chiedere", "chimera", "china", "chirurgo", "chitarra", "ciao", "ciclismo", "cifrare", "cigno", "cilindro", "ciottolo", "circa", "cirrosi", "citrico", "cittadino", "ciuffo", "civetta", "civile", "classico", "clinica", "cloro", "cocco", "codardo", "codice", "coerente", "cognome", "collare", "colmato", "colore", "colposo", "coltivato", "colza", "coma", "cometa", "commando", "comodo", "computer", "comune", "conciso", "condurre", "conferma", "congelare", "coniuge", "connesso", "conoscere", "consumo", "continuo", "convegno", "coperto", "copione", "coppia", "copricapo", "corazza", "cordata", "coricato", "cornice", "corolla", "corpo", "corredo", "corsia", "cortese", "cosmico", "costante", "cottura", "covato", "cratere", "cravatta", "creato", "credere", "cremoso", "crescita", "creta", "criceto", "crinale", "crisi", "critico", "croce", "cronaca", "crostata", "cruciale", "crusca", "cucire", "cuculo", "cugino", "cullato", "cupola", "curatore", "cursore", "curvo", "cuscino", "custode", "dado", "daino", "dalmata", "damerino", "daniela", "dannoso", "danzare", "datato", "davanti", "davvero", "debutto", "decennio", "deciso", "declino", "decollo", "decreto", "dedicato", "definito", "deforme", "degno", "delegare", "delfino", "delirio", "delta", "demenza", "denotato", "dentro", "deposito", "derapata", "derivare", "deroga", "descritto", "deserto", "desiderio", "desumere", "detersivo", "devoto", "diametro", "dicembre", "diedro", "difeso", "diffuso", "digerire", "digitale", "diluvio", "dinamico", "dinnanzi", "dipinto", "diploma", "dipolo", "diradare", "dire", "dirotto", "dirupo", "disagio", "discreto", "disfare", "disgelo", "disposto", "distanza", "disumano", "dito", "divano", "divelto", "dividere", "divorato", "doblone", "docente", "doganale", "dogma", "dolce", "domato", "domenica", "dominare", "dondolo", "dono", "dormire", "dote", "dottore", "dovuto", "dozzina", "drago", "druido", "dubbio", "dubitare", "ducale", "duna", "duomo", "duplice", "duraturo", "ebano", "eccesso", "ecco", "eclissi", "economia", "edera", "edicola", "edile", "editoria", "educare", "egemonia", "egli", "egoismo", "egregio", "elaborato", "elargire", "elegante", "elencato", "eletto", "elevare", "elfico", "elica", "elmo", "elsa", "eluso", "emanato", "emblema", "emesso", "emiro", "emotivo", "emozione", "empirico", "emulo", "endemico", "enduro", "energia", "enfasi", "enoteca", "entrare", "enzima", "epatite", "epilogo", "episodio", "epocale", "eppure", "equatore", "erario", "erba", "erboso", "erede", "eremita", "erigere", "ermetico", "eroe", "erosivo", "errante", "esagono", "esame", "esanime", "esaudire", "esca", "esempio", "esercito", "esibito", "esigente", "esistere", "esito", "esofago", "esortato", "esoso", "espanso", "espresso", "essenza", "esso", "esteso", "estimare", "estonia", "estroso", "esultare", "etilico", "etnico", "etrusco", "etto", "euclideo", "europa", "evaso", "evidenza", "evitato", "evoluto", "evviva", "fabbrica", "faccenda", "fachiro", "falco", "famiglia", "fanale", "fanfara", "fango", "fantasma", "fare", "farfalla", "farinoso", "farmaco", "fascia", "fastoso", "fasullo", "faticare", "fato", "favoloso", "febbre", "fecola", "fede", "fegato", "felpa", "feltro", "femmina", "fendere", "fenomeno", "fermento", "ferro", "fertile", "fessura", "festivo", "fetta", "feudo", "fiaba", "fiducia", "fifa", "figurato", "filo", "finanza", "finestra", "finire", "fiore", "fiscale", "fisico", "fiume", "flacone", "flamenco", "flebo", "flemma", "florido", "fluente", "fluoro", "fobico", "focaccia", "focoso", "foderato", "foglio", "folata", "folclore", "folgore", "fondente", "fonetico", "fonia", "fontana", "forbito", "forchetta", "foresta", "formica", "fornaio", "foro", "fortezza", "forzare", "fosfato", "fosso", "fracasso", "frana", "frassino", "fratello", "freccetta", "frenata", "fresco", "frigo", "frollino", "fronde", "frugale", "frutta", "fucilata", "fucsia", "fuggente", "fulmine", "fulvo", "fumante", "fumetto", "fumoso", "fune", "funzione", "fuoco", "furbo", "furgone", "furore", "fuso", "futile", "gabbiano", "gaffe", "galateo", "gallina", "galoppo", "gambero", "gamma", "garanzia", "garbo", "garofano", "garzone", "gasdotto", "gasolio", "gastrico", "gatto", "gaudio", "gazebo", "gazzella", "geco", "gelatina", "gelso", "gemello", "gemmato", "gene", "genitore", "gennaio", "genotipo", "gergo", "ghepardo", "ghiaccio", "ghisa", "giallo", "gilda", "ginepro", "giocare", "gioiello", "giorno", "giove", "girato", "girone", "gittata", "giudizio", "giurato", "giusto", "globulo", "glutine", "gnomo", "gobba", "golf", "gomito", "gommone", "gonfio", "gonna", "governo", "gracile", "grado", "grafico", "grammo", "grande", "grattare", "gravoso", "grazia", "greca", "gregge", "grifone", "grigio", "grinza", "grotta", "gruppo", "guadagno", "guaio", "guanto", "guardare", "gufo", "guidare", "ibernato", "icona", "identico", "idillio", "idolo", "idra", "idrico", "idrogeno", "igiene", "ignaro", "ignorato", "ilare", "illeso", "illogico", "illudere", "imballo", "imbevuto", "imbocco", "imbuto", "immane", "immerso", "immolato", "impacco", "impeto", "impiego", "importo", "impronta", "inalare", "inarcare", "inattivo", "incanto", "incendio", "inchino", "incisivo", "incluso", "incontro", "incrocio", "incubo", "indagine", "india", "indole", "inedito", "infatti", "infilare", "inflitto", "ingaggio", "ingegno", "inglese", "ingordo", "ingrosso", "innesco", "inodore", "inoltrare", "inondato", "insano", "insetto", "insieme", "insonnia", "insulina", "intasato", "intero", "intonaco", "intuito", "inumidire", "invalido", "invece", "invito", "iperbole", "ipnotico", "ipotesi", "ippica", "iride", "irlanda", "ironico", "irrigato", "irrorare", "isolato", "isotopo", "isterico", "istituto", "istrice", "italia", "iterare", "labbro", "labirinto", "lacca", "lacerato", "lacrima", "lacuna", "laddove", "lago", "lampo", "lancetta", "lanterna", "lardoso", "larga", "laringe", "lastra", "latenza", "latino", "lattuga", "lavagna", "lavoro", "legale", "leggero", "lembo", "lentezza", "lenza", "leone", "lepre", "lesivo", "lessato", "lesto", "letterale", "leva", "levigato", "libero", "lido", "lievito", "lilla", "limatura", "limitare", "limpido", "lineare", "lingua", "liquido", "lira", "lirica", "lisca", "lite", "litigio", "livrea", "locanda", "lode", "logica", "lombare", "londra", "longevo", "loquace", "lorenzo", "loto", "lotteria", "luce", "lucidato", "lumaca", "luminoso", "lungo", "lupo", "luppolo", "lusinga", "lusso", "lutto", "macabro", "macchina", "macero", "macinato", "madama", "magico", "maglia", "magnete", "magro", "maiolica", "malafede", "malgrado", "malinteso", "malsano", "malto", "malumore", "mana", "mancia", "mandorla", "mangiare", "manifesto", "mannaro", "manovra", "mansarda", "mantide", "manubrio", "mappa", "maratona", "marcire", "maretta", "marmo", "marsupio", "maschera", "massaia", "mastino", "materasso", "matricola", "mattone", "maturo", "mazurca", "meandro", "meccanico", "mecenate", "medesimo", "meditare", "mega", "melassa", "melis", "melodia", "meninge", "meno", "mensola", "mercurio", "merenda", "merlo", "meschino", "mese", "messere", "mestolo", "metallo", "metodo", "mettere", "miagolare", "mica", "micelio", "michele", "microbo", "midollo", "miele", "migliore", "milano", "milite", "mimosa", "minerale", "mini", "minore", "mirino", "mirtillo", "miscela", "missiva", "misto", "misurare", "mitezza", "mitigare", "mitra", "mittente", "mnemonico", "modello", "modifica", "modulo", "mogano", "mogio", "mole", "molosso", "monastero", "monco", "mondina", "monetario", "monile", "monotono", "monsone", "montato", "monviso", "mora", "mordere", "morsicato", "mostro", "motivato", "motosega", "motto", "movenza", "movimento", "mozzo", "mucca", "mucosa", "muffa", "mughetto", "mugnaio", "mulatto", "mulinello", "multiplo", "mummia", "munto", "muovere", "murale", "musa", "muscolo", "musica", "mutevole", "muto", "nababbo", "nafta", "nanometro", "narciso", "narice", "narrato", "nascere", "nastrare", "naturale", "nautica", "naviglio", "nebulosa", "necrosi", "negativo", "negozio", "nemmeno", "neofita", "neretto", "nervo", "nessuno", "nettuno", "neutrale", "neve", "nevrotico", "nicchia", "ninfa", "nitido", "nobile", "nocivo", "nodo", "nome", "nomina", "nordico", "normale", "norvegese", "nostrano", "notare", "notizia", "notturno", "novella", "nucleo", "nulla", "numero", "nuovo", "nutrire", "nuvola", "nuziale", "oasi", "obbedire", "obbligo", "obelisco", "oblio", "obolo", "obsoleto", "occasione", "occhio", "occidente", "occorrere", "occultare", "ocra", "oculato", "odierno", "odorare", "offerta", "offrire", "offuscato", "oggetto", "oggi", "ognuno", "olandese", "olfatto", "oliato", "oliva", "ologramma", "oltre", "omaggio", "ombelico", "ombra", "omega", "omissione", "ondoso", "onere", "onice", "onnivoro", "onorevole", "onta", "operato", "opinione", "opposto", "oracolo", "orafo", "ordine", "orecchino", "orefice", "orfano", "organico", "origine", "orizzonte", "orma", "ormeggio", "ornativo", "orologio", "orrendo", "orribile", "ortensia", "ortica", "orzata", "orzo", "osare", "oscurare", "osmosi", "ospedale", "ospite", "ossa", "ossidare", "ostacolo", "oste", "otite", "otre", "ottagono", "ottimo", "ottobre", "ovale", "ovest", "ovino", "oviparo", "ovocito", "ovunque", "ovviare", "ozio", "pacchetto", "pace", "pacifico", "padella", "padrone", "paese", "paga", "pagina", "palazzina", "palesare", "pallido", "palo", "palude", "pandoro", "pannello", "paolo", "paonazzo", "paprica", "parabola", "parcella", "parere", "pargolo", "pari", "parlato", "parola", "partire", "parvenza", "parziale", "passivo", "pasticca", "patacca", "patologia", "pattume", "pavone", "peccato", "pedalare", "pedonale", "peggio", "peloso", "penare", "pendice", "penisola", "pennuto", "penombra", "pensare", "pentola", "pepe", "pepita", "perbene", "percorso", "perdonato", "perforare", "pergamena", "periodo", "permesso", "perno", "perplesso", "persuaso", "pertugio", "pervaso", "pesatore", "pesista", "peso", "pestifero", "petalo", "pettine", "petulante", "pezzo", "piacere", "pianta", "piattino", "piccino", "picozza", "piega", "pietra", "piffero", "pigiama", "pigolio", "pigro", "pila", "pilifero", "pillola", "pilota", "pimpante", "pineta", "pinna", "pinolo", "pioggia", "piombo", "piramide", "piretico", "pirite", "pirolisi", "pitone", "pizzico", "placebo", "planare", "plasma", "platano", "plenario", "pochezza", "poderoso", "podismo", "poesia", "poggiare", "polenta", "poligono", "pollice", "polmonite", "polpetta", "polso", "poltrona", "polvere", "pomice", "pomodoro", "ponte", "popoloso", "porfido", "poroso", "porpora", "porre", "portata", "posa", "positivo", "possesso", "postulato", "potassio", "potere", "pranzo", "prassi", "pratica", "precluso", "predica", "prefisso", "pregiato", "prelievo", "premere", "prenotare", "preparato", "presenza", "pretesto", "prevalso", "prima", "principe", "privato", "problema", "procura", "produrre", "profumo", "progetto", "prolunga", "promessa", "pronome", "proposta", "proroga", "proteso", "prova", "prudente", "prugna", "prurito", "psiche", "pubblico", "pudica", "pugilato", "pugno", "pulce", "pulito", "pulsante", "puntare", "pupazzo", "pupilla", "puro", "quadro", "qualcosa", "quasi", "querela", "quota", "raccolto", "raddoppio", "radicale", "radunato", "raffica", "ragazzo", "ragione", "ragno", "ramarro", "ramingo", "ramo", "randagio", "rantolare", "rapato", "rapina", "rappreso", "rasatura", "raschiato", "rasente", "rassegna", "rastrello", "rata", "ravveduto", "reale", "recepire", "recinto", "recluta", "recondito", "recupero", "reddito", "redimere", "regalato", "registro", "regola", "regresso", "relazione", "remare", "remoto", "renna", "replica", "reprimere", "reputare", "resa", "residente", "responso", "restauro", "rete", "retina", "retorica", "rettifica", "revocato", "riassunto", "ribadire", "ribelle", "ribrezzo", "ricarica", "ricco", "ricevere", "riciclato", "ricordo", "ricreduto", "ridicolo", "ridurre", "rifasare", "riflesso", "riforma", "rifugio", "rigare", "rigettato", "righello", "rilassato", "rilevato", "rimanere", "rimbalzo", "rimedio", "rimorchio", "rinascita", "rincaro", "rinforzo", "rinnovo", "rinomato", "rinsavito", "rintocco", "rinuncia", "rinvenire", "riparato", "ripetuto", "ripieno", "riportare", "ripresa", "ripulire", "risata", "rischio", "riserva", "risibile", "riso", "rispetto", "ristoro", "risultato", "risvolto", "ritardo", "ritegno", "ritmico", "ritrovo", "riunione", "riva", "riverso", "rivincita", "rivolto", "rizoma", "roba", "robotico", "robusto", "roccia", "roco", "rodaggio", "rodere", "roditore", "rogito", "rollio", "romantico", "rompere", "ronzio", "rosolare", "rospo", "rotante", "rotondo", "rotula", "rovescio", "rubizzo", "rubrica", "ruga", "rullino", "rumine", "rumoroso", "ruolo", "rupe", "russare", "rustico", "sabato", "sabbiare", "sabotato", "sagoma", "salasso", "saldatura", "salgemma", "salivare", "salmone", "salone", "saltare", "saluto", "salvo", "sapere", "sapido", "saporito", "saraceno", "sarcasmo", "sarto", "sassoso", "satellite", "satira", "satollo", "saturno", "savana", "savio", "saziato", "sbadiglio", "sbalzo", "sbancato", "sbarra", "sbattere", "sbavare", "sbendare", "sbirciare", "sbloccato", "sbocciato", "sbrinare", "sbruffone", "sbuffare", "scabroso", "scadenza", "scala", "scambiare", "scandalo", "scapola", "scarso", "scatenare", "scavato", "scelto", "scenico", "scettro", "scheda", "schiena", "sciarpa", "scienza", "scindere", "scippo", "sciroppo", "scivolo", "sclerare", "scodella", "scolpito", "scomparto", "sconforto", "scoprire", "scorta", "scossone", "scozzese", "scriba", "scrollare", "scrutinio", "scuderia", "scultore", "scuola", "scuro", "scusare", "sdebitare", "sdoganare", "seccatura", "secondo", "sedano", "seggiola", "segnalato", "segregato", "seguito", "selciato", "selettivo", "sella", "selvaggio", "semaforo", "sembrare", "seme", "seminato", "sempre", "senso", "sentire", "sepolto", "sequenza", "serata", "serbato", "sereno", "serio", "serpente", "serraglio", "servire", "sestina", "setola", "settimana", "sfacelo", "sfaldare", "sfamato", "sfarzoso", "sfaticato", "sfera", "sfida", "sfilato", "sfinge", "sfocato", "sfoderare", "sfogo", "sfoltire", "sforzato", "sfratto", "sfruttato", "sfuggito", "sfumare", "sfuso", "sgabello", "sgarbato", "sgonfiare", "sgorbio", "sgrassato", "sguardo", "sibilo", "siccome", "sierra", "sigla", "signore", "silenzio", "sillaba", "simbolo", "simpatico", "simulato", "sinfonia", "singolo", "sinistro", "sino", "sintesi", "sinusoide", "sipario", "sisma", "sistole", "situato", "slitta", "slogatura", "sloveno", "smarrito", "smemorato", "smentito", "smeraldo", "smilzo", "smontare", "smottato", "smussato", "snellire", "snervato", "snodo", "sobbalzo", "sobrio", "soccorso", "sociale", "sodale", "soffitto", "sogno", "soldato", "solenne", "solido", "sollazzo", "solo", "solubile", "solvente", "somatico", "somma", "sonda", "sonetto", "sonnifero", "sopire", "soppeso", "sopra", "sorgere", "sorpasso", "sorriso", "sorso", "sorteggio", "sorvolato", "sospiro", "sosta", "sottile", "spada", "spalla", "spargere", "spatola", "spavento", "spazzola", "specie", "spedire", "spegnere", "spelatura", "speranza", "spessore", "spettrale", "spezzato", "spia", "spigoloso", "spillato", "spinoso", "spirale", "splendido", "sportivo", "sposo", "spranga", "sprecare", "spronato", "spruzzo", "spuntino", "squillo", "sradicare", "srotolato", "stabile", "stacco", "staffa", "stagnare", "stampato", "stantio", "starnuto", "stasera", "statuto", "stelo", "steppa", "sterzo", "stiletto", "stima", "stirpe", "stivale", "stizzoso", "stonato", "storico", "strappo", "stregato", "stridulo", "strozzare", "strutto", "stuccare", "stufo", "stupendo", "subentro", "succoso", "sudore", "suggerito", "sugo", "sultano", "suonare", "superbo", "supporto", "surgelato", "surrogato", "sussurro", "sutura", "svagare", "svedese", "sveglio", "svelare", "svenuto", "svezia", "sviluppo", "svista", "svizzera", "svolta", "svuotare", "tabacco", "tabulato", "tacciare", "taciturno", "tale", "talismano", "tampone", "tannino", "tara", "tardivo", "targato", "tariffa", "tarpare", "tartaruga", "tasto", "tattico", "taverna", "tavolata", "tazza", "teca", "tecnico", "telefono", "temerario", "tempo", "temuto", "tendone", "tenero", "tensione", "tentacolo", "teorema", "terme", "terrazzo", "terzetto", "tesi", "tesserato", "testato", "tetro", "tettoia", "tifare", "tigella", "timbro", "tinto", "tipico", "tipografo", "tiraggio", "tiro", "titanio", "titolo", "titubante", "tizio", "tizzone", "toccare", "tollerare", "tolto", "tombola", "tomo", "tonfo", "tonsilla", "topazio", "topologia", "toppa", "torba", "tornare", "torrone", "tortora", "toscano", "tossire", "tostatura", "totano", "trabocco", "trachea", "trafila", "tragedia", "tralcio", "tramonto", "transito", "trapano", "trarre", "trasloco", "trattato", "trave", "treccia", "tremolio", "trespolo", "tributo", "tricheco", "trifoglio", "trillo", "trincea", "trio", "tristezza", "triturato", "trivella", "tromba", "trono", "troppo", "trottola", "trovare", "truccato", "tubatura", "tuffato", "tulipano", "tumulto", "tunisia", "turbare", "turchino", "tuta", "tutela", "ubicato", "uccello", "uccisore", "udire", "uditivo", "uffa", "ufficio", "uguale", "ulisse", "ultimato", "umano", "umile", "umorismo", "uncinetto", "ungere", "ungherese", "unicorno", "unificato", "unisono", "unitario", "unte", "uovo", "upupa", "uragano", "urgenza", "urlo", "usanza", "usato", "uscito", "usignolo", "usuraio", "utensile", "utilizzo", "utopia", "vacante", "vaccinato", "vagabondo", "vagliato", "valanga", "valgo", "valico", "valletta", "valoroso", "valutare", "valvola", "vampata", "vangare", "vanitoso", "vano", "vantaggio", "vanvera", "vapore", "varano", "varcato", "variante", "vasca", "vedetta", "vedova", "veduto", "vegetale", "veicolo", "velcro", "velina", "velluto", "veloce", "venato", "vendemmia", "vento", "verace", "verbale", "vergogna", "verifica", "vero", "verruca", "verticale", "vescica", "vessillo", "vestale", "veterano", "vetrina", "vetusto", "viandante", "vibrante", "vicenda", "vichingo", "vicinanza", "vidimare", "vigilia", "vigneto", "vigore", "vile", "villano", "vimini", "vincitore", "viola", "vipera", "virgola", "virologo", "virulento", "viscoso", "visione", "vispo", "vissuto", "visura", "vita", "vitello", "vittima", "vivanda", "vivido", "viziare", "voce", "voga", "volatile", "volere", "volpe", "voragine", "vulcano", "zampogna", "zanna", "zappato", "zattera", "zavorra", "zefiro", "zelante", "zelo", "zenzero", "zerbino", "zibetto", "zinco", "zircone", "zitto", "zolla", "zotico", "zucchero", "zufolo", "zulu", "zuppa"];
}
});
// node_modules/bip39-mnemonic/wordlist/japanese.json
var require_japanese = __commonJS({
"node_modules/bip39-mnemonic/wordlist/japanese.json"(exports2, module2) {
module2.exports = ["\u3042\u3044\u3053\u304F\u3057\u3093", "\u3042\u3044\u3055\u3064", "\u3042\u3044\u305F\u3099", "\u3042\u304A\u305D\u3099\u3089", "\u3042\u304B\u3061\u3083\u3093", "\u3042\u304D\u308B", "\u3042\u3051\u304B\u3099\u305F", "\u3042\u3051\u308B", "\u3042\u3053\u304B\u3099\u308C\u308B", "\u3042\u3055\u3044", "\u3042\u3055\u3072", "\u3042\u3057\u3042\u3068", "\u3042\u3057\u3099\u308F\u3046", "\u3042\u3059\u3099\u304B\u308B", "\u3042\u3059\u3099\u304D", "\u3042\u305D\u3075\u3099", "\u3042\u305F\u3048\u308B", "\u3042\u305F\u305F\u3081\u308B", "\u3042\u305F\u308A\u307E\u3048", "\u3042\u305F\u308B", "\u3042\u3064\u3044", "\u3042\u3064\u304B\u3046", "\u3042\u3063\u3057\u3085\u304F", "\u3042\u3064\u307E\u308A", "\u3042\u3064\u3081\u308B", "\u3042\u3066\u306A", "\u3042\u3066\u306F\u307E\u308B", "\u3042\u3072\u308B", "\u3042\u3075\u3099\u3089", "\u3042\u3075\u3099\u308B", "\u3042\u3075\u308C\u308B", "\u3042\u307E\u3044", "\u3042\u307E\u3068\u3099", "\u3042\u307E\u3084\u304B\u3059", "\u3042\u307E\u308A", "\u3042\u307F\u3082\u306E", "\u3042\u3081\u308A\u304B", "\u3042\u3084\u307E\u308B", "\u3042\u3086\u3080", "\u3042\u3089\u3044\u304F\u3099\u307E", "\u3042\u3089\u3057", "\u3042\u3089\u3059\u3057\u3099", "\u3042\u3089\u305F\u3081\u308B", "\u3042\u3089\u3086\u308B", "\u3042\u3089\u308F\u3059", "\u3042\u308A\u304B\u3099\u3068\u3046", "\u3042\u308F\u305B\u308B", "\u3042\u308F\u3066\u308B", "\u3042\u3093\u3044", "\u3042\u3093\u304B\u3099\u3044", "\u3042\u3093\u3053", "\u3042\u3093\u305B\u3099\u3093", "\u3042\u3093\u3066\u3044", "\u3042\u3093\u306A\u3044", "\u3042\u3093\u307E\u308A", "\u3044\u3044\u305F\u3099\u3059", "\u3044\u304A\u3093", "\u3044\u304B\u3099\u3044", "\u3044\u304B\u3099\u304F", "\u3044\u304D\u304A\u3044", "\u3044\u304D\u306A\u308A", "\u3044\u304D\u3082\u306E", "\u3044\u304D\u308B", "\u3044\u304F\u3057\u3099", "\u3044\u304F\u3075\u3099\u3093", "\u3044\u3051\u306F\u3099\u306A", "\u3044\u3051\u3093", "\u3044\u3053\u3046", "\u3044\u3053\u304F", "\u3044\u3053\u3064", "\u3044\u3055\u307E\u3057\u3044", "\u3044\u3055\u3093", "\u3044\u3057\u304D", "\u3044\u3057\u3099\u3085\u3046", "\u3044\u3057\u3099\u3087\u3046", "\u3044\u3057\u3099\u308F\u308B", "\u3044\u3059\u3099\u307F", "\u3044\u3059\u3099\u308C", "\u3044\u305B\u3044", "\u3044\u305B\u3048\u3072\u3099", "\u3044\u305B\u304B\u3044", "\u3044\u305B\u304D", "\u3044\u305B\u3099\u3093", "\u3044\u305D\u3046\u308D\u3046", "\u3044\u305D\u304B\u3099\u3057\u3044", "\u3044\u305F\u3099\u3044", "\u3044\u305F\u3099\u304F", "\u3044\u305F\u3059\u3099\u3089", "\u3044\u305F\u307F", "\u3044\u305F\u308A\u3042", "\u3044\u3061\u304A\u3046", "\u3044\u3061\u3057\u3099", "\u3044\u3061\u3068\u3099", "\u3044\u3061\u306F\u3099", "\u3044\u3061\u3075\u3099", "\u3044\u3061\u308A\u3085\u3046", "\u3044\u3064\u304B", "\u3044\u3063\u3057\u3085\u3093", "\u3044\u3063\u305B\u3044", "\u3044\u3063\u305D\u3046", "\u3044\u3063\u305F\u3093", "\u3044\u3063\u3061", "\u3044\u3063\u3066\u3044", "\u3044\u3063\u307B\u309A\u3046", "\u3044\u3066\u3055\u3099", "\u3044\u3066\u3093", "\u3044\u3068\u3099\u3046", "\u3044\u3068\u3053", "\u3044\u306A\u3044", "\u3044\u306A\u304B", "\u3044\u306D\u3080\u308A", "\u3044\u306E\u3061", "\u3044\u306E\u308B", "\u3044\u306F\u3064", "\u3044\u306F\u3099\u308B", "\u3044\u306F\u3093", "\u3044\u3072\u3099\u304D", "\u3044\u3072\u3093", "\u3044\u3075\u304F", "\u3044\u3078\u3093", "\u3044\u307B\u3046", "\u3044\u307F\u3093", "\u3044\u3082\u3046\u3068", "\u3044\u3082\u305F\u308C", "\u3044\u3082\u308A", "\u3044\u3084\u304B\u3099\u308B", "\u3044\u3084\u3059", "\u3044\u3088\u304B\u3093", "\u3044\u3088\u304F", "\u3044\u3089\u3044", "\u3044\u3089\u3059\u3068", "\u3044\u308A\u304F\u3099\u3061", "\u3044\u308A\u3087\u3046", "\u3044\u308C\u3044", "\u3044\u308C\u3082\u306E", "\u3044\u308C\u308B", "\u3044\u308D\u3048\u3093\u3072\u309A\u3064", "\u3044\u308F\u3044", "\u3044\u308F\u3046", "\u3044\u308F\u304B\u3093", "\u3044\u308F\u306F\u3099", "\u3044\u308F\u3086\u308B", "\u3044\u3093\u3051\u3099\u3093\u307E\u3081", "\u3044\u3093\u3055\u3064", "\u3044\u3093\u3057\u3087\u3046", "\u3044\u3093\u3088\u3046", "\u3046\u3048\u304D", "\u3046\u3048\u308B", "\u3046\u304A\u3055\u3099", "\u3046\u304B\u3099\u3044", "\u3046\u304B\u3075\u3099", "\u3046\u304B\u3078\u3099\u308B", "\u3046\u304D\u308F", "\u3046\u304F\u3089\u3044\u306A", "\u3046\u304F\u308C\u308C", "\u3046\u3051\u305F\u307E\u308F\u308B", "\u3046\u3051\u3064\u3051", "\u3046\u3051\u3068\u308B", "\u3046\u3051\u3082\u3064", "\u3046\u3051\u308B", "\u3046\u3053\u3099\u304B\u3059", "\u3046\u3053\u3099\u304F", "\u3046\u3053\u3093", "\u3046\u3055\u304D\u3099", "\u3046\u3057\u306A\u3046", "\u3046\u3057\u308D\u304B\u3099\u307F", "\u3046\u3059\u3044", "\u3046\u3059\u304D\u3099", "\u3046\u3059\u304F\u3099\u3089\u3044", "\u3046\u3059\u3081\u308B", "\u3046\u305B\u3064", "\u3046\u3061\u3042\u308F\u305B", "\u3046\u3061\u304B\u3099\u308F", "\u3046\u3061\u304D", "\u3046\u3061\u3085\u3046", "\u3046\u3063\u304B\u308A", "\u3046\u3064\u304F\u3057\u3044", "\u3046\u3063\u305F\u3048\u308B", "\u3046\u3064\u308B", "\u3046\u3068\u3099\u3093", "\u3046\u306A\u304D\u3099", "\u3046\u306A\u3057\u3099", "\u3046\u306A\u3059\u3099\u304F", "\u3046\u306A\u308B", "\u3046\u306D\u308B", "\u3046\u306E\u3046", "\u3046\u3075\u3099\u3051\u3099", "\u3046\u3075\u3099\u3053\u3099\u3048", "\u3046\u307E\u308C\u308B", "\u3046\u3081\u308B", "\u3046\u3082\u3046", "\u3046\u3084\u307E\u3046", "\u3046\u3088\u304F", "\u3046\u3089\u304B\u3099\u3048\u3059", "\u3046\u3089\u304F\u3099\u3061", "\u3046\u3089\u306A\u3044", "\u3046\u308A\u3042\u3051\u3099", "\u3046\u308A\u304D\u308C", "\u3046\u308B\u3055\u3044", "\u3046\u308C\u3057\u3044", "\u3046\u308C\u3086\u304D", "\u3046\u308C\u308B", "\u3046\u308D\u3053", "\u3046\u308F\u304D", "\u3046\u308F\u3055", "\u3046\u3093\u3053\u3046", "\u3046\u3093\u3061\u3093", "\u3046\u3093\u3066\u3093", "\u3046\u3093\u3068\u3099\u3046", "\u3048\u3044\u3048\u3093", "\u3048\u3044\u304B\u3099", "\u3048\u3044\u304D\u3087\u3046", "\u3048\u3044\u3053\u3099", "\u3048\u3044\u305B\u3044", "\u3048\u3044\u3075\u3099\u3093", "\u3048\u3044\u3088\u3046", "\u3048\u3044\u308F", "\u3048\u304A\u308A", "\u3048\u304B\u3099\u304A", "\u3048\u304B\u3099\u304F", "\u3048\u304D\u305F\u3044", "\u3048\u304F\u305B\u308B", "\u3048\u3057\u3083\u304F", "\u3048\u3059\u3066", "\u3048\u3064\u3089\u3093", "\u3048\u306E\u304F\u3099", "\u3048\u307B\u3046\u307E\u304D", "\u3048\u307B\u3093", "\u3048\u307E\u304D", "\u3048\u3082\u3057\u3099", "\u3048\u3082\u306E", "\u3048\u3089\u3044", "\u3048\u3089\u3075\u3099", "\u3048\u308A\u3042", "\u3048\u3093\u3048\u3093", "\u3048\u3093\u304B\u3044", "\u3048\u3093\u304D\u3099", "\u3048\u3093\u3051\u3099\u304D", "\u3048\u3093\u3057\u3085\u3046", "\u3048\u3093\u305B\u3099\u3064", "\u3048\u3093\u305D\u304F", "\u3048\u3093\u3061\u3087\u3046", "\u3048\u3093\u3068\u3064", "\u304A\u3044\u304B\u3051\u308B", "\u304A\u3044\u3053\u3059", "\u304A\u3044\u3057\u3044", "\u304A\u3044\u3064\u304F", "\u304A\u3046\u3048\u3093", "\u304A\u3046\u3055\u307E", "\u304A\u3046\u3057\u3099", "\u304A\u3046\u305B\u3064", "\u304A\u3046\u305F\u3044", "\u304A\u3046\u3075\u304F", "\u304A\u3046\u3078\u3099\u3044", "\u304A\u3046\u3088\u3046", "\u304A\u3048\u308B", "\u304A\u304A\u3044", "\u304A\u304A\u3046", "\u304A\u304A\u3068\u3099\u304A\u308A", "\u304A\u304A\u3084", "\u304A\u304A\u3088\u305D", "\u304A\u304B\u3048\u308A", "\u304A\u304B\u3059\u3099", "\u304A\u304B\u3099\u3080", "\u304A\u304B\u308F\u308A", "\u304A\u304D\u3099\u306A\u3046", "\u304A\u304D\u308B", "\u304A\u304F\u3055\u307E", "\u304A\u304F\u3057\u3099\u3087\u3046", "\u304A\u304F\u308A\u304B\u3099\u306A", "\u304A\u304F\u308B", "\u304A\u304F\u308C\u308B", "\u304A\u3053\u3059", "\u304A\u3053\u306A\u3046", "\u304A\u3053\u308B", "\u304A\u3055\u3048\u308B", "\u304A\u3055\u306A\u3044", "\u304A\u3055\u3081\u308B", "\u304A\u3057\u3044\u308C", "\u304A\u3057\u3048\u308B", "\u304A\u3057\u3099\u304D\u3099", "\u304A\u3057\u3099\u3055\u3093", "\u304A\u3057\u3083\u308C", "\u304A\u305D\u3089\u304F", "\u304A\u305D\u308F\u308B", "\u304A\u305F\u304B\u3099\u3044", "\u304A\u305F\u304F", "\u304A\u305F\u3099\u3084\u304B", "\u304A\u3061\u3064\u304F", "\u304A\u3063\u3068", "\u304A\u3064\u308A", "\u304A\u3066\u3099\u304B\u3051", "\u304A\u3068\u3057\u3082\u306E", "\u304A\u3068\u306A\u3057\u3044", "\u304A\u3068\u3099\u308A", "\u304A\u3068\u3099\u308D\u304B\u3059", "\u304A\u306F\u3099\u3055\u3093", "\u304A\u307E\u3044\u308A", "\u304A\u3081\u3066\u3099\u3068\u3046", "\u304A\u3082\u3044\u3066\u3099", "\u304A\u3082\u3046", "\u304A\u3082\u305F\u3044", "\u304A\u3082\u3061\u3083", "\u304A\u3084\u3064", "\u304A\u3084\u3086\u3072\u3099", "\u304A\u3088\u307B\u3099\u3059", "\u304A\u3089\u3093\u305F\u3099", "\u304A\u308D\u3059", "\u304A\u3093\u304B\u3099\u304F", "\u304A\u3093\u3051\u3044", "\u304A\u3093\u3057\u3083", "\u304A\u3093\u305B\u3093", "\u304A\u3093\u305F\u3099\u3093", "\u304A\u3093\u3061\u3085\u3046", "\u304A\u3093\u3068\u3099\u3051\u3044", "\u304B\u3042\u3064", "\u304B\u3044\u304B\u3099", "\u304B\u3099\u3044\u304D", "\u304B\u3099\u3044\u3051\u3093", "\u304B\u3099\u3044\u3053\u3046", "\u304B\u3044\u3055\u3064", "\u304B\u3044\u3057\u3083", "\u304B\u3044\u3059\u3044\u3088\u304F", "\u304B\u3044\u305B\u3099\u3093", "\u304B\u3044\u305D\u3099\u3046\u3068\u3099", "\u304B\u3044\u3064\u3046", "\u304B\u3044\u3066\u3093", "\u304B\u3044\u3068\u3046", "\u304B\u3044\u3075\u304F", "\u304B\u3099\u3044\u3078\u304D", "\u304B\u3044\u307B\u3046", "\u304B\u3044\u3088\u3046", "\u304B\u3099\u3044\u3089\u3044", "\u304B\u3044\u308F", "\u304B\u3048\u308B", "\u304B\u304A\u308A", "\u304B\u304B\u3048\u308B", "\u304B\u304B\u3099\u304F", "\u304B\u304B\u3099\u3057", "\u304B\u304B\u3099\u307F", "\u304B\u304F\u3053\u3099", "\u304B\u304F\u3068\u304F", "\u304B\u3055\u3099\u308B", "\u304B\u3099\u305D\u3099\u3046", "\u304B\u305F\u3044", "\u304B\u305F\u3061", "\u304B\u3099\u3061\u3087\u3046", "\u304B\u3099\u3063\u304D\u3085\u3046", "\u304B\u3099\u3063\u3053\u3046", "\u304B\u3099\u3063\u3055\u3093", "\u304B\u3099\u3063\u3057\u3087\u3046", "\u304B\u306A\u3055\u3099\u308F\u3057", "\u304B\u306E\u3046", "\u304B\u3099\u306F\u304F", "\u304B\u3075\u3099\u304B", "\u304B\u307B\u3046", "\u304B\u307B\u3053\u3099", "\u304B\u307E\u3046", "\u304B\u307E\u307B\u3099\u3053", "\u304B\u3081\u308C\u304A\u3093", "\u304B\u3086\u3044", "\u304B\u3088\u3046\u3072\u3099", "\u304B\u3089\u3044", "\u304B\u308B\u3044", "\u304B\u308D\u3046", "\u304B\u308F\u304F", "\u304B\u308F\u3089", "\u304B\u3099\u3093\u304B", "\u304B\u3093\u3051\u3044", "\u304B\u3093\u3053\u3046", "\u304B\u3093\u3057\u3083", "\u304B\u3093\u305D\u3046", "\u304B\u3093\u305F\u3093", "\u304B\u3093\u3061", "\u304B\u3099\u3093\u306F\u3099\u308B", "\u304D\u3042\u3044", "\u304D\u3042\u3064", "\u304D\u3044\u308D", "\u304D\u3099\u3044\u3093", "\u304D\u3046\u3044", "\u304D\u3046\u3093", "\u304D\u3048\u308B", "\u304D\u304A\u3046", "\u304D\u304A\u304F", "\u304D\u304A\u3061", "\u304D\u304A\u3093", "\u304D\u304B\u3044", "\u304D\u304B\u304F", "\u304D\u304B\u3093\u3057\u3083", "\u304D\u304D\u3066", "\u304D\u304F\u306F\u3099\u308A", "\u304D\u304F\u3089\u3051\u3099", "\u304D\u3051\u3093\u305B\u3044", "\u304D\u3053\u3046", "\u304D\u3053\u3048\u308B", "\u304D\u3053\u304F", "\u304D\u3055\u3044", "\u304D\u3055\u304F", "\u304D\u3055\u307E", "\u304D\u3055\u3089\u304D\u3099", "\u304D\u3099\u3057\u3099\u304B\u304B\u3099\u304F", "\u304D\u3099\u3057\u304D", "\u304D\u3099\u3057\u3099\u305F\u3044\u3051\u3093", "\u304D\u3099\u3057\u3099\u306B\u3063\u3066\u3044", "\u304D\u3099\u3057\u3099\u3085\u3064\u3057\u3083", "\u304D\u3059\u3046", "\u304D\u305B\u3044", "\u304D\u305B\u304D", "\u304D\u305B\u3064", "\u304D\u305D\u3046", "\u304D\u305D\u3099\u304F", "\u304D\u305D\u3099\u3093", "\u304D\u305F\u3048\u308B", "\u304D\u3061\u3087\u3046", "\u304D\u3064\u3048\u3093", "\u304D\u3099\u3063\u3061\u308A", "\u304D\u3064\u3064\u304D", "\u304D\u3064\u306D", "\u304D\u3066\u3044", "\u304D\u3068\u3099\u3046", "\u304D\u3068\u3099\u304F", "\u304D\u306A\u3044", "\u304D\u306A\u304B\u3099", "\u304D\u306A\u3053", "\u304D\u306C\u3053\u3099\u3057", "\u304D\u306D\u3093", "\u304D\u306E\u3046", "\u304D\u306E\u3057\u305F", "\u304D\u306F\u304F", "\u304D\u3072\u3099\u3057\u3044", "\u304D\u3072\u3093", "\u304D\u3075\u304F", "\u304D\u3075\u3099\u3093", "\u304D\u307B\u3099\u3046", "\u304D\u307B\u3093", "\u304D\u307E\u308B", "\u304D\u307F\u3064", "\u304D\u3080\u3059\u3099\u304B\u3057\u3044", "\u304D\u3081\u308B", "\u304D\u3082\u305F\u3099\u3081\u3057", "\u304D\u3082\u3061", "\u304D\u3082\u306E", "\u304D\u3083\u304F", "\u304D\u3084\u304F", "\u304D\u3099\u3085\u3046\u306B\u304F", "\u304D\u3088\u3046", "\u304D\u3087\u3046\u308A\u3085\u3046", "\u304D\u3089\u3044", "\u304D\u3089\u304F", "\u304D\u308A\u3093", "\u304D\u308C\u3044", "\u304D\u308C\u3064", "\u304D\u308D\u304F", "\u304D\u3099\u308D\u3093", "\u304D\u308F\u3081\u308B", "\u304D\u3099\u3093\u3044\u308D", "\u304D\u3093\u304B\u304F\u3057\u3099", "\u304D\u3093\u3057\u3099\u3087", "\u304D\u3093\u3088\u3046\u3072\u3099", "\u304F\u3099\u3042\u3044", "\u304F\u3044\u3059\u3099", "\u304F\u3046\u304B\u3093", "\u304F\u3046\u304D", "\u304F\u3046\u304F\u3099\u3093", "\u304F\u3046\u3053\u3046", "\u304F\u3099\u3046\u305B\u3044", "\u304F\u3046\u305D\u3046", "\u304F\u3099\u3046\u305F\u3089", "\u304F\u3046\u3075\u304F", "\u304F\u3046\u307B\u3099", "\u304F\u304B\u3093", "\u304F\u304D\u3087\u3046", "\u304F\u3051\u3099\u3093", "\u304F\u3099\u3053\u3046", "\u304F\u3055\u3044", "\u304F\u3055\u304D", "\u304F\u3055\u306F\u3099\u306A", "\u304F\u3055\u308B", "\u304F\u3057\u3083\u307F", "\u304F\u3057\u3087\u3046", "\u304F\u3059\u306E\u304D", "\u304F\u3059\u308A\u3086\u3072\u3099", "\u304F\u305B\u3051\u3099", "\u304F\u305B\u3093", "\u304F\u3099\u305F\u3044\u3066\u304D", "\u304F\u305F\u3099\u3055\u308B", "\u304F\u305F\u3072\u3099\u308C\u308B", "\u304F\u3061\u3053\u307F", "\u304F\u3061\u3055\u304D", "\u304F\u3064\u3057\u305F", "\u304F\u3099\u3063\u3059\u308A", "\u304F\u3064\u308D\u304F\u3099", "\u304F\u3068\u3046\u3066\u3093", "\u304F\u3068\u3099\u304F", "\u304F\u306A\u3093", "\u304F\u306D\u304F\u306D", "\u304F\u306E\u3046", "\u304F\u3075\u3046", "\u304F\u307F\u3042\u308F\u305B", "\u304F\u307F\u305F\u3066\u308B", "\u304F\u3081\u308B", "\u304F\u3084\u304F\u3057\u3087", "\u304F\u3089\u3059", "\u304F\u3089\u3078\u3099\u308B", "\u304F\u308B\u307E", "\u304F\u308C\u308B", "\u304F\u308D\u3046", "\u304F\u308F\u3057\u3044", "\u304F\u3099\u3093\u304B\u3093", "\u304F\u3099\u3093\u3057\u3087\u304F", "\u304F\u3099\u3093\u305F\u3044", "\u304F\u3099\u3093\u3066", "\u3051\u3042\u306A", "\u3051\u3044\u304B\u304F", "\u3051\u3044\u3051\u3093", "\u3051\u3044\u3053", "\u3051\u3044\u3055\u3064", "\u3051\u3099\u3044\u3057\u3099\u3085\u3064", "\u3051\u3044\u305F\u3044", "\u3051\u3099\u3044\u306E\u3046\u3057\u3099\u3093", "\u3051\u3044\u308C\u304D", "\u3051\u3044\u308D", "\u3051\u304A\u3068\u3059", "\u3051\u304A\u308A\u3082\u306E", "\u3051\u3099\u304D\u304B", "\u3051\u3099\u304D\u3051\u3099\u3093", "\u3051\u3099\u304D\u305F\u3099\u3093", "\u3051\u3099\u304D\u3061\u3093", "\u3051\u3099\u304D\u3068\u3064", "\u3051\u3099\u304D\u306F", "\u3051\u3099\u304D\u3084\u304F", "\u3051\u3099\u3053\u3046", "\u3051\u3099\u3053\u304F\u3057\u3099\u3087\u3046", "\u3051\u3099\u3055\u3099\u3044", "\u3051\u3055\u304D", "\u3051\u3099\u3055\u3099\u3093", "\u3051\u3057\u304D", "\u3051\u3057\u3053\u3099\u3080", "\u3051\u3057\u3087\u3046", "\u3051\u3099\u3059\u3068", "\u3051\u305F\u306F\u3099", "\u3051\u3061\u3083\u3063\u3075\u309A", "\u3051\u3061\u3089\u3059", "\u3051\u3064\u3042\u3064", "\u3051\u3064\u3044", "\u3051\u3064\u3048\u304D", "\u3051\u3063\u3053\u3093", "\u3051\u3064\u3057\u3099\u3087", "\u3051\u3063\u305B\u304D", "\u3051\u3063\u3066\u3044", "\u3051\u3064\u307E\u3064", "\u3051\u3099\u3064\u3088\u3046\u3072\u3099", "\u3051\u3099\u3064\u308C\u3044", "\u3051\u3064\u308D\u3093", "\u3051\u3099\u3068\u3099\u304F", "\u3051\u3068\u306F\u3099\u3059", "\u3051\u3068\u308B", "\u3051\u306A\u3051\u3099", "\u3051\u306A\u3059", "\u3051\u306A\u307F", "\u3051\u306C\u304D", "\u3051\u3099\u306D\u3064", "\u3051\u306D\u3093", "\u3051\u306F\u3044", "\u3051\u3099\u3072\u3093", "\u3051\u3075\u3099\u304B\u3044", "\u3051\u3099\u307B\u3099\u304F", "\u3051\u307E\u308A", "\u3051\u307F\u304B\u308B", "\u3051\u3080\u3057", "\u3051\u3080\u308A", "\u3051\u3082\u306E", "\u3051\u3089\u3044", "\u3051\u308D\u3051\u308D", "\u3051\u308F\u3057\u3044", "\u3051\u3093\u3044", "\u3051\u3093\u3048\u3064", "\u3051\u3093\u304A", "\u3051\u3093\u304B", "\u3051\u3099\u3093\u304D", "\u3051\u3093\u3051\u3099\u3093", "\u3051\u3093\u3053\u3046", "\u3051\u3093\u3055\u304F", "\u3051\u3093\u3057\u3085\u3046", "\u3051\u3093\u3059\u3046", "\u3051\u3099\u3093\u305D\u3046", "\u3051\u3093\u3061\u304F", "\u3051\u3093\u3066\u3044", "\u3051\u3093\u3068\u3046", "\u3051\u3093\u306A\u3044", "\u3051\u3093\u306B\u3093", "\u3051\u3099\u3093\u3075\u3099\u3064", "\u3051\u3093\u307E", "\u3051\u3093\u307F\u3093", "\u3051\u3093\u3081\u3044", "\u3051\u3093\u3089\u3093", "\u3051\u3093\u308A", "\u3053\u3042\u304F\u307E", "\u3053\u3044\u306C", "\u3053\u3044\u3072\u3099\u3068", "\u3053\u3099\u3046\u3044", "\u3053\u3046\u3048\u3093", "\u3053\u3046\u304A\u3093", "\u3053\u3046\u304B\u3093", "\u3053\u3099\u3046\u304D\u3085\u3046", "\u3053\u3099\u3046\u3051\u3044", "\u3053\u3046\u3053\u3046", "\u3053\u3046\u3055\u3044", "\u3053\u3046\u3057\u3099", "\u3053\u3046\u3059\u3044", "\u3053\u3099\u3046\u305B\u3044", "\u3053\u3046\u305D\u304F", "\u3053\u3046\u305F\u3044", "\u3053\u3046\u3061\u3083", "\u3053\u3046\u3064\u3046", "\u3053\u3046\u3066\u3044", "\u3053\u3046\u3068\u3099\u3046", "\u3053\u3046\u306A\u3044", "\u3053\u3046\u306F\u3044", "\u3053\u3099\u3046\u307B\u3046", "\u3053\u3099\u3046\u307E\u3093", "\u3053\u3046\u3082\u304F", "\u3053\u3046\u308A\u3064", "\u3053\u3048\u308B", "\u3053\u304A\u308A", "\u3053\u3099\u304B\u3044", "\u3053\u3099\u304B\u3099\u3064", "\u3053\u3099\u304B\u3093", "\u3053\u304F\u3053\u3099", "\u3053\u304F\u3055\u3044", "\u3053\u304F\u3068\u3046", "\u3053\u304F\u306A\u3044", "\u3053\u304F\u306F\u304F", "\u3053\u304F\u3099\u307E", "\u3053\u3051\u3044", "\u3053\u3051\u308B", "\u3053\u3053\u306E\u304B", "\u3053\u3053\u308D", "\u3053\u3055\u3081", "\u3053\u3057\u3064", "\u3053\u3059\u3046", "\u3053\u305B\u3044", "\u3053\u305B\u304D", "\u3053\u305B\u3099\u3093", "\u3053\u305D\u305F\u3099\u3066", "\u3053\u305F\u3044", "\u3053\u305F\u3048\u308B", "\u3053\u305F\u3064", "\u3053\u3061\u3087\u3046", "\u3053\u3063\u304B", "\u3053\u3064\u3053\u3064", "\u3053\u3064\u306F\u3099\u3093", "\u3053\u3064\u3075\u3099", "\u3053\u3066\u3044", "\u3053\u3066\u3093", "\u3053\u3068\u304B\u3099\u3089", "\u3053\u3068\u3057", "\u3053\u3068\u306F\u3099", "\u3053\u3068\u308A", "\u3053\u306A\u3053\u3099\u306A", "\u3053\u306D\u3053\u306D", "\u3053\u306E\u307E\u307E", "\u3053\u306E\u307F", "\u3053\u306E\u3088", "\u3053\u3099\u306F\u3093", "\u3053\u3072\u3064\u3057\u3099", "\u3053\u3075\u3046", "\u3053\u3075\u3093", "\u3053\u307B\u3099\u308C\u308B", "\u3053\u3099\u307E\u3042\u3075\u3099\u3089", "\u3053\u307E\u304B\u3044", "\u3053\u3099\u307E\u3059\u308A", "\u3053\u307E\u3064\u306A", "\u3053\u307E\u308B", "\u3053\u3080\u304D\u3099\u3053", "\u3053\u3082\u3057\u3099", "\u3053\u3082\u3061", "\u3053\u3082\u306E", "\u3053\u3082\u3093", "\u3053\u3084\u304F", "\u3053\u3084\u307E", "\u3053\u3086\u3046", "\u3053\u3086\u3072\u3099", "\u3053\u3088\u3044", "\u3053\u3088\u3046", "\u3053\u308A\u308B", "\u3053\u308C\u304F\u3057\u3087\u3093", "\u3053\u308D\u3063\u3051", "\u3053\u308F\u3082\u3066", "\u3053\u308F\u308C\u308B", "\u3053\u3093\u3044\u3093", "\u3053\u3093\u304B\u3044", "\u3053\u3093\u304D", "\u3053\u3093\u3057\u3085\u3046", "\u3053\u3093\u3059\u3044", "\u3053\u3093\u305F\u3099\u3066", "\u3053\u3093\u3068\u3093", "\u3053\u3093\u306A\u3093", "\u3053\u3093\u3072\u3099\u306B", "\u3053\u3093\u307B\u309A\u3093", "\u3053\u3093\u307E\u3051", "\u3053\u3093\u3084", "\u3053\u3093\u308C\u3044", "\u3053\u3093\u308F\u304F", "\u3055\u3099\u3044\u3048\u304D", "\u3055\u3044\u304B\u3044", "\u3055\u3044\u304D\u3093", "\u3055\u3099\u3044\u3051\u3099\u3093", "\u3055\u3099\u3044\u3053", "\u3055\u3044\u3057\u3087", "\u3055\u3044\u305B\u3044", "\u3055\u3099\u3044\u305F\u304F", "\u3055\u3099\u3044\u3061\u3085\u3046", "\u3055\u3044\u3066\u304D", "\u3055\u3099\u3044\u308A\u3087\u3046", "\u3055\u3046\u306A", "\u3055\u304B\u3044\u3057", "\u3055\u304B\u3099\u3059", "\u3055\u304B\u306A", "\u3055\u304B\u307F\u3061", "\u3055\u304B\u3099\u308B", "\u3055\u304D\u3099\u3087\u3046", "\u3055\u304F\u3057", "\u3055\u304F\u3072\u3093", "\u3055\u304F\u3089", "\u3055\u3053\u304F", "\u3055\u3053\u3064", "\u3055\u3059\u3099\u304B\u308B", "\u3055\u3099\u305B\u304D", "\u3055\u305F\u3093", "\u3055\u3064\u3048\u3044", "\u3055\u3099\u3064\u304A\u3093", "\u3055\u3099\u3063\u304B", "\u3055\u3099\u3064\u304B\u3099\u304F", "\u3055\u3063\u304D\u3087\u304F", "\u3055\u3099\u3063\u3057", "\u3055\u3064\u3057\u3099\u3093", "\u3055\u3099\u3063\u305D\u3046", "\u3055\u3064\u305F\u306F\u3099", "\u3055\u3064\u307E\u3044\u3082", "\u3055\u3066\u3044", "\u3055\u3068\u3044\u3082", "\u3055\u3068\u3046", "\u3055\u3068\u304A\u3084", "\u3055\u3068\u3057", "\u3055\u3068\u308B", "\u3055\u306E\u3046", "\u3055\u306F\u3099\u304F", "\u3055\u3072\u3099\u3057\u3044", "\u3055\u3078\u3099\u3064", "\u3055\u307B\u3046", "\u3055\u307B\u3068\u3099", "\u3055\u307E\u3059", "\u3055\u307F\u3057\u3044", "\u3055\u307F\u305F\u3099\u308C", "\u3055\u3080\u3051", "\u3055\u3081\u308B", "\u3055\u3084\u3048\u3093\u3068\u3099\u3046", "\u3055\u3086\u3046", "\u3055\u3088\u3046", "\u3055\u3088\u304F", "\u3055\u3089\u305F\u3099", "\u3055\u3099\u308B\u305D\u306F\u3099", "\u3055\u308F\u3084\u304B", "\u3055\u308F\u308B", "\u3055\u3093\u3044\u3093", "\u3055\u3093\u304B", "\u3055\u3093\u304D\u3083\u304F", "\u3055\u3093\u3053\u3046", "\u3055\u3093\u3055\u3044", "\u3055\u3099\u3093\u3057\u3087", "\u3055\u3093\u3059\u3046", "\u3055\u3093\u305B\u3044", "\u3055\u3093\u305D", "\u3055\u3093\u3061", "\u3055\u3093\u307E", "\u3055\u3093\u307F", "\u3055\u3093\u3089\u3093", "\u3057\u3042\u3044", "\u3057\u3042\u3051\u3099", "\u3057\u3042\u3055\u3063\u3066", "\u3057\u3042\u308F\u305B", "\u3057\u3044\u304F", "\u3057\u3044\u3093", "\u3057\u3046\u3061", "\u3057\u3048\u3044", "\u3057\u304A\u3051", "\u3057\u304B\u3044", "\u3057\u304B\u304F", "\u3057\u3099\u304B\u3093", "\u3057\u3053\u3099\u3068", "\u3057\u3059\u3046", "\u3057\u3099\u305F\u3099\u3044", "\u3057\u305F\u3046\u3051", "\u3057\u305F\u304D\u3099", "\u3057\u305F\u3066", "\u3057\u305F\u307F", "\u3057\u3061\u3087\u3046", "\u3057\u3061\u308A\u3093", "\u3057\u3063\u304B\u308A", "\u3057\u3064\u3057\u3099", "\u3057\u3064\u3082\u3093", "\u3057\u3066\u3044", "\u3057\u3066\u304D", "\u3057\u3066\u3064", "\u3057\u3099\u3066\u3093", "\u3057\u3099\u3068\u3099\u3046", "\u3057\u306A\u304D\u3099\u308C", "\u3057\u306A\u3082\u306E", "\u3057\u306A\u3093", "\u3057\u306D\u307E", "\u3057\u306D\u3093", "\u3057\u306E\u304F\u3099", "\u3057\u306E\u3075\u3099", "\u3057\u306F\u3044", "\u3057\u306F\u3099\u304B\u308A", "\u3057\u306F\u3064", "\u3057\u306F\u3089\u3044", "\u3057\u306F\u3093", "\u3057\u3072\u3087\u3046", "\u3057\u3075\u304F", "\u3057\u3099\u3075\u3099\u3093", "\u3057\u3078\u3044", "\u3057\u307B\u3046", "\u3057\u307B\u3093", "\u3057\u307E\u3046", "\u3057\u307E\u308B", "\u3057\u307F\u3093", "\u3057\u3080\u3051\u308B", "\u3057\u3099\u3080\u3057\u3087", "\u3057\u3081\u3044", "\u3057\u3081\u308B", "\u3057\u3082\u3093", "\u3057\u3083\u3044\u3093", "\u3057\u3083\u3046\u3093", "\u3057\u3083\u304A\u3093", "\u3057\u3099\u3083\u304B\u3099\u3044\u3082", "\u3057\u3084\u304F\u3057\u3087", "\u3057\u3083\u304F\u307B\u3046", "\u3057\u3083\u3051\u3093", "\u3057\u3083\u3053", "\u3057\u3083\u3055\u3099\u3044", "\u3057\u3083\u3057\u3093", "\u3057\u3083\u305B\u3093", "\u3057\u3083\u305D\u3046", "\u3057\u3083\u305F\u3044", "\u3057\u3083\u3061\u3087\u3046", "\u3057\u3083\u3063\u304D\u3093", "\u3057\u3099\u3083\u307E", "\u3057\u3083\u308A\u3093", "\u3057\u3083\u308C\u3044", "\u3057\u3099\u3086\u3046", "\u3057\u3099\u3085\u3046\u3057\u3087", "\u3057\u3085\u304F\u306F\u304F", "\u3057\u3099\u3085\u3057\u3093", "\u3057\u3085\u3063\u305B\u304D", "\u3057\u3085\u307F", "\u3057\u3085\u3089\u306F\u3099", "\u3057\u3099\u3085\u3093\u306F\u3099\u3093", "\u3057\u3087\u3046\u304B\u3044", "\u3057\u3087\u304F\u305F\u304F", "\u3057\u3087\u3063\u3051\u3093", "\u3057\u3087\u3068\u3099\u3046", "\u3057\u3087\u3082\u3064", "\u3057\u3089\u305B\u308B", "\u3057\u3089\u3078\u3099\u308B", "\u3057\u3093\u304B", "\u3057\u3093\u3053\u3046", "\u3057\u3099\u3093\u3057\u3099\u3083", "\u3057\u3093\u305B\u3044\u3057\u3099", "\u3057\u3093\u3061\u304F", "\u3057\u3093\u308A\u3093", "\u3059\u3042\u3051\u3099", "\u3059\u3042\u3057", "\u3059\u3042\u306A", "\u3059\u3099\u3042\u3093", "\u3059\u3044\u3048\u3044", "\u3059\u3044\u304B", "\u3059\u3044\u3068\u3046", "\u3059\u3099\u3044\u3075\u3099\u3093", "\u3059\u3044\u3088\u3046\u3072\u3099", "\u3059\u3046\u304B\u3099\u304F", "\u3059\u3046\u3057\u3099\u3064", "\u3059\u3046\u305B\u3093", "\u3059\u304A\u3068\u3099\u308A", "\u3059\u304D\u307E", "\u3059\u304F\u3046", "\u3059\u304F\u306A\u3044", "\u3059\u3051\u308B", "\u3059\u3053\u3099\u3044", "\u3059\u3053\u3057", "\u3059\u3099\u3055\u3093", "\u3059\u3059\u3099\u3057\u3044", "\u3059\u3059\u3080", "\u3059\u3059\u3081\u308B", "\u3059\u3063\u304B\u308A", "\u3059\u3099\u3063\u3057\u308A", "\u3059\u3099\u3063\u3068", "\u3059\u3066\u304D", "\u3059\u3066\u308B", "\u3059\u306D\u308B", "\u3059\u306E\u3053", "\u3059\u306F\u305F\u3099", "\u3059\u306F\u3099\u3089\u3057\u3044", "\u3059\u3099\u3072\u3087\u3046", "\u3059\u3099\u3075\u3099\u306C\u308C", "\u3059\u3075\u3099\u308A", "\u3059\u3075\u308C", "\u3059\u3078\u3099\u3066", "\u3059\u3078\u3099\u308B", "\u3059\u3099\u307B\u3046", "\u3059\u307B\u3099\u3093", "\u3059\u307E\u3044", "\u3059\u3081\u3057", "\u3059\u3082\u3046", "\u3059\u3084\u304D", "\u3059\u3089\u3059\u3089", "\u3059\u308B\u3081", "\u3059\u308C\u3061\u304B\u3099\u3046", "\u3059\u308D\u3063\u3068", "\u3059\u308F\u308B", "\u3059\u3093\u305B\u3099\u3093", "\u3059\u3093\u307B\u309A\u3046", "\u305B\u3042\u3075\u3099\u3089", "\u305B\u3044\u304B\u3064", "\u305B\u3044\u3051\u3099\u3093", "\u305B\u3044\u3057\u3099", "\u305B\u3044\u3088\u3046", "\u305B\u304A\u3046", "\u305B\u304B\u3044\u304B\u3093", "\u305B\u304D\u306B\u3093", "\u305B\u304D\u3080", "\u305B\u304D\u3086", "\u305B\u304D\u3089\u3093\u3046\u3093", "\u305B\u3051\u3093", "\u305B\u3053\u3046", "\u305B\u3059\u3057\u3099", "\u305B\u305F\u3044", "\u305B\u305F\u3051", "\u305B\u3063\u304B\u304F", "\u305B\u3063\u304D\u3083\u304F", "\u305B\u3099\u3063\u304F", "\u305B\u3063\u3051\u3093", "\u305B\u3063\u3053\u3064", "\u305B\u3063\u3055\u305F\u304F\u307E", "\u305B\u3064\u305D\u3099\u304F", "\u305B\u3064\u305F\u3099\u3093", "\u305B\u3064\u3066\u3099\u3093", "\u305B\u3063\u306F\u309A\u3093", "\u305B\u3064\u3072\u3099", "\u305B\u3064\u3075\u3099\u3093", "\u305B\u3064\u3081\u3044", "\u305B\u3064\u308A\u3064", "\u305B\u306A\u304B", "\u305B\u306E\u3072\u3099", "\u305B\u306F\u306F\u3099", "\u305B\u3072\u3099\u308D", "\u305B\u307B\u3099\u306D", "\u305B\u307E\u3044", "\u305B\u307E\u308B", "\u305B\u3081\u308B", "\u305B\u3082\u305F\u308C", "\u305B\u308A\u3075", "\u305B\u3099\u3093\u3042\u304F", "\u305B\u3093\u3044", "\u305B\u3093\u3048\u3044", "\u305B\u3093\u304B", "\u305B\u3093\u304D\u3087", "\u305B\u3093\u304F", "\u305B\u3093\u3051\u3099\u3093", "\u305B\u3099\u3093\u3053\u3099", "\u305B\u3093\u3055\u3044", "\u305B\u3093\u3057\u3085", "\u305B\u3093\u3059\u3044", "\u305B\u3093\u305B\u3044", "\u305B\u3093\u305D\u3099", "\u305B\u3093\u305F\u304F", "\u305B\u3093\u3061\u3087\u3046", "\u305B\u3093\u3066\u3044", "\u305B\u3093\u3068\u3046", "\u305B\u3093\u306C\u304D", "\u305B\u3093\u306D\u3093", "\u305B\u3093\u306F\u309A\u3044", "\u305B\u3099\u3093\u3075\u3099", "\u305B\u3099\u3093\u307B\u309A\u3046", "\u305B\u3093\u3080", "\u305B\u3093\u3081\u3093\u3057\u3099\u3087", "\u305B\u3093\u3082\u3093", "\u305B\u3093\u3084\u304F", "\u305B\u3093\u3086\u3046", "\u305B\u3093\u3088\u3046", "\u305B\u3099\u3093\u3089", "\u305B\u3099\u3093\u308A\u3083\u304F", "\u305B\u3093\u308C\u3044", "\u305B\u3093\u308D", "\u305D\u3042\u304F", "\u305D\u3044\u3068\u3051\u3099\u308B", "\u305D\u3044\u306D", "\u305D\u3046\u304B\u3099\u3093\u304D\u3087\u3046", "\u305D\u3046\u304D", "\u305D\u3046\u3053\u3099", "\u305D\u3046\u3057\u3093", "\u305D\u3046\u305F\u3099\u3093", "\u305D\u3046\u306A\u3093", "\u305D\u3046\u3072\u3099", "\u305D\u3046\u3081\u3093", "\u305D\u3046\u308A", "\u305D\u3048\u3082\u306E", "\u305D\u3048\u3093", "\u305D\u304B\u3099\u3044", "\u305D\u3051\u3099\u304D", "\u305D\u3053\u3046", "\u305D\u3053\u305D\u3053", "\u305D\u3055\u3099\u3044", "\u305D\u3057\u306A", "\u305D\u305B\u3044", "\u305D\u305B\u3093", "\u305D\u305D\u304F\u3099", "\u305D\u305F\u3099\u3066\u308B", "\u305D\u3064\u3046", "\u305D\u3064\u3048\u3093", "\u305D\u3063\u304B\u3093", "\u305D\u3064\u304D\u3099\u3087\u3046", "\u305D\u3063\u3051\u3064", "\u305D\u3063\u3053\u3046", "\u305D\u3063\u305B\u3093", "\u305D\u3063\u3068", "\u305D\u3068\u304B\u3099\u308F", "\u305D\u3068\u3064\u3099\u3089", "\u305D\u306A\u3048\u308B", "\u305D\u306A\u305F", "\u305D\u3075\u307B\u3099", "\u305D\u307B\u3099\u304F", "\u305D\u307B\u3099\u308D", "\u305D\u307E\u3064", "\u305D\u307E\u308B", "\u305D\u3080\u304F", "\u305D\u3080\u308A\u3048", "\u305D\u3081\u308B", "\u305D\u3082\u305D\u3082", "\u305D\u3088\u304B\u305B\u3099", "\u305D\u3089\u307E\u3081", "\u305D\u308D\u3046", "\u305D\u3093\u304B\u3044", "\u305D\u3093\u3051\u3044", "\u305D\u3093\u3055\u3099\u3044", "\u305D\u3093\u3057\u3064", "\u305D\u3093\u305D\u3099\u304F", "\u305D\u3093\u3061\u3087\u3046", "\u305D\u3099\u3093\u3072\u3099", "\u305D\u3099\u3093\u3075\u3099\u3093", "\u305D\u3093\u307F\u3093", "\u305F\u3042\u3044", "\u305F\u3044\u3044\u3093", "\u305F\u3044\u3046\u3093", "\u305F\u3044\u3048\u304D", "\u305F\u3044\u304A\u3046", "\u305F\u3099\u3044\u304B\u3099\u304F", "\u305F\u3044\u304D", "\u305F\u3044\u304F\u3099\u3046", "\u305F\u3044\u3051\u3093", "\u305F\u3044\u3053", "\u305F\u3044\u3055\u3099\u3044", "\u305F\u3099\u3044\u3057\u3099\u3087\u3046\u3075\u3099", "\u305F\u3099\u3044\u3059\u304D", "\u305F\u3044\u305B\u3064", "\u305F\u3044\u305D\u3046", "\u305F\u3099\u3044\u305F\u3044", "\u305F\u3044\u3061\u3087\u3046", "\u305F\u3044\u3066\u3044", "\u305F\u3099\u3044\u3068\u3099\u3053\u308D", "\u305F\u3044\u306A\u3044", "\u305F\u3044\u306D\u3064", "\u305F\u3044\u306E\u3046", "\u305F\u3044\u306F\u3093", "\u305F\u3099\u3044\u3072\u3087\u3046", "\u305F\u3044\u3075\u3046", "\u305F\u3044\u3078\u3093", "\u305F\u3044\u307B", "\u305F\u3044\u307E\u3064\u306F\u3099\u306A", "\u305F\u3044\u307F\u3093\u304F\u3099", "\u305F\u3044\u3080", "\u305F\u3044\u3081\u3093", "\u305F\u3044\u3084\u304D", "\u305F\u3044\u3088\u3046", "\u305F\u3044\u3089", "\u305F\u3044\u308A\u3087\u304F", "\u305F\u3044\u308B", "\u305F\u3044\u308F\u3093", "\u305F\u3046\u3048", "\u305F\u3048\u308B", "\u305F\u304A\u3059", "\u305F\u304A\u308B", "\u305F\u304A\u308C\u308B", "\u305F\u304B\u3044", "\u305F\u304B\u306D", "\u305F\u304D\u3072\u3099", "\u305F\u304F\u3055\u3093", "\u305F\u3053\u304F", "\u305F\u3053\u3084\u304D", "\u305F\u3055\u3044", "\u305F\u3057\u3055\u3099\u3093", "\u305F\u3099\u3057\u3099\u3083\u308C", "\u305F\u3059\u3051\u308B", "\u305F\u3059\u3099\u3055\u308F\u308B", "\u305F\u305D\u304B\u3099\u308C", "\u305F\u305F\u304B\u3046", "\u305F\u305F\u304F", "\u305F\u305F\u3099\u3057\u3044", "\u305F\u305F\u307F", "\u305F\u3061\u306F\u3099\u306A", "\u305F\u3099\u3063\u304B\u3044", "\u305F\u3099\u3063\u304D\u3083\u304F", "\u305F\u3099\u3063\u3053", "\u305F\u3099\u3063\u3057\u3085\u3064", "\u305F\u3099\u3063\u305F\u3044", "\u305F\u3066\u308B", "\u305F\u3068\u3048\u308B", "\u305F\u306A\u306F\u3099\u305F", "\u305F\u306B\u3093", "\u305F\u306C\u304D", "\u305F\u306E\u3057\u307F", "\u305F\u306F\u3064", "\u305F\u3075\u3099\u3093", "\u305F\u3078\u3099\u308B", "\u305F\u307B\u3099\u3046", "\u305F\u307E\u3053\u3099", "\u305F\u307E\u308B", "\u305F\u3099\u3080\u308B", "\u305F\u3081\u3044\u304D", "\u305F\u3081\u3059", "\u305F\u3081\u308B", "\u305F\u3082\u3064", "\u305F\u3084\u3059\u3044", "\u305F\u3088\u308B", "\u305F\u3089\u3059", "\u305F\u308A\u304D\u307B\u3093\u304B\u3099\u3093", "\u305F\u308A\u3087\u3046", "\u305F\u308A\u308B", "\u305F\u308B\u3068", "\u305F\u308C\u308B", "\u305F\u308C\u3093\u3068", "\u305F\u308D\u3063\u3068", "\u305F\u308F\u3080\u308C\u308B", "\u305F\u3099\u3093\u3042\u3064", "\u305F\u3093\u3044", "\u305F\u3093\u304A\u3093", "\u305F\u3093\u304B", "\u305F\u3093\u304D", "\u305F\u3093\u3051\u3093", "\u305F\u3093\u3053\u3099", "\u305F\u3093\u3055\u3093", "\u305F\u3093\u3057\u3099\u3087\u3046\u3072\u3099", "\u305F\u3099\u3093\u305B\u3044", "\u305F\u3093\u305D\u304F", "\u305F\u3093\u305F\u3044", "\u305F\u3099\u3093\u3061", "\u305F\u3093\u3066\u3044", "\u305F\u3093\u3068\u3046", "\u305F\u3099\u3093\u306A", "\u305F\u3093\u306B\u3093", "\u305F\u3099\u3093\u306D\u3064", "\u305F\u3093\u306E\u3046", "\u305F\u3093\u3072\u309A\u3093", "\u305F\u3099\u3093\u307B\u3099\u3046", "\u305F\u3093\u307E\u3064", "\u305F\u3093\u3081\u3044", "\u305F\u3099\u3093\u308C\u3064", "\u305F\u3099\u3093\u308D", "\u305F\u3099\u3093\u308F", "\u3061\u3042\u3044", "\u3061\u3042\u3093", "\u3061\u3044\u304D", "\u3061\u3044\u3055\u3044", "\u3061\u3048\u3093", "\u3061\u304B\u3044", "\u3061\u304B\u3089", "\u3061\u304D\u3085\u3046", "\u3061\u304D\u3093", "\u3061\u3051\u3044\u3059\u3099", "\u3061\u3051\u3093", "\u3061\u3053\u304F", "\u3061\u3055\u3044", "\u3061\u3057\u304D", "\u3061\u3057\u308A\u3087\u3046", "\u3061\u305B\u3044", "\u3061\u305D\u3046", "\u3061\u305F\u3044", "\u3061\u305F\u3093", "\u3061\u3061\u304A\u3084", "\u3061\u3064\u3057\u3099\u3087", "\u3061\u3066\u304D", "\u3061\u3066\u3093", "\u3061\u306C\u304D", "\u3061\u306C\u308A", "\u3061\u306E\u3046", "\u3061\u3072\u3087\u3046", "\u3061\u3078\u3044\u305B\u3093", "\u3061\u307B\u3046", "\u3061\u307E\u305F", "\u3061\u307F\u3064", "\u3061\u307F\u3068\u3099\u308D", "\u3061\u3081\u3044\u3068\u3099", "\u3061\u3083\u3093\u3053\u306A\u3078\u3099", "\u3061\u3085\u3046\u3044", "\u3061\u3086\u308A\u3087\u304F", "\u3061\u3087\u3046\u3057", "\u3061\u3087\u3055\u304F\u3051\u3093", "\u3061\u3089\u3057", "\u3061\u3089\u307F", "\u3061\u308A\u304B\u3099\u307F", "\u3061\u308A\u3087\u3046", "\u3061\u308B\u3068\u3099", "\u3061\u308F\u308F", "\u3061\u3093\u305F\u3044", "\u3061\u3093\u3082\u304F", "\u3064\u3044\u304B", "\u3064\u3044\u305F\u3061", "\u3064\u3046\u304B", "\u3064\u3046\u3057\u3099\u3087\u3046", "\u3064\u3046\u306F\u3093", "\u3064\u3046\u308F", "\u3064\u304B\u3046", "\u3064\u304B\u308C\u308B", "\u3064\u304F\u306D", "\u3064\u304F\u308B", "\u3064\u3051\u306D", "\u3064\u3051\u308B", "\u3064\u3053\u3099\u3046", "\u3064\u305F\u3048\u308B", "\u3064\u3064\u3099\u304F", "\u3064\u3064\u3057\u3099", "\u3064\u3064\u3080", "\u3064\u3068\u3081\u308B", "\u3064\u306A\u304B\u3099\u308B", "\u3064\u306A\u307F", "\u3064\u306D\u3064\u3099\u306D", "\u3064\u306E\u308B", "\u3064\u3075\u3099\u3059", "\u3064\u307E\u3089\u306A\u3044", "\u3064\u307E\u308B", "\u3064\u307F\u304D", "\u3064\u3081\u305F\u3044", "\u3064\u3082\u308A", "\u3064\u3082\u308B", "\u3064\u3088\u3044", "\u3064\u308B\u307B\u3099", "\u3064\u308B\u307F\u304F", "\u3064\u308F\u3082\u306E", "\u3064\u308F\u308A", "\u3066\u3042\u3057", "\u3066\u3042\u3066", "\u3066\u3042\u307F", "\u3066\u3044\u304A\u3093", "\u3066\u3044\u304B", "\u3066\u3044\u304D", "\u3066\u3044\u3051\u3044", "\u3066\u3044\u3053\u304F", "\u3066\u3044\u3055\u3064", "\u3066\u3044\u3057", "\u3066\u3044\u305B\u3044", "\u3066\u3044\u305F\u3044", "\u3066\u3044\u3068\u3099", "\u3066\u3044\u306D\u3044", "\u3066\u3044\u3072\u3087\u3046", "\u3066\u3044\u3078\u3093", "\u3066\u3044\u307B\u3099\u3046", "\u3066\u3046\u3061", "\u3066\u304A\u304F\u308C", "\u3066\u304D\u3068\u3046", "\u3066\u304F\u3072\u3099", "\u3066\u3099\u3053\u307B\u3099\u3053", "\u3066\u3055\u304D\u3099\u3087\u3046", "\u3066\u3055\u3051\u3099", "\u3066\u3059\u308A", "\u3066\u305D\u3046", "\u3066\u3061\u304B\u3099\u3044", "\u3066\u3061\u3087\u3046", "\u3066\u3064\u304B\u3099\u304F", "\u3066\u3064\u3064\u3099\u304D", "\u3066\u3099\u3063\u306F\u309A", "\u3066\u3064\u307B\u3099\u3046", "\u3066\u3064\u3084", "\u3066\u3099\u306C\u304B\u3048", "\u3066\u306C\u304D", "\u3066\u306C\u304F\u3099\u3044", "\u3066\u306E\u3072\u3089", "\u3066\u306F\u3044", "\u3066\u3075\u3099\u304F\u308D", "\u3066\u3075\u305F\u3099", "\u3066\u307B\u3068\u3099\u304D", "\u3066\u307B\u3093", "\u3066\u307E\u3048", "\u3066\u307E\u304D\u3059\u3099\u3057", "\u3066\u307F\u3057\u3099\u304B", "\u3066\u307F\u3084\u3051\u3099", "\u3066\u3089\u3059", "\u3066\u308C\u3072\u3099", "\u3066\u308F\u3051", "\u3066\u308F\u305F\u3057", "\u3066\u3099\u3093\u3042\u3064", "\u3066\u3093\u3044\u3093", "\u3066\u3093\u304B\u3044", "\u3066\u3093\u304D", "\u3066\u3093\u304F\u3099", "\u3066\u3093\u3051\u3093", "\u3066\u3093\u3053\u3099\u304F", "\u3066\u3093\u3055\u3044", "\u3066\u3093\u3057", "\u3066\u3093\u3059\u3046", "\u3066\u3099\u3093\u3061", "\u3066\u3093\u3066\u304D", "\u3066\u3093\u3068\u3046", "\u3066\u3093\u306A\u3044", "\u3066\u3093\u3075\u309A\u3089", "\u3066\u3093\u307B\u3099\u3046\u305F\u3099\u3044", "\u3066\u3093\u3081\u3064", "\u3066\u3093\u3089\u3093\u304B\u3044", "\u3066\u3099\u3093\u308A\u3087\u304F", "\u3066\u3099\u3093\u308F", "\u3068\u3099\u3042\u3044", "\u3068\u3044\u308C", "\u3068\u3099\u3046\u304B\u3093", "\u3068\u3046\u304D\u3085\u3046", "\u3068\u3099\u3046\u304F\u3099", "\u3068\u3046\u3057", "\u3068\u3046\u3080\u304D\u3099", "\u3068\u304A\u3044", "\u3068\u304A\u304B", "\u3068\u304A\u304F", "\u3068\u304A\u3059", "\u3068\u304A\u308B", "\u3068\u304B\u3044", "\u3068\u304B\u3059", "\u3068\u304D\u304A\u308A", "\u3068\u304D\u3068\u3099\u304D", "\u3068\u304F\u3044", "\u3068\u304F\u3057\u3085\u3046", "\u3068\u304F\u3066\u3093", "\u3068\u304F\u306B", "\u3068\u304F\u3078\u3099\u3064", "\u3068\u3051\u3044", "\u3068\u3051\u308B", "\u3068\u3053\u3084", "\u3068\u3055\u304B", "\u3068\u3057\u3087\u304B\u3093", "\u3068\u305D\u3046", "\u3068\u305F\u3093", "\u3068\u3061\u3085\u3046", "\u3068\u3063\u304D\u3085\u3046", "\u3068\u3063\u304F\u3093", "\u3068\u3064\u305B\u3099\u3093", "\u3068\u3064\u306B\u3085\u3046", "\u3068\u3068\u3099\u3051\u308B", "\u3068\u3068\u306E\u3048\u308B", "\u3068\u306A\u3044", "\u3068\u306A\u3048\u308B", "\u3068\u306A\u308A", "\u3068\u306E\u3055\u307E", "\u3068\u306F\u3099\u3059", "\u3068\u3099\u3075\u3099\u304B\u3099\u308F", "\u3068\u307B\u3046", "\u3068\u307E\u308B", "\u3068\u3081\u308B", "\u3068\u3082\u305F\u3099\u3061", "\u3068\u3082\u308B", "\u3068\u3099\u3088\u3046\u3072\u3099", "\u3068\u3089\u3048\u308B", "\u3068\u3093\u304B\u3064", "\u3068\u3099\u3093\u3075\u3099\u308A", "\u306A\u3044\u304B\u304F", "\u306A\u3044\u3053\u3046", "\u306A\u3044\u3057\u3087", "\u306A\u3044\u3059", "\u306A\u3044\u305B\u3093", "\u306A\u3044\u305D\u3046", "\u306A\u304A\u3059", "\u306A\u304B\u3099\u3044", "\u306A\u304F\u3059", "\u306A\u3051\u3099\u308B", "\u306A\u3053\u3046\u3068\u3099", "\u306A\u3055\u3051", "\u306A\u305F\u3066\u3099\u3053\u3053", "\u306A\u3063\u3068\u3046", "\u306A\u3064\u3084\u3059\u307F", "\u306A\u306A\u304A\u3057", "\u306A\u306B\u3053\u3099\u3068", "\u306A\u306B\u3082\u306E", "\u306A\u306B\u308F", "\u306A\u306E\u304B", "\u306A\u3075\u305F\u3099", "\u306A\u307E\u3044\u304D", "\u306A\u307E\u3048", "\u306A\u307E\u307F", "\u306A\u307F\u305F\u3099", "\u306A\u3081\u3089\u304B", "\u306A\u3081\u308B", "\u306A\u3084\u3080", "\u306A\u3089\u3046", "\u306A\u3089\u3072\u3099", "\u306A\u3089\u3075\u3099", "\u306A\u308C\u308B", "\u306A\u308F\u3068\u3072\u3099", "\u306A\u308F\u306F\u3099\u308A", "\u306B\u3042\u3046", "\u306B\u3044\u304B\u3099\u305F", "\u306B\u3046\u3051", "\u306B\u304A\u3044", "\u306B\u304B\u3044", "\u306B\u304B\u3099\u3066", "\u306B\u304D\u3072\u3099", "\u306B\u304F\u3057\u307F", "\u306B\u304F\u307E\u3093", "\u306B\u3051\u3099\u308B", "\u306B\u3055\u3093\u304B\u305F\u3093\u305D", "\u306B\u3057\u304D", "\u306B\u305B\u3082\u306E", "\u306B\u3061\u3057\u3099\u3087\u3046", "\u306B\u3061\u3088\u3046\u3072\u3099", "\u306B\u3063\u304B", "\u306B\u3063\u304D", "\u306B\u3063\u3051\u3044", "\u306B\u3063\u3053\u3046", "\u306B\u3063\u3055\u3093", "\u306B\u3063\u3057\u3087\u304F", "\u306B\u3063\u3059\u3046", "\u306B\u3063\u305B\u304D", "\u306B\u3063\u3066\u3044", "\u306B\u306A\u3046", "\u306B\u307B\u3093", "\u306B\u307E\u3081", "\u306B\u3082\u3064", "\u306B\u3084\u308A", "\u306B\u3085\u3046\u3044\u3093", "\u306B\u308A\u3093\u3057\u3083", "\u306B\u308F\u3068\u308A", "\u306B\u3093\u3044", "\u306B\u3093\u304B", "\u306B\u3093\u304D", "\u306B\u3093\u3051\u3099\u3093", "\u306B\u3093\u3057\u304D", "\u306B\u3093\u3059\u3099\u3046", "\u306B\u3093\u305D\u3046", "\u306B\u3093\u305F\u3044", "\u306B\u3093\u3061", "\u306B\u3093\u3066\u3044", "\u306B\u3093\u306B\u304F", "\u306B\u3093\u3075\u309A", "\u306B\u3093\u307E\u308A", "\u306B\u3093\u3080", "\u306B\u3093\u3081\u3044", "\u306B\u3093\u3088\u3046", "\u306C\u3044\u304F\u304D\u3099", "\u306C\u304B\u3059", "\u306C\u304F\u3099\u3044\u3068\u308B", "\u306C\u304F\u3099\u3046", "\u306C\u304F\u3082\u308A", "\u306C\u3059\u3080", "\u306C\u307E\u3048\u3072\u3099", "\u306C\u3081\u308A", "\u306C\u3089\u3059", "\u306C\u3093\u3061\u3083\u304F", "\u306D\u3042\u3051\u3099", "\u306D\u3044\u304D", "\u306D\u3044\u308B", "\u306D\u3044\u308D", "\u306D\u304F\u3099\u305B", "\u306D\u304F\u305F\u3044", "\u306D\u304F\u3089", "\u306D\u3053\u305B\u3099", "\u306D\u3053\u3080", "\u306D\u3055\u3051\u3099", "\u306D\u3059\u3053\u3099\u3059", "\u306D\u305D\u3078\u3099\u308B", "\u306D\u305F\u3099\u3093", "\u306D\u3064\u3044", "\u306D\u3063\u3057\u3093", "\u306D\u3064\u305D\u3099\u3046", "\u306D\u3063\u305F\u3044\u304D\u3099\u3087", "\u306D\u3075\u3099\u305D\u304F", "\u306D\u3075\u305F\u3099", "\u306D\u307B\u3099\u3046", "\u306D\u307B\u308A\u306F\u307B\u308A", "\u306D\u307E\u304D", "\u306D\u307E\u308F\u3057", "\u306D\u307F\u307F", "\u306D\u3080\u3044", "\u306D\u3080\u305F\u3044", "\u306D\u3082\u3068", "\u306D\u3089\u3046", "\u306D\u308F\u3055\u3099", "\u306D\u3093\u3044\u308A", "\u306D\u3093\u304A\u3057", "\u306D\u3093\u304B\u3093", "\u306D\u3093\u304D\u3093", "\u306D\u3093\u304F\u3099", "\u306D\u3093\u3055\u3099", "\u306D\u3093\u3057", "\u306D\u3093\u3061\u3083\u304F", "\u306D\u3093\u3068\u3099", "\u306D\u3093\u3072\u309A", "\u306D\u3093\u3075\u3099\u3064", "\u306D\u3093\u307E\u3064", "\u306D\u3093\u308A\u3087\u3046", "\u306D\u3093\u308C\u3044", "\u306E\u3044\u3059\u3099", "\u306E\u304A\u3064\u3099\u307E", "\u306E\u304B\u3099\u3059", "\u306E\u304D\u306A\u307F", "\u306E\u3053\u304D\u3099\u308A", "\u306E\u3053\u3059", "\u306E\u3053\u308B", "\u306E\u305B\u308B", "\u306E\u305D\u3099\u304F", "\u306E\u305D\u3099\u3080", "\u306E\u305F\u307E\u3046", "\u306E\u3061\u307B\u3068\u3099", "\u306E\u3063\u304F", "\u306E\u306F\u3099\u3059", "\u306E\u306F\u3089", "\u306E\u3078\u3099\u308B", "\u306E\u307B\u3099\u308B", "\u306E\u307F\u3082\u306E", "\u306E\u3084\u307E", "\u306E\u3089\u3044\u306C", "\u306E\u3089\u306D\u3053", "\u306E\u308A\u3082\u306E", "\u306E\u308A\u3086\u304D", "\u306E\u308C\u3093", "\u306E\u3093\u304D", "\u306F\u3099\u3042\u3044", "\u306F\u3042\u304F", "\u306F\u3099\u3042\u3055\u3093", "\u306F\u3099\u3044\u304B", "\u306F\u3099\u3044\u304F", "\u306F\u3044\u3051\u3093", "\u306F\u3044\u3053\u3099", "\u306F\u3044\u3057\u3093", "\u306F\u3044\u3059\u3044", "\u306F\u3044\u305B\u3093", "\u306F\u3044\u305D\u3046", "\u306F\u3044\u3061", "\u306F\u3099\u3044\u306F\u3099\u3044", "\u306F\u3044\u308C\u3064", "\u306F\u3048\u308B", "\u306F\u304A\u308B", "\u306F\u304B\u3044", "\u306F\u3099\u304B\u308A", "\u306F\u304B\u308B", "\u306F\u304F\u3057\u3085", "\u306F\u3051\u3093", "\u306F\u3053\u3075\u3099", "\u306F\u3055\u307F", "\u306F\u3055\u3093", "\u306F\u3057\u3053\u3099", "\u306F\u3099\u3057\u3087", "\u306F\u3057\u308B", "\u306F\u305B\u308B", "\u306F\u309A\u305D\u3053\u3093", "\u306F\u305D\u3093", "\u306F\u305F\u3093", "\u306F\u3061\u307F\u3064", "\u306F\u3064\u304A\u3093", "\u306F\u3063\u304B\u304F", "\u306F\u3064\u3099\u304D", "\u306F\u3063\u304D\u308A", "\u306F\u3063\u304F\u3064", "\u306F\u3063\u3051\u3093", "\u306F\u3063\u3053\u3046", "\u306F\u3063\u3055\u3093", "\u306F\u3063\u3057\u3093", "\u306F\u3063\u305F\u3064", "\u306F\u3063\u3061\u3085\u3046", "\u306F\u3063\u3066\u3093", "\u306F\u3063\u3072\u309A\u3087\u3046", "\u306F\u3063\u307B\u309A\u3046", "\u306F\u306A\u3059", "\u306F\u306A\u3072\u3099", "\u306F\u306B\u304B\u3080", "\u306F\u3075\u3099\u3089\u3057", "\u306F\u307F\u304B\u3099\u304D", "\u306F\u3080\u304B\u3046", "\u306F\u3081\u3064", "\u306F\u3084\u3044", "\u306F\u3084\u3057", "\u306F\u3089\u3046", "\u306F\u308D\u3046\u3043\u3093", "\u306F\u308F\u3044", "\u306F\u3093\u3044", "\u306F\u3093\u3048\u3044", "\u306F\u3093\u304A\u3093", "\u306F\u3093\u304B\u304F", "\u306F\u3093\u304D\u3087\u3046", "\u306F\u3099\u3093\u304F\u3099\u307F", "\u306F\u3093\u3053", "\u306F\u3093\u3057\u3083", "\u306F\u3093\u3059\u3046", "\u306F\u3093\u305F\u3099\u3093", "\u306F\u309A\u3093\u3061", "\u306F\u309A\u3093\u3064", "\u306F\u3093\u3066\u3044", "\u306F\u3093\u3068\u3057", "\u306F\u3093\u306E\u3046", "\u306F\u3093\u306F\u309A", "\u306F\u3093\u3075\u3099\u3093", "\u306F\u3093\u3078\u309A\u3093", "\u306F\u3093\u307B\u3099\u3046\u304D", "\u306F\u3093\u3081\u3044", "\u306F\u3093\u3089\u3093", "\u306F\u3093\u308D\u3093", "\u3072\u3044\u304D", "\u3072\u3046\u3093", "\u3072\u3048\u308B", "\u3072\u304B\u304F", "\u3072\u304B\u308A", "\u3072\u304B\u308B", "\u3072\u304B\u3093", "\u3072\u304F\u3044", "\u3072\u3051\u3064", "\u3072\u3053\u3046\u304D", "\u3072\u3053\u304F", "\u3072\u3055\u3044", "\u3072\u3055\u3057\u3075\u3099\u308A", "\u3072\u3055\u3093", "\u3072\u3099\u3057\u3099\u3085\u3064\u304B\u3093", "\u3072\u3057\u3087", "\u3072\u305D\u304B", "\u3072\u305D\u3080", "\u3072\u305F\u3080\u304D", "\u3072\u305F\u3099\u308A", "\u3072\u305F\u308B", "\u3072\u3064\u304D\u3099", "\u3072\u3063\u3053\u3057", "\u3072\u3063\u3057", "\u3072\u3064\u3057\u3099\u3085\u3072\u3093", "\u3072\u3063\u3059", "\u3072\u3064\u305B\u3099\u3093", "\u3072\u309A\u3063\u305F\u308A", "\u3072\u309A\u3063\u3061\u308A", "\u3072\u3064\u3088\u3046", "\u3072\u3066\u3044", "\u3072\u3068\u3053\u3099\u307F", "\u3072\u306A\u307E\u3064\u308A", "\u3072\u306A\u3093", "\u3072\u306D\u308B", "\u3072\u306F\u3093", "\u3072\u3072\u3099\u304F", "\u3072\u3072\u3087\u3046", "\u3072\u307B\u3046", "\u3072\u307E\u308F\u308A", "\u3072\u307E\u3093", "\u3072\u307F\u3064", "\u3072\u3081\u3044", "\u3072\u3081\u3057\u3099\u3057", "\u3072\u3084\u3051", "\u3072\u3084\u3059", "\u3072\u3088\u3046", "\u3072\u3099\u3087\u3046\u304D", "\u3072\u3089\u304B\u3099\u306A", "\u3072\u3089\u304F", "\u3072\u308A\u3064", "\u3072\u308A\u3087\u3046", "\u3072\u308B\u307E", "\u3072\u308B\u3084\u3059\u307F", "\u3072\u308C\u3044", "\u3072\u308D\u3044", "\u3072\u308D\u3046", "\u3072\u308D\u304D", "\u3072\u308D\u3086\u304D", "\u3072\u3093\u304B\u304F", "\u3072\u3093\u3051\u3064", "\u3072\u3093\u3053\u3093", "\u3072\u3093\u3057\u3085", "\u3072\u3093\u305D\u3046", "\u3072\u309A\u3093\u3061", "\u3072\u3093\u306F\u309A\u3093", "\u3072\u3099\u3093\u307B\u3099\u3046", "\u3075\u3042\u3093", "\u3075\u3044\u3046\u3061", "\u3075\u3046\u3051\u3044", "\u3075\u3046\u305B\u3093", "\u3075\u309A\u3046\u305F\u308D\u3046", "\u3075\u3046\u3068\u3046", "\u3075\u3046\u3075", "\u3075\u3048\u308B", "\u3075\u304A\u3093", "\u3075\u304B\u3044", "\u3075\u304D\u3093", "\u3075\u304F\u3055\u3099\u3064", "\u3075\u304F\u3075\u3099\u304F\u308D", "\u3075\u3053\u3046", "\u3075\u3055\u3044", "\u3075\u3057\u304D\u3099", "\u3075\u3057\u3099\u307F", "\u3075\u3059\u307E", "\u3075\u305B\u3044", "\u3075\u305B\u304F\u3099", "\u3075\u305D\u304F", "\u3075\u3099\u305F\u306B\u304F", "\u3075\u305F\u3093", "\u3075\u3061\u3087\u3046", "\u3075\u3064\u3046", "\u3075\u3064\u304B", "\u3075\u3063\u304B\u3064", "\u3075\u3063\u304D", "\u3075\u3063\u3053\u304F", "\u3075\u3099\u3068\u3099\u3046", "\u3075\u3068\u308B", "\u3075\u3068\u3093", "\u3075\u306E\u3046", "\u3075\u306F\u3044", "\u3075\u3072\u3087\u3046", "\u3075\u3078\u3093", "\u3075\u307E\u3093", "\u3075\u307F\u3093", "\u3075\u3081\u3064", "\u3075\u3081\u3093", "\u3075\u3088\u3046", "\u3075\u308A\u3053", "\u3075\u308A\u308B", "\u3075\u308B\u3044", "\u3075\u3093\u3044\u304D", "\u3075\u3099\u3093\u304B\u3099\u304F", "\u3075\u3099\u3093\u304F\u3099", "\u3075\u3093\u3057\u3064", "\u3075\u3099\u3093\u305B\u304D", "\u3075\u3093\u305D\u3046", "\u3075\u3099\u3093\u307B\u309A\u3046", "\u3078\u3044\u3042\u3093", "\u3078\u3044\u304A\u3093", "\u3078\u3044\u304B\u3099\u3044", "\u3078\u3044\u304D", "\u3078\u3044\u3051\u3099\u3093", "\u3078\u3044\u3053\u3046", "\u3078\u3044\u3055", "\u3078\u3044\u3057\u3083", "\u3078\u3044\u305B\u3064", "\u3078\u3044\u305D", "\u3078\u3044\u305F\u304F", "\u3078\u3044\u3066\u3093", "\u3078\u3044\u306D\u3064", "\u3078\u3044\u308F", "\u3078\u304D\u304B\u3099", "\u3078\u3053\u3080", "\u3078\u3099\u306B\u3044\u308D", "\u3078\u3099\u306B\u3057\u3087\u3046\u304B\u3099", "\u3078\u3089\u3059", "\u3078\u3093\u304B\u3093", "\u3078\u3099\u3093\u304D\u3087\u3046", "\u3078\u3099\u3093\u3053\u3099\u3057", "\u3078\u3093\u3055\u3044", "\u3078\u3093\u305F\u3044", "\u3078\u3099\u3093\u308A", "\u307B\u3042\u3093", "\u307B\u3044\u304F", "\u307B\u3099\u3046\u304D\u3099\u3087", "\u307B\u3046\u3053\u304F", "\u307B\u3046\u305D\u3046", "\u307B\u3046\u307B\u3046", "\u307B\u3046\u3082\u3093", "\u307B\u3046\u308A\u3064", "\u307B\u3048\u308B", "\u307B\u304A\u3093", "\u307B\u304B\u3093", "\u307B\u304D\u3087\u3046", "\u307B\u3099\u304D\u3093", "\u307B\u304F\u308D", "\u307B\u3051\u3064", "\u307B\u3051\u3093", "\u307B\u3053\u3046", "\u307B\u3053\u308B", "\u307B\u3057\u3044", "\u307B\u3057\u3064", "\u307B\u3057\u3085", "\u307B\u3057\u3087\u3046", "\u307B\u305B\u3044", "\u307B\u305D\u3044", "\u307B\u305D\u304F", "\u307B\u305F\u3066", "\u307B\u305F\u308B", "\u307B\u309A\u3061\u3075\u3099\u304F\u308D", "\u307B\u3063\u304D\u3087\u304F", "\u307B\u3063\u3055", "\u307B\u3063\u305F\u3093", "\u307B\u3068\u3093\u3068\u3099", "\u307B\u3081\u308B", "\u307B\u3093\u3044", "\u307B\u3093\u304D", "\u307B\u3093\u3051", "\u307B\u3093\u3057\u3064", "\u307B\u3093\u3084\u304F", "\u307E\u3044\u306B\u3061", "\u307E\u304B\u3044", "\u307E\u304B\u305B\u308B", "\u307E\u304B\u3099\u308B", "\u307E\u3051\u308B", "\u307E\u3053\u3068", "\u307E\u3055\u3064", "\u307E\u3057\u3099\u3081", "\u307E\u3059\u304F", "\u307E\u305B\u3099\u308B", "\u307E\u3064\u308A", "\u307E\u3068\u3081", "\u307E\u306A\u3075\u3099", "\u307E\u306C\u3051", "\u307E\u306D\u304F", "\u307E\u307B\u3046", "\u307E\u3082\u308B", "\u307E\u3086\u3051\u3099", "\u307E\u3088\u3046", "\u307E\u308D\u3084\u304B", "\u307E\u308F\u3059", "\u307E\u308F\u308A", "\u307E\u308F\u308B", "\u307E\u3093\u304B\u3099", "\u307E\u3093\u304D\u3064", "\u307E\u3093\u305D\u3099\u304F", "\u307E\u3093\u306A\u304B", "\u307F\u3044\u3089", "\u307F\u3046\u3061", "\u307F\u3048\u308B", "\u307F\u304B\u3099\u304F", "\u307F\u304B\u305F", "\u307F\u304B\u3093", "\u307F\u3051\u3093", "\u307F\u3053\u3093", "\u307F\u3057\u3099\u304B\u3044", "\u307F\u3059\u3044", "\u307F\u3059\u3048\u308B", "\u307F\u305B\u308B", "\u307F\u3063\u304B", "\u307F\u3064\u304B\u308B", "\u307F\u3064\u3051\u308B", "\u307F\u3066\u3044", "\u307F\u3068\u3081\u308B", "\u307F\u306A\u3068", "\u307F\u306A\u307F\u304B\u3055\u3044", "\u307F\u306D\u3089\u308B", "\u307F\u306E\u3046", "\u307F\u306E\u304B\u3099\u3059", "\u307F\u307B\u3093", "\u307F\u3082\u3068", "\u307F\u3084\u3051\u3099", "\u307F\u3089\u3044", "\u307F\u308A\u3087\u304F", "\u307F\u308F\u304F", "\u307F\u3093\u304B", "\u307F\u3093\u305D\u3099\u304F", "\u3080\u3044\u304B", "\u3080\u3048\u304D", "\u3080\u3048\u3093", "\u3080\u304B\u3044", "\u3080\u304B\u3046", "\u3080\u304B\u3048", "\u3080\u304B\u3057", "\u3080\u304D\u3099\u3061\u3083", "\u3080\u3051\u308B", "\u3080\u3051\u3099\u3093", "\u3080\u3055\u307B\u3099\u308B", "\u3080\u3057\u3042\u3064\u3044", "\u3080\u3057\u306F\u3099", "\u3080\u3057\u3099\u3085\u3093", "\u3080\u3057\u308D", "\u3080\u3059\u3046", "\u3080\u3059\u3053", "\u3080\u3059\u3075\u3099", "\u3080\u3059\u3081", "\u3080\u305B\u308B", "\u3080\u305B\u3093", "\u3080\u3061\u3085\u3046", "\u3080\u306A\u3057\u3044", "\u3080\u306E\u3046", "\u3080\u3084\u307F", "\u3080\u3088\u3046", "\u3080\u3089\u3055\u304D", "\u3080\u308A\u3087\u3046", "\u3080\u308D\u3093", "\u3081\u3044\u3042\u3093", "\u3081\u3044\u3046\u3093", "\u3081\u3044\u3048\u3093", "\u3081\u3044\u304B\u304F", "\u3081\u3044\u304D\u3087\u304F", "\u3081\u3044\u3055\u3044", "\u3081\u3044\u3057", "\u3081\u3044\u305D\u3046", "\u3081\u3044\u3075\u3099\u3064", "\u3081\u3044\u308C\u3044", "\u3081\u3044\u308F\u304F", "\u3081\u304F\u3099\u307E\u308C\u308B", "\u3081\u3055\u3099\u3059", "\u3081\u3057\u305F", "\u3081\u3059\u3099\u3089\u3057\u3044", "\u3081\u305F\u3099\u3064", "\u3081\u307E\u3044", "\u3081\u3084\u3059", "\u3081\u3093\u304D\u3087", "\u3081\u3093\u305B\u304D", "\u3081\u3093\u3068\u3099\u3046", "\u3082\u3046\u3057\u3042\u3051\u3099\u308B", "\u3082\u3046\u3068\u3099\u3046\u3051\u3093", "\u3082\u3048\u308B", "\u3082\u304F\u3057", "\u3082\u304F\u3066\u304D", "\u3082\u304F\u3088\u3046\u3072\u3099", "\u3082\u3061\u308D\u3093", "\u3082\u3068\u3099\u308B", "\u3082\u3089\u3046", "\u3082\u3093\u304F", "\u3082\u3093\u305F\u3099\u3044", "\u3084\u304A\u3084", "\u3084\u3051\u308B", "\u3084\u3055\u3044", "\u3084\u3055\u3057\u3044", "\u3084\u3059\u3044", "\u3084\u3059\u305F\u308D\u3046", "\u3084\u3059\u307F", "\u3084\u305B\u308B", "\u3084\u305D\u3046", "\u3084\u305F\u3044", "\u3084\u3061\u3093", "\u3084\u3063\u3068", "\u3084\u3063\u306F\u309A\u308A", "\u3084\u3075\u3099\u308B", "\u3084\u3081\u308B", "\u3084\u3084\u3053\u3057\u3044", "\u3084\u3088\u3044", "\u3084\u308F\u3089\u304B\u3044", "\u3086\u3046\u304D", "\u3086\u3046\u3072\u3099\u3093\u304D\u3087\u304F", "\u3086\u3046\u3078\u3099", "\u3086\u3046\u3081\u3044", "\u3086\u3051\u3064", "\u3086\u3057\u3085\u3064", "\u3086\u305B\u3093", "\u3086\u305D\u3046", "\u3086\u305F\u304B", "\u3086\u3061\u3083\u304F", "\u3086\u3066\u3099\u308B", "\u3086\u306B\u3085\u3046", "\u3086\u3072\u3099\u308F", "\u3086\u3089\u3044", "\u3086\u308C\u308B", "\u3088\u3046\u3044", "\u3088\u3046\u304B", "\u3088\u3046\u304D\u3085\u3046", "\u3088\u3046\u3057\u3099", "\u3088\u3046\u3059", "\u3088\u3046\u3061\u3048\u3093", "\u3088\u304B\u305B\u3099", "\u3088\u304B\u3093", "\u3088\u304D\u3093", "\u3088\u304F\u305B\u3044", "\u3088\u304F\u307B\u3099\u3046", "\u3088\u3051\u3044", "\u3088\u3053\u3099\u308C\u308B", "\u3088\u3055\u3093", "\u3088\u3057\u3085\u3046", "\u3088\u305D\u3046", "\u3088\u305D\u304F", "\u3088\u3063\u304B", "\u3088\u3066\u3044", "\u3088\u3068\u3099\u304B\u3099\u308F\u304F", "\u3088\u306D\u3064", "\u3088\u3084\u304F", "\u3088\u3086\u3046", "\u3088\u308D\u3053\u3075\u3099", "\u3088\u308D\u3057\u3044", "\u3089\u3044\u3046", "\u3089\u304F\u304B\u3099\u304D", "\u3089\u304F\u3053\u3099", "\u3089\u304F\u3055\u3064", "\u3089\u304F\u305F\u3099", "\u3089\u3057\u3093\u306F\u3099\u3093", "\u3089\u305B\u3093", "\u3089\u305D\u3099\u304F", "\u3089\u305F\u3044", "\u3089\u3063\u304B", "\u3089\u308C\u3064", "\u308A\u3048\u304D", "\u308A\u304B\u3044", "\u308A\u304D\u3055\u304F", "\u308A\u304D\u305B\u3064", "\u308A\u304F\u304F\u3099\u3093", "\u308A\u304F\u3064", "\u308A\u3051\u3093", "\u308A\u3053\u3046", "\u308A\u305B\u3044", "\u308A\u305D\u3046", "\u308A\u305D\u304F", "\u308A\u3066\u3093", "\u308A\u306D\u3093", "\u308A\u3086\u3046", "\u308A\u3085\u3046\u304B\u3099\u304F", "\u308A\u3088\u3046", "\u308A\u3087\u3046\u308A", "\u308A\u3087\u304B\u3093", "\u308A\u3087\u304F\u3061\u3083", "\u308A\u3087\u3053\u3046", "\u308A\u308A\u304F", "\u308A\u308C\u304D", "\u308A\u308D\u3093", "\u308A\u3093\u3053\u3099", "\u308B\u3044\u3051\u3044", "\u308B\u3044\u3055\u3044", "\u308B\u3044\u3057\u3099", "\u308B\u3044\u305B\u304D", "\u308B\u3059\u306F\u3099\u3093", "\u308B\u308A\u304B\u3099\u308F\u3089", "\u308C\u3044\u304B\u3093", "\u308C\u3044\u304D\u3099", "\u308C\u3044\u305B\u3044", "\u308C\u3044\u305D\u3099\u3046\u3053", "\u308C\u3044\u3068\u3046", "\u308C\u3044\u307B\u3099\u3046", "\u308C\u304D\u3057", "\u308C\u304D\u305F\u3099\u3044", "\u308C\u3093\u3042\u3044", "\u308C\u3093\u3051\u3044", "\u308C\u3093\u3053\u3093", "\u308C\u3093\u3055\u3044", "\u308C\u3093\u3057\u3085\u3046", "\u308C\u3093\u305D\u3099\u304F", "\u308C\u3093\u3089\u304F", "\u308D\u3046\u304B", "\u308D\u3046\u3053\u3099", "\u308D\u3046\u3057\u3099\u3093", "\u308D\u3046\u305D\u304F", "\u308D\u304F\u304B\u3099", "\u308D\u3053\u3064", "\u308D\u3057\u3099\u3046\u3089", "\u308D\u3057\u3085\u3064", "\u308D\u305B\u3093", "\u308D\u3066\u3093", "\u308D\u3081\u3093", "\u308D\u308C\u3064", "\u308D\u3093\u304D\u3099", "\u308D\u3093\u306F\u309A", "\u308D\u3093\u3075\u3099\u3093", "\u308D\u3093\u308A", "\u308F\u304B\u3059", "\u308F\u304B\u3081", "\u308F\u304B\u3084\u307E", "\u308F\u304B\u308C\u308B", "\u308F\u3057\u3064", "\u308F\u3057\u3099\u307E\u3057", "\u308F\u3059\u308C\u3082\u306E", "\u308F\u3089\u3046", "\u308F\u308C\u308B"];
}
});
// node_modules/bip39-mnemonic/wordlist/korean.json
var require_korean = __commonJS({
"node_modules/bip39-mnemonic/wordlist/korean.json"(exports2, module2) {
module2.exports = ["\u1100\u1161\u1100\u1167\u11A8", "\u1100\u1161\u1101\u1173\u11B7", "\u1100\u1161\u1102\u1161\u11AB", "\u1100\u1161\u1102\u1173\u11BC", "\u1100\u1161\u1103\u1173\u11A8", "\u1100\u1161\u1105\u1173\u110E\u1175\u11B7", "\u1100\u1161\u1106\u116E\u11B7", "\u1100\u1161\u1107\u1161\u11BC", "\u1100\u1161\u1109\u1161\u11BC", "\u1100\u1161\u1109\u1173\u11B7", "\u1100\u1161\u110B\u116E\u11AB\u1103\u1166", "\u1100\u1161\u110B\u1173\u11AF", "\u1100\u1161\u110B\u1175\u1103\u1173", "\u1100\u1161\u110B\u1175\u11B8", "\u1100\u1161\u110C\u1161\u11BC", "\u1100\u1161\u110C\u1165\u11BC", "\u1100\u1161\u110C\u1169\u11A8", "\u1100\u1161\u110C\u116E\u11A8", "\u1100\u1161\u11A8\u110B\u1169", "\u1100\u1161\u11A8\u110C\u1161", "\u1100\u1161\u11AB\u1100\u1167\u11A8", "\u1100\u1161\u11AB\u1107\u116E", "\u1100\u1161\u11AB\u1109\u1165\u11B8", "\u1100\u1161\u11AB\u110C\u1161\u11BC", "\u1100\u1161\u11AB\u110C\u1165\u11B8", "\u1100\u1161\u11AB\u1111\u1161\u11AB", "\u1100\u1161\u11AF\u1103\u1173\u11BC", "\u1100\u1161\u11AF\u1107\u1175", "\u1100\u1161\u11AF\u1109\u1162\u11A8", "\u1100\u1161\u11AF\u110C\u1173\u11BC", "\u1100\u1161\u11B7\u1100\u1161\u11A8", "\u1100\u1161\u11B7\u1100\u1175", "\u1100\u1161\u11B7\u1109\u1169", "\u1100\u1161\u11B7\u1109\u116E\u1109\u1165\u11BC", "\u1100\u1161\u11B7\u110C\u1161", "\u1100\u1161\u11B7\u110C\u1165\u11BC", "\u1100\u1161\u11B8\u110C\u1161\u1100\u1175", "\u1100\u1161\u11BC\u1102\u1161\u11B7", "\u1100\u1161\u11BC\u1103\u1161\u11BC", "\u1100\u1161\u11BC\u1103\u1169", "\u1100\u1161\u11BC\u1105\u1167\u11A8\u1112\u1175", "\u1100\u1161\u11BC\u1107\u1167\u11AB", "\u1100\u1161\u11BC\u1107\u116E\u11A8", "\u1100\u1161\u11BC\u1109\u1161", "\u1100\u1161\u11BC\u1109\u116E\u1105\u1163\u11BC", "\u1100\u1161\u11BC\u110B\u1161\u110C\u1175", "\u1100\u1161\u11BC\u110B\u116F\u11AB\u1103\u1169", "\u1100\u1161\u11BC\u110B\u1174", "\u1100\u1161\u11BC\u110C\u1166", "\u1100\u1161\u11BC\u110C\u1169", "\u1100\u1161\u11C0\u110B\u1175", "\u1100\u1162\u1100\u116E\u1105\u1175", "\u1100\u1162\u1102\u1161\u1105\u1175", "\u1100\u1162\u1107\u1161\u11BC", "\u1100\u1162\u1107\u1167\u11AF", "\u1100\u1162\u1109\u1165\u11AB", "\u1100\u1162\u1109\u1165\u11BC", "\u1100\u1162\u110B\u1175\u11AB", "\u1100\u1162\u11A8\u1100\u116A\u11AB\u110C\u1165\u11A8", "\u1100\u1165\u1109\u1175\u11AF", "\u1100\u1165\u110B\u1162\u11A8", "\u1100\u1165\u110B\u116E\u11AF", "\u1100\u1165\u110C\u1175\u11BA", "\u1100\u1165\u1111\u116E\u11B7", "\u1100\u1165\u11A8\u110C\u1165\u11BC", "\u1100\u1165\u11AB\u1100\u1161\u11BC", "\u1100\u1165\u11AB\u1106\u116E\u11AF", "\u1100\u1165\u11AB\u1109\u1165\u11AF", "\u1100\u1165\u11AB\u110C\u1169", "\u1100\u1165\u11AB\u110E\u116E\u11A8", "\u1100\u1165\u11AF\u110B\u1173\u11B7", "\u1100\u1165\u11B7\u1109\u1161", "\u1100\u1165\u11B7\u1110\u1169", "\u1100\u1166\u1109\u1175\u1111\u1161\u11AB", "\u1100\u1166\u110B\u1175\u11B7", "\u1100\u1167\u110B\u116E\u11AF", "\u1100\u1167\u11AB\u1112\u1162", "\u1100\u1167\u11AF\u1100\u116A", "\u1100\u1167\u11AF\u1100\u116E\u11A8", "\u1100\u1167\u11AF\u1105\u1169\u11AB", "\u1100\u1167\u11AF\u1109\u1165\u11A8", "\u1100\u1167\u11AF\u1109\u1173\u11BC", "\u1100\u1167\u11AF\u1109\u1175\u11B7", "\u1100\u1167\u11AF\u110C\u1165\u11BC", "\u1100\u1167\u11AF\u1112\u1169\u11AB", "\u1100\u1167\u11BC\u1100\u1168", "\u1100\u1167\u11BC\u1100\u1169", "\u1100\u1167\u11BC\u1100\u1175", "\u1100\u1167\u11BC\u1105\u1167\u11A8", "\u1100\u1167\u11BC\u1107\u1169\u11A8\u1100\u116E\u11BC", "\u1100\u1167\u11BC\u1107\u1175", "\u1100\u1167\u11BC\u1109\u1161\u11BC\u1103\u1169", "\u1100\u1167\u11BC\u110B\u1167\u11BC", "\u1100\u1167\u11BC\u110B\u116E", "\u1100\u1167\u11BC\u110C\u1162\u11BC", "\u1100\u1167\u11BC\u110C\u1166", "\u1100\u1167\u11BC\u110C\u116E", "\u1100\u1167\u11BC\u110E\u1161\u11AF", "\u1100\u1167\u11BC\u110E\u1175", "\u1100\u1167\u11BC\u1112\u1163\u11BC", "\u1100\u1167\u11BC\u1112\u1165\u11B7", "\u1100\u1168\u1100\u1169\u11A8", "\u1100\u1168\u1103\u1161\u11AB", "\u1100\u1168\u1105\u1161\u11AB", "\u1100\u1168\u1109\u1161\u11AB", "\u1100\u1168\u1109\u1169\u11A8", "\u1100\u1168\u110B\u1163\u11A8", "\u1100\u1168\u110C\u1165\u11AF", "\u1100\u1168\u110E\u1173\u11BC", "\u1100\u1168\u1112\u116C\u11A8", "\u1100\u1169\u1100\u1162\u11A8", "\u1100\u1169\u1100\u116E\u1105\u1167", "\u1100\u1169\u1100\u116E\u11BC", "\u1100\u1169\u1100\u1173\u11B8", "\u1100\u1169\u1103\u1173\u11BC\u1112\u1161\u11A8\u1109\u1162\u11BC", "\u1100\u1169\u1106\u116E\u1109\u1175\u11AB", "\u1100\u1169\u1106\u1175\u11AB", "\u1100\u1169\u110B\u1163\u11BC\u110B\u1175", "\u1100\u1169\u110C\u1161\u11BC", "\u1100\u1169\u110C\u1165\u11AB", "\u1100\u1169\u110C\u1175\u11B8", "\u1100\u1169\u110E\u116E\u11BA\u1100\u1161\u1105\u116E", "\u1100\u1169\u1110\u1169\u11BC", "\u1100\u1169\u1112\u1163\u11BC", "\u1100\u1169\u11A8\u1109\u1175\u11A8", "\u1100\u1169\u11AF\u1106\u1169\u11A8", "\u1100\u1169\u11AF\u110D\u1161\u1100\u1175", "\u1100\u1169\u11AF\u1111\u1173", "\u1100\u1169\u11BC\u1100\u1161\u11AB", "\u1100\u1169\u11BC\u1100\u1162", "\u1100\u1169\u11BC\u1100\u1167\u11A8", "\u1100\u1169\u11BC\u1100\u116E\u11AB", "\u1100\u1169\u11BC\u1100\u1173\u11B8", "\u1100\u1169\u11BC\u1100\u1175", "\u1100\u1169\u11BC\u1103\u1169\u11BC", "\u1100\u1169\u11BC\u1106\u116E\u110B\u116F\u11AB", "\u1100\u1169\u11BC\u1107\u116E", "\u1100\u1169\u11BC\u1109\u1161", "\u1100\u1169\u11BC\u1109\u1175\u11A8", "\u1100\u1169\u11BC\u110B\u1165\u11B8", "\u1100\u1169\u11BC\u110B\u1167\u11AB", "\u1100\u1169\u11BC\u110B\u116F\u11AB", "\u1100\u1169\u11BC\u110C\u1161\u11BC", "\u1100\u1169\u11BC\u110D\u1161", "\u1100\u1169\u11BC\u110E\u1162\u11A8", "\u1100\u1169\u11BC\u1110\u1169\u11BC", "\u1100\u1169\u11BC\u1111\u1169", "\u1100\u1169\u11BC\u1112\u1161\u11BC", "\u1100\u1169\u11BC\u1112\u1172\u110B\u1175\u11AF", "\u1100\u116A\u1106\u1169\u11A8", "\u1100\u116A\u110B\u1175\u11AF", "\u1100\u116A\u110C\u1161\u11BC", "\u1100\u116A\u110C\u1165\u11BC", "\u1100\u116A\u1112\u1161\u11A8", "\u1100\u116A\u11AB\u1100\u1162\u11A8", "\u1100\u116A\u11AB\u1100\u1168", "\u1100\u116A\u11AB\u1100\u116A\u11BC", "\u1100\u116A\u11AB\u1102\u1167\u11B7", "\u1100\u116A\u11AB\u1105\u1161\u11B7", "\u1100\u116A\u11AB\u1105\u1167\u11AB", "\u1100\u116A\u11AB\u1105\u1175", "\u1100\u116A\u11AB\u1109\u1173\u11B8", "\u1100\u116A\u11AB\u1109\u1175\u11B7", "\u1100\u116A\u11AB\u110C\u1165\u11B7", "\u1100\u116A\u11AB\u110E\u1161\u11AF", "\u1100\u116A\u11BC\u1100\u1167\u11BC", "\u1100\u116A\u11BC\u1100\u1169", "\u1100\u116A\u11BC\u110C\u1161\u11BC", "\u1100\u116A\u11BC\u110C\u116E", "\u1100\u116C\u1105\u1169\u110B\u116E\u11B7", "\u1100\u116C\u11BC\u110C\u1161\u11BC\u1112\u1175", "\u1100\u116D\u1100\u116A\u1109\u1165", "\u1100\u116D\u1106\u116E\u11AB", "\u1100\u116D\u1107\u1169\u11A8", "\u1100\u116D\u1109\u1175\u11AF", "\u1100\u116D\u110B\u1163\u11BC", "\u1100\u116D\u110B\u1172\u11A8", "\u1100\u116D\u110C\u1161\u11BC", "\u1100\u116D\u110C\u1175\u11A8", "\u1100\u116D\u1110\u1169\u11BC", "\u1100\u116D\u1112\u116A\u11AB", "\u1100\u116D\u1112\u116E\u11AB", "\u1100\u116E\u1100\u1167\u11BC", "\u1100\u116E\u1105\u1173\u11B7", "\u1100\u116E\u1106\u1165\u11BC", "\u1100\u116E\u1107\u1167\u11AF", "\u1100\u116E\u1107\u116E\u11AB", "\u1100\u116E\u1109\u1165\u11A8", "\u1100\u116E\u1109\u1165\u11BC", "\u1100\u116E\u1109\u1169\u11A8", "\u1100\u116E\u110B\u1167\u11A8", "\u1100\u116E\u110B\u1175\u11B8", "\u1100\u116E\u110E\u1165\u11BC", "\u1100\u116E\u110E\u1166\u110C\u1165\u11A8", "\u1100\u116E\u11A8\u1100\u1161", "\u1100\u116E\u11A8\u1100\u1175", "\u1100\u116E\u11A8\u1102\u1162", "\u1100\u116E\u11A8\u1105\u1175\u11B8", "\u1100\u116E\u11A8\u1106\u116E\u11AF", "\u1100\u116E\u11A8\u1106\u1175\u11AB", "\u1100\u116E\u11A8\u1109\u116E", "\u1100\u116E\u11A8\u110B\u1165", "\u1100\u116E\u11A8\u110B\u116A\u11BC", "\u1100\u116E\u11A8\u110C\u1165\u11A8", "\u1100\u116E\u11A8\u110C\u1166", "\u1100\u116E\u11A8\u1112\u116C", "\u1100\u116E\u11AB\u1103\u1162", "\u1100\u116E\u11AB\u1109\u1161", "\u1100\u116E\u11AB\u110B\u1175\u11AB", "\u1100\u116E\u11BC\u1100\u1173\u11A8\u110C\u1165\u11A8", "\u1100\u116F\u11AB\u1105\u1175", "\u1100\u116F\u11AB\u110B\u1171", "\u1100\u116F\u11AB\u1110\u116E", "\u1100\u1171\u1100\u116E\u11A8", "\u1100\u1171\u1109\u1175\u11AB", "\u1100\u1172\u110C\u1165\u11BC", "\u1100\u1172\u110E\u1175\u11A8", "\u1100\u1172\u11AB\u1112\u1167\u11BC", "\u1100\u1173\u1102\u1161\u11AF", "\u1100\u1173\u1102\u1163\u11BC", "\u1100\u1173\u1102\u1173\u11AF", "\u1100\u1173\u1105\u1165\u1102\u1161", "\u1100\u1173\u1105\u116E\u11B8", "\u1100\u1173\u1105\u1173\u11BA", "\u1100\u1173\u1105\u1175\u11B7", "\u1100\u1173\u110C\u1166\u1109\u1165\u110B\u1163", "\u1100\u1173\u1110\u1169\u1105\u1169\u11A8", "\u1100\u1173\u11A8\u1107\u1169\u11A8", "\u1100\u1173\u11A8\u1112\u1175", "\u1100\u1173\u11AB\u1100\u1165", "\u1100\u1173\u11AB\u1100\u116D", "\u1100\u1173\u11AB\u1105\u1162", "\u1100\u1173\u11AB\u1105\u1169", "\u1100\u1173\u11AB\u1106\u116E", "\u1100\u1173\u11AB\u1107\u1169\u11AB", "\u1100\u1173\u11AB\u110B\u116F\u11AB", "\u1100\u1173\u11AB\u110B\u1172\u11A8", "\u1100\u1173\u11AB\u110E\u1165", "\u1100\u1173\u11AF\u110A\u1175", "\u1100\u1173\u11AF\u110C\u1161", "\u1100\u1173\u11B7\u1100\u1161\u11BC\u1109\u1161\u11AB", "\u1100\u1173\u11B7\u1100\u1169", "\u1100\u1173\u11B7\u1102\u1167\u11AB", "\u1100\u1173\u11B7\u1106\u1166\u1103\u1161\u11AF", "\u1100\u1173\u11B7\u110B\u1162\u11A8", "\u1100\u1173\u11B7\u110B\u1167\u11AB", "\u1100\u1173\u11B7\u110B\u116D\u110B\u1175\u11AF", "\u1100\u1173\u11B7\u110C\u1175", "\u1100\u1173\u11BC\u110C\u1165\u11BC\u110C\u1165\u11A8", "\u1100\u1175\u1100\u1161\u11AB", "\u1100\u1175\u1100\u116A\u11AB", "\u1100\u1175\u1102\u1167\u11B7", "\u1100\u1175\u1102\u1173\u11BC", "\u1100\u1175\u1103\u1169\u11A8\u1100\u116D", "\u1100\u1175\u1103\u116E\u11BC", "\u1100\u1175\u1105\u1169\u11A8", "\u1100\u1175\u1105\u1173\u11B7", "\u1100\u1175\u1107\u1165\u11B8", "\u1100\u1175\u1107\u1169\u11AB", "\u1100\u1175\u1107\u116E\u11AB", "\u1100\u1175\u1108\u1173\u11B7", "\u1100\u1175\u1109\u116E\u11A8\u1109\u1161", "\u1100\u1175\u1109\u116E\u11AF", "\u1100\u1175\u110B\u1165\u11A8", "\u1100\u1175\u110B\u1165\u11B8", "\u1100\u1175\u110B\u1169\u11AB", "\u1100\u1175\u110B\u116E\u11AB", "\u1100\u1175\u110B\u116F\u11AB", "\u1100\u1175\u110C\u1165\u11A8", "\u1100\u1175\u110C\u116E\u11AB", "\u1100\u1175\u110E\u1175\u11B7", "\u1100\u1175\u1112\u1169\u11AB", "\u1100\u1175\u1112\u116C\u11A8", "\u1100\u1175\u11AB\u1100\u1173\u11B8", "\u1100\u1175\u11AB\u110C\u1161\u11BC", "\u1100\u1175\u11AF\u110B\u1175", "\u1100\u1175\u11B7\u1107\u1161\u11B8", "\u1100\u1175\u11B7\u110E\u1175", "\u1100\u1175\u11B7\u1111\u1169\u1100\u1169\u11BC\u1112\u1161\u11BC", "\u1101\u1161\u11A8\u1103\u116E\u1100\u1175", "\u1101\u1161\u11B7\u1108\u1161\u11A8", "\u1101\u1162\u1103\u1161\u11AF\u110B\u1173\u11B7", "\u1101\u1162\u1109\u1169\u1100\u1173\u11B7", "\u1101\u1165\u11B8\u110C\u1175\u11AF", "\u1101\u1169\u11A8\u1103\u1162\u1100\u1175", "\u1101\u1169\u11BE\u110B\u1175\u11C1", "\u1102\u1161\u1103\u1173\u11AF\u110B\u1175", "\u1102\u1161\u1105\u1161\u11AB\u1112\u1175", "\u1102\u1161\u1106\u1165\u110C\u1175", "\u1102\u1161\u1106\u116E\u11AF", "\u1102\u1161\u110E\u1175\u11B7\u1107\u1161\u11AB", "\u1102\u1161\u1112\u1173\u11AF", "\u1102\u1161\u11A8\u110B\u1167\u11B8", "\u1102\u1161\u11AB\u1107\u1161\u11BC", "\u1102\u1161\u11AF\u1100\u1162", "\u1102\u1161\u11AF\u110A\u1175", "\u1102\u1161\u11AF\u110D\u1161", "\u1102\u1161\u11B7\u1102\u1167", "\u1102\u1161\u11B7\u1103\u1162\u1106\u116E\u11AB", "\u1102\u1161\u11B7\u1106\u1162", "\u1102\u1161\u11B7\u1109\u1161\u11AB", "\u1102\u1161\u11B7\u110C\u1161", "\u1102\u1161\u11B7\u1111\u1167\u11AB", "\u1102\u1161\u11B7\u1112\u1161\u11A8\u1109\u1162\u11BC", "\u1102\u1161\u11BC\u1107\u1175", "\u1102\u1161\u11C0\u1106\u1161\u11AF", "\u1102\u1162\u1102\u1167\u11AB", "\u1102\u1162\u110B\u116D\u11BC", "\u1102\u1162\u110B\u1175\u11AF", "\u1102\u1162\u11B7\u1107\u1175", "\u1102\u1162\u11B7\u1109\u1162", "\u1102\u1162\u11BA\u1106\u116E\u11AF", "\u1102\u1162\u11BC\u1103\u1169\u11BC", "\u1102\u1162\u11BC\u1106\u1167\u11AB", "\u1102\u1162\u11BC\u1107\u1161\u11BC", "\u1102\u1162\u11BC\u110C\u1161\u11BC\u1100\u1169", "\u1102\u1166\u11A8\u1110\u1161\u110B\u1175", "\u1102\u1166\u11BA\u110D\u1162", "\u1102\u1169\u1103\u1169\u11BC", "\u1102\u1169\u1105\u1161\u11AB\u1109\u1162\u11A8", "\u1102\u1169\u1105\u1167\u11A8", "\u1102\u1169\u110B\u1175\u11AB", "\u1102\u1169\u11A8\u110B\u1173\u11B7", "\u1102\u1169\u11A8\u110E\u1161", "\u1102\u1169\u11A8\u1112\u116A", "\u1102\u1169\u11AB\u1105\u1175", "\u1102\u1169\u11AB\u1106\u116E\u11AB", "\u1102\u1169\u11AB\u110C\u1162\u11BC", "\u1102\u1169\u11AF\u110B\u1175", "\u1102\u1169\u11BC\u1100\u116E", "\u1102\u1169\u11BC\u1103\u1161\u11B7", "\u1102\u1169\u11BC\u1106\u1175\u11AB", "\u1102\u1169\u11BC\u1107\u116E", "\u1102\u1169\u11BC\u110B\u1165\u11B8", "\u1102\u1169\u11BC\u110C\u1161\u11BC", "\u1102\u1169\u11BC\u110E\u1169\u11AB", "\u1102\u1169\u11C1\u110B\u1175", "\u1102\u116E\u11AB\u1103\u1169\u11BC\u110C\u1161", "\u1102\u116E\u11AB\u1106\u116E\u11AF", "\u1102\u116E\u11AB\u110A\u1165\u11B8", "\u1102\u1172\u110B\u116D\u11A8", "\u1102\u1173\u1101\u1175\u11B7", "\u1102\u1173\u11A8\u1103\u1162", "\u1102\u1173\u11BC\u1103\u1169\u11BC\u110C\u1165\u11A8", "\u1102\u1173\u11BC\u1105\u1167\u11A8", "\u1103\u1161\u1107\u1161\u11BC", "\u1103\u1161\u110B\u1163\u11BC\u1109\u1165\u11BC", "\u1103\u1161\u110B\u1173\u11B7", "\u1103\u1161\u110B\u1175\u110B\u1165\u1110\u1173", "\u1103\u1161\u1112\u1162\u11BC", "\u1103\u1161\u11AB\u1100\u1168", "\u1103\u1161\u11AB\u1100\u1169\u11AF", "\u1103\u1161\u11AB\u1103\u1169\u11A8", "\u1103\u1161\u11AB\u1106\u1161\u11BA", "\u1103\u1161\u11AB\u1109\u116E\u11AB", "\u1103\u1161\u11AB\u110B\u1165", "\u1103\u1161\u11AB\u110B\u1171", "\u1103\u1161\u11AB\u110C\u1165\u11B7", "\u1103\u1161\u11AB\u110E\u1166", "\u1103\u1161\u11AB\u110E\u116E", "\u1103\u1161\u11AB\u1111\u1167\u11AB", "\u1103\u1161\u11AB\u1111\u116E\u11BC", "\u1103\u1161\u11AF\u1100\u1163\u11AF", "\u1103\u1161\u11AF\u1105\u1165", "\u1103\u1161\u11AF\u1105\u1167\u11A8", "\u1103\u1161\u11AF\u1105\u1175", "\u1103\u1161\u11B0\u1100\u1169\u1100\u1175", "\u1103\u1161\u11B7\u1103\u1161\u11BC", "\u1103\u1161\u11B7\u1107\u1162", "\u1103\u1161\u11B7\u110B\u116D", "\u1103\u1161\u11B7\u110B\u1175\u11B7", "\u1103\u1161\u11B8\u1107\u1167\u11AB", "\u1103\u1161\u11B8\u110C\u1161\u11BC", "\u1103\u1161\u11BC\u1100\u1173\u11AB", "\u1103\u1161\u11BC\u1107\u116E\u11AB\u1100\u1161\u11AB", "\u1103\u1161\u11BC\u110B\u1167\u11AB\u1112\u1175", "\u1103\u1161\u11BC\u110C\u1161\u11BC", "\u1103\u1162\u1100\u1172\u1106\u1169", "\u1103\u1162\u1102\u1161\u11BD", "\u1103\u1162\u1103\u1161\u11AB\u1112\u1175", "\u1103\u1162\u1103\u1161\u11B8", "\u1103\u1162\u1103\u1169\u1109\u1175", "\u1103\u1162\u1105\u1163\u11A8", "\u1103\u1162\u1105\u1163\u11BC", "\u1103\u1162\u1105\u1172\u11A8", "\u1103\u1162\u1106\u116E\u11AB", "\u1103\u1162\u1107\u116E\u1107\u116E\u11AB", "\u1103\u1162\u1109\u1175\u11AB", "\u1103\u1162\u110B\u1173\u11BC", "\u1103\u1162\u110C\u1161\u11BC", "\u1103\u1162\u110C\u1165\u11AB", "\u1103\u1162\u110C\u1165\u11B8", "\u1103\u1162\u110C\u116E\u11BC", "\u1103\u1162\u110E\u1162\u11A8", "\u1103\u1162\u110E\u116E\u11AF", "\u1103\u1162\u110E\u116E\u11BC", "\u1103\u1162\u1110\u1169\u11BC\u1105\u1167\u11BC", "\u1103\u1162\u1112\u1161\u11A8", "\u1103\u1162\u1112\u1161\u11AB\u1106\u1175\u11AB\u1100\u116E\u11A8", "\u1103\u1162\u1112\u1161\u11B8\u1109\u1175\u11AF", "\u1103\u1162\u1112\u1167\u11BC", "\u1103\u1165\u11BC\u110B\u1165\u1105\u1175", "\u1103\u1166\u110B\u1175\u1110\u1173", "\u1103\u1169\u1103\u1162\u110E\u1166", "\u1103\u1169\u1103\u1165\u11A8", "\u1103\u1169\u1103\u116E\u11A8", "\u1103\u1169\u1106\u1161\u11BC", "\u1103\u1169\u1109\u1165\u1100\u116A\u11AB", "\u1103\u1169\u1109\u1175\u11B7", "\u1103\u1169\u110B\u116E\u11B7", "\u1103\u1169\u110B\u1175\u11B8", "\u1103\u1169\u110C\u1161\u1100\u1175", "\u1103\u1169\u110C\u1165\u1112\u1175", "\u1103\u1169\u110C\u1165\u11AB", "\u1103\u1169\u110C\u116E\u11BC", "\u1103\u1169\u110E\u1161\u11A8", "\u1103\u1169\u11A8\u1100\u1161\u11B7", "\u1103\u1169\u11A8\u1105\u1175\u11B8", "\u1103\u1169\u11A8\u1109\u1165", "\u1103\u1169\u11A8\u110B\u1175\u11AF", "\u1103\u1169\u11A8\u110E\u1161\u11BC\u110C\u1165\u11A8", "\u1103\u1169\u11BC\u1112\u116A\u110E\u1162\u11A8", "\u1103\u1171\u11BA\u1106\u1169\u1109\u1173\u11B8", "\u1103\u1171\u11BA\u1109\u1161\u11AB", "\u1104\u1161\u11AF\u110B\u1161\u110B\u1175", "\u1106\u1161\u1102\u116E\u1105\u1161", "\u1106\u1161\u1102\u1173\u11AF", "\u1106\u1161\u1103\u1161\u11BC", "\u1106\u1161\u1105\u1161\u1110\u1169\u11AB", "\u1106\u1161\u1105\u1167\u11AB", "\u1106\u1161\u1106\u116E\u1105\u1175", "\u1106\u1161\u1109\u1161\u110C\u1175", "\u1106\u1161\u110B\u1163\u11A8", "\u1106\u1161\u110B\u116D\u1102\u1166\u110C\u1173", "\u1106\u1161\u110B\u1173\u11AF", "\u1106\u1161\u110B\u1173\u11B7", "\u1106\u1161\u110B\u1175\u110F\u1173", "\u1106\u1161\u110C\u116E\u11BC", "\u1106\u1161\u110C\u1175\u1106\u1161\u11A8", "\u1106\u1161\u110E\u1161\u11AB\u1100\u1161\u110C\u1175", "\u1106\u1161\u110E\u1161\u11AF", "\u1106\u1161\u1112\u1173\u11AB", "\u1106\u1161\u11A8\u1100\u1165\u11AF\u1105\u1175", "\u1106\u1161\u11A8\u1102\u1162", "\u1106\u1161\u11A8\u1109\u1161\u11BC", "\u1106\u1161\u11AB\u1102\u1161\u11B7", "\u1106\u1161\u11AB\u1103\u116E", "\u1106\u1161\u11AB\u1109\u1166", "\u1106\u1161\u11AB\u110B\u1163\u11A8", "\u1106\u1161\u11AB\u110B\u1175\u11AF", "\u1106\u1161\u11AB\u110C\u1165\u11B7", "\u1106\u1161\u11AB\u110C\u1169\u11A8", "\u1106\u1161\u11AB\u1112\u116A", "\u1106\u1161\u11AD\u110B\u1175", "\u1106\u1161\u11AF\u1100\u1175", "\u1106\u1161\u11AF\u110A\u1173\u11B7", "\u1106\u1161\u11AF\u1110\u116E", "\u1106\u1161\u11B7\u1103\u1162\u1105\u1169", "\u1106\u1161\u11BC\u110B\u116F\u11AB\u1100\u1167\u11BC", "\u1106\u1162\u1102\u1167\u11AB", "\u1106\u1162\u1103\u1161\u11AF", "\u1106\u1162\u1105\u1167\u11A8", "\u1106\u1162\u1107\u1165\u11AB", "\u1106\u1162\u1109\u1173\u110F\u1165\u11B7", "\u1106\u1162\u110B\u1175\u11AF", "\u1106\u1162\u110C\u1161\u11BC", "\u1106\u1162\u11A8\u110C\u116E", "\u1106\u1165\u11A8\u110B\u1175", "\u1106\u1165\u11AB\u110C\u1165", "\u1106\u1165\u11AB\u110C\u1175", "\u1106\u1165\u11AF\u1105\u1175", "\u1106\u1166\u110B\u1175\u11AF", "\u1106\u1167\u1102\u1173\u1105\u1175", "\u1106\u1167\u110E\u1175\u11AF", "\u1106\u1167\u11AB\u1103\u1161\u11B7", "\u1106\u1167\u11AF\u110E\u1175", "\u1106\u1167\u11BC\u1103\u1161\u11AB", "\u1106\u1167\u11BC\u1105\u1167\u11BC", "\u1106\u1167\u11BC\u110B\u1168", "\u1106\u1167\u11BC\u110B\u1174", "\u1106\u1167\u11BC\u110C\u1165\u11AF", "\u1106\u1167\u11BC\u110E\u1175\u11BC", "\u1106\u1167\u11BC\u1112\u1161\u11B7", "\u1106\u1169\u1100\u1173\u11B7", "\u1106\u1169\u1102\u1175\u1110\u1165", "\u1106\u1169\u1103\u1166\u11AF", "\u1106\u1169\u1103\u1173\u11AB", "\u1106\u1169\u1107\u1165\u11B7", "\u1106\u1169\u1109\u1173\u11B8", "\u1106\u1169\u110B\u1163\u11BC", "\u1106\u1169\u110B\u1175\u11B7", "\u1106\u1169\u110C\u1169\u1105\u1175", "\u1106\u1169\u110C\u1175\u11B8", "\u1106\u1169\u1110\u116E\u11BC\u110B\u1175", "\u1106\u1169\u11A8\u1100\u1165\u11AF\u110B\u1175", "\u1106\u1169\u11A8\u1105\u1169\u11A8", "\u1106\u1169\u11A8\u1109\u1161", "\u1106\u1169\u11A8\u1109\u1169\u1105\u1175", "\u1106\u1169\u11A8\u1109\u116E\u11B7", "\u1106\u1169\u11A8\u110C\u1165\u11A8", "\u1106\u1169\u11A8\u1111\u116D", "\u1106\u1169\u11AF\u1105\u1162", "\u1106\u1169\u11B7\u1106\u1162", "\u1106\u1169\u11B7\u1106\u116E\u1100\u1166", "\u1106\u1169\u11B7\u1109\u1161\u11AF", "\u1106\u1169\u11B7\u1109\u1169\u11A8", "\u1106\u1169\u11B7\u110C\u1175\u11BA", "\u1106\u1169\u11B7\u1110\u1169\u11BC", "\u1106\u1169\u11B8\u1109\u1175", "\u1106\u116E\u1100\u116A\u11AB\u1109\u1175\u11B7", "\u1106\u116E\u1100\u116E\u11BC\u1112\u116A", "\u1106\u116E\u1103\u1165\u110B\u1171", "\u1106\u116E\u1103\u1165\u11B7", "\u1106\u116E\u1105\u1173\u11C1", "\u1106\u116E\u1109\u1173\u11AB", "\u1106\u116E\u110B\u1165\u11BA", "\u1106\u116E\u110B\u1167\u11A8", "\u1106\u116E\u110B\u116D\u11BC", "\u1106\u116E\u110C\u1169\u1100\u1165\u11AB", "\u1106\u116E\u110C\u1175\u1100\u1162", "\u1106\u116E\u110E\u1165\u11A8", "\u1106\u116E\u11AB\u1100\u116E", "\u1106\u116E\u11AB\u1103\u1173\u11A8", "\u1106\u116E\u11AB\u1107\u1165\u11B8", "\u1106\u116E\u11AB\u1109\u1165", "\u1106\u116E\u11AB\u110C\u1166", "\u1106\u116E\u11AB\u1112\u1161\u11A8", "\u1106\u116E\u11AB\u1112\u116A", "\u1106\u116E\u11AF\u1100\u1161", "\u1106\u116E\u11AF\u1100\u1165\u11AB", "\u1106\u116E\u11AF\u1100\u1167\u11AF", "\u1106\u116E\u11AF\u1100\u1169\u1100\u1175", "\u1106\u116E\u11AF\u1105\u1169\u11AB", "\u1106\u116E\u11AF\u1105\u1175\u1112\u1161\u11A8", "\u1106\u116E\u11AF\u110B\u1173\u11B7", "\u1106\u116E\u11AF\u110C\u1175\u11AF", "\u1106\u116E\u11AF\u110E\u1166", "\u1106\u1175\u1100\u116E\u11A8", "\u1106\u1175\u1103\u1175\u110B\u1165", "\u1106\u1175\u1109\u1161\u110B\u1175\u11AF", "\u1106\u1175\u1109\u116E\u11AF", "\u1106\u1175\u110B\u1167\u11A8", "\u1106\u1175\u110B\u116D\u11BC\u1109\u1175\u11AF", "\u1106\u1175\u110B\u116E\u11B7", "\u1106\u1175\u110B\u1175\u11AB", "\u1106\u1175\u1110\u1175\u11BC", "\u1106\u1175\u1112\u1169\u11AB", "\u1106\u1175\u11AB\u1100\u1161\u11AB", "\u1106\u1175\u11AB\u110C\u1169\u11A8", "\u1106\u1175\u11AB\u110C\u116E", "\u1106\u1175\u11AE\u110B\u1173\u11B7", "\u1106\u1175\u11AF\u1100\u1161\u1105\u116E", "\u1106\u1175\u11AF\u1105\u1175\u1106\u1175\u1110\u1165", "\u1106\u1175\u11C0\u1107\u1161\u1103\u1161\u11A8", "\u1107\u1161\u1100\u1161\u110C\u1175", "\u1107\u1161\u1100\u116E\u1102\u1175", "\u1107\u1161\u1102\u1161\u1102\u1161", "\u1107\u1161\u1102\u1173\u11AF", "\u1107\u1161\u1103\u1161\u11A8", "\u1107\u1161\u1103\u1161\u11BA\u1100\u1161", "\u1107\u1161\u1105\u1161\u11B7", "\u1107\u1161\u110B\u1175\u1105\u1165\u1109\u1173", "\u1107\u1161\u1110\u1161\u11BC", "\u1107\u1161\u11A8\u1106\u116E\u11AF\u1100\u116A\u11AB", "\u1107\u1161\u11A8\u1109\u1161", "\u1107\u1161\u11A8\u1109\u116E", "\u1107\u1161\u11AB\u1103\u1162", "\u1107\u1161\u11AB\u1103\u1173\u1109\u1175", "\u1107\u1161\u11AB\u1106\u1161\u11AF", "\u1107\u1161\u11AB\u1107\u1161\u11AF", "\u1107\u1161\u11AB\u1109\u1165\u11BC", "\u1107\u1161\u11AB\u110B\u1173\u11BC", "\u1107\u1161\u11AB\u110C\u1161\u11BC", "\u1107\u1161\u11AB\u110C\u116E\u11A8", "\u1107\u1161\u11AB\u110C\u1175", "\u1107\u1161\u11AB\u110E\u1161\u11AB", "\u1107\u1161\u11AE\u110E\u1175\u11B7", "\u1107\u1161\u11AF\u1100\u1161\u1105\u1161\u11A8", "\u1107\u1161\u11AF\u1100\u1165\u11AF\u110B\u1173\u11B7", "\u1107\u1161\u11AF\u1100\u1167\u11AB", "\u1107\u1161\u11AF\u1103\u1161\u11AF", "\u1107\u1161\u11AF\u1105\u1166", "\u1107\u1161\u11AF\u1106\u1169\u11A8", "\u1107\u1161\u11AF\u1107\u1161\u1103\u1161\u11A8", "\u1107\u1161\u11AF\u1109\u1162\u11BC", "\u1107\u1161\u11AF\u110B\u1173\u11B7", "\u1107\u1161\u11AF\u110C\u1161\u1100\u116E\u11A8", "\u1107\u1161\u11AF\u110C\u1165\u11AB", "\u1107\u1161\u11AF\u1110\u1169\u11B8", "\u1107\u1161\u11AF\u1111\u116D", "\u1107\u1161\u11B7\u1112\u1161\u1102\u1173\u11AF", "\u1107\u1161\u11B8\u1100\u1173\u1105\u1173\u11BA", "\u1107\u1161\u11B8\u1106\u1161\u11BA", "\u1107\u1161\u11B8\u1109\u1161\u11BC", "\u1107\u1161\u11B8\u1109\u1169\u11C0", "\u1107\u1161\u11BC\u1100\u1173\u11B7", "\u1107\u1161\u11BC\u1106\u1167\u11AB", "\u1107\u1161\u11BC\u1106\u116E\u11AB", "\u1107\u1161\u11BC\u1107\u1161\u1103\u1161\u11A8", "\u1107\u1161\u11BC\u1107\u1165\u11B8", "\u1107\u1161\u11BC\u1109\u1169\u11BC", "\u1107\u1161\u11BC\u1109\u1175\u11A8", "\u1107\u1161\u11BC\u110B\u1161\u11AB", "\u1107\u1161\u11BC\u110B\u116E\u11AF", "\u1107\u1161\u11BC\u110C\u1175", "\u1107\u1161\u11BC\u1112\u1161\u11A8", "\u1107\u1161\u11BC\u1112\u1162", "\u1107\u1161\u11BC\u1112\u1163\u11BC", "\u1107\u1162\u1100\u1167\u11BC", "\u1107\u1162\u1101\u1169\u11B8", "\u1107\u1162\u1103\u1161\u11AF", "\u1107\u1162\u1103\u1173\u1106\u1175\u11AB\u1110\u1165\u11AB", "\u1107\u1162\u11A8\u1103\u116E\u1109\u1161\u11AB", "\u1107\u1162\u11A8\u1109\u1162\u11A8", "\u1107\u1162\u11A8\u1109\u1165\u11BC", "\u1107\u1162\u11A8\u110B\u1175\u11AB", "\u1107\u1162\u11A8\u110C\u1166", "\u1107\u1162\u11A8\u1112\u116A\u110C\u1165\u11B7", "\u1107\u1165\u1105\u1173\u11BA", "\u1107\u1165\u1109\u1165\u11BA", "\u1107\u1165\u1110\u1173\u11AB", "\u1107\u1165\u11AB\u1100\u1162", "\u1107\u1165\u11AB\u110B\u1167\u11A8", "\u1107\u1165\u11AB\u110C\u1175", "\u1107\u1165\u11AB\u1112\u1169", "\u1107\u1165\u11AF\u1100\u1173\u11B7", "\u1107\u1165\u11AF\u1105\u1166", "\u1107\u1165\u11AF\u110A\u1165", "\u1107\u1165\u11B7\u110B\u1171", "\u1107\u1165\u11B7\u110B\u1175\u11AB", "\u1107\u1165\u11B7\u110C\u116C", "\u1107\u1165\u11B8\u1105\u1172\u11AF", "\u1107\u1165\u11B8\u110B\u116F\u11AB", "\u1107\u1165\u11B8\u110C\u1165\u11A8", "\u1107\u1165\u11B8\u110E\u1175\u11A8", "\u1107\u1166\u110B\u1175\u110C\u1175\u11BC", "\u1107\u1166\u11AF\u1110\u1173", "\u1107\u1167\u11AB\u1100\u1167\u11BC", "\u1107\u1167\u11AB\u1103\u1169\u11BC", "\u1107\u1167\u11AB\u1106\u1167\u11BC", "\u1107\u1167\u11AB\u1109\u1175\u11AB", "\u1107\u1167\u11AB\u1112\u1169\u1109\u1161", "\u1107\u1167\u11AB\u1112\u116A", "\u1107\u1167\u11AF\u1103\u1169", "\u1107\u1167\u11AF\u1106\u1167\u11BC", "\u1107\u1167\u11AF\u110B\u1175\u11AF", "\u1107\u1167\u11BC\u1109\u1175\u11AF", "\u1107\u1167\u11BC\u110B\u1161\u1105\u1175", "\u1107\u1167\u11BC\u110B\u116F\u11AB", "\u1107\u1169\u1100\u116A\u11AB", "\u1107\u1169\u1102\u1165\u1109\u1173", "\u1107\u1169\u1105\u1161\u1109\u1162\u11A8", "\u1107\u1169\u1105\u1161\u11B7", "\u1107\u1169\u1105\u1173\u11B7", "\u1107\u1169\u1109\u1161\u11BC", "\u1107\u1169\u110B\u1161\u11AB", "\u1107\u1169\u110C\u1161\u1100\u1175", "\u1107\u1169\u110C\u1161\u11BC", "\u1107\u1169\u110C\u1165\u11AB", "\u1107\u1169\u110C\u1169\u11AB", "\u1107\u1169\u1110\u1169\u11BC", "\u1107\u1169\u1111\u1167\u11AB\u110C\u1165\u11A8", "\u1107\u1169\u1112\u1165\u11B7", "\u1107\u1169\u11A8\u1103\u1169", "\u1107\u1169\u11A8\u1109\u1161", "\u1107\u1169\u11A8\u1109\u116E\u11BC\u110B\u1161", "\u1107\u1169\u11A8\u1109\u1173\u11B8", "\u1107\u1169\u11A9\u110B\u1173\u11B7", "\u1107\u1169\u11AB\u1100\u1167\u11A8\u110C\u1165\u11A8", "\u1107\u1169\u11AB\u1105\u1162", "\u1107\u1169\u11AB\u1107\u116E", "\u1107\u1169\u11AB\u1109\u1161", "\u1107\u1169\u11AB\u1109\u1165\u11BC", "\u1107\u1169\u11AB\u110B\u1175\u11AB", "\u1107\u1169\u11AB\u110C\u1175\u11AF", "\u1107\u1169\u11AF\u1111\u1166\u11AB", "\u1107\u1169\u11BC\u1109\u1161", "\u1107\u1169\u11BC\u110C\u1175", "\u1107\u1169\u11BC\u1110\u116E", "\u1107\u116E\u1100\u1173\u11AB", "\u1107\u116E\u1101\u1173\u1105\u1165\u110B\u116E\u11B7", "\u1107\u116E\u1103\u1161\u11B7", "\u1107\u116E\u1103\u1169\u11BC\u1109\u1161\u11AB", "\u1107\u116E\u1106\u116E\u11AB", "\u1107\u116E\u1107\u116E\u11AB", "\u1107\u116E\u1109\u1161\u11AB", "\u1107\u116E\u1109\u1161\u11BC", "\u1107\u116E\u110B\u1165\u11BF", "\u1107\u116E\u110B\u1175\u11AB", "\u1107\u116E\u110C\u1161\u11A8\u110B\u116D\u11BC", "\u1107\u116E\u110C\u1161\u11BC", "\u1107\u116E\u110C\u1165\u11BC", "\u1107\u116E\u110C\u1169\u11A8", "\u1107\u116E\u110C\u1175\u1105\u1165\u11AB\u1112\u1175", "\u1107\u116E\u110E\u1175\u11AB", "\u1107\u116E\u1110\u1161\u11A8", "\u1107\u116E\u1111\u116E\u11B7", "\u1107\u116E\u1112\u116C\u110C\u1161\u11BC", "\u1107\u116E\u11A8\u1107\u116E", "\u1107\u116E\u11A8\u1112\u1161\u11AB", "\u1107\u116E\u11AB\u1102\u1169", "\u1107\u116E\u11AB\u1105\u1163\u11BC", "\u1107\u116E\u11AB\u1105\u1175", "\u1107\u116E\u11AB\u1106\u1167\u11BC", "\u1107\u116E\u11AB\u1109\u1165\u11A8", "\u1107\u116E\u11AB\u110B\u1163", "\u1107\u116E\u11AB\u110B\u1171\u1100\u1175", "\u1107\u116E\u11AB\u1111\u1175\u11AF", "\u1107\u116E\u11AB\u1112\u1169\u11BC\u1109\u1162\u11A8", "\u1107\u116E\u11AF\u1100\u1169\u1100\u1175", "\u1107\u116E\u11AF\u1100\u116A", "\u1107\u116E\u11AF\u1100\u116D", "\u1107\u116E\u11AF\u1101\u1169\u11BE", "\u1107\u116E\u11AF\u1106\u1161\u11AB", "\u1107\u116E\u11AF\u1107\u1165\u11B8", "\u1107\u116E\u11AF\u1107\u1175\u11BE", "\u1107\u116E\u11AF\u110B\u1161\u11AB", "\u1107\u116E\u11AF\u110B\u1175\u110B\u1175\u11A8", "\u1107\u116E\u11AF\u1112\u1162\u11BC", "\u1107\u1173\u1105\u1162\u11AB\u1103\u1173", "\u1107\u1175\u1100\u1173\u11A8", "\u1107\u1175\u1102\u1161\u11AB", "\u1107\u1175\u1102\u1175\u11AF", "\u1107\u1175\u1103\u116E\u11AF\u1100\u1175", "\u1107\u1175\u1103\u1175\u110B\u1169", "\u1107\u1175\u1105\u1169\u1109\u1169", "\u1107\u1175\u1106\u1161\u11AB", "\u1107\u1175\u1106\u1167\u11BC", "\u1107\u1175\u1106\u1175\u11AF", "\u1107\u1175\u1107\u1161\u1105\u1161\u11B7", "\u1107\u1175\u1107\u1175\u11B7\u1107\u1161\u11B8", "\u1107\u1175\u1109\u1161\u11BC", "\u1107\u1175\u110B\u116D\u11BC", "\u1107\u1175\u110B\u1172\u11AF", "\u1107\u1175\u110C\u116E\u11BC", "\u1107\u1175\u1110\u1161\u1106\u1175\u11AB", "\u1107\u1175\u1111\u1161\u11AB", "\u1107\u1175\u11AF\u1103\u1175\u11BC", "\u1107\u1175\u11BA\u1106\u116E\u11AF", "\u1107\u1175\u11BA\u1107\u1161\u11BC\u110B\u116E\u11AF", "\u1107\u1175\u11BA\u110C\u116E\u11AF\u1100\u1175", "\u1107\u1175\u11BE\u1101\u1161\u11AF", "\u1108\u1161\u11AF\u1100\u1161\u11AB\u1109\u1162\u11A8", "\u1108\u1161\u11AF\u1105\u1162", "\u1108\u1161\u11AF\u1105\u1175", "\u1109\u1161\u1100\u1165\u11AB", "\u1109\u1161\u1100\u1168\u110C\u1165\u11AF", "\u1109\u1161\u1102\u1161\u110B\u1175", "\u1109\u1161\u1102\u1163\u11BC", "\u1109\u1161\u1105\u1161\u11B7", "\u1109\u1161\u1105\u1161\u11BC", "\u1109\u1161\u1105\u1175\u11B8", "\u1109\u1161\u1106\u1169\u1102\u1175\u11B7", "\u1109\u1161\u1106\u116E\u11AF", "\u1109\u1161\u1107\u1161\u11BC", "\u1109\u1161\u1109\u1161\u11BC", "\u1109\u1161\u1109\u1162\u11BC\u1112\u116A\u11AF", "\u1109\u1161\u1109\u1165\u11AF", "\u1109\u1161\u1109\u1173\u11B7", "\u1109\u1161\u1109\u1175\u11AF", "\u1109\u1161\u110B\u1165\u11B8", "\u1109\u1161\u110B\u116D\u11BC", "\u1109\u1161\u110B\u116F\u11AF", "\u1109\u1161\u110C\u1161\u11BC", "\u1109\u1161\u110C\u1165\u11AB", "\u1109\u1161\u110C\u1175\u11AB", "\u1109\u1161\u110E\u1169\u11AB", "\u1109\u1161\u110E\u116E\u11AB\u1100\u1175", "\u1109\u1161\u1110\u1161\u11BC", "\u1109\u1161\u1110\u116E\u1105\u1175", "\u1109\u1161\u1112\u1173\u11AF", "\u1109\u1161\u11AB\u1100\u1175\u11AF", "\u1109\u1161\u11AB\u1107\u116E\u110B\u1175\u11AB\u1100\u116A", "\u1109\u1161\u11AB\u110B\u1165\u11B8", "\u1109\u1161\u11AB\u110E\u1162\u11A8", "\u1109\u1161\u11AF\u1105\u1175\u11B7", "\u1109\u1161\u11AF\u110B\u1175\u11AB", "\u1109\u1161\u11AF\u110D\u1161\u11A8", "\u1109\u1161\u11B7\u1100\u1168\u1110\u1161\u11BC", "\u1109\u1161\u11B7\u1100\u116E\u11A8", "\u1109\u1161\u11B7\u1109\u1175\u11B8", "\u1109\u1161\u11B7\u110B\u116F\u11AF", "\u1109\u1161\u11B7\u110E\u1169\u11AB", "\u1109\u1161\u11BC\u1100\u116A\u11AB", "\u1109\u1161\u11BC\u1100\u1173\u11B7", "\u1109\u1161\u11BC\u1103\u1162", "\u1109\u1161\u11BC\u1105\u1172", "\u1109\u1161\u11BC\u1107\u1161\u11AB\u1100\u1175", "\u1109\u1161\u11BC\u1109\u1161\u11BC", "\u1109\u1161\u11BC\u1109\u1175\u11A8", "\u1109\u1161\u11BC\u110B\u1165\u11B8", "\u1109\u1161\u11BC\u110B\u1175\u11AB", "\u1109\u1161\u11BC\u110C\u1161", "\u1109\u1161\u11BC\u110C\u1165\u11B7", "\u1109\u1161\u11BC\u110E\u1165", "\u1109\u1161\u11BC\u110E\u116E", "\u1109\u1161\u11BC\u1110\u1162", "\u1109\u1161\u11BC\u1111\u116D", "\u1109\u1161\u11BC\u1111\u116E\u11B7", "\u1109\u1161\u11BC\u1112\u116A\u11BC", "\u1109\u1162\u1107\u1167\u11A8", "\u1109\u1162\u11A8\u1101\u1161\u11AF", "\u1109\u1162\u11A8\u110B\u1167\u11AB\u1111\u1175\u11AF", "\u1109\u1162\u11BC\u1100\u1161\u11A8", "\u1109\u1162\u11BC\u1106\u1167\u11BC", "\u1109\u1162\u11BC\u1106\u116E\u11AF", "\u1109\u1162\u11BC\u1107\u1161\u11BC\u1109\u1169\u11BC", "\u1109\u1162\u11BC\u1109\u1161\u11AB", "\u1109\u1162\u11BC\u1109\u1165\u11AB", "\u1109\u1162\u11BC\u1109\u1175\u11AB", "\u1109\u1162\u11BC\u110B\u1175\u11AF", "\u1109\u1162\u11BC\u1112\u116A\u11AF", "\u1109\u1165\u1105\u1161\u11B8", "\u1109\u1165\u1105\u1173\u11AB", "\u1109\u1165\u1106\u1167\u11BC", "\u1109\u1165\u1106\u1175\u11AB", "\u1109\u1165\u1107\u1175\u1109\u1173", "\u1109\u1165\u110B\u1163\u11BC", "\u1109\u1165\u110B\u116E\u11AF", "\u1109\u1165\u110C\u1165\u11A8", "\u1109\u1165\u110C\u1165\u11B7", "\u1109\u1165\u110D\u1169\u11A8", "\u1109\u1165\u110F\u1173\u11AF", "\u1109\u1165\u11A8\u1109\u1161", "\u1109\u1165\u11A8\u110B\u1172", "\u1109\u1165\u11AB\u1100\u1165", "\u1109\u1165\u11AB\u1106\u116E\u11AF", "\u1109\u1165\u11AB\u1107\u1162", "\u1109\u1165\u11AB\u1109\u1162\u11BC", "\u1109\u1165\u11AB\u1109\u116E", "\u1109\u1165\u11AB\u110B\u116F\u11AB", "\u1109\u1165\u11AB\u110C\u1161\u11BC", "\u1109\u1165\u11AB\u110C\u1165\u11AB", "\u1109\u1165\u11AB\u1110\u1162\u11A8", "\u1109\u1165\u11AB\u1111\u116E\u11BC\u1100\u1175", "\u1109\u1165\u11AF\u1100\u1165\u110C\u1175", "\u1109\u1165\u11AF\u1102\u1161\u11AF", "\u1109\u1165\u11AF\u1105\u1165\u11BC\u1110\u1161\u11BC", "\u1109\u1165\u11AF\u1106\u1167\u11BC", "\u1109\u1165\u11AF\u1106\u116E\u11AB", "\u1109\u1165\u11AF\u1109\u1161", "\u1109\u1165\u11AF\u110B\u1161\u11A8\u1109\u1161\u11AB", "\u1109\u1165\u11AF\u110E\u1175", "\u1109\u1165\u11AF\u1110\u1161\u11BC", "\u1109\u1165\u11B8\u110A\u1175", "\u1109\u1165\u11BC\u1100\u1169\u11BC", "\u1109\u1165\u11BC\u1103\u1161\u11BC", "\u1109\u1165\u11BC\u1106\u1167\u11BC", "\u1109\u1165\u11BC\u1107\u1167\u11AF", "\u1109\u1165\u11BC\u110B\u1175\u11AB", "\u1109\u1165\u11BC\u110C\u1161\u11BC", "\u1109\u1165\u11BC\u110C\u1165\u11A8", "\u1109\u1165\u11BC\u110C\u1175\u11AF", "\u1109\u1165\u11BC\u1112\u1161\u11B7", "\u1109\u1166\u1100\u1173\u11B7", "\u1109\u1166\u1106\u1175\u1102\u1161", "\u1109\u1166\u1109\u1161\u11BC", "\u1109\u1166\u110B\u116F\u11AF", "\u1109\u1166\u110C\u1169\u11BC\u1103\u1162\u110B\u116A\u11BC", "\u1109\u1166\u1110\u1161\u11A8", "\u1109\u1166\u11AB\u1110\u1165", "\u1109\u1166\u11AB\u1110\u1175\u1106\u1175\u1110\u1165", "\u1109\u1166\u11BA\u110D\u1162", "\u1109\u1169\u1100\u1172\u1106\u1169", "\u1109\u1169\u1100\u1173\u11A8\u110C\u1165\u11A8", "\u1109\u1169\u1100\u1173\u11B7", "\u1109\u1169\u1102\u1161\u1100\u1175", "\u1109\u1169\u1102\u1167\u11AB", "\u1109\u1169\u1103\u1173\u11A8", "\u1109\u1169\u1106\u1161\u11BC", "\u1109\u1169\u1106\u116E\u11AB", "\u1109\u1169\u1109\u1165\u11AF", "\u1109\u1169\u1109\u1169\u11A8", "\u1109\u1169\u110B\u1161\u1100\u116A", "\u1109\u1169\u110B\u116D\u11BC", "\u1109\u1169\u110B\u116F\u11AB", "\u1109\u1169\u110B\u1173\u11B7", "\u1109\u1169\u110C\u116E\u11BC\u1112\u1175", "\u1109\u1169\u110C\u1175\u1111\u116E\u11B7", "\u1109\u1169\u110C\u1175\u11AF", "\u1109\u1169\u1111\u116E\u11BC", "\u1109\u1169\u1112\u1167\u11BC", "\u1109\u1169\u11A8\u1103\u1161\u11B7", "\u1109\u1169\u11A8\u1103\u1169", "\u1109\u1169\u11A8\u110B\u1169\u11BA", "\u1109\u1169\u11AB\u1100\u1161\u1105\u1161\u11A8", "\u1109\u1169\u11AB\u1100\u1175\u11AF", "\u1109\u1169\u11AB\u1102\u1167", "\u1109\u1169\u11AB\u1102\u1175\u11B7", "\u1109\u1169\u11AB\u1103\u1173\u11BC", "\u1109\u1169\u11AB\u1106\u1169\u11A8", "\u1109\u1169\u11AB\u1108\u1167\u11A8", "\u1109\u1169\u11AB\u1109\u1175\u11AF", "\u1109\u1169\u11AB\u110C\u1175\u11AF", "\u1109\u1169\u11AB\u1110\u1169\u11B8", "\u1109\u1169\u11AB\u1112\u1162", "\u1109\u1169\u11AF\u110C\u1175\u11A8\u1112\u1175", "\u1109\u1169\u11B7\u110A\u1175", "\u1109\u1169\u11BC\u110B\u1161\u110C\u1175", "\u1109\u1169\u11BC\u110B\u1175", "\u1109\u1169\u11BC\u1111\u1167\u11AB", "\u1109\u116C\u1100\u1169\u1100\u1175", "\u1109\u116D\u1111\u1175\u11BC", "\u1109\u116E\u1100\u1165\u11AB", "\u1109\u116E\u1102\u1167\u11AB", "\u1109\u116E\u1103\u1161\u11AB", "\u1109\u116E\u1103\u1169\u11BA\u1106\u116E\u11AF", "\u1109\u116E\u1103\u1169\u11BC\u110C\u1165\u11A8", "\u1109\u116E\u1106\u1167\u11AB", "\u1109\u116E\u1106\u1167\u11BC", "\u1109\u116E\u1107\u1161\u11A8", "\u1109\u116E\u1109\u1161\u11BC", "\u1109\u116E\u1109\u1165\u11A8", "\u1109\u116E\u1109\u116E\u11AF", "\u1109\u116E\u1109\u1175\u1105\u1169", "\u1109\u116E\u110B\u1165\u11B8", "\u1109\u116E\u110B\u1167\u11B7", "\u1109\u116E\u110B\u1167\u11BC", "\u1109\u116E\u110B\u1175\u11B8", "\u1109\u116E\u110C\u116E\u11AB", "\u1109\u116E\u110C\u1175\u11B8", "\u1109\u116E\u110E\u116E\u11AF", "\u1109\u116E\u110F\u1165\u11BA", "\u1109\u116E\u1111\u1175\u11AF", "\u1109\u116E\u1112\u1161\u11A8", "\u1109\u116E\u1112\u1165\u11B7\u1109\u1162\u11BC", "\u1109\u116E\u1112\u116A\u1100\u1175", "\u1109\u116E\u11A8\u1102\u1167", "\u1109\u116E\u11A8\u1109\u1169", "\u1109\u116E\u11A8\u110C\u1166", "\u1109\u116E\u11AB\u1100\u1161\u11AB", "\u1109\u116E\u11AB\u1109\u1165", "\u1109\u116E\u11AB\u1109\u116E", "\u1109\u116E\u11AB\u1109\u1175\u11A8\u1100\u1161\u11AB", "\u1109\u116E\u11AB\u110B\u1171", "\u1109\u116E\u11AE\u1100\u1161\u1105\u1161\u11A8", "\u1109\u116E\u11AF\u1107\u1167\u11BC", "\u1109\u116E\u11AF\u110C\u1175\u11B8", "\u1109\u116E\u11BA\u110C\u1161", "\u1109\u1173\u1102\u1175\u11B7", "\u1109\u1173\u1106\u116E\u11AF", "\u1109\u1173\u1109\u1173\u1105\u1169", "\u1109\u1173\u1109\u1173\u11BC", "\u1109\u1173\u110B\u1170\u1110\u1165", "\u1109\u1173\u110B\u1171\u110E\u1175", "\u1109\u1173\u110F\u1166\u110B\u1175\u1110\u1173", "\u1109\u1173\u1110\u1172\u1103\u1175\u110B\u1169", "\u1109\u1173\u1110\u1173\u1105\u1166\u1109\u1173", "\u1109\u1173\u1111\u1169\u110E\u1173", "\u1109\u1173\u11AF\u110D\u1165\u11A8", "\u1109\u1173\u11AF\u1111\u1173\u11B7", "\u1109\u1173\u11B8\u1100\u116A\u11AB", "\u1109\u1173\u11B8\u1100\u1175", "\u1109\u1173\u11BC\u1100\u1162\u11A8", "\u1109\u1173\u11BC\u1105\u1175", "\u1109\u1173\u11BC\u1107\u116E", "\u1109\u1173\u11BC\u110B\u116D\u11BC\u110E\u1161", "\u1109\u1173\u11BC\u110C\u1175\u11AB", "\u1109\u1175\u1100\u1161\u11A8", "\u1109\u1175\u1100\u1161\u11AB", "\u1109\u1175\u1100\u1169\u11AF", "\u1109\u1175\u1100\u1173\u11B7\u110E\u1175", "\u1109\u1175\u1102\u1161\u1105\u1175\u110B\u1169", "\u1109\u1175\u1103\u1162\u11A8", "\u1109\u1175\u1105\u1175\u110C\u1173", "\u1109\u1175\u1106\u1166\u11AB\u1110\u1173", "\u1109\u1175\u1106\u1175\u11AB", "\u1109\u1175\u1107\u116E\u1106\u1169", "\u1109\u1175\u1109\u1165\u11AB", "\u1109\u1175\u1109\u1165\u11AF", "\u1109\u1175\u1109\u1173\u1110\u1166\u11B7", "\u1109\u1175\u110B\u1161\u1107\u1165\u110C\u1175", "\u1109\u1175\u110B\u1165\u1106\u1165\u1102\u1175", "\u1109\u1175\u110B\u116F\u11AF", "\u1109\u1175\u110B\u1175\u11AB", "\u1109\u1175\u110B\u1175\u11AF", "\u1109\u1175\u110C\u1161\u11A8", "\u1109\u1175\u110C\u1161\u11BC", "\u1109\u1175\u110C\u1165\u11AF", "\u1109\u1175\u110C\u1165\u11B7", "\u1109\u1175\u110C\u116E\u11BC", "\u1109\u1175\u110C\u1173\u11AB", "\u1109\u1175\u110C\u1175\u11B8", "\u1109\u1175\u110E\u1165\u11BC", "\u1109\u1175\u1112\u1161\u11B8", "\u1109\u1175\u1112\u1165\u11B7", "\u1109\u1175\u11A8\u1100\u116E", "\u1109\u1175\u11A8\u1100\u1175", "\u1109\u1175\u11A8\u1103\u1161\u11BC", "\u1109\u1175\u11A8\u1105\u1163\u11BC", "\u1109\u1175\u11A8\u1105\u116D\u1111\u116E\u11B7", "\u1109\u1175\u11A8\u1106\u116E\u11AF", "\u1109\u1175\u11A8\u1108\u1161\u11BC", "\u1109\u1175\u11A8\u1109\u1161", "\u1109\u1175\u11A8\u1109\u1162\u11BC\u1112\u116A\u11AF", "\u1109\u1175\u11A8\u110E\u1169", "\u1109\u1175\u11A8\u1110\u1161\u11A8", "\u1109\u1175\u11A8\u1111\u116E\u11B7", "\u1109\u1175\u11AB\u1100\u1169", "\u1109\u1175\u11AB\u1100\u1172", "\u1109\u1175\u11AB\u1102\u1167\u11B7", "\u1109\u1175\u11AB\u1106\u116E\u11AB", "\u1109\u1175\u11AB\u1107\u1161\u11AF", "\u1109\u1175\u11AB\u1107\u1175", "\u1109\u1175\u11AB\u1109\u1161", "\u1109\u1175\u11AB\u1109\u1166", "\u1109\u1175\u11AB\u110B\u116D\u11BC", "\u1109\u1175\u11AB\u110C\u1166\u1111\u116E\u11B7", "\u1109\u1175\u11AB\u110E\u1165\u11BC", "\u1109\u1175\u11AB\u110E\u1166", "\u1109\u1175\u11AB\u1112\u116A", "\u1109\u1175\u11AF\u1100\u1161\u11B7", "\u1109\u1175\u11AF\u1102\u1162", "\u1109\u1175\u11AF\u1105\u1167\u11A8", "\u1109\u1175\u11AF\u1105\u1168", "\u1109\u1175\u11AF\u1106\u1161\u11BC", "\u1109\u1175\u11AF\u1109\u116E", "\u1109\u1175\u11AF\u1109\u1173\u11B8", "\u1109\u1175\u11AF\u1109\u1175", "\u1109\u1175\u11AF\u110C\u1161\u11BC", "\u1109\u1175\u11AF\u110C\u1165\u11BC", "\u1109\u1175\u11AF\u110C\u1175\u11AF\u110C\u1165\u11A8", "\u1109\u1175\u11AF\u110E\u1165\u11AB", "\u1109\u1175\u11AF\u110E\u1166", "\u1109\u1175\u11AF\u110F\u1165\u11BA", "\u1109\u1175\u11AF\u1110\u1162", "\u1109\u1175\u11AF\u1111\u1162", "\u1109\u1175\u11AF\u1112\u1165\u11B7", "\u1109\u1175\u11AF\u1112\u1167\u11AB", "\u1109\u1175\u11B7\u1105\u1175", "\u1109\u1175\u11B7\u1107\u116E\u1105\u1173\u11B7", "\u1109\u1175\u11B7\u1109\u1161", "\u1109\u1175\u11B7\u110C\u1161\u11BC", "\u1109\u1175\u11B7\u110C\u1165\u11BC", "\u1109\u1175\u11B7\u1111\u1161\u11AB", "\u110A\u1161\u11BC\u1103\u116E\u11BC\u110B\u1175", "\u110A\u1175\u1105\u1173\u11B7", "\u110A\u1175\u110B\u1161\u11BA", "\u110B\u1161\u1100\u1161\u110A\u1175", "\u110B\u1161\u1102\u1161\u110B\u116E\u11AB\u1109\u1165", "\u110B\u1161\u1103\u1173\u1102\u1175\u11B7", "\u110B\u1161\u1103\u1173\u11AF", "\u110B\u1161\u1109\u1171\u110B\u116E\u11B7", "\u110B\u1161\u1109\u1173\u1111\u1161\u11AF\u1110\u1173", "\u110B\u1161\u1109\u1175\u110B\u1161", "\u110B\u1161\u110B\u116E\u11AF\u1105\u1165", "\u110B\u1161\u110C\u1165\u110A\u1175", "\u110B\u1161\u110C\u116E\u11B7\u1106\u1161", "\u110B\u1161\u110C\u1175\u11A8", "\u110B\u1161\u110E\u1175\u11B7", "\u110B\u1161\u1111\u1161\u1110\u1173", "\u110B\u1161\u1111\u1173\u1105\u1175\u110F\u1161", "\u110B\u1161\u1111\u1173\u11B7", "\u110B\u1161\u1112\u1169\u11B8", "\u110B\u1161\u1112\u1173\u11AB", "\u110B\u1161\u11A8\u1100\u1175", "\u110B\u1161\u11A8\u1106\u1169\u11BC", "\u110B\u1161\u11A8\u1109\u116E", "\u110B\u1161\u11AB\u1100\u1162", "\u110B\u1161\u11AB\u1100\u1167\u11BC", "\u110B\u1161\u11AB\u1100\u116A", "\u110B\u1161\u11AB\u1102\u1162", "\u110B\u1161\u11AB\u1102\u1167\u11BC", "\u110B\u1161\u11AB\u1103\u1169\u11BC", "\u110B\u1161\u11AB\u1107\u1161\u11BC", "\u110B\u1161\u11AB\u1107\u116E", "\u110B\u1161\u11AB\u110C\u116E", "\u110B\u1161\u11AF\u1105\u116E\u1106\u1175\u1102\u1172\u11B7", "\u110B\u1161\u11AF\u110F\u1169\u110B\u1169\u11AF", "\u110B\u1161\u11B7\u1109\u1175", "\u110B\u1161\u11B7\u110F\u1165\u11BA", "\u110B\u1161\u11B8\u1105\u1167\u11A8", "\u110B\u1161\u11C1\u1102\u1161\u11AF", "\u110B\u1161\u11C1\u1106\u116E\u11AB", "\u110B\u1162\u110B\u1175\u11AB", "\u110B\u1162\u110C\u1165\u11BC", "\u110B\u1162\u11A8\u1109\u116E", "\u110B\u1162\u11AF\u1107\u1165\u11B7", "\u110B\u1163\u1100\u1161\u11AB", "\u110B\u1163\u1103\u1161\u11AB", "\u110B\u1163\u110B\u1169\u11BC", "\u110B\u1163\u11A8\u1100\u1161\u11AB", "\u110B\u1163\u11A8\u1100\u116E\u11A8", "\u110B\u1163\u11A8\u1109\u1169\u11A8", "\u110B\u1163\u11A8\u1109\u116E", "\u110B\u1163\u11A8\u110C\u1165\u11B7", "\u110B\u1163\u11A8\u1111\u116E\u11B7", "\u110B\u1163\u11A8\u1112\u1169\u11AB\u1102\u1167", "\u110B\u1163\u11BC\u1102\u1167\u11B7", "\u110B\u1163\u11BC\u1105\u1167\u11A8", "\u110B\u1163\u11BC\u1106\u1161\u11AF", "\u110B\u1163\u11BC\u1107\u1162\u110E\u116E", "\u110B\u1163\u11BC\u110C\u116E", "\u110B\u1163\u11BC\u1111\u1161", "\u110B\u1165\u1103\u116E\u11B7", "\u110B\u1165\u1105\u1167\u110B\u116E\u11B7", "\u110B\u1165\u1105\u1173\u11AB", "\u110B\u1165\u110C\u1166\u11BA\u1107\u1161\u11B7", "\u110B\u1165\u110D\u1162\u11BB\u1103\u1173\u11AB", "\u110B\u1165\u110D\u1165\u1103\u1161\u1100\u1161", "\u110B\u1165\u110D\u1165\u11AB\u110C\u1175", "\u110B\u1165\u11AB\u1102\u1175", "\u110B\u1165\u11AB\u1103\u1165\u11A8", "\u110B\u1165\u11AB\u1105\u1169\u11AB", "\u110B\u1165\u11AB\u110B\u1165", "\u110B\u1165\u11AF\u1100\u116E\u11AF", "\u110B\u1165\u11AF\u1105\u1173\u11AB", "\u110B\u1165\u11AF\u110B\u1173\u11B7", "\u110B\u1165\u11AF\u1111\u1175\u11BA", "\u110B\u1165\u11B7\u1106\u1161", "\u110B\u1165\u11B8\u1106\u116E", "\u110B\u1165\u11B8\u110C\u1169\u11BC", "\u110B\u1165\u11B8\u110E\u1166", "\u110B\u1165\u11BC\u1103\u1165\u11BC\u110B\u1175", "\u110B\u1165\u11BC\u1106\u1161\u11BC", "\u110B\u1165\u11BC\u1110\u1165\u1105\u1175", "\u110B\u1165\u11BD\u1100\u1173\u110C\u1166", "\u110B\u1166\u1102\u1165\u110C\u1175", "\u110B\u1166\u110B\u1165\u110F\u1165\u11AB", "\u110B\u1166\u11AB\u110C\u1175\u11AB", "\u110B\u1167\u1100\u1165\u11AB", "\u110B\u1167\u1100\u1169\u1109\u1162\u11BC", "\u110B\u1167\u1100\u116A\u11AB", "\u110B\u1167\u1100\u116E\u11AB", "\u110B\u1167\u1100\u116F\u11AB", "\u110B\u1167\u1103\u1162\u1109\u1162\u11BC", "\u110B\u1167\u1103\u1165\u11B2", "\u110B\u1167\u1103\u1169\u11BC\u1109\u1162\u11BC", "\u110B\u1167\u1103\u1173\u11AB", "\u110B\u1167\u1105\u1169\u11AB", "\u110B\u1167\u1105\u1173\u11B7", "\u110B\u1167\u1109\u1165\u11BA", "\u110B\u1167\u1109\u1165\u11BC", "\u110B\u1167\u110B\u116A\u11BC", "\u110B\u1167\u110B\u1175\u11AB", "\u110B\u1167\u110C\u1165\u11AB\u1112\u1175", "\u110B\u1167\u110C\u1175\u11A8\u110B\u116F\u11AB", "\u110B\u1167\u1112\u1161\u11A8\u1109\u1162\u11BC", "\u110B\u1167\u1112\u1162\u11BC", "\u110B\u1167\u11A8\u1109\u1161", "\u110B\u1167\u11A8\u1109\u1175", "\u110B\u1167\u11A8\u1112\u1161\u11AF", "\u110B\u1167\u11AB\u1100\u1167\u11AF", "\u110B\u1167\u11AB\u1100\u116E", "\u110B\u1167\u11AB\u1100\u1173\u11A8", "\u110B\u1167\u11AB\u1100\u1175", "\u110B\u1167\u11AB\u1105\u1161\u11A8", "\u110B\u1167\u11AB\u1109\u1165\u11AF", "\u110B\u1167\u11AB\u1109\u1166", "\u110B\u1167\u11AB\u1109\u1169\u11A8", "\u110B\u1167\u11AB\u1109\u1173\u11B8", "\u110B\u1167\u11AB\u110B\u1162", "\u110B\u1167\u11AB\u110B\u1168\u110B\u1175\u11AB", "\u110B\u1167\u11AB\u110B\u1175\u11AB", "\u110B\u1167\u11AB\u110C\u1161\u11BC", "\u110B\u1167\u11AB\u110C\u116E", "\u110B\u1167\u11AB\u110E\u116E\u11AF", "\u110B\u1167\u11AB\u1111\u1175\u11AF", "\u110B\u1167\u11AB\u1112\u1161\u11B8", "\u110B\u1167\u11AB\u1112\u1172", "\u110B\u1167\u11AF\u1100\u1175", "\u110B\u1167\u11AF\u1106\u1162", "\u110B\u1167\u11AF\u1109\u116C", "\u110B\u1167\u11AF\u1109\u1175\u11B7\u1112\u1175", "\u110B\u1167\u11AF\u110C\u1165\u11BC", "\u110B\u1167\u11AF\u110E\u1161", "\u110B\u1167\u11AF\u1112\u1173\u11AF", "\u110B\u1167\u11B7\u1105\u1167", "\u110B\u1167\u11B8\u1109\u1165", "\u110B\u1167\u11BC\u1100\u116E\u11A8", "\u110B\u1167\u11BC\u1102\u1161\u11B7", "\u110B\u1167\u11BC\u1109\u1161\u11BC", "\u110B\u1167\u11BC\u110B\u1163\u11BC", "\u110B\u1167\u11BC\u110B\u1167\u11A8", "\u110B\u1167\u11BC\u110B\u116E\u11BC", "\u110B\u1167\u11BC\u110B\u116F\u11AB\u1112\u1175", "\u110B\u1167\u11BC\u1112\u1161", "\u110B\u1167\u11BC\u1112\u1163\u11BC", "\u110B\u1167\u11BC\u1112\u1169\u11AB", "\u110B\u1167\u11BC\u1112\u116A", "\u110B\u1167\u11C1\u1100\u116E\u1105\u1175", "\u110B\u1167\u11C1\u1107\u1161\u11BC", "\u110B\u1167\u11C1\u110C\u1175\u11B8", "\u110B\u1168\u1100\u1161\u11B7", "\u110B\u1168\u1100\u1173\u11B7", "\u110B\u1168\u1107\u1161\u11BC", "\u110B\u1168\u1109\u1161\u11AB", "\u110B\u1168\u1109\u1161\u11BC", "\u110B\u1168\u1109\u1165\u11AB", "\u110B\u1168\u1109\u116E\u11AF", "\u110B\u1168\u1109\u1173\u11B8", "\u110B\u1168\u1109\u1175\u11A8\u110C\u1161\u11BC", "\u110B\u1168\u110B\u1163\u11A8", "\u110B\u1168\u110C\u1165\u11AB", "\u110B\u1168\u110C\u1165\u11AF", "\u110B\u1168\u110C\u1165\u11BC", "\u110B\u1168\u110F\u1165\u11AB\u1103\u1162", "\u110B\u1168\u11BA\u1102\u1161\u11AF", "\u110B\u1169\u1102\u1173\u11AF", "\u110B\u1169\u1105\u1161\u11A8", "\u110B\u1169\u1105\u1162\u11BA\u1103\u1169\u11BC\u110B\u1161\u11AB", "\u110B\u1169\u1105\u1166\u11AB\u110C\u1175", "\u110B\u1169\u1105\u1169\u110C\u1175", "\u110B\u1169\u1105\u1173\u11AB\u1107\u1161\u11AF", "\u110B\u1169\u1107\u1173\u11AB", "\u110B\u1169\u1109\u1175\u11B8", "\u110B\u1169\u110B\u1167\u11B7", "\u110B\u1169\u110B\u116F\u11AF", "\u110B\u1169\u110C\u1165\u11AB", "\u110B\u1169\u110C\u1175\u11A8", "\u110B\u1169\u110C\u1175\u11BC\u110B\u1165", "\u110B\u1169\u1111\u1166\u1105\u1161", "\u110B\u1169\u1111\u1175\u1109\u1173\u1110\u1166\u11AF", "\u110B\u1169\u1112\u1175\u1105\u1167", "\u110B\u1169\u11A8\u1109\u1161\u11BC", "\u110B\u1169\u11A8\u1109\u116E\u1109\u116E", "\u110B\u1169\u11AB\u1100\u1161\u11BD", "\u110B\u1169\u11AB\u1105\u1161\u110B\u1175\u11AB", "\u110B\u1169\u11AB\u1106\u1169\u11B7", "\u110B\u1169\u11AB\u110C\u1169\u11BC\u110B\u1175\u11AF", "\u110B\u1169\u11AB\u1110\u1169\u11BC", "\u110B\u1169\u11AF\u1100\u1161\u110B\u1173\u11AF", "\u110B\u1169\u11AF\u1105\u1175\u11B7\u1111\u1175\u11A8", "\u110B\u1169\u11AF\u1112\u1162", "\u110B\u1169\u11BA\u110E\u1161\u1105\u1175\u11B7", "\u110B\u116A\u110B\u1175\u1109\u1167\u110E\u1173", "\u110B\u116A\u110B\u1175\u11AB", "\u110B\u116A\u11AB\u1109\u1165\u11BC", "\u110B\u116A\u11AB\u110C\u1165\u11AB", "\u110B\u116A\u11BC\u1107\u1175", "\u110B\u116A\u11BC\u110C\u1161", "\u110B\u116B\u1102\u1163\u1112\u1161\u1106\u1167\u11AB", "\u110B\u116B\u11AB\u110C\u1175", "\u110B\u116C\u1100\u1161\u11BA\u110C\u1175\u11B8", "\u110B\u116C\u1100\u116E\u11A8", "\u110B\u116C\u1105\u1169\u110B\u116E\u11B7", "\u110B\u116C\u1109\u1161\u11B7\u110E\u1169\u11AB", "\u110B\u116C\u110E\u116E\u11AF", "\u110B\u116C\u110E\u1175\u11B7", "\u110B\u116C\u1112\u1161\u11AF\u1106\u1165\u1102\u1175", "\u110B\u116C\u11AB\u1107\u1161\u11AF", "\u110B\u116C\u11AB\u1109\u1169\u11AB", "\u110B\u116C\u11AB\u110D\u1169\u11A8", "\u110B\u116D\u1100\u1173\u11B7", "\u110B\u116D\u110B\u1175\u11AF", "\u110B\u116D\u110C\u1173\u11B7", "\u110B\u116D\u110E\u1165\u11BC", "\u110B\u116D\u11BC\u1100\u1175", "\u110B\u116D\u11BC\u1109\u1165", "\u110B\u116D\u11BC\u110B\u1165", "\u110B\u116E\u1109\u1161\u11AB", "\u110B\u116E\u1109\u1165\u11AB", "\u110B\u116E\u1109\u1173\u11BC", "\u110B\u116E\u110B\u1167\u11AB\u1112\u1175", "\u110B\u116E\u110C\u1165\u11BC", "\u110B\u116E\u110E\u1166\u1100\u116E\u11A8", "\u110B\u116E\u1111\u1167\u11AB", "\u110B\u116E\u11AB\u1103\u1169\u11BC", "\u110B\u116E\u11AB\u1106\u1167\u11BC", "\u110B\u116E\u11AB\u1107\u1161\u11AB", "\u110B\u116E\u11AB\u110C\u1165\u11AB", "\u110B\u116E\u11AB\u1112\u1162\u11BC", "\u110B\u116E\u11AF\u1109\u1161\u11AB", "\u110B\u116E\u11AF\u110B\u1173\u11B7", "\u110B\u116E\u11B7\u110C\u1175\u11A8\u110B\u1175\u11B7", "\u110B\u116E\u11BA\u110B\u1165\u1105\u1173\u11AB", "\u110B\u116E\u11BA\u110B\u1173\u11B7", "\u110B\u116F\u1102\u1161\u11A8", "\u110B\u116F\u11AB\u1100\u1169", "\u110B\u116F\u11AB\u1105\u1162", "\u110B\u116F\u11AB\u1109\u1165", "\u110B\u116F\u11AB\u1109\u116E\u11BC\u110B\u1175", "\u110B\u116F\u11AB\u110B\u1175\u11AB", "\u110B\u116F\u11AB\u110C\u1161\u11BC", "\u110B\u116F\u11AB\u1111\u1175\u1109\u1173", "\u110B\u116F\u11AF\u1100\u1173\u11B8", "\u110B\u116F\u11AF\u1103\u1173\u110F\u1165\u11B8", "\u110B\u116F\u11AF\u1109\u1166", "\u110B\u116F\u11AF\u110B\u116D\u110B\u1175\u11AF", "\u110B\u1170\u110B\u1175\u1110\u1165", "\u110B\u1171\u1107\u1161\u11AB", "\u110B\u1171\u1107\u1165\u11B8", "\u110B\u1171\u1109\u1165\u11BC", "\u110B\u1171\u110B\u116F\u11AB", "\u110B\u1171\u1112\u1165\u11B7", "\u110B\u1171\u1112\u1167\u11B8", "\u110B\u1171\u11BA\u1109\u1161\u1105\u1161\u11B7", "\u110B\u1172\u1102\u1161\u11AB\u1112\u1175", "\u110B\u1172\u1105\u1165\u11B8", "\u110B\u1172\u1106\u1167\u11BC", "\u110B\u1172\u1106\u116E\u11AF", "\u110B\u1172\u1109\u1161\u11AB", "\u110B\u1172\u110C\u1165\u11A8", "\u110B\u1172\u110E\u1175\u110B\u116F\u11AB", "\u110B\u1172\u1112\u1161\u11A8", "\u110B\u1172\u1112\u1162\u11BC", "\u110B\u1172\u1112\u1167\u11BC", "\u110B\u1172\u11A8\u1100\u116E\u11AB", "\u110B\u1172\u11A8\u1109\u1161\u11BC", "\u110B\u1172\u11A8\u1109\u1175\u11B8", "\u110B\u1172\u11A8\u110E\u1166", "\u110B\u1173\u11AB\u1112\u1162\u11BC", "\u110B\u1173\u11B7\u1105\u1167\u11A8", "\u110B\u1173\u11B7\u1105\u116D", "\u110B\u1173\u11B7\u1107\u1161\u11AB", "\u110B\u1173\u11B7\u1109\u1165\u11BC", "\u110B\u1173\u11B7\u1109\u1175\u11A8", "\u110B\u1173\u11B7\u110B\u1161\u11A8", "\u110B\u1173\u11B7\u110C\u116E", "\u110B\u1174\u1100\u1167\u11AB", "\u110B\u1174\u1102\u1169\u11AB", "\u110B\u1174\u1106\u116E\u11AB", "\u110B\u1174\u1107\u1169\u11A8", "\u110B\u1174\u1109\u1175\u11A8", "\u110B\u1174\u1109\u1175\u11B7", "\u110B\u1174\u110B\u116C\u1105\u1169", "\u110B\u1174\u110B\u116D\u11A8", "\u110B\u1174\u110B\u116F\u11AB", "\u110B\u1174\u1112\u1161\u11A8", "\u110B\u1175\u1100\u1165\u11BA", "\u110B\u1175\u1100\u1169\u11BA", "\u110B\u1175\u1102\u1167\u11B7", "\u110B\u1175\u1102\u1169\u11B7", "\u110B\u1175\u1103\u1161\u11AF", "\u110B\u1175\u1103\u1162\u1105\u1169", "\u110B\u1175\u1103\u1169\u11BC", "\u110B\u1175\u1105\u1165\u11C2\u1100\u1166", "\u110B\u1175\u1105\u1167\u11A8\u1109\u1165", "\u110B\u1175\u1105\u1169\u11AB\u110C\u1165\u11A8", "\u110B\u1175\u1105\u1173\u11B7", "\u110B\u1175\u1106\u1175\u11AB", "\u110B\u1175\u1107\u1161\u11AF\u1109\u1169", "\u110B\u1175\u1107\u1167\u11AF", "\u110B\u1175\u1107\u116E\u11AF", "\u110B\u1175\u1108\u1161\u11AF", "\u110B\u1175\u1109\u1161\u11BC", "\u110B\u1175\u1109\u1165\u11BC", "\u110B\u1175\u1109\u1173\u11AF", "\u110B\u1175\u110B\u1163\u1100\u1175", "\u110B\u1175\u110B\u116D\u11BC", "\u110B\u1175\u110B\u116E\u11BA", "\u110B\u1175\u110B\u116F\u11AF", "\u110B\u1175\u110B\u1173\u11A8\u1100\u1169", "\u110B\u1175\u110B\u1175\u11A8", "\u110B\u1175\u110C\u1165\u11AB", "\u110B\u1175\u110C\u116E\u11BC", "\u110B\u1175\u1110\u1173\u11AE\u1102\u1161\u11AF", "\u110B\u1175\u1110\u1173\u11AF", "\u110B\u1175\u1112\u1169\u11AB", "\u110B\u1175\u11AB\u1100\u1161\u11AB", "\u110B\u1175\u11AB\u1100\u1167\u11A8", "\u110B\u1175\u11AB\u1100\u1169\u11BC", "\u110B\u1175\u11AB\u1100\u116E", "\u110B\u1175\u11AB\u1100\u1173\u11AB", "\u110B\u1175\u11AB\u1100\u1175", "\u110B\u1175\u11AB\u1103\u1169", "\u110B\u1175\u11AB\u1105\u1172", "\u110B\u1175\u11AB\u1106\u116E\u11AF", "\u110B\u1175\u11AB\u1109\u1162\u11BC", "\u110B\u1175\u11AB\u1109\u116B", "\u110B\u1175\u11AB\u110B\u1167\u11AB", "\u110B\u1175\u11AB\u110B\u116F\u11AB", "\u110B\u1175\u11AB\u110C\u1162", "\u110B\u1175\u11AB\u110C\u1169\u11BC", "\u110B\u1175\u11AB\u110E\u1165\u11AB", "\u110B\u1175\u11AB\u110E\u1166", "\u110B\u1175\u11AB\u1110\u1165\u1102\u1166\u11BA", "\u110B\u1175\u11AB\u1112\u1161", "\u110B\u1175\u11AB\u1112\u1167\u11BC", "\u110B\u1175\u11AF\u1100\u1169\u11B8", "\u110B\u1175\u11AF\u1100\u1175", "\u110B\u1175\u11AF\u1103\u1161\u11AB", "\u110B\u1175\u11AF\u1103\u1162", "\u110B\u1175\u11AF\u1103\u1173\u11BC", "\u110B\u1175\u11AF\u1107\u1161\u11AB", "\u110B\u1175\u11AF\u1107\u1169\u11AB", "\u110B\u1175\u11AF\u1107\u116E", "\u110B\u1175\u11AF\u1109\u1161\u11BC", "\u110B\u1175\u11AF\u1109\u1162\u11BC", "\u110B\u1175\u11AF\u1109\u1169\u11AB", "\u110B\u1175\u11AF\u110B\u116D\u110B\u1175\u11AF", "\u110B\u1175\u11AF\u110B\u116F\u11AF", "\u110B\u1175\u11AF\u110C\u1165\u11BC", "\u110B\u1175\u11AF\u110C\u1169\u11BC", "\u110B\u1175\u11AF\u110C\u116E\u110B\u1175\u11AF", "\u110B\u1175\u11AF\u110D\u1175\u11A8", "\u110B\u1175\u11AF\u110E\u1166", "\u110B\u1175\u11AF\u110E\u1175", "\u110B\u1175\u11AF\u1112\u1162\u11BC", "\u110B\u1175\u11AF\u1112\u116C\u110B\u116D\u11BC", "\u110B\u1175\u11B7\u1100\u1173\u11B7", "\u110B\u1175\u11B7\u1106\u116E", "\u110B\u1175\u11B8\u1103\u1162", "\u110B\u1175\u11B8\u1105\u1167\u11A8", "\u110B\u1175\u11B8\u1106\u1161\u11BA", "\u110B\u1175\u11B8\u1109\u1161", "\u110B\u1175\u11B8\u1109\u116E\u11AF", "\u110B\u1175\u11B8\u1109\u1175", "\u110B\u1175\u11B8\u110B\u116F\u11AB", "\u110B\u1175\u11B8\u110C\u1161\u11BC", "\u110B\u1175\u11B8\u1112\u1161\u11A8", "\u110C\u1161\u1100\u1161\u110B\u116D\u11BC", "\u110C\u1161\u1100\u1167\u11A8", "\u110C\u1161\u1100\u1173\u11A8", "\u110C\u1161\u1103\u1169\u11BC", "\u110C\u1161\u1105\u1161\u11BC", "\u110C\u1161\u1107\u116E\u1109\u1175\u11B7", "\u110C\u1161\u1109\u1175\u11A8", "\u110C\u1161\u1109\u1175\u11AB", "\u110C\u1161\u110B\u1167\u11AB", "\u110C\u1161\u110B\u116F\u11AB", "\u110C\u1161\u110B\u1172\u11AF", "\u110C\u1161\u110C\u1165\u11AB\u1100\u1165", "\u110C\u1161\u110C\u1165\u11BC", "\u110C\u1161\u110C\u1169\u11AB\u1109\u1175\u11B7", "\u110C\u1161\u1111\u1161\u11AB", "\u110C\u1161\u11A8\u1100\u1161", "\u110C\u1161\u11A8\u1102\u1167\u11AB", "\u110C\u1161\u11A8\u1109\u1165\u11BC", "\u110C\u1161\u11A8\u110B\u1165\u11B8", "\u110C\u1161\u11A8\u110B\u116D\u11BC", "\u110C\u1161\u11A8\u110B\u1173\u11AB\u1104\u1161\u11AF", "\u110C\u1161\u11A8\u1111\u116E\u11B7", "\u110C\u1161\u11AB\u1103\u1175", "\u110C\u1161\u11AB\u1104\u1173\u11A8", "\u110C\u1161\u11AB\u110E\u1175", "\u110C\u1161\u11AF\u1106\u1169\u11BA", "\u110C\u1161\u11B7\u1101\u1161\u11AB", "\u110C\u1161\u11B7\u1109\u116E\u1112\u1161\u11B7", "\u110C\u1161\u11B7\u1109\u1175", "\u110C\u1161\u11B7\u110B\u1169\u11BA", "\u110C\u1161\u11B7\u110C\u1161\u1105\u1175", "\u110C\u1161\u11B8\u110C\u1175", "\u110C\u1161\u11BC\u1100\u116A\u11AB", "\u110C\u1161\u11BC\u1100\u116E\u11AB", "\u110C\u1161\u11BC\u1100\u1175\u1100\u1161\u11AB", "\u110C\u1161\u11BC\u1105\u1162", "\u110C\u1161\u11BC\u1105\u1168", "\u110C\u1161\u11BC\u1105\u1173", "\u110C\u1161\u11BC\u1106\u1161", "\u110C\u1161\u11BC\u1106\u1167\u11AB", "\u110C\u1161\u11BC\u1106\u1169", "\u110C\u1161\u11BC\u1106\u1175", "\u110C\u1161\u11BC\u1107\u1175", "\u110C\u1161\u11BC\u1109\u1161", "\u110C\u1161\u11BC\u1109\u1169", "\u110C\u1161\u11BC\u1109\u1175\u11A8", "\u110C\u1161\u11BC\u110B\u1162\u110B\u1175\u11AB", "\u110C\u1161\u11BC\u110B\u1175\u11AB", "\u110C\u1161\u11BC\u110C\u1165\u11B7", "\u110C\u1161\u11BC\u110E\u1161", "\u110C\u1161\u11BC\u1112\u1161\u11A8\u1100\u1173\u11B7", "\u110C\u1162\u1102\u1173\u11BC", "\u110C\u1162\u1108\u1161\u11AF\u1105\u1175", "\u110C\u1162\u1109\u1161\u11AB", "\u110C\u1162\u1109\u1162\u11BC", "\u110C\u1162\u110C\u1161\u11A8\u1102\u1167\u11AB", "\u110C\u1162\u110C\u1165\u11BC", "\u110C\u1162\u110E\u1162\u1100\u1175", "\u110C\u1162\u1111\u1161\u11AB", "\u110C\u1162\u1112\u1161\u11A8", "\u110C\u1162\u1112\u116A\u11AF\u110B\u116D\u11BC", "\u110C\u1165\u1100\u1165\u11BA", "\u110C\u1165\u1100\u1169\u1105\u1175", "\u110C\u1165\u1100\u1169\u11BA", "\u110C\u1165\u1102\u1167\u11A8", "\u110C\u1165\u1105\u1165\u11AB", "\u110C\u1165\u1105\u1165\u11C2\u1100\u1166", "\u110C\u1165\u1107\u1165\u11AB", "\u110C\u1165\u110B\u116E\u11AF", "\u110C\u1165\u110C\u1165\u11AF\u1105\u1169", "\u110C\u1165\u110E\u116E\u11A8", "\u110C\u1165\u11A8\u1100\u1173\u11A8", "\u110C\u1165\u11A8\u1103\u1161\u11BC\u1112\u1175", "\u110C\u1165\u11A8\u1109\u1165\u11BC", "\u110C\u1165\u11A8\u110B\u116D\u11BC", "\u110C\u1165\u11A8\u110B\u1173\u11BC", "\u110C\u1165\u11AB\u1100\u1162", "\u110C\u1165\u11AB\u1100\u1169\u11BC", "\u110C\u1165\u11AB\u1100\u1175", "\u110C\u1165\u11AB\u1103\u1161\u11AF", "\u110C\u1165\u11AB\u1105\u1161\u1103\u1169", "\u110C\u1165\u11AB\u1106\u1161\u11BC", "\u110C\u1165\u11AB\u1106\u116E\u11AB", "\u110C\u1165\u11AB\u1107\u1161\u11AB", "\u110C\u1165\u11AB\u1107\u116E", "\u110C\u1165\u11AB\u1109\u1166", "\u110C\u1165\u11AB\u1109\u1175", "\u110C\u1165\u11AB\u110B\u116D\u11BC", "\u110C\u1165\u11AB\u110C\u1161", "\u110C\u1165\u11AB\u110C\u1162\u11BC", "\u110C\u1165\u11AB\u110C\u116E", "\u110C\u1165\u11AB\u110E\u1165\u11AF", "\u110C\u1165\u11AB\u110E\u1166", "\u110C\u1165\u11AB\u1110\u1169\u11BC", "\u110C\u1165\u11AB\u1112\u1167", "\u110C\u1165\u11AB\u1112\u116E", "\u110C\u1165\u11AF\u1103\u1162", "\u110C\u1165\u11AF\u1106\u1161\u11BC", "\u110C\u1165\u11AF\u1107\u1161\u11AB", "\u110C\u1165\u11AF\u110B\u1163\u11A8", "\u110C\u1165\u11AF\u110E\u1161", "\u110C\u1165\u11B7\u1100\u1165\u11B7", "\u110C\u1165\u11B7\u1109\u116E", "\u110C\u1165\u11B7\u1109\u1175\u11B7", "\u110C\u1165\u11B7\u110B\u116F\u11AB", "\u110C\u1165\u11B7\u110C\u1165\u11B7", "\u110C\u1165\u11B7\u110E\u1161", "\u110C\u1165\u11B8\u1100\u1173\u11AB", "\u110C\u1165\u11B8\u1109\u1175", "\u110C\u1165\u11B8\u110E\u1169\u11A8", "\u110C\u1165\u11BA\u1100\u1161\u1105\u1161\u11A8", "\u110C\u1165\u11BC\u1100\u1165\u110C\u1161\u11BC", "\u110C\u1165\u11BC\u1103\u1169", "\u110C\u1165\u11BC\u1105\u1172\u110C\u1161\u11BC", "\u110C\u1165\u11BC\u1105\u1175", "\u110C\u1165\u11BC\u1106\u1161\u11AF", "\u110C\u1165\u11BC\u1106\u1167\u11AB", "\u110C\u1165\u11BC\u1106\u116E\u11AB", "\u110C\u1165\u11BC\u1107\u1161\u11AB\u1103\u1162", "\u110C\u1165\u11BC\u1107\u1169", "\u110C\u1165\u11BC\u1107\u116E", "\u110C\u1165\u11BC\u1107\u1175", "\u110C\u1165\u11BC\u1109\u1161\u11BC", "\u110C\u1165\u11BC\u1109\u1165\u11BC", "\u110C\u1165\u11BC\u110B\u1169", "\u110C\u1165\u11BC\u110B\u116F\u11AB", "\u110C\u1165\u11BC\u110C\u1161\u11BC", "\u110C\u1165\u11BC\u110C\u1175", "\u110C\u1165\u11BC\u110E\u1175", "\u110C\u1165\u11BC\u1112\u116A\u11A8\u1112\u1175", "\u110C\u1166\u1100\u1169\u11BC", "\u110C\u1166\u1100\u116A\u110C\u1165\u11B7", "\u110C\u1166\u1103\u1162\u1105\u1169", "\u110C\u1166\u1106\u1169\u11A8", "\u110C\u1166\u1107\u1161\u11AF", "\u110C\u1166\u1107\u1165\u11B8", "\u110C\u1166\u1109\u1161\u11BA\u1102\u1161\u11AF", "\u110C\u1166\u110B\u1161\u11AB", "\u110C\u1166\u110B\u1175\u11AF", "\u110C\u1166\u110C\u1161\u11A8", "\u110C\u1166\u110C\u116E\u1103\u1169", "\u110C\u1166\u110E\u116E\u11AF", "\u110C\u1166\u1111\u116E\u11B7", "\u110C\u1166\u1112\u1161\u11AB", "\u110C\u1169\u1100\u1161\u11A8", "\u110C\u1169\u1100\u1165\u11AB", "\u110C\u1169\u1100\u1173\u11B7", "\u110C\u1169\u1100\u1175\u11BC", "\u110C\u1169\u1106\u1167\u11BC", "\u110C\u1169\u1106\u1175\u1105\u116D", "\u110C\u1169\u1109\u1161\u11BC", "\u110C\u1169\u1109\u1165\u11AB", "\u110C\u1169\u110B\u116D\u11BC\u1112\u1175", "\u110C\u1169\u110C\u1165\u11AF", "\u110C\u1169\u110C\u1165\u11BC", "\u110C\u1169\u110C\u1175\u11A8", "\u110C\u1169\u11AB\u1103\u1162\u11BA\u1106\u1161\u11AF", "\u110C\u1169\u11AB\u110C\u1162", "\u110C\u1169\u11AF\u110B\u1165\u11B8", "\u110C\u1169\u11AF\u110B\u1173\u11B7", "\u110C\u1169\u11BC\u1100\u116D", "\u110C\u1169\u11BC\u1105\u1169", "\u110C\u1169\u11BC\u1105\u1172", "\u110C\u1169\u11BC\u1109\u1169\u1105\u1175", "\u110C\u1169\u11BC\u110B\u1165\u11B8\u110B\u116F\u11AB", "\u110C\u1169\u11BC\u110C\u1169\u11BC", "\u110C\u1169\u11BC\u1112\u1161\u11B8", "\u110C\u116A\u1109\u1165\u11A8", "\u110C\u116C\u110B\u1175\u11AB", "\u110C\u116E\u1100\u116A\u11AB\u110C\u1165\u11A8", "\u110C\u116E\u1105\u1173\u11B7", "\u110C\u116E\u1106\u1161\u11AF", "\u110C\u116E\u1106\u1165\u1102\u1175", "\u110C\u116E\u1106\u1165\u11A8", "\u110C\u116E\u1106\u116E\u11AB", "\u110C\u116E\u1106\u1175\u11AB", "\u110C\u116E\u1107\u1161\u11BC", "\u110C\u116E\u1107\u1167\u11AB", "\u110C\u116E\u1109\u1175\u11A8", "\u110C\u116E\u110B\u1175\u11AB", "\u110C\u116E\u110B\u1175\u11AF", "\u110C\u116E\u110C\u1161\u11BC", "\u110C\u116E\u110C\u1165\u11AB\u110C\u1161", "\u110C\u116E\u1110\u1162\u11A8", "\u110C\u116E\u11AB\u1107\u1175", "\u110C\u116E\u11AF\u1100\u1165\u1105\u1175", "\u110C\u116E\u11AF\u1100\u1175", "\u110C\u116E\u11AF\u1106\u116E\u1102\u1174", "\u110C\u116E\u11BC\u1100\u1161\u11AB", "\u110C\u116E\u11BC\u1100\u1168\u1107\u1161\u11BC\u1109\u1169\u11BC", "\u110C\u116E\u11BC\u1100\u116E\u11A8", "\u110C\u116E\u11BC\u1102\u1167\u11AB", "\u110C\u116E\u11BC\u1103\u1161\u11AB", "\u110C\u116E\u11BC\u1103\u1169\u11A8", "\u110C\u116E\u11BC\u1107\u1161\u11AB", "\u110C\u116E\u11BC\u1107\u116E", "\u110C\u116E\u11BC\u1109\u1166", "\u110C\u116E\u11BC\u1109\u1169\u1100\u1175\u110B\u1165\u11B8", "\u110C\u116E\u11BC\u1109\u116E\u11AB", "\u110C\u116E\u11BC\u110B\u1161\u11BC", "\u110C\u116E\u11BC\u110B\u116D", "\u110C\u116E\u11BC\u1112\u1161\u11A8\u1100\u116D", "\u110C\u1173\u11A8\u1109\u1165\u11A8", "\u110C\u1173\u11A8\u1109\u1175", "\u110C\u1173\u11AF\u1100\u1165\u110B\u116E\u11B7", "\u110C\u1173\u11BC\u1100\u1161", "\u110C\u1173\u11BC\u1100\u1165", "\u110C\u1173\u11BC\u1100\u116F\u11AB", "\u110C\u1173\u11BC\u1109\u1161\u11BC", "\u110C\u1173\u11BC\u1109\u1166", "\u110C\u1175\u1100\u1161\u11A8", "\u110C\u1175\u1100\u1161\u11B8", "\u110C\u1175\u1100\u1167\u11BC", "\u110C\u1175\u1100\u1173\u11A8\u1112\u1175", "\u110C\u1175\u1100\u1173\u11B7", "\u110C\u1175\u1100\u1173\u11B8", "\u110C\u1175\u1102\u1173\u11BC", "\u110C\u1175\u1105\u1173\u11B7\u1100\u1175\u11AF", "\u110C\u1175\u1105\u1175\u1109\u1161\u11AB", "\u110C\u1175\u1107\u1161\u11BC", "\u110C\u1175\u1107\u116E\u11BC", "\u110C\u1175\u1109\u1175\u11A8", "\u110C\u1175\u110B\u1167\u11A8", "\u110C\u1175\u110B\u116E\u1100\u1162", "\u110C\u1175\u110B\u116F\u11AB", "\u110C\u1175\u110C\u1165\u11A8", "\u110C\u1175\u110C\u1165\u11B7", "\u110C\u1175\u110C\u1175\u11AB", "\u110C\u1175\u110E\u116E\u11AF", "\u110C\u1175\u11A8\u1109\u1165\u11AB", "\u110C\u1175\u11A8\u110B\u1165\u11B8", "\u110C\u1175\u11A8\u110B\u116F\u11AB", "\u110C\u1175\u11A8\u110C\u1161\u11BC", "\u110C\u1175\u11AB\u1100\u1173\u11B8", "\u110C\u1175\u11AB\u1103\u1169\u11BC", "\u110C\u1175\u11AB\u1105\u1169", "\u110C\u1175\u11AB\u1105\u116D", "\u110C\u1175\u11AB\u1105\u1175", "\u110C\u1175\u11AB\u110D\u1161", "\u110C\u1175\u11AB\u110E\u1161\u11AF", "\u110C\u1175\u11AB\u110E\u116E\u11AF", "\u110C\u1175\u11AB\u1110\u1169\u11BC", "\u110C\u1175\u11AB\u1112\u1162\u11BC", "\u110C\u1175\u11AF\u1106\u116E\u11AB", "\u110C\u1175\u11AF\u1107\u1167\u11BC", "\u110C\u1175\u11AF\u1109\u1165", "\u110C\u1175\u11B7\u110C\u1161\u11A8", "\u110C\u1175\u11B8\u1103\u1161\u11AB", "\u110C\u1175\u11B8\u110B\u1161\u11AB", "\u110C\u1175\u11B8\u110C\u116E\u11BC", "\u110D\u1161\u110C\u1173\u11BC", "\u110D\u1175\u1101\u1165\u1100\u1175", "\u110E\u1161\u1102\u1161\u11B7", "\u110E\u1161\u1105\u1161\u1105\u1175", "\u110E\u1161\u1105\u1163\u11BC", "\u110E\u1161\u1105\u1175\u11B7", "\u110E\u1161\u1107\u1167\u11AF", "\u110E\u1161\u1109\u1165\u11AB", "\u110E\u1161\u110E\u1173\u11B7", "\u110E\u1161\u11A8\u1100\u1161\u11A8", "\u110E\u1161\u11AB\u1106\u116E\u11AF", "\u110E\u1161\u11AB\u1109\u1165\u11BC", "\u110E\u1161\u11B7\u1100\u1161", "\u110E\u1161\u11B7\u1100\u1175\u1105\u1173\u11B7", "\u110E\u1161\u11B7\u1109\u1162", "\u110E\u1161\u11B7\u1109\u1165\u11A8", "\u110E\u1161\u11B7\u110B\u1167", "\u110E\u1161\u11B7\u110B\u116C", "\u110E\u1161\u11B7\u110C\u1169", "\u110E\u1161\u11BA\u110C\u1161\u11AB", "\u110E\u1161\u11BC\u1100\u1161", "\u110E\u1161\u11BC\u1100\u1169", "\u110E\u1161\u11BC\u1100\u116E", "\u110E\u1161\u11BC\u1106\u116E\u11AB", "\u110E\u1161\u11BC\u1107\u1161\u11A9", "\u110E\u1161\u11BC\u110C\u1161\u11A8", "\u110E\u1161\u11BC\u110C\u1169", "\u110E\u1162\u1102\u1165\u11AF", "\u110E\u1162\u110C\u1165\u11B7", "\u110E\u1162\u11A8\u1100\u1161\u1107\u1161\u11BC", "\u110E\u1162\u11A8\u1107\u1161\u11BC", "\u110E\u1162\u11A8\u1109\u1161\u11BC", "\u110E\u1162\u11A8\u110B\u1175\u11B7", "\u110E\u1162\u11B7\u1111\u1175\u110B\u1165\u11AB", "\u110E\u1165\u1107\u1165\u11AF", "\u110E\u1165\u110B\u1173\u11B7", "\u110E\u1165\u11AB\u1100\u116E\u11A8", "\u110E\u1165\u11AB\u1103\u116E\u11BC", "\u110E\u1165\u11AB\u110C\u1161\u11BC", "\u110E\u1165\u11AB\u110C\u1162", "\u110E\u1165\u11AB\u110E\u1165\u11AB\u1112\u1175", "\u110E\u1165\u11AF\u1103\u1169", "\u110E\u1165\u11AF\u110C\u1165\u1112\u1175", "\u110E\u1165\u11AF\u1112\u1161\u11A8", "\u110E\u1165\u11BA\u1102\u1161\u11AF", "\u110E\u1165\u11BA\u110D\u1162", "\u110E\u1165\u11BC\u1102\u1167\u11AB", "\u110E\u1165\u11BC\u1107\u1161\u110C\u1175", "\u110E\u1165\u11BC\u1109\u1169", "\u110E\u1165\u11BC\u110E\u116E\u11AB", "\u110E\u1166\u1100\u1168", "\u110E\u1166\u1105\u1167\u11A8", "\u110E\u1166\u110B\u1169\u11AB", "\u110E\u1166\u110B\u1172\u11A8", "\u110E\u1166\u110C\u116E\u11BC", "\u110E\u1166\u1112\u1165\u11B7", "\u110E\u1169\u1103\u1173\u11BC\u1112\u1161\u11A8\u1109\u1162\u11BC", "\u110E\u1169\u1107\u1161\u11AB", "\u110E\u1169\u1107\u1161\u11B8", "\u110E\u1169\u1109\u1161\u11BC\u1112\u116A", "\u110E\u1169\u1109\u116E\u11AB", "\u110E\u1169\u110B\u1167\u1105\u1173\u11B7", "\u110E\u1169\u110B\u116F\u11AB", "\u110E\u1169\u110C\u1165\u1102\u1167\u11A8", "\u110E\u1169\u110C\u1165\u11B7", "\u110E\u1169\u110E\u1165\u11BC", "\u110E\u1169\u110F\u1169\u11AF\u1105\u1175\u11BA", "\u110E\u1169\u11BA\u1107\u116E\u11AF", "\u110E\u1169\u11BC\u1100\u1161\u11A8", "\u110E\u1169\u11BC\u1105\u1175", "\u110E\u1169\u11BC\u110C\u1161\u11BC", "\u110E\u116A\u11AF\u110B\u1167\u11BC", "\u110E\u116C\u1100\u1173\u11AB", "\u110E\u116C\u1109\u1161\u11BC", "\u110E\u116C\u1109\u1165\u11AB", "\u110E\u116C\u1109\u1175\u11AB", "\u110E\u116C\u110B\u1161\u11A8", "\u110E\u116C\u110C\u1169\u11BC", "\u110E\u116E\u1109\u1165\u11A8", "\u110E\u116E\u110B\u1165\u11A8", "\u110E\u116E\u110C\u1175\u11AB", "\u110E\u116E\u110E\u1165\u11AB", "\u110E\u116E\u110E\u1173\u11A8", "\u110E\u116E\u11A8\u1100\u116E", "\u110E\u116E\u11A8\u1109\u1169", "\u110E\u116E\u11A8\u110C\u1166", "\u110E\u116E\u11A8\u1112\u1161", "\u110E\u116E\u11AF\u1100\u1173\u11AB", "\u110E\u116E\u11AF\u1107\u1161\u11AF", "\u110E\u116E\u11AF\u1109\u1161\u11AB", "\u110E\u116E\u11AF\u1109\u1175\u11AB", "\u110E\u116E\u11AF\u110B\u1167\u11AB", "\u110E\u116E\u11AF\u110B\u1175\u11B8", "\u110E\u116E\u11AF\u110C\u1161\u11BC", "\u110E\u116E\u11AF\u1111\u1161\u11AB", "\u110E\u116E\u11BC\u1100\u1167\u11A8", "\u110E\u116E\u11BC\u1100\u1169", "\u110E\u116E\u11BC\u1103\u1169\u11AF", "\u110E\u116E\u11BC\u1107\u116E\u11AB\u1112\u1175", "\u110E\u116E\u11BC\u110E\u1165\u11BC\u1103\u1169", "\u110E\u1171\u110B\u1165\u11B8", "\u110E\u1171\u110C\u1175\u11A8", "\u110E\u1171\u1112\u1163\u11BC", "\u110E\u1175\u110B\u1163\u11A8", "\u110E\u1175\u11AB\u1100\u116E", "\u110E\u1175\u11AB\u110E\u1165\u11A8", "\u110E\u1175\u11AF\u1109\u1175\u11B8", "\u110E\u1175\u11AF\u110B\u116F\u11AF", "\u110E\u1175\u11AF\u1111\u1161\u11AB", "\u110E\u1175\u11B7\u1103\u1162", "\u110E\u1175\u11B7\u1106\u116E\u11A8", "\u110E\u1175\u11B7\u1109\u1175\u11AF", "\u110E\u1175\u11BA\u1109\u1169\u11AF", "\u110E\u1175\u11BC\u110E\u1161\u11AB", "\u110F\u1161\u1106\u1166\u1105\u1161", "\u110F\u1161\u110B\u116E\u11AB\u1110\u1165", "\u110F\u1161\u11AF\u1100\u116E\u11A8\u1109\u116E", "\u110F\u1162\u1105\u1175\u11A8\u1110\u1165", "\u110F\u1162\u11B7\u1111\u1165\u1109\u1173", "\u110F\u1162\u11B7\u1111\u1166\u110B\u1175\u11AB", "\u110F\u1165\u1110\u1173\u11AB", "\u110F\u1165\u11AB\u1103\u1175\u1109\u1167\u11AB", "\u110F\u1165\u11AF\u1105\u1165", "\u110F\u1165\u11B7\u1111\u1172\u1110\u1165", "\u110F\u1169\u1101\u1175\u1105\u1175", "\u110F\u1169\u1106\u1175\u1103\u1175", "\u110F\u1169\u11AB\u1109\u1165\u1110\u1173", "\u110F\u1169\u11AF\u1105\u1161", "\u110F\u1169\u11B7\u1111\u1173\u11AF\u1105\u1166\u11A8\u1109\u1173", "\u110F\u1169\u11BC\u1102\u1161\u1106\u116E\u11AF", "\u110F\u116B\u1100\u1161\u11B7", "\u110F\u116E\u1103\u1166\u1110\u1161", "\u110F\u1173\u1105\u1175\u11B7", "\u110F\u1173\u11AB\u1100\u1175\u11AF", "\u110F\u1173\u11AB\u1104\u1161\u11AF", "\u110F\u1173\u11AB\u1109\u1169\u1105\u1175", "\u110F\u1173\u11AB\u110B\u1161\u1103\u1173\u11AF", "\u110F\u1173\u11AB\u110B\u1165\u1106\u1165\u1102\u1175", "\u110F\u1173\u11AB\u110B\u1175\u11AF", "\u110F\u1173\u11AB\u110C\u1165\u11AF", "\u110F\u1173\u11AF\u1105\u1162\u1109\u1175\u11A8", "\u110F\u1173\u11AF\u1105\u1165\u11B8", "\u110F\u1175\u11AF\u1105\u1169", "\u1110\u1161\u110B\u1175\u11B8", "\u1110\u1161\u110C\u1161\u1100\u1175", "\u1110\u1161\u11A8\u1100\u116E", "\u1110\u1161\u11A8\u110C\u1161", "\u1110\u1161\u11AB\u1109\u1162\u11BC", "\u1110\u1162\u1100\u116F\u11AB\u1103\u1169", "\u1110\u1162\u110B\u1163\u11BC", "\u1110\u1162\u1111\u116E\u11BC", "\u1110\u1162\u11A8\u1109\u1175", "\u1110\u1162\u11AF\u1105\u1165\u11AB\u1110\u1173", "\u1110\u1165\u1102\u1165\u11AF", "\u1110\u1165\u1106\u1175\u1102\u1165\u11AF", "\u1110\u1166\u1102\u1175\u1109\u1173", "\u1110\u1166\u1109\u1173\u1110\u1173", "\u1110\u1166\u110B\u1175\u1107\u1173\u11AF", "\u1110\u1166\u11AF\u1105\u1166\u1107\u1175\u110C\u1165\u11AB", "\u1110\u1169\u1105\u1169\u11AB", "\u1110\u1169\u1106\u1161\u1110\u1169", "\u1110\u1169\u110B\u116D\u110B\u1175\u11AF", "\u1110\u1169\u11BC\u1100\u1168", "\u1110\u1169\u11BC\u1100\u116A", "\u1110\u1169\u11BC\u1105\u1169", "\u1110\u1169\u11BC\u1109\u1175\u11AB", "\u1110\u1169\u11BC\u110B\u1167\u11A8", "\u1110\u1169\u11BC\u110B\u1175\u11AF", "\u1110\u1169\u11BC\u110C\u1161\u11BC", "\u1110\u1169\u11BC\u110C\u1166", "\u1110\u1169\u11BC\u110C\u1173\u11BC", "\u1110\u1169\u11BC\u1112\u1161\u11B8", "\u1110\u1169\u11BC\u1112\u116A", "\u1110\u116C\u1100\u1173\u11AB", "\u1110\u116C\u110B\u116F\u11AB", "\u1110\u116C\u110C\u1175\u11A8\u1100\u1173\u11B7", "\u1110\u1171\u1100\u1175\u11B7", "\u1110\u1173\u1105\u1165\u11A8", "\u1110\u1173\u11A8\u1100\u1173\u11B8", "\u1110\u1173\u11A8\u1107\u1167\u11AF", "\u1110\u1173\u11A8\u1109\u1165\u11BC", "\u1110\u1173\u11A8\u1109\u116E", "\u1110\u1173\u11A8\u110C\u1175\u11BC", "\u1110\u1173\u11A8\u1112\u1175", "\u1110\u1173\u11AB\u1110\u1173\u11AB\u1112\u1175", "\u1110\u1175\u1109\u1167\u110E\u1173", "\u1111\u1161\u1105\u1161\u11AB\u1109\u1162\u11A8", "\u1111\u1161\u110B\u1175\u11AF", "\u1111\u1161\u110E\u116E\u11AF\u1109\u1169", "\u1111\u1161\u11AB\u1100\u1167\u11AF", "\u1111\u1161\u11AB\u1103\u1161\u11AB", "\u1111\u1161\u11AB\u1106\u1162", "\u1111\u1161\u11AB\u1109\u1161", "\u1111\u1161\u11AF\u1109\u1175\u11B8", "\u1111\u1161\u11AF\u110B\u116F\u11AF", "\u1111\u1161\u11B8\u1109\u1169\u11BC", "\u1111\u1162\u1109\u1167\u11AB", "\u1111\u1162\u11A8\u1109\u1173", "\u1111\u1162\u11A8\u1109\u1175\u1106\u1175\u11AF\u1105\u1175", "\u1111\u1162\u11AB\u1110\u1175", "\u1111\u1165\u1109\u1166\u11AB\u1110\u1173", "\u1111\u1166\u110B\u1175\u11AB\u1110\u1173", "\u1111\u1167\u11AB\u1100\u1167\u11AB", "\u1111\u1167\u11AB\u110B\u1174", "\u1111\u1167\u11AB\u110C\u1175", "\u1111\u1167\u11AB\u1112\u1175", "\u1111\u1167\u11BC\u1100\u1161", "\u1111\u1167\u11BC\u1100\u1172\u11AB", "\u1111\u1167\u11BC\u1109\u1162\u11BC", "\u1111\u1167\u11BC\u1109\u1169", "\u1111\u1167\u11BC\u110B\u1163\u11BC", "\u1111\u1167\u11BC\u110B\u1175\u11AF", "\u1111\u1167\u11BC\u1112\u116A", "\u1111\u1169\u1109\u1173\u1110\u1165", "\u1111\u1169\u110B\u1175\u11AB\u1110\u1173", "\u1111\u1169\u110C\u1161\u11BC", "\u1111\u1169\u1112\u1161\u11B7", "\u1111\u116D\u1106\u1167\u11AB", "\u1111\u116D\u110C\u1165\u11BC", "\u1111\u116D\u110C\u116E\u11AB", "\u1111\u116D\u1112\u1167\u11AB", "\u1111\u116E\u11B7\u1106\u1169\u11A8", "\u1111\u116E\u11B7\u110C\u1175\u11AF", "\u1111\u116E\u11BC\u1100\u1167\u11BC", "\u1111\u116E\u11BC\u1109\u1169\u11A8", "\u1111\u116E\u11BC\u1109\u1173\u11B8", "\u1111\u1173\u1105\u1161\u11BC\u1109\u1173", "\u1111\u1173\u1105\u1175\u11AB\u1110\u1165", "\u1111\u1173\u11AF\u1105\u1161\u1109\u1173\u1110\u1175\u11A8", "\u1111\u1175\u1100\u1169\u11AB", "\u1111\u1175\u1106\u1161\u11BC", "\u1111\u1175\u110B\u1161\u1102\u1169", "\u1111\u1175\u11AF\u1105\u1173\u11B7", "\u1111\u1175\u11AF\u1109\u116E", "\u1111\u1175\u11AF\u110B\u116D", "\u1111\u1175\u11AF\u110C\u1161", "\u1111\u1175\u11AF\u1110\u1169\u11BC", "\u1111\u1175\u11BC\u1100\u1168", "\u1112\u1161\u1102\u1173\u1102\u1175\u11B7", "\u1112\u1161\u1102\u1173\u11AF", "\u1112\u1161\u1103\u1173\u110B\u1170\u110B\u1165", "\u1112\u1161\u1105\u116E\u11BA\u1107\u1161\u11B7", "\u1112\u1161\u1107\u1161\u11AB\u1100\u1175", "\u1112\u1161\u1109\u116E\u11A8\u110C\u1175\u11B8", "\u1112\u1161\u1109\u116E\u11AB", "\u1112\u1161\u110B\u1167\u1110\u1173\u11AB", "\u1112\u1161\u110C\u1175\u1106\u1161\u11AB", "\u1112\u1161\u110E\u1165\u11AB", "\u1112\u1161\u1111\u116E\u11B7", "\u1112\u1161\u1111\u1175\u11AF", "\u1112\u1161\u11A8\u1100\u116A", "\u1112\u1161\u11A8\u1100\u116D", "\u1112\u1161\u11A8\u1100\u1173\u11B8", "\u1112\u1161\u11A8\u1100\u1175", "\u1112\u1161\u11A8\u1102\u1167\u11AB", "\u1112\u1161\u11A8\u1105\u1167\u11A8", "\u1112\u1161\u11A8\u1107\u1165\u11AB", "\u1112\u1161\u11A8\u1107\u116E\u1106\u1169", "\u1112\u1161\u11A8\u1107\u1175", "\u1112\u1161\u11A8\u1109\u1162\u11BC", "\u1112\u1161\u11A8\u1109\u116E\u11AF", "\u1112\u1161\u11A8\u1109\u1173\u11B8", "\u1112\u1161\u11A8\u110B\u116D\u11BC\u1111\u116E\u11B7", "\u1112\u1161\u11A8\u110B\u116F\u11AB", "\u1112\u1161\u11A8\u110B\u1171", "\u1112\u1161\u11A8\u110C\u1161", "\u1112\u1161\u11A8\u110C\u1165\u11B7", "\u1112\u1161\u11AB\u1100\u1168", "\u1112\u1161\u11AB\u1100\u1173\u11AF", "\u1112\u1161\u11AB\u1101\u1165\u1107\u1165\u11AB\u110B\u1166", "\u1112\u1161\u11AB\u1102\u1161\u11BD", "\u1112\u1161\u11AB\u1102\u116E\u11AB", "\u1112\u1161\u11AB\u1103\u1169\u11BC\u110B\u1161\u11AB", "\u1112\u1161\u11AB\u1104\u1162", "\u1112\u1161\u11AB\u1105\u1161\u1109\u1161\u11AB", "\u1112\u1161\u11AB\u1106\u1161\u1103\u1175", "\u1112\u1161\u11AB\u1106\u116E\u11AB", "\u1112\u1161\u11AB\u1107\u1165\u11AB", "\u1112\u1161\u11AB\u1107\u1169\u11A8", "\u1112\u1161\u11AB\u1109\u1175\u11A8", "\u1112\u1161\u11AB\u110B\u1167\u1105\u1173\u11B7", "\u1112\u1161\u11AB\u110D\u1169\u11A8", "\u1112\u1161\u11AF\u1106\u1165\u1102\u1175", "\u1112\u1161\u11AF\u110B\u1161\u1107\u1165\u110C\u1175", "\u1112\u1161\u11AF\u110B\u1175\u11AB", "\u1112\u1161\u11B7\u1101\u1166", "\u1112\u1161\u11B7\u1107\u116E\u1105\u1169", "\u1112\u1161\u11B8\u1100\u1167\u11A8", "\u1112\u1161\u11B8\u1105\u1175\u110C\u1165\u11A8", "\u1112\u1161\u11BC\u1100\u1169\u11BC", "\u1112\u1161\u11BC\u1100\u116E", "\u1112\u1161\u11BC\u1109\u1161\u11BC", "\u1112\u1161\u11BC\u110B\u1174", "\u1112\u1162\u1100\u1167\u11AF", "\u1112\u1162\u1100\u116E\u11AB", "\u1112\u1162\u1103\u1161\u11B8", "\u1112\u1162\u1103\u1161\u11BC", "\u1112\u1162\u1106\u116E\u11AF", "\u1112\u1162\u1109\u1165\u11A8", "\u1112\u1162\u1109\u1165\u11AF", "\u1112\u1162\u1109\u116E\u110B\u116D\u11A8\u110C\u1161\u11BC", "\u1112\u1162\u110B\u1161\u11AB", "\u1112\u1162\u11A8\u1109\u1175\u11B7", "\u1112\u1162\u11AB\u1103\u1173\u1107\u1162\u11A8", "\u1112\u1162\u11B7\u1107\u1165\u1100\u1165", "\u1112\u1162\u11BA\u1107\u1167\u11C0", "\u1112\u1162\u11BA\u1109\u1161\u11AF", "\u1112\u1162\u11BC\u1103\u1169\u11BC", "\u1112\u1162\u11BC\u1107\u1169\u11A8", "\u1112\u1162\u11BC\u1109\u1161", "\u1112\u1162\u11BC\u110B\u116E\u11AB", "\u1112\u1162\u11BC\u110B\u1171", "\u1112\u1163\u11BC\u1100\u1175", "\u1112\u1163\u11BC\u1109\u1161\u11BC", "\u1112\u1163\u11BC\u1109\u116E", "\u1112\u1165\u1105\u1161\u11A8", "\u1112\u1165\u110B\u116D\u11BC", "\u1112\u1166\u11AF\u1100\u1175", "\u1112\u1167\u11AB\u1100\u116A\u11AB", "\u1112\u1167\u11AB\u1100\u1173\u11B7", "\u1112\u1167\u11AB\u1103\u1162", "\u1112\u1167\u11AB\u1109\u1161\u11BC", "\u1112\u1167\u11AB\u1109\u1175\u11AF", "\u1112\u1167\u11AB\u110C\u1161\u11BC", "\u1112\u1167\u11AB\u110C\u1162", "\u1112\u1167\u11AB\u110C\u1175", "\u1112\u1167\u11AF\u110B\u1162\u11A8", "\u1112\u1167\u11B8\u1105\u1167\u11A8", "\u1112\u1167\u11BC\u1107\u116E", "\u1112\u1167\u11BC\u1109\u1161", "\u1112\u1167\u11BC\u1109\u116E", "\u1112\u1167\u11BC\u1109\u1175\u11A8", "\u1112\u1167\u11BC\u110C\u1166", "\u1112\u1167\u11BC\u1110\u1162", "\u1112\u1167\u11BC\u1111\u1167\u11AB", "\u1112\u1168\u1110\u1162\u11A8", "\u1112\u1169\u1100\u1175\u1109\u1175\u11B7", "\u1112\u1169\u1102\u1161\u11B7", "\u1112\u1169\u1105\u1161\u11BC\u110B\u1175", "\u1112\u1169\u1107\u1161\u11A8", "\u1112\u1169\u1110\u1166\u11AF", "\u1112\u1169\u1112\u1173\u11B8", "\u1112\u1169\u11A8\u1109\u1175", "\u1112\u1169\u11AF\u1105\u1169", "\u1112\u1169\u11B7\u1111\u1166\u110B\u1175\u110C\u1175", "\u1112\u1169\u11BC\u1107\u1169", "\u1112\u1169\u11BC\u1109\u116E", "\u1112\u1169\u11BC\u110E\u1161", "\u1112\u116A\u1106\u1167\u11AB", "\u1112\u116A\u1107\u116E\u11AB", "\u1112\u116A\u1109\u1161\u11AF", "\u1112\u116A\u110B\u116D\u110B\u1175\u11AF", "\u1112\u116A\u110C\u1161\u11BC", "\u1112\u116A\u1112\u1161\u11A8", "\u1112\u116A\u11A8\u1107\u1169", "\u1112\u116A\u11A8\u110B\u1175\u11AB", "\u1112\u116A\u11A8\u110C\u1161\u11BC", "\u1112\u116A\u11A8\u110C\u1165\u11BC", "\u1112\u116A\u11AB\u1100\u1161\u11B8", "\u1112\u116A\u11AB\u1100\u1167\u11BC", "\u1112\u116A\u11AB\u110B\u1167\u11BC", "\u1112\u116A\u11AB\u110B\u1172\u11AF", "\u1112\u116A\u11AB\u110C\u1161", "\u1112\u116A\u11AF\u1100\u1175", "\u1112\u116A\u11AF\u1103\u1169\u11BC", "\u1112\u116A\u11AF\u1107\u1161\u11AF\u1112\u1175", "\u1112\u116A\u11AF\u110B\u116D\u11BC", "\u1112\u116A\u11AF\u110D\u1161\u11A8", "\u1112\u116C\u1100\u1167\u11AB", "\u1112\u116C\u1100\u116A\u11AB", "\u1112\u116C\u1107\u1169\u11A8", "\u1112\u116C\u1109\u1162\u11A8", "\u1112\u116C\u110B\u116F\u11AB", "\u1112\u116C\u110C\u1161\u11BC", "\u1112\u116C\u110C\u1165\u11AB", "\u1112\u116C\u11BA\u1109\u116E", "\u1112\u116C\u11BC\u1103\u1161\u11AB\u1107\u1169\u1103\u1169", "\u1112\u116D\u110B\u1172\u11AF\u110C\u1165\u11A8", "\u1112\u116E\u1107\u1161\u11AB", "\u1112\u116E\u110E\u116E\u11BA\u1100\u1161\u1105\u116E", "\u1112\u116E\u11AB\u1105\u1167\u11AB", "\u1112\u116F\u11AF\u110A\u1175\u11AB", "\u1112\u1172\u1109\u1175\u11A8", "\u1112\u1172\u110B\u1175\u11AF", "\u1112\u1172\u11BC\u1102\u1162", "\u1112\u1173\u1105\u1173\u11B7", "\u1112\u1173\u11A8\u1107\u1162\u11A8", "\u1112\u1173\u11A8\u110B\u1175\u11AB", "\u1112\u1173\u11AB\u110C\u1165\u11A8", "\u1112\u1173\u11AB\u1112\u1175", "\u1112\u1173\u11BC\u1106\u1175", "\u1112\u1173\u11BC\u1107\u116E\u11AB", "\u1112\u1174\u1100\u1169\u11A8", "\u1112\u1174\u1106\u1161\u11BC", "\u1112\u1174\u1109\u1162\u11BC", "\u1112\u1174\u11AB\u1109\u1162\u11A8", "\u1112\u1175\u11B7\u1101\u1165\u11BA"];
}
});
// node_modules/bip39-mnemonic/wordlist/portuguese.json
var require_portuguese = __commonJS({
"node_modules/bip39-mnemonic/wordlist/portuguese.json"(exports2, module2) {
module2.exports = ["abacate", "abaixo", "abalar", "abater", "abduzir", "abelha", "aberto", "abismo", "abotoar", "abranger", "abreviar", "abrigar", "abrupto", "absinto", "absoluto", "absurdo", "abutre", "acabado", "acalmar", "acampar", "acanhar", "acaso", "aceitar", "acelerar", "acenar", "acervo", "acessar", "acetona", "achatar", "acidez", "acima", "acionado", "acirrar", "aclamar", "aclive", "acolhida", "acomodar", "acoplar", "acordar", "acumular", "acusador", "adaptar", "adega", "adentro", "adepto", "adequar", "aderente", "adesivo", "adeus", "adiante", "aditivo", "adjetivo", "adjunto", "admirar", "adorar", "adquirir", "adubo", "adverso", "advogado", "aeronave", "afastar", "aferir", "afetivo", "afinador", "afivelar", "aflito", "afluente", "afrontar", "agachar", "agarrar", "agasalho", "agenciar", "agilizar", "agiota", "agitado", "agora", "agradar", "agreste", "agrupar", "aguardar", "agulha", "ajoelhar", "ajudar", "ajustar", "alameda", "alarme", "alastrar", "alavanca", "albergue", "albino", "alcatra", "aldeia", "alecrim", "alegria", "alertar", "alface", "alfinete", "algum", "alheio", "aliar", "alicate", "alienar", "alinhar", "aliviar", "almofada", "alocar", "alpiste", "alterar", "altitude", "alucinar", "alugar", "aluno", "alusivo", "alvo", "amaciar", "amador", "amarelo", "amassar", "ambas", "ambiente", "ameixa", "amenizar", "amido", "amistoso", "amizade", "amolador", "amontoar", "amoroso", "amostra", "amparar", "ampliar", "ampola", "anagrama", "analisar", "anarquia", "anatomia", "andaime", "anel", "anexo", "angular", "animar", "anjo", "anomalia", "anotado", "ansioso", "anterior", "anuidade", "anunciar", "anzol", "apagador", "apalpar", "apanhado", "apego", "apelido", "apertada", "apesar", "apetite", "apito", "aplauso", "aplicada", "apoio", "apontar", "aposta", "aprendiz", "aprovar", "aquecer", "arame", "aranha", "arara", "arcada", "ardente", "areia", "arejar", "arenito", "aresta", "argiloso", "argola", "arma", "arquivo", "arraial", "arrebate", "arriscar", "arroba", "arrumar", "arsenal", "arterial", "artigo", "arvoredo", "asfaltar", "asilado", "aspirar", "assador", "assinar", "assoalho", "assunto", "astral", "atacado", "atadura", "atalho", "atarefar", "atear", "atender", "aterro", "ateu", "atingir", "atirador", "ativo", "atoleiro", "atracar", "atrevido", "atriz", "atual", "atum", "auditor", "aumentar", "aura", "aurora", "autismo", "autoria", "autuar", "avaliar", "avante", "avaria", "avental", "avesso", "aviador", "avisar", "avulso", "axila", "azarar", "azedo", "azeite", "azulejo", "babar", "babosa", "bacalhau", "bacharel", "bacia", "bagagem", "baiano", "bailar", "baioneta", "bairro", "baixista", "bajular", "baleia", "baliza", "balsa", "banal", "bandeira", "banho", "banir", "banquete", "barato", "barbado", "baronesa", "barraca", "barulho", "baseado", "bastante", "batata", "batedor", "batida", "batom", "batucar", "baunilha", "beber", "beijo", "beirada", "beisebol", "beldade", "beleza", "belga", "beliscar", "bendito", "bengala", "benzer", "berimbau", "berlinda", "berro", "besouro", "bexiga", "bezerro", "bico", "bicudo", "bienal", "bifocal", "bifurcar", "bigorna", "bilhete", "bimestre", "bimotor", "biologia", "biombo", "biosfera", "bipolar", "birrento", "biscoito", "bisneto", "bispo", "bissexto", "bitola", "bizarro", "blindado", "bloco", "bloquear", "boato", "bobagem", "bocado", "bocejo", "bochecha", "boicotar", "bolada", "boletim", "bolha", "bolo", "bombeiro", "bonde", "boneco", "bonita", "borbulha", "borda", "boreal", "borracha", "bovino", "boxeador", "branco", "brasa", "braveza", "breu", "briga", "brilho", "brincar", "broa", "brochura", "bronzear", "broto", "bruxo", "bucha", "budismo", "bufar", "bule", "buraco", "busca", "busto", "buzina", "cabana", "cabelo", "cabide", "cabo", "cabrito", "cacau", "cacetada", "cachorro", "cacique", "cadastro", "cadeado", "cafezal", "caiaque", "caipira", "caixote", "cajado", "caju", "calafrio", "calcular", "caldeira", "calibrar", "calmante", "calota", "camada", "cambista", "camisa", "camomila", "campanha", "camuflar", "canavial", "cancelar", "caneta", "canguru", "canhoto", "canivete", "canoa", "cansado", "cantar", "canudo", "capacho", "capela", "capinar", "capotar", "capricho", "captador", "capuz", "caracol", "carbono", "cardeal", "careca", "carimbar", "carneiro", "carpete", "carreira", "cartaz", "carvalho", "casaco", "casca", "casebre", "castelo", "casulo", "catarata", "cativar", "caule", "causador", "cautelar", "cavalo", "caverna", "cebola", "cedilha", "cegonha", "celebrar", "celular", "cenoura", "censo", "centeio", "cercar", "cerrado", "certeiro", "cerveja", "cetim", "cevada", "chacota", "chaleira", "chamado", "chapada", "charme", "chatice", "chave", "chefe", "chegada", "cheiro", "cheque", "chicote", "chifre", "chinelo", "chocalho", "chover", "chumbo", "chutar", "chuva", "cicatriz", "ciclone", "cidade", "cidreira", "ciente", "cigana", "cimento", "cinto", "cinza", "ciranda", "circuito", "cirurgia", "citar", "clareza", "clero", "clicar", "clone", "clube", "coado", "coagir", "cobaia", "cobertor", "cobrar", "cocada", "coelho", "coentro", "coeso", "cogumelo", "coibir", "coifa", "coiote", "colar", "coleira", "colher", "colidir", "colmeia", "colono", "coluna", "comando", "combinar", "comentar", "comitiva", "comover", "complexo", "comum", "concha", "condor", "conectar", "confuso", "congelar", "conhecer", "conjugar", "consumir", "contrato", "convite", "cooperar", "copeiro", "copiador", "copo", "coquetel", "coragem", "cordial", "corneta", "coronha", "corporal", "correio", "cortejo", "coruja", "corvo", "cosseno", "costela", "cotonete", "couro", "couve", "covil", "cozinha", "cratera", "cravo", "creche", "credor", "creme", "crer", "crespo", "criada", "criminal", "crioulo", "crise", "criticar", "crosta", "crua", "cruzeiro", "cubano", "cueca", "cuidado", "cujo", "culatra", "culminar", "culpar", "cultura", "cumprir", "cunhado", "cupido", "curativo", "curral", "cursar", "curto", "cuspir", "custear", "cutelo", "damasco", "datar", "debater", "debitar", "deboche", "debulhar", "decalque", "decimal", "declive", "decote", "decretar", "dedal", "dedicado", "deduzir", "defesa", "defumar", "degelo", "degrau", "degustar", "deitado", "deixar", "delator", "delegado", "delinear", "delonga", "demanda", "demitir", "demolido", "dentista", "depenado", "depilar", "depois", "depressa", "depurar", "deriva", "derramar", "desafio", "desbotar", "descanso", "desenho", "desfiado", "desgaste", "desigual", "deslize", "desmamar", "desova", "despesa", "destaque", "desviar", "detalhar", "detentor", "detonar", "detrito", "deusa", "dever", "devido", "devotado", "dezena", "diagrama", "dialeto", "didata", "difuso", "digitar", "dilatado", "diluente", "diminuir", "dinastia", "dinheiro", "diocese", "direto", "discreta", "disfarce", "disparo", "disquete", "dissipar", "distante", "ditador", "diurno", "diverso", "divisor", "divulgar", "dizer", "dobrador", "dolorido", "domador", "dominado", "donativo", "donzela", "dormente", "dorsal", "dosagem", "dourado", "doutor", "drenagem", "drible", "drogaria", "duelar", "duende", "dueto", "duplo", "duquesa", "durante", "duvidoso", "eclodir", "ecoar", "ecologia", "edificar", "edital", "educado", "efeito", "efetivar", "ejetar", "elaborar", "eleger", "eleitor", "elenco", "elevador", "eliminar", "elogiar", "embargo", "embolado", "embrulho", "embutido", "emenda", "emergir", "emissor", "empatia", "empenho", "empinado", "empolgar", "emprego", "empurrar", "emulador", "encaixe", "encenado", "enchente", "encontro", "endeusar", "endossar", "enfaixar", "enfeite", "enfim", "engajado", "engenho", "englobar", "engomado", "engraxar", "enguia", "enjoar", "enlatar", "enquanto", "enraizar", "enrolado", "enrugar", "ensaio", "enseada", "ensino", "ensopado", "entanto", "enteado", "entidade", "entortar", "entrada", "entulho", "envergar", "enviado", "envolver", "enxame", "enxerto", "enxofre", "enxuto", "epiderme", "equipar", "ereto", "erguido", "errata", "erva", "ervilha", "esbanjar", "esbelto", "escama", "escola", "escrita", "escuta", "esfinge", "esfolar", "esfregar", "esfumado", "esgrima", "esmalte", "espanto", "espelho", "espiga", "esponja", "espreita", "espumar", "esquerda", "estaca", "esteira", "esticar", "estofado", "estrela", "estudo", "esvaziar", "etanol", "etiqueta", "euforia", "europeu", "evacuar", "evaporar", "evasivo", "eventual", "evidente", "evoluir", "exagero", "exalar", "examinar", "exato", "exausto", "excesso", "excitar", "exclamar", "executar", "exemplo", "exibir", "exigente", "exonerar", "expandir", "expelir", "expirar", "explanar", "exposto", "expresso", "expulsar", "externo", "extinto", "extrato", "fabricar", "fabuloso", "faceta", "facial", "fada", "fadiga", "faixa", "falar", "falta", "familiar", "fandango", "fanfarra", "fantoche", "fardado", "farelo", "farinha", "farofa", "farpa", "fartura", "fatia", "fator", "favorita", "faxina", "fazenda", "fechado", "feijoada", "feirante", "felino", "feminino", "fenda", "feno", "fera", "feriado", "ferrugem", "ferver", "festejar", "fetal", "feudal", "fiapo", "fibrose", "ficar", "ficheiro", "figurado", "fileira", "filho", "filme", "filtrar", "firmeza", "fisgada", "fissura", "fita", "fivela", "fixador", "fixo", "flacidez", "flamingo", "flanela", "flechada", "flora", "flutuar", "fluxo", "focal", "focinho", "fofocar", "fogo", "foguete", "foice", "folgado", "folheto", "forjar", "formiga", "forno", "forte", "fosco", "fossa", "fragata", "fralda", "frango", "frasco", "fraterno", "freira", "frente", "fretar", "frieza", "friso", "fritura", "fronha", "frustrar", "fruteira", "fugir", "fulano", "fuligem", "fundar", "fungo", "funil", "furador", "furioso", "futebol", "gabarito", "gabinete", "gado", "gaiato", "gaiola", "gaivota", "galega", "galho", "galinha", "galocha", "ganhar", "garagem", "garfo", "gargalo", "garimpo", "garoupa", "garrafa", "gasoduto", "gasto", "gata", "gatilho", "gaveta", "gazela", "gelado", "geleia", "gelo", "gemada", "gemer", "gemido", "generoso", "gengiva", "genial", "genoma", "genro", "geologia", "gerador", "germinar", "gesso", "gestor", "ginasta", "gincana", "gingado", "girafa", "girino", "glacial", "glicose", "global", "glorioso", "goela", "goiaba", "golfe", "golpear", "gordura", "gorjeta", "gorro", "gostoso", "goteira", "governar", "gracejo", "gradual", "grafite", "gralha", "grampo", "granada", "gratuito", "graveto", "graxa", "grego", "grelhar", "greve", "grilo", "grisalho", "gritaria", "grosso", "grotesco", "grudado", "grunhido", "gruta", "guache", "guarani", "guaxinim", "guerrear", "guiar", "guincho", "guisado", "gula", "guloso", "guru", "habitar", "harmonia", "haste", "haver", "hectare", "herdar", "heresia", "hesitar", "hiato", "hibernar", "hidratar", "hiena", "hino", "hipismo", "hipnose", "hipoteca", "hoje", "holofote", "homem", "honesto", "honrado", "hormonal", "hospedar", "humorado", "iate", "ideia", "idoso", "ignorado", "igreja", "iguana", "ileso", "ilha", "iludido", "iluminar", "ilustrar", "imagem", "imediato", "imenso", "imersivo", "iminente", "imitador", "imortal", "impacto", "impedir", "implante", "impor", "imprensa", "impune", "imunizar", "inalador", "inapto", "inativo", "incenso", "inchar", "incidir", "incluir", "incolor", "indeciso", "indireto", "indutor", "ineficaz", "inerente", "infantil", "infestar", "infinito", "inflamar", "informal", "infrator", "ingerir", "inibido", "inicial", "inimigo", "injetar", "inocente", "inodoro", "inovador", "inox", "inquieto", "inscrito", "inseto", "insistir", "inspetor", "instalar", "insulto", "intacto", "integral", "intimar", "intocado", "intriga", "invasor", "inverno", "invicto", "invocar", "iogurte", "iraniano", "ironizar", "irreal", "irritado", "isca", "isento", "isolado", "isqueiro", "italiano", "janeiro", "jangada", "janta", "jararaca", "jardim", "jarro", "jasmim", "jato", "javali", "jazida", "jejum", "joaninha", "joelhada", "jogador", "joia", "jornal", "jorrar", "jovem", "juba", "judeu", "judoca", "juiz", "julgador", "julho", "jurado", "jurista", "juro", "justa", "labareda", "laboral", "lacre", "lactante", "ladrilho", "lagarta", "lagoa", "laje", "lamber", "lamentar", "laminar", "lampejo", "lanche", "lapidar", "lapso", "laranja", "lareira", "largura", "lasanha", "lastro", "lateral", "latido", "lavanda", "lavoura", "lavrador", "laxante", "lazer", "lealdade", "lebre", "legado", "legendar", "legista", "leigo", "leiloar", "leitura", "lembrete", "leme", "lenhador", "lentilha", "leoa", "lesma", "leste", "letivo", "letreiro", "levar", "leveza", "levitar", "liberal", "libido", "liderar", "ligar", "ligeiro", "limitar", "limoeiro", "limpador", "linda", "linear", "linhagem", "liquidez", "listagem", "lisura", "litoral", "livro", "lixa", "lixeira", "locador", "locutor", "lojista", "lombo", "lona", "longe", "lontra", "lorde", "lotado", "loteria", "loucura", "lousa", "louvar", "luar", "lucidez", "lucro", "luneta", "lustre", "lutador", "luva", "macaco", "macete", "machado", "macio", "madeira", "madrinha", "magnata", "magreza", "maior", "mais", "malandro", "malha", "malote", "maluco", "mamilo", "mamoeiro", "mamute", "manada", "mancha", "mandato", "manequim", "manhoso", "manivela", "manobrar", "mansa", "manter", "manusear", "mapeado", "maquinar", "marcador", "maresia", "marfim", "margem", "marinho", "marmita", "maroto", "marquise", "marreco", "martelo", "marujo", "mascote", "masmorra", "massagem", "mastigar", "matagal", "materno", "matinal", "matutar", "maxilar", "medalha", "medida", "medusa", "megafone", "meiga", "melancia", "melhor", "membro", "memorial", "menino", "menos", "mensagem", "mental", "merecer", "mergulho", "mesada", "mesclar", "mesmo", "mesquita", "mestre", "metade", "meteoro", "metragem", "mexer", "mexicano", "micro", "migalha", "migrar", "milagre", "milenar", "milhar", "mimado", "minerar", "minhoca", "ministro", "minoria", "miolo", "mirante", "mirtilo", "misturar", "mocidade", "moderno", "modular", "moeda", "moer", "moinho", "moita", "moldura", "moleza", "molho", "molinete", "molusco", "montanha", "moqueca", "morango", "morcego", "mordomo", "morena", "mosaico", "mosquete", "mostarda", "motel", "motim", "moto", "motriz", "muda", "muito", "mulata", "mulher", "multar", "mundial", "munido", "muralha", "murcho", "muscular", "museu", "musical", "nacional", "nadador", "naja", "namoro", "narina", "narrado", "nascer", "nativa", "natureza", "navalha", "navegar", "navio", "neblina", "nebuloso", "negativa", "negociar", "negrito", "nervoso", "neta", "neural", "nevasca", "nevoeiro", "ninar", "ninho", "nitidez", "nivelar", "nobreza", "noite", "noiva", "nomear", "nominal", "nordeste", "nortear", "notar", "noticiar", "noturno", "novelo", "novilho", "novo", "nublado", "nudez", "numeral", "nupcial", "nutrir", "nuvem", "obcecado", "obedecer", "objetivo", "obrigado", "obscuro", "obstetra", "obter", "obturar", "ocidente", "ocioso", "ocorrer", "oculista", "ocupado", "ofegante", "ofensiva", "oferenda", "oficina", "ofuscado", "ogiva", "olaria", "oleoso", "olhar", "oliveira", "ombro", "omelete", "omisso", "omitir", "ondulado", "oneroso", "ontem", "opcional", "operador", "oponente", "oportuno", "oposto", "orar", "orbitar", "ordem", "ordinal", "orfanato", "orgasmo", "orgulho", "oriental", "origem", "oriundo", "orla", "ortodoxo", "orvalho", "oscilar", "ossada", "osso", "ostentar", "otimismo", "ousadia", "outono", "outubro", "ouvido", "ovelha", "ovular", "oxidar", "oxigenar", "pacato", "paciente", "pacote", "pactuar", "padaria", "padrinho", "pagar", "pagode", "painel", "pairar", "paisagem", "palavra", "palestra", "palheta", "palito", "palmada", "palpitar", "pancada", "panela", "panfleto", "panqueca", "pantanal", "papagaio", "papelada", "papiro", "parafina", "parcial", "pardal", "parede", "partida", "pasmo", "passado", "pastel", "patamar", "patente", "patinar", "patrono", "paulada", "pausar", "peculiar", "pedalar", "pedestre", "pediatra", "pedra", "pegada", "peitoral", "peixe", "pele", "pelicano", "penca", "pendurar", "peneira", "penhasco", "pensador", "pente", "perceber", "perfeito", "pergunta", "perito", "permitir", "perna", "perplexo", "persiana", "pertence", "peruca", "pescado", "pesquisa", "pessoa", "petiscar", "piada", "picado", "piedade", "pigmento", "pilastra", "pilhado", "pilotar", "pimenta", "pincel", "pinguim", "pinha", "pinote", "pintar", "pioneiro", "pipoca", "piquete", "piranha", "pires", "pirueta", "piscar", "pistola", "pitanga", "pivete", "planta", "plaqueta", "platina", "plebeu", "plumagem", "pluvial", "pneu", "poda", "poeira", "poetisa", "polegada", "policiar", "poluente", "polvilho", "pomar", "pomba", "ponderar", "pontaria", "populoso", "porta", "possuir", "postal", "pote", "poupar", "pouso", "povoar", "praia", "prancha", "prato", "praxe", "prece", "predador", "prefeito", "premiar", "prensar", "preparar", "presilha", "pretexto", "prevenir", "prezar", "primata", "princesa", "prisma", "privado", "processo", "produto", "profeta", "proibido", "projeto", "prometer", "propagar", "prosa", "protetor", "provador", "publicar", "pudim", "pular", "pulmonar", "pulseira", "punhal", "punir", "pupilo", "pureza", "puxador", "quadra", "quantia", "quarto", "quase", "quebrar", "queda", "queijo", "quente", "querido", "quimono", "quina", "quiosque", "rabanada", "rabisco", "rachar", "racionar", "radial", "raiar", "rainha", "raio", "raiva", "rajada", "ralado", "ramal", "ranger", "ranhura", "rapadura", "rapel", "rapidez", "raposa", "raquete", "raridade", "rasante", "rascunho", "rasgar", "raspador", "rasteira", "rasurar", "ratazana", "ratoeira", "realeza", "reanimar", "reaver", "rebaixar", "rebelde", "rebolar", "recado", "recente", "recheio", "recibo", "recordar", "recrutar", "recuar", "rede", "redimir", "redonda", "reduzida", "reenvio", "refinar", "refletir", "refogar", "refresco", "refugiar", "regalia", "regime", "regra", "reinado", "reitor", "rejeitar", "relativo", "remador", "remendo", "remorso", "renovado", "reparo", "repelir", "repleto", "repolho", "represa", "repudiar", "requerer", "resenha", "resfriar", "resgatar", "residir", "resolver", "respeito", "ressaca", "restante", "resumir", "retalho", "reter", "retirar", "retomada", "retratar", "revelar", "revisor", "revolta", "riacho", "rica", "rigidez", "rigoroso", "rimar", "ringue", "risada", "risco", "risonho", "robalo", "rochedo", "rodada", "rodeio", "rodovia", "roedor", "roleta", "romano", "roncar", "rosado", "roseira", "rosto", "rota", "roteiro", "rotina", "rotular", "rouco", "roupa", "roxo", "rubro", "rugido", "rugoso", "ruivo", "rumo", "rupestre", "russo", "sabor", "saciar", "sacola", "sacudir", "sadio", "safira", "saga", "sagrada", "saibro", "salada", "saleiro", "salgado", "saliva", "salpicar", "salsicha", "saltar", "salvador", "sambar", "samurai", "sanar", "sanfona", "sangue", "sanidade", "sapato", "sarda", "sargento", "sarjeta", "saturar", "saudade", "saxofone", "sazonal", "secar", "secular", "seda", "sedento", "sediado", "sedoso", "sedutor", "segmento", "segredo", "segundo", "seiva", "seleto", "selvagem", "semanal", "semente", "senador", "senhor", "sensual", "sentado", "separado", "sereia", "seringa", "serra", "servo", "setembro", "setor", "sigilo", "silhueta", "silicone", "simetria", "simpatia", "simular", "sinal", "sincero", "singular", "sinopse", "sintonia", "sirene", "siri", "situado", "soberano", "sobra", "socorro", "sogro", "soja", "solda", "soletrar", "solteiro", "sombrio", "sonata", "sondar", "sonegar", "sonhador", "sono", "soprano", "soquete", "sorrir", "sorteio", "sossego", "sotaque", "soterrar", "sovado", "sozinho", "suavizar", "subida", "submerso", "subsolo", "subtrair", "sucata", "sucesso", "suco", "sudeste", "sufixo", "sugador", "sugerir", "sujeito", "sulfato", "sumir", "suor", "superior", "suplicar", "suposto", "suprimir", "surdina", "surfista", "surpresa", "surreal", "surtir", "suspiro", "sustento", "tabela", "tablete", "tabuada", "tacho", "tagarela", "talher", "talo", "talvez", "tamanho", "tamborim", "tampa", "tangente", "tanto", "tapar", "tapioca", "tardio", "tarefa", "tarja", "tarraxa", "tatuagem", "taurino", "taxativo", "taxista", "teatral", "tecer", "tecido", "teclado", "tedioso", "teia", "teimar", "telefone", "telhado", "tempero", "tenente", "tensor", "tentar", "termal", "terno", "terreno", "tese", "tesoura", "testado", "teto", "textura", "texugo", "tiara", "tigela", "tijolo", "timbrar", "timidez", "tingido", "tinteiro", "tiragem", "titular", "toalha", "tocha", "tolerar", "tolice", "tomada", "tomilho", "tonel", "tontura", "topete", "tora", "torcido", "torneio", "torque", "torrada", "torto", "tostar", "touca", "toupeira", "toxina", "trabalho", "tracejar", "tradutor", "trafegar", "trajeto", "trama", "trancar", "trapo", "traseiro", "tratador", "travar", "treino", "tremer", "trepidar", "trevo", "triagem", "tribo", "triciclo", "tridente", "trilogia", "trindade", "triplo", "triturar", "triunfal", "trocar", "trombeta", "trova", "trunfo", "truque", "tubular", "tucano", "tudo", "tulipa", "tupi", "turbo", "turma", "turquesa", "tutelar", "tutorial", "uivar", "umbigo", "unha", "unidade", "uniforme", "urologia", "urso", "urtiga", "urubu", "usado", "usina", "usufruir", "vacina", "vadiar", "vagaroso", "vaidoso", "vala", "valente", "validade", "valores", "vantagem", "vaqueiro", "varanda", "vareta", "varrer", "vascular", "vasilha", "vassoura", "vazar", "vazio", "veado", "vedar", "vegetar", "veicular", "veleiro", "velhice", "veludo", "vencedor", "vendaval", "venerar", "ventre", "verbal", "verdade", "vereador", "vergonha", "vermelho", "verniz", "versar", "vertente", "vespa", "vestido", "vetorial", "viaduto", "viagem", "viajar", "viatura", "vibrador", "videira", "vidraria", "viela", "viga", "vigente", "vigiar", "vigorar", "vilarejo", "vinco", "vinheta", "vinil", "violeta", "virada", "virtude", "visitar", "visto", "vitral", "viveiro", "vizinho", "voador", "voar", "vogal", "volante", "voleibol", "voltagem", "volumoso", "vontade", "vulto", "vuvuzela", "xadrez", "xarope", "xeque", "xeretar", "xerife", "xingar", "zangado", "zarpar", "zebu", "zelador", "zombar", "zoologia", "zumbido"];
}
});
// node_modules/bip39-mnemonic/wordlist/russian.json
var require_russian = __commonJS({
"node_modules/bip39-mnemonic/wordlist/russian.json"(exports2, module2) {
module2.exports = ["\u0430\u0431\u0437\u0430\u0446", "\u0430\u0431\u043E\u043D\u0435\u043D\u0442", "\u0430\u0431\u0441\u0443\u0440\u0434", "\u0430\u0432\u0430\u043D\u0433\u0430\u0440\u0434", "\u0430\u0432\u0430\u0440\u0438\u044F", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0430\u0432\u0438\u0430\u0446\u0438\u044F", "\u0430\u0432\u0442\u043E\u0440", "\u0430\u0433\u0435\u043D\u0442", "\u0430\u0433\u0438\u0442\u0430\u0446\u0438\u044F", "\u0430\u0433\u0440\u0435\u0433\u0430\u0442", "\u0430\u0434\u0432\u043E\u043A\u0430\u0442", "\u0430\u0434\u043C\u0438\u0440\u0430\u043B", "\u0430\u0434\u0440\u0435\u0441", "\u0430\u0437\u0430\u0440\u0442", "\u0430\u0437\u043E\u0442", "\u0430\u043A\u0430\u0434\u0435\u043C\u0438\u044F", "\u0430\u043A\u0432\u0430\u0440\u0438\u0443\u043C", "\u0430\u043A\u0441\u0438\u043E\u043C\u0430", "\u0430\u043A\u0443\u043B\u0430", "\u0430\u043A\u0446\u0435\u043D\u0442", "\u0430\u043A\u0446\u0438\u044F", "\u0430\u043B\u043B\u0435\u044F", "\u0430\u043B\u043C\u0430\u0437", "\u0430\u043B\u0442\u0430\u0440\u044C", "\u0430\u043B\u044C\u0431\u043E\u043C", "\u0430\u043B\u044C\u044F\u043D\u0441", "\u0430\u043C\u0431\u0438\u0446\u0438\u044F", "\u0430\u043D\u0430\u043B\u0438\u0437", "\u0430\u043D\u0435\u043A\u0434\u043E\u0442", "\u0430\u043D\u043A\u0435\u0442\u0430", "\u0430\u043D\u0441\u0430\u043C\u0431\u043B\u044C", "\u0430\u043D\u0442\u0435\u043D\u043D\u0430", "\u0430\u043F\u0435\u043B\u044C\u0441\u0438\u043D", "\u0430\u043F\u043F\u0430\u0440\u0430\u0442", "\u0430\u043F\u043F\u0435\u0442\u0438\u0442", "\u0430\u043F\u0440\u0435\u043B\u044C", "\u0430\u043F\u0442\u0435\u043A\u0430", "\u0430\u0440\u0431\u0443\u0437", "\u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442", "\u0430\u0440\u0435\u043D\u0434\u0430", "\u0430\u0440\u0435\u0441\u0442", "\u0430\u0440\u043C\u0438\u044F", "\u0430\u0440\u043E\u043C\u0430\u0442", "\u0430\u0440\u0441\u0435\u043D\u0430\u043B", "\u0430\u0440\u0442\u0435\u0440\u0438\u044F", "\u0430\u0440\u0442\u0438\u0441\u0442", "\u0430\u0440\u0445\u0438\u0432", "\u0430\u0441\u043F\u0438\u0440\u0430\u043D\u0442", "\u0430\u0441\u0444\u0430\u043B\u044C\u0442", "\u0430\u0442\u0430\u043A\u0430", "\u0430\u0442\u043E\u043C\u043D\u044B\u0439", "\u0430\u0442\u0440\u0438\u0431\u0443\u0442", "\u0430\u0443\u043A\u0446\u0438\u043E\u043D", "\u0430\u0444\u0438\u0448\u0430", "\u0430\u044D\u0440\u043E\u043F\u043E\u0440\u0442", "\u0431\u0430\u0431\u043E\u0447\u043A\u0430", "\u0431\u0430\u0431\u0443\u0448\u043A\u0430", "\u0431\u0430\u0433\u0430\u0436", "\u0431\u0430\u0437\u0430", "\u0431\u0430\u043A\u0442\u0435\u0440\u0438\u044F", "\u0431\u0430\u043B\u0430\u043D\u0441", "\u0431\u0430\u043B\u0435\u0440\u0438\u043D\u0430", "\u0431\u0430\u043B\u043A\u043E\u043D", "\u0431\u0430\u043D\u0434\u0438\u0442", "\u0431\u0430\u043D\u043A", "\u0431\u0430\u0440\u0430\u0431\u0430\u043D", "\u0431\u0430\u0440\u043E\u043D", "\u0431\u0430\u0440\u044B\u0448\u043D\u044F", "\u0431\u0430\u0440\u044C\u0435\u0440", "\u0431\u0430\u0441\u0441\u0435\u0439\u043D", "\u0431\u0430\u0442\u0430\u0440\u0435\u044F", "\u0431\u0430\u0448\u043C\u0430\u043A", "\u0431\u0430\u0448\u043D\u044F", "\u0431\u0435\u0434\u043D\u044B\u0439", "\u0431\u0435\u0436\u0435\u043D\u0435\u0446", "\u0431\u0435\u0437\u0434\u043D\u0430", "\u0431\u0435\u043B\u043A\u0430", "\u0431\u0435\u043B\u044B\u0439", "\u0431\u0435\u043D\u0437\u0438\u043D", "\u0431\u0435\u0440\u0435\u0433", "\u0431\u0435\u0441\u0435\u0434\u0430", "\u0431\u0435\u0448\u0435\u043D\u044B\u0439", "\u0431\u0438\u043B\u0435\u0442", "\u0431\u0438\u043D\u043E\u043A\u043B\u044C", "\u0431\u0438\u0440\u0436\u0430", "\u0431\u0438\u0442\u0432\u0430", "\u0431\u043B\u0430\u0433\u043E", "\u0431\u043B\u0435\u0441\u043A", "\u0431\u043B\u0438\u0437\u043A\u0438\u0439", "\u0431\u043B\u0438\u043D", "\u0431\u043B\u043E\u043A", "\u0431\u043B\u044E\u0434\u043E", "\u0431\u043E\u0433\u0430\u0442\u044B\u0439", "\u0431\u043E\u0434\u0440\u044B\u0439", "\u0431\u043E\u0435\u0446", "\u0431\u043E\u043A\u0430\u043B", "\u0431\u043E\u043A\u043E\u0432\u043E\u0439", "\u0431\u043E\u043A\u0441", "\u0431\u043E\u043B\u0435\u0435", "\u0431\u043E\u043B\u043E\u0442\u043E", "\u0431\u043E\u043B\u0442\u0430\u0442\u044C", "\u0431\u043E\u043B\u044C\u0448\u043E\u0439", "\u0431\u043E\u043C\u0431\u0430", "\u0431\u043E\u0440\u0442", "\u0431\u043E\u0440\u044C\u0431\u0430", "\u0431\u043E\u0441\u043E\u0439", "\u0431\u043E\u0442\u0438\u043D\u043E\u043A", "\u0431\u043E\u044F\u0442\u044C\u0441\u044F", "\u0431\u0440\u0430\u043A", "\u0431\u0440\u0430\u0442\u044C", "\u0431\u0440\u0435\u0432\u043D\u043E", "\u0431\u0440\u0435\u0434", "\u0431\u0440\u0438\u0433\u0430\u0434\u0430", "\u0431\u0440\u043E\u0434\u044F\u0433\u0430", "\u0431\u0440\u043E\u043D\u044F", "\u0431\u0440\u043E\u0441\u0438\u0442\u044C", "\u0431\u0440\u044B\u0437\u0433\u0438", "\u0431\u0440\u044E\u043A\u0438", "\u0431\u0440\u044E\u0445\u043E", "\u0431\u0443\u0433\u043E\u0440", "\u0431\u0443\u0434\u043A\u0430", "\u0431\u0443\u0434\u043D\u0438", "\u0431\u0443\u0434\u0443\u0449\u0435\u0435", "\u0431\u0443\u043A\u0432\u0430", "\u0431\u0443\u043A\u0435\u0442", "\u0431\u0443\u043B\u044C\u0432\u0430\u0440", "\u0431\u0443\u043C\u0430\u0433\u0430", "\u0431\u0443\u043D\u0442", "\u0431\u0443\u0440\u043D\u044B\u0439", "\u0431\u0443\u0440\u044F", "\u0431\u0443\u0442\u044B\u043B\u043A\u0430", "\u0431\u0443\u0445\u0442\u0430", "\u0431\u044B\u0432\u0448\u0438\u0439", "\u0431\u044B\u0441\u0442\u0440\u043E", "\u0431\u044B\u0442\u043E\u0432\u043E\u0439", "\u0431\u044B\u0442\u044C", "\u0431\u044E\u0434\u0436\u0435\u0442", "\u0431\u044E\u0440\u043E", "\u0431\u044E\u0441\u0442", "\u0432\u0430\u0433\u043E\u043D", "\u0432\u0430\u0436\u043D\u044B\u0439", "\u0432\u0430\u043A\u0446\u0438\u043D\u0430", "\u0432\u0430\u043B\u0435\u043D\u043E\u043A", "\u0432\u0430\u043B\u044C\u0441", "\u0432\u0430\u043B\u044E\u0442\u0430", "\u0432\u0430\u043D\u043D\u0430\u044F", "\u0432\u0430\u0440\u0435\u043D\u044C\u0435", "\u0432\u0430\u0440\u0438\u0430\u043D\u0442", "\u0432\u0431\u043B\u0438\u0437\u0438", "\u0432\u0432\u0435\u0440\u0445", "\u0432\u0432\u043E\u0434\u0438\u0442\u044C", "\u0432\u0434\u0430\u043B\u0438", "\u0432\u0434\u0432\u043E\u0435", "\u0432\u0434\u043E\u0432\u0430", "\u0432\u0434\u043E\u043B\u044C", "\u0432\u0434\u0440\u0443\u0433", "\u0432\u0435\u0434\u0440\u043E", "\u0432\u0435\u0434\u0443\u0449\u0438\u0439", "\u0432\u0435\u0434\u044C\u043C\u0430", "\u0432\u0435\u0436\u043B\u0438\u0432\u043E", "\u0432\u0435\u0437\u0434\u0435", "\u0432\u0435\u043A\u043E", "\u0432\u0435\u043A\u0441\u0435\u043B\u044C", "\u0432\u0435\u043B\u0435\u0442\u044C", "\u0432\u0435\u043B\u0438\u043A\u0438\u0439", "\u0432\u0435\u043D\u0435\u0446", "\u0432\u0435\u043D\u0438\u043A", "\u0432\u0435\u0440\u0430\u043D\u0434\u0430", "\u0432\u0435\u0440\u0431\u043B\u044E\u0434", "\u0432\u0435\u0440\u0438\u0442\u044C", "\u0432\u0435\u0440\u043D\u044B\u0439", "\u0432\u0435\u0440\u0441\u0438\u044F", "\u0432\u0435\u0440\u0442\u0435\u0442\u044C", "\u0432\u0435\u0440\u0445\u043D\u0438\u0439", "\u0432\u0435\u0440\u0448\u0438\u043D\u0430", "\u0432\u0435\u0441\u0435\u043B\u043E", "\u0432\u0435\u0441\u043D\u0430", "\u0432\u0435\u0441\u043E\u043C\u044B\u0439", "\u0432\u0435\u0441\u0442\u0438", "\u0432\u0435\u0441\u044C", "\u0432\u0435\u0442\u0435\u0440\u0430\u043D", "\u0432\u0435\u0442\u0445\u0438\u0439", "\u0432\u0435\u0447\u0435\u0440", "\u0432\u0435\u0447\u043D\u043E", "\u0432\u0435\u0448\u0430\u043B\u043A\u0430", "\u0432\u0435\u0449\u0435\u0441\u0442\u0432\u043E", "\u0432\u0437\u0430\u043C\u0435\u043D", "\u0432\u0437\u0433\u043B\u044F\u0434", "\u0432\u0437\u0434\u043E\u0445", "\u0432\u0437\u043D\u043E\u0441", "\u0432\u0437\u043E\u0439\u0442\u0438", "\u0432\u0437\u043E\u0440", "\u0432\u0437\u0440\u044B\u0432", "\u0432\u0437\u044F\u0442\u044C", "\u0432\u0438\u0434\u0435\u0442\u044C", "\u0432\u0438\u0434\u0438\u043C\u043E", "\u0432\u0438\u0437\u0433", "\u0432\u0438\u0437\u0438\u0442", "\u0432\u0438\u043B\u043A\u0430", "\u0432\u0438\u043D\u0430", "\u0432\u0438\u0440\u0443\u0441", "\u0432\u0438\u0441\u043E\u043A", "\u0432\u0438\u0442\u0430\u043C\u0438\u043D", "\u0432\u0438\u0442\u0440\u0438\u043D\u0430", "\u0432\u0438\u0445\u0440\u044C", "\u0432\u0438\u0448\u043D\u044F", "\u0432\u043A\u0443\u0441", "\u0432\u043B\u0430\u0433\u0430", "\u0432\u043B\u0430\u0434\u0435\u043B\u0435\u0446", "\u0432\u043B\u0430\u0441\u0442\u044C", "\u0432\u043B\u0435\u0432\u043E", "\u0432\u043B\u0438\u044F\u043D\u0438\u0435", "\u0432\u043B\u043E\u0436\u0438\u0442\u044C", "\u0432\u043C\u0435\u0441\u0442\u0435", "\u0432\u043D\u0435\u0448\u043D\u0438\u0439", "\u0432\u043D\u0438\u043A\u0430\u0442\u044C", "\u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435", "\u0432\u043D\u043E\u0432\u044C", "\u0432\u043D\u0443\u043A", "\u0432\u043D\u0443\u0442\u0440\u0438", "\u0432\u043D\u0443\u0447\u043A\u0430", "\u0432\u043D\u0443\u0448\u0430\u0442\u044C", "\u0432\u043E\u0432\u043B\u0435\u0447\u044C", "\u0432\u043E\u0432\u0440\u0435\u043C\u044F", "\u0432\u043E\u0432\u0441\u044E", "\u0432\u043E\u0434\u0430", "\u0432\u043E\u0434\u043E\u0440\u043E\u0434", "\u0432\u043E\u0434\u044F\u043D\u043E\u0439", "\u0432\u043E\u0435\u0432\u0430\u0442\u044C", "\u0432\u043E\u0437\u0432\u0440\u0430\u0442", "\u0432\u043E\u0437\u0433\u043B\u0430\u0441", "\u0432\u043E\u0437\u0434\u0443\u0445", "\u0432\u043E\u0437\u0438\u0442\u044C", "\u0432\u043E\u0437\u043B\u0435", "\u0432\u043E\u0437\u043D\u044F", "\u0432\u043E\u0437\u0440\u0430\u0441\u0442", "\u0432\u043E\u0439\u043D\u0430", "\u0432\u043E\u0439\u0441\u043A\u043E", "\u0432\u043E\u043A\u0437\u0430\u043B", "\u0432\u043E\u043B\u043E\u0441", "\u0432\u043E\u043B\u0447\u0438\u0439", "\u0432\u043E\u043B\u044C\u043D\u044B\u0439", "\u0432\u043E\u043B\u044F", "\u0432\u043E\u043E\u0431\u0449\u0435", "\u0432\u043E\u043F\u043B\u044C", "\u0432\u043E\u043F\u0440\u043E\u0441", "\u0432\u043E\u0440\u043E\u0442\u0430", "\u0432\u043E\u0441\u0435\u043C\u044C", "\u0432\u043E\u0441\u0442\u043E\u043A", "\u0432\u043F\u043B\u043E\u0442\u044C", "\u0432\u043F\u043E\u043B\u043D\u0435", "\u0432\u043F\u0440\u0430\u0432\u0435", "\u0432\u043F\u0440\u0435\u0434\u044C", "\u0432\u043F\u0440\u043E\u0447\u0435\u043C", "\u0432\u0440\u0430\u0447", "\u0432\u0440\u0435\u0434\u043D\u044B\u0439", "\u0432\u0440\u0435\u043C\u044F", "\u0432\u0440\u0443\u0447\u0438\u0442\u044C", "\u0432\u0441\u0430\u0434\u043D\u0438\u043A", "\u0432\u0441\u0435\u0433\u0434\u0430", "\u0432\u0441\u043A\u043E\u0440\u0435", "\u0432\u0441\u043A\u0440\u044B\u0442\u044C", "\u0432\u0441\u043F\u043B\u0435\u0441\u043A", "\u0432\u0441\u043F\u044B\u0448\u043A\u0430", "\u0432\u0441\u0442\u0440\u0435\u0447\u0430", "\u0432\u0441\u044E\u0434\u0443", "\u0432\u0441\u044F\u043A\u0438\u0439", "\u0432\u0442\u043E\u0440\u043E\u0439", "\u0432\u0445\u043E\u0434", "\u0432\u0447\u0435\u0440\u0430", "\u0432\u044B\u0431\u043E\u0440", "\u0432\u044B\u0432\u043E\u0434", "\u0432\u044B\u0433\u043D\u0430\u0442\u044C", "\u0432\u044B\u0434\u0430\u0442\u044C", "\u0432\u044B\u0435\u0445\u0430\u0442\u044C", "\u0432\u044B\u0437\u043E\u0432", "\u0432\u044B\u0439\u0442\u0438", "\u0432\u044B\u043A\u0443\u043F", "\u0432\u044B\u043B\u0435\u0437\u0442\u0438", "\u0432\u044B\u043C\u044B\u0442\u044C", "\u0432\u044B\u043F\u0430\u0441\u0442\u044C", "\u0432\u044B\u043F\u0438\u0442\u044C", "\u0432\u044B\u043F\u043B\u0430\u0442\u0430", "\u0432\u044B\u043F\u0443\u0441\u043A", "\u0432\u044B\u0440\u0430\u0441\u0442\u0438", "\u0432\u044B\u0440\u0443\u0447\u043A\u0430", "\u0432\u044B\u0441\u043B\u0430\u0442\u044C", "\u0432\u044B\u0441\u043E\u043A\u0438\u0439", "\u0432\u044B\u0441\u0442\u0430\u0432\u043A\u0430", "\u0432\u044B\u0448\u043A\u0430", "\u0432\u044F\u0437\u0430\u0442\u044C", "\u0432\u044F\u043B\u044B\u0439", "\u0433\u0430\u0437\u0435\u0442\u0430", "\u0433\u0430\u0437\u043E\u0432\u044B\u0439", "\u0433\u0430\u043B\u0435\u0440\u0435\u044F", "\u0433\u0430\u043B\u0441\u0442\u0443\u043A", "\u0433\u0430\u043C\u043C\u0430", "\u0433\u0430\u0440\u0430\u043D\u0442\u0438\u044F", "\u0433\u0430\u0440\u043C\u043E\u043D\u0438\u044F", "\u0433\u0430\u0440\u043D\u0438\u0437\u043E\u043D", "\u0433\u0430\u0441\u0442\u0440\u043E\u043B\u0438", "\u0433\u0432\u0430\u0440\u0434\u0438\u044F", "\u0433\u0432\u043E\u0437\u0434\u044C", "\u0433\u0435\u043A\u0442\u0430\u0440", "\u0433\u0435\u043D\u0435\u0440\u0430\u043B", "\u0433\u0435\u043D\u0438\u0439", "\u0433\u0435\u043D\u043E\u043C", "\u0433\u0435\u043E\u043B\u043E\u0433", "\u0433\u0435\u0440\u0431", "\u0433\u0435\u0440\u043E\u0439", "\u0433\u0438\u0431\u043A\u0438\u0439", "\u0433\u0438\u0433\u0430\u043D\u0442", "\u0433\u0438\u043C\u043D", "\u0433\u0438\u043F\u043E\u0442\u0435\u0437\u0430", "\u0433\u0438\u0442\u0430\u0440\u0430", "\u0433\u043B\u0430\u0432\u043D\u044B\u0439", "\u0433\u043B\u0430\u0433\u043E\u043B", "\u0433\u043B\u0430\u0434\u0438\u0442\u044C", "\u0433\u043B\u0430\u0437", "\u0433\u043B\u0438\u043D\u0430", "\u0433\u043B\u043E\u0442\u043E\u043A", "\u0433\u043B\u0443\u0431\u043E\u043A\u0438\u0439", "\u0433\u043B\u0443\u043F\u044B\u0439", "\u0433\u043B\u0443\u0445\u043E\u0439", "\u0433\u043B\u044B\u0431\u0430", "\u0433\u043B\u044F\u0434\u0435\u0442\u044C", "\u0433\u043D\u0435\u0432", "\u0433\u043D\u0435\u0437\u0434\u043E", "\u0433\u043D\u0438\u043B\u043E\u0439", "\u0433\u043E\u0434\u043E\u0432\u043E\u0439", "\u0433\u043E\u043B\u043E\u0432\u0430", "\u0433\u043E\u043B\u0443\u0431\u043E\u0439", "\u0433\u043E\u043B\u044B\u0439", "\u0433\u043E\u043D\u043E\u0440\u0430\u0440", "\u0433\u043E\u0440\u0434\u043E\u0441\u0442\u044C", "\u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442", "\u0433\u043E\u0440\u043B\u043E", "\u0433\u043E\u0440\u043D\u044B\u0439", "\u0433\u043E\u0440\u043E\u0434", "\u0433\u043E\u0440\u0448\u043E\u043A", "\u0433\u043E\u0440\u044C\u043A\u0438\u0439", "\u0433\u043E\u0440\u044E\u0447\u0435\u0435", "\u0433\u043E\u0440\u044F\u0447\u0438\u0439", "\u0433\u043E\u0442\u043E\u0432\u044B\u0439", "\u0433\u0440\u0430\u0434\u0443\u0441", "\u0433\u0440\u0430\u043C\u043C", "\u0433\u0440\u0430\u043D\u0438\u0446\u0430", "\u0433\u0440\u0430\u0444", "\u0433\u0440\u0435\u0431\u0435\u043D\u044C", "\u0433\u0440\u0438\u0431", "\u0433\u0440\u0438\u043C\u0430\u0441\u0430", "\u0433\u0440\u043E\u0437\u0438\u0442\u044C", "\u0433\u0440\u043E\u0445\u043E\u0442", "\u0433\u0440\u043E\u0448", "\u0433\u0440\u0443\u0431\u044B\u0439", "\u0433\u0440\u0443\u0434\u044C", "\u0433\u0440\u0443\u0437", "\u0433\u0440\u0443\u043D\u0442", "\u0433\u0440\u0443\u043F\u043F\u0430", "\u0433\u0440\u0443\u0448\u0430", "\u0433\u0440\u044F\u0437\u043D\u044B\u0439", "\u0433\u0443\u0431\u0430", "\u0433\u0443\u0434\u043E\u043A", "\u0433\u0443\u043B\u043A\u0438\u0439", "\u0433\u0443\u043B\u044F\u0442\u044C", "\u0433\u0443\u0441\u0435\u043D\u0438\u0446\u0430", "\u0433\u0443\u0441\u0442\u043E", "\u0433\u0443\u0441\u044C", "\u0434\u0430\u0432\u043B\u0435\u043D\u0438\u0435", "\u0434\u0430\u0432\u043D\u043E", "\u0434\u0430\u0436\u0435", "\u0434\u0430\u043B\u044C\u043D\u0438\u0439", "\u0434\u0430\u043D\u043D\u044B\u0439", "\u0434\u0430\u0440\u0438\u0442\u044C", "\u0434\u0430\u0442\u0447\u0438\u043A", "\u0434\u0430\u0442\u044C", "\u0434\u0430\u0447\u0430", "\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044C", "\u0434\u0432\u0430\u0436\u0434\u044B", "\u0434\u0432\u0435\u0440\u044C", "\u0434\u0432\u0438\u0433\u0430\u0442\u044C", "\u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0435", "\u0434\u0432\u043E\u0439\u043D\u043E\u0439", "\u0434\u0432\u043E\u0440", "\u0434\u0435\u0431\u044E\u0442", "\u0434\u0435\u0432\u044F\u0442\u044B\u0439", "\u0434\u0435\u0436\u0443\u0440\u043D\u044B\u0439", "\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435", "\u0434\u0435\u043A\u0430\u0431\u0440\u044C", "\u0434\u0435\u043B\u0435\u043D\u0438\u0435", "\u0434\u0435\u043B\u043E", "\u0434\u0435\u043B\u044C\u0444\u0438\u043D", "\u0434\u0435\u043D\u044C", "\u0434\u0435\u0440\u0435\u0432\u043E", "\u0434\u0435\u0440\u0436\u0430\u0442\u044C", "\u0434\u0435\u0440\u0437\u043A\u0438\u0439", "\u0434\u0435\u0441\u044F\u0442\u044C", "\u0434\u0435\u0442\u0430\u043B\u044C", "\u0434\u0435\u0442\u0441\u043A\u0438\u0439", "\u0434\u0435\u0444\u0435\u043A\u0442", "\u0434\u0435\u0444\u0438\u0446\u0438\u0442", "\u0434\u0435\u044F\u0442\u0435\u043B\u044C", "\u0434\u0436\u0430\u0437", "\u0434\u0436\u0438\u043D\u0441\u044B", "\u0434\u0436\u0443\u043D\u0433\u043B\u0438", "\u0434\u0438\u0430\u0433\u043D\u043E\u0437", "\u0434\u0438\u0430\u043B\u043E\u0433", "\u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D", "\u0434\u0438\u0432\u0430\u043D", "\u0434\u0438\u0432\u0438\u0437\u0438\u044F", "\u0434\u0438\u0432\u043D\u044B\u0439", "\u0434\u0438\u0435\u0442\u0430", "\u0434\u0438\u0437\u0430\u0439\u043D", "\u0434\u0438\u043A\u0430\u0440\u044C", "\u0434\u0438\u043B\u0435\u0440", "\u0434\u0438\u043D\u0430\u043C\u0438\u043A\u0430", "\u0434\u0438\u043F\u043B\u043E\u043C", "\u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440", "\u0434\u0438\u0442\u044F", "\u0434\u043B\u0438\u043D\u043D\u044B\u0439", "\u0434\u043D\u0435\u0432\u043D\u0438\u043A", "\u0434\u043E\u0431\u0440\u044B\u0439", "\u0434\u043E\u0431\u044B\u0447\u0430", "\u0434\u043E\u0432\u0435\u0440\u0438\u0435", "\u0434\u043E\u0433\u0430\u0434\u043A\u0430", "\u0434\u043E\u0433\u043D\u0430\u0442\u044C", "\u0434\u043E\u0436\u0434\u044C", "\u0434\u043E\u043A\u043B\u0430\u0434", "\u0434\u043E\u043A\u0442\u043E\u0440", "\u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442", "\u0434\u043E\u043B\u0433\u043E", "\u0434\u043E\u043B\u0436\u0435\u043D", "\u0434\u043E\u043B\u0438\u043D\u0430", "\u0434\u043E\u043D\u043E\u0441", "\u0434\u043E\u0440\u043E\u0433\u0430", "\u0434\u043E\u0441\u0430\u0434\u0430", "\u0434\u043E\u0441\u043A\u0430", "\u0434\u043E\u0441\u0442\u0430\u0442\u044C", "\u0434\u043E\u0441\u0443\u0433", "\u0434\u043E\u0445\u043E\u0434", "\u0434\u043E\u0446\u0435\u043D\u0442", "\u0434\u043E\u0449\u0430\u0442\u044B\u0439", "\u0434\u0440\u0430\u043A\u0430", "\u0434\u0440\u0435\u0432\u043D\u0438\u0439", "\u0434\u0440\u0435\u043C\u0430\u0442\u044C", "\u0434\u0440\u043E\u0431\u043D\u044B\u0439", "\u0434\u0440\u043E\u0432\u0430", "\u0434\u0440\u043E\u0436\u0430\u0442\u044C", "\u0434\u0440\u0443\u0433\u043E\u0439", "\u0434\u0440\u0443\u0436\u0431\u0430", "\u0434\u0443\u0431\u043E\u0432\u044B\u0439", "\u0434\u0443\u0433\u0430", "\u0434\u0443\u043C\u0430\u0442\u044C", "\u0434\u0443\u0440\u043D\u043E\u0439", "\u0434\u0443\u0445\u0438", "\u0434\u0443\u0448\u043D\u044B\u0439", "\u0434\u0443\u044D\u043B\u044C", "\u0434\u0443\u044D\u0442", "\u0434\u044B\u0440\u0430", "\u0434\u044B\u0445\u0430\u043D\u0438\u0435", "\u0434\u044E\u0436\u0438\u043D\u0430", "\u0434\u044F\u0434\u044F", "\u0435\u0434\u0432\u0430", "\u0435\u0434\u0438\u043D\u044B\u0439", "\u0435\u0440\u0443\u043D\u0434\u0430", "\u0435\u0441\u043B\u0438", "\u0435\u0445\u0430\u0442\u044C", "\u0436\u0430\u0434\u043D\u044B\u0439", "\u0436\u0430\u0436\u0434\u0430", "\u0436\u0430\u043B\u0435\u0442\u044C", "\u0436\u0430\u043B\u043E\u0431\u0430", "\u0436\u0430\u043D\u0440", "\u0436\u0430\u0440\u0435\u043D\u044B\u0439", "\u0436\u0430\u0440\u043A\u0438\u0439", "\u0436\u0433\u0443\u0447\u0438\u0439", "\u0436\u0435\u0432\u0430\u0442\u044C", "\u0436\u0435\u043B\u0430\u043D\u0438\u0435", "\u0436\u0435\u043B\u0443\u0434\u043E\u043A", "\u0436\u0435\u043D\u0430", "\u0436\u0435\u043D\u0449\u0438\u043D\u0430", "\u0436\u0435\u0440\u0442\u0432\u0430", "\u0436\u0435\u0441\u0442", "\u0436\u0438\u0434\u043A\u043E\u0441\u0442\u044C", "\u0436\u0438\u0442\u0435\u043B\u044C", "\u0436\u0438\u0442\u044C", "\u0436\u0440\u0435\u0446", "\u0436\u0443\u043B\u0438\u043A", "\u0436\u0443\u0440\u043D\u0430\u043B", "\u0436\u0443\u0442\u043A\u0438\u0439", "\u0437\u0430\u0431\u0440\u0430\u0442\u044C", "\u0437\u0430\u0431\u044B\u0442\u044C", "\u0437\u0430\u0432\u0435\u0441\u0442\u0438", "\u0437\u0430\u0432\u043E\u0434", "\u0437\u0430\u0432\u0442\u0440\u0430", "\u0437\u0430\u0433\u0430\u0434\u043A\u0430", "\u0437\u0430\u0433\u043D\u0430\u0442\u044C", "\u0437\u0430\u0433\u043E\u0432\u043E\u0440", "\u0437\u0430\u0434\u0430\u0447\u0430", "\u0437\u0430\u0434\u0435\u0442\u044C", "\u0437\u0430\u0434\u043D\u0438\u0439", "\u0437\u0430\u0434\u043E\u043B\u0433\u043E", "\u0437\u0430\u0435\u0445\u0430\u0442\u044C", "\u0437\u0430\u043A\u0430\u0437", "\u0437\u0430\u043A\u043E\u043D", "\u0437\u0430\u043A\u0440\u044B\u0442\u044C", "\u0437\u0430\u043A\u0443\u0441\u043A\u0430", "\u0437\u0430\u043B\u0435\u0437\u0442\u044C", "\u0437\u0430\u043B\u0438\u0442\u044C", "\u0437\u0430\u043B\u043F", "\u0437\u0430\u043C\u043E\u043A", "\u0437\u0430\u043C\u0443\u0436", "\u0437\u0430\u043C\u044B\u0441\u0435\u043B", "\u0437\u0430\u043D\u0430\u0432\u0435\u0441", "\u0437\u0430\u043D\u043E\u0432\u043E", "\u0437\u0430\u043D\u044F\u0442\u044C", "\u0437\u0430\u043E\u0434\u043D\u043E", "\u0437\u0430\u043F\u0438\u0441\u044C", "\u0437\u0430\u043F\u0440\u043E\u0441", "\u0437\u0430\u043F\u0443\u0441\u043A", "\u0437\u0430\u043F\u044F\u0441\u0442\u044C\u0435", "\u0437\u0430\u0440\u0430\u043D\u0435\u0435", "\u0437\u0430\u0440\u043E\u0441\u043B\u044C", "\u0437\u0430\u0440\u043F\u043B\u0430\u0442\u0430", "\u0437\u0430\u0440\u044F", "\u0437\u0430\u0441\u0430\u0434\u0430", "\u0437\u0430\u0441\u043B\u0443\u0433\u0430", "\u0437\u0430\u0441\u043D\u0443\u0442\u044C", "\u0437\u0430\u0441\u0442\u0430\u0442\u044C", "\u0437\u0430\u0442\u0432\u043E\u0440", "\u0437\u0430\u0442\u0435\u044F\u0442\u044C", "\u0437\u0430\u0442\u0440\u0430\u0442\u0430", "\u0437\u0430\u0442\u044B\u043B\u043E\u043A", "\u0437\u0430\u0445\u0432\u0430\u0442", "\u0437\u0430\u0447\u0435\u043C", "\u0437\u0430\u0449\u0438\u0442\u0430", "\u0437\u0430\u044F\u0432\u0438\u0442\u044C", "\u0437\u0430\u044F\u0446", "\u0437\u0432\u0435\u0437\u0434\u0430", "\u0437\u0432\u0435\u043D\u043E", "\u0437\u0432\u043E\u043D\u0438\u0442\u044C", "\u0437\u0434\u0435\u0441\u044C", "\u0437\u0435\u043B\u0435\u043D\u044C", "\u0437\u0435\u043C\u043B\u044F", "\u0437\u0435\u0440\u043A\u0430\u043B\u043E", "\u0437\u0435\u0440\u043D\u043E", "\u0437\u0438\u043C\u0430", "\u0437\u043B\u043E\u0439", "\u0437\u043C\u0435\u044F", "\u0437\u043D\u0430\u043C\u044F", "\u0437\u043D\u0430\u043D\u0438\u0435", "\u0437\u043D\u0430\u0447\u0438\u0442", "\u0437\u043E\u043B\u043E\u0442\u043E\u0439", "\u0437\u043E\u043D\u0430", "\u0437\u043E\u043D\u0442\u0438\u043A", "\u0437\u043E\u043E\u043F\u0430\u0440\u043A", "\u0437\u0440\u0430\u0447\u043E\u043A", "\u0437\u0440\u0435\u043D\u0438\u0435", "\u0437\u0440\u0438\u0442\u0435\u043B\u044C", "\u0437\u0443\u0431\u043D\u043E\u0439", "\u0437\u0443\u0431\u0440", "\u0438\u0433\u043B\u0430", "\u0438\u0434\u0435\u0430\u043B", "\u0438\u0434\u0435\u043E\u043B\u043E\u0433", "\u0438\u0434\u0435\u044F", "\u0438\u0434\u043E\u043B", "\u0438\u0434\u0442\u0438", "\u0438\u0437\u0431\u0430", "\u0438\u0437\u0431\u0438\u0442\u044C", "\u0438\u0437\u0431\u0440\u0430\u0442\u044C", "\u0438\u0437\u0431\u044B\u0442\u043E\u043A", "\u0438\u0437\u0432\u043B\u0435\u0447\u044C", "\u0438\u0437\u0432\u043D\u0435", "\u0438\u0437\u0433\u0438\u0431", "\u0438\u0437\u0433\u043D\u0430\u0442\u044C", "\u0438\u0437\u0434\u0430\u043D\u0438\u0435", "\u0438\u0437\u0434\u0435\u043B\u0438\u0435", "\u0438\u0437\u043D\u0443\u0442\u0440\u0438", "\u0438\u0437\u043E\u0431\u0438\u043B\u0438\u0435", "\u0438\u0437\u043E\u043B\u044F\u0446\u0438\u044F", "\u0438\u0437\u0440\u0435\u0434\u043A\u0430", "\u0438\u0437\u0440\u044F\u0434\u043D\u043E", "\u0438\u0437\u0443\u0447\u0435\u043D\u0438\u0435", "\u0438\u0437\u044A\u044F\u0442\u044C", "\u0438\u0437\u044F\u0449\u043D\u044B\u0439", "\u0438\u043A\u043E\u043D\u0430", "\u0438\u043A\u0440\u0430", "\u0438\u043B\u043B\u044E\u0437\u0438\u044F", "\u0438\u043C\u0435\u043D\u043D\u043E", "\u0438\u043C\u0435\u0442\u044C", "\u0438\u043C\u0438\u0434\u0436", "\u0438\u043C\u043F\u0435\u0440\u0438\u044F", "\u0438\u043C\u043F\u0443\u043B\u044C\u0441", "\u0438\u043D\u0430\u0447\u0435", "\u0438\u043D\u0432\u0430\u043B\u0438\u0434", "\u0438\u043D\u0434\u0435\u043A\u0441", "\u0438\u043D\u0434\u0438\u0432\u0438\u0434", "\u0438\u043D\u0435\u0440\u0446\u0438\u044F", "\u0438\u043D\u0436\u0435\u043D\u0435\u0440", "\u0438\u043D\u043E\u0433\u0434\u0430", "\u0438\u043D\u043E\u0439", "\u0438\u043D\u0441\u0442\u0438\u0442\u0443\u0442", "\u0438\u043D\u0442\u0435\u0440\u0435\u0441", "\u0438\u043D\u0442\u0440\u0438\u0433\u0430", "\u0438\u043D\u0442\u0443\u0438\u0446\u0438\u044F", "\u0438\u043D\u0444\u0430\u0440\u043A\u0442", "\u0438\u043D\u0446\u0438\u0434\u0435\u043D\u0442", "\u0438\u0440\u043E\u043D\u0438\u044F", "\u0438\u0441\u043A\u0430\u0442\u044C", "\u0438\u0441\u043F\u0443\u0433", "\u0438\u0441\u0442\u043E\u0440\u0438\u044F", "\u0438\u0442\u043E\u0433", "\u0438\u044E\u043D\u044C", "\u043A\u0430\u0431\u0435\u043B\u044C", "\u043A\u0430\u0431\u0438\u043D\u0435\u0442", "\u043A\u0430\u0431\u043B\u0443\u043A", "\u043A\u0430\u0432\u0430\u043B\u0435\u0440", "\u043A\u0430\u0434\u0440", "\u043A\u0430\u0436\u0434\u044B\u0439", "\u043A\u0430\u0436\u0435\u0442\u0441\u044F", "\u043A\u0430\u0437\u0438\u043D\u043E", "\u043A\u0430\u043B\u0438\u0442\u043A\u0430", "\u043A\u0430\u043C\u0435\u043D\u044C", "\u043A\u0430\u043C\u0438\u043D", "\u043A\u0430\u043D\u0430\u043B", "\u043A\u0430\u043D\u0434\u0438\u0434\u0430\u0442", "\u043A\u0430\u043D\u0438\u043A\u0443\u043B\u044B", "\u043A\u0430\u043D\u043E\u043D", "\u043A\u0430\u043F\u0438\u0442\u0430\u043D", "\u043A\u0430\u043F\u043B\u044F", "\u043A\u0430\u043F\u043E\u0442", "\u043A\u0430\u043F\u0443\u0441\u0442\u0430", "\u043A\u0430\u0440\u0430\u043D\u0434\u0430\u0448", "\u043A\u0430\u0440\u0435\u0442\u0430", "\u043A\u0430\u0440\u043A\u0430\u0441", "\u043A\u0430\u0440\u043C\u0430\u043D", "\u043A\u0430\u0440\u0442\u0438\u043D\u0430", "\u043A\u0430\u0440\u044C\u0435\u0440\u0430", "\u043A\u0430\u0441\u043A\u0430", "\u043A\u0430\u0441\u0441\u0435\u0442\u0430", "\u043A\u0430\u0441\u0442\u0440\u044E\u043B\u044F", "\u043A\u0430\u0442\u0430\u043B\u043E\u0433", "\u043A\u0430\u0442\u0435\u0440", "\u043A\u0430\u0442\u043E\u043A", "\u043A\u0430\u0442\u0443\u0448\u043A\u0430", "\u043A\u0430\u0444\u0435\u0434\u0440\u0430", "\u043A\u0430\u0447\u0435\u0441\u0442\u0432\u043E", "\u043A\u0430\u0448\u0430", "\u043A\u0430\u0448\u043B\u044F\u0442\u044C", "\u043A\u0430\u044E\u0442\u0430", "\u043A\u0432\u0430\u0434\u0440\u0430\u0442", "\u043A\u0432\u0430\u0440\u0442\u0438\u0440\u0430", "\u043A\u0432\u043E\u0442\u0430", "\u043A\u0435\u043F\u043A\u0430", "\u043A\u0438\u0432\u043D\u0443\u0442\u044C", "\u043A\u0438\u043B\u043E\u043C\u0435\u0442\u0440", "\u043A\u0438\u043D\u043E", "\u043A\u0438\u043E\u0441\u043A", "\u043A\u0438\u043F\u044F\u0442\u043E\u043A", "\u043A\u0438\u0440\u043F\u0438\u0447", "\u043A\u0438\u0441\u043B\u043E\u0442\u0430", "\u043A\u0438\u0441\u0442\u044C", "\u043A\u043B\u0430\u0432\u0438\u0448\u0430", "\u043A\u043B\u0430\u043F\u0430\u043D", "\u043A\u043B\u0430\u0441\u0441", "\u043A\u043B\u0435\u0439", "\u043A\u043B\u0435\u0442\u043A\u0430", "\u043A\u043B\u0438\u0435\u043D\u0442", "\u043A\u043B\u0438\u043C\u0430\u0442", "\u043A\u043B\u0438\u043D\u0438\u043A\u0430", "\u043A\u043B\u0438\u0447\u043A\u0430", "\u043A\u043B\u043E\u0443\u043D", "\u043A\u043B\u043E\u0447\u043E\u043A", "\u043A\u043B\u0443\u0431", "\u043A\u043B\u0443\u043C\u0431\u0430", "\u043A\u043B\u044E\u0447", "\u043A\u043D\u0438\u0433\u0430", "\u043A\u043D\u043E\u043F\u043A\u0430", "\u043A\u043D\u0443\u0442", "\u043A\u043D\u044F\u0433\u0438\u043D\u044F", "\u043A\u043D\u044F\u0437\u044C", "\u043A\u043E\u0431\u0443\u0440\u0430", "\u043A\u043E\u0433\u0434\u0430", "\u043A\u043E\u0434\u0435\u043A\u0441", "\u043A\u043E\u0436\u0430", "\u043A\u043E\u043A\u0442\u0435\u0439\u043B\u044C", "\u043A\u043E\u043B\u0435\u043D\u043E", "\u043A\u043E\u043B\u043B\u0435\u0433\u0430", "\u043A\u043E\u043B\u043E\u043D\u043D\u0430", "\u043A\u043E\u043B\u043F\u0430\u043A", "\u043A\u043E\u043B\u044C\u0446\u043E", "\u043A\u043E\u043B\u044E\u0447\u0438\u0439", "\u043A\u043E\u043B\u044F\u0441\u043A\u0430", "\u043A\u043E\u043C\u0430\u043D\u0434\u0430", "\u043A\u043E\u043C\u0435\u0434\u0438\u044F", "\u043A\u043E\u043C\u0438\u0441\u0441\u0438\u044F", "\u043A\u043E\u043C\u043C\u0443\u043D\u0430", "\u043A\u043E\u043C\u043D\u0430\u0442\u0430", "\u043A\u043E\u043C\u043E\u043A", "\u043A\u043E\u043C\u043F\u0430\u043D\u0438\u044F", "\u043A\u043E\u043C\u0444\u043E\u0440\u0442", "\u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440", "\u043A\u043E\u043D\u0433\u0440\u0435\u0441\u0441", "\u043A\u043E\u043D\u0435\u0447\u043D\u043E", "\u043A\u043E\u043D\u043A\u0443\u0440\u0441", "\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C", "\u043A\u043E\u043D\u0446\u0435\u0440\u0442", "\u043A\u043E\u043D\u044C", "\u043A\u043E\u043D\u044E\u0448\u043D\u044F", "\u043A\u043E\u043F\u0430\u0442\u044C", "\u043A\u043E\u043F\u0435\u0439\u043A\u0430", "\u043A\u043E\u043F\u044B\u0442\u043E", "\u043A\u043E\u0440\u0430\u0431\u043B\u044C", "\u043A\u043E\u0440\u0435\u043D\u044C", "\u043A\u043E\u0440\u0437\u0438\u043D\u0430", "\u043A\u043E\u0440\u0438\u0434\u043E\u0440", "\u043A\u043E\u0440\u043C\u0438\u0442\u044C", "\u043A\u043E\u0440\u043F\u0443\u0441", "\u043A\u043E\u0441\u043C\u043E\u0441", "\u043A\u043E\u0441\u0442\u044E\u043C", "\u043A\u043E\u0441\u044F\u043A", "\u043A\u043E\u0442\u0435\u043B", "\u043A\u043E\u0442\u043B\u0435\u0442\u0430", "\u043A\u043E\u0442\u043E\u0440\u044B\u0439", "\u043A\u043E\u0442\u0442\u0435\u0434\u0436", "\u043A\u043E\u0444\u0435", "\u043A\u043E\u0444\u0442\u0430", "\u043A\u043E\u0448\u043A\u0430", "\u043A\u0440\u0430\u0436\u0430", "\u043A\u0440\u0430\u0439", "\u043A\u0440\u0430\u0441\u043D\u044B\u0439", "\u043A\u0440\u0430\u0442\u043A\u0438\u0439", "\u043A\u0440\u0435\u0434\u0438\u0442", "\u043A\u0440\u0435\u043C", "\u043A\u0440\u0435\u043F\u043A\u0438\u0439", "\u043A\u0440\u0435\u0441\u043B\u043E", "\u043A\u0440\u0438\u0432\u043E\u0439", "\u043A\u0440\u0438\u0437\u0438\u0441", "\u043A\u0440\u0438\u0441\u0442\u0430\u043B\u043B", "\u043A\u0440\u0438\u0442\u0435\u0440\u0438\u0439", "\u043A\u0440\u0438\u0447\u0430\u0442\u044C", "\u043A\u0440\u043E\u0432\u044C", "\u043A\u0440\u043E\u043A\u043E\u0434\u0438\u043B", "\u043A\u0440\u043E\u043B\u0438\u043A", "\u043A\u0440\u043E\u043C\u0435", "\u043A\u0440\u043E\u043D\u0430", "\u043A\u0440\u0443\u0433", "\u043A\u0440\u0443\u0436\u043A\u0430", "\u043A\u0440\u0443\u043F\u043D\u044B\u0439", "\u043A\u0440\u0443\u0442\u043E\u0439", "\u043A\u0440\u0443\u0448\u0435\u043D\u0438\u0435", "\u043A\u0440\u044B\u043B\u043E", "\u043A\u0440\u044B\u0448\u0430", "\u043A\u0440\u044E\u0447\u043E\u043A", "\u043A\u0441\u0442\u0430\u0442\u0438", "\u043A\u0443\u0431\u0438\u043A", "\u043A\u0443\u0434\u0430", "\u043A\u0443\u0437\u043E\u0432", "\u043A\u0443\u043A\u043B\u0430", "\u043A\u0443\u043B\u0430\u043A", "\u043A\u0443\u043B\u0438\u0441\u0430", "\u043A\u0443\u043B\u044C\u0442\u0443\u0440\u0430", "\u043A\u0443\u043C\u0438\u0440", "\u043A\u0443\u043F\u0435", "\u043A\u0443\u043F\u0438\u0442\u044C", "\u043A\u0443\u043F\u043E\u043B", "\u043A\u0443\u043F\u044E\u0440\u0430", "\u043A\u0443\u0440\u0438\u0446\u0430", "\u043A\u0443\u0440\u043E\u0440\u0442", "\u043A\u0443\u0440\u0441", "\u043A\u0443\u0440\u0442\u043A\u0430", "\u043A\u0443\u0441\u043E\u043A", "\u043A\u0443\u0441\u0442", "\u043A\u0443\u0445\u043D\u044F", "\u043A\u0443\u0448\u0430\u0442\u044C", "\u043B\u0430\u0431\u0438\u0440\u0438\u043D\u0442", "\u043B\u0430\u0432\u043A\u0430", "\u043B\u0430\u0433\u0435\u0440\u044C", "\u043B\u0430\u0434\u043D\u043E", "\u043B\u0430\u0434\u043E\u043D\u044C", "\u043B\u0430\u043F\u0430", "\u043B\u0430\u0443\u0440\u0435\u0430\u0442", "\u043B\u0433\u0430\u0442\u044C", "\u043B\u0435\u0431\u0435\u0434\u044C", "\u043B\u0435\u0432\u044B\u0439", "\u043B\u0435\u0433\u0435\u043D\u0434\u0430", "\u043B\u0435\u0433\u043A\u0438\u0439", "\u043B\u0435\u0434\u044F\u043D\u043E\u0439", "\u043B\u0435\u0436\u0430\u0442\u044C", "\u043B\u0435\u0437\u0432\u0438\u0435", "\u043B\u0435\u0437\u0442\u044C", "\u043B\u0435\u043A\u0446\u0438\u044F", "\u043B\u0435\u043D\u0438\u0432\u044B\u0439", "\u043B\u0435\u043D\u0442\u0430", "\u043B\u0435\u043F\u0435\u0441\u0442\u043E\u043A", "\u043B\u0435\u0441\u043D\u043E\u0439", "\u043B\u0435\u0441\u0442\u043D\u0438\u0446\u0430", "\u043B\u0435\u0442\u0435\u0442\u044C", "\u043B\u0435\u0442\u043E", "\u043B\u0435\u0447\u0438\u0442\u044C", "\u043B\u0438\u0433\u0430", "\u043B\u0438\u0434\u0435\u0440", "\u043B\u0438\u043B\u043E\u0432\u044B\u0439", "\u043B\u0438\u043C\u043E\u043D", "\u043B\u0438\u043D\u0438\u044F", "\u043B\u0438\u043F\u043A\u0438\u0439", "\u043B\u0438\u0441\u0442", "\u043B\u0438\u0442\u0440", "\u043B\u0438\u0445\u043E\u0439", "\u043B\u0438\u0446\u043E", "\u043B\u0438\u0448\u0438\u0442\u044C", "\u043B\u0438\u0448\u043D\u0438\u0439", "\u043B\u043E\u0432\u0438\u0442\u044C", "\u043B\u043E\u0433\u0438\u043A\u0430", "\u043B\u043E\u0434\u043A\u0430", "\u043B\u043E\u0436\u044C", "\u043B\u043E\u0437\u0443\u043D\u0433", "\u043B\u043E\u043A\u043E\u0442\u044C", "\u043B\u043E\u043F\u0430\u0442\u0430", "\u043B\u043E\u0448\u0430\u0434\u044C", "\u043B\u0443\u043A\u0430\u0432\u044B\u0439", "\u043B\u0443\u043D\u0430", "\u043B\u0443\u0447\u0448\u0438\u0439", "\u043B\u044B\u0441\u044B\u0439", "\u043B\u044C\u0433\u043E\u0442\u0430", "\u043B\u044E\u0431\u0438\u0442\u044C", "\u043B\u044E\u0431\u043E\u0439", "\u043B\u044E\u0434\u0441\u043A\u043E\u0439", "\u043B\u044E\u0441\u0442\u0440\u0430", "\u043B\u044E\u0442\u044B\u0439", "\u043B\u044F\u0433\u0443\u0448\u043A\u0430", "\u043C\u0430\u0433\u0430\u0437\u0438\u043D", "\u043C\u0430\u0433\u0438\u044F", "\u043C\u0430\u0439\u043E\u0440", "\u043C\u0430\u0439\u0441\u043A\u0438\u0439", "\u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C", "\u043C\u0430\u043A\u0443\u0448\u043A\u0430", "\u043C\u0430\u043B\u043E", "\u043C\u0430\u043B\u044C\u0447\u0438\u043A", "\u043C\u0430\u043C\u0430", "\u043C\u0430\u043D\u0435\u0440\u0430", "\u043C\u0430\u0440\u043A\u0430", "\u043C\u0430\u0440\u0442", "\u043C\u0430\u0440\u0448\u0440\u0443\u0442", "\u043C\u0430\u0441\u0441\u0430", "\u043C\u0430\u0441\u0442\u0435\u0440", "\u043C\u0430\u0441\u0448\u0442\u0430\u0431", "\u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B", "\u043C\u0430\u0442\u0447", "\u043C\u0430\u0445\u0430\u0442\u044C", "\u043C\u0430\u0448\u0438\u043D\u0430", "\u043C\u0430\u044F\u043A", "\u043C\u0435\u0431\u0435\u043B\u044C", "\u043C\u0435\u0434\u0430\u043B\u044C", "\u043C\u0435\u0434\u0432\u0435\u0434\u044C", "\u043C\u0435\u0434\u0438\u0446\u0438\u043D\u0430", "\u043C\u0435\u0434\u044C", "\u043C\u0435\u0436\u0434\u0443", "\u043C\u0435\u043B\u043A\u0438\u0439", "\u043C\u0435\u043B\u043E\u0447\u044C", "\u043C\u0435\u043C\u0443\u0430\u0440\u044B", "\u043C\u0435\u043D\u044C\u0448\u0435", "\u043C\u0435\u043D\u044E", "\u043C\u0435\u043D\u044F\u0442\u044C", "\u043C\u0435\u0440\u0430", "\u043C\u0435\u0440\u0446\u0430\u0442\u044C", "\u043C\u0435\u0441\u0442\u043E", "\u043C\u0435\u0441\u044F\u0446", "\u043C\u0435\u0442\u0430\u043B\u043B", "\u043C\u0435\u0442\u043E\u0434", "\u043C\u0435\u0442\u0440", "\u043C\u0435\u0445\u0430\u043D\u0438\u0437\u043C", "\u043C\u0435\u0445\u043E\u0432\u043E\u0439", "\u043C\u0435\u0447\u0442\u0430\u0442\u044C", "\u043C\u0435\u0448\u0430\u0442\u044C", "\u043C\u0435\u0448\u043E\u043A", "\u043C\u0438\u0433\u0440\u0430\u0446\u0438\u044F", "\u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D", "\u043C\u0438\u043B\u0438\u0446\u0438\u044F", "\u043C\u0438\u043B\u043B\u0438\u043E\u043D", "\u043C\u0438\u043B\u043E\u0441\u0442\u044C", "\u043C\u0438\u043B\u044F", "\u043C\u0438\u043C\u043E", "\u043C\u0438\u043D\u0435\u0440\u0430\u043B", "\u043C\u0438\u043D\u0438\u0441\u0442\u0440", "\u043C\u0438\u043D\u0443\u0442\u0430", "\u043C\u0438\u0440\u043D\u044B\u0439", "\u043C\u0438\u0441\u043A\u0430", "\u043C\u0438\u0441\u0441\u0438\u044F", "\u043C\u0438\u0442\u0438\u043D\u0433", "\u043C\u0438\u0448\u0435\u043D\u044C", "\u043C\u043B\u0430\u0434\u0448\u0438\u0439", "\u043C\u043D\u0435\u043D\u0438\u0435", "\u043C\u043D\u0438\u043C\u044B\u0439", "\u043C\u043D\u043E\u0433\u043E", "\u043C\u043E\u0433\u0443\u0447\u0438\u0439", "\u043C\u043E\u0434\u0435\u043B\u044C", "\u043C\u043E\u0436\u0435\u0442", "\u043C\u043E\u0437\u0433", "\u043C\u043E\u043A\u0440\u044B\u0439", "\u043C\u043E\u043B\u0435\u043A\u0443\u043B\u0430", "\u043C\u043E\u043B\u043D\u0438\u044F", "\u043C\u043E\u043B\u043E\u0434\u043E\u0439", "\u043C\u043E\u043B\u0447\u0430\u0442\u044C", "\u043C\u043E\u043C\u0435\u043D\u0442", "\u043C\u043E\u043D\u0435\u0442\u0430", "\u043C\u043E\u043D\u0438\u0442\u043E\u0440", "\u043C\u043E\u043D\u043E\u043B\u043E\u0433", "\u043C\u043E\u043D\u0441\u0442\u0440", "\u043C\u043E\u043D\u0442\u0430\u0436", "\u043C\u043E\u0440\u0430\u043B\u044C", "\u043C\u043E\u0440\u0435", "\u043C\u043E\u0440\u043A\u043E\u0432\u044C", "\u043C\u043E\u0440\u043E\u0437", "\u043C\u043E\u0440\u0449\u0438\u043D\u0430", "\u043C\u043E\u0441\u0442\u043E\u0432\u0430\u044F", "\u043C\u043E\u0442\u0430\u0442\u044C", "\u043C\u043E\u0442\u0438\u0432", "\u043C\u043E\u0442\u043E\u0440", "\u043C\u043E\u0445\u043D\u0430\u0442\u044B\u0439", "\u043C\u0440\u0430\u043C\u043E\u0440", "\u043C\u0440\u0430\u0447\u043D\u044B\u0439", "\u043C\u0441\u0442\u0438\u0442\u044C", "\u043C\u0443\u0434\u0440\u044B\u0439", "\u043C\u0443\u0436\u0435\u0441\u0442\u0432\u043E", "\u043C\u0443\u0436\u0447\u0438\u043D\u0430", "\u043C\u0443\u0437\u0435\u0439", "\u043C\u0443\u0437\u044B\u043A\u0430", "\u043C\u0443\u043D\u0434\u0438\u0440", "\u043C\u0443\u0440\u0430\u0432\u0435\u0439", "\u043C\u0443\u0441\u043E\u0440", "\u043C\u0443\u0445\u0430", "\u043C\u0447\u0430\u0442\u044C\u0441\u044F", "\u043C\u044B\u0441\u043B\u044C", "\u043C\u044B\u0442\u044C\u0441\u044F", "\u043C\u044B\u0448\u0446\u0430", "\u043C\u044B\u0448\u044C", "\u043C\u044E\u0437\u0438\u043A\u043B", "\u043C\u044F\u0433\u043A\u0438\u0439", "\u043C\u044F\u0441\u043E", "\u043D\u0430\u0431\u043E\u0440", "\u043D\u0430\u0432\u044B\u043A", "\u043D\u0430\u0433\u043B\u044B\u0439", "\u043D\u0430\u0433\u0440\u0443\u0437\u043A\u0430", "\u043D\u0430\u0434\u0435\u0436\u0434\u0430", "\u043D\u0430\u0434\u0437\u043E\u0440", "\u043D\u0430\u0434\u043E", "\u043D\u0430\u0435\u0434\u0438\u043D\u0435", "\u043D\u0430\u0437\u0430\u0434", "\u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435", "\u043D\u0430\u0437\u043B\u043E", "\u043D\u0430\u0438\u0432\u043D\u044B\u0439", "\u043D\u0430\u0439\u0442\u0438", "\u043D\u0430\u043A\u043E\u043D\u0435\u0446", "\u043D\u0430\u043B\u0435\u0432\u043E", "\u043D\u0430\u043B\u0438\u0447\u0438\u0435", "\u043D\u0430\u043B\u043E\u0433", "\u043D\u0430\u043C\u0435\u0440\u0435\u043D", "\u043D\u0430\u043D\u0435\u0441\u0442\u0438", "\u043D\u0430\u043F\u0430\u0441\u0442\u044C", "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440", "\u043D\u0430\u0440\u043E\u0434", "\u043D\u0430\u0441\u043B\u0435\u0434\u0438\u0435", "\u043D\u0430\u0442\u0443\u0440\u0430", "\u043D\u0430\u0443\u043A\u0430", "\u043D\u0430\u0443\u0442\u0440\u043E", "\u043D\u0430\u0447\u0430\u0442\u044C", "\u043D\u0435\u0431\u043E", "\u043D\u0435\u0432\u0430\u0436\u043D\u043E", "\u043D\u0435\u0432\u0435\u0441\u0442\u0430", "\u043D\u0435\u0433\u043E\u0434\u044F\u0439", "\u043D\u0435\u0434\u0430\u0432\u043D\u043E", "\u043D\u0435\u0434\u0435\u043B\u044F", "\u043D\u0435\u0434\u043E\u043B\u0433\u043E", "\u043D\u0435\u0434\u0440\u0430", "\u043D\u0435\u0434\u0443\u0433", "\u043D\u0435\u0436\u043D\u044B\u0439", "\u043D\u0435\u0437\u0430\u0447\u0435\u043C", "\u043D\u0435\u043A\u0442\u043E", "\u043D\u0435\u043B\u0435\u043F\u044B\u0439", "\u043D\u0435\u043B\u043E\u0432\u043A\u043E", "\u043D\u0435\u043B\u044C\u0437\u044F", "\u043D\u0435\u043C\u0430\u043B\u043E", "\u043D\u0435\u043C\u043E\u0439", "\u043D\u0435\u043F\u043B\u043E\u0445\u043E", "\u043D\u0435\u0440\u0432\u043D\u044B\u0439", "\u043D\u0435\u0440\u0435\u0434\u043A\u043E", "\u043D\u0435\u0441\u0442\u0438\u0441\u044C", "\u043D\u0435\u0443\u0434\u0430\u0447\u0430", "\u043D\u0435\u0443\u0436\u0435\u043B\u0438", "\u043D\u0435\u0444\u0442\u044C", "\u043D\u0435\u044F\u0441\u043D\u044B\u0439", "\u043D\u0438\u0433\u0434\u0435", "\u043D\u0438\u0437\u043A\u0438\u0439", "\u043D\u0438\u043A\u0430\u043A\u043E\u0439", "\u043D\u0438\u043A\u043E\u0433\u0434\u0430", "\u043D\u0438\u043A\u0443\u0434\u0430", "\u043D\u0438\u0447\u0442\u043E", "\u043D\u0438\u0447\u0443\u0442\u044C", "\u043D\u0438\u0448\u0430", "\u043D\u0438\u0449\u0438\u0439", "\u043D\u043E\u0432\u043E\u0441\u0442\u044C", "\u043D\u043E\u0432\u044B\u0439", "\u043D\u043E\u0433\u0430", "\u043D\u043E\u0433\u043E\u0442\u044C", "\u043D\u043E\u0436\u043D\u0438\u0446\u044B", "\u043D\u043E\u0437\u0434\u0440\u044F", "\u043D\u043E\u043C\u0435\u0440", "\u043D\u043E\u0441\u0438\u0442\u044C", "\u043D\u043E\u0441\u043E\u043A", "\u043D\u043E\u0447\u044C", "\u043D\u043E\u044F\u0431\u0440\u044C", "\u043D\u0440\u0430\u0432", "\u043D\u0443\u043B\u044C", "\u043D\u044B\u043D\u0447\u0435", "\u043D\u044B\u0440\u044F\u0442\u044C", "\u043D\u044E\u0430\u043D\u0441", "\u043D\u044F\u043D\u044F", "\u043E\u0431\u0430\u044F\u043D\u0438\u0435", "\u043E\u0431\u0435\u0434", "\u043E\u0431\u0435\u0437\u044C\u044F\u043D\u0430", "\u043E\u0431\u0435\u0449\u0430\u0442\u044C", "\u043E\u0431\u0436\u0435\u0447\u044C", "\u043E\u0431\u0437\u043E\u0440", "\u043E\u0431\u0438\u043B\u0438\u0435", "\u043E\u0431\u0438\u0442\u0430\u0442\u044C", "\u043E\u0431\u043B\u0430\u0441\u0442\u044C", "\u043E\u0431\u043B\u0438\u043A", "\u043E\u0431\u043B\u043E\u0436\u043A\u0430", "\u043E\u0431\u043C\u0435\u043D", "\u043E\u0431\u043C\u043E\u0440\u043E\u043A", "\u043E\u0431\u043E\u0436\u0430\u0442\u044C", "\u043E\u0431\u043E\u0438", "\u043E\u0431\u043E\u043B\u043E\u0447\u043A\u0430", "\u043E\u0431\u043E\u0440\u043E\u043D\u0430", "\u043E\u0431\u043E\u0447\u0438\u043D\u0430", "\u043E\u0431\u0440\u0430\u0437", "\u043E\u0431\u0440\u0435\u0441\u0442\u0438", "\u043E\u0431\u0440\u044B\u0432", "\u043E\u0431\u0443\u0432\u044C", "\u043E\u0431\u0443\u0447\u0435\u043D\u0438\u0435", "\u043E\u0431\u0445\u043E\u0434", "\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E", "\u043E\u0431\u0449\u0438\u0439", "\u043E\u0431\u044A\u0435\u043A\u0442", "\u043E\u0431\u044B\u0441\u043A", "\u043E\u0431\u044B\u0447\u043D\u043E", "\u043E\u0431\u044F\u0437\u0430\u0442\u044C", "\u043E\u0432\u043E\u0449\u0438", "\u043E\u0432\u0440\u0430\u0433", "\u043E\u0432\u0446\u0430", "\u043E\u0433\u043E\u0432\u043E\u0440\u043A\u0430", "\u043E\u0433\u0440\u0430\u0434\u0430", "\u043E\u0433\u0443\u0440\u0435\u0446", "\u043E\u0434\u0435\u0436\u0434\u0430", "\u043E\u0434\u0435\u044F\u043B\u043E", "\u043E\u0434\u0438\u043D", "\u043E\u0434\u043D\u0430\u043A\u043E", "\u043E\u0434\u043E\u043B\u0435\u0442\u044C", "\u043E\u0436\u0438\u0434\u0430\u0442\u044C", "\u043E\u0437\u0435\u0440\u043E", "\u043E\u043A\u0435\u0430\u043D", "\u043E\u043A\u043D\u043E", "\u043E\u043A\u043E\u043B\u043E", "\u043E\u043A\u043E\u043F", "\u043E\u043A\u0440\u0430\u0438\u043D\u0430", "\u043E\u043A\u0442\u044F\u0431\u0440\u044C", "\u043E\u043F\u0430\u0441\u043D\u044B\u0439", "\u043E\u043F\u0435\u043A\u0430", "\u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F", "\u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", "\u043E\u043F\u043B\u0430\u0442\u0430", "\u043E\u043F\u043E\u0440\u0430", "\u043E\u043F\u043F\u043E\u043D\u0435\u043D\u0442", "\u043E\u043F\u0442\u0438\u043C\u0438\u0437\u043C", "\u043E\u043F\u0442\u043E\u0432\u044B\u0439", "\u043E\u043F\u0443\u0445\u043E\u043B\u044C", "\u043E\u043F\u044B\u0442", "\u043E\u0440\u0430\u0442\u043E\u0440", "\u043E\u0440\u0431\u0438\u0442\u0430", "\u043E\u0440\u0433\u0430\u043D", "\u043E\u0440\u0434\u0435\u043D", "\u043E\u0440\u0435\u043B", "\u043E\u0440\u0438\u0433\u0438\u043D\u0430\u043B", "\u043E\u0440\u0438\u0435\u043D\u0442\u0438\u0440", "\u043E\u0440\u043A\u0435\u0441\u0442\u0440", "\u043E\u0440\u0443\u0436\u0438\u0435", "\u043E\u0441\u0435\u043D\u043D\u0438\u0439", "\u043E\u0441\u043A\u043E\u043B\u043E\u043A", "\u043E\u0441\u043C\u043E\u0442\u0440", "\u043E\u0441\u0442\u0440\u043E\u0432", "\u043E\u0442\u0431\u043E\u0440", "\u043E\u0442\u0431\u044B\u0442\u044C", "\u043E\u0442\u0432\u043B\u0435\u0447\u044C", "\u043E\u0442\u0434\u0430\u0442\u044C", "\u043E\u0442\u0434\u0435\u043B", "\u043E\u0442\u0434\u044B\u0445", "\u043E\u0442\u0435\u043B\u044C", "\u043E\u0442\u0435\u0446", "\u043E\u0442\u0437\u044B\u0432", "\u043E\u0442\u043A\u0430\u0437", "\u043E\u0442\u043A\u043B\u0438\u043A", "\u043E\u0442\u043A\u0440\u044B\u0442\u044C", "\u043E\u0442\u043A\u0443\u0434\u0430", "\u043E\u0442\u043B\u0438\u0447\u0438\u0435", "\u043E\u0442\u043D\u044B\u043D\u0435", "\u043E\u0442\u043E\u0439\u0442\u0438", "\u043E\u0442\u043F\u0443\u0441\u043A", "\u043E\u0442\u0440\u0430\u0441\u043B\u044C", "\u043E\u0442\u0440\u043E\u0441\u0442\u043E\u043A", "\u043E\u0442\u0440\u044B\u0432\u043E\u043A", "\u043E\u0442\u0440\u044F\u0434", "\u043E\u0442\u0441\u0435\u043A", "\u043E\u0442\u0441\u0442\u0430\u0432\u043A\u0430", "\u043E\u0442\u0441\u044E\u0434\u0430", "\u043E\u0442\u0442\u0435\u043D\u043E\u043A", "\u043E\u0442\u0442\u043E\u0433\u043E", "\u043E\u0442\u0447\u0435\u0433\u043E", "\u043E\u0442\u044A\u0435\u0437\u0434", "\u043E\u0444\u0438\u0441", "\u043E\u0444\u0438\u0446\u0435\u0440", "\u043E\u0445\u043E\u0442\u0430", "\u043E\u0445\u0440\u0430\u043D\u0430", "\u043E\u0446\u0435\u043D\u043A\u0430", "\u043E\u0447\u0430\u0433", "\u043E\u0447\u0435\u043D\u044C", "\u043E\u0447\u0435\u0440\u0435\u0434\u044C", "\u043E\u0447\u0438\u0449\u0430\u0442\u044C", "\u043E\u0448\u0438\u0431\u043A\u0430", "\u043E\u0449\u0443\u0449\u0435\u043D\u0438\u0435", "\u043F\u0430\u0432\u0438\u043B\u044C\u043E\u043D", "\u043F\u0430\u0434\u0430\u0442\u044C", "\u043F\u0430\u0437\u0443\u0445\u0430", "\u043F\u0430\u043A\u0435\u0442", "\u043F\u0430\u043B\u0430\u0442\u0430", "\u043F\u0430\u043B\u0435\u0446", "\u043F\u0430\u043B\u0443\u0431\u0430", "\u043F\u0430\u043B\u044C\u0442\u043E", "\u043F\u0430\u043C\u044F\u0442\u044C", "\u043F\u0430\u043D\u0435\u043B\u044C", "\u043F\u0430\u043D\u0438\u043A\u0430", "\u043F\u0430\u0440\u0430", "\u043F\u0430\u0440\u0435\u043D\u044C", "\u043F\u0430\u0440\u043E\u0445\u043E\u0434", "\u043F\u0430\u0440\u0442\u0438\u044F", "\u043F\u0430\u0440\u0443\u0441", "\u043F\u0430\u0441\u043F\u043E\u0440\u0442", "\u043F\u0430\u0441\u0441\u0430\u0436\u0438\u0440", "\u043F\u0430\u0441\u0442\u0443\u0445", "\u043F\u0430\u0442\u0435\u043D\u0442", "\u043F\u0430\u0442\u0440\u043E\u043D", "\u043F\u0430\u0443\u0437\u0430", "\u043F\u0430\u0443\u043A", "\u043F\u0430\u0443\u0442\u0438\u043D\u0430", "\u043F\u0430\u0444\u043E\u0441", "\u043F\u0430\u0445\u043D\u0443\u0442\u044C", "\u043F\u0430\u0446\u0438\u0435\u043D\u0442", "\u043F\u0430\u0447\u043A\u0430", "\u043F\u0435\u0432\u0435\u0446", "\u043F\u0435\u0434\u0430\u0433\u043E\u0433", "\u043F\u0435\u0439\u0437\u0430\u0436", "\u043F\u0435\u043D\u0441\u0438\u044F", "\u043F\u0435\u043F\u0435\u043B", "\u043F\u0435\u0440\u0432\u044B\u0439", "\u043F\u0435\u0440\u0435\u0434", "\u043F\u0435\u0440\u0438\u043E\u0434", "\u043F\u0435\u0440\u043E", "\u043F\u0435\u0440\u0440\u043E\u043D", "\u043F\u0435\u0440\u0441\u043E\u043D\u0430\u0436", "\u043F\u0435\u0440\u0447\u0430\u0442\u043A\u0430", "\u043F\u0435\u0441\u043D\u044F", "\u043F\u0435\u0441\u043E\u043A", "\u043F\u0435\u0442\u043B\u044F", "\u043F\u0435\u0442\u0440\u0443\u0448\u043A\u0430", "\u043F\u0435\u0442\u0443\u0445", "\u043F\u0435\u0445\u043E\u0442\u0430", "\u043F\u0435\u0447\u0430\u0442\u044C", "\u043F\u0435\u0447\u0435\u043D\u044C", "\u043F\u0435\u0448\u043A\u043E\u043C", "\u043F\u0435\u0449\u0435\u0440\u0430", "\u043F\u0438\u0430\u043D\u0438\u0441\u0442", "\u043F\u0438\u0434\u0436\u0430\u043A", "\u043F\u0438\u043B\u043E\u0442", "\u043F\u0438\u043E\u043D\u0435\u0440", "\u043F\u0438\u0440\u0430\u043C\u0438\u0434\u0430", "\u043F\u0438\u0440\u043E\u0436\u043E\u043A", "\u043F\u0438\u0441\u044C\u043C\u043E", "\u043F\u0438\u0449\u0430", "\u043F\u043B\u0430\u0432\u0430\u043D\u0438\u0435", "\u043F\u043B\u0430\u043A\u0430\u0442\u044C", "\u043F\u043B\u0430\u043C\u044F", "\u043F\u043B\u0430\u043D", "\u043F\u043B\u0430\u0441\u0442", "\u043F\u043B\u0430\u0442\u0438\u0442\u044C", "\u043F\u043B\u0435\u043D\u043D\u044B\u0439", "\u043F\u043B\u0435\u0447\u043E", "\u043F\u043B\u0438\u0442\u0430", "\u043F\u043B\u043E\u0434", "\u043F\u043B\u043E\u0441\u043A\u0438\u0439", "\u043F\u043B\u043E\u0442\u043D\u044B\u0439", "\u043F\u043B\u043E\u0445\u043E\u0439", "\u043F\u043B\u043E\u0449\u0430\u0434\u044C", "\u043F\u043B\u044B\u0442\u044C", "\u043F\u043B\u044E\u0441", "\u043F\u043B\u044F\u0436", "\u043F\u043B\u044F\u0441\u0430\u0442\u044C", "\u043F\u043E\u0431\u0435\u0434\u0430", "\u043F\u043E\u0432\u0430\u0440", "\u043F\u043E\u0432\u043E\u0434", "\u043F\u043E\u0432\u0441\u044E\u0434\u0443", "\u043F\u043E\u0432\u044F\u0437\u043A\u0430", "\u043F\u043E\u0433\u043E\u0434\u0430", "\u043F\u043E\u0433\u0440\u0435\u0431", "\u043F\u043E\u0434\u0431\u043E\u0440", "\u043F\u043E\u0434\u0432\u0438\u0433", "\u043F\u043E\u0434\u0434\u0435\u043B\u043A\u0430", "\u043F\u043E\u0434\u0436\u0430\u0442\u044C", "\u043F\u043E\u0434\u043D\u043E\u0441", "\u043F\u043E\u0434\u043F\u0438\u0441\u044C", "\u043F\u043E\u0434\u0440\u0443\u0433\u0430", "\u043F\u043E\u0434\u0445\u043E\u0434", "\u043F\u043E\u0434\u0447\u0430\u0441", "\u043F\u043E\u0434\u044A\u0435\u0437\u0434", "\u043F\u043E\u0435\u0434\u0438\u043D\u043E\u043A", "\u043F\u043E\u0435\u0437\u0434", "\u043F\u043E\u0435\u0441\u0442\u044C", "\u043F\u043E\u0435\u0445\u0430\u0442\u044C", "\u043F\u043E\u0436\u0430\u043B\u0443\u0439", "\u043F\u043E\u0436\u0438\u043B\u043E\u0439", "\u043F\u043E\u0437\u0430\u0434\u0438", "\u043F\u043E\u0437\u0432\u0430\u0442\u044C", "\u043F\u043E\u0437\u0434\u043D\u0438\u0439", "\u043F\u043E\u0437\u0438\u0446\u0438\u044F", "\u043F\u043E\u0437\u043E\u0440", "\u043F\u043E\u0438\u0441\u043A", "\u043F\u043E\u0439\u043C\u0430\u0442\u044C", "\u043F\u043E\u0439\u0442\u0438", "\u043F\u043E\u043A\u043B\u043E\u043D", "\u043F\u043E\u043A\u043E\u0439", "\u043F\u043E\u043A\u0440\u044B\u0442\u044C", "\u043F\u043E\u043B\u0434\u0435\u043D\u044C", "\u043F\u043E\u043B\u0435\u0437\u043D\u044B\u0439", "\u043F\u043E\u043B\u0437\u0442\u0438", "\u043F\u043E\u043B\u043A", "\u043F\u043E\u043B\u043D\u044B\u0439", "\u043F\u043E\u043B\u043E\u0432\u0438\u043D\u0430", "\u043F\u043E\u043B\u0442\u043E\u0440\u0430", "\u043F\u043E\u043B\u044C\u0437\u0430", "\u043F\u043E\u043B\u044F\u043D\u0430", "\u043F\u043E\u043C\u0438\u0434\u043E\u0440", "\u043F\u043E\u043C\u043D\u0438\u0442\u044C", "\u043F\u043E\u043C\u043E\u0449\u044C", "\u043F\u043E\u043F\u0430\u0441\u0442\u044C", "\u043F\u043E\u043F\u0435\u0440\u0435\u043A", "\u043F\u043E\u043F\u043B\u044B\u0442\u044C", "\u043F\u043E\u043F\u043E\u043B\u0430\u043C", "\u043F\u043E\u043F\u0440\u0430\u0432\u043A\u0430", "\u043F\u043E\u043F\u0443\u0433\u0430\u0439", "\u043F\u043E\u043F\u044B\u0442\u043A\u0430", "\u043F\u043E\u0440\u043E\u0433", "\u043F\u043E\u0440\u0442\u0440\u0435\u0442", "\u043F\u043E\u0440\u0446\u0438\u044F", "\u043F\u043E\u0440\u044B\u0432", "\u043F\u043E\u0440\u044F\u0434\u043E\u043A", "\u043F\u043E\u0441\u043B\u0435", "\u043F\u043E\u0441\u043E\u043B", "\u043F\u043E\u0441\u0440\u0435\u0434\u0438", "\u043F\u043E\u0441\u0442\u0435\u043B\u044C", "\u043F\u043E\u0441\u0443\u0434\u0430", "\u043F\u043E\u0442\u043E\u043C", "\u043F\u043E\u0445\u0432\u0430\u043B\u0430", "\u043F\u043E\u0445\u043E\u0436\u0438\u0439", "\u043F\u043E\u0446\u0435\u043B\u0443\u0439", "\u043F\u043E\u0447\u0432\u0430", "\u043F\u043E\u0447\u0435\u043C\u0443", "\u043F\u043E\u0448\u043B\u0438\u043D\u0430", "\u043F\u043E\u044D\u043C\u0430", "\u043F\u043E\u044D\u0442\u043E\u043C\u0443", "\u043F\u0440\u0430\u0432\u043E", "\u043F\u0440\u0430\u0437\u0434\u043D\u0438\u043A", "\u043F\u0440\u0430\u043A\u0442\u0438\u043A\u0430", "\u043F\u0440\u0430\u0445", "\u043F\u0440\u0435\u0433\u0440\u0430\u0434\u0430", "\u043F\u0440\u0435\u0434\u043C\u0435\u0442", "\u043F\u0440\u0435\u0436\u0434\u0435", "\u043F\u0440\u0435\u043B\u0435\u0441\u0442\u044C", "\u043F\u0440\u0435\u043C\u0438\u044F", "\u043F\u0440\u0435\u043F\u0430\u0440\u0430\u0442", "\u043F\u0440\u0435\u0441\u0441\u0430", "\u043F\u0440\u0438\u0431\u044B\u0442\u044C", "\u043F\u0440\u0438\u0436\u0430\u0442\u044C", "\u043F\u0440\u0438\u0439\u0442\u0438", "\u043F\u0440\u0438\u043A\u0430\u0437", "\u043F\u0440\u0438\u043B\u0430\u0432\u043E\u043A", "\u043F\u0440\u0438\u043C\u0435\u0440", "\u043F\u0440\u0438\u043D\u044F\u0442\u044C", "\u043F\u0440\u0438\u0440\u043E\u0434\u0430", "\u043F\u0440\u0438\u0442\u043E\u043C", "\u043F\u0440\u0438\u0445\u043E\u0436\u0430\u044F", "\u043F\u0440\u0438\u0446\u0435\u043B", "\u043F\u0440\u0438\u0447\u0438\u043D\u0430", "\u043F\u0440\u0438\u044E\u0442", "\u043F\u0440\u043E\u0433\u043D\u043E\u0437", "\u043F\u0440\u043E\u0434\u0443\u043A\u0442", "\u043F\u0440\u043E\u0435\u043A\u0442", "\u043F\u0440\u043E\u0436\u0438\u0442\u044C", "\u043F\u0440\u043E\u043A\u0430\u0442", "\u043F\u0440\u043E\u043C\u044B\u0441\u0435\u043B", "\u043F\u0440\u043E\u043F\u0443\u0441\u043A", "\u043F\u0440\u043E\u0441\u0442\u043E", "\u043F\u0440\u043E\u0442\u0438\u0432", "\u043F\u0440\u043E\u0444\u0438\u043B\u044C", "\u043F\u0440\u043E\u0446\u0435\u0441\u0441", "\u043F\u0440\u043E\u0447\u0438\u0439", "\u043F\u0440\u043E\u0448\u043B\u044B\u0439", "\u043F\u0440\u043E\u0449\u0430\u0442\u044C", "\u043F\u0440\u0443\u0436\u0438\u043D\u0430", "\u043F\u0440\u0443\u0442", "\u043F\u0440\u044B\u0436\u043E\u043A", "\u043F\u0440\u044F\u043C\u043E\u0439", "\u043F\u0442\u0438\u0446\u0430", "\u043F\u0443\u0431\u043B\u0438\u043A\u0430", "\u043F\u0443\u0433\u0430\u0442\u044C", "\u043F\u0443\u0433\u043E\u0432\u0438\u0446\u0430", "\u043F\u0443\u0437\u044B\u0440\u044C", "\u043F\u0443\u043B\u044C\u0442", "\u043F\u0443\u043B\u044F", "\u043F\u0443\u043D\u043A\u0442", "\u043F\u0443\u0441\u043A\u0430\u0442\u044C", "\u043F\u0443\u0441\u0442\u043E\u0439", "\u043F\u0443\u0442\u044C", "\u043F\u0443\u0445\u043B\u044B\u0439", "\u043F\u0443\u0447\u043E\u043A", "\u043F\u0443\u0448\u0438\u0441\u0442\u044B\u0439", "\u043F\u0443\u0448\u043A\u0430", "\u043F\u0447\u0435\u043B\u0430", "\u043F\u0448\u0435\u043D\u0438\u0446\u0430", "\u043F\u044B\u043B\u0430\u0442\u044C", "\u043F\u044B\u043B\u044C", "\u043F\u044B\u0448\u043D\u044B\u0439", "\u043F\u044C\u0435\u0441\u0430", "\u043F\u044F\u0442\u043A\u0430", "\u043F\u044F\u0442\u043D\u043E", "\u043F\u044F\u0442\u044B\u0439", "\u043F\u044F\u0442\u044C\u0441\u043E\u0442", "\u0440\u0430\u0431\u043E\u0442\u0430", "\u0440\u0430\u0432\u043D\u0438\u043D\u0430", "\u0440\u0430\u0434\u0438", "\u0440\u0430\u0434\u043E\u0441\u0442\u044C", "\u0440\u0430\u0434\u0443\u0433\u0430", "\u0440\u0430\u0437\u0431\u0438\u0442\u044C", "\u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435", "\u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440", "\u0440\u0430\u0437\u0434\u0435\u043B", "\u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0435", "\u0440\u0430\u0437\u043C\u0435\u0440", "\u0440\u0430\u0437\u043D\u044B\u0439", "\u0440\u0430\u0437\u0440\u044B\u0432", "\u0440\u0430\u0437\u0443\u043C", "\u0440\u0430\u0439\u043E\u043D", "\u0440\u0430\u043A\u0435\u0442\u0430", "\u0440\u0430\u043A\u043E\u0432\u0438\u043D\u0430", "\u0440\u0430\u043C\u043A\u0430", "\u0440\u0430\u043D\u043E", "\u0440\u0430\u043F\u043E\u0440\u0442", "\u0440\u0430\u0441\u043F\u0430\u0434", "\u0440\u0430\u0441\u0441\u043A\u0430\u0437", "\u0440\u0430\u0441\u0442\u0438", "\u0440\u0430\u0441\u0445\u043E\u0434", "\u0440\u0430\u0441\u0446\u0432\u0435\u0442", "\u0440\u0430\u0446\u0438\u044F", "\u0440\u0432\u0430\u043D\u0443\u0442\u044C", "\u0440\u0432\u0430\u0442\u044C\u0441\u044F", "\u0440\u0435\u0430\u043A\u0446\u0438\u044F", "\u0440\u0435\u0431\u0440\u043E", "\u0440\u0435\u0432\u0435\u0442\u044C", "\u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440", "\u0440\u0435\u0434\u043A\u0438\u0439", "\u0440\u0435\u0435\u0441\u0442\u0440", "\u0440\u0435\u0436\u0438\u043C", "\u0440\u0435\u0437\u0430\u0442\u044C", "\u0440\u0435\u0437\u0435\u0440\u0432", "\u0440\u0435\u0437\u0438\u043D\u0430", "\u0440\u0435\u0437\u043A\u043E", "\u0440\u0435\u0437\u043D\u043E\u0439", "\u0440\u0435\u0439\u0441", "\u0440\u0435\u043A\u043B\u0430\u043C\u0430", "\u0440\u0435\u043A\u043E\u0440\u0434", "\u0440\u0435\u043B\u0438\u0433\u0438\u044F", "\u0440\u0435\u043B\u044C\u0441", "\u0440\u0435\u043C\u0435\u043D\u044C", "\u0440\u0435\u043C\u043E\u043D\u0442", "\u0440\u0435\u043F\u043B\u0438\u043A\u0430", "\u0440\u0435\u043F\u043E\u0440\u0442\u0430\u0436", "\u0440\u0435\u0441\u043D\u0438\u0446\u0430", "\u0440\u0435\u0441\u0442\u043E\u0440\u0430\u043D", "\u0440\u0435\u0444\u043E\u0440\u043C\u0430", "\u0440\u0435\u0446\u0435\u043F\u0442", "\u0440\u0435\u0447\u044C", "\u0440\u0435\u0448\u0435\u043D\u0438\u0435", "\u0440\u0436\u0430\u0432\u044B\u0439", "\u0440\u0438\u0441\u043A", "\u0440\u0438\u0441\u0443\u043D\u043E\u043A", "\u0440\u0438\u0442\u0443\u0430\u043B", "\u0440\u0438\u0444\u043C\u0430", "\u0440\u043E\u0431\u043A\u043E", "\u0440\u043E\u0431\u043E\u0442", "\u0440\u043E\u0432\u0435\u0441\u043D\u0438\u043A", "\u0440\u043E\u0432\u043D\u043E", "\u0440\u043E\u0434\u043D\u043E\u0439", "\u0440\u043E\u0436\u0434\u0435\u043D\u0438\u0435", "\u0440\u043E\u0437\u0430", "\u0440\u043E\u0437\u043E\u0432\u044B\u0439", "\u0440\u043E\u0437\u044B\u0441\u043A", "\u0440\u043E\u043B\u044C", "\u0440\u043E\u043C\u0430\u043D", "\u0440\u043E\u0441\u043A\u043E\u0448\u044C", "\u0440\u043E\u0441\u043F\u0438\u0441\u044C", "\u0440\u043E\u0441\u0442", "\u0440\u0443\u0431\u0430\u0448\u043A\u0430", "\u0440\u0443\u0431\u0435\u0436", "\u0440\u0443\u0431\u0438\u0442\u044C", "\u0440\u0443\u0431\u0440\u0438\u043A\u0430", "\u0440\u0443\u0434\u043D\u0438\u043A", "\u0440\u0443\u043A\u0430", "\u0440\u0443\u043A\u043E\u043F\u0438\u0441\u044C", "\u0440\u0443\u043C\u044F\u043D\u044B\u0439", "\u0440\u0443\u0441\u043B\u043E", "\u0440\u0443\u0445\u043D\u0443\u0442\u044C", "\u0440\u0443\u0447\u0435\u0439", "\u0440\u0443\u0447\u043D\u043E\u0439", "\u0440\u044B\u0431\u0430", "\u0440\u044B\u0436\u0438\u0439", "\u0440\u044B\u043D\u043E\u043A", "\u0440\u044B\u0445\u043B\u044B\u0439", "\u0440\u044B\u0446\u0430\u0440\u044C", "\u0440\u044B\u0447\u0430\u0433", "\u0440\u044E\u043A\u0437\u0430\u043A", "\u0440\u044F\u0434\u043E\u043C", "\u0441\u0430\u0434\u043E\u0432\u044B\u0439", "\u0441\u0430\u0436\u0430\u0442\u044C", "\u0441\u0430\u043B\u043E\u043D", "\u0441\u0430\u043B\u0444\u0435\u0442\u043A\u0430", "\u0441\u0430\u043B\u044E\u0442", "\u0441\u0430\u043C\u0435\u0446", "\u0441\u0430\u043C\u043E\u0432\u0430\u0440", "\u0441\u0430\u043C\u044B\u0439", "\u0441\u0430\u043D\u0438", "\u0441\u0430\u043D\u043A\u0446\u0438\u044F", "\u0441\u0430\u043F\u043E\u0433", "\u0441\u0430\u0440\u0430\u0439", "\u0441\u0430\u0442\u0438\u0440\u0430", "\u0441\u0430\u0445\u0430\u0440", "\u0441\u0431\u0438\u0442\u044C", "\u0441\u0431\u043E\u043A\u0443", "\u0441\u0431\u043E\u0440\u043D\u0430\u044F", "\u0441\u0431\u044B\u0442", "\u0441\u0432\u0430\u0434\u044C\u0431\u0430", "\u0441\u0432\u0430\u043B\u043A\u0430", "\u0441\u0432\u0430\u0440\u0438\u0442\u044C", "\u0441\u0432\u0435\u0436\u0438\u0439", "\u0441\u0432\u0435\u0440\u0445\u0443", "\u0441\u0432\u0435\u0442", "\u0441\u0432\u0435\u0447\u0430", "\u0441\u0432\u0438\u043D\u044C\u044F", "\u0441\u0432\u0438\u0441\u0442", "\u0441\u0432\u0438\u0442\u0435\u0440", "\u0441\u0432\u043E\u0431\u043E\u0434\u0430", "\u0441\u0432\u043E\u0434\u043A\u0430", "\u0441\u0432\u043E\u0439", "\u0441\u0432\u044B\u0448\u0435", "\u0441\u0432\u044F\u0437\u044C", "\u0441\u0434\u0430\u0442\u044C\u0441\u044F", "\u0441\u0434\u0435\u043B\u0430\u0442\u044C", "\u0441\u0435\u0433\u043C\u0435\u043D\u0442", "\u0441\u0435\u0433\u043E\u0434\u043D\u044F", "\u0441\u0435\u0434\u043B\u043E", "\u0441\u0435\u0434\u043E\u0439", "\u0441\u0435\u0434\u044C\u043C\u043E\u0439", "\u0441\u0435\u0437\u043E\u043D", "\u0441\u0435\u0439\u0444", "\u0441\u0435\u0439\u0447\u0430\u0441", "\u0441\u0435\u043A\u0440\u0435\u0442", "\u0441\u0435\u043A\u0442\u043E\u0440", "\u0441\u0435\u043A\u0443\u043D\u0434\u0430", "\u0441\u0435\u043C\u0438\u043D\u0430\u0440", "\u0441\u0435\u043C\u044C\u044F", "\u0441\u0435\u043D\u0430\u0442\u043E\u0440", "\u0441\u0435\u043D\u043E", "\u0441\u0435\u043D\u0441\u0430\u0446\u0438\u044F", "\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C", "\u0441\u0435\u0440\u0432\u0438\u0441", "\u0441\u0435\u0440\u0434\u0446\u0435", "\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0430", "\u0441\u0435\u0440\u0436\u0430\u043D\u0442", "\u0441\u0435\u0440\u0438\u044F", "\u0441\u0435\u0440\u044B\u0439", "\u0441\u0435\u0441\u0441\u0438\u044F", "\u0441\u0435\u0441\u0442\u044C", "\u0441\u0435\u0442\u0435\u0432\u043E\u0439", "\u0441\u0436\u0430\u0442\u044B\u0439", "\u0441\u0436\u0435\u0447\u044C", "\u0441\u0437\u0430\u0434\u0438", "\u0441\u0438\u0433\u043D\u0430\u043B", "\u0441\u0438\u0434\u0435\u043D\u044C\u0435", "\u0441\u0438\u043B\u0430", "\u0441\u0438\u043B\u0443\u044D\u0442", "\u0441\u0438\u043B\u044C\u043D\u044B\u0439", "\u0441\u0438\u043C\u0432\u043E\u043B", "\u0441\u0438\u043C\u043F\u0430\u0442\u0438\u044F", "\u0441\u0438\u043C\u0444\u043E\u043D\u0438\u044F", "\u0441\u0438\u043D\u0438\u0439", "\u0441\u0438\u043D\u0442\u0435\u0437", "\u0441\u0438\u043D\u044F\u043A", "\u0441\u0438\u0440\u0435\u043D\u044C", "\u0441\u0438\u0441\u0442\u0435\u043C\u0430", "\u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044F", "\u0441\u0438\u044F\u043D\u0438\u0435", "\u0441\u043A\u0430\u0437\u0430\u0442\u044C", "\u0441\u043A\u0430\u043B\u0430", "\u0441\u043A\u0430\u043C\u0435\u0439\u043A\u0430", "\u0441\u043A\u0430\u043D\u0434\u0430\u043B", "\u0441\u043A\u0430\u0442\u0435\u0440\u0442\u044C", "\u0441\u043A\u0430\u0447\u043E\u043A", "\u0441\u043A\u0432\u0430\u0436\u0438\u043D\u0430", "\u0441\u043A\u0432\u0435\u0440", "\u0441\u043A\u0432\u043E\u0437\u044C", "\u0441\u043A\u0435\u043B\u0435\u0442", "\u0441\u043A\u0438\u0434\u043A\u0430", "\u0441\u043A\u043B\u0430\u0434", "\u0441\u043A\u043E\u043B\u044C\u043A\u043E", "\u0441\u043A\u043E\u0440\u044B\u0439", "\u0441\u043A\u043E\u0441\u0438\u0442\u044C", "\u0441\u043A\u043E\u0442", "\u0441\u043A\u0440\u0438\u043F\u043A\u0430", "\u0441\u043A\u0443\u0434\u043D\u044B\u0439", "\u0441\u043A\u0443\u043A\u0430", "\u0441\u043B\u0430\u0431\u044B\u0439", "\u0441\u043B\u0430\u0432\u0430", "\u0441\u043B\u0430\u0434\u043A\u0438\u0439", "\u0441\u043B\u0435\u0433\u043A\u0430", "\u0441\u043B\u0435\u0434", "\u0441\u043B\u0435\u0437\u0430", "\u0441\u043B\u0435\u043F\u043E\u0439", "\u0441\u043B\u0435\u0441\u0430\u0440\u044C", "\u0441\u043B\u0438\u0448\u043A\u043E\u043C", "\u0441\u043B\u043E\u0432\u043E", "\u0441\u043B\u043E\u0433", "\u0441\u043B\u043E\u0436\u043D\u044B\u0439", "\u0441\u043B\u043E\u043C\u0430\u0442\u044C", "\u0441\u043B\u0443\u0436\u0431\u0430", "\u0441\u043B\u0443\u0445", "\u0441\u043B\u0443\u0447\u0430\u0439", "\u0441\u043B\u044B\u0448\u0430\u0442\u044C", "\u0441\u043B\u044E\u043D\u0430", "\u0441\u043C\u0435\u0436\u043D\u044B\u0439", "\u0441\u043C\u0435\u043B\u044B\u0439", "\u0441\u043C\u0435\u043D\u0438\u0442\u044C", "\u0441\u043C\u0435\u0441\u044C", "\u0441\u043C\u0435\u0442\u0430\u043D\u0430", "\u0441\u043C\u0435\u0445", "\u0441\u043C\u043E\u043B\u0430", "\u0441\u043C\u0443\u0433\u043B\u044B\u0439", "\u0441\u043C\u0443\u0442\u043D\u044B\u0439", "\u0441\u043C\u0443\u0449\u0430\u0442\u044C", "\u0441\u043C\u044B\u0441\u043B", "\u0441\u043D\u0430\u0439\u043F\u0435\u0440", "\u0441\u043D\u0430\u0440\u044F\u0434", "\u0441\u043D\u0430\u0447\u0430\u043B\u0430", "\u0441\u043D\u0435\u0433", "\u0441\u043D\u0438\u0437\u0443", "\u0441\u043D\u0438\u0442\u044C\u0441\u044F", "\u0441\u043D\u043E\uFFFD\uFFFD\u0430", "\u0441\u043D\u044F\u0442\u044C", "\u0441\u043E\u0431\u0430\u043A\u0430", "\u0441\u043E\u0431\u043B\u0430\u0437\u043D", "\u0441\u043E\u0431\u0440\u0430\u043D\u0438\u0435", "\u0441\u043E\u0431\u044B\u0442\u0438\u0435", "\u0441\u043E\u0432\u0435\u0441\u0442\u044C", "\u0441\u043E\u0432\u0441\u0435\u043C", "\u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0435", "\u0441\u043E\u0437\u0434\u0430\u0442\u044C", "\u0441\u043E\u0437\u043D\u0430\u043D\u0438\u0435", "\u0441\u043E\u0437\u0440\u0435\u0442\u044C", "\u0441\u043E\u0439\u0442\u0438\u0441\u044C", "\u0441\u043E\u043A\u043E\u043B", "\u0441\u043E\u043B\u0434\u0430\u0442", "\u0441\u043E\u043B\u0435\u043D\u044B\u0439", "\u0441\u043E\u043B\u043D\u0446\u0435", "\u0441\u043E\u043B\u043E\u043C\u0430", "\u0441\u043E\u043C\u043D\u0435\u043D\u0438\u0435", "\u0441\u043E\u043D\u043D\u044B\u0439", "\u0441\u043E\u043F\u0435\u0440\u043D\u0438\u043A", "\u0441\u043E\u0440\u0430\u0442\u043D\u0438\u043A", "\u0441\u043E\u0440\u0432\u0430\u0442\u044C", "\u0441\u043E\u0441\u0435\u0434", "\u0441\u043E\u0441\u0438\u0441\u043A\u0430", "\u0441\u043E\u0441\u0442\u0430\u0432", "\u0441\u043E\u0442\u043D\u044F", "\u0441\u043E\u0443\u0441", "\u0441\u043E\u044E\u0437", "\u0441\u043F\u0430\u0434", "\u0441\u043F\u0430\u043B\u044C\u043D\u044F", "\u0441\u043F\u0430\u0441\u0442\u0438", "\u0441\u043F\u0435\u043A\u0442\u0440", "\u0441\u043F\u0435\u0440\u0432\u0430", "\u0441\u043F\u0435\u0448\u0438\u0442\u044C", "\u0441\u043F\u0438\u043D\u0430", "\u0441\u043F\u0438\u0440\u0442", "\u0441\u043F\u0438\u0441\u043E\u043A", "\u0441\u043F\u0438\u0447\u043A\u0430", "\u0441\u043F\u043B\u0430\u0432", "\u0441\u043F\u043E\u043D\u0441\u043E\u0440", "\u0441\u043F\u043E\u0440", "\u0441\u043F\u043E\u0441\u043E\u0431", "\u0441\u043F\u0440\u0430\u0432\u043A\u0430", "\u0441\u043F\u0443\u0441\u0442\u044F", "\u0441\u043F\u0443\u0442\u043D\u0438\u043A", "\u0441\u0440\u0430\u0437\u0443", "\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E", "\u0441\u0440\u043E\u043A", "\u0441\u0440\u044B\u0432", "\u0441\u0441\u043E\u0440\u0430", "\u0441\u0441\u044B\u043B\u043A\u0430", "\u0441\u0442\u0430\u0432\u0438\u0442\u044C", "\u0441\u0442\u0430\u0434\u0438\u044F", "\u0441\u0442\u0430\u043A\u0430\u043D", "\u0441\u0442\u0430\u043D\u0446\u0438\u044F", "\u0441\u0442\u0430\u0440\u044B\u0439", "\u0441\u0442\u0430\u044F", "\u0441\u0442\u0435\u0431\u0435\u043B\u044C", "\u0441\u0442\u0435\u043A\u043B\u043E", "\u0441\u0442\u0435\u043D\u0430", "\u0441\u0442\u0435\u043F\u0435\u043D\u044C", "\u0441\u0442\u0435\u0440\u0435\u0442\u044C", "\u0441\u0442\u0438\u043B\u044C", "\u0441\u0442\u0438\u043C\u0443\u043B", "\u0441\u0442\u0438\u0440\u0430\u0442\u044C", "\u0441\u0442\u0438\u0445\u0438", "\u0441\u0442\u043E\u0438\u0442\u044C", "\u0441\u0442\u043E\u0439\u043A\u0430", "\u0441\u0442\u043E\u043B", "\u0441\u0442\u043E\u043D\u0430\u0442\u044C", "\u0441\u0442\u043E\u043F\u0430", "\u0441\u0442\u043E\u0440\u043E\u043D\u0430", "\u0441\u0442\u043E\u044F\u043D\u043A\u0430", "\u0441\u0442\u0440\u0430\u043D\u0430", "\u0441\u0442\u0440\u0438\u0447\u044C", "\u0441\u0442\u0440\u043E\u0433\u0438\u0439", "\u0441\u0442\u0440\u0443\u044F", "\u0441\u0442\u0443\u0434\u0435\u043D\u0442", "\u0441\u0442\u0443\u043A", "\u0441\u0442\u0443\u043F\u043D\u044F", "\u0441\u0442\u044B\u0434\u043D\u043E", "\u0441\u0443\u0431\u0431\u043E\u0442\u0430", "\u0441\u0443\u0431\u044A\u0435\u043A\u0442", "\u0441\u0443\u0432\u0435\u043D\u0438\u0440", "\u0441\u0443\u0433\u0440\u043E\u0431", "\u0441\u0443\u0433\u0443\u0431\u043E", "\u0441\u0443\u0434\u0438\u0442\u044C", "\u0441\u0443\u0434\u043D\u043E", "\u0441\u0443\u0434\u044C\u0431\u0430", "\u0441\u0443\u0435\u0442\u0430", "\u0441\u0443\u043C\u0435\u0442\u044C", "\u0441\u0443\u043C\u043C\u0430", "\u0441\u0443\u043C\u0440\u0430\u043A", "\u0441\u0443\u043D\u0434\u0443\u043A", "\u0441\u0443\u043F\u0440\u0443\u0433", "\u0441\u0443\u0440\u043E\u0432\u044B\u0439", "\u0441\u0443\u0442\u043A\u0438", "\u0441\u0443\u0445\u043E\u0439", "\u0441\u0443\u0448\u0430", "\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043E", "\u0441\u0444\u0435\u0440\u0430", "\u0441\u0445\u0435\u043C\u0430", "\u0441\u0445\u043E\u0436\u0438\u0439", "\u0441\u0446\u0435\u043D\u0430\u0440\u0438\u0439", "\u0441\u0447\u0430\u0441\u0442\u044C\u0435", "\u0441\u0447\u0438\u0442\u0430\u0442\u044C", "\u0441\u044A\u0435\u0437\u0434", "\u0441\u044B\u0433\u0440\u0430\u0442\u044C", "\u0441\u044B\u0440\u043E\u0439", "\u0441\u044B\u0442\u044B\u0439", "\u0441\u044B\u0449\u0438\u043A", "\u0441\u044E\u0434\u0430", "\u0441\u044E\u0436\u0435\u0442", "\u0441\u044E\u0440\u043F\u0440\u0438\u0437", "\u0442\u0430\u0439\u043D\u0430", "\u0442\u0430\u043A\u0436\u0435", "\u0442\u0430\u043A\u043E\u0439", "\u0442\u0430\u043A\u0441\u0438", "\u0442\u0430\u043A\u0442\u0438\u043A\u0430", "\u0442\u0430\u043B\u0438\u044F", "\u0442\u0430\u043C\u043E\u0436\u043D\u044F", "\u0442\u0430\u043D\u0435\u0446", "\u0442\u0430\u0440\u0430\u043A\u0430\u043D", "\u0442\u0430\u0440\u0435\u043B\u043A\u0430", "\u0442\u0430\u0440\u0438\u0444", "\u0442\u0430\u0449\u0438\u0442\u044C", "\u0442\u0430\u044F\u0442\u044C", "\u0442\u0432\u0430\u0440\u044C", "\u0442\u0435\u0430\u0442\u0440", "\u0442\u0435\u0437\u0438\u0441", "\u0442\u0435\u043A\u0441\u0442", "\u0442\u0435\u043A\u0443\u0449\u0438\u0439", "\u0442\u0435\u043B\u0435\u0444\u043E\u043D", "\u0442\u0435\u043C\u0430", "\u0442\u0435\u043C\u043D\u043E\u0442\u0430", "\u0442\u0435\u043D\u0435\u0432\u043E\u0439", "\u0442\u0435\u043D\u043D\u0438\u0441", "\u0442\u0435\u043E\u0440\u0438\u044F", "\u0442\u0435\u043F\u0435\u0440\u044C", "\u0442\u0435\u043F\u043B\u043E", "\u0442\u0435\u0440\u0430\u043F\u0438\u044F", "\u0442\u0435\u0440\u0437\u0430\u0442\u044C", "\u0442\u0435\u0440\u043C\u0438\u043D", "\u0442\u0435\u0440\u043F\u0435\u0442\u044C", "\u0442\u0435\u0440\u0440\u0430\u0441\u0430", "\u0442\u0435\u0440\u044F\u0442\u044C", "\u0442\u0435\u0441\u043D\u044B\u0439", "\u0442\u0435\u0442\u0440\u0430\u0434\u044C", "\u0442\u0435\u0445\u043D\u0438\u043A\u0430", "\u0442\u0435\u0447\u0435\u043D\u0438\u0435", "\u0442\u0438\u0433\u0440", "\u0442\u0438\u043F\u043E\u0432\u043E\u0439", "\u0442\u0438\u0440\u0430\u0436", "\u0442\u0438\u0442\u0443\u043B", "\u0442\u0438\u0445\u0438\u0439", "\u0442\u043A\u0430\u043D\u044C", "\u0442\u043E\u0432\u0430\u0440\u0438\u0449", "\u0442\u043E\u0436\u0435", "\u0442\u043E\u043B\u043F\u0430", "\u0442\u043E\u043B\u0441\u0442\u044B\u0439", "\u0442\u043E\u043B\u0447\u043E\u043A", "\u0442\u043E\u043B\u0449\u0438\u043D\u0430", "\u0442\u043E\u043B\u044C\u043A\u043E", "\u0442\u043E\u043D\u043A\u0438\u0439", "\u0442\u043E\u043D\u043D\u0430", "\u0442\u043E\u043F\u0438\u0442\u044C", "\u0442\u043E\u043F\u043E\u0440", "\u0442\u043E\u0440\u0433\u043E\u0432\u043B\u044F", "\u0442\u043E\u0440\u043C\u043E\u0437", "\u0442\u043E\u0440\u0447\u0430\u0442\u044C", "\u0442\u043E\u0442\u0447\u0430\u0441", "\u0442\u043E\u0447\u043A\u0430", "\u0442\u043E\u0447\u043D\u043E", "\u0442\u043E\u0449\u0438\u0439", "\u0442\u0440\u0430\u0432\u0430", "\u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044F", "\u0442\u0440\u0430\u043A\u0442\u043E\u0440", "\u0442\u0440\u0430\u043C\u0432\u0430\u0439", "\u0442\u0440\u0430\u043D\u0448\u0435\u044F", "\u0442\u0440\u0430\u0441\u0441\u0430", "\u0442\u0440\u0435\u0432\u043E\u0433\u0430", "\u0442\u0440\u0435\u0437\u0432\u044B\u0439", "\u0442\u0440\u0435\u043D\u0435\u0440", "\u0442\u0440\u0435\u043F\u0435\u0442", "\u0442\u0440\u0435\u0441\u043A", "\u0442\u0440\u0435\u0442\u0438\u0439", "\u0442\u0440\u0435\u0449\u0438\u043D\u0430", "\u0442\u0440\u0438\u0431\u0443\u043D\u0430", "\u0442\u0440\u0438\u0434\u0446\u0430\u0442\u044C", "\u0442\u0440\u0438\u0441\u0442\u0430", "\u0442\u0440\u0438\u0443\u043C\u0444", "\u0442\u0440\u043E\u0433\u0430\u0442\u044C", "\u0442\u0440\u043E\u0439\u043A\u0430", "\u0442\u0440\u043E\u043D\u0443\u0442\u044C", "\u0442\u0440\u043E\u043F\u0430", "\u0442\u0440\u043E\u0442\u0443\u0430\u0440", "\u0442\u0440\u0443\u0431\u043A\u0430", "\u0442\u0440\u0443\u0434", "\u0442\u0440\u044E\u043A", "\u0442\u0440\u044F\u043F\u043A\u0430", "\u0442\u0443\u0433\u043E", "\u0442\u0443\u043B\u043E\u0432\u0438\u0449\u0435", "\u0442\u0443\u043C\u0430\u043D", "\u0442\u0443\u043C\u0431\u043E\u0447\u043A\u0430", "\u0442\u0443\u043D\u0434\u0440\u0430", "\u0442\u0443\u043F\u0438\u043A", "\u0442\u0443\u0440\u0438\u0441\u0442", "\u0442\u0443\u0440\u043D\u0438\u0440", "\u0442\u0443\u0441\u043A\u043B\u044B\u0439", "\u0442\u0443\u0444\u043B\u044F", "\u0442\u0443\u0447\u0430", "\u0442\u044B\u0441\u044F\u0447\u0430", "\u0442\u044F\u0433\u0430", "\u0442\u044F\u0436\u0435\u043B\u043E", "\u0443\u0431\u0435\u0436\u0430\u0442\u044C", "\u0443\u0431\u043E\u0433\u0438\u0439", "\u0443\u0431\u043E\u0440\u043A\u0430", "\u0443\u0432\u0430\u0436\u0435\u043D\u0438\u0435", "\u0443\u0432\u0435\u0437\u0442\u0438", "\u0443\u0432\u043E\u043B\u0438\u0442\u044C", "\u0443\u0433\u0430\u0434\u0430\u0442\u044C", "\u0443\u0433\u043E\u043B", "\u0443\u0433\u043E\u0449\u0430\u0442\u044C", "\u0443\u0433\u0440\u043E\u0437\u0430", "\u0443\u0433\u0440\u044E\u043C\u044B\u0439", "\u0443\u0434\u0430\u0440", "\u0443\u0434\u0430\u0447\u043D\u044B\u0439", "\u0443\u0434\u0435\u043B\u044F\u0442\u044C", "\u0443\u0434\u0438\u0432\u0438\u0442\u044C", "\u0443\u0434\u043E\u0431\u043D\u044B\u0439", "\u0443\u0434\u043E\u0447\u043A\u0430", "\u0443\u0435\u0437\u0436\u0430\u0442\u044C", "\u0443\u0436\u0438\u043D", "\u0443\u0437\u0435\u043B", "\u0443\u0437\u043A\u0438\u0439", "\u0443\u0439\u0442\u0438", "\u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0435", "\u0443\u043A\u043B\u043E\u043D", "\u0443\u043A\u0440\u0430\u0441\u0442\u044C", "\u0443\u043A\u0443\u0441\u0438\u0442\u044C", "\u0443\u043B\u0435\u0442\u0430\u0442\u044C", "\u0443\u043B\u0438\u0446\u0430", "\u0443\u043B\u044B\u0431\u043A\u0430", "\u0443\u043C\u0435\u043B\u043E", "\u0443\u043C\u0435\u043D\u0438\u0435", "\u0443\u043C\u043D\u044B\u0439", "\u0443\u043C\u043E\u043B\u044F\u0442\u044C", "\u0443\u043D\u0435\u0441\u0442\u0438", "\u0443\u043D\u0438\u0436\u0430\u0442\u044C", "\u0443\u043D\u044B\u043B\u044B\u0439", "\u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0430", "\u0443\u043F\u0430\u0441\u0442\u044C", "\u0443\u043F\u043E\u0440\u043D\u043E", "\u0443\u043F\u0440\u0435\u043A", "\u0443\u0440\u043D\u0430", "\u0443\u0440\u043E\u0432\u0435\u043D\u044C", "\u0443\u0440\u043E\u0436\u0430\u0439", "\u0443\u0440\u043E\u043D\u0438\u0442\u044C", "\u0443\u0441\u0430\u0434\u044C\u0431\u0430", "\u0443\u0441\u0430\u0442\u044B\u0439", "\u0443\u0441\u0432\u043E\u0438\u0442\u044C", "\u0443\u0441\u0438\u043B\u0438\u0435", "\u0443\u0441\u043B\u043E\u0432\u0438\u0435", "\u0443\u0441\u043B\u0443\u0433\u0430", "\u0443\u0441\u043C\u0435\u0448\u043A\u0430", "\u0443\u0441\u043F\u0435\u0442\u044C", "\u0443\u0441\u0442\u0430\u0432", "\u0443\u0441\u0442\u043E\u044F\u0442\u044C", "\u0443\u0442\u0435\u0447\u043A\u0430", "\u0443\u0442\u0435\u0448\u0430\u0442\u044C", "\u0443\u0442\u0440\u043E", "\u0443\u0446\u0435\u043B\u0435\u0442\u044C", "\u0443\u0447\u0430\u0441\u0442\u0438\u0435", "\u0443\u0447\u0435\u043D\u0438\u043A", "\u0443\u0447\u0435\u0441\u0442\u044C", "\u0443\u0449\u0435\u043B\u044C\u0435", "\u0443\u0449\u0435\u0440\u0431", "\u0443\u044E\u0442\u043D\u044B\u0439", "\u0444\u0430\u0431\u0440\u0438\u043A\u0430", "\u0444\u0430\u0432\u043E\u0440\u0438\u0442", "\u0444\u0430\u043A\u0435\u043B", "\u0444\u0430\u043A\u0442", "\u0444\u0430\u043C\u0438\u043B\u0438\u044F", "\u0444\u0430\u043D\u0442\u0430\u0437\u0438\u044F", "\u0444\u0430\u0441\u0430\u0434", "\u0444\u0435\u0432\u0440\u0430\u043B\u044C", "\u0444\u0435\u043D\u043E\u043C\u0435\u043D", "\u0444\u0435\u0440\u043C\u0435\u0440", "\u0444\u0438\u0433\u0443\u0440\u0430", "\u0444\u0438\u0437\u0438\u043A\u0430", "\u0444\u0438\u043B\u0438\u0430\u043B", "\u0444\u0438\u043B\u043E\u0441\u043E\u0444", "\u0444\u0438\u043B\u044C\u043C", "\u0444\u0438\u043D\u0430\u043B", "\u0444\u043B\u0430\u0433", "\u0444\u043B\u043E\u0442", "\u0444\u043E\u0439\u0435", "\u0444\u043E\u043A\u0443\u0441", "\u0444\u043E\u043D\u0430\u0440\u044C", "\u0444\u043E\u043D\u0434", "\u0444\u043E\u043D\u0442\u0430\u043D", "\u0444\u043E\u0440\u043C\u0430", "\u0444\u043E\u0440\u0443\u043C", "\u0444\u043E\u0442\u043E", "\u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442", "\u0444\u0440\u0430\u0437\u0430", "\u0444\u0440\u0430\u043A\u0446\u0438\u044F", "\u0444\u0440\u043E\u043D\u0442", "\u0444\u0440\u0443\u043A\u0442", "\u0444\u0443\u043D\u043A\u0446\u0438\u044F", "\u0444\u0443\u0440\u0430\u0436\u043A\u0430", "\u0444\u0443\u0442\u0431\u043E\u043B", "\u0444\u0443\u0442\u043B\u044F\u0440", "\u0445\u0430\u043B\u0430\u0442", "\u0445\u0430\u043E\u0441", "\u0445\u0430\u0440\u0430\u043A\u0442\u0435\u0440", "\u0445\u0430\u0442\u0430", "\u0445\u0432\u0430\u043B\u0438\u0442\u044C", "\u0445\u0432\u0430\u0442\u0430\u0442\u044C", "\u0445\u0432\u043E\u0439\u043D\u044B\u0439", "\u0445\u0432\u043E\u0441\u0442", "\u0445\u0438\u043C\u0438\u044F", "\u0445\u0438\u0440\u0443\u0440\u0433", "\u0445\u0438\u0442\u0440\u044B\u0439", "\u0445\u0438\u0449\u043D\u0438\u043A", "\u0445\u043B\u0435\u0431", "\u0445\u043B\u044B\u043D\u0443\u0442\u044C", "\u0445\u043C\u0443\u0440\u044B\u0439", "\u0445\u043E\u0434\u0438\u0442\u044C", "\u0445\u043E\u0437\u044F\u0438\u043D", "\u0445\u043E\u043A\u043A\u0435\u0439", "\u0445\u043E\u043B\u043C", "\u0445\u043E\u043B\u0441\u0442", "\u0445\u043E\u0440\u043E\u0448\u043E", "\u0445\u043E\u0442\u0435\u0442\u044C", "\u0445\u0440\u0430\u0431\u0440\u044B\u0439", "\u0445\u0440\u0430\u043C", "\u0445\u0440\u0430\u043D\u0438\u0442\u044C", "\u0445\u0440\u0435\u0431\u0435\u0442", "\u0445\u0440\u0435\u043D", "\u0445\u0440\u0438\u043F\u043B\u043E", "\u0445\u0440\u043E\u043D\u0438\u043A\u0430", "\u0445\u0440\u0443\u043F\u043A\u0438\u0439", "\u0445\u0443\u0434\u043E\u0436\u043D\u0438\u043A", "\u0445\u0443\u0434\u0448\u0438\u0439", "\u0445\u0443\u043B\u0438\u0433\u0430\u043D", "\u0445\u0443\u0442\u043E\u0440", "\u0446\u0430\u0440\u044C", "\u0446\u0432\u0435\u0442\u043E\u043A", "\u0446\u0435\u043B\u0435\u0432\u043E\u0439", "\u0446\u0435\u043B\u0438\u043A\u043E\u043C", "\u0446\u0435\u043B\u043E\u0435", "\u0446\u0435\u043B\u044C", "\u0446\u0435\u043D\u0437\u0443\u0440\u0430", "\u0446\u0435\u043D\u0438\u0442\u044C", "\u0446\u0435\u043D\u0442\u0440", "\u0446\u0435\u043F\u043D\u043E\u0439", "\u0446\u0438\u043A\u043B", "\u0446\u0438\u043B\u0438\u043D\u0434\u0440", "\u0446\u0438\u0440\u043A", "\u0446\u0438\u0442\u0430\u0442\u0430", "\u0446\u0438\u0444\u0440\u0430", "\u0447\u0430\u0439\u043D\u0438\u043A", "\u0447\u0430\u0441\u044B", "\u0447\u0430\u0448\u043A\u0430", "\u0447\u0435\u043B\u043E\u0432\u0435\u043A", "\u0447\u0435\u043B\u044E\u0441\u0442\u044C", "\u0447\u0435\u043C\u043E\u0434\u0430\u043D", "\u0447\u0435\u043C\u043F\u0438\u043E\u043D", "\u0447\u0435\u043F\u0443\u0445\u0430", "\u0447\u0435\u0440\u0432\u044C", "\u0447\u0435\u0440\u0434\u0430\u043A", "\u0447\u0435\u0440\u0435\u0437", "\u0447\u0435\u0440\u043D\u0438\u043B\u0430", "\u0447\u0435\u0440\u0442\u0430", "\u0447\u0435\u0441\u043D\u043E\u043A", "\u0447\u0435\u0441\u0442\u043D\u043E", "\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044C", "\u0447\u0435\u0442\u044B\u0440\u0435", "\u0447\u0438\u0441\u043B\u043E", "\u0447\u0438\u0441\u0442\u044B\u0439", "\u0447\u0438\u0442\u0430\u0442\u0435\u043B\u044C", "\u0447\u0442\u0435\u043D\u0438\u0435", "\u0447\u0442\u043E\u0431\u044B", "\u0447\u0443\u0432\u0441\u0442\u0432\u043E", "\u0447\u0443\u0434\u0430\u043A", "\u0447\u0443\u0434\u043D\u044B\u0439", "\u0447\u0443\u0434\u043E", "\u0447\u0443\u0436\u043E\u0439", "\u0447\u0443\u043B\u043E\u043A", "\u0447\u0443\u043C\u0430", "\u0447\u0443\u0448\u044C", "\u0447\u0443\u044F\u0442\u044C", "\u0448\u0430\u0433\u0430\u0442\u044C", "\u0448\u0430\u043D\u0441", "\u0448\u0430\u043F\u043A\u0430", "\u0448\u0430\u0440\u0438\u043A", "\u0448\u0430\u0440\u0444", "\u0448\u0430\u0445\u043C\u0430\u0442\u044B", "\u0448\u0430\u0448\u043B\u044B\u043A", "\u0448\u0435\u0434\u0435\u0432\u0440", "\u0448\u0435\u043F\u0442\u0430\u0442\u044C", "\u0448\u0435\u0440\u0441\u0442\u044C", "\u0448\u0435\u0441\u0442\u043E\u0439", "\u0448\u0438\u043D\u0435\u043B\u044C", "\u0448\u0438\u0440\u0438\u043D\u0430", "\u0448\u0438\u0448\u043A\u0430", "\u0448\u043A\u0430\u0444", "\u0448\u043A\u043E\u043B\u0430", "\u0448\u043A\u0443\u0440\u0430", "\u0448\u043B\u0430\u043D\u0433", "\u0448\u043B\u0435\u043C", "\u0448\u043D\u0443\u0440", "\u0448\u043E\u043A\u043E\u043B\u0430\u0434", "\u0448\u043E\u0440\u043E\u0445", "\u0448\u043E\u0441\u0441\u0435", "\u0448\u043F\u0438\u043E\u043D", "\u0448\u043F\u0440\u0438\u0446", "\u0448\u0442\u0430\u0431", "\u0448\u0442\u0430\u043C\u043C", "\u0448\u0442\u0430\u043D\u044B", "\u0448\u0442\u0430\u0442\u043D\u044B\u0439", "\u0448\u0442\u043E\u0440\u0430", "\u0448\u0442\u0440\u0430\u0444", "\u0448\u0442\u0443\u0440\u043C", "\u0448\u0442\u044B\u043A", "\u0448\u0443\u043C\u043D\u043E", "\u0448\u0443\u0440\u0448\u0430\u0442\u044C", "\u0448\u0443\u0442\u0438\u0442\u044C", "\u0448\u0443\u0442\u043A\u0430", "\u0449\u0435\u0434\u0440\u044B\u0439", "\u0449\u0435\u043A\u0430", "\u0449\u0435\u043D\u043E\u043A", "\u044D\u043A\u0437\u0430\u043C\u0435\u043D", "\u044D\u043A\u0438\u043F\u0430\u0436", "\u044D\u043A\u043E\u043D\u043E\u043C\u0438\u044F", "\u044D\u043A\u0440\u0430\u043D", "\u044D\u043A\u0441\u043F\u0435\u0440\u0442", "\u044D\u043B\u0435\u043C\u0435\u043D\u0442", "\u044D\u043B\u0438\u0442\u043D\u044B\u0439", "\u044D\u043C\u043E\u0446\u0438\u044F", "\u044D\u043D\u0435\u0440\u0433\u0438\u044F", "\u044D\u043F\u0438\u0437\u043E\u0434", "\u044D\u043F\u043E\u0445\u0430", "\u044D\u0441\u043A\u0438\u0437", "\u044D\u0441\u0442\u0440\u0430\u0434\u0430", "\u044D\u0442\u0430\u043F", "\u044D\u0442\u0438\u043A\u0430", "\u044D\u0442\u043E\u0442", "\u044D\u0444\u0438\u0440", "\u044D\u0444\u0444\u0435\u043A\u0442", "\u044D\u0448\u0435\u043B\u043E\u043D", "\u044E\u0431\u0438\u043B\u0435\u0439", "\u044E\u0431\u043A\u0430", "\u044E\u0436\u043D\u044B\u0439", "\u044E\u043C\u043E\u0440", "\u044E\u043D\u043E\u0441\u0442\u044C", "\u044E\u0440\u0438\u0441\u0442", "\u044E\u0441\u0442\u0438\u0446\u0438\u044F", "\u044F\u0431\u043B\u043E\u043A\u043E", "\u044F\u0432\u043B\u0435\u043D\u0438\u0435", "\u044F\u0433\u043E\u0434\u0430", "\u044F\u0434\u0440\u043E", "\u044F\u0437\u044B\u043A", "\u044F\u0439\u0446\u043E", "\u044F\u043A\u043E\u0431\u044B", "\u044F\u043A\u043E\u0440\u044C", "\u044F\u043D\u0432\u0430\u0440\u044C", "\u044F\u0440\u043A\u0438\u0439", "\u044F\u0440\u043C\u0430\u0440\u043A\u0430", "\u044F\u0440\u043E\u0441\u0442\u044C", "\u044F\u0441\u043D\u044B\u0439", "\u044F\u0445\u0442\u0430", "\u044F\u0447\u0435\u0439\u043A\u0430", "\u044F\u0449\u0438\u043A"];
}
});
// node_modules/bip39-mnemonic/wordlist/spanish.json
var require_spanish = __commonJS({
"node_modules/bip39-mnemonic/wordlist/spanish.json"(exports2, module2) {
module2.exports = ["a\u0301baco", "abdomen", "abeja", "abierto", "abogado", "abono", "aborto", "abrazo", "abrir", "abuelo", "abuso", "acabar", "academia", "acceso", "accio\u0301n", "aceite", "acelga", "acento", "aceptar", "a\u0301cido", "aclarar", "acne\u0301", "acoger", "acoso", "activo", "acto", "actriz", "actuar", "acudir", "acuerdo", "acusar", "adicto", "admitir", "adoptar", "adorno", "aduana", "adulto", "ae\u0301reo", "afectar", "aficio\u0301n", "afinar", "afirmar", "a\u0301gil", "agitar", "agoni\u0301a", "agosto", "agotar", "agregar", "agrio", "agua", "agudo", "a\u0301guila", "aguja", "ahogo", "ahorro", "aire", "aislar", "ajedrez", "ajeno", "ajuste", "alacra\u0301n", "alambre", "alarma", "alba", "a\u0301lbum", "alcalde", "aldea", "alegre", "alejar", "alerta", "aleta", "alfiler", "alga", "algodo\u0301n", "aliado", "aliento", "alivio", "alma", "almeja", "almi\u0301bar", "altar", "alteza", "altivo", "alto", "altura", "alumno", "alzar", "amable", "amante", "amapola", "amargo", "amasar", "a\u0301mbar", "a\u0301mbito", "ameno", "amigo", "amistad", "amor", "amparo", "amplio", "ancho", "anciano", "ancla", "andar", "ande\u0301n", "anemia", "a\u0301ngulo", "anillo", "a\u0301nimo", "ani\u0301s", "anotar", "antena", "antiguo", "antojo", "anual", "anular", "anuncio", "an\u0303adir", "an\u0303ejo", "an\u0303o", "apagar", "aparato", "apetito", "apio", "aplicar", "apodo", "aporte", "apoyo", "aprender", "aprobar", "apuesta", "apuro", "arado", "aran\u0303a", "arar", "a\u0301rbitro", "a\u0301rbol", "arbusto", "archivo", "arco", "arder", "ardilla", "arduo", "a\u0301rea", "a\u0301rido", "aries", "armoni\u0301a", "arne\u0301s", "aroma", "arpa", "arpo\u0301n", "arreglo", "arroz", "arruga", "arte", "artista", "asa", "asado", "asalto", "ascenso", "asegurar", "aseo", "asesor", "asiento", "asilo", "asistir", "asno", "asombro", "a\u0301spero", "astilla", "astro", "astuto", "asumir", "asunto", "atajo", "ataque", "atar", "atento", "ateo", "a\u0301tico", "atleta", "a\u0301tomo", "atraer", "atroz", "atu\u0301n", "audaz", "audio", "auge", "aula", "aumento", "ausente", "autor", "aval", "avance", "avaro", "ave", "avellana", "avena", "avestruz", "avio\u0301n", "aviso", "ayer", "ayuda", "ayuno", "azafra\u0301n", "azar", "azote", "azu\u0301car", "azufre", "azul", "baba", "babor", "bache", "bahi\u0301a", "baile", "bajar", "balanza", "balco\u0301n", "balde", "bambu\u0301", "banco", "banda", "ban\u0303o", "barba", "barco", "barniz", "barro", "ba\u0301scula", "basto\u0301n", "basura", "batalla", "bateri\u0301a", "batir", "batuta", "bau\u0301l", "bazar", "bebe\u0301", "bebida", "bello", "besar", "beso", "bestia", "bicho", "bien", "bingo", "blanco", "bloque", "blusa", "boa", "bobina", "bobo", "boca", "bocina", "boda", "bodega", "boina", "bola", "bolero", "bolsa", "bomba", "bondad", "bonito", "bono", "bonsa\u0301i", "borde", "borrar", "bosque", "bote", "boti\u0301n", "bo\u0301veda", "bozal", "bravo", "brazo", "brecha", "breve", "brillo", "brinco", "brisa", "broca", "broma", "bronce", "brote", "bruja", "brusco", "bruto", "buceo", "bucle", "bueno", "buey", "bufanda", "bufo\u0301n", "bu\u0301ho", "buitre", "bulto", "burbuja", "burla", "burro", "buscar", "butaca", "buzo\u0301n", "caballo", "cabeza", "cabina", "cabra", "cacao", "cada\u0301ver", "cadena", "caer", "cafe\u0301", "cai\u0301da", "caima\u0301n", "caja", "cajo\u0301n", "cal", "calamar", "calcio", "caldo", "calidad", "calle", "calma", "calor", "calvo", "cama", "cambio", "camello", "camino", "campo", "ca\u0301ncer", "candil", "canela", "canguro", "canica", "canto", "can\u0303a", "can\u0303o\u0301n", "caoba", "caos", "capaz", "capita\u0301n", "capote", "captar", "capucha", "cara", "carbo\u0301n", "ca\u0301rcel", "careta", "carga", "carin\u0303o", "carne", "carpeta", "carro", "carta", "casa", "casco", "casero", "caspa", "castor", "catorce", "catre", "caudal", "causa", "cazo", "cebolla", "ceder", "cedro", "celda", "ce\u0301lebre", "celoso", "ce\u0301lula", "cemento", "ceniza", "centro", "cerca", "cerdo", "cereza", "cero", "cerrar", "certeza", "ce\u0301sped", "cetro", "chacal", "chaleco", "champu\u0301", "chancla", "chapa", "charla", "chico", "chiste", "chivo", "choque", "choza", "chuleta", "chupar", "ciclo\u0301n", "ciego", "cielo", "cien", "cierto", "cifra", "cigarro", "cima", "cinco", "cine", "cinta", "cipre\u0301s", "circo", "ciruela", "cisne", "cita", "ciudad", "clamor", "clan", "claro", "clase", "clave", "cliente", "clima", "cli\u0301nica", "cobre", "coccio\u0301n", "cochino", "cocina", "coco", "co\u0301digo", "codo", "cofre", "coger", "cohete", "coji\u0301n", "cojo", "cola", "colcha", "colegio", "colgar", "colina", "collar", "colmo", "columna", "combate", "comer", "comida", "co\u0301modo", "compra", "conde", "conejo", "conga", "conocer", "consejo", "contar", "copa", "copia", "corazo\u0301n", "corbata", "corcho", "cordo\u0301n", "corona", "correr", "coser", "cosmos", "costa", "cra\u0301neo", "cra\u0301ter", "crear", "crecer", "crei\u0301do", "crema", "cri\u0301a", "crimen", "cripta", "crisis", "cromo", "cro\u0301nica", "croqueta", "crudo", "cruz", "cuadro", "cuarto", "cuatro", "cubo", "cubrir", "cuchara", "cuello", "cuento", "cuerda", "cuesta", "cueva", "cuidar", "culebra", "culpa", "culto", "cumbre", "cumplir", "cuna", "cuneta", "cuota", "cupo\u0301n", "cu\u0301pula", "curar", "curioso", "curso", "curva", "cutis", "dama", "danza", "dar", "dardo", "da\u0301til", "deber", "de\u0301bil", "de\u0301cada", "decir", "dedo", "defensa", "definir", "dejar", "delfi\u0301n", "delgado", "delito", "demora", "denso", "dental", "deporte", "derecho", "derrota", "desayuno", "deseo", "desfile", "desnudo", "destino", "desvi\u0301o", "detalle", "detener", "deuda", "di\u0301a", "diablo", "diadema", "diamante", "diana", "diario", "dibujo", "dictar", "diente", "dieta", "diez", "difi\u0301cil", "digno", "dilema", "diluir", "dinero", "directo", "dirigir", "disco", "disen\u0303o", "disfraz", "diva", "divino", "doble", "doce", "dolor", "domingo", "don", "donar", "dorado", "dormir", "dorso", "dos", "dosis", "drago\u0301n", "droga", "ducha", "duda", "duelo", "duen\u0303o", "dulce", "du\u0301o", "duque", "durar", "dureza", "duro", "e\u0301bano", "ebrio", "echar", "eco", "ecuador", "edad", "edicio\u0301n", "edificio", "editor", "educar", "efecto", "eficaz", "eje", "ejemplo", "elefante", "elegir", "elemento", "elevar", "elipse", "e\u0301lite", "elixir", "elogio", "eludir", "embudo", "emitir", "emocio\u0301n", "empate", "empen\u0303o", "empleo", "empresa", "enano", "encargo", "enchufe", "enci\u0301a", "enemigo", "enero", "enfado", "enfermo", "engan\u0303o", "enigma", "enlace", "enorme", "enredo", "ensayo", "ensen\u0303ar", "entero", "entrar", "envase", "envi\u0301o", "e\u0301poca", "equipo", "erizo", "escala", "escena", "escolar", "escribir", "escudo", "esencia", "esfera", "esfuerzo", "espada", "espejo", "espi\u0301a", "esposa", "espuma", "esqui\u0301", "estar", "este", "estilo", "estufa", "etapa", "eterno", "e\u0301tica", "etnia", "evadir", "evaluar", "evento", "evitar", "exacto", "examen", "exceso", "excusa", "exento", "exigir", "exilio", "existir", "e\u0301xito", "experto", "explicar", "exponer", "extremo", "fa\u0301brica", "fa\u0301bula", "fachada", "fa\u0301cil", "factor", "faena", "faja", "falda", "fallo", "falso", "faltar", "fama", "familia", "famoso", "farao\u0301n", "farmacia", "farol", "farsa", "fase", "fatiga", "fauna", "favor", "fax", "febrero", "fecha", "feliz", "feo", "feria", "feroz", "fe\u0301rtil", "fervor", "festi\u0301n", "fiable", "fianza", "fiar", "fibra", "ficcio\u0301n", "ficha", "fideo", "fiebre", "fiel", "fiera", "fiesta", "figura", "fijar", "fijo", "fila", "filete", "filial", "filtro", "fin", "finca", "fingir", "finito", "firma", "flaco", "flauta", "flecha", "flor", "flota", "fluir", "flujo", "flu\u0301or", "fobia", "foca", "fogata", "fogo\u0301n", "folio", "folleto", "fondo", "forma", "forro", "fortuna", "forzar", "fosa", "foto", "fracaso", "fra\u0301gil", "franja", "frase", "fraude", "frei\u0301r", "freno", "fresa", "fri\u0301o", "frito", "fruta", "fuego", "fuente", "fuerza", "fuga", "fumar", "funcio\u0301n", "funda", "furgo\u0301n", "furia", "fusil", "fu\u0301tbol", "futuro", "gacela", "gafas", "gaita", "gajo", "gala", "galeri\u0301a", "gallo", "gamba", "ganar", "gancho", "ganga", "ganso", "garaje", "garza", "gasolina", "gastar", "gato", "gavila\u0301n", "gemelo", "gemir", "gen", "ge\u0301nero", "genio", "gente", "geranio", "gerente", "germen", "gesto", "gigante", "gimnasio", "girar", "giro", "glaciar", "globo", "gloria", "gol", "golfo", "goloso", "golpe", "goma", "gordo", "gorila", "gorra", "gota", "goteo", "gozar", "grada", "gra\u0301fico", "grano", "grasa", "gratis", "grave", "grieta", "grillo", "gripe", "gris", "grito", "grosor", "gru\u0301a", "grueso", "grumo", "grupo", "guante", "guapo", "guardia", "guerra", "gui\u0301a", "guin\u0303o", "guion", "guiso", "guitarra", "gusano", "gustar", "haber", "ha\u0301bil", "hablar", "hacer", "hacha", "hada", "hallar", "hamaca", "harina", "haz", "hazan\u0303a", "hebilla", "hebra", "hecho", "helado", "helio", "hembra", "herir", "hermano", "he\u0301roe", "hervir", "hielo", "hierro", "hi\u0301gado", "higiene", "hijo", "himno", "historia", "hocico", "hogar", "hoguera", "hoja", "hombre", "hongo", "honor", "honra", "hora", "hormiga", "horno", "hostil", "hoyo", "hueco", "huelga", "huerta", "hueso", "huevo", "huida", "huir", "humano", "hu\u0301medo", "humilde", "humo", "hundir", "huraca\u0301n", "hurto", "icono", "ideal", "idioma", "i\u0301dolo", "iglesia", "iglu\u0301", "igual", "ilegal", "ilusio\u0301n", "imagen", "ima\u0301n", "imitar", "impar", "imperio", "imponer", "impulso", "incapaz", "i\u0301ndice", "inerte", "infiel", "informe", "ingenio", "inicio", "inmenso", "inmune", "innato", "insecto", "instante", "intere\u0301s", "i\u0301ntimo", "intuir", "inu\u0301til", "invierno", "ira", "iris", "ironi\u0301a", "isla", "islote", "jabali\u0301", "jabo\u0301n", "jamo\u0301n", "jarabe", "jardi\u0301n", "jarra", "jaula", "jazmi\u0301n", "jefe", "jeringa", "jinete", "jornada", "joroba", "joven", "joya", "juerga", "jueves", "juez", "jugador", "jugo", "juguete", "juicio", "junco", "jungla", "junio", "juntar", "ju\u0301piter", "jurar", "justo", "juvenil", "juzgar", "kilo", "koala", "labio", "lacio", "lacra", "lado", "ladro\u0301n", "lagarto", "la\u0301grima", "laguna", "laico", "lamer", "la\u0301mina", "la\u0301mpara", "lana", "lancha", "langosta", "lanza", "la\u0301piz", "largo", "larva", "la\u0301stima", "lata", "la\u0301tex", "latir", "laurel", "lavar", "lazo", "leal", "leccio\u0301n", "leche", "lector", "leer", "legio\u0301n", "legumbre", "lejano", "lengua", "lento", "len\u0303a", "leo\u0301n", "leopardo", "lesio\u0301n", "letal", "letra", "leve", "leyenda", "libertad", "libro", "licor", "li\u0301der", "lidiar", "lienzo", "liga", "ligero", "lima", "li\u0301mite", "limo\u0301n", "limpio", "lince", "lindo", "li\u0301nea", "lingote", "lino", "linterna", "li\u0301quido", "liso", "lista", "litera", "litio", "litro", "llaga", "llama", "llanto", "llave", "llegar", "llenar", "llevar", "llorar", "llover", "lluvia", "lobo", "locio\u0301n", "loco", "locura", "lo\u0301gica", "logro", "lombriz", "lomo", "lonja", "lote", "lucha", "lucir", "lugar", "lujo", "luna", "lunes", "lupa", "lustro", "luto", "luz", "maceta", "macho", "madera", "madre", "maduro", "maestro", "mafia", "magia", "mago", "mai\u0301z", "maldad", "maleta", "malla", "malo", "mama\u0301", "mambo", "mamut", "manco", "mando", "manejar", "manga", "maniqui\u0301", "manjar", "mano", "manso", "manta", "man\u0303ana", "mapa", "ma\u0301quina", "mar", "marco", "marea", "marfil", "margen", "marido", "ma\u0301rmol", "marro\u0301n", "martes", "marzo", "masa", "ma\u0301scara", "masivo", "matar", "materia", "matiz", "matriz", "ma\u0301ximo", "mayor", "mazorca", "mecha", "medalla", "medio", "me\u0301dula", "mejilla", "mejor", "melena", "melo\u0301n", "memoria", "menor", "mensaje", "mente", "menu\u0301", "mercado", "merengue", "me\u0301rito", "mes", "meso\u0301n", "meta", "meter", "me\u0301todo", "metro", "mezcla", "miedo", "miel", "miembro", "miga", "mil", "milagro", "militar", "millo\u0301n", "mimo", "mina", "minero", "mi\u0301nimo", "minuto", "miope", "mirar", "misa", "miseria", "misil", "mismo", "mitad", "mito", "mochila", "mocio\u0301n", "moda", "modelo", "moho", "mojar", "molde", "moler", "molino", "momento", "momia", "monarca", "moneda", "monja", "monto", "mon\u0303o", "morada", "morder", "moreno", "morir", "morro", "morsa", "mortal", "mosca", "mostrar", "motivo", "mover", "mo\u0301vil", "mozo", "mucho", "mudar", "mueble", "muela", "muerte", "muestra", "mugre", "mujer", "mula", "muleta", "multa", "mundo", "mun\u0303eca", "mural", "muro", "mu\u0301sculo", "museo", "musgo", "mu\u0301sica", "muslo", "na\u0301car", "nacio\u0301n", "nadar", "naipe", "naranja", "nariz", "narrar", "nasal", "natal", "nativo", "natural", "na\u0301usea", "naval", "nave", "navidad", "necio", "ne\u0301ctar", "negar", "negocio", "negro", "neo\u0301n", "nervio", "neto", "neutro", "nevar", "nevera", "nicho", "nido", "niebla", "nieto", "nin\u0303ez", "nin\u0303o", "ni\u0301tido", "nivel", "nobleza", "noche", "no\u0301mina", "noria", "norma", "norte", "nota", "noticia", "novato", "novela", "novio", "nube", "nuca", "nu\u0301cleo", "nudillo", "nudo", "nuera", "nueve", "nuez", "nulo", "nu\u0301mero", "nutria", "oasis", "obeso", "obispo", "objeto", "obra", "obrero", "observar", "obtener", "obvio", "oca", "ocaso", "oce\u0301ano", "ochenta", "ocho", "ocio", "ocre", "octavo", "octubre", "oculto", "ocupar", "ocurrir", "odiar", "odio", "odisea", "oeste", "ofensa", "oferta", "oficio", "ofrecer", "ogro", "oi\u0301do", "oi\u0301r", "ojo", "ola", "oleada", "olfato", "olivo", "olla", "olmo", "olor", "olvido", "ombligo", "onda", "onza", "opaco", "opcio\u0301n", "o\u0301pera", "opinar", "oponer", "optar", "o\u0301ptica", "opuesto", "oracio\u0301n", "orador", "oral", "o\u0301rbita", "orca", "orden", "oreja", "o\u0301rgano", "orgi\u0301a", "orgullo", "oriente", "origen", "orilla", "oro", "orquesta", "oruga", "osadi\u0301a", "oscuro", "osezno", "oso", "ostra", "oton\u0303o", "otro", "oveja", "o\u0301vulo", "o\u0301xido", "oxi\u0301geno", "oyente", "ozono", "pacto", "padre", "paella", "pa\u0301gina", "pago", "pai\u0301s", "pa\u0301jaro", "palabra", "palco", "paleta", "pa\u0301lido", "palma", "paloma", "palpar", "pan", "panal", "pa\u0301nico", "pantera", "pan\u0303uelo", "papa\u0301", "papel", "papilla", "paquete", "parar", "parcela", "pared", "parir", "paro", "pa\u0301rpado", "parque", "pa\u0301rrafo", "parte", "pasar", "paseo", "pasio\u0301n", "paso", "pasta", "pata", "patio", "patria", "pausa", "pauta", "pavo", "payaso", "peato\u0301n", "pecado", "pecera", "pecho", "pedal", "pedir", "pegar", "peine", "pelar", "peldan\u0303o", "pelea", "peligro", "pellejo", "pelo", "peluca", "pena", "pensar", "pen\u0303o\u0301n", "peo\u0301n", "peor", "pepino", "pequen\u0303o", "pera", "percha", "perder", "pereza", "perfil", "perico", "perla", "permiso", "perro", "persona", "pesa", "pesca", "pe\u0301simo", "pestan\u0303a", "pe\u0301talo", "petro\u0301leo", "pez", "pezun\u0303a", "picar", "picho\u0301n", "pie", "piedra", "pierna", "pieza", "pijama", "pilar", "piloto", "pimienta", "pino", "pintor", "pinza", "pin\u0303a", "piojo", "pipa", "pirata", "pisar", "piscina", "piso", "pista", "pito\u0301n", "pizca", "placa", "plan", "plata", "playa", "plaza", "pleito", "pleno", "plomo", "pluma", "plural", "pobre", "poco", "poder", "podio", "poema", "poesi\u0301a", "poeta", "polen", "polici\u0301a", "pollo", "polvo", "pomada", "pomelo", "pomo", "pompa", "poner", "porcio\u0301n", "portal", "posada", "poseer", "posible", "poste", "potencia", "potro", "pozo", "prado", "precoz", "pregunta", "premio", "prensa", "preso", "previo", "primo", "pri\u0301ncipe", "prisio\u0301n", "privar", "proa", "probar", "proceso", "producto", "proeza", "profesor", "programa", "prole", "promesa", "pronto", "propio", "pro\u0301ximo", "prueba", "pu\u0301blico", "puchero", "pudor", "pueblo", "puerta", "puesto", "pulga", "pulir", "pulmo\u0301n", "pulpo", "pulso", "puma", "punto", "pun\u0303al", "pun\u0303o", "pupa", "pupila", "pure\u0301", "quedar", "queja", "quemar", "querer", "queso", "quieto", "qui\u0301mica", "quince", "quitar", "ra\u0301bano", "rabia", "rabo", "racio\u0301n", "radical", "rai\u0301z", "rama", "rampa", "rancho", "rango", "rapaz", "ra\u0301pido", "rapto", "rasgo", "raspa", "rato", "rayo", "raza", "razo\u0301n", "reaccio\u0301n", "realidad", "reban\u0303o", "rebote", "recaer", "receta", "rechazo", "recoger", "recreo", "recto", "recurso", "red", "redondo", "reducir", "reflejo", "reforma", "refra\u0301n", "refugio", "regalo", "regir", "regla", "regreso", "rehe\u0301n", "reino", "rei\u0301r", "reja", "relato", "relevo", "relieve", "relleno", "reloj", "remar", "remedio", "remo", "rencor", "rendir", "renta", "reparto", "repetir", "reposo", "reptil", "res", "rescate", "resina", "respeto", "resto", "resumen", "retiro", "retorno", "retrato", "reunir", "reve\u0301s", "revista", "rey", "rezar", "rico", "riego", "rienda", "riesgo", "rifa", "ri\u0301gido", "rigor", "rinco\u0301n", "rin\u0303o\u0301n", "ri\u0301o", "riqueza", "risa", "ritmo", "rito", "rizo", "roble", "roce", "rociar", "rodar", "rodeo", "rodilla", "roer", "rojizo", "rojo", "romero", "romper", "ron", "ronco", "ronda", "ropa", "ropero", "rosa", "rosca", "rostro", "rotar", "rubi\u0301", "rubor", "rudo", "rueda", "rugir", "ruido", "ruina", "ruleta", "rulo", "rumbo", "rumor", "ruptura", "ruta", "rutina", "sa\u0301bado", "saber", "sabio", "sable", "sacar", "sagaz", "sagrado", "sala", "saldo", "salero", "salir", "salmo\u0301n", "salo\u0301n", "salsa", "salto", "salud", "salvar", "samba", "sancio\u0301n", "sandi\u0301a", "sanear", "sangre", "sanidad", "sano", "santo", "sapo", "saque", "sardina", "sarte\u0301n", "sastre", "sata\u0301n", "sauna", "saxofo\u0301n", "seccio\u0301n", "seco", "secreto", "secta", "sed", "seguir", "seis", "sello", "selva", "semana", "semilla", "senda", "sensor", "sen\u0303al", "sen\u0303or", "separar", "sepia", "sequi\u0301a", "ser", "serie", "sermo\u0301n", "servir", "sesenta", "sesio\u0301n", "seta", "setenta", "severo", "sexo", "sexto", "sidra", "siesta", "siete", "siglo", "signo", "si\u0301laba", "silbar", "silencio", "silla", "si\u0301mbolo", "simio", "sirena", "sistema", "sitio", "situar", "sobre", "socio", "sodio", "sol", "solapa", "soldado", "soledad", "so\u0301lido", "soltar", "solucio\u0301n", "sombra", "sondeo", "sonido", "sonoro", "sonrisa", "sopa", "soplar", "soporte", "sordo", "sorpresa", "sorteo", "soste\u0301n", "so\u0301tano", "suave", "subir", "suceso", "sudor", "suegra", "suelo", "suen\u0303o", "suerte", "sufrir", "sujeto", "sulta\u0301n", "sumar", "superar", "suplir", "suponer", "supremo", "sur", "surco", "suren\u0303o", "surgir", "susto", "sutil", "tabaco", "tabique", "tabla", "tabu\u0301", "taco", "tacto", "tajo", "talar", "talco", "talento", "talla", "talo\u0301n", "taman\u0303o", "tambor", "tango", "tanque", "tapa", "tapete", "tapia", "tapo\u0301n", "taquilla", "tarde", "tarea", "tarifa", "tarjeta", "tarot", "tarro", "tarta", "tatuaje", "tauro", "taza", "tazo\u0301n", "teatro", "techo", "tecla", "te\u0301cnica", "tejado", "tejer", "tejido", "tela", "tele\u0301fono", "tema", "temor", "templo", "tenaz", "tender", "tener", "tenis", "tenso", "teori\u0301a", "terapia", "terco", "te\u0301rmino", "ternura", "terror", "tesis", "tesoro", "testigo", "tetera", "texto", "tez", "tibio", "tiburo\u0301n", "tiempo", "tienda", "tierra", "tieso", "tigre", "tijera", "tilde", "timbre", "ti\u0301mido", "timo", "tinta", "ti\u0301o", "ti\u0301pico", "tipo", "tira", "tiro\u0301n", "tita\u0301n", "ti\u0301tere", "ti\u0301tulo", "tiza", "toalla", "tobillo", "tocar", "tocino", "todo", "toga", "toldo", "tomar", "tono", "tonto", "topar", "tope", "toque", "to\u0301rax", "torero", "tormenta", "torneo", "toro", "torpedo", "torre", "torso", "tortuga", "tos", "tosco", "toser", "to\u0301xico", "trabajo", "tractor", "traer", "tra\u0301fico", "trago", "traje", "tramo", "trance", "trato", "trauma", "trazar", "tre\u0301bol", "tregua", "treinta", "tren", "trepar", "tres", "tribu", "trigo", "tripa", "triste", "triunfo", "trofeo", "trompa", "tronco", "tropa", "trote", "trozo", "truco", "trueno", "trufa", "tuberi\u0301a", "tubo", "tuerto", "tumba", "tumor", "tu\u0301nel", "tu\u0301nica", "turbina", "turismo", "turno", "tutor", "ubicar", "u\u0301lcera", "umbral", "unidad", "unir", "universo", "uno", "untar", "un\u0303a", "urbano", "urbe", "urgente", "urna", "usar", "usuario", "u\u0301til", "utopi\u0301a", "uva", "vaca", "vaci\u0301o", "vacuna", "vagar", "vago", "vaina", "vajilla", "vale", "va\u0301lido", "valle", "valor", "va\u0301lvula", "vampiro", "vara", "variar", "varo\u0301n", "vaso", "vecino", "vector", "vehi\u0301culo", "veinte", "vejez", "vela", "velero", "veloz", "vena", "vencer", "venda", "veneno", "vengar", "venir", "venta", "venus", "ver", "verano", "verbo", "verde", "vereda", "verja", "verso", "verter", "vi\u0301a", "viaje", "vibrar", "vicio", "vi\u0301ctima", "vida", "vi\u0301deo", "vidrio", "viejo", "viernes", "vigor", "vil", "villa", "vinagre", "vino", "vin\u0303edo", "violi\u0301n", "viral", "virgo", "virtud", "visor", "vi\u0301spera", "vista", "vitamina", "viudo", "vivaz", "vivero", "vivir", "vivo", "volca\u0301n", "volumen", "volver", "voraz", "votar", "voto", "voz", "vuelo", "vulgar", "yacer", "yate", "yegua", "yema", "yerno", "yeso", "yodo", "yoga", "yogur", "zafiro", "zanja", "zapato", "zarza", "zona", "zorro", "zumo", "zurdo"];
}
});
// node_modules/bip39-mnemonic/wordlist/turkish.json
var require_turkish = __commonJS({
"node_modules/bip39-mnemonic/wordlist/turkish.json"(exports2, module2) {
module2.exports = ["abajur", "abak\xFCs", "abart\u0131", "abdal", "abdest", "abiye", "abluka", "abone", "absorbe", "abs\xFCrt", "acayip", "acele", "acemi", "a\xE7\u0131kg\xF6z", "adalet", "adam", "adezyon", "adisyon", "adliye", "adres", "afacan", "afili", "afi\u015F", "afiyet", "aforizm", "afra", "a\u011Fa\xE7", "a\u011F\u0131r", "ahbap", "ahkam", "ahlak", "ahtapot", "aidat", "aile", "ajan", "akademi", "akarsu", "akba\u015F", "akci\u011Fer", "akdeniz", "ak\u0131bet", "ak\u0131l", "ak\u0131nt\u0131", "akide", "akrep", "akrobasi", "aksiyon", "ak\u015Fam", "aktif", "akt\xF6r", "aktris", "akustik", "alaca", "alb\xFCm", "al\xE7ak", "aldanma", "aleni", "alet", "alfabe", "alg\u0131lama", "al\u0131ngan", "alk\u0131\u015F", "alkol", "alpay", "alperen", "alt\u0131n", "alt\xFCst", "altyap\u0131", "alyuvar", "amade", "amat\xF6r", "amazon", "ambalaj", "amblem", "ambulans", "amca", "amel", "amigo", "amir", "amiyane", "amorti", "ampul", "anadolu", "anahtar", "anakonda", "anaokul", "anapara", "anar\u015Fi", "anatomi", "anayasa", "anekdot", "anestezi", "angaje", "anka", "anket", "anlaml\u0131", "anne", "anomali", "anonim", "anten", "antla\u015Fma", "apse", "araba", "arac\u0131", "araf", "arbede", "arda", "arefe", "arena", "argo", "arg\xFCman", "arkada\u015F", "armoni", "aroma", "arsa", "ars\u0131z", "art\u0131", "artist", "aruz", "asans\xF6r", "asayi\u015F", "asfalt", "asgari", "asil", "asker", "ask\u0131", "aslan", "asosyal", "astsubay", "asya", "a\u015F\xE7\u0131", "a\u015F\u0131r\u0131", "a\u015Fure", "atabey", "ataman", "ate\u015F", "atmaca", "atmosfer", "atom", "at\xF6lye", "avc\u0131", "avdet", "avize", "avlu", "avokado", "avrupa", "avukat", "ayaz", "ay\xE7i\xE7e\u011Fi", "ayd\u0131n", "ayg\u0131t", "ayna", "ayran", "ayr\u0131nt\u0131", "azim", "baca", "bagaj", "ba\u011Flant\u0131", "bahad\u0131r", "bah\xE7e", "baki", "bakkal", "baklava", "bakteri", "bal\xE7\u0131k", "balina", "balo", "balta", "bant", "banyo", "bardak", "bar\u0131\u015F", "ba\u015Fbu\u011F", "ba\u015F\u0131bo\u015F", "ba\u015Fkan", "ba\u015Fl\u0131k", "bavul", "bay\u0131nd\u0131r", "bayku\u015F", "bazlama", "bedel", "beg\xFCm", "bek\xE7i", "bekle", "belge", "belki", "bencil", "benek", "bengi", "benzer", "berjer", "berk", "bermuda", "berrak", "be\u015Fik", "beton", "beyin", "beyo\u011Flu", "b\u0131\xE7ak", "biberiye", "bidon", "biftek", "bihaber", "bikini", "bilezik", "bilin\xE7", "bilye", "bina", "binba\u015F\u0131", "biny\u0131l", "bisiklet", "bisk\xFCvi", "bitki", "bizzat", "bodrum", "bo\u011Faz", "boh\xE7a", "bolero", "boncuk", "bonfile", "borsa", "boru", "bostan", "bo\u015Fbo\u011Faz", "botanik", "boya", "boykot", "boynuz", "bozgun", "bozk\u0131r", "b\xF6l\xFCm", "b\xF6rek", "bu\xE7uk", "bug\xFCn", "bu\u011Fday", "buhar", "buhran", "bulvar", "buram", "bur\xE7ak", "burs", "burun", "butik", "buzda\u011F\u0131", "buzk\u0131ran", "b\xFCc\xFCr", "b\xFCfe", "b\xFClten", "b\xFCt\xE7e", "b\xFCt\xFCn", "b\xFCy\xFCk", "cac\u0131k", "cad\u0131", "cahil", "cambaz", "canh\u0131ra\u015F", "casus", "cazibe", "cehalet", "cehennem", "ceket", "cemre", "cenin", "cennet", "cepken", "cerrah", "cesur", "cetvel", "cevher", "ceylan", "c\u0131l\u0131z", "c\u0131va", "cilt", "cisim", "ciyak", "co\u011Frafya", "c\xF6mert", "cumba", "c\xFCzdan", "\xE7abucak", "\xE7ad\u0131r", "\xE7a\u011Fda\u015F", "\xE7a\u011Flayan", "\xE7a\u011Fr\u0131", "\xE7akmak", "\xE7al\u0131\u015Fkan", "\xE7ama\u015F\u0131r", "\xE7apa", "\xE7aput", "\xE7ar\u0131k", "\xE7arpan", "\xE7ar\u015Faf", "\xE7ayhane", "\xE7ekirdek", "\xE7elebi", "\xE7ember", "\xE7enet", "\xE7engel", "\xE7er\xE7eve", "\xE7erez", "\xE7e\u015Fit", "\xE7e\u015Fme", "\xE7ete", "\xE7evre", "\xE7eyiz", "\xE7eyrek", "\xE7\u0131\u011F\u0131r", "\xE7\u0131lg\u0131n", "\xE7\u0131ng\u0131rak", "\xE7ift", "\xE7i\u011Fdem", "\xE7ikolata", "\xE7ilek", "\xE7imen", "\xE7ivi", "\xE7oban", "\xE7ocuk", "\xE7okgen", "\xE7omak", "\xE7orba", "\xE7\xF6zelti", "\xE7ubuk", "\xE7ukur", "\xE7uval", "\xE7\xFCr\xFCk", "da\u011Fba\u015F\u0131", "da\u011F\u0131l\u0131m", "daktilo", "dald\u0131r\u0131\u015F", "dalga", "dalkavuk", "damak", "dam\u0131tma", "damla", "dana", "dandik", "dan\u0131\u015Fman", "daniska", "dantel", "darge\xE7it", "darphane", "davet", "day\u0131", "defter", "de\u011Fer", "de\u011Firmen", "deh\u015Fet", "delge\xE7", "demir", "deneyim", "denge", "depo", "deprem", "derdest", "dere", "derhal", "derman", "dernek", "dervi\u015F", "desen", "destan", "d\u0131\u015Far\u0131", "d\u0131\u015Fb\xFCkey", "dijital", "dikba\u015Fl\u0131", "dilek\xE7e", "dima\u011F", "dinamik", "dindar", "dinleme", "dinozor", "dip\xE7ik", "dipnot", "direni\u015F", "dirsek", "disiplin", "disk", "divri\u011Fi", "diz\xFCst\xFC", "dobra", "dodurga", "do\u011Falgaz", "doktor", "dok\xFCman", "dolap", "donan\u0131m", "dondurma", "don\xF6r", "doruk", "dosdo\u011Fru", "dost", "dosya", "dozer", "d\xF6k\xFCm", "d\xF6nence", "d\xF6rtyol", "d\xF6vme", "dram", "dublaj", "durum", "duvak", "duyarga", "duyma", "duyuru", "d\xFC\u011Fme", "d\xFC\u011F\xFCm", "d\xFCkkan", "d\xFCn\xFCr", "d\xFCped\xFCz", "d\xFCrb\xFCn", "d\xFC\u015F\xFCn\xFCr", "d\xFCzayak", "d\xFCzeltme", "ebeveyn", "ebru", "ecel", "ecnebi", "ecza", "edat", "edilgen", "efendi", "efor", "efsane", "egemen", "egzersiz", "e\u011Frelti", "ekarte", "ekip", "eklem", "ekmek", "ekol", "ekonomi", "ekose", "ekran", "ekvator", "elaman", "elastik", "elbet", "elbise", "el\xE7i", "eldiven", "eleba\u015F\u0131", "ele\u015Ftiri", "elma", "elo\u011Flu", "elveda", "emare", "emek\xE7i", "emisyon", "emniyet", "empati", "emsal", "emzik", "end\xFCstri", "enerji", "engebe", "engin", "eni\u015Fte", "enkaz", "entari", "entegre", "entrika", "enzim", "erdem", "ergen", "erguvan", "erkek", "erozyon", "ertesi", "erzak", "esaret", "esenlik", "eser", "eski", "esnek", "e\u015Farp", "e\u015Fofman", "e\u015Fraf", "e\u015Fya", "e\u015Fzaman", "etik", "etken", "etkinlik", "et\xFCt", "evet", "evire", "evrak", "evrim", "eyalet", "eyvah", "ezber", "fabrika", "fanatik", "fanus", "fason", "fasulye", "fatih", "fatura", "fauna", "favori", "fayans", "fayton", "faz\u0131l", "fazilet", "federal", "felsefe", "fener", "feribot", "fersah", "fesih", "festival", "feveran", "feza", "f\u0131\xE7\u0131", "f\u0131ld\u0131r", "f\u0131nd\u0131k", "f\u0131r\xE7a", "f\u0131rsat", "f\u0131rt\u0131na", "f\u0131t\u0131k", "fidan", "fidye", "fig\xFCr", "fihrist", "fikir", "fildi\u015Fi", "filo", "filtre", "fincan", "firuze", "fitil", "fiyaka", "fizik", "fla\u015F", "fl\xFCt", "fosil", "fren", "fukara", "futbol", "garabet", "gariban", "garnit\xFCr", "gazi", "gece", "gedik", "gelenek", "gelin", "gemi", "gen\xE7", "geni\u015F", "geometri", "ger\xE7ek", "gevrek", "gezegen", "gezgin", "geziyolu", "g\u0131c\u0131k", "g\u0131da", "g\u0131ybet", "girdap", "giri\u015Fim", "gitar", "giyecek", "giysi", "gizem", "gofret", "goril", "g\xF6bek", "g\xF6\xE7ebe", "g\xF6\u011F\xFCs", "g\xF6kdelen", "g\xF6kmen", "g\xF6ky\xFCz\xFC", "g\xF6lge", "g\xF6mlek", "g\xF6n\xFCl", "g\xF6renek", "g\xF6rkemli", "g\xF6rsel", "g\xF6steri", "g\xF6vde", "g\xF6zalt\u0131", "g\xF6zc\xFC", "g\xF6zda\u011F\u0131", "g\xF6zleme", "g\xF6zya\u015F\u0131", "grup", "gurbet", "gus\xFCl", "g\xFCbre", "g\xFCfte", "g\xFCm\xFC\u015F", "g\xFCnayd\u0131n", "g\xFCncel", "g\xFCnd\xFCz", "g\xFCne\u015F", "g\xFCny\xFCz\xFC", "g\xFCrb\xFCz", "g\xFCvercin", "g\xFCzel", "haber", "hacamat", "hacim", "hademe", "haf\u0131z", "hafriyat", "hafta", "hakan", "hakem", "hakikat", "haksever", "hal\u0131", "han\xE7er", "hane", "hangar", "hapis", "hap\u015F\u0131r\u0131k", "harf", "haseki", "hasret", "hatun", "havu\xE7", "haylaz", "haysiyet", "hayvan", "hedef", "hektar", "hemen", "hemfikir", "hendek", "hepsi", "hergele", "herhangi", "hesap", "heyecan", "heykel", "hezimet", "h\u0131\xE7k\u0131r\u0131k", "h\u0131z\xF6l\xE7er", "hicviye", "hikaye", "hikmet", "hile", "hisse", "hobi", "hoca", "horlama", "hormon", "ho\u015Fbe\u015F", "ho\u015Fg\xF6r\xFC", "hoyrat", "h\xF6rg\xFC\xE7", "h\xF6y\xFCk", "hudut", "hukuk", "hunhar", "hurda", "huysuz", "huzur", "h\xFCcum", "h\xFCk\xFCmet", "h\xFCnkar", "h\xFCviyet", "\u0131rmak", "\u0131s\u0131\xF6l\xE7er", "\u0131s\u0131t\u0131c\u0131", "\u0131spanak", "\u0131srar", "\u0131\u015F\u0131ldak", "\u0131zd\u0131rap", "\u0131zgara", "ibadet", "icat", "i\xE7b\xFCkey", "i\xE7ecek", "i\xE7g\xFCd\xFC", "i\xE7sel", "idman", "iftihar", "i\u011Fne", "ihanet", "ihbar", "ihdas", "ihmal", "ihracat", "ihsan", "ikilem", "ikindi", "ikircik", "iklim", "iksir", "iktibas", "ila\xE7", "il\xE7e", "ileri", "ileti\u015Fim", "ilgi", "ilhak", "ilkbahar", "ilkokul", "ilmek", "imkan", "imle\xE7", "imsak", "imtihan", "imza", "ince", "inkar", "in\u015Fa", "ipek", "ipucu", "irade", "irfan", "irmik", "isabet", "iskele", "israf", "isyan", "i\u015F\xE7i", "i\u015Fgal", "i\u015Fg\xFCzar", "i\u015Flem", "itibar", "itiraf", "ivedi", "ivme", "iyile\u015Fme", "iyimser", "izbandut", "izci", "izdiham", "izin", "jakoben", "jandarma", "jargon", "kabaday\u0131", "kablo", "kabus", "ka\xE7amak", "kadeh", "kad\u0131n", "kadraj", "kafa", "kafkas", "ka\u011F\u0131t", "ka\u011Fn\u0131", "kahkaha", "kahraman", "kahvalt\u0131", "kak\xFCl", "kald\u0131r\u0131m", "kale", "kalibre", "kalkan", "kalpak", "kam\u0131\u015F", "kamyon", "kanat", "kanda\u015F", "kanepe", "kanser", "kanun", "kaos", "kap\u0131", "kapl\u0131ca", "kaptan", "karanl\u0131k", "karde\u015F", "karga", "kar\u0131nca", "karma\u015Fa", "kar\u015F\u0131t", "kas\u0131rga", "kask", "kasvet", "katk\u0131", "katman", "kavram", "kaygan", "kaynak\xE7a", "kayyum", "kedi", "kehanet", "kekik", "kelebek", "kenar", "kerkenez", "kerpi\xE7", "kesirli", "kesmece", "kestane", "ke\u015Fkek", "ket\xE7ap", "keyfiyet", "k\u0131ble", "k\u0131demli", "k\u0131lavuz", "k\u0131l\xE7\u0131k", "k\u0131l\u0131f", "k\u0131ra\xE7", "k\u0131rm\u0131z\u0131", "k\u0131rsal", "k\u0131sayol", "k\u0131s\u0131m", "k\u0131skan\xE7", "k\u0131smet", "k\u0131\u015Fla", "k\u0131van\xE7", "k\u0131v\u0131lc\u0131m", "k\u0131vr\u0131k", "k\u0131yafet", "k\u0131ymetli", "k\u0131zak", "k\u0131z\u0131lc\u0131k", "kibar", "kinaye", "kira", "kiremit", "kirli", "kirpik", "ki\u015Fisel", "kitap", "ko\xE7ba\u015F\u0131", "kodaman", "ko\u011Fu\u015F", "kokteyl", "kolayc\u0131", "kolbast\u0131", "kolonya", "koltuk", "kolye", "kombine", "komedyen", "komiser", "komposto", "kom\u015Fu", "komuta", "konak", "konfor", "koni", "kons\xFCl", "kopya", "korkusuz", "korna", "korse", "korunak", "korvet", "kost\xFCm", "ko\u015Ful", "koyu", "kozmik", "k\xF6fte", "k\xF6kensel", "k\xF6pr\xFCc\xFCk", "k\xF6p\xFCk", "k\xF6rd\xFC\u011F\xFCm", "k\xF6rfez", "k\xF6stebek", "k\xF6\u015Fegen", "k\xF6t\xFC", "kravat", "kriter", "kuantum", "kudurma", "kulu\xE7ka", "kul\xFCbe", "kumanya", "kumbara", "kumlu", "kumpir", "kumral", "kundura", "kupa", "kupkuru", "kuramsal", "kurba\u011Fa", "kurdele", "kurgu", "kurmay", "kur\u015Fun", "kurtulu\u015F", "kurultay", "kurye", "kusursuz", "ku\u015Fak", "ku\u015Fba\u015F\u0131", "ku\u015Fkulu", "kutlama", "kutsal", "kutup", "kuver", "kuyruk", "kuzey", "kuzgun", "k\xFC\xE7\xFCk", "k\xFCl\xE7e", "k\xFClfet", "k\xFClliye", "k\xFClt\xFCrel", "k\xFCmes", "k\xFCnefe", "k\xFCresel", "k\xFCtle", "lahana", "lahmacun", "lamba", "lansman", "lava\u015F", "lay\u0131k", "le\u011Fen", "levent", "leziz", "lezzet", "lider", "likide", "liman", "liste", "litre", "liyakat", "lodos", "lokanta", "lokman", "lokum", "lunapark", "l\xFCtfen", "l\xFCzum", "nokta", "mabet", "macera", "macun", "madalya", "madde", "madem", "ma\u011Fara", "ma\u011Fdur", "ma\u011Ffiret", "ma\u011Flup", "mahalle", "mahcup", "mahir", "mahkeme", "mahlas", "mahrum", "mahsul", "makas", "makbuz", "makine", "makro", "maksat", "makul", "maliye", "manav", "mangal", "manidar", "manken", "mant\u0131k", "manzara", "mare\u015Fal", "margarin", "marifet", "market", "marmelat", "masa\xFCst\xFC", "masmavi", "masraf", "masum", "matah", "materyal", "matrak", "maval", "mavra", "maydanoz", "mayho\u015F", "maytap", "mazbata", "mazeret", "mazlum", "mazot", "mazur", "mebla\u011F", "mebus", "mecaz", "mecbur", "meclis", "mecmua", "mecnun", "me\xE7hul", "medeni", "mehtap", "mekanik", "melodi", "meltem", "memur", "mendil", "menek\u015Fe", "mente\u015Fe", "merakl\u0131", "mercek", "merdiven", "merhaba", "merinos", "merkez", "mermi", "mert", "mesafe", "mesele", "mesken", "meslek", "me\u015Fale", "me\u015Fgul", "me\u015Fhur", "metafor", "metin", "metre", "mevcut", "mevkida\u015F", "meydan", "meyil", "meyve", "meziyet", "mezun", "m\u0131knat\u0131s", "m\u0131sra", "m\u0131z\u0131ka", "mi\u011Ffer", "mihrak", "mikrofon", "miktar", "milat", "milli", "mimar", "minare", "mineral", "minik", "minyon", "mirliva", "misafir", "miskin", "miting", "miyop", "mizah", "mobilya", "model", "monit\xF6r", "mor\xF6tesi", "motive", "motor", "mozaik", "muavin", "mucize", "muhaf\u0131z", "muhte\u015Fem", "mukayese", "mumya", "musluk", "mu\u015Famba", "mutab\u0131k", "mutfak", "mutlu", "muzaffer", "muzdarip", "m\xFCbarek", "m\xFCcadele", "m\xFCd\xFCr", "m\xFCfredat", "m\xFCft\xFC", "m\xFChendis", "m\xFChim", "m\xFChlet", "m\xFCkemmel", "m\xFClk", "m\xFCmk\xFCn", "m\xFCmtaz", "m\xFCsrif", "m\xFCstesna", "m\xFC\u015Fahit", "m\xFC\u015Fteri", "m\xFCtercim", "m\xFCthi\u015F", "m\xFCze", "m\xFCzik", "nab\u0131z", "nadas", "nadir", "naho\u015F", "nakarat", "nak\u0131\u015F", "nalbur", "namlu", "namus", "nank\xF6r", "nargile", "narkoz", "nas\u0131l", "nasip", "naylon", "nazar", "naz\u0131m", "nazik", "neden", "nefes", "negatif", "neon", "nept\xFCn", "nerede", "nesil", "nesnel", "ne\u015Feli", "netice", "nevresim", "neyse", "neyzen", "nezaket", "nezih", "nezle", "nicel", "nil\xFCfer", "nimet", "nisan", "nispet", "nitekim", "nizam", "nohut", "noksan", "normal", "nostalji", "noter", "n\xF6bet", "numara", "numune", "nutuk", "n\xFCfus", "obaba\u015F\u0131", "obez", "obje", "ocak", "odun", "ofansif", "ofis", "o\u011Flak", "o\u011Fuz", "ok\xE7u", "oklava", "oksijen", "okul", "okumu\u015F", "okutman", "okuyucu", "okyanus", "ola\u011Fan", "olanak", "olas\u0131", "olay", "olgun", "olimpik", "olumlu", "omlet", "omurga", "onar\u0131m", "onursal", "opera", "optik", "oral", "orant\u0131", "ordu", "organik", "orijin", "orkide", "orman", "orta", "oru\xE7", "ota\u011F", "otantik", "otel", "otoban", "otogar", "otomobil", "otonom", "otopark", "otorite", "otoyol", "oturum", "oyuk", "oyuncak", "ozan", "\xF6deme", "\xF6denek", "\xF6dev", "\xF6d\xFCl", "\xF6d\xFCn\xE7", "\xF6fke", "\xF6\u011Flen", "\xF6\u011Frenci", "\xF6\u011F\xFCn", "\xF6\u011F\xFCt\xFCc\xFC", "\xF6ks\xFCr\xFCk", "\xF6l\xE7me", "\xF6l\xE7\xFC", "\xF6l\xFCms\xFCz", "\xF6m\xFCr", "\xF6nayak", "\xF6nc\xFC", "\xF6nder", "\xF6nem", "\xF6nerge", "\xF6ng\xF6r\xFC", "\xF6nl\xFCk", "\xF6nsezi", "\xF6p\xFCc\xFCk", "\xF6rdek", "\xF6rg\xFC", "\xF6rtbas", "\xF6rtme", "\xF6rt\xFC", "\xF6r\xFCmcek", "\xF6r\xFCnt\xFC", "\xF6teberi", "\xF6teki", "\xF6v\xFCn\xE7", "\xF6yk\xFC", "\xF6yleyse", "\xF6z\xE7ekim", "\xF6zdeyi\u015F", "\xF6zel", "\xF6zenti", "\xF6zerk", "\xF6zg\xFCrl\xFCk", "\xF6zlem", "\xF6zl\xFC", "\xF6zne", "\xF6zsever", "\xF6z\xFCmseme", "\xF6z\xFCr", "\xF6zveri", "pabu\xE7", "padi\u015Fah", "palamut", "palmiye", "palto", "palya\xE7o", "pamuk", "panay\u0131r", "pancar", "panda", "panel", "panik", "panjur", "pankart", "pano", "pansuman", "pantolon", "panzehir", "papatya", "papyon", "para\u015F\xFCt", "par\xE7a", "pard\xF6s\xFC", "parf\xFCm", "par\u0131lt\u0131", "parkur", "parmak", "parodi", "parsel", "partner", "pasaport", "pasif", "paskalya", "past\u0131rma", "pa\u015Fa", "patates", "paten", "patika", "patl\u0131can", "patolog", "patron", "payanda", "payda\u015F", "payidar", "payla\u015Fma", "paytak", "pe\xE7ete", "pedal", "peder", "pehlivan", "pekala", "pekmez", "pelerin", "pelikan", "pel\xFC\u015F", "pembe", "pena", "pencere", "pense", "per\xE7in", "perde", "pergel", "peri\u015Fan", "peron", "personel", "per\u015Fembe", "peruk", "pervane", "pespaye", "pestil", "pe\u015Fin", "petek", "petrol", "petunya", "peynir", "peyzaj", "p\u0131nar", "p\u0131rasa", "p\u0131rlanta", "pide", "pikap", "piknik", "pilav", "pili\xE7", "pilot", "pipet", "pipo", "piramit", "pirin\xE7", "pirzola", "pist", "pi\u015Fik", "pi\u015Fman", "piyasa", "piyes", "plaj", "plaket", "planlama", "platform", "plazma", "podyum", "po\u011Fa\xE7a", "polat", "polen", "politika", "pompa", "pop\xFCler", "porselen", "portakal", "posa", "poster", "po\u015Fet", "poyraz", "pozitif", "pranga", "pratik", "prenses", "prim", "problem", "profil", "program", "proje", "protokol", "prova", "puan", "pudra", "pusula", "p\xFCre", "p\xFCr\xFCz", "p\xFCst\xFCl", "p\xFCs\xFCr", "racon", "radar", "radikal", "radyo", "rafadan", "rafine", "ra\u011Fbet", "rahat", "rahle", "rakam", "raket", "rakip", "rakun", "ralli", "rampa", "randevu", "ranza", "rapor", "rastgele", "rasyonel", "raz\u0131", "realite", "re\xE7ine", "refah", "referans", "refik", "reform", "rehber", "rehin", "reis", "rekabet", "reklam", "rekor", "rekt\xF6r", "renk", "resim", "resmen", "restoran", "retorik", "reva\xE7", "revize", "reyon", "rezalet", "rezerv", "rezil", "r\u0131ht\u0131m", "r\u0131za", "ritim", "rit\xFCel", "rivayet", "robot", "roman", "rota", "rozet", "r\xF6portaj", "r\xF6tar", "ruble", "ruhban", "ruhsat", "rulet", "rulo", "runik", "rutin", "rutubet", "r\xFC\u015Fvet", "r\xFCtbe", "r\xFCya", "r\xFCzgar", "sabah", "sab\u0131ka", "sabit", "sabun", "sa\xE7ma", "sade", "sad\u0131k", "safahat", "safdil", "safkan", "sa\u011Fanak", "sa\u011Fduyu", "sa\u011Flam", "saha", "sahiden", "sahne", "sakal", "sak\u0131z", "sakin", "saklama", "saksa\u011Fan", "salamura", "sal\xE7a", "salg\u0131", "sal\u0131n\u0131m", "salk\u0131m", "salon", "saltanat", "sanat\xE7\u0131", "sancak", "sandalye", "saniye", "saplant\u0131", "saps\u0131z", "saray", "sar\u0131\u015F\u0131n", "sark\u0131k", "sarma\u015F\u0131k", "sat\u0131r", "sava\u015F\u0131m", "savunma", "saydam", "sayfa", "sayg\u0131n", "say\u0131sal", "sebep", "se\xE7enek", "se\xE7im", "se\xE7kin", "se\xE7men", "seda", "sedir", "sedye", "sefer", "sehpa", "sekizgen", "selekt\xF6r", "selvi", "semavi", "sembol", "seminer", "senaryo", "sendika", "senkron", "sens\xF6r", "sentez", "sepet", "seramik", "serbest", "serdar", "seremoni", "sergi", "serhat", "serin", "sermaye", "serpu\u015F", "sersem", "ser\xFCven", "servis", "sesli", "seste\u015F", "sevap", "seviye", "seyahat", "seyirci", "sezon", "s\u0131cak", "s\u0131fat", "s\u0131hhi", "s\u0131nanma", "s\u0131n\u0131r", "s\u0131radan", "s\u0131rda\u015F", "s\u0131rma", "s\u0131rt\xFCst\xFC", "s\u0131zg\u0131t", "siftah", "sigorta", "sihirbaz", "silah", "silecek", "silindir", "simetri", "simge", "simit", "sincap", "sindirim", "sinema", "sinirli", "sipari\u015F", "sirke", "siroz", "sistem", "sivilce", "siyasi", "slogan", "soba", "sofra", "so\u011Fuk", "sohbet", "sokak", "solfej", "solunum", "somut", "sonbahar", "sonraki", "sonsuz", "sorunsuz", "sosyete", "soya\u011Fac\u0131", "soyda\u015F", "soygun", "soytar\u0131", "s\xF6\u011F\xFC\u015F", "s\xF6m\xFCrge", "s\xF6n\xFCk", "s\xF6ylem", "s\xF6zc\xFCk", "s\xF6zde", "spatula", "spektrum", "spiker", "spiral", "sponsor", "sporcu", "sprey", "stabil", "stat\xFC", "stok", "stopaj", "strateji", "subay", "sucuk", "su\xE7\xFCst\xFC", "suhulet", "sulama", "sungur", "sunucu", "surat", "susam", "suskun", "s\xFCkse", "s\xFCkut", "s\xFClale", "s\xFCnger", "s\xFCp\xFCrge", "s\xFCrahi", "s\xFCre\xE7", "s\xFCrg\xFCn", "s\xFCr\xFCm", "s\xFCsleme", "s\xFCtanne", "s\xFCtla\xE7", "s\xFCtun", "s\xFCvari", "\u015Fahane", "\u015Fahbaz", "\u015Fahit", "\u015Fahsiyet", "\u015Fak\u0131ma", "\u015Faklaban", "\u015Fakrak", "\u015Famar", "\u015Fampiyon", "\u015Fansl\u0131", "\u015Fantiye", "\u015Fapka", "\u015Fark\u0131c\u0131", "\u015Fartname", "\u015Fa\u015F\u0131rma", "\u015Fa\u015Fk\u0131n", "\u015Fatafat", "\u015Fayet", "\u015Febeke", "\u015Fefkat", "\u015Feftali", "\u015Fehir", "\u015Fehvet", "\u015Feker", "\u015Fekil", "\u015Felale", "\u015Fema", "\u015Femsiye", "\u015Ferbet", "\u015Feref", "\u015Ferit", "\u015F\u0131mar\u0131k", "\u015F\u0131p\u0131d\u0131k", "\u015Fifre", "\u015Fimdi", "\u015Fim\u015Fek", "\u015Fip\u015Fak", "\u015Firin", "\u015Fi\u015Fe", "\u015Fi\u015Firme", "\u015Fofben", "\u015F\xF6hret", "\u015F\xF6len", "\u015F\xFCphe", "tabaka", "tabela", "tabure", "tadilat", "taharet", "tah\u0131l", "tahkim", "tahlil", "tahmin", "tahrifat", "tahsilat", "tahta", "taklit", "takoz", "taksici", "taktik", "takvim", "talebe", "talip", "tamamen", "tamirci", "tampon", "tamtak\u0131r", "tand\u0131r", "tanecik", "tan\u0131t\u0131m", "tanr\u0131", "tansiyon", "tapan", "tap\u0131nak", "taptaze", "tapu", "tarafgir", "tarhana", "tar\u0131m", "tarih", "tarla", "tartak", "tarumar", "tasar\u0131m", "tasdik", "taslak", "tastamam", "ta\u015Feron", "ta\u015F\u0131nmaz", "ta\u015Fra", "tatava", "tatbikat", "tatil", "tatl\u0131", "tavsiye", "tav\u015Fan", "tavuk", "taze", "taziye", "tazminat", "tebe\u015Fir", "tebrik", "tecr\xFCbe", "te\xE7hizat", "tedarik", "tedbir", "tefti\u015F", "te\u011Fet", "te\u011Fmen", "tehdit", "tehlike", "tekd\xFCze", "tekerlek", "tekme", "teknik", "tekrar", "telef", "telsiz", "telve", "temas", "tembel", "temiz", "temkin", "tempo", "temsilci", "tendon", "teneke", "tenha", "tenkit", "tepeg\xF6z", "tepki", "terazi", "terbiye", "tercih", "tereya\u011F\u0131", "terfi", "terim", "terminal", "tersane", "tertip", "tesad\xFCf", "tescil", "tesir", "teslimat", "tespit", "testere", "te\u015Fekk\xFCr", "te\u015Fhir", "te\u015Frif", "te\u015Fvik", "teyze", "tezah\xFCr", "tezgah", "t\u0131bbi", "t\u0131ka\xE7", "t\u0131k\u0131\u015F\u0131k", "t\u0131knaz", "t\u0131ls\u0131m", "t\u0131pk\u0131", "t\u0131ra\u015F", "t\u0131r\u0131\u015Fka", "t\u0131rman\u0131\u015F", "t\u0131rnak", "t\u0131rpan", "t\u0131slama", "ticaret", "tilki", "tiryaki", "titre\u015Fim", "tohum", "tokat", "tolere", "tomar", "tombak", "tomurcuk", "topa\xE7", "toplum", "toprak", "toptan", "toraman", "torpido", "tortu", "tosba\u011Fa", "toynak", "t\xF6ren", "trafik", "trajedi", "tramvay", "transfer", "trib\xFCn", "triko", "tugay", "tu\u011Fla", "tu\u011Frul", "tuhaf", "tulumba", "tun\xE7", "turan", "turkuaz", "turnusol", "tur\u015Fu", "turuncu", "tutanak", "tutkal", "tutsak", "tutum", "tuyu\u011F", "tuzlu", "t\xFCccar", "t\xFCfek", "t\xFCkenmez", "t\xFClbent", "t\xFCmle\xE7", "t\xFCnel", "t\xFCrbin", "t\xFCrev", "t\xFCrk", "t\xFCz\xFCk", "ucube", "ucuz", "u\xE7ak", "u\xE7urtma", "ufuk", "u\u011Frak", "u\u011Fur", "ukala", "ula\u015F\u0131m", "ulema", "ulus", "ulvi", "umursama", "umut", "unutkan", "uslu", "ustaba\u015F\u0131", "ustura", "usul", "utanga\xE7", "uyan\u0131k", "uyar\u0131", "uydu", "uygar", "uygulama", "uykusuz", "uysal", "uyu\u015Fma", "uzant\u0131", "uzay", "uzg\xF6ren", "uzla\u015Fma", "uzman", "uzun", "\xFCcra", "\xFCcret", "\xFC\xE7budak", "\xFC\xE7gen", "\xFC\xE7ka\u011F\u0131t", "\xFC\xE7leme", "\xFCf\xFCr\xFCk", "\xFClke", "\xFCmit", "\xFCniforma", "\xFCnite", "\xFCnlem", "\xFCretken", "\xFCr\xFCn", "\xFCslup", "\xFCstel", "\xFCst\xFCn", "\xFC\u015Fenge\xE7", "\xFC\u015F\xFCme", "\xFCtopya", "\xFCvey", "\xFCzengi", "\xFCzg\xFCn", "\xFCz\xFCm", "vagon", "vaka", "vakfiye", "vak\u0131f", "vakit", "vakum", "vapur", "varil", "varl\u0131k", "varsay\u0131m", "varyemez", "vas\u0131ta", "vasiyet", "vatanda\u015F", "vazife", "vazo", "veciz", "vefa", "vehim", "veliaht", "veresiye", "verimli", "verka\xE7", "vernik", "vertigo", "vesait", "vesika", "vestiyer", "veznedar", "vicdan", "vilayet", "virane", "virg\xFCl", "vi\u015Fne", "vites", "vokal", "volkan", "vurma", "vurucu", "v\xFCcut", "yabanc\u0131", "yabgu", "ya\u011F\u0131\u015F", "ya\u011Fl\u0131", "ya\u011Fmur", "yakamoz", "yak\u0131n", "yakla\u015F\u0131k", "yal\xE7\u0131n", "yal\u0131t\u0131m", "yaman", "yanarda\u011F", "yang\u0131n", "yan\u0131t", "yank\u0131", "yanl\u0131\u015F", "yans\u0131ma", "yapay", "yapboz", "yap\u0131mc\u0131", "yaprak", "yarat\u0131k", "yarbay", "yard\u0131m", "yarg\u0131\xE7", "yar\u0131\xE7ap", "yasemin", "yast\u0131k", "ya\u015Fam", "yatak", "yat\u0131r\u0131m", "yavru", "yaygara", "yay\u0131nc\u0131", "yayla", "yaz\u0131l\u0131m", "yekpare", "yekv\xFCcut", "yelkovan", "yelpaze", "yemek", "yemi\u015F", "yenge\xE7", "yeni\xE7eri", "yeralt\u0131", "yerk\xFCre", "yerle\u015Fke", "yery\xFCz\xFC", "ye\u015Fil", "yetenek", "yetkili", "y\u0131\u011F\u0131nak", "y\u0131kama", "y\u0131lba\u015F\u0131", "y\u0131ld\u0131r\u0131m", "y\u0131lk\u0131", "y\u0131lmaz", "y\u0131rt\u0131c\u0131", "yi\u011Fit", "yo\u011Furt", "yoku\u015F", "yolcu", "yolda\u015F", "yolge\xE7en", "yolkesen", "yol\xFCst\xFC", "yordam", "yorgan", "yorumcu", "yosun", "y\xF6nde\u015F", "y\xF6netim", "y\xF6nl\xFC", "y\xF6ntem", "y\xF6resel", "y\xF6r\xFCnge", "yufka", "yukar\u0131", "yumruk", "yumurta", "yuvarlak", "y\xFCcelme", "y\xFCk\xE7eker", "y\xFCklem", "y\xFCksek", "y\xFCrek", "y\xFCr\xFCtme", "y\xFCzde", "y\xFCzeysel", "y\xFCzge\xE7", "y\xFCz\xFCst\xFC", "y\xFCzy\u0131l", "zab\u0131ta", "zafer", "zahmet", "zambak", "zaptiye", "zarafet", "zaruret", "zeka", "zekice", "zemberek", "zemin", "zencefil", "zeplin", "zeytin", "z\u0131b\u0131n", "z\u0131lg\u0131t", "z\u0131mb\u0131rt\u0131", "z\u0131mpara", "z\u0131pk\u0131n", "zigon", "zihinsel", "zihniyet", "zincir", "zindan", "zirzop", "ziyaret", "ziynet", "zoraki", "zorlu", "zorunlu", "z\xFC\u011F\xFCrt", "z\xFCmre"];
}
});
// node_modules/bip39-mnemonic/wordlist/index.js
var require_wordlist = __commonJS({
"node_modules/bip39-mnemonic/wordlist/index.js"(exports2, module2) {
var lookup = require_lookup();
module2.exports = {
loadWordlist,
detectLanguage
};
function loadWordlist(language) {
switch (language) {
case "chinese_simplified":
return require_chinese_simplified();
case "chinese_traditional":
return require_chinese_traditional();
case "czech":
return require_czech();
case "english":
return require_english();
case "french":
return require_french();
case "italian":
return require_italian();
case "japanese":
return require_japanese();
case "korean":
return require_korean();
case "portuguese":
return require_portuguese();
case "russian":
return require_russian();
case "spanish":
return require_spanish();
case "turkish":
return require_turkish();
}
throw new Error("Unknown language: " + language);
}
function detectLanguage(words) {
let candidate = null;
for (const word of words) {
const languages = lookup[word];
if (!languages) return null;
if (languages.length === 1) return languages[0];
if (!candidate) {
candidate = languages;
continue;
}
const intersect = candidate.filter((l) => languages.includes(l));
if (intersect.length === 1) return intersect[0];
}
return candidate[0];
}
}
});
// node_modules/bip39-mnemonic/index.js
var require_bip39_mnemonic = __commonJS({
"node_modules/bip39-mnemonic/index.js"(exports2, module2) {
var sodium = require_sodium_universal();
var b4a4 = require_b4a();
var assert2 = require_nanoassert();
var { detectLanguage, loadWordlist } = require_wordlist();
module2.exports = {
generateEntropy,
generateMnemonic,
normalizeMnemonic,
validateMnemonic,
mnemonicToEntropy,
mnemonicToSeed,
entropyToMnemonic
};
function generateMnemonic({ entropy = generateEntropy(), language = "english" } = {}) {
const wordlist = loadWordlist(language);
const extended = computeCheckSum(entropy);
const words = [];
for (const index of uint11Reader(extended)) {
words.push(wordlist[index]);
}
const delimiter = language === "japanese" ? "\u3000" : " ";
return words.join(delimiter).trim();
}
function entropyToMnemonic(entropy, { language = "english" } = {}) {
return generateMnemonic({ entropy, language });
}
function mnemonicToEntropy(mnemonic) {
const words = mnemonic.replace(/\u3000/g, " ").trim().split(" ");
const language = detectLanguage(words);
if (!language) {
throw new Error("Language not recognised");
}
if (words.length % 3 !== 0) {
throw new Error("Invalid length");
}
const wordlist = loadWordlist(language);
const indexes2 = [];
for (const word of words) {
const index = wordlist.indexOf(word);
if (index === -1) {
throw new Error("Bad word");
}
indexes2.push(index);
}
const bits = words.length * 11;
const len = bits * 32 / 33 >> 3;
const extended = b4a4.alloc(Math.ceil(bits / 8));
const entropy = extended.subarray(0, len);
uint11Writer(extended, indexes2);
if (!b4a4.equals(extended, computeCheckSum(entropy))) {
throw new Error("Invalid checksum");
}
return entropy;
}
function normalizeMnemonic(mnemonic) {
return mnemonic.trim().replace(/\u3000/, " ").split(/\s+/).map((c4) => c4.toLowerCase()).join(" ");
}
async function mnemonicToSeed(mnemonic, passphrase = "") {
mnemonic = normalizeMnemonic(mnemonic);
if (!validateMnemonic(mnemonic)) {
throw new Error("Invalid mnemonic");
}
const input = b4a4.from(mnemonic);
const salt = b4a4.from("mnemonic" + passphrase);
const output = b4a4.alloc(64);
await sodium.extension_pbkdf2_sha512_async(
output,
input,
salt,
2048,
64
);
return output;
}
function validateMnemonic(mnemonic) {
try {
mnemonicToEntropy(mnemonic);
} catch (e) {
return false;
}
return true;
}
function sha256(data, output = b4a4.alloc(32)) {
sodium.crypto_hash_sha256(output, data);
return output;
}
function computeCheckSum(seed) {
assert2((seed.byteLength & 4) === 0, "seed must be a multiple of 4 bytes");
const len = seed.byteLength;
const cklen = len >> 2;
const total = len + Math.ceil(cklen / 8);
const output = b4a4.alloc(len + 32);
output.set(seed);
const entropy = output.subarray(0, len);
const cksum = output.subarray(len);
sha256(entropy, cksum);
output[total - 1] &= 255 ^ 255 >> cklen;
return output.subarray(0, total);
}
function generateEntropy(length = 32) {
const seed = b4a4.alloc(length);
sodium.randombytes_buf(seed);
return seed;
}
function* uint11Reader(state) {
yield* uintReader(state, 11);
}
function uint11Writer(buf, uints) {
return uintWriter(buf, uints, 11);
}
function* uintReader(buffer, width) {
const MASK = (2 << width - 1) - 1;
let pos = 0;
let value = 0;
while (true) {
const offset = pos >> 3;
if (offset >= buffer.byteLength) {
return value & MASK;
}
const height = width - pos % width;
const leftover = (offset + 1) * 8 - pos;
value += shift(buffer[offset], height - leftover);
pos += Math.min(height, leftover);
if (pos % width) continue;
yield value & MASK;
value = 0;
}
}
function uintWriter(buffer, uints, width) {
let pos = 0;
while (true) {
const offset = pos >> 3;
const i = Math.floor(pos / width);
if (i >= uints.length) break;
if (offset >= buffer.length) {
throw new Error("Failed to encode uints");
}
const rem = 8 - pos % 8;
const height = (i + 1) * width - pos;
const value = shift(uints[i], rem - height);
buffer[offset] += mask(value, rem);
pos += Math.min(rem, height);
}
return buffer;
}
function shift(val, n) {
if (n === 0) return val;
if (n > 0) return val << n;
return val >> -1 * n;
}
function mask(val, bits) {
if (bits < 32) return val & (1 << bits) - 1;
return val % 2 ** bits;
}
}
});
// node_modules/keet-identity-key/lib/crypto.js
var require_crypto = __commonJS({
"node_modules/keet-identity-key/lib/crypto.js"(exports2, module2) {
var sodium = require_sodium_universal();
var b4a4 = require_b4a();
module2.exports = {
sign,
verify,
hash: blake2b
};
function sign(signable, keyPair) {
const signature = b4a4.alloc(sodium.crypto_sign_BYTES);
sodium.crypto_sign_detached(signature, signable, keyPair.secretKey);
return signature;
}
function verify(signable, signature, publicKey) {
return sodium.crypto_sign_verify_detached(signature, signable, publicKey);
}
function blake2b(data, output = b4a4.alloc(32)) {
sodium.crypto_generichash(output, data);
return output;
}
}
});
// node_modules/keet-identity-key/lib/keychain.js
var require_keychain = __commonJS({
"node_modules/keet-identity-key/lib/keychain.js"(exports2, module2) {
var sodium = require_sodium_universal();
var c4 = require_compact_encoding3();
var assert2 = require_nanoassert();
var b4a4 = require_b4a();
var { HMAC } = require_sodium_hmac();
var bip39 = require_bip39_mnemonic();
var { sign } = require_crypto();
var MASTER_CHAIN_CODE = b4a4.from("ed25519 seed");
var MASTER_SYMMETRIC_CODE = b4a4.from("Symmetric key seed");
var HARDENED_OFFSET = 2147483648;
var KeyChain = class _KeyChain {
constructor(seed) {
this.seed = seed;
this._buffer = b4a4.alloc(64);
this.chainKey = this._buffer.subarray(0, 32);
this.chainCode = this._buffer.subarray(32);
this.publicKey = b4a4.alloc(sodium.crypto_sign_PUBLICKEYBYTES);
this.secretKey = b4a4.alloc(sodium.crypto_sign_SECRETKEYBYTES);
this._initialise();
}
static generateMnemonic() {
return bip39.generateMnemonic();
}
static deriveSeed(mnemonic) {
return bip39.mnemonicToSeed(mnemonic);
}
static async from({ mnemonic, seed }, path) {
assert2(mnemonic || seed, "No mnemonic or seed was passed.");
if (!seed) seed = await _KeyChain.deriveSeed(mnemonic);
const key = new _KeyChain(seed);
if (!path) return key;
return key.get(path);
}
getSymmetricKey(path) {
const buffer = b4a4.alloc(64);
const chainKey = buffer.subarray(0, 32);
const key = buffer.subarray(32);
HMAC.sha512(this.seed, MASTER_SYMMETRIC_CODE, buffer);
for (const step of path) {
const label = b4a4.alloc(step.length + 1);
b4a4.write(label, step, 1, "utf8");
HMAC.sha512(label, chainKey, buffer);
}
return key;
}
get isKeychain() {
return true;
}
_initialise() {
HMAC.sha512(this.seed, MASTER_CHAIN_CODE, this._buffer);
sodium.crypto_sign_seed_keypair(this.publicKey, this.secretKey, this.chainKey);
}
clear() {
this.secretKey.fill(0);
this.chainKey.fill(0);
this.chainCode.fill(0);
}
get(path) {
return this.derive(path);
}
sign(signable) {
return sign(signable, this);
}
derive(path) {
const buffer = b4a4.from(this._buffer);
const chainKey = buffer.subarray(0, 32);
const chainCode = buffer.subarray(32);
for (const step of path) {
const index = ensureHardened(step);
HMAC.sha512(encodeDerivationData(chainKey, index), chainCode, buffer);
}
return createKeyPair(chainKey);
}
};
module2.exports = KeyChain;
function createKeyPair(seed) {
if (!seed) throw new Error("No seed provided");
const publicKey = b4a4.alloc(sodium.crypto_sign_PUBLICKEYBYTES);
const secretKey = b4a4.alloc(sodium.crypto_sign_SECRETKEYBYTES);
sodium.crypto_sign_seed_keypair(publicKey, secretKey, seed);
return {
publicKey,
secretKey
};
}
function encodeDerivationData(key, step) {
const state = { buffer: b4a4.alloc(37), start: 0, end: 37 };
c4.uint8.encode(state, 0);
c4.fixed32.encode(state, key);
state.buffer.writeUInt32BE(step, state.start);
state.buffer[33] |= 128;
return state.buffer;
}
function ensureHardened(n) {
if (n >= HARDENED_OFFSET) return n;
return n + HARDENED_OFFSET;
}
}
});
// node_modules/keet-identity-key/lib/encoding.js
var require_encoding = __commonJS({
"node_modules/keet-identity-key/lib/encoding.js"(exports2, module2) {
var c4 = require_compact_encoding3();
var ATTESTED_DEVICE = 0;
var ATTESTED_DATA = 1;
var Epoch = {
preencode(state, e) {
c4.uint64.preencode(state, Math.floor(e / 1e3));
},
encode(state, e) {
c4.uint64.encode(state, Math.floor(e / 1e3));
},
decode(state) {
return c4.uint64.decode(state) * 1e3;
}
};
var AttestedDevice = {
preencode(state, a) {
c4.uint8.preencode(state, ATTESTED_DEVICE);
Epoch.preencode(state, a.epoch);
c4.fixed32.preencode(state, a.identity);
c4.fixed32.preencode(state, a.device);
},
encode(state, a) {
c4.uint8.encode(state, ATTESTED_DEVICE);
Epoch.encode(state, a.epoch);
c4.fixed32.encode(state, a.identity);
c4.fixed32.encode(state, a.device);
},
decode(state) {
throw new Error("Signed data should only be encoded");
}
};
var AttestedData = {
preencode(state, a) {
c4.uint8.preencode(state, ATTESTED_DATA);
Epoch.preencode(state, a.epoch);
c4.fixed32.preencode(state, a.identity);
c4.fixed32.preencode(state, a.data);
},
encode(state, a) {
c4.uint8.encode(state, ATTESTED_DATA);
Epoch.encode(state, a.epoch);
c4.fixed32.encode(state, a.identity);
c4.fixed32.encode(state, a.data);
},
decode(state) {
throw new Error("Signed data should only be encoded");
}
};
var DeviceAttestation = {
preencode(state, a) {
c4.fixed32.preencode(state, a.publicKey);
c4.fixed64.preencode(state, a.signature);
},
encode(state, a) {
c4.fixed32.encode(state, a.publicKey);
c4.fixed64.encode(state, a.signature);
},
decode(state) {
return {
publicKey: c4.fixed32.decode(state),
signature: c4.fixed64.decode(state)
};
}
};
var DeviceAttestationArray = c4.array(DeviceAttestation);
var DataAttestation = {
preencode(state, a) {
c4.fixed64.preencode(state, a.signature);
},
encode(state, a) {
c4.fixed64.encode(state, a.signature);
},
decode(state) {
return {
signature: c4.fixed64.decode(state)
};
}
};
var ProofEncoding = {
preencode(state, proof) {
c4.uint.preencode(state, proof.version);
Epoch.preencode(state, proof.epoch);
c4.fixed32.preencode(state, proof.identity);
DeviceAttestationArray.preencode(state, proof.chain);
let flags = 0;
if (proof.data) flags |= 1;
c4.uint.preencode(state, flags);
if (proof.data) DataAttestation.preencode(state, proof.data);
},
encode(state, proof) {
c4.uint.encode(state, proof.version);
Epoch.encode(state, proof.epoch);
c4.fixed32.encode(state, proof.identity);
DeviceAttestationArray.encode(state, proof.chain);
let flags = 0;
if (proof.data) flags |= 1;
c4.uint.encode(state, flags);
if (proof.data) DataAttestation.encode(state, proof.data);
},
decode(state) {
const version3 = c4.uint.decode(state);
if (version3 === 0) {
return {
version: 0,
epoch: 0,
identity: null,
chain: [],
data: null
};
}
const epoch = Epoch.decode(state);
const identity = c4.fixed32.decode(state);
const chain = DeviceAttestationArray.decode(state);
const flags = c4.uint.decode(state);
const data = flags & 1 ? DataAttestation.decode(state) : null;
return {
version: version3,
epoch,
identity,
chain,
data
};
}
};
var ReceiptEncoding = {
preencode(state, receipt) {
Epoch.preencode(state, receipt.epoch);
},
encode(state, receipt) {
Epoch.encode(state, receipt.epoch);
},
decode(state) {
return {
epoch: Epoch.decode(state)
};
}
};
module2.exports = {
ATTESTED_DEVICE,
ATTESTED_DATA,
AttestedDevice,
AttestedData,
ProofEncoding,
ReceiptEncoding
};
}
});
// node_modules/keet-identity-key/index.js
var require_keet_identity_key = __commonJS({
"node_modules/keet-identity-key/index.js"(exports2, module2) {
var c4 = require_compact_encoding3();
var b4a4 = require_b4a();
var KeyChain = require_keychain();
var { sign, verify, hash } = require_crypto();
var {
ProofEncoding,
AttestedData,
AttestedDevice,
ReceiptEncoding
} = require_encoding();
var PROOF_VERSION = 1;
var KEET_TYPE = 5338;
var NS_PROFILE_DISC_ENC = hash(b4a4.from("profile discovery"));
module2.exports = class IdentityKey {
constructor(keyChain) {
this.keyChain = keyChain;
this.identityKeyPair = this.keyChain.get(identityKeyPath(0));
this.profileDiscoveryKeyPair = this.keyChain.get(discoveryCorePath(0));
}
static generateMnemonic() {
return KeyChain.generateMnemonic();
}
static deriveSeed(mnemonic) {
return KeyChain.deriveSeed(mnemonic);
}
get identityPublicKey() {
return this.identityKeyPair.publicKey;
}
get profileDiscoveryPublicKey() {
return this.profileDiscoveryKeyPair.publicKey;
}
getProfileDiscoveryEncryptionKey() {
return this.keyChain.getSymmetricKey(encryptionKeyPath(NS_PROFILE_DISC_ENC));
}
getEncryptionKey(profileKey) {
return this.keyChain.getSymmetricKey(encryptionKeyPath(profileKey));
}
bootstrap(device) {
return IdentityKey.bootstrap({ identity: this.identityKeyPair }, device);
}
clear() {
this.keyChain.clear();
this.identityKeyPair.secretKey.fill(0);
this.profileDiscoveryKeyPair.secretKey.fill(0);
}
static async bootstrap({ identity, seed, mnemonic }, device) {
if (!identity) {
const identityPath = identityKeyPath(0);
identity = await KeyChain.from({ seed, mnemonic }, identityPath);
}
const proof = {
version: PROOF_VERSION,
epoch: Date.now(),
identity: identity.publicKey,
chain: []
};
return IdentityKey.attestDevice(device, identity, proof);
}
static attestDevice(publicKey, parent, proof) {
if (!proof) return IdentityKey.bootstrap({ identity: parent }, publicKey);
if (b4a4.isBuffer(proof)) {
proof = c4.decode(ProofEncoding, proof);
}
if (proof.version === 0) {
throw new Error("Version 0 proofs are not supported");
}
const signable = c4.encode(AttestedDevice, {
epoch: proof.epoch,
identity: proof.identity,
device: publicKey
});
const signature = sign(signable, parent);
proof.chain.push({ publicKey, signature });
return c4.encode(ProofEncoding, proof);
}
static attestData(attestedData, keyPair, proof) {
if (attestedData === null) throw new Error("Data is not attestable");
if (b4a4.isBuffer(proof)) {
proof = c4.decode(ProofEncoding, proof);
}
if (proof && proof.version === 0) {
throw new Error("Version 0 proofs are not supported");
}
if (!proof) {
proof = {
version: PROOF_VERSION,
epoch: Date.now(),
identity: keyPair.publicKey,
chain: []
};
}
const signable = c4.encode(AttestedData, {
epoch: proof.epoch,
identity: proof.identity,
data: hash(attestedData)
});
proof.data = { signature: sign(signable, keyPair) };
return c4.encode(ProofEncoding, proof);
}
static async from({ seed, mnemonic }) {
const keyChain = await KeyChain.from({ seed, mnemonic });
return new IdentityKey(keyChain);
}
static verify(proof, attestedData, opts = {}) {
if (b4a4.isBuffer(proof)) {
proof = c4.decode(ProofEncoding, proof);
}
if (!validateProof(proof, attestedData, opts)) {
return null;
}
const { epoch, identity, chain } = proof;
const candidate = getLastKey(chain) || identity;
if (opts.expectedDevice) {
if (!b4a4.equals(candidate, opts.expectedDevice)) return null;
}
let parent = identity;
for (let i = 0; i < chain.length; i++) {
const { publicKey, signature } = chain[i];
const signable = c4.encode(AttestedDevice, {
epoch,
identity,
device: publicKey
});
if (!verify(signable, signature, parent)) {
return null;
}
parent = publicKey;
}
if (proof.data) {
const signable = c4.encode(AttestedData, {
epoch,
identity,
data: hash(attestedData)
});
if (!verify(signable, proof.data.signature, parent)) {
return null;
}
}
const receipt = c4.encode(ReceiptEncoding, { epoch });
return {
receipt,
identityPublicKey: identity,
devicePublicKey: candidate
};
}
};
function validateProof(proof, attestedData, opts = {}) {
if (proof.version === 0) return false;
if (proof.version > PROOF_VERSION) return false;
if (opts.receipt) {
const { epoch } = c4.decode(ReceiptEncoding, opts.receipt);
if (proof.epoch < epoch) return false;
}
if (opts.expectedIdentity) {
if (!b4a4.equals(proof.identity, opts.expectedIdentity)) return false;
}
return validateAttestedData(proof.data, attestedData);
}
function validateAttestedData(data, attestedData) {
if (!data && attestedData) return false;
return true;
}
function getLastKey(chain) {
if (!chain.length) return null;
const last = chain[chain.length - 1];
return last.publicKey;
}
function keyPath(accountIndex, index) {
const purpose = 48;
const role = 0;
return [purpose, KEET_TYPE, role, accountIndex, index];
}
function identityKeyPath(accountIndex) {
return keyPath(accountIndex, 0);
}
function discoveryCorePath(accountIndex) {
return keyPath(accountIndex, 1);
}
function symmetricPath(...path) {
const purpose = "SLIP-0021";
const namespace = "keet-identity-key";
return [purpose, namespace, ...path];
}
function encryptionKeyPath(profileKey) {
return symmetricPath(b4a4.toString(profileKey, "hex"), "encryption key");
}
}
});
// backend/sheets-import.mjs
var sheets_import_exports = {};
__export(sheets_import_exports, {
default: () => sheets_import_default
});
module.exports = __toCommonJS(sheets_import_exports);
// node_modules/schema-sheets/index.mjs
var import_hyperdb = __toESM(require_hyperdb(), 1);
var import_autobase = __toESM(require_autobase2(), 1);
var import_hypercore_crypto = __toESM(require_hypercore_crypto(), 1);
var import_z32 = __toESM(require_z32(), 1);
// node_modules/@jmespath-community/jmespath/dist/index.mjs
var isObject = (obj) => {
return obj !== null && Object.prototype.toString.call(obj) === "[object Object]";
};
var strictDeepEqual = (first, second) => {
if (first === second) {
return true;
}
if (typeof first !== typeof second) {
return false;
}
if (Array.isArray(first) && Array.isArray(second)) {
if (first.length !== second.length) {
return false;
}
for (let i = 0; i < first.length; i += 1) {
if (!strictDeepEqual(first[i], second[i])) {
return false;
}
}
return true;
}
if (isObject(first) && isObject(second)) {
const firstEntries = Object.entries(first);
const secondKeys = new Set(Object.keys(second));
if (firstEntries.length !== secondKeys.size) {
return false;
}
for (const [key, value] of firstEntries) {
if (!strictDeepEqual(value, second[key])) {
return false;
}
secondKeys.delete(key);
}
return secondKeys.size === 0;
}
return false;
};
var isFalse = (obj) => {
if (obj === null || obj === void 0 || obj === false) {
return true;
}
if (typeof obj === "string") {
return obj === "";
}
if (typeof obj === "object") {
if (Array.isArray(obj)) {
return obj.length === 0;
}
if (obj === null) {
return true;
}
return Object.keys(obj).length === 0;
}
return false;
};
var isAlpha = (ch) => {
return ch >= "a" && ch <= "z" || ch >= "A" && ch <= "Z" || ch === "_";
};
var isNum = (ch) => {
return ch >= "0" && ch <= "9" || ch === "-";
};
var isAlphaNum = (ch) => {
return ch >= "a" && ch <= "z" || ch >= "A" && ch <= "Z" || ch >= "0" && ch <= "9" || ch === "_";
};
var ensureInteger = (value) => {
if (!(typeof value === "number") || Math.floor(value) !== value) {
throw new Error("invalid-value: expecting an integer.");
}
return value;
};
var ensurePositiveInteger = (value) => {
if (!(typeof value === "number") || value < 0 || Math.floor(value) !== value) {
throw new Error("invalid-value: expecting a non-negative integer.");
}
return value;
};
var ensureNumbers = (...operands) => {
for (let i = 0; i < operands.length; i++) {
if (operands[i] === null || operands[i] === void 0) {
throw new Error("not-a-number: undefined");
}
if (typeof operands[i] !== "number") {
throw new Error("not-a-number");
}
}
};
var notZero = (n) => {
n = +n;
if (!n) {
throw new Error("not-a-number: divide by zero");
}
return n;
};
var add = (left, right) => {
ensureNumbers(left, right);
const result = left + right;
return result;
};
var sub = (left, right) => {
ensureNumbers(left, right);
const result = left - right;
return result;
};
var mul = (left, right) => {
ensureNumbers(left, right);
const result = left * right;
return result;
};
var divide = (left, right) => {
ensureNumbers(left, right);
const result = left / notZero(right);
return result;
};
var div = (left, right) => {
ensureNumbers(left, right);
const result = Math.floor(left / notZero(right));
return result;
};
var mod = (left, right) => {
ensureNumbers(left, right);
const result = left % right;
return result;
};
var findFirst = (subject, sub2, start, end) => {
if (!subject || !sub2) {
return null;
}
start = Math.max(ensureInteger(start = start || 0), 0);
end = Math.min(ensureInteger(end = end || subject.length), subject.length);
const offset = subject.slice(start, end).indexOf(sub2);
return offset === -1 ? null : offset + start;
};
var findLast = (subject, sub2, start, end) => {
if (!subject || !sub2) {
return null;
}
start = Math.max(ensureInteger(start = start || 0), 0);
end = Math.min(ensureInteger(end = end || subject.length), subject.length);
const offset = subject.slice(start, end).lastIndexOf(sub2);
const result = offset === -1 ? null : offset + start;
return result;
};
var lower = (subject) => subject.toLowerCase();
var ensurePadFuncParams = (name, width, padding) => {
padding = padding || " ";
if (padding.length > 1) {
throw new Error(`invalid value, ${name} expects its 'pad' parameter to be a valid string with a single codepoint`);
}
ensurePositiveInteger(width);
return padding;
};
var padLeft = (subject, width, padding) => {
padding = ensurePadFuncParams("pad_left", width, padding);
return subject && subject.padStart(width, padding) || "";
};
var padRight = (subject, width, padding) => {
padding = ensurePadFuncParams("pad_right", width, padding);
return subject && subject.padEnd(width, padding) || "";
};
var replace = (subject, string, by, count) => {
if (count === 0) {
return subject;
}
if (!count) {
return subject.split(string).join(by);
}
ensurePositiveInteger(count);
[...Array(count).keys()].map(() => subject = subject.replace(string, by));
return subject;
};
var split = (subject, search2, count) => {
if (subject.length == 0 && search2.length === 0) {
return [];
}
if (count === null || count === void 0) {
return subject.split(search2);
}
ensurePositiveInteger(count);
if (count === 0) {
return [subject];
}
const split2 = subject.split(search2);
return [...split2.slice(0, count), split2.slice(count).join(search2)];
};
var trim = (subject, chars) => {
return trimLeft(trimRight(subject, chars), chars);
};
var trimLeft = (subject, chars) => {
return trimImpl(subject, (list) => new RegExp(`^[${list}]*(.*?)`), chars);
};
var trimRight = (subject, chars) => {
return trimImpl(subject, (list) => new RegExp(`(.*?)[${list}]*$`), chars);
};
var trimImpl = (subject, regExper, chars) => {
const pattern = chars ? chars.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&") : "\\s\x85";
return subject.replace(regExper(pattern), "$1");
};
var upper = (subject) => subject.toUpperCase();
var basicTokens = {
"(": "Lparen",
")": "Rparen",
"*": "Star",
",": "Comma",
".": "Dot",
":": "Colon",
"@": "Current",
"]": "Rbracket",
"{": "Lbrace",
"}": "Rbrace",
"+": "Plus",
"%": "Modulo",
"?": "Question",
"\u2212": "Minus",
"\xD7": "Multiply",
"\xF7": "Divide"
/* TOK_DIVIDE */
};
var operatorStartToken = {
"!": true,
"<": true,
"=": true,
">": true,
"&": true,
"|": true,
"/": true
};
var skipChars = {
" ": true,
"\n": true,
"\r": true,
" ": true
};
var StreamLexer = class {
_current = 0;
_enable_legacy_literals = false;
tokenize(stream, options) {
const tokens = [];
this._current = 0;
this._enable_legacy_literals = options?.enable_legacy_literals || false;
let start;
let identifier;
let token;
while (this._current < stream.length) {
if (isAlpha(stream[this._current])) {
start = this._current;
identifier = this.consumeUnquotedIdentifier(stream);
tokens.push({
start,
type: "UnquotedIdentifier",
value: identifier
});
} else if (basicTokens[stream[this._current]] !== void 0) {
tokens.push({
start: this._current,
type: basicTokens[stream[this._current]],
value: stream[this._current]
});
this._current += 1;
} else if (stream[this._current] === "$") {
start = this._current;
if (this._current + 1 < stream.length && isAlpha(stream[this._current + 1])) {
this._current += 1;
identifier = this.consumeUnquotedIdentifier(stream);
tokens.push({
start,
type: "Variable",
value: identifier
});
} else {
tokens.push({
start,
type: "Root",
value: stream[this._current]
});
this._current += 1;
}
} else if (stream[this._current] === "-") {
if (this._current + 1 < stream.length && isNum(stream[this._current + 1])) {
const token2 = this.consumeNumber(stream);
token2 && tokens.push(token2);
} else {
const token2 = {
start: this._current,
type: "Minus",
value: "-"
};
tokens.push(token2);
this._current += 1;
}
} else if (isNum(stream[this._current])) {
token = this.consumeNumber(stream);
tokens.push(token);
} else if (stream[this._current] === "[") {
token = this.consumeLBracket(stream);
tokens.push(token);
} else if (stream[this._current] === '"') {
start = this._current;
identifier = this.consumeQuotedIdentifier(stream);
tokens.push({
start,
type: "QuotedIdentifier",
value: identifier
});
} else if (stream[this._current] === `'`) {
start = this._current;
identifier = this.consumeRawStringLiteral(stream);
tokens.push({
start,
type: "Literal",
value: identifier
});
} else if (stream[this._current] === "`") {
start = this._current;
const literal = this.consumeLiteral(stream);
tokens.push({
start,
type: "Literal",
value: literal
});
} else if (operatorStartToken[stream[this._current]] !== void 0) {
token = this.consumeOperator(stream);
token && tokens.push(token);
} else if (skipChars[stream[this._current]] !== void 0) {
this._current += 1;
} else {
const error = new Error(`Syntax error: unknown character: ${stream[this._current]}`);
error.name = "LexerError";
throw error;
}
}
return tokens;
}
consumeUnquotedIdentifier(stream) {
const start = this._current;
this._current += 1;
while (this._current < stream.length && isAlphaNum(stream[this._current])) {
this._current += 1;
}
return stream.slice(start, this._current);
}
consumeQuotedIdentifier(stream) {
const start = this._current;
this._current += 1;
const maxLength = stream.length;
while (stream[this._current] !== '"' && this._current < maxLength) {
let current = this._current;
if (stream[current] === "\\" && (stream[current + 1] === "\\" || stream[current + 1] === '"')) {
current += 2;
} else {
current += 1;
}
this._current = current;
}
this._current += 1;
const [value, ok] = this.parseJSON(stream.slice(start, this._current));
if (!ok) {
const error = new Error(`syntax: unexpected end of JSON input`);
error.name = "LexerError";
throw error;
}
return value;
}
consumeRawStringLiteral(stream) {
const start = this._current;
this._current += 1;
const maxLength = stream.length;
while (stream[this._current] !== `'` && this._current < maxLength) {
let current = this._current;
if (stream[current] === "\\" && (stream[current + 1] === "\\" || stream[current + 1] === `'`)) {
current += 2;
} else {
current += 1;
}
this._current = current;
}
this._current += 1;
const literal = stream.slice(start + 1, this._current - 1);
return replace(replace(literal, `\\\\`, `\\`), `\\'`, `'`);
}
consumeNumber(stream) {
const start = this._current;
this._current += 1;
const maxLength = stream.length;
while (isNum(stream[this._current]) && this._current < maxLength) {
this._current += 1;
}
const value = parseInt(stream.slice(start, this._current), 10);
return {
start,
value,
type: "Number"
/* TOK_NUMBER */
};
}
consumeLBracket(stream) {
const start = this._current;
this._current += 1;
if (stream[this._current] === "?") {
this._current += 1;
return { start, type: "Filter", value: "[?" };
}
if (stream[this._current] === "]") {
this._current += 1;
return { start, type: "Flatten", value: "[]" };
}
return { start, type: "Lbracket", value: "[" };
}
consumeOrElse(stream, peek, token, orElse) {
const start = this._current;
this._current += 1;
if (this._current < stream.length && stream[this._current] === peek) {
this._current += 1;
return {
start,
type: orElse,
value: stream.slice(start, this._current)
};
}
return { start, type: token, value: stream[start] };
}
consumeOperator(stream) {
const start = this._current;
const startingChar = stream[start];
switch (startingChar) {
case "!":
return this.consumeOrElse(
stream,
"=",
"Not",
"NE"
/* TOK_NE */
);
case "<":
return this.consumeOrElse(
stream,
"=",
"LT",
"LTE"
/* TOK_LTE */
);
case ">":
return this.consumeOrElse(
stream,
"=",
"GT",
"GTE"
/* TOK_GTE */
);
case "=":
return this.consumeOrElse(
stream,
"=",
"Assign",
"EQ"
/* TOK_EQ */
);
case "&":
return this.consumeOrElse(
stream,
"&",
"Expref",
"And"
/* TOK_AND */
);
case "|":
return this.consumeOrElse(
stream,
"|",
"Pipe",
"Or"
/* TOK_OR */
);
case "/":
return this.consumeOrElse(
stream,
"/",
"Divide",
"Div"
/* TOK_DIV */
);
}
}
consumeLiteral(stream) {
this._current += 1;
const start = this._current;
const maxLength = stream.length;
while (stream[this._current] !== "`" && this._current < maxLength) {
let current = this._current;
if (stream[current] === "\\" && (stream[current + 1] === "\\" || stream[current + 1] === "`")) {
current += 2;
} else {
current += 1;
}
this._current = current;
}
let literalString = stream.slice(start, this._current).trimStart();
literalString = literalString.replace("\\`", "`");
let literal = null;
let ok = false;
if (this.looksLikeJSON(literalString)) {
[literal, ok] = this.parseJSON(literalString);
}
if (!ok && this._enable_legacy_literals) {
[literal, ok] = this.parseJSON(`"${literalString}"`);
}
if (!ok) {
const error = new Error(
`Syntax error: unexpected end of JSON input or invalid format for a JSON literal: ${stream[this._current]}`
);
error.name = "LexerError";
throw error;
}
this._current += 1;
return literal;
}
looksLikeJSON(literalString) {
const startingChars = '[{"';
const jsonLiterals = ["true", "false", "null"];
const numberLooking = "-0123456789";
if (literalString === "") {
return false;
}
if (startingChars.includes(literalString[0])) {
return true;
}
if (jsonLiterals.includes(literalString)) {
return true;
}
if (numberLooking.includes(literalString[0])) {
const [_, ok] = this.parseJSON(literalString);
return ok;
}
return false;
}
parseJSON(text) {
try {
const json = JSON.parse(text);
return [json, true];
} catch {
return [null, false];
}
}
};
var Lexer = new StreamLexer();
var Lexer_default = Lexer;
var bindingPower = {
[
"EOF"
/* TOK_EOF */
]: 0,
[
"Variable"
/* TOK_VARIABLE */
]: 0,
[
"UnquotedIdentifier"
/* TOK_UNQUOTEDIDENTIFIER */
]: 0,
[
"QuotedIdentifier"
/* TOK_QUOTEDIDENTIFIER */
]: 0,
[
"Rbracket"
/* TOK_RBRACKET */
]: 0,
[
"Rparen"
/* TOK_RPAREN */
]: 0,
[
"Comma"
/* TOK_COMMA */
]: 0,
[
"Rbrace"
/* TOK_RBRACE */
]: 0,
[
"Number"
/* TOK_NUMBER */
]: 0,
[
"Current"
/* TOK_CURRENT */
]: 0,
[
"Expref"
/* TOK_EXPREF */
]: 0,
[
"Root"
/* TOK_ROOT */
]: 0,
[
"Assign"
/* TOK_ASSIGN */
]: 1,
[
"Pipe"
/* TOK_PIPE */
]: 1,
[
"Question"
/* TOK_QUESTION */
]: 2,
[
"Or"
/* TOK_OR */
]: 3,
[
"And"
/* TOK_AND */
]: 4,
[
"EQ"
/* TOK_EQ */
]: 5,
[
"GT"
/* TOK_GT */
]: 5,
[
"LT"
/* TOK_LT */
]: 5,
[
"GTE"
/* TOK_GTE */
]: 5,
[
"LTE"
/* TOK_LTE */
]: 5,
[
"NE"
/* TOK_NE */
]: 5,
[
"Minus"
/* TOK_MINUS */
]: 6,
[
"Plus"
/* TOK_PLUS */
]: 6,
[
"Div"
/* TOK_DIV */
]: 7,
[
"Divide"
/* TOK_DIVIDE */
]: 7,
[
"Modulo"
/* TOK_MODULO */
]: 7,
[
"Multiply"
/* TOK_MULTIPLY */
]: 7,
[
"Flatten"
/* TOK_FLATTEN */
]: 9,
[
"Star"
/* TOK_STAR */
]: 20,
[
"Filter"
/* TOK_FILTER */
]: 21,
[
"Dot"
/* TOK_DOT */
]: 40,
[
"Not"
/* TOK_NOT */
]: 45,
[
"Lbrace"
/* TOK_LBRACE */
]: 50,
[
"Lbracket"
/* TOK_LBRACKET */
]: 55,
[
"Lparen"
/* TOK_LPAREN */
]: 60
};
var TokenParser = class _TokenParser {
index = 0;
tokens = [];
parse(expression, options) {
this.loadTokens(expression, options || { enable_legacy_literals: false });
this.index = 0;
const ast = this.expression(0);
if (this.lookahead(0) !== "EOF") {
const token = this.lookaheadToken(0);
this.errorToken(token, `Syntax error: unexpected token type: ${token.type}, value: ${token.value}`);
}
return ast;
}
loadTokens(expression, options) {
this.tokens = Lexer_default.tokenize(expression, options);
this.tokens.push({ type: "EOF", value: "", start: expression.length });
}
expression(rbp) {
const leftToken = this.lookaheadToken(0);
this.advance();
let left = this.nud(leftToken);
let currentTokenType = this.lookahead(0);
while (rbp < bindingPower[currentTokenType]) {
this.advance();
left = this.led(currentTokenType, left);
currentTokenType = this.lookahead(0);
}
return left;
}
lookahead(offset) {
return this.tokens[this.index + offset].type;
}
lookaheadToken(offset) {
return this.tokens[this.index + offset];
}
advance() {
this.index += 1;
}
nud(token) {
switch (token.type) {
case "Variable":
return { type: "Variable", name: token.value };
case "Literal":
return { type: "Literal", value: token.value };
case "UnquotedIdentifier": {
if (_TokenParser.isKeyword(token, "let") && this.lookahead(0) === "Variable") {
return this.parseLetExpression();
} else {
return { type: "Field", name: token.value };
}
}
case "QuotedIdentifier":
if (this.lookahead(0) === "Lparen") {
throw new Error("Syntax error: quoted identifier not allowed for function names.");
} else {
return { type: "Field", name: token.value };
}
case "Not": {
const child = this.expression(bindingPower.Not);
return { type: "NotExpression", child };
}
case "Minus": {
const child = this.expression(bindingPower.Minus);
return {
type: "Unary",
operator: token.type,
operand: child
};
}
case "Plus": {
const child = this.expression(bindingPower.Plus);
return {
type: "Unary",
operator: token.type,
operand: child
};
}
case "Star": {
const left = { type: "Identity" };
return { type: "ValueProjection", left, right: this.parseProjectionRHS(bindingPower.Star) };
}
case "Filter":
return this.led(token.type, { type: "Identity" });
case "Lbrace":
return this.parseMultiselectHash();
case "Flatten": {
const left = {
type: "Flatten",
child: { type: "Identity" }
};
const right = this.parseProjectionRHS(bindingPower.Flatten);
return { type: "Projection", left, right };
}
case "Lbracket": {
if (this.lookahead(0) === "Number" || this.lookahead(0) === "Colon") {
const right = this.parseIndexExpression();
return this.projectIfSlice({ type: "Identity" }, right);
}
if (this.lookahead(0) === "Star" && this.lookahead(1) === "Rbracket") {
this.advance();
this.advance();
const right = this.parseProjectionRHS(bindingPower.Star);
return {
left: { type: "Identity" },
right,
type: "Projection"
};
}
return this.parseMultiselectList();
}
case "Current":
return {
type: "Current"
/* TOK_CURRENT */
};
case "Root":
return {
type: "Root"
/* TOK_ROOT */
};
case "Expref": {
const child = this.expression(bindingPower.Expref);
return { type: "ExpressionReference", child };
}
case "Lparen": {
const expression = this.expression(0);
this.match(
"Rparen"
/* TOK_RPAREN */
);
return expression;
}
default:
this.errorToken(token);
}
}
led(tokenName, left) {
switch (tokenName) {
case "Question": {
const trueExpr = this.expression(0);
this.match(
"Colon"
/* TOK_COLON */
);
const falseExpr = this.expression(0);
return {
type: "Ternary",
condition: left,
trueExpr,
falseExpr
};
}
case "Dot": {
const rbp = bindingPower.Dot;
if (this.lookahead(0) !== "Star") {
const right2 = this.parseDotRHS(rbp);
return { type: "Subexpression", left, right: right2 };
}
this.advance();
const right = this.parseProjectionRHS(rbp);
return { type: "ValueProjection", left, right };
}
case "Pipe": {
const right = this.expression(bindingPower.Pipe);
return { type: "Pipe", left, right };
}
case "Or": {
const right = this.expression(bindingPower.Or);
return { type: "OrExpression", left, right };
}
case "And": {
const right = this.expression(bindingPower.And);
return { type: "AndExpression", left, right };
}
case "Lparen": {
if (left.type !== "Field") {
throw new Error("Syntax error: expected a Field node");
}
const name = left.name;
const args = this.parseCommaSeparatedExpressionsUntilToken(
"Rparen"
/* TOK_RPAREN */
);
const node = { name, type: "Function", children: args };
return node;
}
case "Filter": {
const condition = this.expression(0);
this.match(
"Rbracket"
/* TOK_RBRACKET */
);
const right = this.lookahead(0) === "Flatten" ? { type: "Identity" } : this.parseProjectionRHS(bindingPower.Filter);
return { type: "FilterProjection", left, right, condition };
}
case "Flatten": {
const leftNode = { type: "Flatten", child: left };
const right = this.parseProjectionRHS(bindingPower.Flatten);
return { type: "Projection", left: leftNode, right };
}
case "Assign": {
const leftNode = left;
const right = this.expression(0);
return {
type: "Binding",
variable: leftNode.name,
reference: right
};
}
case "EQ":
case "NE":
case "GT":
case "GTE":
case "LT":
case "LTE":
return this.parseComparator(left, tokenName);
case "Plus":
case "Minus":
case "Multiply":
case "Star":
case "Divide":
case "Modulo":
case "Div":
return this.parseArithmetic(left, tokenName);
case "Lbracket": {
const token = this.lookaheadToken(0);
if (token.type === "Number" || token.type === "Colon") {
const right2 = this.parseIndexExpression();
return this.projectIfSlice(left, right2);
}
this.match(
"Star"
/* TOK_STAR */
);
this.match(
"Rbracket"
/* TOK_RBRACKET */
);
const right = this.parseProjectionRHS(bindingPower.Star);
return { type: "Projection", left, right };
}
default:
return this.errorToken(this.lookaheadToken(0));
}
}
static isKeyword(token, keyword) {
return token.type === "UnquotedIdentifier" && token.value === keyword;
}
match(tokenType) {
if (this.lookahead(0) === tokenType) {
this.advance();
return;
} else {
const token = this.lookaheadToken(0);
this.errorToken(token, `Syntax error: expected ${tokenType}, got: ${token.type}`);
}
}
errorToken(token, message = "") {
const error = new Error(message || `Syntax error: invalid token (${token.type}): "${token.value}"`);
error.name = "ParserError";
throw error;
}
parseIndexExpression() {
if (this.lookahead(0) === "Colon" || this.lookahead(1) === "Colon") {
return this.parseSliceExpression();
}
const value = Number(this.lookaheadToken(0).value);
this.advance();
this.match(
"Rbracket"
/* TOK_RBRACKET */
);
return { type: "Index", value };
}
projectIfSlice(left, right) {
const indexExpr = {
type: "IndexExpression",
left,
right
};
if (right.type === "Slice") {
return {
left: indexExpr,
right: this.parseProjectionRHS(bindingPower.Star),
type: "Projection"
};
}
return indexExpr;
}
parseSliceExpression() {
const parts = [null, null, null];
let index = 0;
let current = this.lookaheadToken(0);
while (current.type != "Rbracket" && index < 3) {
if (current.type === "Colon") {
index++;
if (index === 3) {
this.errorToken(this.lookaheadToken(0), "Syntax error, too many colons in slice expression");
}
this.advance();
} else if (current.type === "Number") {
const part = this.lookaheadToken(0).value;
parts[index] = part;
this.advance();
} else {
const next = this.lookaheadToken(0);
this.errorToken(next, `Syntax error, unexpected token: ${next.value}(${next.type})`);
}
current = this.lookaheadToken(0);
}
this.match(
"Rbracket"
/* TOK_RBRACKET */
);
const [start, stop, step] = parts;
return { type: "Slice", start, stop, step };
}
parseLetExpression() {
const separated = this.parseCommaSeparatedExpressionsUntilKeyword("in");
const expression = this.expression(0);
const bindings = separated.map((binding) => binding);
return {
type: "LetExpression",
bindings,
expression
};
}
parseCommaSeparatedExpressionsUntilKeyword(keyword) {
return this.parseCommaSeparatedExpressionsUntil(
() => {
return _TokenParser.isKeyword(this.lookaheadToken(0), keyword);
},
() => {
this.advance();
}
);
}
parseCommaSeparatedExpressionsUntilToken(token) {
return this.parseCommaSeparatedExpressionsUntil(
() => {
return this.lookahead(0) === token;
},
() => {
return this.match(token);
}
);
}
parseCommaSeparatedExpressionsUntil(isEndToken, matchEndToken) {
const args = [];
let expression;
while (!isEndToken()) {
expression = this.expression(0);
if (this.lookahead(0) === "Comma") {
this.match(
"Comma"
/* TOK_COMMA */
);
}
args.push(expression);
}
matchEndToken();
return args;
}
parseComparator(left, comparator) {
const right = this.expression(bindingPower[comparator]);
return { type: "Comparator", name: comparator, left, right };
}
parseArithmetic(left, operator) {
const right = this.expression(bindingPower[operator]);
return { type: "Arithmetic", operator, left, right };
}
parseDotRHS(rbp) {
const lookahead = this.lookahead(0);
const exprTokens = [
"UnquotedIdentifier",
"QuotedIdentifier",
"Star"
/* TOK_STAR */
];
if (exprTokens.includes(lookahead)) {
return this.expression(rbp);
}
if (lookahead === "Lbracket") {
this.match(
"Lbracket"
/* TOK_LBRACKET */
);
return this.parseMultiselectList();
}
if (lookahead === "Lbrace") {
this.match(
"Lbrace"
/* TOK_LBRACE */
);
return this.parseMultiselectHash();
}
const token = this.lookaheadToken(0);
this.errorToken(token, `Syntax error, unexpected token: ${token.value}(${token.type})`);
}
parseProjectionRHS(rbp) {
if (bindingPower[this.lookahead(0)] < 10) {
return { type: "Identity" };
}
if (this.lookahead(0) === "Lbracket") {
return this.expression(rbp);
}
if (this.lookahead(0) === "Filter") {
return this.expression(rbp);
}
if (this.lookahead(0) === "Dot") {
this.match(
"Dot"
/* TOK_DOT */
);
return this.parseDotRHS(rbp);
}
const token = this.lookaheadToken(0);
this.errorToken(token, `Syntax error, unexpected token: ${token.value}(${token.type})`);
}
parseMultiselectList() {
const expressions = [];
while (this.lookahead(0) !== "Rbracket") {
const expression = this.expression(0);
expressions.push(expression);
if (this.lookahead(0) === "Comma") {
this.match(
"Comma"
/* TOK_COMMA */
);
if (this.lookahead(0) === "Rbracket") {
throw new Error("Syntax error: unexpected token Rbracket");
}
}
}
this.match(
"Rbracket"
/* TOK_RBRACKET */
);
return { type: "MultiSelectList", children: expressions };
}
parseMultiselectHash() {
const pairs = [];
const identifierTypes = [
"UnquotedIdentifier",
"QuotedIdentifier"
/* TOK_QUOTEDIDENTIFIER */
];
let keyToken;
let keyName;
let value;
for (; ; ) {
keyToken = this.lookaheadToken(0);
if (!identifierTypes.includes(keyToken.type)) {
throw new Error(`Syntax error: expecting an identifier token, got: ${keyToken.type}`);
}
keyName = keyToken.value;
this.advance();
this.match(
"Colon"
/* TOK_COLON */
);
value = this.expression(0);
pairs.push({ value, type: "KeyValuePair", name: keyName });
if (this.lookahead(0) === "Comma") {
this.match(
"Comma"
/* TOK_COMMA */
);
} else if (this.lookahead(0) === "Rbrace") {
this.match(
"Rbrace"
/* TOK_RBRACE */
);
break;
}
}
return { type: "MultiSelectHash", children: pairs };
}
};
var Parser = new TokenParser();
var Parser_default = Parser;
var Text = class _Text {
_text;
constructor(text) {
this._text = text;
}
get string() {
return this._text;
}
get length() {
return this.codePoints.length;
}
compareTo(other) {
return _Text.compare(this, new _Text(other));
}
static get comparer() {
const stringComparer = (left, right) => {
return new _Text(left).compareTo(right);
};
return stringComparer;
}
static compare(left, right) {
const leftCp = left.codePoints;
const rightCp = right.codePoints;
for (let index = 0; index < Math.min(leftCp.length, rightCp.length); index++) {
if (leftCp[index] === rightCp[index]) {
continue;
}
return leftCp[index] - rightCp[index] > 0 ? 1 : -1;
}
return leftCp.length - rightCp.length > 0 ? 1 : -1;
}
reverse() {
return String.fromCodePoint(...this.codePoints.reverse());
}
get codePoints() {
const array = [...this._text].map((s) => s.codePointAt(0));
return array;
}
};
var createMathFunction = (mathFn) => ([value]) => mathFn(value);
var createStringFunction = (stringFn) => ([subject]) => stringFn(subject);
var createObjectFunction = (objFn) => ([obj]) => objFn(obj);
var Runtime = class {
_interpreter;
_functionTable;
_customFunctions = /* @__PURE__ */ new Set();
TYPE_NAME_TABLE = Object.freeze({
[
0
/* TYPE_NUMBER */
]: "number",
[
1
/* TYPE_ANY */
]: "any",
[
2
/* TYPE_STRING */
]: "string",
[
3
/* TYPE_ARRAY */
]: "array",
[
4
/* TYPE_OBJECT */
]: "object",
[
5
/* TYPE_BOOLEAN */
]: "boolean",
[
6
/* TYPE_EXPREF */
]: "expression",
[
7
/* TYPE_NULL */
]: "null",
[
8
/* TYPE_ARRAY_NUMBER */
]: "Array<number>",
[
10
/* TYPE_ARRAY_OBJECT */
]: "Array<object>",
[
9
/* TYPE_ARRAY_STRING */
]: "Array<string>",
[
11
/* TYPE_ARRAY_ARRAY */
]: "Array<Array<any>>"
});
constructor(interpreter) {
this._interpreter = interpreter;
this._functionTable = this.buildFunctionTable();
}
buildFunctionTable() {
return {
// Math functions
abs: { _func: createMathFunction(Math.abs), _signature: [{ types: [
0
/* TYPE_NUMBER */
] }] },
ceil: { _func: createMathFunction(Math.ceil), _signature: [{ types: [
0
/* TYPE_NUMBER */
] }] },
floor: { _func: createMathFunction(Math.floor), _signature: [{ types: [
0
/* TYPE_NUMBER */
] }] },
// String functions
lower: { _func: createStringFunction(lower), _signature: [{ types: [
2
/* TYPE_STRING */
] }] },
upper: { _func: createStringFunction(upper), _signature: [{ types: [
2
/* TYPE_STRING */
] }] },
// Object functions
keys: { _func: createObjectFunction(Object.keys), _signature: [{ types: [
4
/* TYPE_OBJECT */
] }] },
values: { _func: createObjectFunction(Object.values), _signature: [{ types: [
4
/* TYPE_OBJECT */
] }] },
// Complex functions that need custom implementations
avg: { _func: this.functionAvg, _signature: [{ types: [
8
/* TYPE_ARRAY_NUMBER */
] }] },
contains: {
_func: this.functionContains,
_signature: [
{ types: [
2,
3
/* TYPE_ARRAY */
] },
{ types: [
1
/* TYPE_ANY */
] }
]
},
ends_with: {
_func: this.functionEndsWith,
_signature: [{ types: [
2
/* TYPE_STRING */
] }, { types: [
2
/* TYPE_STRING */
] }]
},
find_first: {
_func: this.functionFindFirst,
_signature: [
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
0
/* TYPE_NUMBER */
], optional: true },
{ types: [
0
/* TYPE_NUMBER */
], optional: true }
]
},
find_last: {
_func: this.functionFindLast,
_signature: [
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
0
/* TYPE_NUMBER */
], optional: true },
{ types: [
0
/* TYPE_NUMBER */
], optional: true }
]
},
from_items: { _func: this.functionFromItems, _signature: [{ types: [
11
/* TYPE_ARRAY_ARRAY */
] }] },
group_by: {
_func: this.functionGroupBy,
_signature: [{ types: [
3
/* TYPE_ARRAY */
] }, { types: [
6
/* TYPE_EXPREF */
] }]
},
items: { _func: this.functionItems, _signature: [{ types: [
4
/* TYPE_OBJECT */
] }] },
join: {
_func: this.functionJoin,
_signature: [{ types: [
2
/* TYPE_STRING */
] }, { types: [
9
/* TYPE_ARRAY_STRING */
] }]
},
length: {
_func: this.functionLength,
_signature: [{ types: [
2,
3,
4
/* TYPE_OBJECT */
] }]
},
map: {
_func: this.functionMap,
_signature: [{ types: [
6
/* TYPE_EXPREF */
] }, { types: [
3
/* TYPE_ARRAY */
] }]
},
max: {
_func: this.functionMax,
_signature: [{ types: [
8,
9
/* TYPE_ARRAY_STRING */
] }]
},
max_by: {
_func: this.functionMaxBy,
_signature: [{ types: [
3
/* TYPE_ARRAY */
] }, { types: [
6
/* TYPE_EXPREF */
] }]
},
merge: { _func: this.functionMerge, _signature: [{ types: [
4
/* TYPE_OBJECT */
], variadic: true }] },
min: {
_func: this.functionMin,
_signature: [{ types: [
8,
9
/* TYPE_ARRAY_STRING */
] }]
},
min_by: {
_func: this.functionMinBy,
_signature: [{ types: [
3
/* TYPE_ARRAY */
] }, { types: [
6
/* TYPE_EXPREF */
] }]
},
not_null: { _func: this.functionNotNull, _signature: [{ types: [
1
/* TYPE_ANY */
], variadic: true }] },
pad_left: {
_func: this.functionPadLeft,
_signature: [
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
0
/* TYPE_NUMBER */
] },
{ types: [
2
/* TYPE_STRING */
], optional: true }
]
},
pad_right: {
_func: this.functionPadRight,
_signature: [
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
0
/* TYPE_NUMBER */
] },
{ types: [
2
/* TYPE_STRING */
], optional: true }
]
},
replace: {
_func: this.functionReplace,
_signature: [
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
0
/* TYPE_NUMBER */
], optional: true }
]
},
reverse: {
_func: this.functionReverse,
_signature: [{ types: [
2,
3
/* TYPE_ARRAY */
] }]
},
sort: {
_func: this.functionSort,
_signature: [{ types: [
9,
8
/* TYPE_ARRAY_NUMBER */
] }]
},
sort_by: {
_func: this.functionSortBy,
_signature: [{ types: [
3
/* TYPE_ARRAY */
] }, { types: [
6
/* TYPE_EXPREF */
] }]
},
split: {
_func: this.functionSplit,
_signature: [
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
2
/* TYPE_STRING */
] },
{ types: [
0
/* TYPE_NUMBER */
], optional: true }
]
},
starts_with: {
_func: this.functionStartsWith,
_signature: [{ types: [
2
/* TYPE_STRING */
] }, { types: [
2
/* TYPE_STRING */
] }]
},
sum: { _func: this.functionSum, _signature: [{ types: [
8
/* TYPE_ARRAY_NUMBER */
] }] },
to_array: { _func: this.functionToArray, _signature: [{ types: [
1
/* TYPE_ANY */
] }] },
to_number: { _func: this.functionToNumber, _signature: [{ types: [
1
/* TYPE_ANY */
] }] },
to_string: { _func: this.functionToString, _signature: [{ types: [
1
/* TYPE_ANY */
] }] },
trim: {
_func: this.functionTrim,
_signature: [{ types: [
2
/* TYPE_STRING */
] }, { types: [
2
/* TYPE_STRING */
], optional: true }]
},
trim_left: {
_func: this.functionTrimLeft,
_signature: [{ types: [
2
/* TYPE_STRING */
] }, { types: [
2
/* TYPE_STRING */
], optional: true }]
},
trim_right: {
_func: this.functionTrimRight,
_signature: [{ types: [
2
/* TYPE_STRING */
] }, { types: [
2
/* TYPE_STRING */
], optional: true }]
},
type: { _func: this.functionType, _signature: [{ types: [
1
/* TYPE_ANY */
] }] },
zip: { _func: this.functionZip, _signature: [{ types: [
3
/* TYPE_ARRAY */
], variadic: true }] }
};
}
/**
* Enhanced registerFunction with backward compatibility and new options
* @deprecated Use register() method for enhanced functionality
*/
registerFunction(name, customFunction, signature, options) {
const result = this._registerInternal(name, customFunction, signature, options);
if (!result.success) {
throw new Error(result.message);
}
}
/**
* Internal registration method that bypasses TypeScript type checking
*/
_registerInternal(name, customFunction, signature, options = {}) {
if (!name || typeof name !== "string" || name.trim() === "") {
return {
success: false,
reason: "invalid-name",
message: "Function name must be a non-empty string"
};
}
try {
this.validateInputSignatures(name, signature);
} catch (error) {
return {
success: false,
reason: "invalid-signature",
message: error instanceof Error ? error.message : "Invalid function signature"
};
}
const { override = false, warn = false } = options;
const exists = name in this._functionTable;
if (exists && !override) {
return {
success: false,
reason: "already-exists",
message: `Function already defined: ${name}(). Use { override: true } to replace it.`
};
}
if (exists && override && warn) {
console.warn(`Warning: Overriding existing function: ${name}()`);
}
this._functionTable[name] = {
_func: customFunction.bind(this),
_signature: signature
};
this._customFunctions.add(name);
const message = exists ? `Function ${name}() overridden successfully` : `Function ${name}() registered successfully`;
return { success: true, message };
}
/**
* Register a new function with enhanced options and type safety
*/
register(name, customFunction, signature, options = {}) {
return this._registerInternal(name, customFunction, signature, options);
}
/**
* Unregister a custom function (built-in functions cannot be unregistered)
*/
unregister(name) {
if (!this._customFunctions.has(name)) {
return false;
}
delete this._functionTable[name];
this._customFunctions.delete(name);
return true;
}
/**
* Check if a function is registered
*/
isRegistered(name) {
return name in this._functionTable;
}
/**
* Get list of all registered function names
*/
getRegistered() {
return Object.keys(this._functionTable);
}
/**
* Get list of custom (non-built-in) function names
*/
getCustomFunctions() {
return Array.from(this._customFunctions);
}
/**
* Clear all custom functions (built-in functions remain)
*/
clearCustomFunctions() {
for (const name of this._customFunctions) {
delete this._functionTable[name];
}
this._customFunctions.clear();
}
callFunction(name, resolvedArgs) {
const functionEntry = this._functionTable[name];
if (functionEntry === void 0) {
throw new Error(`Unknown function: ${name}()`);
}
this.validateArgs(name, resolvedArgs, functionEntry._signature);
return functionEntry._func.call(this, resolvedArgs);
}
validateInputSignatures(name, signature) {
for (let i = 0; i < signature.length; i += 1) {
if ("variadic" in signature[i] && i !== signature.length - 1) {
throw new Error(`Invalid arity: ${name}() 'variadic' argument ${i + 1} must occur last`);
}
}
}
validateArgs(name, args, signature) {
this.validateInputSignatures(name, signature);
this.validateArity(name, args, signature);
this.validateTypes(name, args, signature);
}
validateArity(name, args, signature) {
const numberOfRequiredArgs = signature.filter((argSignature) => !(argSignature.optional ?? false)).length;
const lastArgIsVariadic = signature[signature.length - 1]?.variadic ?? false;
const tooFewArgs = args.length < numberOfRequiredArgs;
const tooManyArgs = args.length > signature.length;
if (lastArgIsVariadic && tooFewArgs || !lastArgIsVariadic && (tooFewArgs || tooManyArgs)) {
const tooFewModifier = tooFewArgs && (!lastArgIsVariadic && numberOfRequiredArgs > 1 || lastArgIsVariadic) ? "at least " : "";
const pluralized = signature.length > 1;
throw new Error(
`Invalid arity: ${name}() takes ${tooFewModifier}${numberOfRequiredArgs} argument${pluralized && "s" || ""} but received ${args.length}`
);
}
}
validateTypes(name, args, signature) {
for (let i = 0; i < signature.length; i += 1) {
const currentSpec = signature[i].types;
const actualType = this.getTypeName(args[i]);
if (actualType === void 0) {
continue;
}
const typeMatched = currentSpec.some((expectedType) => this.typeMatches(actualType, expectedType, args[i]));
if (!typeMatched) {
const expected = currentSpec.map((typeId) => this.TYPE_NAME_TABLE[typeId]).join(" | ");
throw new Error(
`Invalid type: ${name}() expected argument ${i + 1} to be type (${expected}) but received type ${this.TYPE_NAME_TABLE[actualType]} instead.`
);
}
}
}
typeMatches(actual, expected, argValue) {
if (expected === 1) {
return true;
}
if (expected === 9 || expected === 8 || expected === 10 || expected === 11 || expected === 3) {
if (expected === 3) {
return actual === 3;
}
if (actual === 3) {
let subtype;
if (expected === 8) {
subtype = 0;
} else if (expected === 10) {
subtype = 4;
} else if (expected === 9) {
subtype = 2;
} else if (expected === 11) {
subtype = 3;
}
const array = argValue;
for (let i = 0; i < array.length; i += 1) {
const typeName = this.getTypeName(array[i]);
if (typeName !== void 0 && subtype !== void 0 && !this.typeMatches(typeName, subtype, array[i])) {
return false;
}
}
return true;
}
} else {
return actual === expected;
}
return false;
}
getTypeName(obj) {
if (obj === null) {
return 7;
}
if (typeof obj === "string") {
return 2;
}
if (typeof obj === "number") {
return 0;
}
if (typeof obj === "boolean") {
return 5;
}
if (Array.isArray(obj)) {
return 3;
}
if (typeof obj === "object") {
if (obj.expref) {
return 6;
}
return 4;
}
return;
}
createKeyFunction(exprefNode, allowedTypes) {
const interpreter = this._interpreter;
const keyFunc = (x) => {
const current = interpreter.visit(exprefNode, x);
if (!allowedTypes.includes(this.getTypeName(current))) {
const msg = `Invalid type: expected one of (${allowedTypes.map((t) => this.TYPE_NAME_TABLE[t]).join(" | ")}), received ${this.TYPE_NAME_TABLE[this.getTypeName(current)]}`;
throw new Error(msg);
}
return current;
};
return keyFunc;
}
functionAvg = ([inputArray]) => {
if (!inputArray || inputArray.length == 0) {
return null;
}
let sum = 0;
for (let i = 0; i < inputArray.length; i += 1) {
sum += inputArray[i];
}
return sum / inputArray.length;
};
functionContains = ([
searchable,
searchValue
]) => {
if (Array.isArray(searchable)) {
const array = searchable;
return array.includes(searchValue);
}
if (typeof searchable === "string") {
const text = searchable;
if (typeof searchValue === "string") {
return text.includes(searchValue);
}
}
return null;
};
functionEndsWith = (resolvedArgs) => {
const [searchStr, suffix] = resolvedArgs;
return searchStr.includes(suffix, searchStr.length - suffix.length);
};
functionFindFirst = this.createFindFunction(findFirst);
functionFindLast = this.createFindFunction(findLast);
createFindFunction(findFn) {
return (resolvedArgs) => {
const subject = resolvedArgs[0];
const search2 = resolvedArgs[1];
const start = resolvedArgs.length > 2 ? resolvedArgs[2] : void 0;
const end = resolvedArgs.length > 3 ? resolvedArgs[3] : void 0;
return findFn(subject, search2, start, end);
};
}
functionFromItems = ([array]) => {
array.map((pair) => {
if (pair.length != 2 || typeof pair[0] !== "string") {
throw new Error("invalid value, each array must contain two elements, a pair of string and value");
}
});
return Object.fromEntries(array);
};
functionGroupBy = ([array, exprefNode]) => {
const keyFunction = this.createKeyFunction(exprefNode, [
2
/* TYPE_STRING */
]);
return array.reduce((acc, cur) => {
const k = keyFunction(cur ?? {});
const target = acc[k] = acc[k] || [];
target.push(cur);
return acc;
}, {});
};
functionItems = ([inputValue]) => {
return Object.entries(inputValue);
};
functionJoin = (resolvedArgs) => {
const [joinChar, listJoin] = resolvedArgs;
return listJoin.join(joinChar);
};
functionLength = ([inputValue]) => {
if (typeof inputValue === "string") {
return new Text(inputValue).length;
}
if (Array.isArray(inputValue)) {
return inputValue.length;
}
return Object.keys(inputValue).length;
};
functionMap = ([exprefNode, elements]) => {
if (!this._interpreter) {
return [];
}
const mapped = [];
const interpreter = this._interpreter;
for (let i = 0; i < elements.length; i += 1) {
mapped.push(interpreter.visit(exprefNode, elements[i]));
}
return mapped;
};
functionMax = ([inputValue]) => {
if (!inputValue.length) {
return null;
}
const typeName = this.getTypeName(inputValue[0]);
if (typeName === 0) {
return Math.max(...inputValue);
}
const elements = inputValue;
let maxElement = elements[0];
for (let i = 1; i < elements.length; i += 1) {
if (maxElement.localeCompare(elements[i]) < 0) {
maxElement = elements[i];
}
}
return maxElement;
};
functionMaxBy = (resolvedArgs) => {
const exprefNode = resolvedArgs[1];
const resolvedArray = resolvedArgs[0];
const keyFunction = this.createKeyFunction(exprefNode, [
0,
2
/* TYPE_STRING */
]);
let maxNumber = -Infinity;
let maxRecord;
let current;
for (let i = 0; i < resolvedArray.length; i += 1) {
current = keyFunction && keyFunction(resolvedArray[i]);
if (current !== void 0 && current > maxNumber) {
maxNumber = current;
maxRecord = resolvedArray[i];
}
}
return maxRecord || null;
};
functionMerge = (resolvedArgs) => {
let merged = {};
for (let i = 0; i < resolvedArgs.length; i += 1) {
const current = resolvedArgs[i];
merged = Object.assign(merged, current);
}
return merged;
};
functionMin = ([inputValue]) => {
if (!inputValue.length) {
return null;
}
const typeName = this.getTypeName(inputValue[0]);
if (typeName === 0) {
return Math.min(...inputValue);
}
const elements = inputValue;
let minElement = elements[0];
for (let i = 1; i < elements.length; i += 1) {
if (elements[i].localeCompare(minElement) < 0) {
minElement = elements[i];
}
}
return minElement;
};
functionMinBy = (resolvedArgs) => {
const exprefNode = resolvedArgs[1];
const resolvedArray = resolvedArgs[0];
const keyFunction = this.createKeyFunction(exprefNode, [
0,
2
/* TYPE_STRING */
]);
let minNumber = Infinity;
let minRecord;
let current;
for (let i = 0; i < resolvedArray.length; i += 1) {
current = keyFunction && keyFunction(resolvedArray[i]);
if (current !== void 0 && current < minNumber) {
minNumber = current;
minRecord = resolvedArray[i];
}
}
return minRecord || null;
};
functionNotNull = (resolvedArgs) => {
for (let i = 0; i < resolvedArgs.length; i += 1) {
if (this.getTypeName(resolvedArgs[i]) !== 7) {
return resolvedArgs[i];
}
}
return null;
};
functionPadLeft = this.createPadFunction(padLeft);
functionPadRight = this.createPadFunction(padRight);
createPadFunction(padFn) {
return (resolvedArgs) => {
const subject = resolvedArgs[0];
const width = resolvedArgs[1];
const padding = resolvedArgs.length > 2 ? resolvedArgs[2] : void 0;
return padFn(subject, width, padding);
};
}
functionReplace = (resolvedArgs) => {
const subject = resolvedArgs[0];
const string = resolvedArgs[1];
const by = resolvedArgs[2];
return replace(subject, string, by, resolvedArgs.length > 3 ? resolvedArgs[3] : void 0);
};
functionSplit = (resolvedArgs) => {
const subject = resolvedArgs[0];
const search2 = resolvedArgs[1];
return split(subject, search2, resolvedArgs.length > 2 ? resolvedArgs[2] : void 0);
};
functionReverse = ([inputValue]) => {
const typeName = this.getTypeName(inputValue);
if (typeName === 2) {
return new Text(inputValue).reverse();
}
const reversedArray = inputValue.slice(0);
reversedArray.reverse();
return reversedArray;
};
functionSort = ([inputValue]) => {
if (inputValue.length == 0) {
return inputValue;
}
if (typeof inputValue[0] === "string") {
return [...inputValue].sort(Text.comparer);
}
return [...inputValue].sort();
};
functionSortBy = (resolvedArgs) => {
const sortedArray = resolvedArgs[0].slice(0);
if (sortedArray.length === 0) {
return sortedArray;
}
const interpreter = this._interpreter;
const exprefNode = resolvedArgs[1];
const requiredType = this.getTypeName(interpreter.visit(exprefNode, sortedArray[0]));
if (requiredType !== void 0 && ![
0,
2
/* TYPE_STRING */
].includes(requiredType)) {
throw new Error(`Invalid type: unexpected type (${this.TYPE_NAME_TABLE[requiredType]})`);
}
function throwInvalidTypeError(rt, item) {
throw new Error(
`Invalid type: expected (${rt.TYPE_NAME_TABLE[requiredType]}), received ${rt.TYPE_NAME_TABLE[rt.getTypeName(item)]}`
);
}
return sortedArray.sort((a, b) => {
const exprA = interpreter.visit(exprefNode, a);
const exprB = interpreter.visit(exprefNode, b);
if (this.getTypeName(exprA) !== requiredType) {
throwInvalidTypeError(this, exprA);
} else if (this.getTypeName(exprB) !== requiredType) {
throwInvalidTypeError(this, exprB);
}
if (requiredType === 2) {
return Text.comparer(exprA, exprB);
}
return exprA - exprB;
});
};
functionStartsWith = ([searchable, searchStr]) => {
return searchable.startsWith(searchStr);
};
functionSum = ([inputValue]) => {
return inputValue.reduce((x, y) => x + y, 0);
};
functionToArray = ([inputValue]) => {
if (this.getTypeName(inputValue) === 3) {
return inputValue;
}
return [inputValue];
};
functionToNumber = ([inputValue]) => {
const typeName = this.getTypeName(inputValue);
let convertedValue;
if (typeName === 0) {
return inputValue;
}
if (typeName === 2) {
convertedValue = +inputValue;
if (!isNaN(convertedValue)) {
return convertedValue;
}
}
return null;
};
functionToString = ([inputValue]) => {
if (this.getTypeName(inputValue) === 2) {
return inputValue;
}
return JSON.stringify(inputValue);
};
functionTrim = this.createTrimFunction(trim);
functionTrimLeft = this.createTrimFunction(trimLeft);
functionTrimRight = this.createTrimFunction(trimRight);
createTrimFunction(trimFn) {
return (resolvedArgs) => {
const subject = resolvedArgs[0];
const chars = resolvedArgs.length > 1 ? resolvedArgs[1] : void 0;
return trimFn(subject, chars);
};
}
functionType = ([inputValue]) => {
switch (this.getTypeName(inputValue)) {
case 0:
return "number";
case 2:
return "string";
case 3:
return "array";
case 4:
return "object";
case 5:
return "boolean";
case 7:
return "null";
default:
throw new Error("invalid-type");
}
};
functionZip = (array) => {
const length = Math.min(...array.map((arr) => arr.length));
const result = Array(length).fill(null).map((_, index) => array.map((arr) => arr[index]));
return result;
};
};
var ScopeChain = class _ScopeChain {
inner = void 0;
data = {};
get currentScopeData() {
return this.data;
}
withScope(data) {
const outer = new _ScopeChain();
outer.inner = this;
outer.data = data;
return outer;
}
getValue(identifier) {
if (Object.prototype.hasOwnProperty.call(this.data, identifier)) {
return this.data[identifier];
}
if (this.inner) {
return this.inner.getValue(identifier);
}
return null;
}
};
var emptyScopeChain = new ScopeChain();
var TreeInterpreter = class _TreeInterpreter {
runtime;
_rootValue = null;
_scope;
constructor() {
this.runtime = new Runtime(this);
this._scope = new ScopeChain();
}
withScope(scope) {
const interpreter = new _TreeInterpreter();
interpreter.runtime._functionTable = this.runtime._functionTable;
interpreter._rootValue = this._rootValue;
interpreter._scope = this._scope.withScope(scope);
return interpreter;
}
search(node, value) {
this._rootValue = value;
this._scope = emptyScopeChain;
return this.visit(node, value);
}
visit(node, value) {
switch (node.type) {
case "Ternary": {
const condition = this.visit(node.condition, value);
if (!isFalse(condition)) {
return this.visit(node.trueExpr, value);
}
return this.visit(node.falseExpr, value);
}
case "Field":
const identifier = node.name;
if (value === null || typeof value !== "object" || Array.isArray(value)) {
return null;
}
return value[identifier] ?? null;
case "LetExpression": {
const { bindings, expression } = node;
let scope = {};
bindings.forEach((binding) => {
const reference = this.visit(binding, value);
scope = {
...scope,
...reference
};
});
return this.withScope(scope).visit(expression, value);
}
case "Binding": {
const { variable, reference } = node;
const result = this.visit(reference, value);
return { [variable]: result };
}
case "Variable": {
const variable = node.name;
if (!this._scope.getValue(variable) && !Object.prototype.hasOwnProperty.call(this._scope.currentScopeData, variable)) {
throw new Error(`Error referencing undefined variable ${variable}`);
}
return this._scope.getValue(variable);
}
case "IndexExpression":
return this.visit(node.right, this.visit(node.left, value));
case "Subexpression": {
const result = this.visit(node.left, value);
return result != null ? this.visit(node.right, result) ?? null : null;
}
case "Index": {
if (!Array.isArray(value)) {
return null;
}
const index = node.value < 0 ? value.length + node.value : node.value;
return value[index] ?? null;
}
case "Slice": {
if (!Array.isArray(value) && typeof value !== "string") {
return null;
}
const { start, stop, step } = this.computeSliceParams(value.length, node);
if (typeof value === "string") {
const chars = [...value];
const sliced = this.slice(chars, start, stop, step);
return sliced.join("");
} else {
return this.slice(value, start, stop, step);
}
}
case "Projection": {
const { left, right } = node;
let allowString = false;
if (left.type === "IndexExpression" && left.right.type === "Slice") {
allowString = true;
}
const base = this.visit(left, value);
if (allowString && typeof base === "string") {
return this.visit(right, base);
}
if (!Array.isArray(base)) {
return null;
}
const collected = [];
for (const elem of base) {
const current = this.visit(right, elem);
if (current !== null) {
collected.push(current);
}
}
return collected;
}
case "ValueProjection": {
const { left, right } = node;
const base = this.visit(left, value);
if (base === null || typeof base !== "object" || Array.isArray(base)) {
return null;
}
const collected = [];
const values = Object.values(base);
for (const elem of values) {
const current = this.visit(right, elem);
if (current !== null) {
collected.push(current);
}
}
return collected;
}
case "FilterProjection": {
const { left, right, condition } = node;
const base = this.visit(left, value);
if (!Array.isArray(base)) {
return null;
}
const results = [];
for (const elem of base) {
const matched = this.visit(condition, elem);
if (isFalse(matched)) {
continue;
}
const result = this.visit(right, elem);
if (result !== null) {
results.push(result);
}
}
return results;
}
case "Arithmetic": {
const first = this.visit(node.left, value);
const second = this.visit(node.right, value);
switch (node.operator) {
case "Plus":
return add(first, second);
case "Minus":
return sub(first, second);
case "Multiply":
case "Star":
return mul(first, second);
case "Divide":
return divide(first, second);
case "Modulo":
return mod(first, second);
case "Div":
return div(first, second);
default:
throw new Error(`Syntax error: unknown arithmetic operator: ${node.operator}`);
}
}
case "Unary": {
const operand = this.visit(node.operand, value);
switch (node.operator) {
case "Plus":
ensureNumbers(operand);
return operand;
case "Minus":
ensureNumbers(operand);
return -operand;
default:
throw new Error(`Syntax error: unknown arithmetic operator: ${node.operator}`);
}
}
case "Comparator": {
const first = this.visit(node.left, value);
const second = this.visit(node.right, value);
switch (node.name) {
case "EQ":
return strictDeepEqual(first, second);
case "NE":
return !strictDeepEqual(first, second);
}
if (typeof first !== "number" || typeof second !== "number") {
return null;
}
switch (node.name) {
case "GT":
return first > second;
case "GTE":
return first >= second;
case "LT":
return first < second;
case "LTE":
return first <= second;
}
}
case "Flatten": {
const original = this.visit(node.child, value);
return Array.isArray(original) ? original.flat() : null;
}
case "Root":
return this._rootValue;
case "MultiSelectList": {
const collected = [];
for (const child of node.children) {
collected.push(this.visit(child, value));
}
return collected;
}
case "MultiSelectHash": {
const collected = {};
for (const child of node.children) {
collected[child.name] = this.visit(child.value, value);
}
return collected;
}
case "OrExpression": {
const result = this.visit(node.left, value);
if (isFalse(result)) {
return this.visit(node.right, value);
}
return result;
}
case "AndExpression": {
const result = this.visit(node.left, value);
if (isFalse(result)) {
return result;
}
return this.visit(node.right, value);
}
case "NotExpression":
return isFalse(this.visit(node.child, value));
case "Literal":
return node.value;
case "Pipe":
return this.visit(node.right, this.visit(node.left, value));
case "Function": {
const args = [];
for (const child of node.children) {
args.push(this.visit(child, value));
}
return this.runtime.callFunction(node.name, args);
}
case "ExpressionReference":
return {
expref: true,
...node.child
};
case "Current":
case "Identity":
return value;
}
}
computeSliceParams(arrayLength, sliceNode) {
let { start, stop, step } = sliceNode;
if (step === null) {
step = 1;
} else if (step === 0) {
const error = new Error("Invalid value: slice step cannot be 0");
error.name = "RuntimeError";
throw error;
}
start = start === null ? step < 0 ? arrayLength - 1 : 0 : this.capSliceRange(arrayLength, start, step);
stop = stop === null ? step < 0 ? -1 : arrayLength : this.capSliceRange(arrayLength, stop, step);
return { start, stop, step };
}
capSliceRange(arrayLength, actualValue, step) {
let nextActualValue = actualValue;
if (nextActualValue < 0) {
nextActualValue += arrayLength;
if (nextActualValue < 0) {
nextActualValue = step < 0 ? -1 : 0;
}
} else if (nextActualValue >= arrayLength) {
nextActualValue = step < 0 ? arrayLength - 1 : arrayLength;
}
return nextActualValue;
}
slice(collection, start, end, step) {
const result = [];
if (step > 0) {
for (let i = start; i < end; i += step) {
result.push(collection[i]);
}
} else {
for (let i = start; i > end; i += step) {
result.push(collection[i]);
}
}
return result;
}
};
var TreeInterpreterInstance = new TreeInterpreter();
var TreeInterpreter_default = TreeInterpreterInstance;
function compile(expression, options) {
const nodeTree = Parser_default.parse(expression, options);
return nodeTree;
}
var TreeInterpreter2 = TreeInterpreter_default;
// node_modules/hyperdispatch/runtime.mjs
var import_compact_encoding = __toESM(require_compact_encoding2(), 1);
var import_b4a = __toESM(require_b4a(), 1);
var import_nanoassert = __toESM(require_nanoassert(), 1);
var import_errors = __toESM(require_errors2(), 1);
// node_modules/hyperschema/runtime.mjs
var import_compact_encoding2 = __toESM(require_compact_encoding(), 1);
// node_modules/schema-sheets/spec/dispatch/messages.js
var VERSION = 1;
var version = VERSION;
var encoding0 = {
preencode(state, m) {
state.end++;
if (m.name) import_compact_encoding2.default.string.preencode(state, m.name);
},
encode(state, m) {
const flags = m.name ? 1 : 0;
import_compact_encoding2.default.uint.encode(state, flags);
if (m.name) import_compact_encoding2.default.string.encode(state, m.name);
},
decode(state) {
const flags = import_compact_encoding2.default.uint.decode(state);
return {
name: (flags & 1) !== 0 ? import_compact_encoding2.default.string.decode(state) : null
};
}
};
var encoding1 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.json.preencode(state, m.jsonSchema);
import_compact_encoding2.default.string.preencode(state, m.name);
state.end++;
if (m.metadata) import_compact_encoding2.default.json.preencode(state, m.metadata);
},
encode(state, m) {
const flags = m.metadata ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.json.encode(state, m.jsonSchema);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.metadata) import_compact_encoding2.default.json.encode(state, m.metadata);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.json.decode(state);
const r2 = import_compact_encoding2.default.string.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
schemaId: r0,
jsonSchema: r1,
name: r2,
metadata: (flags & 1) !== 0 ? import_compact_encoding2.default.json.decode(state) : null
};
}
};
var encoding2 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.schemaId);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.schemaId);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
return {
schemaId: r0
};
}
};
var encoding3 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uuid);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.json.preencode(state, m.json);
import_compact_encoding2.default.uint.preencode(state, m.time);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uuid);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.json.encode(state, m.json);
import_compact_encoding2.default.uint.encode(state, m.time);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.json.decode(state);
const r3 = import_compact_encoding2.default.uint.decode(state);
return {
uuid: r0,
schemaId: r1,
json: r2,
time: r3
};
}
};
var encoding4 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uuid);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uuid);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
return {
uuid: r0
};
}
};
var encoding5 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.queryId);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.string.preencode(state, m.name);
import_compact_encoding2.default.string.preencode(state, m.JMESPathQuery);
state.end++;
},
encode(state, m) {
const flags = m.listView ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.queryId);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.string.encode(state, m.JMESPathQuery);
import_compact_encoding2.default.uint.encode(state, flags);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.string.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
queryId: r0,
schemaId: r1,
name: r2,
JMESPathQuery: r3,
listView: (flags & 1) !== 0
};
}
};
var encoding6 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.queryId);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.queryId);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
return {
queryId: r0
};
}
};
var encoding7 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uischemaId);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.json.preencode(state, m.uiSchema);
import_compact_encoding2.default.string.preencode(state, m.name);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uischemaId);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.json.encode(state, m.uiSchema);
import_compact_encoding2.default.string.encode(state, m.name);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.json.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
return {
uischemaId: r0,
schemaId: r1,
uiSchema: r2,
name: r3
};
}
};
var encoding8 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uischemaId);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uischemaId);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
return {
uischemaId: r0
};
}
};
var encoding9 = {
preencode(state, m) {
import_compact_encoding2.default.fixed32.preencode(state, m.key);
state.end++;
if (m.name) import_compact_encoding2.default.string.preencode(state, m.name);
},
encode(state, m) {
const flags = (m.indexer ? 1 : 0) | (m.name ? 2 : 0);
import_compact_encoding2.default.fixed32.encode(state, m.key);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.name) import_compact_encoding2.default.string.encode(state, m.name);
},
decode(state) {
const r0 = import_compact_encoding2.default.fixed32.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
key: r0,
indexer: (flags & 1) !== 0,
name: (flags & 2) !== 0 ? import_compact_encoding2.default.string.decode(state) : null
};
}
};
var encoding10 = encoding1;
var encoding11 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uuid);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.uint.preencode(state, m.time);
import_compact_encoding2.default.json.preencode(state, m.json);
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uuid);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.uint.encode(state, m.time);
import_compact_encoding2.default.json.encode(state, m.json);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.uint.decode(state);
const r3 = import_compact_encoding2.default.json.decode(state);
const r4 = import_compact_encoding2.default.fixed32.decode(state);
return {
uuid: r0,
schemaId: r1,
time: r2,
json: r3,
memberkey: r4
};
}
};
var encoding12 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.queryId);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.string.preencode(state, m.name);
import_compact_encoding2.default.string.preencode(state, m.JMESPathQuery);
state.end++;
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
const flags = m.listView ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.queryId);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.string.encode(state, m.JMESPathQuery);
import_compact_encoding2.default.uint.encode(state, flags);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.string.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
queryId: r0,
schemaId: r1,
name: r2,
JMESPathQuery: r3,
listView: (flags & 1) !== 0,
memberkey: import_compact_encoding2.default.fixed32.decode(state)
};
}
};
var encoding13 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uischemaId);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.json.preencode(state, m.uiSchema);
import_compact_encoding2.default.string.preencode(state, m.name);
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uischemaId);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.json.encode(state, m.uiSchema);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.json.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
const r4 = import_compact_encoding2.default.fixed32.decode(state);
return {
uischemaId: r0,
schemaId: r1,
uiSchema: r2,
name: r3,
memberkey: r4
};
}
};
var encoding14 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.attestationUuid);
import_compact_encoding2.default.string.preencode(state, m.rowUuid);
import_compact_encoding2.default.uint.preencode(state, m.time);
import_compact_encoding2.default.buffer.preencode(state, m.proof);
state.end++;
if (m.keetUsername) import_compact_encoding2.default.string.preencode(state, m.keetUsername);
},
encode(state, m) {
const flags = m.keetUsername ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.attestationUuid);
import_compact_encoding2.default.string.encode(state, m.rowUuid);
import_compact_encoding2.default.uint.encode(state, m.time);
import_compact_encoding2.default.buffer.encode(state, m.proof);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.keetUsername) import_compact_encoding2.default.string.encode(state, m.keetUsername);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.uint.decode(state);
const r3 = import_compact_encoding2.default.buffer.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
attestationUuid: r0,
rowUuid: r1,
time: r2,
proof: r3,
keetUsername: (flags & 1) !== 0 ? import_compact_encoding2.default.string.decode(state) : null
};
}
};
var encoding15 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.attestationUuid);
import_compact_encoding2.default.string.preencode(state, m.rowUuid);
import_compact_encoding2.default.uint.preencode(state, m.time);
import_compact_encoding2.default.buffer.preencode(state, m.proof);
state.end++;
if (m.keetUsername) import_compact_encoding2.default.string.preencode(state, m.keetUsername);
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
const flags = m.keetUsername ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.attestationUuid);
import_compact_encoding2.default.string.encode(state, m.rowUuid);
import_compact_encoding2.default.uint.encode(state, m.time);
import_compact_encoding2.default.buffer.encode(state, m.proof);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.keetUsername) import_compact_encoding2.default.string.encode(state, m.keetUsername);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.uint.decode(state);
const r3 = import_compact_encoding2.default.buffer.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
attestationUuid: r0,
rowUuid: r1,
time: r2,
proof: r3,
keetUsername: (flags & 1) !== 0 ? import_compact_encoding2.default.string.decode(state) : null,
memberkey: import_compact_encoding2.default.fixed32.decode(state)
};
}
};
function setVersion(v) {
version = v;
}
function getEncoding(name) {
switch (name) {
case "@sheets/update-member":
return encoding0;
case "@sheets/set-named-schema":
return encoding1;
case "@sheets/delete-named-schema":
return encoding2;
case "@sheets/set-row":
return encoding3;
case "@sheets/delete-row":
return encoding4;
case "@sheets/set-query":
return encoding5;
case "@sheets/delete-query":
return encoding6;
case "@sheets/set-uischema":
return encoding7;
case "@sheets/delete-uischema":
return encoding8;
case "@sheets/member":
return encoding9;
case "@sheets/jsonschema":
return encoding10;
case "@sheets/row":
return encoding11;
case "@sheets/query":
return encoding12;
case "@sheets/uischema":
return encoding13;
case "@sheets/add-row-attestation":
return encoding14;
case "@sheets/row-attestation":
return encoding15;
default:
throw new Error("Encoder not found " + name);
}
}
// node_modules/schema-sheets/spec/dispatch/index.js
var defaultVersion = version;
var Router = class {
constructor() {
this._handler0 = null;
this._handler1 = null;
this._handler2 = null;
this._handler3 = null;
this._handler4 = null;
this._handler5 = null;
this._handler6 = null;
this._handler7 = null;
this._handler8 = null;
this._handler9 = null;
this._missing = 10;
}
add(name, handler) {
switch (name) {
case "@sheets/update-member":
this._handler0 = handler;
break;
case "@sheets/set-named-schema":
this._handler1 = handler;
break;
case "@sheets/delete-named-schema":
this._handler2 = handler;
break;
case "@sheets/set-row":
this._handler3 = handler;
break;
case "@sheets/delete-row":
this._handler4 = handler;
break;
case "@sheets/set-query":
this._handler5 = handler;
break;
case "@sheets/delete-query":
this._handler6 = handler;
break;
case "@sheets/set-uischema":
this._handler7 = handler;
break;
case "@sheets/delete-uischema":
this._handler8 = handler;
break;
case "@sheets/add-row-attestation":
this._handler9 = handler;
break;
default:
throw new Error("Cannot register a handler for a nonexistent route: " + name);
}
this._missing--;
}
_checkAll() {
(0, import_nanoassert.default)(this._handler0 !== null, 'Missing handler for "@sheets/update-member"');
(0, import_nanoassert.default)(this._handler1 !== null, 'Missing handler for "@sheets/set-named-schema"');
(0, import_nanoassert.default)(this._handler2 !== null, 'Missing handler for "@sheets/delete-named-schema"');
(0, import_nanoassert.default)(this._handler3 !== null, 'Missing handler for "@sheets/set-row"');
(0, import_nanoassert.default)(this._handler4 !== null, 'Missing handler for "@sheets/delete-row"');
(0, import_nanoassert.default)(this._handler5 !== null, 'Missing handler for "@sheets/set-query"');
(0, import_nanoassert.default)(this._handler6 !== null, 'Missing handler for "@sheets/delete-query"');
(0, import_nanoassert.default)(this._handler7 !== null, 'Missing handler for "@sheets/set-uischema"');
(0, import_nanoassert.default)(this._handler8 !== null, 'Missing handler for "@sheets/delete-uischema"');
(0, import_nanoassert.default)(this._handler9 !== null, 'Missing handler for "@sheets/add-row-attestation"');
}
async dispatch(message, context) {
if (this._missing > 0) {
this._checkAll();
}
setVersion(defaultVersion);
const op = import_b4a.default.isBuffer(message) ? decode(message) : message;
switch (op.id) {
case 0:
return this._handler0(op.value, context);
case 1:
return this._handler1(op.value, context);
case 2:
return this._handler2(op.value, context);
case 3:
return this._handler3(op.value, context);
case 4:
return this._handler4(op.value, context);
case 5:
return this._handler5(op.value, context);
case 6:
return this._handler6(op.value, context);
case 7:
return this._handler7(op.value, context);
case 8:
return this._handler8(op.value, context);
case 9:
return this._handler9(op.value, context);
default:
throw new Error("Handler not found for ID:" + op.id);
}
}
};
function encode(name, message, { version: version3 = defaultVersion } = {}) {
const state = { buffer: null, start: 0, end: 0 };
const route = getRouteByName(name);
setVersion(version3);
import_compact_encoding.default.uint.preencode(state, route.id);
route.enc.preencode(state, message);
state.buffer = import_b4a.default.allocUnsafe(state.end);
import_compact_encoding.default.uint.encode(state, route.id);
route.enc.encode(state, message);
return state.buffer;
}
function decode(buffer, { version: version3 = defaultVersion } = {}) {
const state = { buffer, start: 0, end: buffer.length };
const id = import_compact_encoding.default.uint.decode(state);
const route = getRouteById(id);
setVersion(version3);
const value = route.enc.decode(state);
return { id, name: route.name, value };
}
var route0 = {
name: "@sheets/update-member",
id: 0,
enc: getEncoding("@sheets/update-member")
};
var route1 = {
name: "@sheets/set-named-schema",
id: 1,
enc: getEncoding("@sheets/set-named-schema")
};
var route2 = {
name: "@sheets/delete-named-schema",
id: 2,
enc: getEncoding("@sheets/delete-named-schema")
};
var route3 = {
name: "@sheets/set-row",
id: 3,
enc: getEncoding("@sheets/set-row")
};
var route4 = {
name: "@sheets/delete-row",
id: 4,
enc: getEncoding("@sheets/delete-row")
};
var route5 = {
name: "@sheets/set-query",
id: 5,
enc: getEncoding("@sheets/set-query")
};
var route6 = {
name: "@sheets/delete-query",
id: 6,
enc: getEncoding("@sheets/delete-query")
};
var route7 = {
name: "@sheets/set-uischema",
id: 7,
enc: getEncoding("@sheets/set-uischema")
};
var route8 = {
name: "@sheets/delete-uischema",
id: 8,
enc: getEncoding("@sheets/delete-uischema")
};
var route9 = {
name: "@sheets/add-row-attestation",
id: 9,
enc: getEncoding("@sheets/add-row-attestation")
};
function getRouteByName(name) {
switch (name) {
case "@sheets/update-member":
return route0;
case "@sheets/set-named-schema":
return route1;
case "@sheets/delete-named-schema":
return route2;
case "@sheets/set-row":
return route3;
case "@sheets/delete-row":
return route4;
case "@sheets/set-query":
return route5;
case "@sheets/delete-query":
return route6;
case "@sheets/set-uischema":
return route7;
case "@sheets/delete-uischema":
return route8;
case "@sheets/add-row-attestation":
return route9;
default:
throw new Error("Handler not found for name: " + name);
}
}
function getRouteById(id) {
switch (id) {
case 0:
return route0;
case 1:
return route1;
case 2:
return route2;
case 3:
return route3;
case 4:
return route4;
case 5:
return route5;
case 6:
return route6;
case 7:
return route7;
case 8:
return route8;
case 9:
return route9;
default:
throw new Error("Handler not found for ID: " + id);
}
}
// node_modules/hyperdb/runtime.mjs
var import_compact_encoding3 = __toESM(require_compact_encoding(), 1);
var import_b4a2 = __toESM(require_b4a(), 1);
var import_index_encoder = __toESM(require_index_encoder(), 1);
// node_modules/schema-sheets/spec/db/messages.js
var VERSION2 = 1;
var version2 = VERSION2;
var encoding02 = {
preencode(state, m) {
state.end++;
if (m.name) import_compact_encoding2.default.string.preencode(state, m.name);
},
encode(state, m) {
const flags = m.name ? 1 : 0;
import_compact_encoding2.default.uint.encode(state, flags);
if (m.name) import_compact_encoding2.default.string.encode(state, m.name);
},
decode(state) {
const flags = import_compact_encoding2.default.uint.decode(state);
return {
name: (flags & 1) !== 0 ? import_compact_encoding2.default.string.decode(state) : null
};
}
};
var encoding16 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.json.preencode(state, m.jsonSchema);
import_compact_encoding2.default.string.preencode(state, m.name);
state.end++;
if (m.metadata) import_compact_encoding2.default.json.preencode(state, m.metadata);
},
encode(state, m) {
const flags = m.metadata ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.json.encode(state, m.jsonSchema);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.metadata) import_compact_encoding2.default.json.encode(state, m.metadata);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.json.decode(state);
const r2 = import_compact_encoding2.default.string.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
schemaId: r0,
jsonSchema: r1,
name: r2,
metadata: (flags & 1) !== 0 ? import_compact_encoding2.default.json.decode(state) : null
};
}
};
var encoding22 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.schemaId);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.schemaId);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
return {
schemaId: r0
};
}
};
var encoding32 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uuid);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.json.preencode(state, m.json);
import_compact_encoding2.default.uint.preencode(state, m.time);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uuid);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.json.encode(state, m.json);
import_compact_encoding2.default.uint.encode(state, m.time);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.json.decode(state);
const r3 = import_compact_encoding2.default.uint.decode(state);
return {
uuid: r0,
schemaId: r1,
json: r2,
time: r3
};
}
};
var encoding42 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uuid);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uuid);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
return {
uuid: r0
};
}
};
var encoding52 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.queryId);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.string.preencode(state, m.name);
import_compact_encoding2.default.string.preencode(state, m.JMESPathQuery);
state.end++;
},
encode(state, m) {
const flags = m.listView ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.queryId);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.string.encode(state, m.JMESPathQuery);
import_compact_encoding2.default.uint.encode(state, flags);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.string.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
queryId: r0,
schemaId: r1,
name: r2,
JMESPathQuery: r3,
listView: (flags & 1) !== 0
};
}
};
var encoding62 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.queryId);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.queryId);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
return {
queryId: r0
};
}
};
var encoding72 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uischemaId);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.json.preencode(state, m.uiSchema);
import_compact_encoding2.default.string.preencode(state, m.name);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uischemaId);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.json.encode(state, m.uiSchema);
import_compact_encoding2.default.string.encode(state, m.name);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.json.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
return {
uischemaId: r0,
schemaId: r1,
uiSchema: r2,
name: r3
};
}
};
var encoding82 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uischemaId);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uischemaId);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
return {
uischemaId: r0
};
}
};
var encoding92 = {
preencode(state, m) {
import_compact_encoding2.default.fixed32.preencode(state, m.key);
state.end++;
if (m.name) import_compact_encoding2.default.string.preencode(state, m.name);
},
encode(state, m) {
const flags = (m.indexer ? 1 : 0) | (m.name ? 2 : 0);
import_compact_encoding2.default.fixed32.encode(state, m.key);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.name) import_compact_encoding2.default.string.encode(state, m.name);
},
decode(state) {
const r0 = import_compact_encoding2.default.fixed32.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
key: r0,
indexer: (flags & 1) !== 0,
name: (flags & 2) !== 0 ? import_compact_encoding2.default.string.decode(state) : null
};
}
};
var encoding102 = encoding16;
var encoding112 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uuid);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.uint.preencode(state, m.time);
import_compact_encoding2.default.json.preencode(state, m.json);
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uuid);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.uint.encode(state, m.time);
import_compact_encoding2.default.json.encode(state, m.json);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.uint.decode(state);
const r3 = import_compact_encoding2.default.json.decode(state);
const r4 = import_compact_encoding2.default.fixed32.decode(state);
return {
uuid: r0,
schemaId: r1,
time: r2,
json: r3,
memberkey: r4
};
}
};
var encoding122 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.queryId);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.string.preencode(state, m.name);
import_compact_encoding2.default.string.preencode(state, m.JMESPathQuery);
state.end++;
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
const flags = m.listView ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.queryId);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.string.encode(state, m.JMESPathQuery);
import_compact_encoding2.default.uint.encode(state, flags);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.string.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
queryId: r0,
schemaId: r1,
name: r2,
JMESPathQuery: r3,
listView: (flags & 1) !== 0,
memberkey: import_compact_encoding2.default.fixed32.decode(state)
};
}
};
var encoding132 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.uischemaId);
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.json.preencode(state, m.uiSchema);
import_compact_encoding2.default.string.preencode(state, m.name);
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.uischemaId);
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.json.encode(state, m.uiSchema);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.json.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
const r4 = import_compact_encoding2.default.fixed32.decode(state);
return {
uischemaId: r0,
schemaId: r1,
uiSchema: r2,
name: r3,
memberkey: r4
};
}
};
var encoding142 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.attestationUuid);
import_compact_encoding2.default.string.preencode(state, m.rowUuid);
import_compact_encoding2.default.uint.preencode(state, m.time);
import_compact_encoding2.default.buffer.preencode(state, m.proof);
state.end++;
if (m.keetUsername) import_compact_encoding2.default.string.preencode(state, m.keetUsername);
},
encode(state, m) {
const flags = m.keetUsername ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.attestationUuid);
import_compact_encoding2.default.string.encode(state, m.rowUuid);
import_compact_encoding2.default.uint.encode(state, m.time);
import_compact_encoding2.default.buffer.encode(state, m.proof);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.keetUsername) import_compact_encoding2.default.string.encode(state, m.keetUsername);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.uint.decode(state);
const r3 = import_compact_encoding2.default.buffer.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
attestationUuid: r0,
rowUuid: r1,
time: r2,
proof: r3,
keetUsername: (flags & 1) !== 0 ? import_compact_encoding2.default.string.decode(state) : null
};
}
};
var encoding152 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.attestationUuid);
import_compact_encoding2.default.string.preencode(state, m.rowUuid);
import_compact_encoding2.default.uint.preencode(state, m.time);
import_compact_encoding2.default.buffer.preencode(state, m.proof);
state.end++;
if (m.keetUsername) import_compact_encoding2.default.string.preencode(state, m.keetUsername);
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
const flags = m.keetUsername ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.attestationUuid);
import_compact_encoding2.default.string.encode(state, m.rowUuid);
import_compact_encoding2.default.uint.encode(state, m.time);
import_compact_encoding2.default.buffer.encode(state, m.proof);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.keetUsername) import_compact_encoding2.default.string.encode(state, m.keetUsername);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r0 = import_compact_encoding2.default.string.decode(state);
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.uint.decode(state);
const r3 = import_compact_encoding2.default.buffer.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
attestationUuid: r0,
rowUuid: r1,
time: r2,
proof: r3,
keetUsername: (flags & 1) !== 0 ? import_compact_encoding2.default.string.decode(state) : null,
memberkey: import_compact_encoding2.default.fixed32.decode(state)
};
}
};
var encoding162 = {
preencode(state, m) {
state.end++;
if (m.name) import_compact_encoding2.default.string.preencode(state, m.name);
},
encode(state, m) {
const flags = (m.indexer ? 1 : 0) | (m.name ? 2 : 0);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.name) import_compact_encoding2.default.string.encode(state, m.name);
},
decode(state) {
const flags = import_compact_encoding2.default.uint.decode(state);
return {
key: null,
indexer: (flags & 1) !== 0,
name: (flags & 2) !== 0 ? import_compact_encoding2.default.string.decode(state) : null
};
}
};
var encoding17 = {
preencode(state, m) {
import_compact_encoding2.default.json.preencode(state, m.jsonSchema);
import_compact_encoding2.default.string.preencode(state, m.name);
state.end++;
if (m.metadata) import_compact_encoding2.default.json.preencode(state, m.metadata);
},
encode(state, m) {
const flags = m.metadata ? 1 : 0;
import_compact_encoding2.default.json.encode(state, m.jsonSchema);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.metadata) import_compact_encoding2.default.json.encode(state, m.metadata);
},
decode(state) {
const r1 = import_compact_encoding2.default.json.decode(state);
const r2 = import_compact_encoding2.default.string.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
schemaId: null,
jsonSchema: r1,
name: r2,
metadata: (flags & 1) !== 0 ? import_compact_encoding2.default.json.decode(state) : null
};
}
};
var encoding18 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.uint.preencode(state, m.time);
import_compact_encoding2.default.json.preencode(state, m.json);
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.uint.encode(state, m.time);
import_compact_encoding2.default.json.encode(state, m.json);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.uint.decode(state);
const r3 = import_compact_encoding2.default.json.decode(state);
const r4 = import_compact_encoding2.default.fixed32.decode(state);
return {
uuid: null,
schemaId: r1,
time: r2,
json: r3,
memberkey: r4
};
}
};
var encoding19 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.string.preencode(state, m.name);
import_compact_encoding2.default.string.preencode(state, m.JMESPathQuery);
state.end++;
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
const flags = m.listView ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.string.encode(state, m.JMESPathQuery);
import_compact_encoding2.default.uint.encode(state, flags);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.string.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
queryId: null,
schemaId: r1,
name: r2,
JMESPathQuery: r3,
listView: (flags & 1) !== 0,
memberkey: import_compact_encoding2.default.fixed32.decode(state)
};
}
};
var encoding20 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.schemaId);
import_compact_encoding2.default.json.preencode(state, m.uiSchema);
import_compact_encoding2.default.string.preencode(state, m.name);
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
import_compact_encoding2.default.string.encode(state, m.schemaId);
import_compact_encoding2.default.json.encode(state, m.uiSchema);
import_compact_encoding2.default.string.encode(state, m.name);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.json.decode(state);
const r3 = import_compact_encoding2.default.string.decode(state);
const r4 = import_compact_encoding2.default.fixed32.decode(state);
return {
uischemaId: null,
schemaId: r1,
uiSchema: r2,
name: r3,
memberkey: r4
};
}
};
var encoding21 = {
preencode(state, m) {
import_compact_encoding2.default.string.preencode(state, m.rowUuid);
import_compact_encoding2.default.uint.preencode(state, m.time);
import_compact_encoding2.default.buffer.preencode(state, m.proof);
state.end++;
if (m.keetUsername) import_compact_encoding2.default.string.preencode(state, m.keetUsername);
import_compact_encoding2.default.fixed32.preencode(state, m.memberkey);
},
encode(state, m) {
const flags = m.keetUsername ? 1 : 0;
import_compact_encoding2.default.string.encode(state, m.rowUuid);
import_compact_encoding2.default.uint.encode(state, m.time);
import_compact_encoding2.default.buffer.encode(state, m.proof);
import_compact_encoding2.default.uint.encode(state, flags);
if (m.keetUsername) import_compact_encoding2.default.string.encode(state, m.keetUsername);
import_compact_encoding2.default.fixed32.encode(state, m.memberkey);
},
decode(state) {
const r1 = import_compact_encoding2.default.string.decode(state);
const r2 = import_compact_encoding2.default.uint.decode(state);
const r3 = import_compact_encoding2.default.buffer.decode(state);
const flags = import_compact_encoding2.default.uint.decode(state);
return {
attestationUuid: null,
rowUuid: r1,
time: r2,
proof: r3,
keetUsername: (flags & 1) !== 0 ? import_compact_encoding2.default.string.decode(state) : null,
memberkey: import_compact_encoding2.default.fixed32.decode(state)
};
}
};
function setVersion2(v) {
version2 = v;
}
function getEncoding2(name) {
switch (name) {
case "@sheets/update-member":
return encoding02;
case "@sheets/set-named-schema":
return encoding16;
case "@sheets/delete-named-schema":
return encoding22;
case "@sheets/set-row":
return encoding32;
case "@sheets/delete-row":
return encoding42;
case "@sheets/set-query":
return encoding52;
case "@sheets/delete-query":
return encoding62;
case "@sheets/set-uischema":
return encoding72;
case "@sheets/delete-uischema":
return encoding82;
case "@sheets/member":
return encoding92;
case "@sheets/jsonschema":
return encoding102;
case "@sheets/row":
return encoding112;
case "@sheets/query":
return encoding122;
case "@sheets/uischema":
return encoding132;
case "@sheets/add-row-attestation":
return encoding142;
case "@sheets/row-attestation":
return encoding152;
case "@sheets/member/hyperdb#0":
return encoding162;
case "@sheets/jsonschema/hyperdb#1":
return encoding17;
case "@sheets/row/hyperdb#2":
return encoding18;
case "@sheets/query/hyperdb#3":
return encoding19;
case "@sheets/uischema/hyperdb#4":
return encoding20;
case "@sheets/row-attestation/hyperdb#5":
return encoding21;
default:
throw new Error("Encoder not found " + name);
}
}
// node_modules/schema-sheets/spec/db/index.js
var collection0_key = new import_index_encoder.default([
import_index_encoder.default.BUFFER
], { prefix: 0 });
function collection0_indexify(record) {
const a = record.key;
return a === void 0 ? [] : [a];
}
var collection0_enc = getEncoding2("@sheets/member/hyperdb#0");
function collection0_reconstruct(version3, keyBuf, valueBuf) {
const key = collection0_key.decode(keyBuf);
setVersion2(version3);
const record = import_compact_encoding3.default.decode(collection0_enc, valueBuf);
record.key = key[0];
return record;
}
function collection0_reconstruct_key(keyBuf) {
const key = collection0_key.decode(keyBuf);
return {
key: key[0]
};
}
var collection0 = {
name: "@sheets/members",
id: 0,
encodeKey(record) {
const key = [record.key];
return collection0_key.encode(key);
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return collection0_key.encodeRange({
gt: gt ? collection0_indexify(gt) : null,
lt: lt ? collection0_indexify(lt) : null,
gte: gte ? collection0_indexify(gte) : null,
lte: lte ? collection0_indexify(lte) : null
});
},
encodeValue(version3, record) {
setVersion2(version3);
return import_compact_encoding3.default.encode(collection0_enc, record);
},
trigger: null,
reconstruct: collection0_reconstruct,
reconstructKey: collection0_reconstruct_key,
indexes: []
};
var collection1_key = new import_index_encoder.default([
import_index_encoder.default.STRING
], { prefix: 1 });
function collection1_indexify(record) {
const a = record.schemaId;
return a === void 0 ? [] : [a];
}
var collection1_enc = getEncoding2("@sheets/jsonschema/hyperdb#1");
function collection1_reconstruct(version3, keyBuf, valueBuf) {
const key = collection1_key.decode(keyBuf);
setVersion2(version3);
const record = import_compact_encoding3.default.decode(collection1_enc, valueBuf);
record.schemaId = key[0];
return record;
}
function collection1_reconstruct_key(keyBuf) {
const key = collection1_key.decode(keyBuf);
return {
schemaId: key[0]
};
}
var collection1 = {
name: "@sheets/jsonschema",
id: 1,
encodeKey(record) {
const key = [record.schemaId];
return collection1_key.encode(key);
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return collection1_key.encodeRange({
gt: gt ? collection1_indexify(gt) : null,
lt: lt ? collection1_indexify(lt) : null,
gte: gte ? collection1_indexify(gte) : null,
lte: lte ? collection1_indexify(lte) : null
});
},
encodeValue(version3, record) {
setVersion2(version3);
return import_compact_encoding3.default.encode(collection1_enc, record);
},
trigger: null,
reconstruct: collection1_reconstruct,
reconstructKey: collection1_reconstruct_key,
indexes: []
};
var collection2_key = new import_index_encoder.default([
import_index_encoder.default.STRING
], { prefix: 2 });
function collection2_indexify(record) {
const a = record.uuid;
return a === void 0 ? [] : [a];
}
var collection2_enc = getEncoding2("@sheets/row/hyperdb#2");
function collection2_reconstruct(version3, keyBuf, valueBuf) {
const key = collection2_key.decode(keyBuf);
setVersion2(version3);
const record = import_compact_encoding3.default.decode(collection2_enc, valueBuf);
record.uuid = key[0];
return record;
}
function collection2_reconstruct_key(keyBuf) {
const key = collection2_key.decode(keyBuf);
return {
uuid: key[0]
};
}
var collection2 = {
name: "@sheets/row",
id: 2,
encodeKey(record) {
const key = [record.uuid];
return collection2_key.encode(key);
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return collection2_key.encodeRange({
gt: gt ? collection2_indexify(gt) : null,
lt: lt ? collection2_indexify(lt) : null,
gte: gte ? collection2_indexify(gte) : null,
lte: lte ? collection2_indexify(lte) : null
});
},
encodeValue(version3, record) {
setVersion2(version3);
return import_compact_encoding3.default.encode(collection2_enc, record);
},
trigger: null,
reconstruct: collection2_reconstruct,
reconstructKey: collection2_reconstruct_key,
indexes: []
};
var collection3_key = new import_index_encoder.default([
import_index_encoder.default.STRING
], { prefix: 3 });
function collection3_indexify(record) {
const a = record.queryId;
return a === void 0 ? [] : [a];
}
var collection3_enc = getEncoding2("@sheets/query/hyperdb#3");
function collection3_reconstruct(version3, keyBuf, valueBuf) {
const key = collection3_key.decode(keyBuf);
setVersion2(version3);
const record = import_compact_encoding3.default.decode(collection3_enc, valueBuf);
record.queryId = key[0];
return record;
}
function collection3_reconstruct_key(keyBuf) {
const key = collection3_key.decode(keyBuf);
return {
queryId: key[0]
};
}
var collection3 = {
name: "@sheets/queries",
id: 3,
encodeKey(record) {
const key = [record.queryId];
return collection3_key.encode(key);
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return collection3_key.encodeRange({
gt: gt ? collection3_indexify(gt) : null,
lt: lt ? collection3_indexify(lt) : null,
gte: gte ? collection3_indexify(gte) : null,
lte: lte ? collection3_indexify(lte) : null
});
},
encodeValue(version3, record) {
setVersion2(version3);
return import_compact_encoding3.default.encode(collection3_enc, record);
},
trigger: null,
reconstruct: collection3_reconstruct,
reconstructKey: collection3_reconstruct_key,
indexes: []
};
var collection4_key = new import_index_encoder.default([
import_index_encoder.default.STRING
], { prefix: 4 });
function collection4_indexify(record) {
const a = record.uischemaId;
return a === void 0 ? [] : [a];
}
var collection4_enc = getEncoding2("@sheets/uischema/hyperdb#4");
function collection4_reconstruct(version3, keyBuf, valueBuf) {
const key = collection4_key.decode(keyBuf);
setVersion2(version3);
const record = import_compact_encoding3.default.decode(collection4_enc, valueBuf);
record.uischemaId = key[0];
return record;
}
function collection4_reconstruct_key(keyBuf) {
const key = collection4_key.decode(keyBuf);
return {
uischemaId: key[0]
};
}
var collection4 = {
name: "@sheets/uischemas",
id: 4,
encodeKey(record) {
const key = [record.uischemaId];
return collection4_key.encode(key);
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return collection4_key.encodeRange({
gt: gt ? collection4_indexify(gt) : null,
lt: lt ? collection4_indexify(lt) : null,
gte: gte ? collection4_indexify(gte) : null,
lte: lte ? collection4_indexify(lte) : null
});
},
encodeValue(version3, record) {
setVersion2(version3);
return import_compact_encoding3.default.encode(collection4_enc, record);
},
trigger: null,
reconstruct: collection4_reconstruct,
reconstructKey: collection4_reconstruct_key,
indexes: []
};
var collection5_key = new import_index_encoder.default([
import_index_encoder.default.STRING
], { prefix: 5 });
function collection5_indexify(record) {
const a = record.attestationUuid;
return a === void 0 ? [] : [a];
}
var collection5_enc = getEncoding2("@sheets/row-attestation/hyperdb#5");
function collection5_reconstruct(version3, keyBuf, valueBuf) {
const key = collection5_key.decode(keyBuf);
setVersion2(version3);
const record = import_compact_encoding3.default.decode(collection5_enc, valueBuf);
record.attestationUuid = key[0];
return record;
}
function collection5_reconstruct_key(keyBuf) {
const key = collection5_key.decode(keyBuf);
return {
attestationUuid: key[0]
};
}
var collection5 = {
name: "@sheets/row-attestations",
id: 5,
encodeKey(record) {
const key = [record.attestationUuid];
return collection5_key.encode(key);
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return collection5_key.encodeRange({
gt: gt ? collection5_indexify(gt) : null,
lt: lt ? collection5_indexify(lt) : null,
gte: gte ? collection5_indexify(gte) : null,
lte: lte ? collection5_indexify(lte) : null
});
},
encodeValue(version3, record) {
setVersion2(version3);
return import_compact_encoding3.default.encode(collection5_enc, record);
},
trigger: null,
reconstruct: collection5_reconstruct,
reconstructKey: collection5_reconstruct_key,
indexes: []
};
var index6_key = new import_index_encoder.default([
import_index_encoder.default.STRING,
import_index_encoder.default.STRING
], { prefix: 6 });
function index6_indexify(record) {
const arr = [];
const a0 = record.schemaId;
if (a0 === void 0) return arr;
arr.push(a0);
const a1 = record.queryId;
if (a1 === void 0) return arr;
arr.push(a1);
return arr;
}
var index6 = {
name: "@sheets/queries-by-schema",
id: 6,
encodeKey(record) {
return index6_key.encode(index6_indexify(record));
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return index6_key.encodeRange({
gt: gt ? index6_indexify(gt) : null,
lt: lt ? index6_indexify(lt) : null,
gte: gte ? index6_indexify(gte) : null,
lte: lte ? index6_indexify(lte) : null
});
},
encodeValue: (doc) => index6.collection.encodeKey(doc),
encodeIndexKeys(record, context) {
return [index6_key.encode([record.schemaId, record.queryId])];
},
reconstruct: (keyBuf, valueBuf) => valueBuf,
offset: collection3.indexes.length,
collection: collection3
};
collection3.indexes.push(index6);
var index7_key = new import_index_encoder.default([
import_index_encoder.default.STRING,
import_index_encoder.default.STRING
], { prefix: 7 });
function index7_indexify(record) {
const arr = [];
const a0 = record.schemaId;
if (a0 === void 0) return arr;
arr.push(a0);
const a1 = record.uischemaId;
if (a1 === void 0) return arr;
arr.push(a1);
return arr;
}
var index7 = {
name: "@sheets/uischema-by-schema",
id: 7,
encodeKey(record) {
return index7_key.encode(index7_indexify(record));
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return index7_key.encodeRange({
gt: gt ? index7_indexify(gt) : null,
lt: lt ? index7_indexify(lt) : null,
gte: gte ? index7_indexify(gte) : null,
lte: lte ? index7_indexify(lte) : null
});
},
encodeValue: (doc) => index7.collection.encodeKey(doc),
encodeIndexKeys(record, context) {
return [index7_key.encode([record.schemaId, record.uischemaId])];
},
reconstruct: (keyBuf, valueBuf) => valueBuf,
offset: collection4.indexes.length,
collection: collection4
};
collection4.indexes.push(index7);
var index8_key = new import_index_encoder.default([
import_index_encoder.default.STRING,
import_index_encoder.default.UINT,
import_index_encoder.default.STRING
], { prefix: 8 });
function index8_indexify(record) {
const arr = [];
const a0 = record.schemaId;
if (a0 === void 0) return arr;
arr.push(a0);
const a1 = record.time;
if (a1 === void 0) return arr;
arr.push(a1);
const a2 = record.uuid;
if (a2 === void 0) return arr;
arr.push(a2);
return arr;
}
var index8 = {
name: "@sheets/rows-by-schema-time",
id: 8,
encodeKey(record) {
return index8_key.encode(index8_indexify(record));
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return index8_key.encodeRange({
gt: gt ? index8_indexify(gt) : null,
lt: lt ? index8_indexify(lt) : null,
gte: gte ? index8_indexify(gte) : null,
lte: lte ? index8_indexify(lte) : null
});
},
encodeValue: (doc) => index8.collection.encodeKey(doc),
encodeIndexKeys(record, context) {
return [index8_key.encode([record.schemaId, record.time, record.uuid])];
},
reconstruct: (keyBuf, valueBuf) => valueBuf,
offset: collection2.indexes.length,
collection: collection2
};
collection2.indexes.push(index8);
var index9_key = new import_index_encoder.default([
import_index_encoder.default.BUFFER,
import_index_encoder.default.UINT,
import_index_encoder.default.STRING
], { prefix: 9 });
function index9_indexify(record) {
const arr = [];
const a0 = record.memberkey;
if (a0 === void 0) return arr;
arr.push(a0);
const a1 = record.time;
if (a1 === void 0) return arr;
arr.push(a1);
const a2 = record.uuid;
if (a2 === void 0) return arr;
arr.push(a2);
return arr;
}
var index9 = {
name: "@sheets/rows-by-member-time",
id: 9,
encodeKey(record) {
return index9_key.encode(index9_indexify(record));
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return index9_key.encodeRange({
gt: gt ? index9_indexify(gt) : null,
lt: lt ? index9_indexify(lt) : null,
gte: gte ? index9_indexify(gte) : null,
lte: lte ? index9_indexify(lte) : null
});
},
encodeValue: (doc) => index9.collection.encodeKey(doc),
encodeIndexKeys(record, context) {
return [index9_key.encode([record.memberkey, record.time, record.uuid])];
},
reconstruct: (keyBuf, valueBuf) => valueBuf,
offset: collection2.indexes.length,
collection: collection2
};
collection2.indexes.push(index9);
var index10_key = new import_index_encoder.default([
import_index_encoder.default.STRING,
import_index_encoder.default.STRING
], { prefix: 10 });
function index10_indexify(record) {
const arr = [];
const a0 = record.rowUuid;
if (a0 === void 0) return arr;
arr.push(a0);
const a1 = record.attestationUuid;
if (a1 === void 0) return arr;
arr.push(a1);
return arr;
}
var index10 = {
name: "@sheets/row-attestations-by-row",
id: 10,
encodeKey(record) {
return index10_key.encode(index10_indexify(record));
},
encodeKeyRange({ gt, lt, gte, lte } = {}) {
return index10_key.encodeRange({
gt: gt ? index10_indexify(gt) : null,
lt: lt ? index10_indexify(lt) : null,
gte: gte ? index10_indexify(gte) : null,
lte: lte ? index10_indexify(lte) : null
});
},
encodeValue: (doc) => index10.collection.encodeKey(doc),
encodeIndexKeys(record, context) {
return [index10_key.encode([record.rowUuid, record.attestationUuid])];
},
reconstruct: (keyBuf, valueBuf) => valueBuf,
offset: collection5.indexes.length,
collection: collection5
};
collection5.indexes.push(index10);
var collections = [
collection0,
collection1,
collection2,
collection3,
collection4,
collection5
];
var indexes = [
index6,
index7,
index8,
index9,
index10
];
var db_default = { version: version2, collections, indexes, resolveCollection, resolveIndex };
function resolveCollection(name) {
switch (name) {
case "@sheets/members":
return collection0;
case "@sheets/jsonschema":
return collection1;
case "@sheets/row":
return collection2;
case "@sheets/queries":
return collection3;
case "@sheets/uischemas":
return collection4;
case "@sheets/row-attestations":
return collection5;
default:
return null;
}
}
function resolveIndex(name) {
switch (name) {
case "@sheets/queries-by-schema":
return index6;
case "@sheets/uischema-by-schema":
return index7;
case "@sheets/rows-by-schema-time":
return index8;
case "@sheets/rows-by-member-time":
return index9;
case "@sheets/row-attestations-by-row":
return index10;
default:
return null;
}
}
// node_modules/schema-sheets/routes/members.mjs
async function updateMember(data, ctx) {
const indexer = ctx.seq === 0 && ctx.writer.equals(ctx.host.key);
if (ctx.seq === 0 && !ctx.writer.equals(ctx.host.key)) {
await ctx.host.addWriter(ctx.writer, { isIndexer: indexer });
}
await ctx.view.insert("@sheets/members", {
key: ctx.writer,
indexer,
name: data.name
});
}
// node_modules/schema-sheets/routes/sheets.mjs
var import_ajv = __toESM(require_ajv(), 1);
var import_ajv_formats = __toESM(require_dist(), 1);
var import_keet_identity_key = __toESM(require_keet_identity_key(), 1);
var import_b4a3 = __toESM(require_b4a(), 1);
var NOT_FOUND = 404;
var SCHEMA_VALIDATION_FAILED = 501;
var INVALID_SCHEMA = 502;
var ajv = new import_ajv.default({ strict: false });
(0, import_ajv_formats.default)(ajv);
async function setNamedSchema(data, ctx) {
const { schemaId, jsonSchema, name, metadata } = data;
try {
ajv.compile(jsonSchema);
} catch (error) {
return { ok: false, code: INVALID_SCHEMA, error: error.message };
}
await ctx.view.insert("@sheets/jsonschema", { schemaId, jsonSchema, name, metadata });
return { ok: true };
}
async function deleteNamedSchema(data, ctx) {
const { schemaId } = data;
await ctx.view.delete("@sheets/jsonschema", { schemaId });
return { ok: true };
}
async function setRow(data, ctx) {
const { uuid, schemaId, json, time } = data;
const memberkey = ctx.writer;
const schema = await ctx.view.get("@sheets/jsonschema", { schemaId });
if (!schema) return { ok: false, code: NOT_FOUND };
const validate = ajv.compile(schema.jsonSchema);
const valid = validate(json);
if (!valid) {
return {
ok: false,
code: SCHEMA_VALIDATION_FAILED,
errors: validate.errors
};
}
const entry = { uuid, schemaId, time, json, memberkey };
await ctx.view.insert("@sheets/row", entry);
return { ok: true };
}
async function deleteRow(data, ctx) {
const { uuid } = data;
await ctx.view.delete("@sheets/row", { uuid });
return { ok: true };
}
async function setQuery(data, ctx) {
const { queryId, schemaId, name, JMESPathQuery, listView } = data;
const memberkey = ctx.writer;
const entry = { queryId, schemaId, name, JMESPathQuery, listView, memberkey };
await ctx.view.insert("@sheets/queries", entry);
return { ok: true };
}
async function deleteQuery(data, ctx) {
const { queryId } = data;
await ctx.view.delete("@sheets/queries", { queryId });
return { ok: true };
}
async function setUISchema(data, ctx) {
const { uischemaId, schemaId, uiSchema, name } = data;
const memberkey = ctx.writer;
const schema = await ctx.view.get("@sheets/jsonschema", { schemaId });
if (!schema) return { ok: false, code: NOT_FOUND };
const entry = { uischemaId, schemaId, uiSchema, name, memberkey };
await ctx.view.insert("@sheets/uischemas", entry);
return { ok: true };
}
async function deleteUISchema(data, ctx) {
const { uischemaId } = data;
await ctx.view.delete("@sheets/uischemas", { uischemaId });
return { ok: true };
}
async function addRowAttestation(data, ctx) {
const { attestationUuid, rowUuid, time, proof, keetUsername } = data;
const memberkey = ctx.writer;
const existing = await ctx.view.get("@sheets/row-attestations", { attestationUuid });
if (existing) {
return { ok: false, code: 409, error: "Attestation already exists" };
}
const row = await ctx.view.get("@sheets/row", { uuid: rowUuid });
if (!row) return { ok: false, code: NOT_FOUND };
const message = import_b4a3.default.from(JSON.stringify(row.json));
const messageInfo = import_keet_identity_key.default.verify(proof, message);
if (!messageInfo) {
return { ok: false, code: 401, error: "Message verification failed" };
}
const entry = { attestationUuid, rowUuid, time, proof, memberkey, keetUsername };
await ctx.view.insert("@sheets/row-attestations", entry);
return { ok: true };
}
// node_modules/schema-sheets/index.mjs
function randomUUID() {
const bytes = (0, import_hypercore_crypto.randomBytes)(32);
return import_z32.default.encode(bytes);
}
var SchemaSheets = class {
constructor(store, key, opts = {}) {
this.store = store;
this.encryptionKey = opts.encryptionKey || null;
this.base = new import_autobase.default(store, key, {
...opts,
optimistic: true,
open: this._autobaseOpen.bind(this),
apply: this._autobaseApply.bind(this),
close: this._autobaseClose.bind(this)
});
this.router = new Router();
this._setupRoutes();
}
/* Private */
_setupRoutes() {
this.router.add("@sheets/update-member", updateMember);
this.router.add("@sheets/set-named-schema", setNamedSchema);
this.router.add("@sheets/delete-named-schema", deleteNamedSchema);
this.router.add("@sheets/set-row", setRow);
this.router.add("@sheets/delete-row", deleteRow);
this.router.add("@sheets/set-query", setQuery);
this.router.add("@sheets/delete-query", deleteQuery);
this.router.add("@sheets/set-uischema", setUISchema);
this.router.add("@sheets/delete-uischema", deleteUISchema);
this.router.add("@sheets/add-row-attestation", addRowAttestation);
}
_autobaseOpen(store) {
return import_hyperdb.default.bee(store.get("sheets"), db_default, {
extension: false,
autoUpdate: true
});
}
_autobaseClose(view) {
return view.close();
}
async _autobaseApply(nodes, view, host) {
for (const node of nodes) {
await this.router.dispatch(node.value, {
writer: node.from.key,
seq: node.length - 1,
view,
host
});
}
await view.flush();
}
/* Public general functions */
get db() {
return this.base.view;
}
get key() {
return this.base.key;
}
async ready() {
await this.base.ready();
}
close() {
this.base.close();
return this.store.close();
}
async joined() {
await this.base.ready();
return this.base.local.length > 0;
}
async join(name) {
await this.base.append(encode("@sheets/update-member", { name }), { optimistic: true });
}
/* Feature functions */
async addNewSchema(name, jsonSchema, metadata) {
if (!await this.joined()) return null;
const schemaId = randomUUID();
await this.base.append(encode("@sheets/set-named-schema", {
schemaId,
name,
jsonSchema,
metadata
}));
return schemaId;
}
async updateSchema(schemaId, jsonSchema, metadata) {
if (!await this.joined()) return false;
const existing = await this.db.get("@sheets/jsonschema", { schemaId });
if (!existing) return false;
await this.base.append(encode("@sheets/set-named-schema", {
schemaId,
name: existing.name,
jsonSchema,
metadata: metadata !== void 0 ? metadata : existing.metadata
}));
return true;
}
async renameSchema(schemaId, name) {
if (!await this.joined()) return false;
const existing = await this.db.get("@sheets/jsonschema", { schemaId });
if (!existing) return false;
await this.base.append(encode("@sheets/set-named-schema", {
schemaId,
name,
jsonSchema: existing.jsonSchema,
metadata: existing.metadata
}));
return true;
}
async getRow(schemaId, rowUuid) {
return await this.db.get("@sheets/row", { uuid: rowUuid });
}
async addRow(schemaId, json, _time) {
if (!await this.joined()) return null;
const uuid = randomUUID();
const time = _time ? new Date(_time).getTime() : Date.now();
await this.base.append(encode("@sheets/set-row", {
uuid,
schemaId,
json,
time
}));
return uuid;
}
async updateRow(uuid, json) {
if (!await this.joined()) return false;
const existing = await this.db.get("@sheets/row", { uuid });
if (!existing) return false;
await this.base.append(encode("@sheets/set-row", {
uuid,
schemaId: existing.schemaId,
json,
time: Date.now()
}));
return true;
}
async deleteRow(uuid) {
if (!await this.joined()) return false;
await this.base.append(encode("@sheets/delete-row", { uuid }));
return true;
}
async list(schemaId, opts = {}) {
const _opts = {
...opts,
gte: { schemaId, time: opts.gte || 0 },
lte: { schemaId, time: opts.lte || Date.now() }
};
const results = await this.db.find("@sheets/rows-by-schema-time", _opts).toArray();
if (!opts.query) return results;
const query = compile(opts.query);
return results.map((row) => {
const matched = TreeInterpreter2.search(query, [row.json]);
if (matched === null || !matched.length) return null;
return {
...row,
json: matched[0]
};
}).filter((row) => row !== null);
}
async listSchemas() {
return await this.db.find("@sheets/jsonschema").toArray();
}
async addQuery(schemaId, name, JMESPathQuery, listView) {
if (!await this.joined()) return null;
const queryId = randomUUID();
await this.base.append(encode("@sheets/set-query", {
queryId,
schemaId,
name,
JMESPathQuery,
listView
}));
return queryId;
}
async updateQuery(queryId, schemaId, name, JMESPathQuery, listView) {
if (!await this.joined()) return false;
await this.base.append(encode("@sheets/set-query", {
queryId,
schemaId,
name,
JMESPathQuery,
listView
}));
return true;
}
async deleteQuery(queryId) {
if (!await this.joined()) return false;
await this.base.append(encode("@sheets/delete-query", { queryId }));
return true;
}
async listQueries(schemaId) {
if (!schemaId) {
return await this.db.find("@sheets/queries-by-schema").toArray();
}
return await this.db.find("@sheets/queries-by-schema", { gte: { schemaId }, lte: { schemaId } }).toArray();
}
async addUISchema(schemaId, name, uiSchema) {
if (!await this.joined()) return null;
const uischemaId = randomUUID();
await this.base.append(encode("@sheets/set-uischema", {
uischemaId,
schemaId,
name,
uiSchema
}));
return uischemaId;
}
async updateUISchema(uischemaId, schemaId, name, uiSchema) {
if (!await this.joined()) return false;
await this.base.append(encode("@sheets/set-uischema", {
uischemaId,
schemaId,
name,
uiSchema
}));
return true;
}
async deleteUISchema(uischemaId) {
if (!await this.joined()) return false;
await this.base.append(encode("@sheets/delete-uischema", { uischemaId }));
return true;
}
async listUISchemas(schemaId) {
if (schemaId) {
return await this.db.find("@sheets/uischema-by-schema", { gte: { schemaId }, lte: { schemaId } }).toArray();
}
return await this.db.find("@sheets/uischemas").toArray();
}
async addRowAttestation(rowUuid, proof, keetUsername) {
if (!await this.joined()) return null;
const attestationUuid = randomUUID();
const time = Date.now();
const attest = {
attestationUuid,
rowUuid,
time,
proof,
keetUsername
};
await this.base.append(encode("@sheets/add-row-attestation", attest));
return attestationUuid;
}
async listRowAttestations(rowUuid) {
return await this.db.find("@sheets/row-attestations-by-row", { gte: { rowUuid }, lte: { rowUuid } }).toArray();
}
};
// backend/sheets-import.mjs
var sheets_import_default = SchemaSheets;