deepClone = function deepClone(value, seen = new WeakMap()) {
if (value !== Object(value)) return value;
if (seen.has(value)) return seen.get(value);
let result;
try {
result = new value.constructor();
} catch {
result = Object.create(Object.getPrototypeOf(value));
}
if (typeof value === "function")
result = function(...args) {
return value.apply(this, args);
};
seen.set(value, result);
for (const key of Object.keys(value)) {
result[key] = deepClone(value[key], seen);
}
return result;
}