From 616919fda715f93732e21a37030da15f82fe0394 Mon Sep 17 00:00:00 2001 From: rNLKJA <62606765+rNLKJA@users.noreply.github.com> Date: Tue, 6 Oct 2026 00:58:18 +1030 Subject: [PATCH 01/18] feat(stats): add statistics helpers verified against scipy and R Wilson and Newcombe intervals, seeded percentile bootstrap (plain, stratified, paired and vector-valued), Wilcoxon signed-rank (exact and tie-corrected normal approximation) with rank-biserial effect size, Bradley-Terry by MM with an Elo conversion, type-7 quantiles and high-precision normal functions. Unit tests pin reference values from scipy 1.17, statsmodels and R. Co-Authored-By: Claude Opus 5.5 --- web/src/lib/stats/bootstrap.ts | 152 +++++++++++++++++ web/src/lib/stats/bradley-terry.ts | 107 ++++++++++++ web/src/lib/stats/descriptive.ts | 73 ++++++++ web/src/lib/stats/format.ts | 37 ++++ web/src/lib/stats/normal.ts | 116 +++++++++++++ web/src/lib/stats/proportion.ts | 71 ++++++++ web/src/lib/stats/stats.test.ts | 260 +++++++++++++++++++++++++++++ web/src/lib/stats/wilcoxon.ts | 108 ++++++++++++ 8 files changed, 924 insertions(+) create mode 100644 web/src/lib/stats/bootstrap.ts create mode 100644 web/src/lib/stats/bradley-terry.ts create mode 100644 web/src/lib/stats/descriptive.ts create mode 100644 web/src/lib/stats/format.ts create mode 100644 web/src/lib/stats/normal.ts create mode 100644 web/src/lib/stats/proportion.ts create mode 100644 web/src/lib/stats/stats.test.ts create mode 100644 web/src/lib/stats/wilcoxon.ts diff --git a/web/src/lib/stats/bootstrap.ts b/web/src/lib/stats/bootstrap.ts new file mode 100644 index 0000000..d2982ed --- /dev/null +++ b/web/src/lib/stats/bootstrap.ts @@ -0,0 +1,152 @@ +/** + * Seeded percentile bootstrap. Every interval records its seed and number of + * resamples so a result on the site can be reproduced exactly. + */ +import { createRng } from "@/lib/rng"; +import { mean, quantileSorted, sd } from "./descriptive"; + +export interface BootstrapOptions { + /** Number of resamples (default 2000). */ + reps?: number; + /** Confidence level (default 0.95). */ + level?: number; + /** Seed for the resampling RNG. */ + seed: number; +} + +export interface BootstrapCI { + /** The statistic on the original sample. */ + estimate: number; + lower: number; + upper: number; + level: number; + reps: number; + seed: number; +} + +/** Percentile interval of a bootstrap distribution (type-7 quantiles). */ +export function percentileInterval( + replicates: readonly number[], + level: number, +): { lower: number; upper: number } { + const finite = replicates.filter(Number.isFinite).sort((a, b) => a - b); + if (finite.length === 0) return { lower: NaN, upper: NaN }; + const alpha = (1 - level) / 2; + return { lower: quantileSorted(finite, alpha), upper: quantileSorted(finite, 1 - alpha) }; +} + +/** Bootstrap a statistic of one sample by resampling its elements with replacement. */ +export function bootstrap( + data: readonly T[], + statistic: (sample: readonly T[]) => number, + { reps = 2000, level = 0.95, seed }: BootstrapOptions, +): BootstrapCI { + const estimate = statistic(data); + const n = data.length; + if (n === 0) return { estimate, lower: NaN, upper: NaN, level, reps, seed }; + const rng = createRng(seed); + const sample = new Array(n); + const replicates = new Array(reps); + for (let b = 0; b < reps; b++) { + for (let i = 0; i < n; i++) sample[i] = data[Math.floor(rng() * n)]; + replicates[b] = statistic(sample); + } + return { estimate, ...percentileInterval(replicates, level), level, reps, seed }; +} + +/** + * Stratified bootstrap: resample within each stratum independently, keeping + * stratum sizes fixed (e.g. games within each pairing of a round robin). + */ +export function stratifiedBootstrap( + strata: readonly (readonly T[])[], + statistic: (strata: readonly (readonly T[])[]) => number, + { reps = 2000, level = 0.95, seed }: BootstrapOptions, +): BootstrapCI { + const estimate = statistic(strata); + const rng = createRng(seed); + const samples = strata.map((s) => new Array(s.length)); + const replicates = new Array(reps); + for (let b = 0; b < reps; b++) { + strata.forEach((s, k) => { + const out = samples[k]; + for (let i = 0; i < s.length; i++) out[i] = s[Math.floor(rng() * s.length)]; + }); + replicates[b] = statistic(samples); + } + return { estimate, ...percentileInterval(replicates, level), level, reps, seed }; +} + +/** Bootstrap CI for a mean. */ +export const bootstrapMean = (xs: readonly number[], opts: BootstrapOptions) => + bootstrap(xs, mean, opts); + +export interface PairedDifference { + n: number; + meanX: number; + meanY: number; + /** Mean of the paired differences x - y, with a paired bootstrap CI. */ + meanDiff: BootstrapCI; + /** Cohen's d_z: mean difference / SD of the differences. */ + dz: number; +} + +/** + * Paired comparison of two measurements on the same units: resamples the + * units (pairs), never the two arms independently. + */ +export function pairedMeanDifference( + x: readonly number[], + y: readonly number[], + opts: BootstrapOptions, +): PairedDifference { + if (x.length !== y.length) throw new RangeError("paired samples must have equal length"); + const d = x.map((xi, i) => xi - y[i]); + const s = sd(d); + return { + n: d.length, + meanX: mean(x), + meanY: mean(y), + meanDiff: bootstrapMean(d, opts), + dz: s > 0 ? mean(d) / s : 0, + }; +} + +/** + * Stratified bootstrap of a vector-valued statistic (e.g. every player's + * strength from one refit), with a percentile interval per component. + */ +export function stratifiedBootstrapVector( + strata: readonly (readonly T[])[], + statistic: (strata: readonly (readonly T[])[]) => number[], + { reps = 2000, level = 0.95, seed }: BootstrapOptions, +): { + estimate: number[]; + lower: number[]; + upper: number[]; + level: number; + reps: number; + seed: number; +} { + const estimate = statistic(strata); + const rng = createRng(seed); + const samples = strata.map((s) => new Array(s.length)); + const replicates: number[][] = estimate.map(() => new Array(reps)); + for (let b = 0; b < reps; b++) { + strata.forEach((s, k) => { + const out = samples[k]; + for (let i = 0; i < s.length; i++) out[i] = s[Math.floor(rng() * s.length)]; + }); + const value = statistic(samples); + value.forEach((v, c) => (replicates[c][b] = v)); + } + const intervals = replicates.map((r) => percentileInterval(r, level)); + return { + estimate, + lower: intervals.map((i) => i.lower), + upper: intervals.map((i) => i.upper), + level, + reps, + seed, + }; +} diff --git a/web/src/lib/stats/bradley-terry.ts b/web/src/lib/stats/bradley-terry.ts new file mode 100644 index 0000000..3c853e3 --- /dev/null +++ b/web/src/lib/stats/bradley-terry.ts @@ -0,0 +1,107 @@ +/** + * Bradley-Terry strengths from pairwise results, fitted by the + * minorisation-maximisation (MM) algorithm of Hunter (2004). + * + * P(i beats j) = p_i / (p_i + p_j). Draws count as half a win to each side. + * Strengths are returned on the log scale (theta_i = ln p_i, mean zero) and on + * the Elo scale (400 · log10 p_i), optionally anchored to a reference player. + * + * `prior` adds that many virtual drawn games to every pairing that was played + * (a light shrinkage towards equal strength). Without it, an agent that wins + * or loses every game has an infinite maximum-likelihood strength. + */ + +export interface PairOutcome { + /** Index of the first player. */ + i: number; + /** Index of the second player. */ + j: number; + /** Points scored by i against j (wins + draws / 2). */ + scoreI: number; + /** Points scored by j against i. */ + scoreJ: number; +} + +export interface BradleyTerryOptions { + /** Virtual drawn games added to each played pairing (default 1, i.e. +0.5 points each side). */ + prior?: number; + maxIter?: number; + tol?: number; +} + +export interface BradleyTerryFit { + /** ln p_i, centred so the mean is zero. */ + theta: number[]; + iterations: number; + converged: boolean; +} + +export function fitBradleyTerry( + k: number, + outcomes: readonly PairOutcome[], + { prior = 1, maxIter = 10_000, tol = 1e-10 }: BradleyTerryOptions = {}, +): BradleyTerryFit { + // Aggregate into a symmetric matrix of points and games. + const points = Array.from({ length: k }, () => new Float64Array(k)); + const games = Array.from({ length: k }, () => new Float64Array(k)); + for (const { i, j, scoreI, scoreJ } of outcomes) { + if (i === j) continue; + points[i][j] += scoreI; + points[j][i] += scoreJ; + games[i][j] += scoreI + scoreJ; + games[j][i] += scoreI + scoreJ; + } + if (prior > 0) { + for (let i = 0; i < k; i++) { + for (let j = 0; j < k; j++) { + if (i !== j && games[i][j] > 0) { + points[i][j] += prior / 2; + games[i][j] += prior; + } + } + } + } + + const wins = points.map((row) => row.reduce((s, v) => s + v, 0)); + let p = new Float64Array(k).fill(1); + let iterations = 0; + let converged = false; + for (; iterations < maxIter; iterations++) { + const next = new Float64Array(k); + for (let i = 0; i < k; i++) { + let denom = 0; + for (let j = 0; j < k; j++) { + if (i !== j && games[i][j] > 0) denom += games[i][j] / (p[i] + p[j]); + } + next[i] = denom > 0 ? wins[i] / denom : p[i]; + } + // Normalise to geometric mean 1 so the fit is identifiable. + const logMean = next.reduce((s, v) => s + Math.log(v), 0) / k; + const scale = Math.exp(logMean); + let change = 0; + for (let i = 0; i < k; i++) { + next[i] /= scale; + change = Math.max(change, Math.abs(Math.log(next[i]) - Math.log(p[i]))); + } + p = next; + if (change < tol) { + converged = true; + iterations++; + break; + } + } + const theta = Array.from(p, (v) => Math.log(v)); + const centre = theta.reduce((s, v) => s + v, 0) / k; + return { theta: theta.map((t) => t - centre), iterations, converged }; +} + +/** Convert natural-log strengths to Elo points (400 per factor of 10 in odds). */ +export const ELO_PER_NAT = 400 / Math.LN10; + +export function toElo(theta: readonly number[], anchor?: number): number[] { + const offset = anchor === undefined ? 0 : theta[anchor]; + return theta.map((t) => (t - offset) * ELO_PER_NAT); +} + +/** Expected score of a player rated `a` against one rated `b` on the Elo scale. */ +export const eloExpected = (a: number, b: number) => 1 / (1 + 10 ** ((b - a) / 400)); diff --git a/web/src/lib/stats/descriptive.ts b/web/src/lib/stats/descriptive.ts new file mode 100644 index 0000000..fb95825 --- /dev/null +++ b/web/src/lib/stats/descriptive.ts @@ -0,0 +1,73 @@ +/** Descriptive statistics. Every function treats its input as read-only. */ + +export function sum(xs: readonly number[]): number { + let s = 0; + for (const x of xs) s += x; + return s; +} + +export function mean(xs: readonly number[]): number { + if (xs.length === 0) return NaN; + return sum(xs) / xs.length; +} + +/** Sample variance (ddof = 1 by default, like R's var and numpy's var(ddof=1)). */ +export function variance(xs: readonly number[], ddof = 1): number { + if (xs.length - ddof <= 0) return NaN; + const m = mean(xs); + let ss = 0; + for (const x of xs) ss += (x - m) ** 2; + return ss / (xs.length - ddof); +} + +export const sd = (xs: readonly number[], ddof = 1) => Math.sqrt(variance(xs, ddof)); + +/** + * Quantile with linear interpolation between order statistics: R's default + * type 7 and numpy's default "linear" method. + */ +export function quantile(xs: readonly number[], p: number): number { + if (xs.length === 0) return NaN; + const sorted = [...xs].sort((a, b) => a - b); + return quantileSorted(sorted, p); +} + +/** As `quantile`, for input that is already sorted ascending. */ +export function quantileSorted(sorted: readonly number[], p: number): number { + const n = sorted.length; + if (n === 0) return NaN; + if (p <= 0) return sorted[0]; + if (p >= 1) return sorted[n - 1]; + const h = (n - 1) * p; + const lo = Math.floor(h); + const hi = Math.min(lo + 1, n - 1); + return sorted[lo] + (h - lo) * (sorted[hi] - sorted[lo]); +} + +export const median = (xs: readonly number[]) => quantile(xs, 0.5); + +/** Geometric mean of strictly positive values. */ +export function geometricMean(xs: readonly number[]): number { + if (xs.length === 0) return NaN; + return Math.exp(mean(xs.map(Math.log))); +} + +/** + * Average ranks (1-based) with ties sharing the mean of the ranks they span, + * plus the sizes of each tie group (used for variance corrections). + */ +export function rankWithTies(xs: readonly number[]): { ranks: number[]; tieSizes: number[] } { + const order = xs.map((x, i) => [x, i] as const).sort((a, b) => a[0] - b[0]); + const ranks = new Array(xs.length); + const tieSizes: number[] = []; + let i = 0; + while (i < order.length) { + let j = i; + while (j + 1 < order.length && order[j + 1][0] === order[i][0]) j++; + const avg = (i + j) / 2 + 1; + for (let k = i; k <= j; k++) ranks[order[k][1]] = avg; + tieSizes.push(j - i + 1); + i = j + 1; + } + return { ranks, tieSizes }; +} diff --git a/web/src/lib/stats/format.ts b/web/src/lib/stats/format.ts new file mode 100644 index 0000000..bf17090 --- /dev/null +++ b/web/src/lib/stats/format.ts @@ -0,0 +1,37 @@ +/** Consistent number formatting for estimates and intervals (en-AU). */ + +export function formatPct(p: number, digits = 1): string { + if (!Number.isFinite(p)) return "–"; + return `${(p * 100).toFixed(digits)}%`; +} + +/** "[83.4%, 93.8%]" */ +export function formatPctInterval(lower: number, upper: number, digits = 1): string { + return `[${formatPct(lower, digits)}, ${formatPct(upper, digits)}]`; +} + +export function formatNumber(x: number, digits = 1): string { + if (!Number.isFinite(x)) return x > 0 ? "+∞" : x < 0 ? "−∞" : "–"; + const s = x.toLocaleString("en-AU", { + minimumFractionDigits: digits, + maximumFractionDigits: digits, + }); + return s.replace(/^-/, "−"); +} + +export function formatSigned(x: number, digits = 1): string { + const s = formatNumber(x, digits); + return x > 0 ? `+${s}` : s; +} + +/** "[−12.3, 4.5]" */ +export function formatInterval(lower: number, upper: number, digits = 1): string { + return `[${formatNumber(lower, digits)}, ${formatNumber(upper, digits)}]`; +} + +/** p-values: "< 0.001" or three significant decimals. */ +export function formatP(p: number): string { + if (!Number.isFinite(p)) return "–"; + if (p < 0.001) return "< 0.001"; + return p.toFixed(3); +} diff --git a/web/src/lib/stats/normal.ts b/web/src/lib/stats/normal.ts new file mode 100644 index 0000000..5056db3 --- /dev/null +++ b/web/src/lib/stats/normal.ts @@ -0,0 +1,116 @@ +/** + * Standard normal distribution helpers, accurate to near double precision. + * + * erf / erfc use a positive-term series for small arguments and a continued + * fraction (modified Lentz) for large ones, so there is no catastrophic + * cancellation in the tails that Wilcoxon p-values live in. + */ + +const SQRT_PI = Math.sqrt(Math.PI); + +/** erf(x) for 0 <= x < 2 via erf(x) = 2/sqrt(pi) e^{-x^2} sum 2^n x^{2n+1} / (2n+1)!! */ +function erfSeries(x: number): number { + const x2 = x * x; + let term = x; + let sum = x; + for (let n = 1; n < 200; n++) { + term *= (2 * x2) / (2 * n + 1); + sum += term; + if (term < sum * 1e-17) break; + } + return (2 / SQRT_PI) * Math.exp(-x2) * sum; +} + +/** erfc(x) for x >= 2 via its continued fraction. */ +function erfcContinuedFraction(x: number): number { + // erfc(x) = e^{-x^2}/sqrt(pi) * 1/(x + (1/2)/(x + 1/(x + (3/2)/(x + 2/(x + ...))))) + const tiny = 1e-300; + let f = x; + if (f === 0) f = tiny; + let c = f; + let d = 0; + for (let i = 1; i < 5000; i++) { + const a = i / 2; + d = x + a * d; + d = d === 0 ? tiny : d; + c = x + a / c; + c = c === 0 ? tiny : c; + d = 1 / d; + const delta = c * d; + f *= delta; + if (Math.abs(delta - 1) < 1e-16) break; + } + return Math.exp(-x * x) / SQRT_PI / f; +} + +export function erfc(x: number): number { + if (Number.isNaN(x)) return NaN; + if (x < 0) return 2 - erfc(-x); + if (x < 2) return 1 - erfSeries(x); + return erfcContinuedFraction(x); +} + +export function erf(x: number): number { + return 1 - erfc(x); +} + +/** P(Z <= z) for a standard normal Z. */ +export function normalCdf(z: number): number { + return 0.5 * erfc(-z / Math.SQRT2); +} + +/** P(Z > z), computed directly so small upper tails keep their precision. */ +export function normalSf(z: number): number { + return 0.5 * erfc(z / Math.SQRT2); +} + +/** + * Inverse standard normal CDF. Acklam's rational approximation (relative + * error about 1e-9) refined with one Halley step against normalCdf. + */ +export function normalQuantile(p: number): number { + if (!(p > 0 && p < 1)) { + if (p === 0) return -Infinity; + if (p === 1) return Infinity; + return NaN; + } + const a = [ + -3.969683028665376e1, 2.209460984245205e2, -2.759285104469687e2, 1.38357751867269e2, + -3.066479806614716e1, 2.506628277459239, + ]; + const b = [ + -5.447609879822406e1, 1.615858368580409e2, -1.556989798598866e2, 6.680131188771972e1, + -1.328068155288572e1, + ]; + const c = [ + -7.784894002430293e-3, -3.223964580411365e-1, -2.400758277161838, -2.549732539343734, + 4.374664141464968, 2.938163982698783, + ]; + const d = [7.784695709041462e-3, 3.224671290700398e-1, 2.445134137142996, 3.754408661907416]; + const lo = 0.02425; + let x: number; + if (p < lo) { + const q = Math.sqrt(-2 * Math.log(p)); + x = + (((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) / + ((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1); + } else if (p <= 1 - lo) { + const q = p - 0.5; + const r = q * q; + x = + ((((((a[0] * r + a[1]) * r + a[2]) * r + a[3]) * r + a[4]) * r + a[5]) * q) / + (((((b[0] * r + b[1]) * r + b[2]) * r + b[3]) * r + b[4]) * r + 1); + } else { + const q = Math.sqrt(-2 * Math.log(1 - p)); + x = + -(((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) / + ((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1); + } + // One Halley refinement step. + const e = normalCdf(x) - p; + const u = e * Math.sqrt(2 * Math.PI) * Math.exp((x * x) / 2); + return x - u / (1 + (x * u) / 2); +} + +/** Two-sided critical value for a confidence level, e.g. 0.95 → 1.959964. */ +export const zCritical = (level: number) => normalQuantile(1 - (1 - level) / 2); diff --git a/web/src/lib/stats/proportion.ts b/web/src/lib/stats/proportion.ts new file mode 100644 index 0000000..4032cc5 --- /dev/null +++ b/web/src/lib/stats/proportion.ts @@ -0,0 +1,71 @@ +/** + * Confidence intervals for proportions. + * + * Wilson's score interval is used everywhere a win rate, illegal-move rate or + * agreement rate is shown: unlike the Wald interval it behaves at 0% and 100% + * and keeps close to nominal coverage for the small samples a browser can run. + */ +import { zCritical } from "./normal"; + +export interface ProportionCI { + successes: number; + n: number; + /** Point estimate successes / n (NaN when n = 0). */ + p: number; + lower: number; + upper: number; + level: number; +} + +export function wilson(successes: number, n: number, level = 0.95): ProportionCI { + if (!Number.isFinite(successes) || !Number.isFinite(n) || successes < 0 || successes > n) { + throw new RangeError(`invalid proportion ${successes}/${n}`); + } + if (n === 0) return { successes, n, p: NaN, lower: 0, upper: 1, level }; + const z = zCritical(level); + const p = successes / n; + const z2 = z * z; + const denom = 1 + z2 / n; + const centre = (p + z2 / (2 * n)) / denom; + const half = (z * Math.sqrt((p * (1 - p)) / n + z2 / (4 * n * n))) / denom; + return { + successes, + n, + p, + // Clamp exact endpoints so 0/n and n/n report exactly 0 and 1. + lower: successes === 0 ? 0 : Math.max(0, centre - half), + upper: successes === n ? 1 : Math.min(1, centre + half), + level, + }; +} + +export interface DifferenceCI { + /** p1 - p2 */ + estimate: number; + lower: number; + upper: number; + level: number; +} + +/** + * Newcombe's hybrid score interval (method 10) for the difference of two + * independent proportions, built from the two Wilson intervals. + */ +export function newcombeDifference( + x1: number, + n1: number, + x2: number, + n2: number, + level = 0.95, +): DifferenceCI { + const a = wilson(x1, n1, level); + const b = wilson(x2, n2, level); + const d = a.p - b.p; + const lower = d - Math.sqrt((a.p - a.lower) ** 2 + (b.upper - b.p) ** 2); + const upper = d + Math.sqrt((a.upper - a.p) ** 2 + (b.p - b.lower) ** 2); + return { estimate: d, lower, upper, level }; +} + +/** Cohen's h effect size for two proportions. */ +export const cohensH = (p1: number, p2: number) => + 2 * Math.asin(Math.sqrt(p1)) - 2 * Math.asin(Math.sqrt(p2)); diff --git a/web/src/lib/stats/stats.test.ts b/web/src/lib/stats/stats.test.ts new file mode 100644 index 0000000..3b632bf --- /dev/null +++ b/web/src/lib/stats/stats.test.ts @@ -0,0 +1,260 @@ +/** + * Reference values were computed with scipy 1.17.1 / statsmodels (uv, Python + * 3.12) and cross-checked with R 4.x (prop.test(correct = FALSE), + * wilcox.test, quantile(type = 7)). See "Verifying the statistics" in the + * README. + */ +import { describe, expect, it } from "vitest"; + +import { bootstrap, bootstrapMean, pairedMeanDifference, stratifiedBootstrap } from "./bootstrap"; +import { type PairOutcome, eloExpected, fitBradleyTerry, toElo } from "./bradley-terry"; +import { geometricMean, mean, median, quantile, rankWithTies, sd, variance } from "./descriptive"; +import { formatP, formatPct, formatPctInterval, formatSigned } from "./format"; +import { erf, normalCdf, normalQuantile, normalSf, zCritical } from "./normal"; +import { cohensH, newcombeDifference, wilson } from "./proportion"; +import { wilcoxonSignedRank } from "./wilcoxon"; + +describe("normal distribution", () => { + it("matches scipy.stats.norm", () => { + expect(normalCdf(1.2345)).toBeCloseTo(0.8914916766373298, 14); + expect(normalQuantile(0.975)).toBeCloseTo(1.959963984540054, 12); + expect(normalQuantile(0.001)).toBeCloseTo(-3.090232306167813, 11); + expect(normalSf(3.5) / 0.00023262907903552502).toBeCloseTo(1, 12); + expect(zCritical(0.95)).toBeCloseTo(1.959963984540054, 12); + }); + + it("is symmetric and handles the extremes", () => { + expect(normalCdf(0)).toBe(0.5); + expect(normalCdf(-2) + normalCdf(2)).toBeCloseTo(1, 15); + expect(erf(0.5)).toBeCloseTo(0.5204998778130465, 15); + expect(normalQuantile(0)).toBe(-Infinity); + expect(normalQuantile(1)).toBe(Infinity); + expect(normalQuantile(2)).toBeNaN(); + for (const p of [1e-8, 0.01, 0.3, 0.5, 0.77, 0.999999]) { + expect(normalCdf(normalQuantile(p)) / p).toBeCloseTo(1, 10); + } + }); +}); + +describe("descriptive statistics", () => { + const a = [3.1, 0.2, 5.5, 2.2, 9.9, 4.4, 1.0]; + + it("matches numpy (ddof = 1) and R type-7 quantiles", () => { + expect(variance(a)).toBeCloseTo(10.716190476190476, 12); + expect(sd(a)).toBeCloseTo(3.2735592977965857, 12); + const expected = [0.32, 1.6, 3.1, 7.26, 9.24]; + [0.025, 0.25, 0.5, 0.9, 0.975].forEach((p, i) => + expect(quantile(a, p)).toBeCloseTo(expected[i], 12), + ); + expect(median([4, 1, 3, 2])).toBe(2.5); + expect(mean([])).toBeNaN(); + expect(geometricMean([1, 100])).toBeCloseTo(10, 12); + }); + + it("does not mutate its input", () => { + const copy = [...a]; + quantile(a, 0.3); + expect(a).toEqual(copy); + }); + + it("assigns average ranks to ties", () => { + const { ranks, tieSizes } = rankWithTies([10, 20, 10, 30, 20, 20]); + expect(ranks).toEqual([1.5, 4, 1.5, 6, 4, 4]); + expect(tieSizes.sort()).toEqual([1, 2, 3]); + }); +}); + +describe("Wilson score interval", () => { + // statsmodels proportion_confint(method="wilson"); R prop.test(correct = FALSE) + it.each([ + [144, 160, 0.8437374796961266, 0.9375055641666694], + [0, 10, 0.0, 0.27753279986288926], + [10, 10, 0.7224672001371106, 1.0], + [7, 20, 0.18119182410108203, 0.5671457233147638], + [1, 4, 0.0455872608097006, 0.6993581574175982], + [17, 20, 0.639581135259243, 0.9476312541037833], + [50, 100, 0.4038315303659956, 0.5961684696340044], + ])("%i / %i", (x, n, lo, hi) => { + const ci = wilson(x, n); + expect(ci.p).toBeCloseTo(x / n, 15); + expect(ci.lower).toBeCloseTo(lo, 12); + expect(ci.upper).toBeCloseTo(hi, 12); + }); + + it("supports other confidence levels", () => { + const ci = wilson(7, 20, 0.9); + expect(ci.lower).toBeCloseTo(0.202260040056761, 12); + expect(ci.upper).toBeCloseTo(0.5334873111515284, 12); + }); + + it("is uninformative with no data and rejects impossible counts", () => { + expect(wilson(0, 0)).toMatchObject({ lower: 0, upper: 1 }); + expect(() => wilson(5, 4)).toThrow(RangeError); + expect(() => wilson(-1, 4)).toThrow(RangeError); + }); + + it("Newcombe difference interval matches statsmodels (method newcomb)", () => { + const cases: [number, number, number, number, number, number][] = [ + [144, 160, 30, 40, 0.02810942807812558, 0.3065002035431229], + [17, 20, 15, 20, -0.15171072320577428, 0.3395035190745355], + [0, 10, 5, 10, -0.7634069094874361, -0.11736746745022203], + ]; + for (const [x1, n1, x2, n2, lo, hi] of cases) { + const d = newcombeDifference(x1, n1, x2, n2); + expect(d.estimate).toBeCloseTo(x1 / n1 - x2 / n2, 15); + expect(d.lower).toBeCloseTo(lo, 12); + expect(d.upper).toBeCloseTo(hi, 12); + } + expect(cohensH(0.5, 0.5)).toBe(0); + expect(cohensH(0.9, 0.5)).toBeCloseTo(0.9272952180016122, 12); + }); +}); + +describe("Wilcoxon signed-rank test", () => { + it("normal approximation with a zero and tied ranks (scipy, correction off/on)", () => { + const x = [125, 115, 130, 140, 140, 115, 140, 125, 140, 135]; + const y = [110, 122, 125, 120, 140, 124, 123, 137, 135, 145]; + const r = wilcoxonSignedRank(x, y); + expect(r.method).toBe("approx"); + expect(r.zeros).toBe(1); + expect(r.n).toBe(9); + expect(r.statistic).toBe(18); + expect(r.pValue).toBeCloseTo(0.5936305914425295, 12); + const c = wilcoxonSignedRank(x, y, { continuityCorrection: true }); + expect(c.pValue).toBeCloseTo(0.6352893188352069, 12); + }); + + it("exact null distribution without ties (scipy method='exact', R exact = TRUE)", () => { + const d = [1.5, -0.3, 2.2, 3.1, -1.7, 0.9, 4.0, 2.6, -0.2, 1.1, 0.4, 5.3]; + const r = wilcoxonSignedRank(d); + expect(r.method).toBe("exact"); + expect(r.statistic).toBe(10); + expect(r.wPlus).toBe(68); // R's V + expect(r.pValue).toBeCloseTo(0.02099609375, 14); + const approx = wilcoxonSignedRank(d, undefined, { method: "approx" }); + expect(approx.pValue).toBeCloseTo(0.0229090993543566, 12); + expect(r.rankBiserial).toBeCloseTo((68 - 10) / 78, 14); + }); + + it("drops zeros and corrects for ties (scipy; R wilcox.test V = 95.5)", () => { + const d = [3, -1, 4, 4, 0, 2, -2, 5, 3, 0, 1, 6, -1, 2, 2, 7]; + const r = wilcoxonSignedRank(d); + expect(r.method).toBe("approx"); + expect(r.statistic).toBe(9.5); + expect(r.wPlus).toBe(95.5); + expect(r.pValue).toBeCloseTo(0.00672649504011445, 12); + expect(() => wilcoxonSignedRank(d, undefined, { method: "exact" })).toThrow(RangeError); + }); + + it("handles all-zero differences", () => { + expect(wilcoxonSignedRank([1, 2], [1, 2])).toMatchObject({ n: 0, zeros: 2, pValue: 1 }); + }); +}); + +describe("bootstrap", () => { + const xs = Array.from({ length: 40 }, (_, i) => (i * 37) % 23); + + it("is reproducible for a seed and records how it was made", () => { + const a = bootstrapMean(xs, { seed: 7, reps: 500 }); + const b = bootstrapMean(xs, { seed: 7, reps: 500 }); + expect(a).toEqual(b); + expect(a).toMatchObject({ seed: 7, reps: 500, level: 0.95 }); + expect(a.estimate).toBeCloseTo(mean(xs), 12); + expect(a.lower).toBeLessThan(a.estimate); + expect(a.upper).toBeGreaterThan(a.estimate); + }); + + it("is close to the normal-theory interval for a mean", () => { + const ci = bootstrapMean(xs, { seed: 1, reps: 4000 }); + const se = sd(xs) / Math.sqrt(xs.length); + expect(ci.upper - ci.lower).toBeGreaterThan(2 * 1.96 * se * 0.85); + expect(ci.upper - ci.lower).toBeLessThan(2 * 1.96 * se * 1.15); + }); + + it("collapses on a constant sample", () => { + const ci = bootstrap([5, 5, 5], mean, { seed: 3, reps: 100 }); + expect([ci.lower, ci.estimate, ci.upper]).toEqual([5, 5, 5]); + }); + + it("stratified resampling keeps stratum sizes", () => { + const strata = [ + [1, 1, 1], + [0, 0, 0, 0, 0], + ]; + const ci = stratifiedBootstrap(strata, (s) => s[0].length * 10 + s[1].length, { + seed: 1, + reps: 50, + }); + expect([ci.lower, ci.upper]).toEqual([35, 35]); + }); + + it("paired difference resamples pairs", () => { + const x = [10, 12, 9, 15, 11, 14, 13, 10]; + const y = x.map((v, i) => v - 2 - (i % 2)); + const r = pairedMeanDifference(x, y, { seed: 5, reps: 1000 }); + expect(r.meanDiff.estimate).toBeCloseTo(2.5, 12); + expect(r.meanDiff.lower).toBeGreaterThanOrEqual(2); + expect(r.meanDiff.upper).toBeLessThanOrEqual(3); + expect(r.dz).toBeCloseTo(2.5 / sd(x.map((v, i) => v - y[i])), 12); + expect(() => pairedMeanDifference([1], [1, 2], { seed: 1 })).toThrow(RangeError); + }); +}); + +describe("Bradley-Terry", () => { + // wins[i][j] = wins of i over j; reference: maximum likelihood with scipy BFGS. + const W = [ + [0, 7, 9, 10], + [3, 0, 6, 9], + [1, 4, 0, 6], + [0, 1, 4, 0], + ]; + const outcomes: PairOutcome[] = []; + for (let i = 0; i < 4; i++) + for (let j = i + 1; j < 4; j++) outcomes.push({ i, j, scoreI: W[i][j], scoreJ: W[j][i] }); + + it("matches the maximum-likelihood fit (no prior)", () => { + const fit = fitBradleyTerry(4, outcomes, { prior: 0 }); + expect(fit.converged).toBe(true); + const expected = [ + 1.539924527762305, 0.37009020841656426, -0.5322860297988234, -1.3777287063800459, + ]; + fit.theta.forEach((t, i) => expect(t).toBeCloseTo(expected[i], 6)); + }); + + it("matches the fit with one virtual draw per pairing", () => { + const fit = fitBradleyTerry(4, outcomes, { prior: 1 }); + const expected = [ + 1.2976598516423081, 0.32010753473623765, -0.4507020061425011, -1.167065380236045, + ]; + fit.theta.forEach((t, i) => expect(t).toBeCloseTo(expected[i], 6)); + }); + + it("stays finite when a player wins every game, thanks to the prior", () => { + const sweep = [ + { i: 0, j: 1, scoreI: 10, scoreJ: 0 }, + { i: 1, j: 2, scoreI: 6, scoreJ: 4 }, + { i: 0, j: 2, scoreI: 10, scoreJ: 0 }, + ]; + const fit = fitBradleyTerry(3, sweep); + expect(fit.theta.every(Number.isFinite)).toBe(true); + expect(fit.theta[0]).toBeGreaterThan(fit.theta[1]); + }); + + it("converts to an anchored Elo scale", () => { + const elo = toElo([Math.LN10, 0], 1); + expect(elo[0]).toBeCloseTo(400, 12); + expect(elo[1]).toBe(0); + expect(eloExpected(400, 0)).toBeCloseTo(10 / 11, 12); + }); +}); + +describe("formatting", () => { + it("formats estimates the way the site shows them", () => { + expect(formatPct(0.9)).toBe("90.0%"); + expect(formatPctInterval(0.8437, 0.9375)).toBe("[84.4%, 93.8%]"); + expect(formatSigned(-3.21)).toBe("−3.2"); + expect(formatSigned(3.21)).toBe("+3.2"); + expect(formatP(0.0004)).toBe("< 0.001"); + expect(formatP(0.0421)).toBe("0.042"); + }); +}); diff --git a/web/src/lib/stats/wilcoxon.ts b/web/src/lib/stats/wilcoxon.ts new file mode 100644 index 0000000..3892166 --- /dev/null +++ b/web/src/lib/stats/wilcoxon.ts @@ -0,0 +1,108 @@ +/** + * Wilcoxon signed-rank test for paired samples, matching + * scipy.stats.wilcoxon(zero_method="wilcox") and R's wilcox.test(paired = TRUE). + * + * - zero differences are dropped ("wilcox" zero method); + * - tied |differences| get average ranks and a variance correction; + * - "exact" uses the null distribution of W+ (only valid without ties); + * - "approx" is the normal approximation, optionally with a continuity + * correction (off by default, like scipy). + */ +import { rankWithTies } from "./descriptive"; +import { normalSf } from "./normal"; + +export type WilcoxonMethod = "auto" | "exact" | "approx"; + +export interface WilcoxonOptions { + method?: WilcoxonMethod; + continuityCorrection?: boolean; +} + +export interface WilcoxonResult { + /** Pairs with a non-zero difference (the effective sample size). */ + n: number; + /** Pairs dropped because the difference was zero. */ + zeros: number; + /** Sum of ranks of positive differences (R's V statistic). */ + wPlus: number; + wMinus: number; + /** min(W+, W-), scipy's two-sided statistic. */ + statistic: number; + /** Normal-approximation z (null for the exact method). */ + z: number | null; + /** Two-sided p-value. */ + pValue: number; + method: "exact" | "approx"; + /** Matched-pairs rank-biserial correlation (W+ - W-) / (W+ + W-), in [-1, 1]. */ + rankBiserial: number; +} + +/** Number of subsets of {1..n} with each rank sum, i.e. the null distribution of W+ × 2^n. */ +function signedRankCounts(n: number): number[] { + const max = (n * (n + 1)) / 2; + const counts = new Array(max + 1).fill(0); + counts[0] = 1; + for (let k = 1; k <= n; k++) { + for (let s = max; s >= k; s--) counts[s] += counts[s - k]; + } + return counts; +} + +export function wilcoxonSignedRank( + x: readonly number[], + y?: readonly number[], + { method = "auto", continuityCorrection = false }: WilcoxonOptions = {}, +): WilcoxonResult { + if (y && y.length !== x.length) throw new RangeError("paired samples must have equal length"); + const diffs = y ? x.map((xi, i) => xi - y[i]) : [...x]; + const nonZero = diffs.filter((d) => d !== 0); + const zeros = diffs.length - nonZero.length; + const n = nonZero.length; + if (n === 0) { + return { + n, + zeros, + wPlus: 0, + wMinus: 0, + statistic: 0, + z: null, + pValue: 1, + method: "approx", + rankBiserial: 0, + }; + } + + const { ranks, tieSizes } = rankWithTies(nonZero.map(Math.abs)); + let wPlus = 0; + let wMinus = 0; + nonZero.forEach((d, i) => { + if (d > 0) wPlus += ranks[i]; + else wMinus += ranks[i]; + }); + const statistic = Math.min(wPlus, wMinus); + const hasTies = tieSizes.some((t) => t > 1); + const rankBiserial = (wPlus - wMinus) / (wPlus + wMinus); + + const useExact = method === "exact" || (method === "auto" && n <= 50 && !hasTies && zeros === 0); + + if (useExact) { + if (hasTies) throw new RangeError("the exact Wilcoxon test requires untied differences"); + const counts = signedRankCounts(n); + const total = 2 ** n; + // W+ is an integer without ties. Two-sided p = 2 · P(W+ <= min) (symmetric null). + let tail = 0; + for (let s = 0; s <= statistic; s++) tail += counts[s]; + const pValue = Math.min(1, (2 * tail) / total); + return { n, zeros, wPlus, wMinus, statistic, z: null, pValue, method: "exact", rankBiserial }; + } + + const meanW = (n * (n + 1)) / 4; + let varW = (n * (n + 1) * (2 * n + 1)) / 24; + for (const t of tieSizes) varW -= (t * t * t - t) / 48; + const se = Math.sqrt(varW); + let numerator = statistic - meanW; + if (continuityCorrection) numerator += numerator < 0 ? 0.5 : numerator > 0 ? -0.5 : 0; + const z = se > 0 ? numerator / se : 0; + const pValue = Math.min(1, 2 * normalSf(Math.abs(z))); + return { n, zeros, wPlus, wMinus, statistic, z, pValue, method: "approx", rankBiserial }; +} From 0e00601b45221064783f711e80a4221af0d14cee Mon Sep 17 00:00:00 2001 From: rNLKJA <62606765+rNLKJA@users.noreply.github.com> Date: Tue, 6 Oct 2026 00:59:11 +1030 Subject: [PATCH 02/18] feat(eval): add tournament harness, paired A* study and alpha-beta study - /tournament: seeded round robin of the original agent against variants that change one knob (fixed depth 2/3, greedy one-ply) and the random baseline, colour-swapped pairs, run in a pool of Web Workers. Wilson CIs, Bradley-Terry Elo with stratified bootstrap CIs, first-move effect, move times, illegal moves, CSV export. - Precomputed 1,200-game reference tournament (TypeScript port) and a cross-check that replays the feasible pairings from the unchanged Python (scripts/crosscheck_tournament.py); the 144/160 benchmark is restated with its Wilson interval. - Alpha-beta efficiency study: nodes with vs without pruning on 120 positions, plus a clearly labelled textbook variant. Finding: the original's inverted beta update leaves 92-100% of the tree searched. The agent itself is unchanged. - /astar: paired Manhattan vs Euclidean study with paired bootstrap CI, Wilcoxon signed-rank test, effect sizes and a BFS optimality check, live in a worker and as a 980-board reference. - Agent port gains opt-in fixedDepth and prune options; defaults keep parity with the original (all parity tests unchanged and passing). Co-Authored-By: Claude Opus 5.5 --- scripts/crosscheck_tournament.py | 151 ++ web/package.json | 11 +- web/pnpm-lock.yaml | 1237 ++++++++++++++++- web/scripts/generate-reference-studies.ts | 109 ++ web/src/app/astar/page.tsx | 60 +- .../app/data/alpha-beta-study.csv/route.ts | 21 + .../app/data/astar-paired-study.csv/route.ts | 11 + .../reference-tournament-games.csv/route.ts | 10 + .../reference-tournament-summary.csv/route.ts | 15 + web/src/app/tournament/page.tsx | 470 +++++++ web/src/components/astar/heuristic-study.tsx | 137 +- .../components/astar/paired-study-summary.tsx | 131 ++ web/src/components/layout/page-header.tsx | 66 + web/src/components/stats/interval.tsx | 144 ++ web/src/components/stats/scroll-table.tsx | 27 + .../tournament/alpha-beta-table.tsx | 98 ++ .../tournament/reference-tournament.tsx | 38 + .../tournament/tournament-results.tsx | 214 +++ .../tournament/tournament-runner.tsx | 268 ++++ web/src/components/ui/checkbox.tsx | 25 + web/src/components/ui/input.tsx | 18 + web/src/hooks/use-astar-benchmark.ts | 31 +- web/src/hooks/use-tournament-pool.ts | 111 ++ web/src/lib/agent/minimax.ts | 11 +- web/src/lib/agent/player.ts | 9 +- web/src/lib/analysis/alpha-beta.ts | 256 ++++ web/src/lib/analysis/analysis.test.ts | 168 +++ web/src/lib/analysis/astar-paired.ts | 241 ++++ web/src/lib/csv.ts | 28 + web/src/lib/data/alpha-beta-study.json | 1 + web/src/lib/data/astar-paired-study.json | 1 + web/src/lib/data/load.ts | 41 + web/src/lib/data/python-crosscheck.json | 1 + web/src/lib/data/reference-config.ts | 28 + web/src/lib/data/reference-tournament.json | 1 + web/src/lib/download.ts | 12 + web/src/lib/rng.ts | 24 + web/src/lib/tournament/agents.ts | 113 ++ web/src/lib/tournament/analyse.ts | 300 ++++ web/src/lib/tournament/crosscheck.ts | 67 + web/src/lib/tournament/play.ts | 146 ++ web/src/lib/tournament/schedule.ts | 64 + web/src/lib/tournament/tournament.test.ts | 289 ++++ web/src/workers/astar-benchmark.worker.ts | 9 +- web/src/workers/tournament.worker.ts | 34 + 45 files changed, 5197 insertions(+), 50 deletions(-) create mode 100644 scripts/crosscheck_tournament.py create mode 100644 web/scripts/generate-reference-studies.ts create mode 100644 web/src/app/data/alpha-beta-study.csv/route.ts create mode 100644 web/src/app/data/astar-paired-study.csv/route.ts create mode 100644 web/src/app/data/reference-tournament-games.csv/route.ts create mode 100644 web/src/app/data/reference-tournament-summary.csv/route.ts create mode 100644 web/src/app/tournament/page.tsx create mode 100644 web/src/components/astar/paired-study-summary.tsx create mode 100644 web/src/components/layout/page-header.tsx create mode 100644 web/src/components/stats/interval.tsx create mode 100644 web/src/components/stats/scroll-table.tsx create mode 100644 web/src/components/tournament/alpha-beta-table.tsx create mode 100644 web/src/components/tournament/reference-tournament.tsx create mode 100644 web/src/components/tournament/tournament-results.tsx create mode 100644 web/src/components/tournament/tournament-runner.tsx create mode 100644 web/src/components/ui/checkbox.tsx create mode 100644 web/src/components/ui/input.tsx create mode 100644 web/src/hooks/use-tournament-pool.ts create mode 100644 web/src/lib/analysis/alpha-beta.ts create mode 100644 web/src/lib/analysis/analysis.test.ts create mode 100644 web/src/lib/analysis/astar-paired.ts create mode 100644 web/src/lib/csv.ts create mode 100644 web/src/lib/data/alpha-beta-study.json create mode 100644 web/src/lib/data/astar-paired-study.json create mode 100644 web/src/lib/data/load.ts create mode 100644 web/src/lib/data/python-crosscheck.json create mode 100644 web/src/lib/data/reference-config.ts create mode 100644 web/src/lib/data/reference-tournament.json create mode 100644 web/src/lib/download.ts create mode 100644 web/src/lib/tournament/agents.ts create mode 100644 web/src/lib/tournament/analyse.ts create mode 100644 web/src/lib/tournament/crosscheck.ts create mode 100644 web/src/lib/tournament/play.ts create mode 100644 web/src/lib/tournament/schedule.ts create mode 100644 web/src/lib/tournament/tournament.test.ts create mode 100644 web/src/workers/tournament.worker.ts diff --git a/scripts/crosscheck_tournament.py b/scripts/crosscheck_tournament.py new file mode 100644 index 0000000..cb38bb0 --- /dev/null +++ b/scripts/crosscheck_tournament.py @@ -0,0 +1,151 @@ +# /// script +# requires-python = ">=3.12,<3.13" +# dependencies = ["numpy>=1.26", "scipy>=1.11"] +# /// +""" +Cross-check the tournament harness against the ORIGINAL Python agents. + +The reference tournament on /tournament is played by the parity-tested +TypeScript port, because depth-3 search in the original Python (deepcopy of +the board at every node) is far too slow for 1,200 games. This script replays +the subset that IS feasible in Python, with the same protocol: + + * agents built from the original code with exactly one knob changed: + - minimax-dynamic: _4399.Player, unchanged; + - minimax-d2: dynamic_depth_allocation patched to return 2; + - greedy: dynamic_depth_allocation patched to return 1 and + action(enforceGamePlayer=False) (no opening book); + - random: random_play_agent, unchanged; + * every pairing plays colour-swapped pairs of games, both games of a pair + seeded identically (Python's global `random`); + * the subject's referee `Game` validates every action. + +The RNG streams differ from the TypeScript run (Python's Mersenne Twister vs +mulberry32), so individual games differ; the comparison is between win +rates, with intervals, on the web page. + +Like benchmark_agent.py it re-executes itself with PYTHONHASHSEED=0 so the +set iteration order inside get_valid_actions is reproducible. + + uv run scripts/crosscheck_tournament.py +""" + +from __future__ import annotations + +import json +import logging +import os +import platform +import random +import sys +import time +from itertools import combinations +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +PART_B = ROOT / "coursework" / "Project Part B" / "code" +SKELETON = ROOT / "coursework" / "Project Part B" / "skeleton-code-B" +OUT = ROOT / "web" / "src" / "lib" / "data" / "python-crosscheck.json" + +AGENTS = ["minimax-dynamic", "minimax-d2", "greedy", "random"] +SIZES = [4, 5] +ROUNDS = 20 # colour-swapped pairs per pairing per size -> 40 games +SEED = 2022 + + +def pin_hash_seed() -> None: + if os.environ.get("PYTHONHASHSEED") != "0": + os.execve( + sys.executable, + [sys.executable, *sys.argv], + {**os.environ, "PYTHONHASHSEED": "0"}, + ) + + +def main() -> None: + pin_hash_seed() + os.chdir(PART_B) # utility/evaluation.py opens ./utility/weights.json + sys.path.insert(0, str(PART_B)) + sys.path.insert(1, str(SKELETON)) + + import _4399.player as player_module # noqa: E402 + from _4399.player import Player as MinimaxPlayer # noqa: E402 + from random_play_agent.player import Player as RandomPlayer # noqa: E402 + from referee.game import Game # noqa: E402 + + logging.getLogger().setLevel(logging.WARNING) + original_depth = player_module.dynamic_depth_allocation + + class Variant(MinimaxPlayer): + """The original player with the depth (and opening book) overridden per call.""" + + depth: int | None = None + book: bool = True + + def action(self): # type: ignore[override] + if self.depth is not None: + player_module.dynamic_depth_allocation = lambda board, d=self.depth: d + try: + return super().action(enforceGamePlayer=self.book) + finally: + player_module.dynamic_depth_allocation = original_depth + + def make(agent: str, colour: str, n: int): + if agent == "random": + return RandomPlayer(colour, n) + p = Variant(colour, n) + if agent == "minimax-d2": + p.depth = 2 + elif agent == "greedy": + p.depth = 1 + p.book = False + return p + + def play(n: int, red: str, blue: str, seed: int) -> dict: + random.seed(seed) + game = Game(n) + players = [make(red, "red", n), make(blue, "blue", n)] + while not game.over(): + colour = "red" if game.nturns % 2 == 0 else "blue" + action = players[game.nturns % 2].action() + sanitised = game.update(colour, action) + for p in players: + p.turn(colour, sanitised) + winner = None + if game.result == "winner: red": + winner = "red" + elif game.result == "winner: blue": + winner = "blue" + return {"n": n, "red": red, "blue": blue, "seed": seed, "winner": winner, "turns": game.nturns} + + games = [] + started = time.perf_counter() + for n in SIZES: + for a, b in combinations(AGENTS, 2): + t0 = time.perf_counter() + for r in range(ROUNDS): + seed = SEED * 1_000_003 + n * 10_007 + AGENTS.index(a) * 101 + AGENTS.index(b) * 11 + r + games.append(play(n, a, b, seed)) + games.append(play(n, b, a, seed)) + print(f"n={n} {a} vs {b}: {time.perf_counter() - t0:.1f}s", flush=True) + + OUT.parent.mkdir(parents=True, exist_ok=True) + payload = { + "meta": { + "generatedBy": "scripts/crosscheck_tournament.py", + "implementation": "original Python (coursework/Project Part B), variants by patching one knob", + "python": platform.python_version(), + "pythonHashSeed": os.environ.get("PYTHONHASHSEED"), + "config": {"agents": AGENTS, "sizes": SIZES, "rounds": ROUNDS, "seed": SEED}, + "seconds": round(time.perf_counter() - started, 1), + }, + "games": games, + } + with open(OUT, "w") as f: + json.dump(payload, f) + f.write("\n") + print(f"wrote {OUT.relative_to(ROOT)}") + + +if __name__ == "__main__": + main() diff --git a/web/package.json b/web/package.json index a5e7359..1f63433 100644 --- a/web/package.json +++ b/web/package.json @@ -10,9 +10,12 @@ "typecheck": "tsc --noEmit", "test": "vitest run", "format": "prettier --write .", - "format:check": "prettier --check ." + "format:check": "prettier --check .", + "gen:reference": "tsx scripts/generate-reference-studies.ts", + "sync-docs": "node scripts/sync-docs.mjs" }, "dependencies": { + "@anthropic-ai/sdk": "^0.131.0", "class-variance-authority": "^0.7.1", "cn": "^0.4.0", "lucide-react": "^1.52.0", @@ -21,8 +24,11 @@ "radix-ui": "^1.6.7", "react": "19.2.8", "react-dom": "19.2.8", + "react-markdown": "^10.1.0", + "remark-gfm": "^4.0.1", "shadcn": "^4.21.1", - "tw-animate-css": "^1.4.0" + "tw-animate-css": "^1.4.0", + "zod": "^4.6.5" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -34,6 +40,7 @@ "prettier": "^3.9.9", "prettier-plugin-tailwindcss": "^0.8.1", "tailwindcss": "^4", + "tsx": "^4.23.15", "typescript": "^5", "vitest": "^5.0.3" }, diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 638dfda..05949fb 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@anthropic-ai/sdk': + specifier: ^0.131.0 + version: 0.131.0(zod@4.6.5) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -32,12 +35,21 @@ importers: react-dom: specifier: 19.2.8 version: 19.2.8(react@19.2.8) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.3.0)(react@19.2.8) + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 shadcn: specifier: ^4.21.1 version: 4.21.1(typescript@5.9.3) tw-animate-css: specifier: ^1.4.0 version: 1.4.0 + zod: + specifier: ^4.6.5 + version: 4.6.5 devDependencies: '@tailwindcss/postcss': specifier: ^4 @@ -66,12 +78,15 @@ importers: tailwindcss: specifier: ^4 version: 4.3.3 + tsx: + specifier: ^4.23.15 + version: 4.23.15 typescript: specifier: ^5 version: 5.9.3 vitest: specifier: ^5.0.3 - version: 5.0.3(@types/node@22.20.5)(vite@8.3.2(@types/node@22.20.5)(jiti@2.7.0)) + version: 5.0.3(@types/node@22.20.5)(vite@8.3.2(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) packages: @@ -79,6 +94,15 @@ packages: resolution: {integrity: sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==} engines: {node: '>=10'} + '@anthropic-ai/sdk@0.131.0': + resolution: {integrity: sha512-9+PepoU7qVMmM70jSahdnfcMHAvAnzhMOLv2W9WjRLO+OG/MAiBETkwKZqv7KIJ1Cj5h8eZ019bHzZaq+Mbepw==} + hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -196,6 +220,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} @@ -227,6 +255,162 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.10.1': resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1387,6 +1571,9 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@stablelib/base64@1.0.1': + resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + '@swc/helpers@0.5.23': resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} @@ -1491,18 +1678,33 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@22.20.5': resolution: {integrity: sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==} @@ -1514,6 +1716,12 @@ packages: '@types/react@19.3.0': resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/validate-npm-package-name@4.0.2': resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} @@ -1576,6 +1784,9 @@ packages: resolution: {integrity: sha512-8eQ9R218XORK+KLosnf4bu/QsUXvUyVwTbArg7/0NMB1Pu87OJKvj4nhFblkYE8gQV73mW1dx1ptlPCkwRGa7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} cpu: [arm] @@ -1836,6 +2047,9 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1895,6 +2109,9 @@ packages: caniuse-lite@1.0.30001814: resolution: {integrity: sha512-/Uaf1lAzr59XcMpW0o96WoEfr+VXK2OX4U9AgFoiSHsVJ4HppnIFUjtYzsyDH2+tgANaQb2/oxYGwCPapN1FpA==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@6.3.0: resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} engines: {node: '>=18'} @@ -1907,6 +2124,18 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -1945,6 +2174,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -2044,6 +2276,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -2087,6 +2322,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -2094,6 +2333,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@8.0.4: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} @@ -2184,6 +2426,11 @@ packages: resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2195,6 +2442,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + eslint-config-next@16.3.8: resolution: {integrity: sha512-81vovwMe6NGnoFsl0KUJWzlS+y239i3fdsxs49gSEX3pDQW2cuKy+fxUPXNkQqqx6OCPheYPtBlSufc9aZ0k+w==} peerDependencies: @@ -2317,6 +2568,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -2358,6 +2612,9 @@ packages: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2375,6 +2632,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-sha256@1.3.0: + resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + fast-uri@3.1.8: resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} @@ -2552,6 +2812,12 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} @@ -2562,6 +2828,9 @@ packages: resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} engines: {node: '>=16.9.0'} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -2597,6 +2866,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -2609,6 +2881,12 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2647,6 +2925,9 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -2677,6 +2958,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-in-ssh@1.0.0: resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} engines: {node: '>=20'} @@ -2824,6 +3108,10 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -3043,6 +3331,9 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -3065,10 +3356,58 @@ packages: magic-string@1.4.3: resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-find-and-replace@3.0.3: + resolution: {integrity: sha512-xPgpDNl0/OXHsI7TlaIs22lWnH3KlpvZdXG1ET/m/YT2Hhdkx8lJV4kLphE6l9simyM4KPDFBwas08BgEob6Jw==} + + mdast-util-from-markdown@2.1.0: + resolution: {integrity: sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.1: + resolution: {integrity: sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.2.0: + resolution: {integrity: sha512-2Jn/ADrHFFyyniBMi0bncTbJqU78K3/TEYvzvwrWWzD9MYPUa/Gm4r3nOeKFQg/PDM5BsbDYdc8ackW4NTY6NA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + media-typer@1.1.1: resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} engines: {node: '>= 0.8'} @@ -3084,6 +3423,93 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@2.0.4: + resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.2: + resolution: {integrity: sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.1.0: + resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-edit-map@1.0.0: + resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.3: + resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} + + micromark@4.0.3: + resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -3280,6 +3706,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -3431,6 +3860,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + proxy-addr@2.0.8: resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} engines: {node: '>= 0.10'} @@ -3475,6 +3907,12 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -3521,6 +3959,18 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -3675,9 +4125,15 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + standardwebhooks@1.1.1: + resolution: {integrity: sha512-bCbX9ZEyFkWPsRz7Bl3NuQUJohmwGSev/yhr7vhaGPlc4AfIrspIRa6cPTBuI1ItmrTDJ4d/S2hCsfe4+vQGnQ==} + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -3720,6 +4176,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} engines: {node: '>=14.16'} @@ -3748,6 +4207,12 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -3805,6 +4270,15 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -3824,6 +4298,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.23.15: + resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} + engines: {node: '>=18.0.0'} + hasBin: true + tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} @@ -3882,6 +4361,24 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3933,6 +4430,12 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite@8.3.2: resolution: {integrity: sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4091,10 +4594,20 @@ packages: zod@4.6.5: resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@alloc/quick-lru@5.3.0': {} + '@anthropic-ai/sdk@0.131.0(zod@4.6.5)': + dependencies: + json-schema-to-ts: 3.1.1 + standardwebhooks: 1.1.1 + optionalDependencies: + zod: 4.6.5 + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -4258,6 +4771,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/runtime@7.29.7': {} + '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -4323,6 +4838,84 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true + + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.5(jiti@2.7.0))': dependencies: eslint: 9.39.5(jiti@2.7.0) @@ -5445,6 +6038,8 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} + '@stablelib/base64@1.0.1': {} + '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 @@ -5534,14 +6129,32 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 + '@types/estree@1.0.9': {} + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + '@types/node@22.20.5': dependencies: undici-types: 6.21.0 @@ -5554,6 +6167,10 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@types/validate-npm-package-name@4.0.2': {} '@typescript-eslint/eslint-plugin@8.71.0(@typescript-eslint/parser@8.71.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': @@ -5647,6 +6264,8 @@ snapshots: '@typescript-eslint/types': 8.71.0 eslint-visitor-keys: 5.0.1 + '@ungap/structured-clone@1.4.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': optional: true @@ -5717,14 +6336,14 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.12.2': optional: true - '@vitest/mocker@5.0.3(vite@8.3.2(@types/node@22.20.5)(jiti@2.7.0))': + '@vitest/mocker@5.0.3(vite@8.3.2(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.3 estree-walker: 3.0.3 magic-string: 1.4.3 optionalDependencies: - vite: 8.3.2(@types/node@22.20.5)(jiti@2.7.0) + vite: 8.3.2(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15) '@vitest/spy@5.0.3': {} @@ -5866,6 +6485,8 @@ snapshots: axobject-query@4.1.0: {} + bail@2.0.2: {} + balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -5934,6 +6555,8 @@ snapshots: caniuse-lite@1.0.30001814: {} + ccount@2.0.1: {} + chai@6.3.0: {} chalk@4.1.2: @@ -5943,6 +6566,14 @@ snapshots: chalk@5.6.2: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -5969,6 +6600,8 @@ snapshots: color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} + commander@11.1.0: {} commander@14.0.3: {} @@ -6056,6 +6689,10 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + dedent@1.7.2: {} deep-is@0.1.4: {} @@ -6087,10 +6724,16 @@ snapshots: depd@2.0.0: {} + dequal@2.0.3: {} + detect-libc@2.1.2: {} detect-node-es@1.1.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff@8.0.4: {} doctrine@2.1.0: @@ -6248,12 +6891,43 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + eslint-config-next@16.3.8(@typescript-eslint/parser@8.71.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 16.3.8(eslint@9.39.5(jiti@2.7.0)) @@ -6459,6 +7133,8 @@ snapshots: estraverse@5.3.0: {} + estree-util-is-identifier-name@3.0.0: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -6543,6 +7219,8 @@ snapshots: transitivePeerDependencies: - supports-color + extend@3.0.2: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.1: @@ -6565,6 +7243,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-sha256@1.3.0: {} + fast-uri@3.1.8: {} fastq@1.20.3: @@ -6737,6 +7417,30 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 + hermes-estree@0.25.1: {} hermes-parser@0.25.1: @@ -6745,6 +7449,8 @@ snapshots: hono@4.13.13: {} + html-url-attributes@3.0.1: {} + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -6774,6 +7480,8 @@ snapshots: inherits@2.0.4: {} + inline-style-parser@0.2.7: {} + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -6784,6 +7492,13 @@ snapshots: ipaddr.js@1.9.1: {} + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.9 @@ -6830,6 +7545,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-decimal@2.0.1: {} + is-docker@2.2.1: {} is-docker@3.0.0: {} @@ -6856,6 +7573,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-in-ssh@1.0.0: {} is-inside-container@1.0.0: @@ -6971,6 +7690,11 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.29.7 + ts-algebra: 2.0.0 + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -7135,6 +7859,8 @@ snapshots: chalk: 5.6.2 is-unicode-supported: 1.3.0 + longest-streak@3.1.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -7157,8 +7883,165 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + markdown-table@3.0.4: {} + math-intrinsics@1.1.0: {} + mdast-util-find-and-replace@3.0.3: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.3 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.3 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.0 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.1.0 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.1 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.2.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.0 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.4.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.2.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-character: 2.1.1 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + media-typer@1.1.1: {} merge-descriptors@2.0.0: {} @@ -7167,6 +8050,203 @@ snapshots: merge2@1.4.1: {} + micromark-core-commonmark@2.0.4: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.1.0 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-edit-map: 1.0.0 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-table@2.1.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.3 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.2 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-space@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.3 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-edit-map@1.0.0: + dependencies: + micromark-util-types: 2.0.3 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.3 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.3: {} + + micromark@4.0.3: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-edit-map: 1.0.0 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -7381,6 +8461,16 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.29.7 @@ -7462,6 +8552,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@7.2.0: {} + proxy-addr@2.0.8: dependencies: forwarded: 0.2.0 @@ -7555,6 +8647,24 @@ snapshots: react-is@16.13.1: {} + react-markdown@10.1.0(@types/react@19.3.0)(react@19.2.8): + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/react': 19.3.0 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.1 + react: 19.2.8 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + react-remove-scroll-bar@2.3.8(@types/react@19.3.0)(react@19.2.8): dependencies: react: 19.2.8 @@ -7612,6 +8722,40 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.1.0 + micromark-util-types: 2.0.3 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.2.0 + unified: 11.0.5 + require-from-string@2.0.2: {} resolve-from@4.0.0: {} @@ -7874,8 +9018,15 @@ snapshots: source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} + stable-hash@0.0.5: {} + standardwebhooks@1.1.1: + dependencies: + '@stablelib/base64': 1.0.1 + fast-sha256: 1.3.0 + statuses@2.0.2: {} std-env@4.3.0: {} @@ -7944,6 +9095,11 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + stringify-object@5.0.0: dependencies: get-own-enumerable-keys: 1.0.0 @@ -7966,6 +9122,14 @@ snapshots: strip-json-comments@3.1.1: {} + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.8): dependencies: client-only: 0.0.1 @@ -8002,6 +9166,12 @@ snapshots: toidentifier@1.0.1: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-algebra@2.0.0: {} + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -8026,6 +9196,12 @@ snapshots: tslib@2.8.1: {} + tsx@4.23.15: + dependencies: + esbuild: 0.28.2 + optionalDependencies: + fsevents: 2.3.3 + tw-animate-css@1.4.0: {} type-check@0.4.0: @@ -8098,6 +9274,39 @@ snapshots: unicorn-magic@0.3.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universalify@2.0.1: {} unpipe@1.0.0: {} @@ -8160,7 +9369,17 @@ snapshots: vary@1.1.2: {} - vite@8.3.2(@types/node@22.20.5)(jiti@2.7.0): + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@8.3.2(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -8169,13 +9388,15 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 22.20.5 + esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 + tsx: 4.23.15 - vitest@5.0.3(@types/node@22.20.5)(vite@8.3.2(@types/node@22.20.5)(jiti@2.7.0)): + vitest@5.0.3(@types/node@22.20.5)(vite@8.3.2(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.3(vite@8.3.2(@types/node@22.20.5)(jiti@2.7.0)) + '@vitest/mocker': 5.0.3(vite@8.3.2(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -8186,7 +9407,7 @@ snapshots: tinybench: 6.2.0 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 8.3.2(@types/node@22.20.5)(jiti@2.7.0) + vite: 8.3.2(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15) why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 22.20.5 @@ -8274,3 +9495,5 @@ snapshots: zod@3.25.76: {} zod@4.6.5: {} + + zwitch@2.0.4: {} diff --git a/web/scripts/generate-reference-studies.ts b/web/scripts/generate-reference-studies.ts new file mode 100644 index 0000000..c347ccd --- /dev/null +++ b/web/scripts/generate-reference-studies.ts @@ -0,0 +1,109 @@ +/** + * Precompute the reference studies shown on /tournament and /astar, using the + * parity-tested TypeScript port (the original Python is too slow for depth-3 + * search at this scale; scripts/crosscheck_tournament.py re-runs the feasible + * subset with the original code). + * + * cd web && pnpm gen:reference # all three studies + * cd web && pnpm gen:reference tournament # just one + * + * Output (deterministic for the seeds below, apart from wall-clock timings): + * src/lib/data/reference-tournament.json + * src/lib/data/astar-paired-study.json + * src/lib/data/alpha-beta-study.json + */ +import { writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; + +import { measurePruning, samplePositions, summarisePruning } from "../src/lib/analysis/alpha-beta"; +import { runPairedStudy, summarisePairedStudy } from "../src/lib/analysis/astar-paired"; +import { AGENT_IDS } from "../src/lib/tournament/agents"; +import { summariseTournament } from "../src/lib/tournament/analyse"; +import { playTournamentGame } from "../src/lib/tournament/play"; +import { buildSchedule } from "../src/lib/tournament/schedule"; +import { + ALPHA_BETA_CONFIG, + ASTAR_STUDY_CONFIG, + REFERENCE_TOURNAMENT_CONFIG, +} from "../src/lib/data/reference-config"; + +const DATA = path.join(import.meta.dirname, "..", "src", "lib", "data"); +const only = process.argv[2]; + +const meta = () => ({ + generatedBy: "web/scripts/generate-reference-studies.ts", + generatedAt: new Date().toISOString().slice(0, 10), + node: process.version, + cpu: os.cpus()[0]?.model ?? "unknown", + implementation: "TypeScript port (parity-tested against the original Python)", +}); + +function write(name: string, payload: unknown) { + const file = path.join(DATA, name); + writeFileSync(file, `${JSON.stringify(payload)}\n`); + console.log(`wrote ${path.relative(process.cwd(), file)}`); +} + +if (!only || only === "tournament") { + const config = REFERENCE_TOURNAMENT_CONFIG; + const schedule = buildSchedule({ ...config, agents: [...AGENT_IDS] }); + console.log(`tournament: ${schedule.length} games`); + const started = Date.now(); + const games = schedule.map((spec, i) => { + const g = playTournamentGame(spec); + if ((i + 1) % 100 === 0) + console.log( + ` ${i + 1}/${schedule.length} (${((Date.now() - started) / 1000).toFixed(0)} s)`, + ); + return { + ...g, + red: { + ...g.red, + totalMs: Number(g.red.totalMs.toFixed(3)), + maxMs: Number(g.red.maxMs.toFixed(3)), + }, + blue: { + ...g.blue, + totalMs: Number(g.blue.totalMs.toFixed(3)), + maxMs: Number(g.blue.maxMs.toFixed(3)), + }, + }; + }); + write("reference-tournament.json", { meta: { ...meta(), config }, games }); + const s = summariseTournament(games, { reps: 1000, seed: config.seed }); + for (const a of s.standings) { + console.log(` deep searches ${a.id}: ${(a.deepSearchShare * 100).toFixed(1)}%`); + console.log( + `${a.id.padEnd(16)} elo ${a.elo.estimate.toFixed(0)} [${a.elo.lower.toFixed(0)}, ${a.elo.upper.toFixed(0)}] win ${(a.winRate.p * 100).toFixed(1)}% [${(a.winRate.lower * 100).toFixed(1)}, ${(a.winRate.upper * 100).toFixed(1)}] ${a.moveMs.estimate.toFixed(2)} ms/move`, + ); + } + for (const p of s.pairs) { + console.log( + `${p.a} vs ${p.b}: ${p.aWins}-${p.bWins}-${p.draws} (${(p.aWinRate.p * 100).toFixed(1)}% [${(p.aWinRate.lower * 100).toFixed(1)}, ${(p.aWinRate.upper * 100).toFixed(1)}])`, + ); + } + console.log(`red wins ${s.colour.redWins}/${s.colour.games}`); +} + +if (!only || only === "astar") { + const rows = runPairedStudy(ASTAR_STUDY_CONFIG); + write("astar-paired-study.json", { meta: { ...meta(), config: ASTAR_STUDY_CONFIG }, rows }); + const s = summarisePairedStudy(rows, { seed: ASTAR_STUDY_CONFIG.seed }); + console.log(JSON.stringify(s, null, 2)); +} + +if (!only || only === "alphabeta") { + const positions = samplePositions(ALPHA_BETA_CONFIG); + const samples = positions.flatMap((p) => + ALPHA_BETA_CONFIG.depths.flatMap((depth) => + (["shuffled", "canonical"] as const).map((order) => measurePruning(p, depth, order)), + ), + ); + write("alpha-beta-study.json", { meta: { ...meta(), config: ALPHA_BETA_CONFIG }, samples }); + for (const g of summarisePruning(samples, { seed: ALPHA_BETA_CONFIG.seed })) { + console.log( + `n=${g.n} d=${g.depth} ${g.order}: ratio ${g.meanRatio.estimate.toFixed(3)} [${g.meanRatio.lower.toFixed(3)}, ${g.meanRatio.upper.toFixed(3)}] full ${g.meanFull.toFixed(0)} pruned ${g.meanPruned.toFixed(0)} match ${g.valueMatches}/${g.positions} | textbook ${g.textbookRatio.estimate.toFixed(3)} [${g.textbookRatio.lower.toFixed(3)}, ${g.textbookRatio.upper.toFixed(3)}] nodes ${g.meanTextbook.toFixed(0)} match ${g.textbookValueMatches}`, + ); + } +} diff --git a/web/src/app/astar/page.tsx b/web/src/app/astar/page.tsx index e2c8820..ca2046a 100644 --- a/web/src/app/astar/page.tsx +++ b/web/src/app/astar/page.tsx @@ -1,19 +1,77 @@ +import { Download } from "lucide-react"; import type { Metadata } from "next"; import { AstarLab } from "@/components/astar/astar-lab"; import { HeuristicStudy } from "@/components/astar/heuristic-study"; +import { PairedStudySummaryView } from "@/components/astar/paired-study-summary"; +import { Finding, Section } from "@/components/layout/page-header"; +import { Button } from "@/components/ui/button"; +import { summarisePairedStudy } from "@/lib/analysis/astar-paired"; +import { loadAstarStudy } from "@/lib/data/load"; +import { ASTAR_STUDY_CONFIG } from "@/lib/data/reference-config"; +import { formatPct, formatSigned } from "@/lib/stats/format"; export const metadata: Metadata = { title: "A* Lab", description: - "Edit a Cachex board, run the original Part A A* search step by step, and compare Manhattan and Euclidean heuristics.", + "Edit a Cachex board, run the original Part A A* search step by step, and compare Manhattan and Euclidean heuristics in a paired study with intervals and an optimality check.", }; export default function AstarPage() { + const { rows, meta } = loadAstarStudy(); + const summary = summarisePairedStudy(rows, { seed: ASTAR_STUDY_CONFIG.seed }); + const e = summary.expansions; + const o = summary.optimality; + const cfg = ASTAR_STUDY_CONFIG; return (
+
+ {cfg.boardsPerDimension} random boards for every size from {cfg.dimensions[0]} ×{" "} + {cfg.dimensions[0]} to {cfg.dimensions.at(-1)} × {cfg.dimensions.at(-1)} from the + notebook's generator (seed {cfg.seed}), each searched with both heuristics and + solved by breadth-first search. Generated by{" "} + {meta.generatedBy} with the A* port that + reproduces the original paths and node counts exactly. +

+ } + > +
    + + The report's direction holds, and is now measured. Manhattan + expanded {formatSigned(e.meanDiff.estimate)} nodes per board on average (95% CI{" "} + {formatSigned(e.meanDiff.lower)} to {formatSigned(e.meanDiff.upper)}); fewer on{" "} + {e.manhattanFewer} boards, more on {e.euclideanFewer}. + + + But it finds a shortest path less often. Manhattan returned an + optimal path on {formatPct(o.manhattan.p)} of solvable boards (95% CI{" "} + {formatPct(o.manhattan.lower)} to {formatPct(o.manhattan.upper)}), Euclidean on{" "} + {formatPct(o.euclidean.p)} ({formatPct(o.euclidean.lower)} to{" "} + {formatPct(o.euclidean.upper)}). + + + Why: neither heuristic is admissible here. On this hex grid a step + like (1, −1) costs 1, but Manhattan scores it 2 and Euclidean √2. Overestimating makes + the search greedier: fewer expansions, longer paths. The two sample inputs happen to + be solved optimally (8 and 13 cells, confirmed by BFS). + +
+ + +
diff --git a/web/src/app/data/alpha-beta-study.csv/route.ts b/web/src/app/data/alpha-beta-study.csv/route.ts new file mode 100644 index 0000000..f84ddb1 --- /dev/null +++ b/web/src/app/data/alpha-beta-study.csv/route.ts @@ -0,0 +1,21 @@ +import { toCsv } from "@/lib/csv"; +import { loadAlphaBetaStudy } from "@/lib/data/load"; + +export const dynamic = "force-static"; + +export function GET() { + const rows = loadAlphaBetaStudy().samples.map((s) => ({ + board_n: s.n, + depth: s.depth, + move_order: s.order, + empty_cells: s.empty, + nodes_full_minimax: s.nodesFull, + nodes_original_alphabeta: s.nodesPruned, + ratio_original: Number(s.ratio.toFixed(6)), + original_value_matches: s.valueMatches, + nodes_textbook_alphabeta: s.nodesTextbook, + ratio_textbook: Number(s.ratioTextbook.toFixed(6)), + textbook_value_matches: s.textbookValueMatches, + })); + return new Response(toCsv(rows), { headers: { "Content-Type": "text/csv; charset=utf-8" } }); +} diff --git a/web/src/app/data/astar-paired-study.csv/route.ts b/web/src/app/data/astar-paired-study.csv/route.ts new file mode 100644 index 0000000..e8ca68c --- /dev/null +++ b/web/src/app/data/astar-paired-study.csv/route.ts @@ -0,0 +1,11 @@ +import { pairedStudyCsvRows } from "@/lib/analysis/astar-paired"; +import { toCsv } from "@/lib/csv"; +import { loadAstarStudy } from "@/lib/data/load"; + +export const dynamic = "force-static"; + +export function GET() { + return new Response(toCsv(pairedStudyCsvRows(loadAstarStudy().rows)), { + headers: { "Content-Type": "text/csv; charset=utf-8" }, + }); +} diff --git a/web/src/app/data/reference-tournament-games.csv/route.ts b/web/src/app/data/reference-tournament-games.csv/route.ts new file mode 100644 index 0000000..3f1a033 --- /dev/null +++ b/web/src/app/data/reference-tournament-games.csv/route.ts @@ -0,0 +1,10 @@ +import { loadReferenceTournament } from "@/lib/data/load"; +import { gamesCsv } from "@/lib/tournament/analyse"; + +export const dynamic = "force-static"; + +export function GET() { + return new Response(gamesCsv(loadReferenceTournament().games), { + headers: { "Content-Type": "text/csv; charset=utf-8" }, + }); +} diff --git a/web/src/app/data/reference-tournament-summary.csv/route.ts b/web/src/app/data/reference-tournament-summary.csv/route.ts new file mode 100644 index 0000000..0b69b2c --- /dev/null +++ b/web/src/app/data/reference-tournament-summary.csv/route.ts @@ -0,0 +1,15 @@ +import { loadReferenceTournament } from "@/lib/data/load"; +import { REFERENCE_TOURNAMENT_CONFIG } from "@/lib/data/reference-config"; +import { summariseTournament, summaryCsv } from "@/lib/tournament/analyse"; + +export const dynamic = "force-static"; + +export function GET() { + const summary = summariseTournament(loadReferenceTournament().games, { + reps: 1000, + seed: REFERENCE_TOURNAMENT_CONFIG.seed, + }); + return new Response(summaryCsv(summary), { + headers: { "Content-Type": "text/csv; charset=utf-8" }, + }); +} diff --git a/web/src/app/tournament/page.tsx b/web/src/app/tournament/page.tsx new file mode 100644 index 0000000..439b197 --- /dev/null +++ b/web/src/app/tournament/page.tsx @@ -0,0 +1,470 @@ +import { ArrowRight, Download } from "lucide-react"; +import type { Metadata } from "next"; +import Link from "next/link"; + +import { Finding, PageHeader, Section } from "@/components/layout/page-header"; +import { EstimateCI, IntervalAxis, IntervalBar } from "@/components/stats/interval"; +import { AlphaBetaTable } from "@/components/tournament/alpha-beta-table"; +import { ReferenceTournament } from "@/components/tournament/reference-tournament"; +import { TournamentRunner } from "@/components/tournament/tournament-runner"; +import { Button } from "@/components/ui/button"; +import { ScrollTable } from "@/components/stats/scroll-table"; +import { summarisePruning } from "@/lib/analysis/alpha-beta"; +import benchmark from "@/lib/data/agent-benchmark.json"; +import { loadAlphaBetaStudy, loadPythonCrosscheck, loadReferenceTournament } from "@/lib/data/load"; +import { ALPHA_BETA_CONFIG, REFERENCE_TOURNAMENT_CONFIG } from "@/lib/data/reference-config"; +import { formatPct, formatSigned } from "@/lib/stats/format"; +import { wilson } from "@/lib/stats/proportion"; +import { AGENTS } from "@/lib/tournament/agents"; +import { summariseTournament } from "@/lib/tournament/analyse"; +import { compareImplementations } from "@/lib/tournament/crosscheck"; + +export const metadata: Metadata = { + title: "Tournament", + description: + "A seeded, colour-swapped round robin between the original minimax agent and controlled variants, with Wilson and bootstrap intervals, Bradley-Terry strengths and an alpha-beta efficiency study.", +}; + +const WORDS = ["no", "one", "two", "three", "four", "five", "six", "seven", "eight"]; + +const pctCI = (lo: number, hi: number) => `[${(lo * 100).toFixed(1)}, ${(hi * 100).toFixed(1)}]`; + +export default function TournamentPage() { + // Original benchmark (Python), restated with intervals. + const totals = benchmark.results.reduce( + (a, r) => ({ wins: a.wins + r.wins, games: a.games + r.games }), + { wins: 0, games: 0 }, + ); + const overall = wilson(totals.wins, totals.games); + const bySize = [...new Set(benchmark.results.map((r) => r.n))].map((n) => { + const rows = benchmark.results.filter((r) => r.n === n); + const wins = rows.reduce((s, r) => s + r.wins, 0); + const games = rows.reduce((s, r) => s + r.games, 0); + return { n, ci: wilson(wins, games) }; + }); + + // Reference tournament (TypeScript port). + const ref = loadReferenceTournament(); + const cfg = REFERENCE_TOURNAMENT_CONFIG; + const summaries = [ + { + key: "all", + label: "All sizes", + summary: summariseTournament(ref.games, { reps: 1000, seed: cfg.seed }), + }, + ...cfg.sizes.map((n) => ({ + key: String(n), + label: `${n} × ${n}`, + summary: summariseTournament(ref.games, { reps: 1000, seed: cfg.seed, sizes: [n] }), + })), + ]; + const all = summaries[0].summary; + const pair = (a: string, b: string) => all.pairs.find((p) => p.a === a && p.b === b)!; + const dynVsGreedy = pair("minimax-dynamic", "greedy"); + const dynVsD3 = pair("minimax-dynamic", "minimax-d3"); + const dynVsRandom = pair("minimax-dynamic", "random"); + const standing = (id: string) => all.standings.find((s) => s.id === id)!; + const dyn = standing("minimax-dynamic"); + const d3 = standing("minimax-d3"); + const deepSearches = ref.games.reduce( + (acc, g) => { + for (const s of [g.red, g.blue]) { + if (s.agent !== "minimax-dynamic") continue; + acc.searches += s.searches; + acc.deep += s.deepSearches; + } + return acc; + }, + { searches: 0, deep: 0 }, + ); + const hardware = `${ref.meta.cpu ?? "unknown CPU"}, Node ${ref.meta.node ?? "?"}`; + + // Cross-check against the original Python. + const py = loadPythonCrosscheck(); + const cross = compareImplementations(ref.games, py.games); + + // Alpha-beta efficiency. + const ab = loadAlphaBetaStudy(); + const groups = summarisePruning(ab.samples, { seed: ALPHA_BETA_CONFIG.seed }); + const shuffled = groups.filter((g) => g.order === "shuffled"); + const canonical = groups.filter((g) => g.order === "canonical"); + const worst = shuffled.reduce((a, b) => (b.meanRatio.estimate < a.meanRatio.estimate ? b : a)); + const deepest = shuffled.find((g) => g.n === 6 && g.depth === 3)!; + const allMatch = ab.samples.every((s) => s.valueMatches && s.textbookValueMatches); + + return ( +
+
+ +

+ A seeded round robin between the original{" "} + _4399 agent and variants that each change + exactly one knob, with colour-swapped pairs to cancel the first-move advantage. Every + number comes with its sample size and a 95% interval. +

+

+ Jump to:{" "} + + original benchmark + {" "} + ·{" "} + + reference round robin + {" "} + ·{" "} + + Python cross-check + {" "} + ·{" "} + + run your own + {" "} + ·{" "} + + alpha-beta efficiency + +

+
+ +
+ The headline result from the original Python ({benchmark.meta.generatedBy}, Python{" "} + {benchmark.meta.python}): the agent beat the subject's random agent in{" "} + {totals.wins} of {totals.games} games on boards 4 to 7, 20 seeded games per size and + colour. The count is unchanged; the interval is new. +

+ } + > +
+
+
+ {formatPct(overall.p)} +
+

+ {totals.wins} of {totals.games} games won against the random agent +

+
+ +

+ Wilson 95% CI{" "} + + {formatPct(overall.lower)} to {formatPct(overall.upper)} + +

+
+
+ + By board size (both colours pooled, 40 games each). Small samples give wide + intervals. + + } + > + + + + Board + + + Interval + `${t * 100}%`} + /> + + + Win rate (95% CI) + + + + + {bySize.map(({ n, ci }) => ( + + + {n} × {n} + + + + + + + + + ))} + + +
+
+ +
+

+ Every pairing played {cfg.rounds * 2} games per board size ({cfg.rounds} seeds, each + played twice with colours swapped) on{" "} + {cfg.sizes.map((n) => `${n}\u00a0×\u00a0${n}`).join(", ")}. Tournament seed{" "} + {cfg.seed}. Played by the TypeScript port, which reproduces the original Python move + for move in deterministic mode; the original is too slow for depth-3 search at this + scale, so a feasible subset was re-run in Python below. +

+ + } + > +
    + + Depth matters; dynamic depth barely runs. Fixed depth 3 beat the + original in {dynVsD3.bWins} of {dynVsD3.games} games ( + {formatPct(1 - dynVsD3.aWinRate.p)}, 95% CI {formatPct(1 - dynVsD3.aWinRate.upper)} to{" "} + {formatPct(1 - dynVsD3.aWinRate.lower)}). The original searched deeper than one ply on + only {deepSearches.deep} of {deepSearches.searches.toLocaleString("en-AU")} searched + moves ({formatPct(deepSearches.deep / deepSearches.searches)}): its thresholds only + deepen once fewer than 15% of cells are empty, and most games end before that. + + + The original is indistinguishable from greedy one-ply. Head to head + it won {dynVsGreedy.aWins} and lost {dynVsGreedy.bWins} ( + {formatPct(dynVsGreedy.aWinRate.p)}, 95% CI {formatPct(dynVsGreedy.aWinRate.lower)} to{" "} + {formatPct(dynVsGreedy.aWinRate.upper)}), and their Elo intervals overlap almost + entirely. The opening book and the late deepening add no detectable strength here. + + + Against random it reproduces the original benchmark.{" "} + {dynVsRandom.aWins}/{dynVsRandom.games} wins ({formatPct(dynVsRandom.aWinRate.p)}, 95% + CI {formatPct(dynVsRandom.aWinRate.lower)} to {formatPct(dynVsRandom.aWinRate.upper)}) + on boards 4 to 6, consistent with the 90% the Python run recorded on boards 4 to 7. + + + Strength costs time. Depth 3 is{" "} + {Math.round(d3.elo.estimate - dyn.elo.estimate)} Elo above the original but spends + about {Math.round(d3.moveMs.estimate / dyn.moveMs.estimate)}× as long per move, partly + because of the pruning bug described{" "} + + below + + . No first-move advantage was detectable: Red won {formatPct(all.colour.redWinRate.p)}{" "} + (95% CI {formatPct(all.colour.redWinRate.lower)} to{" "} + {formatPct(all.colour.redWinRate.upper)}). + +
+ + +
+ +
+ scripts/crosscheck_tournament.py rebuilt + the same variants from the unchanged Python (patching only{" "} + dynamic_depth_allocation and the + opening-book flag) and replayed the pairings that are feasible in Python on boards{" "} + {cross[0]?.sizes.join(" and ")}, with the same colour-swapped protocol. Random streams + differ between the languages, so games differ; the question is whether win rates + agree. With {cross[0]?.python.n} games per pairing this can only rule out large + discrepancies. +

+ } + > + + Win rate of the first-named agent. Difference = Python − TypeScript, with + Newcombe's 95% interval; an interval that contains 0 is consistent with no + difference. + + } + > + + + + Pairing + + + Original Python + + + TypeScript port + + + Difference interval + `${t > 0 ? "+" : ""}${Math.round(t * 100)}`} + /> + + + Difference (pp) + + + + + {cross.map((r) => ( + + + {AGENTS[r.a].short} vs{" "} + {AGENTS[r.b].short} + + + + + + + + + + + + + + + ))} + + +
+ +
+ Same harness, same statistics, run on your machine in Web Workers. Pick a seed to make + the run reproducible, then export the games and the summary as CSV. +

+ } + > + +
+ +
+

+ {ab.samples.length / (ALPHA_BETA_CONFIG.depths.length * 2)} mid-game positions ( + {ALPHA_BETA_CONFIG.perSize} per board size, from seeded greedy-vs-random games, seed{" "} + {ALPHA_BETA_CONFIG.seed}) were searched three ways at the same depth and move order: + plain minimax (no pruning), the original alpha-beta as submitted, and a textbook + alpha-beta. The share of the full tree each one visits is the pruning ratio; lower + is better. +

+

+ The original prunes very little (at best it still visits{" "} + {formatPct(worst.meanRatio.estimate)} of the tree). The cause is one line in{" "} + minimax.py: the minimising branch updates + beta with{" "} + if beta <= min_score: beta = min_score + , which can only raise beta, so the window never narrows there. The answer is still + right ({allMatch ? "all" : "not all"} {ab.samples.length} searches returned the same + root value as plain minimax), just slow. With{" "} + beta = min(beta, min_score) the same + search on 6 × 6 at depth 3 would visit {formatPct(deepest.textbookRatio.estimate)}{" "} + of the tree instead of {formatPct(deepest.meanRatio.estimate)}. The agent on this + site is left as submitted. +

+ + } + > + +
+ + Canonical (r, q) move order + +
+ +
+
+
+ + +
+
+
+
+ ); +} diff --git a/web/src/components/astar/heuristic-study.tsx b/web/src/components/astar/heuristic-study.tsx index 68510ad..8baefc9 100644 --- a/web/src/components/astar/heuristic-study.tsx +++ b/web/src/components/astar/heuristic-study.tsx @@ -1,12 +1,21 @@ "use client"; -import { FlaskConical, Loader2 } from "lucide-react"; +import { Download, FlaskConical, Loader2 } from "lucide-react"; +import { useMemo, useState } from "react"; +import { Segmented } from "@/components/play/primitives"; import { Button } from "@/components/ui/button"; import { useAstarBenchmark } from "@/hooks/use-astar-benchmark"; import { useElementWidth } from "@/hooks/use-element-width"; -import type { BenchmarkRow } from "@/lib/astar/random-board"; +import { + type PairedStudyRow, + pairedStudyCsvRows, + summarisePairedStudy, +} from "@/lib/analysis/astar-paired"; +import { toCsv } from "@/lib/csv"; +import { downloadText } from "@/lib/download"; import { randomSeed } from "@/lib/rng"; +import { PairedStudySummaryView } from "./paired-study-summary"; // The notebook looped `for i in range(100)`, skipping i < 2: every size from 2 to 99. const DIMENSIONS = Array.from({ length: 98 }, (_, i) => i + 2); @@ -15,6 +24,8 @@ const LAST = DIMENSIONS.at(-1)!; export function HeuristicStudy() { const { state, run } = useAstarBenchmark(); + const [boards, setBoards] = useState("1"); + const perSize = Number(boards); return (
@@ -30,21 +41,47 @@ export function HeuristicStudy() { Our report compared node expansions on random boards from the notebook's generator (random barriers, random start and goal) and found the two heuristics similar on small boards, with Manhattan expanding slightly fewer nodes as boards grew. Re-run the - experiment here: one random board for every size from {FIRST} × {FIRST} to {LAST} ×{" "} - {LAST}, counted the way the notebook counted them. + experiment here: random boards for every size from {FIRST} × {FIRST} to {LAST} × {LAST}, + counted the way the notebook counted them. One board per size is the notebook's + protocol; more boards per size give tighter intervals.

+

+ The comparison is now paired: both + heuristics search the same boards, so the analysis works on the per-board difference + (paired bootstrap interval, Wilcoxon signed-rank test, effect sizes). Each board is also + solved by breadth-first search to check whether A* returned a shortest path. +

+ +
+ + Boards per size + + +
-
{state.status === "idle" && (
- Press “Run the study” to generate {DIMENSIONS.length} random boards in a Web - Worker. + Press “Run the study” to generate {DIMENSIONS.length * perSize} random + boards in a Web Worker.
)} {state.status === "running" && ( @@ -52,8 +89,10 @@ export function HeuristicStudy() { className="text-muted-foreground flex h-56 items-center justify-center gap-2 rounded-2xl border border-dashed px-4 text-center text-sm" role="status" > - Running {DIMENSIONS.length * 2}{" "} - searches ({DIMENSIONS.length} boards × 2 heuristics)… + Running{" "} + {DIMENSIONS.length * state.boardsPerDimension * 2} searches ( + {DIMENSIONS.length * state.boardsPerDimension} boards × 2 heuristics) plus a + breadth-first check on each board…
)} {state.status === "error" && ( @@ -65,22 +104,73 @@ export function HeuristicStudy() {

)} {state.status === "done" && ( - + )}
); } -function StudyChart({ +function LiveResults({ rows, seed, + boardsPerDimension, + elapsedMs, +}: { + rows: PairedStudyRow[]; + seed: number; + boardsPerDimension: number; + elapsedMs: number; +}) { + const summary = useMemo(() => summarisePairedStudy(rows, { reps: 2000, seed }), [rows, seed]); + return ( +
+ + + +
+ ); +} + +function StudyChart({ + rows: boardRows, + seed, elapsedMs, + boardsPerDimension, }: { - rows: BenchmarkRow[]; + rows: PairedStudyRow[]; seed: number; elapsedMs: number; + boardsPerDimension: number; }) { + // One point per board size: the mean over that size's boards. + const rows = useMemo(() => { + const byDim = new Map(); + for (const r of boardRows) byDim.set(r.dimension, [...(byDim.get(r.dimension) ?? []), r]); + return [...byDim.entries()].map(([dimension, list]) => ({ + dimension, + manhattan: list.reduce((s, r) => s + r.manhattan.expansions, 0) / list.length, + euclidean: list.reduce((s, r) => s + r.euclidean.expansions, 0) / list.length, + })); + }, [boardRows]); // Draw at the container's real width so the axis labels stay legible. const [boxRef, measured] = useElementWidth(760); const W = Math.max(280, measured); @@ -94,11 +184,11 @@ function StudyChart({ const line = (key: "manhattan" | "euclidean") => rows.map((r) => `${x(r.dimension).toFixed(1)},${y(r[key]).toFixed(1)}`).join(" "); - const mWins = rows.filter((r) => r.manhattan < r.euclidean).length; - const eWins = rows.filter((r) => r.euclidean < r.manhattan).length; - const ties = rows.length - mWins - eWins; - const sumM = rows.reduce((s, r) => s + r.manhattan, 0); - const sumE = rows.reduce((s, r) => s + r.euclidean, 0); + const mWins = boardRows.filter((r) => r.manhattan.expansions < r.euclidean.expansions).length; + const eWins = boardRows.filter((r) => r.euclidean.expansions < r.manhattan.expansions).length; + const ties = boardRows.length - mWins - eWins; + const sumM = boardRows.reduce((s, r) => s + r.manhattan.expansions, 0); + const sumE = boardRows.reduce((s, r) => s + r.euclidean.expansions, 0); const yTicks = [0, 0.25, 0.5, 0.75, 1].map((f) => Math.round(maxY * f)); const tickStep = W < 480 ? 40 : 20; const xTicks = rows @@ -113,10 +203,10 @@ function StudyChart({ return (
- + {yTicks.map((t) => ( @@ -198,6 +288,7 @@ function StudyChart({ ))} Metric: the notebook's expansion counter (nodes added to the queue after the start) + {boardsPerDimension > 1 ? `, averaged over ${boardsPerDimension} boards per size` : ""} seed {seed} · {Math.round(elapsedMs)} ms in a Web Worker diff --git a/web/src/components/astar/paired-study-summary.tsx b/web/src/components/astar/paired-study-summary.tsx new file mode 100644 index 0000000..f61d8b3 --- /dev/null +++ b/web/src/components/astar/paired-study-summary.tsx @@ -0,0 +1,131 @@ +/** + * Paired Manhattan vs Euclidean results. Pure (no hooks): used for the + * precomputed reference study on the server and for live runs on the client. + */ +import { EstimateCI, IntervalAxis, IntervalBar } from "@/components/stats/interval"; +import { ScrollTable } from "@/components/stats/scroll-table"; +import type { PairedStudySummary } from "@/lib/analysis/astar-paired"; +import { formatNumber, formatP, formatPct, formatSigned } from "@/lib/stats/format"; + +const pctCI = (lo: number, hi: number) => `[${(lo * 100).toFixed(1)}, ${(hi * 100).toFixed(1)}]`; + +export function PairedStudySummaryView({ summary }: { summary: PairedStudySummary }) { + const e = summary.expansions; + const o = summary.optimality; + const w = e.wilcoxon; + const rows = [ + { label: "Manhattan", ci: o.manhattan, excess: o.manhattanExcess }, + { label: "Euclidean", ci: o.euclidean, excess: o.euclideanExcess }, + { label: "Both the same length", ci: o.agreement, excess: null }, + ]; + return ( +
+
+

Node expansions (paired, {summary.boards} boards)

+
+ + + + +
+

+ Manhattan expanded fewer nodes on {e.manhattanFewer} boards, Euclidean on{" "} + {e.euclideanFewer}, with {e.ties} ties. Negative differences favour Manhattan. +

+
+ +
+

+ Did A* find a shortest path? ({summary.boardsWithPath} boards with a path) +

+ Compared with a breadth-first search on the same board. Wilson 95% intervals. + } + > + + + + Heuristic + + + Interval + `${t * 100}%`} /> + + + Rate (95% CI) + + + Extra cells + + + + + {rows.map((r) => ( + + + {r.label} + + {r.excess === null ? "agreement rate" : "shortest path found"} + + + + + + + + + + {r.excess === null ? "" : `+${formatNumber(r.excess, 2)}`} + + + ))} + + +

+ Extra cells: mean path length beyond the shortest, over boards with a path (largest seen:{" "} + {o.maxExcess}). Neither heuristic is admissible on this grid: both overestimate the true + distance for {formatPct(summary.overestimation.manhattan)} of start/goal pairs on an empty{" "} + {summary.overestimation.dimension} × {summary.overestimation.dimension} board. +

+
+
+ ); +} + +function Stat({ label, value, hint }: { label: string; value: string; hint?: string }) { + return ( +
+
{label}
+
{value}
+ {hint &&
{hint}
} +
+ ); +} diff --git a/web/src/components/layout/page-header.tsx b/web/src/components/layout/page-header.tsx new file mode 100644 index 0000000..24b3b95 --- /dev/null +++ b/web/src/components/layout/page-header.tsx @@ -0,0 +1,66 @@ +import type { ReactNode } from "react"; + +import { cn } from "@/lib/utils"; + +export function PageHeader({ + eyebrow, + title, + children, +}: { + eyebrow: string; + title: string; + children?: ReactNode; +}) { + return ( +
+

+ {eyebrow} +

+

{title}

+ {children &&
{children}
} +
+ ); +} + +export function Section({ + id, + eyebrow, + title, + intro, + children, + className, +}: { + id: string; + eyebrow?: string; + title: string; + intro?: ReactNode; + children: ReactNode; + className?: string; +}) { + return ( +
+
+ {eyebrow && ( +

+ {eyebrow} +

+ )} +

+ {title} +

+ {intro &&
{intro}
} +
+
{children}
+
+ ); +} + +export function Finding({ children }: { children: ReactNode }) { + return ( +
  • {children}
  • + ); +} diff --git a/web/src/components/stats/interval.tsx b/web/src/components/stats/interval.tsx new file mode 100644 index 0000000..163aaa8 --- /dev/null +++ b/web/src/components/stats/interval.tsx @@ -0,0 +1,144 @@ +/** + * Forest-plot style interval marks for tables: a 2px interval line with end + * caps and an 8px point estimate wearing a surface ring, on a hairline track + * with an optional reference line (e.g. 50% or 0). Exact numbers always sit + * in an adjacent cell, so the mark never carries information on its own. + */ +import { cn } from "@/lib/utils"; + +const clamp = (x: number) => Math.min(100, Math.max(0, x)); + +export function IntervalBar({ + estimate, + lower, + upper, + min, + max, + reference, + label, + className, +}: { + estimate: number; + lower: number; + upper: number; + min: number; + max: number; + reference?: number; + /** Accessible description, also shown as a tooltip. */ + label: string; + className?: string; +}) { + const pct = (x: number) => clamp(((x - min) / (max - min || 1)) * 100); + const lo = pct(Math.min(lower, upper)); + const hi = pct(Math.max(lower, upper)); + const valid = [estimate, lower, upper].every(Number.isFinite); + return ( +
    +
    + {reference !== undefined && ( +
    + )} + {valid && ( + <> +
    +
    +
    +
    + + )} +
    + ); +} + +/** Axis labels for a column of IntervalBars (put it in the header cell). */ +export function IntervalAxis({ + min, + max, + ticks, + format, +}: { + min: number; + max: number; + ticks: number[]; + format: (x: number) => string; +}) { + return ( +
    + {ticks.map((t, i) => { + const left = clamp(((t - min) / (max - min || 1)) * 100); + const align = + i === 0 + ? "translate-x-0" + : i === ticks.length - 1 + ? "-translate-x-full" + : "-translate-x-1/2"; + return ( + + {format(t)} + + ); + })} +
    + ); +} + +/** "76.0% [72.0, 79.6]" style estimate with its interval, interval de-emphasised. */ +export function EstimateCI({ + estimate, + interval, + className, +}: { + estimate: string; + interval: string; + className?: string; +}) { + return ( + + {estimate} {interval} + + ); +} + +/** Nice round ticks spanning [min, max]. */ +export function niceTicks(min: number, max: number, count = 4): number[] { + const span = max - min || 1; + const raw = span / count; + const mag = 10 ** Math.floor(Math.log10(raw)); + const step = [1, 2, 2.5, 5, 10].map((m) => m * mag).find((s) => span / s <= count) ?? 10 * mag; + const out: number[] = []; + for (let t = Math.ceil(min / step) * step; t <= max + 1e-9; t += step) + out.push(Number(t.toFixed(10))); + return out; +} diff --git a/web/src/components/stats/scroll-table.tsx b/web/src/components/stats/scroll-table.tsx new file mode 100644 index 0000000..f65940b --- /dev/null +++ b/web/src/components/stats/scroll-table.tsx @@ -0,0 +1,27 @@ +import type { ReactNode } from "react"; + +import { cn } from "@/lib/utils"; + +/** + * A table that scrolls sideways on narrow screens, with its caption kept + * outside the scroll area so it always wraps to the viewport. + */ +export function ScrollTable({ + caption, + className, + children, +}: { + caption?: ReactNode; + /** Classes for the (e.g. a min-width). */ + className?: string; + children: ReactNode; +}) { + return ( +
    + {caption &&
    {caption}
    } +
    +
    {children}
    +
    +
    + ); +} diff --git a/web/src/components/tournament/alpha-beta-table.tsx b/web/src/components/tournament/alpha-beta-table.tsx new file mode 100644 index 0000000..6320845 --- /dev/null +++ b/web/src/components/tournament/alpha-beta-table.tsx @@ -0,0 +1,98 @@ +/** + * Alpha-beta efficiency table: share of the full minimax tree each search + * visits, per board size and depth, with bootstrap intervals over positions. + */ +import { EstimateCI, IntervalAxis, IntervalBar } from "@/components/stats/interval"; +import { ScrollTable } from "@/components/stats/scroll-table"; +import type { PruningGroup } from "@/lib/analysis/alpha-beta"; +import { formatNumber, formatPct } from "@/lib/stats/format"; + +const ci = (lo: number, hi: number) => `[${(lo * 100).toFixed(1)}, ${(hi * 100).toFixed(1)}]`; + +export function AlphaBetaTable({ groups, caption }: { groups: PruningGroup[]; caption: string }) { + return ( + {caption}}> + + + + Board · depth + + + Full tree (nodes) + + + Share of tree visited + `${t * 100}%`} /> + + + Original: share visited + + + Textbook: share visited + + + Same value + + + + + {groups.map((g) => ( + + + {g.n}×{g.n} · d{g.depth} + + {g.positions} positions + + + + {formatNumber(g.meanFull, 0)} + + + + + + + + + {formatNumber(g.meanPruned, 0)} nodes + + + + + + {formatNumber(g.meanTextbook, 0)} nodes + + + + {g.valueMatches}/{g.positions} · {g.textbookValueMatches}/{g.positions} + + + ))} + + + ); +} diff --git a/web/src/components/tournament/reference-tournament.tsx b/web/src/components/tournament/reference-tournament.tsx new file mode 100644 index 0000000..da9d8b3 --- /dev/null +++ b/web/src/components/tournament/reference-tournament.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { useState } from "react"; + +import { Segmented } from "@/components/play/primitives"; +import type { TournamentSummary } from "@/lib/tournament/analyse"; +import { Leaderboard, PairwiseTable, SummaryStats } from "./tournament-results"; + +/** Switches between precomputed summaries (all sizes, or one board size). */ +export function ReferenceTournament({ + summaries, + hardware, +}: { + summaries: { key: string; label: string; summary: TournamentSummary }[]; + /** Where the move times were measured, e.g. "Apple M4, Node v26". */ + hardware: string; +}) { + const [key, setKey] = useState(summaries[0].key); + const current = summaries.find((s) => s.key === key) ?? summaries[0]; + return ( +
    +
    + ({ value: s.key, label: s.label }))} + /> +
    + + + +
    + ); +} diff --git a/web/src/components/tournament/tournament-results.tsx b/web/src/components/tournament/tournament-results.tsx new file mode 100644 index 0000000..9a5caf4 --- /dev/null +++ b/web/src/components/tournament/tournament-results.tsx @@ -0,0 +1,214 @@ +/** + * Results tables shared by the precomputed reference tournament and the + * in-browser runner. Pure presentational components (no hooks), so they render + * on the server for the reference and on the client for live runs. + */ +import { EstimateCI, IntervalAxis, IntervalBar, niceTicks } from "@/components/stats/interval"; +import { ScrollTable } from "@/components/stats/scroll-table"; +import { AGENTS } from "@/lib/tournament/agents"; +import type { TournamentSummary } from "@/lib/tournament/analyse"; +import { formatNumber, formatPct } from "@/lib/stats/format"; + +const pctCI = (lo: number, hi: number) => `[${(lo * 100).toFixed(1)}, ${(hi * 100).toFixed(1)}]`; + +export function Leaderboard({ summary, caption }: { summary: TournamentSummary; caption: string }) { + const finite = summary.standings + .flatMap((s) => [s.elo.lower, s.elo.upper]) + .filter(Number.isFinite); + const lo = Math.min(0, ...finite); + const hi = Math.max(100, ...finite); + const pad = (hi - lo) * 0.06; + const min = lo - pad; + const max = hi + pad; + return ( + {caption}}> + + + + Agent + + + Strength interval + String(t)} + /> + + + Elo vs random (95% CI) + + + Win rate (95% CI) + + + W–D–L + + + Illegal + + + ms / move (95% CI) + + + + + {summary.standings.map((s) => { + const anchor = s.id === summary.anchor; + return ( + + + {AGENTS[s.id].label} + {AGENTS[s.id].knob} + + + {anchor ? ( + reference (0) + ) : ( + + )} + + + {anchor ? ( + 0 + ) : ( + + )} + + + + + + {s.wins}–{s.draws}–{s.losses} + + {s.illegalMoves} + + + + + ); + })} + + + ); +} + +export function PairwiseTable({ summary }: { summary: TournamentSummary }) { + return ( + + Head to head. Win rate of the first-named agent; the vertical line marks 50%. Each pairing + played equal games as Red and as Blue. + + } + > + + + + Pairing + + + W–L (D) + + + Win rate interval + `${t * 100}%`} /> + + + Win rate (95% CI) + + + As Red / as Blue + + + + + {summary.pairs.map((p) => ( + + + {AGENTS[p.a].short} vs{" "} + {AGENTS[p.b].short} + + + {p.aWins}–{p.bWins} + {p.draws > 0 && ({p.draws})} + + + + + + + + + {p.aAsRed.wins}/{p.aAsRed.games} · {p.aAsBlue.wins}/{p.aAsBlue.games} + + + ))} + + + ); +} + +export function SummaryStats({ summary }: { summary: TournamentSummary }) { + const c = summary.colour; + return ( +
    + + + +
    + ); +} + +function Stat({ label, value, hint }: { label: string; value: string; hint?: string }) { + return ( +
    +
    {label}
    +
    {value}
    + {hint &&
    {hint}
    } +
    + ); +} diff --git a/web/src/components/tournament/tournament-runner.tsx b/web/src/components/tournament/tournament-runner.tsx new file mode 100644 index 0000000..f9c5957 --- /dev/null +++ b/web/src/components/tournament/tournament-runner.tsx @@ -0,0 +1,268 @@ +"use client"; + +import { Download, Loader2, Play, Shuffle, Square } from "lucide-react"; +import { useMemo, useState } from "react"; + +import { Field, Panel } from "@/components/play/primitives"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { useTournamentPool } from "@/hooks/use-tournament-pool"; +import { downloadText } from "@/lib/download"; +import { randomSeed } from "@/lib/rng"; +import { AGENT_IDS, AGENTS, type AgentId } from "@/lib/tournament/agents"; +import { gamesCsv, summariseTournament, summaryCsv } from "@/lib/tournament/analyse"; +import type { GameRecord } from "@/lib/tournament/play"; +import { buildSchedule } from "@/lib/tournament/schedule"; +import { Leaderboard, PairwiseTable, SummaryStats } from "./tournament-results"; + +const SIZES = [3, 4, 5, 6, 7]; +const ROUNDS = [1, 2, 5, 10, 20]; + +type Status = + | { kind: "idle" } + | { kind: "running"; total: number; started: number } + | { kind: "done"; elapsedMs: number; cancelled: boolean } + | { kind: "error"; message: string }; + +export function TournamentRunner() { + const [agents, setAgents] = useState([ + "minimax-dynamic", + "minimax-d2", + "greedy", + "random", + ]); + const [sizes, setSizes] = useState([4, 5]); + const [rounds, setRounds] = useState(5); + const [seed, setSeed] = useState(4399); + const [seedText, setSeedText] = useState("4399"); + const [records, setRecords] = useState([]); + const [status, setStatus] = useState({ kind: "idle" }); + const [ranSeed, setRanSeed] = useState(seed); + const pool = useTournamentPool(); + + const running = status.kind === "running"; + const games = + agents.length >= 2 && sizes.length + ? ((agents.length * (agents.length - 1)) / 2) * sizes.length * rounds * 2 + : 0; + const slow = agents.includes("minimax-d3") && sizes.some((n) => n >= 6); + const tooBig = agents.some((a) => sizes.some((n) => n > AGENTS[a].maxLiveN)); + + const toggle = (list: T[], item: T) => + list.includes(item) ? list.filter((x) => x !== item) : [...list, item]; + + const start = async () => { + const schedule = buildSchedule({ agents, sizes, rounds, seed }); + setRecords([]); + setRanSeed(seed); + const started = performance.now(); + setStatus({ kind: "running", total: schedule.length, started }); + const collected: GameRecord[] = []; + try { + const outcome = await pool.run(schedule, (r) => { + collected.push(r); + setRecords([...collected]); + }); + setStatus({ + kind: "done", + elapsedMs: performance.now() - started, + cancelled: outcome === "cancelled", + }); + } catch (err) { + setStatus({ kind: "error", message: err instanceof Error ? err.message : String(err) }); + } + }; + + const summary = useMemo( + () => + status.kind === "done" && records.length > 0 + ? summariseTournament(records, { reps: 500, seed: ranSeed }) + : null, + [records, ranSeed, status.kind], + ); + + const stamp = `seed-${ranSeed}`; + + return ( +
    + +
    +
    + + Agents + + {AGENT_IDS.map((id) => ( +
    + setAgents((a) => toggle(a, id))} + className="mt-0.5" + /> + +
    + ))} +
    + +
    + + Board sizes + +
    + {SIZES.map((n) => ( + + ))} +
    +
    + +
    + + Colour-swapped pairs per pairing and size + +
    + {ROUNDS.map((r) => ( + + ))} +
    +
    + + +
    + { + setSeedText(e.target.value); + const v = Number.parseInt(e.target.value, 10); + if (Number.isFinite(v) && v >= 0) setSeed(v); + }} + /> + +
    +
    + +

    + {games.toLocaleString("en-AU")} games, played in parallel Web Workers. + {slow && " Depth 3 on 6 × 6 and above takes a few seconds per game."} + {tooBig && " Some agents are slow at the larger sizes selected."} +

    + + {running ? ( + + ) : ( + + )} +
    +
    + +
    + {status.kind === "idle" && ( +
    + Choose agents and board sizes, then run. Every game is reproducible from the seed; each + pairing plays the same seed twice with colours swapped. +
    + )} + {status.kind === "running" && ( +
    +
    + Played {records.length} of {status.total}{" "} + games… +
    +
    +
    +
    +
    + )} + {status.kind === "error" && ( +

    + {status.message} +

    + )} + {summary && status.kind === "done" && ( + <> +
    +

    + {status.cancelled ? "Stopped early: " : ""} + {records.length} games in {(status.elapsedMs / 1000).toFixed(1)} s · seed {ranSeed} +

    + + +
    + + + + + )} +
    +
    + ); +} diff --git a/web/src/components/ui/checkbox.tsx b/web/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..4f33bf0 --- /dev/null +++ b/web/src/components/ui/checkbox.tsx @@ -0,0 +1,25 @@ +"use client" + +import * as React from "react" +import { cn } from "cn" +import { CheckIcon } from "lucide-react" +import { Checkbox as CheckboxPrimitive } from "radix-ui" + +function Checkbox({ className, ...props }: React.ComponentProps) { + return ( + + + + + + ) +} + +export { Checkbox } diff --git a/web/src/components/ui/input.tsx b/web/src/components/ui/input.tsx new file mode 100644 index 0000000..2a7d204 --- /dev/null +++ b/web/src/components/ui/input.tsx @@ -0,0 +1,18 @@ +import * as React from "react" +import { cn } from "cn" + +function Input({ className, type, ...props }: React.ComponentProps<"input">) { + return ( + + ) +} + +export { Input } diff --git a/web/src/hooks/use-astar-benchmark.ts b/web/src/hooks/use-astar-benchmark.ts index 3992385..d40017a 100644 --- a/web/src/hooks/use-astar-benchmark.ts +++ b/web/src/hooks/use-astar-benchmark.ts @@ -2,16 +2,22 @@ import { useCallback, useEffect, useRef, useState } from "react"; -import { type BenchmarkRow, runHeuristicBenchmark } from "@/lib/astar/random-board"; +import { type PairedStudyRow, runPairedStudy } from "@/lib/analysis/astar-paired"; import type { BenchmarkResponse } from "@/workers/astar-benchmark.worker"; type State = | { status: "idle" } - | { status: "running"; seed: number } - | { status: "done"; seed: number; rows: BenchmarkRow[]; elapsedMs: number } + | { status: "running"; seed: number; boardsPerDimension: number } + | { + status: "done"; + seed: number; + boardsPerDimension: number; + rows: PairedStudyRow[]; + elapsedMs: number; + } | { status: "error"; message: string }; -/** Runs the heuristic study in a Web Worker (main-thread fallback). */ +/** Runs the paired heuristic study in a Web Worker (main-thread fallback). */ export function useAstarBenchmark() { const [state, setState] = useState({ status: "idle" }); const workerRef = useRef(null); @@ -31,6 +37,7 @@ export function useAstarBenchmark() { ? { status: "done", seed: prev.status === "running" ? prev.seed : 0, + boardsPerDimension: prev.status === "running" ? prev.boardsPerDimension : 1, rows: res.rows, elapsedMs: res.elapsedMs, } @@ -46,18 +53,24 @@ export function useAstarBenchmark() { return () => worker?.terminate(); }, []); - const run = useCallback((dimensions: number[], seed: number) => { + const run = useCallback((dimensions: number[], boardsPerDimension: number, seed: number) => { const id = ++latest.current; - setState({ status: "running", seed }); + setState({ status: "running", seed, boardsPerDimension }); const worker = workerRef.current; if (worker) { - worker.postMessage({ id, dimensions, seed }); + worker.postMessage({ id, dimensions, boardsPerDimension, seed }); } else { setTimeout(() => { const started = performance.now(); - const rows = runHeuristicBenchmark(dimensions, seed); + const rows = runPairedStudy({ dimensions, boardsPerDimension, seed }); if (id === latest.current) - setState({ status: "done", seed, rows, elapsedMs: performance.now() - started }); + setState({ + status: "done", + seed, + boardsPerDimension, + rows, + elapsedMs: performance.now() - started, + }); }, 0); } }, []); diff --git a/web/src/hooks/use-tournament-pool.ts b/web/src/hooks/use-tournament-pool.ts new file mode 100644 index 0000000..c9caccb --- /dev/null +++ b/web/src/hooks/use-tournament-pool.ts @@ -0,0 +1,111 @@ +"use client"; + +import { useCallback, useEffect, useRef } from "react"; + +import { type GameRecord, playTournamentGame } from "@/lib/tournament/play"; +import type { GameSpec } from "@/lib/tournament/schedule"; +import type { TournamentJobResult } from "@/workers/tournament.worker"; + +/** Number of parallel workers: leave one core for the page, cap at 4. */ +export function poolSize(): number { + const cores = typeof navigator !== "undefined" ? navigator.hardwareConcurrency || 2 : 2; + return Math.max(1, Math.min(4, cores - 1)); +} + +/** + * Runs a list of games across a small pool of Web Workers, reporting each + * record as it finishes. Falls back to the main thread (yielding between + * games) when workers are unavailable. Cancelling terminates the workers. + */ +export function useTournamentPool() { + const workers = useRef([]); + const cancelled = useRef(false); + + const stop = useCallback(() => { + cancelled.current = true; + for (const w of workers.current) w.terminate(); + workers.current = []; + }, []); + + useEffect(() => stop, [stop]); + + const run = useCallback( + (specs: GameSpec[], onRecord: (record: GameRecord) => void): Promise<"done" | "cancelled"> => { + stop(); + cancelled.current = false; + let next = 0; + let finished = 0; + + return new Promise((resolve, reject) => { + const finishIfDone = () => { + if (finished === specs.length) { + stop(); + cancelled.current = false; + resolve("done"); + } + }; + if (specs.length === 0) return resolve("done"); + + let pool: Worker[] = []; + try { + pool = Array.from( + { length: Math.min(poolSize(), specs.length) }, + () => + new Worker(new URL("../workers/tournament.worker.ts", import.meta.url), { + type: "module", + }), + ); + } catch { + pool = []; + } + + if (pool.length === 0) { + // Main-thread fallback. + const step = () => { + if (cancelled.current) return resolve("cancelled"); + if (next >= specs.length) return resolve("done"); + onRecord(playTournamentGame(specs[next++])); + setTimeout(step, 0); + }; + return step(); + } + + workers.current = pool; + const dispatch = (w: Worker) => { + if (next >= specs.length) return; + const id = next++; + w.postMessage({ id, spec: specs[id] }); + }; + for (const w of pool) { + w.onmessage = (event: MessageEvent) => { + if (cancelled.current) return; + const res = event.data; + if (!res.ok) { + stop(); + reject(new Error(res.error)); + return; + } + finished++; + onRecord(res.record); + dispatch(w); + finishIfDone(); + }; + w.onerror = () => { + stop(); + reject(new Error("A tournament worker crashed.")); + }; + dispatch(w); + } + const poll = setInterval(() => { + if (cancelled.current) { + clearInterval(poll); + resolve("cancelled"); + } else if (finished === specs.length) clearInterval(poll); + }, 200); + }); + }, + [stop], + ); + + return { run, stop }; +} diff --git a/web/src/lib/agent/minimax.ts b/web/src/lib/agent/minimax.ts index ee99493..8f6cb9e 100644 --- a/web/src/lib/agent/minimax.ts +++ b/web/src/lib/agent/minimax.ts @@ -17,6 +17,11 @@ export interface SearchContext { */ order: MoveOrder; bias: BiasFn; + /** + * Alpha-beta cut-offs (the original always prunes). Turning this off gives + * plain minimax with the same move order, for the pruning-efficiency study. + */ + prune: boolean; /** Number of nodes visited (for the UI). */ nodes: number; /** Root-level (action, score) pairs, recorded when requested. */ @@ -26,9 +31,11 @@ export interface SearchContext { export const createContext = ( order: MoveOrder = "canonical", bias: BiasFn = noBias, + prune = true, ): SearchContext => ({ order, bias, + prune, nodes: 0, }); @@ -109,7 +116,7 @@ export function minimax( maxAction = action; } if (maxScore >= alpha) alpha = maxScore; - if (alpha >= beta) break; + if (ctx.prune && alpha >= beta) break; } return [maxScore, maxAction]; } @@ -126,7 +133,7 @@ export function minimax( minAction = action; } if (beta <= minScore) beta = minScore; - if (alpha >= beta) break; + if (ctx.prune && alpha >= beta) break; } return [minScore, minAction]; } diff --git a/web/src/lib/agent/player.ts b/web/src/lib/agent/player.ts index 860752c..50fc57d 100644 --- a/web/src/lib/agent/player.ts +++ b/web/src/lib/agent/player.ts @@ -78,6 +78,11 @@ export interface AgentOptions { bias?: BiasFn; /** Use the opening book on turns 1 and 2 (the original's default). */ enforceGamePlay?: boolean; + /** + * Search to this depth instead of `dynamic_depth_allocation` (used by the + * tournament's fixed-depth and greedy variants; the original never sets it). + */ + fixedDepth?: number; } /** Choose the agent's action for `colour`, given the full action history. */ @@ -96,7 +101,7 @@ export function agentAction( colour: Colour, options: AgentOptions = {}, ): AgentDecision { - const { order = "canonical", bias = noBias, enforceGamePlay = true } = options; + const { order = "canonical", bias = noBias, enforceGamePlay = true, fixedDepth } = options; if (board.turn <= 2 && enforceGamePlay) { const { action, rule } = enforcedGamestartPlay(board.n, colour, board); @@ -110,7 +115,7 @@ export function agentAction( if (gameEnd(tmp)) return { action, explanation: { kind: "instant-win" } }; } - const depth = dynamicDepthAllocation(board); + const depth = fixedDepth ?? dynamicDepthAllocation(board); const ctx = createContext(order, bias); ctx.rootScores = []; const [score, action] = minimax(board, depth, -Infinity, Infinity, colour === "red", ctx, true); diff --git a/web/src/lib/analysis/alpha-beta.ts b/web/src/lib/analysis/alpha-beta.ts new file mode 100644 index 0000000..1c1fcfc --- /dev/null +++ b/web/src/lib/analysis/alpha-beta.ts @@ -0,0 +1,256 @@ +/** + * How much work does alpha-beta pruning save the `_4399` search? + * + * For a sample of mid-game positions, the ported minimax runs twice at the + * same depth from the same position: once as written (with cut-offs) and once + * with pruning switched off. Plain minimax visits every node, so its count does + * not depend on move order; the pruned count does, so it is measured with both + * the agent's shuffled order and the canonical (r, q) order. The evaluation's + * random tie-break bias is switched off so both runs score positions + * identically, which lets the study check that pruning never changes the + * value of the root. + * + * Finding: the original's minimising branch updates beta with + * `if beta <= min_score: beta = min_score`, which only ever raises beta, so + * the window never tightens there and most cut-offs are lost. The result is + * still correct (a looser window never changes the minimax value), just slow. + * The study therefore also measures a textbook alpha-beta (beta = + * min(beta, score)) with identical move generation and evaluation, to show + * what the one-line fix would buy. The agent itself is left as submitted. + */ +import { AgentBoard } from "@/lib/agent/agent-board"; +import { noBias } from "@/lib/agent/evaluation"; +import { evaluate } from "@/lib/agent/evaluation"; +import { + type SearchContext, + createContext, + gameEnd, + getValidActions, + minimax, +} from "@/lib/agent/minimax"; +import type { Action, Colour } from "@/lib/cachex/types"; +import { createRng, deriveSeed, randInt } from "@/lib/rng"; +import { type BootstrapCI, bootstrap, bootstrapMean } from "@/lib/stats/bootstrap"; +import { geometricMean, median } from "@/lib/stats/descriptive"; +import { tournamentMove } from "@/lib/tournament/agents"; +import { playTournamentGame } from "@/lib/tournament/play"; + +export type SearchOrder = "shuffled" | "canonical"; + +export interface PruningPosition { + n: number; + actions: Action[]; + /** Cells still empty. */ + empty: number; + toMove: Colour; + seed: number; +} + +export interface PruningSample { + n: number; + depth: number; + order: SearchOrder; + empty: number; + nodesPruned: number; + nodesFull: number; + /** nodesPruned / nodesFull: the share of the full tree alpha-beta still visits. */ + ratio: number; + /** Did pruning return the same root value as full minimax? */ + valueMatches: boolean; + /** Nodes visited by textbook alpha-beta (corrected beta update), same order. */ + nodesTextbook: number; + ratioTextbook: number; + textbookValueMatches: boolean; +} + +/** + * Mid-game positions from seeded greedy-vs-random games, taken after the + * opening (turn 3 onwards) and before the game ends. + */ +export function samplePositions({ + sizes, + perSize, + seed, +}: { + sizes: readonly number[]; + perSize: number; + seed: number; +}): PruningPosition[] { + const out: PruningPosition[] = []; + for (const n of sizes) { + let attempt = 0; + let found = 0; + while (found < perSize && attempt < perSize * 20) { + const gameSeed = deriveSeed(seed, n, attempt++); + const actions = replayActions(n, gameSeed); + if (actions.length < 4) continue; + const rng = createRng(deriveSeed(gameSeed, 1)); + const cut = randInt(rng, 2, actions.length - 1); + const board = AgentBoard.fromActions(n, actions.slice(0, cut)); + out.push({ + n, + actions: actions.slice(0, cut), + empty: board.emptyCount(), + toMove: cut % 2 === 0 ? "red" : "blue", + seed: gameSeed, + }); + found++; + } + } + return out; +} + +/** The actions of one seeded greedy (Red) vs random (Blue) game. */ +function replayActions(n: number, seed: number): Action[] { + const actions: Action[] = []; + playTournamentGame( + { id: "sample", n, red: "greedy", blue: "random", seed, round: 0 }, + { + now: () => 0, + move: (id, size, history, colour, moveSeed) => { + const { action } = tournamentMove(id, size, history, colour, createRng(moveSeed)); + actions.push(action); + return action; + }, + }, + ); + return actions; +} + +/** + * Textbook alpha-beta: identical to the port except that the minimising + * branch lowers beta (beta = min(beta, score)). Study-only; never used to play. + */ +export function textbookAlphaBeta( + board: AgentBoard, + depth: number, + alpha: number, + beta: number, + maximizingPlayer: boolean, + ctx: SearchContext, +): number { + ctx.nodes += 1; + const player: Colour = maximizingPlayer ? "red" : "blue"; + if (depth === 0 || gameEnd(board)) { + if (board.winner === null) return evaluate(board, ctx.bias); + return board.winner === "red" ? Infinity : -Infinity; + } + const actions = getValidActions(board, ctx.order); + if (maximizingPlayer) { + let best = -Infinity; + for (const action of actions) { + const child = board.clone(); + child.update(player, action); + best = Math.max(best, textbookAlphaBeta(child, depth - 1, alpha, beta, false, ctx)); + alpha = Math.max(alpha, best); + if (alpha >= beta) break; + } + return best; + } + let best = Infinity; + for (const action of actions) { + const child = board.clone(); + child.update(player, action); + best = Math.min(best, textbookAlphaBeta(child, depth - 1, alpha, beta, true, ctx)); + beta = Math.min(beta, best); + if (alpha >= beta) break; + } + return best; +} + +export function measurePruning( + position: PruningPosition, + depth: number, + order: SearchOrder, +): PruningSample { + const board = AgentBoard.fromActions(position.n, position.actions); + const maximizing = position.toMove === "red"; + const context = (prune: boolean) => + createContext( + order === "canonical" ? "canonical" : createRng(deriveSeed(position.seed, depth)), + noBias, + prune, + ); + const search = (prune: boolean) => { + const ctx = context(prune); + const [score] = minimax(board.clone(), depth, -Infinity, Infinity, maximizing, ctx); + return { score, nodes: ctx.nodes }; + }; + const pruned = search(true); + const full = search(false); + const tctx = context(true); + const textbook = textbookAlphaBeta(board.clone(), depth, -Infinity, Infinity, maximizing, tctx); + return { + n: position.n, + depth, + order, + empty: position.empty, + nodesPruned: pruned.nodes, + nodesFull: full.nodes, + ratio: pruned.nodes / full.nodes, + valueMatches: pruned.score === full.score, + nodesTextbook: tctx.nodes, + ratioTextbook: tctx.nodes / full.nodes, + textbookValueMatches: textbook === full.score, + }; +} + +export interface PruningGroup { + n: number; + depth: number; + order: SearchOrder; + positions: number; + meanFull: number; + meanPruned: number; + /** Mean per-position ratio with a bootstrap CI over positions. */ + meanRatio: BootstrapCI; + medianRatio: number; + geoMeanRatio: number; + /** Σ pruned / Σ full, with a bootstrap CI over positions. */ + pooledRatio: BootstrapCI; + valueMatches: number; + meanTextbook: number; + /** Mean per-position ratio for textbook alpha-beta. */ + textbookRatio: BootstrapCI; + textbookValueMatches: number; +} + +export function summarisePruning( + samples: readonly PruningSample[], + { reps = 2000, seed = 30024 }: { reps?: number; seed?: number } = {}, +): PruningGroup[] { + const groups = new Map(); + for (const s of samples) { + const key = `${s.n}|${s.depth}|${s.order}`; + groups.set(key, [...(groups.get(key) ?? []), s]); + } + return [...groups.values()] + .map((list, k) => { + const ratios = list.map((s) => s.ratio); + return { + n: list[0].n, + depth: list[0].depth, + order: list[0].order, + positions: list.length, + meanFull: list.reduce((s, x) => s + x.nodesFull, 0) / list.length, + meanPruned: list.reduce((s, x) => s + x.nodesPruned, 0) / list.length, + meanRatio: bootstrapMean(ratios, { reps, seed: seed + k }), + medianRatio: median(ratios), + geoMeanRatio: geometricMean(ratios), + pooledRatio: bootstrap( + list, + (xs) => + xs.reduce((s, x) => s + x.nodesPruned, 0) / xs.reduce((s, x) => s + x.nodesFull, 0), + { reps, seed: seed + 1000 + k }, + ), + valueMatches: list.filter((s) => s.valueMatches).length, + meanTextbook: list.reduce((s, x) => s + x.nodesTextbook, 0) / list.length, + textbookRatio: bootstrapMean( + list.map((s) => s.ratioTextbook), + { reps, seed: seed + 2000 + k }, + ), + textbookValueMatches: list.filter((s) => s.textbookValueMatches).length, + }; + }) + .sort((a, b) => a.order.localeCompare(b.order) || a.n - b.n || a.depth - b.depth); +} diff --git a/web/src/lib/analysis/analysis.test.ts b/web/src/lib/analysis/analysis.test.ts new file mode 100644 index 0000000..29d3053 --- /dev/null +++ b/web/src/lib/analysis/analysis.test.ts @@ -0,0 +1,168 @@ +import { describe, expect, it } from "vitest"; + +import { astar } from "@/lib/astar/astar"; +import { PRESETS } from "@/lib/astar/presets"; +import { parsePartAInput } from "@/lib/astar/input"; +import { runHeuristicBenchmark } from "@/lib/astar/random-board"; +import { measurePruning, samplePositions, summarisePruning } from "./alpha-beta"; +import { + bfsPathCells, + hexDistance, + overestimationRate, + pairedStudyCsvRows, + runPairedStudy, + summarisePairedStudy, +} from "./astar-paired"; + +describe("hex distance and BFS ground truth", () => { + it("measures distance in the six HEX_STEPS directions", () => { + expect(hexDistance([0, 0], [1, -1])).toBe(1); + expect(hexDistance([0, 0], [1, 1])).toBe(2); + expect(hexDistance([2, 2], [0, 4])).toBe(2); + expect(hexDistance([0, 0], [3, 0])).toBe(3); + }); + + it("both heuristics overestimate exactly when dr and dq have opposite signs", () => { + // (1, -1) is one step away, but Manhattan says 2 and Euclidean √2. + const rates = overestimationRate(5); + expect(rates.manhattan).toBeCloseTo(rates.euclidean, 12); + // opposite-sign pairs on a 5×5 board: Σ over dr,dq ≠ 0 with opposite signs + let count = 0; + for (let a = 0; a < 25; a++) + for (let b = 0; b < 25; b++) { + const dr = Math.floor(b / 5) - Math.floor(a / 5); + const dq = (b % 5) - (a % 5); + if (dr * dq < 0) count++; + } + expect(rates.manhattan).toBeCloseTo(count / (25 * 24), 12); + }); + + it("BFS agrees with A* on the sample inputs (which are shortest paths)", () => { + for (const preset of PRESETS) { + const board = parsePartAInput(JSON.stringify(preset.input)); + const bfs = bfsPathCells(board); + const m = astar(board, "manhattan"); + if (preset.originalPath === null) { + expect(bfs).toBeNull(); + expect(m.path).toEqual([]); + } else { + expect(bfs).not.toBeNull(); + expect(m.path.length).toBeGreaterThanOrEqual(bfs!); + } + } + const s1 = bfsPathCells(parsePartAInput(JSON.stringify(PRESETS[0].input))); + const s2 = bfsPathCells(parsePartAInput(JSON.stringify(PRESETS[1].input))); + expect([s1, s2]).toEqual([8, 13]); + }); +}); + +describe("paired heuristic study", () => { + it("reproduces the existing one-board-per-size benchmark exactly", () => { + const dims = [3, 8, 15, 30]; + const rows = runPairedStudy({ dimensions: dims, boardsPerDimension: 1, seed: 17 }); + const old = runHeuristicBenchmark(dims, 17); + rows.forEach((r, i) => { + expect(r.manhattan.expansions).toBe(old[i].manhattan); + expect(r.euclidean.expansions).toBe(old[i].euclidean); + expect(r.manhattan.cells > 0).toBe(old[i].pathFound); + }); + }); + + const rows = runPairedStudy({ + dimensions: Array.from({ length: 20 }, (_, i) => i + 4), + boardsPerDimension: 3, + seed: 5, + }); + const summary = summarisePairedStudy(rows, { reps: 500, seed: 1 }); + + it("never finds a path shorter than BFS, and finds one exactly when BFS does", () => { + for (const r of rows) { + if (r.optimalCells === null) { + expect(r.manhattan.cells).toBe(0); + expect(r.euclidean.cells).toBe(0); + } else { + expect(r.manhattan.cells).toBeGreaterThanOrEqual(r.optimalCells); + expect(r.euclidean.cells).toBeGreaterThanOrEqual(r.optimalCells); + } + } + }); + + it("summarises paired differences consistently", () => { + const e = summary.expansions; + expect(summary.boards).toBe(60); + expect(e.manhattanFewer + e.euclideanFewer + e.ties).toBe(60); + expect(e.meanDiff.estimate).toBeCloseTo(e.meanManhattan - e.meanEuclidean, 9); + expect(e.meanDiff.lower).toBeLessThanOrEqual(e.meanDiff.estimate); + expect(e.meanDiff.upper).toBeGreaterThanOrEqual(e.meanDiff.estimate); + expect(e.wilcoxon.n + e.wilcoxon.zeros).toBe(60); + expect(e.wilcoxon.pValue).toBeGreaterThan(0); + expect(e.wilcoxon.pValue).toBeLessThanOrEqual(1); + const o = summary.optimality; + expect(o.manhattan.n).toBe(summary.boardsWithPath); + expect(o.manhattanExcess).toBeGreaterThanOrEqual(0); + expect(pairedStudyCsvRows(rows)).toHaveLength(60); + }); +}); + +describe("alpha-beta efficiency", () => { + const positions = samplePositions({ sizes: [4, 5], perSize: 6, seed: 3 }); + + it("samples reproducible mid-game positions", () => { + expect(positions).toHaveLength(12); + expect(samplePositions({ sizes: [4, 5], perSize: 6, seed: 3 })).toEqual(positions); + for (const p of positions) { + expect(p.actions.length).toBeGreaterThanOrEqual(2); + expect(p.toMove).toBe(p.actions.length % 2 === 0 ? "red" : "blue"); + } + }); + + it("pruning visits no more nodes and never changes the root value", () => { + for (const p of positions) { + for (const depth of [2, 3]) { + for (const order of ["canonical", "shuffled"] as const) { + const s = measurePruning(p, depth, order); + expect(s.valueMatches).toBe(true); + expect(s.textbookValueMatches).toBe(true); + expect(s.nodesPruned).toBeLessThanOrEqual(s.nodesFull); + expect(s.nodesTextbook).toBeLessThanOrEqual(s.nodesFull); + expect(s.ratio).toBeGreaterThan(0); + } + } + } + }); + + it("the original's inverted beta update costs pruning (textbook prunes at least as much here)", () => { + let original = 0; + let textbook = 0; + for (const p of positions) { + const s = measurePruning(p, 3, "canonical"); + original += s.nodesPruned; + textbook += s.nodesTextbook; + } + expect(textbook).toBeLessThan(original); + }); + + it("full minimax visits 1 + b + b(b−1) nodes at depth 2 when nothing ends early", () => { + const p = positions[0]; + const s = measurePruning(p, 2, "canonical"); + const b = p.empty; + // A depth-2 subtree can end early only if a move wins, which is rare this early. + expect(s.nodesFull).toBeLessThanOrEqual(1 + b + b * (b - 1)); + }); + + it("summarises by board size, depth and order", () => { + const samples = positions.flatMap((p) => [ + measurePruning(p, 2, "canonical"), + measurePruning(p, 2, "shuffled"), + ]); + const groups = summarisePruning(samples, { reps: 200, seed: 1 }); + expect(groups).toHaveLength(4); + for (const g of groups) { + expect(g.positions).toBe(6); + expect(g.valueMatches).toBe(6); + expect(g.meanRatio.estimate).toBeGreaterThan(0); + expect(g.meanRatio.estimate).toBeLessThanOrEqual(1); + expect(g.pooledRatio.lower).toBeLessThanOrEqual(g.pooledRatio.estimate); + } + }); +}); diff --git a/web/src/lib/analysis/astar-paired.ts b/web/src/lib/analysis/astar-paired.ts new file mode 100644 index 0000000..16b17d5 --- /dev/null +++ b/web/src/lib/analysis/astar-paired.ts @@ -0,0 +1,241 @@ +/** + * Paired Manhattan vs Euclidean study for the Part A A* search. + * + * Both heuristics run on the *same* random boards (the notebook's generator), + * so the comparison is paired: the unit of analysis is a board, and the + * quantity of interest is the per-board difference in node expansions. + * + * It also checks optimality. On this hex grid (axial coordinates, the six + * steps in HEX_STEPS) the true distance between two cells is + * max(|dr|, |dq|, |dr + dq|). Manhattan |dr| + |dq| and Euclidean + * sqrt(dr² + dq²) both exceed it whenever dr and dq have opposite signs, so + * neither heuristic is admissible and A* may return a longer path than + * necessary. A breadth-first search gives the true shortest path to compare + * against. + */ +import { type AStarBoard, astar } from "@/lib/astar/astar"; +import { notebookExpansions, randomNotebookBoard } from "@/lib/astar/random-board"; +import { HEX_STEPS } from "@/lib/cachex/board"; +import type { Coord } from "@/lib/cachex/types"; +import { createRng } from "@/lib/rng"; +import { type BootstrapCI, pairedMeanDifference } from "@/lib/stats/bootstrap"; +import { median } from "@/lib/stats/descriptive"; +import { type ProportionCI, wilson } from "@/lib/stats/proportion"; +import { type WilcoxonResult, wilcoxonSignedRank } from "@/lib/stats/wilcoxon"; + +/** True shortest-path distance (in steps) between two cells on an empty board. */ +export function hexDistance(a: Coord, b: Coord): number { + const dr = b[0] - a[0]; + const dq = b[1] - a[1]; + return Math.max(Math.abs(dr), Math.abs(dq), Math.abs(dr + dq)); +} + +/** + * Shortest path length in cells (start and goal included, like the A* output) + * when every occupied tile blocks, or null when the goal is unreachable. + */ +export function bfsPathCells(board: AStarBoard): number | null { + const { n, cells, start, goal } = board; + const id = (r: number, q: number) => r * n + q; + if (cells[id(start[0], start[1])] !== null) return null; + const dist = new Int32Array(n * n).fill(-1); + const queue = new Int32Array(n * n); + let head = 0; + let tail = 0; + const s = id(start[0], start[1]); + dist[s] = 0; + queue[tail++] = s; + const g = id(goal[0], goal[1]); + while (head < tail) { + const cur = queue[head++]; + if (cur === g) return dist[cur] + 1; + const r = Math.floor(cur / n); + const q = cur % n; + for (const [dr, dq] of HEX_STEPS) { + const nr = r + dr; + const nq = q + dq; + if (nr < 0 || nq < 0 || nr >= n || nq >= n) continue; + const ni = id(nr, nq); + if (dist[ni] !== -1 || cells[ni] !== null) continue; + dist[ni] = dist[cur] + 1; + queue[tail++] = ni; + } + } + return null; +} + +export interface HeuristicRun { + /** The notebook's expansion counter (queue insertions after the start). */ + expansions: number; + /** Priority-queue pops. */ + pops: number; + /** Path length in cells, or 0 when no path was found. */ + cells: number; +} + +export interface PairedStudyRow { + dimension: number; + /** Index of the board within its dimension. */ + board: number; + /** BFS shortest path in cells, or null when start and goal are disconnected. */ + optimalCells: number | null; + manhattan: HeuristicRun; + euclidean: HeuristicRun; +} + +export interface PairedStudyConfig { + dimensions: readonly number[]; + boardsPerDimension: number; + seed: number; +} + +const run = (board: AStarBoard, heuristic: "manhattan" | "euclidean"): HeuristicRun => { + const r = astar(board, heuristic); + return { expansions: notebookExpansions(r), pops: r.pops, cells: r.path.length }; +}; + +/** + * Generate boards in dimension order from one seeded stream. With one board + * per dimension this reproduces `runHeuristicBenchmark` board for board. + */ +export function runPairedStudy({ + dimensions, + boardsPerDimension, + seed, +}: PairedStudyConfig): PairedStudyRow[] { + const rng = createRng(seed); + const rows: PairedStudyRow[] = []; + for (const dimension of dimensions) { + for (let b = 0; b < boardsPerDimension; b++) { + const board = randomNotebookBoard(dimension, rng); + rows.push({ + dimension, + board: b, + optimalCells: bfsPathCells(board), + manhattan: run(board, "manhattan"), + euclidean: run(board, "euclidean"), + }); + } + } + return rows; +} + +export interface PairedStudySummary { + boards: number; + boardsWithPath: number; + expansions: { + meanManhattan: number; + meanEuclidean: number; + /** Mean of (Manhattan − Euclidean) per board, with a paired bootstrap CI. */ + meanDiff: BootstrapCI; + medianDiff: number; + /** Cohen's d_z of the paired differences. */ + dz: number; + wilcoxon: WilcoxonResult; + manhattanFewer: number; + euclideanFewer: number; + ties: number; + }; + optimality: { + /** Boards (with a path) where A* returned a shortest path. */ + manhattan: ProportionCI; + euclidean: ProportionCI; + /** Boards where both heuristics returned paths of the same length. */ + agreement: ProportionCI; + /** Mean extra cells over the shortest path, across boards with a path. */ + manhattanExcess: number; + euclideanExcess: number; + /** Largest extra length seen. */ + maxExcess: number; + }; + /** Proportion of ordered cell pairs on an empty board where each heuristic overestimates. */ + overestimation: { dimension: number; manhattan: number; euclidean: number }; +} + +/** Share of ordered (start, goal) pairs on an empty d × d board where h > true distance. */ +export function overestimationRate(dimension: number): { manhattan: number; euclidean: number } { + let pairs = 0; + let m = 0; + let e = 0; + for (let a = 0; a < dimension * dimension; a++) { + for (let b = 0; b < dimension * dimension; b++) { + if (a === b) continue; + const s: Coord = [Math.floor(a / dimension), a % dimension]; + const g: Coord = [Math.floor(b / dimension), b % dimension]; + const d = hexDistance(s, g); + const dr = Math.abs(g[0] - s[0]); + const dq = Math.abs(g[1] - s[1]); + pairs++; + if (dr + dq > d) m++; + if (Math.sqrt(dr * dr + dq * dq) > d + 1e-12) e++; + } + } + return { manhattan: m / pairs, euclidean: e / pairs }; +} + +export function summarisePairedStudy( + rows: readonly PairedStudyRow[], + { reps = 2000, seed = 2022 }: { reps?: number; seed?: number } = {}, +): PairedStudySummary { + const m = rows.map((r) => r.manhattan.expansions); + const e = rows.map((r) => r.euclidean.expansions); + const paired = pairedMeanDifference(m, e, { reps, seed }); + const diffs = m.map((x, i) => x - e[i]); + const withPath = rows.filter((r) => r.optimalCells !== null); + const optimal = (key: "manhattan" | "euclidean") => + withPath.filter((r) => r[key].cells === r.optimalCells).length; + const excess = (key: "manhattan" | "euclidean") => + withPath.length + ? withPath.reduce((s, r) => s + (r[key].cells - r.optimalCells!), 0) / withPath.length + : 0; + const maxExcess = withPath.reduce( + (mx, r) => + Math.max(mx, r.manhattan.cells - r.optimalCells!, r.euclidean.cells - r.optimalCells!), + 0, + ); + const reference = 10; + return { + boards: rows.length, + boardsWithPath: withPath.length, + expansions: { + meanManhattan: paired.meanX, + meanEuclidean: paired.meanY, + meanDiff: paired.meanDiff, + medianDiff: median(diffs), + dz: paired.dz, + wilcoxon: wilcoxonSignedRank(m, e), + manhattanFewer: diffs.filter((d) => d < 0).length, + euclideanFewer: diffs.filter((d) => d > 0).length, + ties: diffs.filter((d) => d === 0).length, + }, + optimality: { + manhattan: wilson(optimal("manhattan"), withPath.length), + euclidean: wilson(optimal("euclidean"), withPath.length), + agreement: wilson( + withPath.filter((r) => r.manhattan.cells === r.euclidean.cells).length, + withPath.length, + ), + manhattanExcess: excess("manhattan"), + euclideanExcess: excess("euclidean"), + maxExcess, + }, + overestimation: { dimension: reference, ...overestimationRate(reference) }, + }; +} + +/** One row per board, for CSV export. */ +export function pairedStudyCsvRows(rows: readonly PairedStudyRow[]) { + return rows.map((r) => ({ + dimension: r.dimension, + board: r.board, + path_exists: r.optimalCells !== null, + shortest_path_cells: r.optimalCells, + manhattan_expansions: r.manhattan.expansions, + euclidean_expansions: r.euclidean.expansions, + diff_m_minus_e: r.manhattan.expansions - r.euclidean.expansions, + manhattan_pops: r.manhattan.pops, + euclidean_pops: r.euclidean.pops, + manhattan_path_cells: r.manhattan.cells, + euclidean_path_cells: r.euclidean.cells, + })); +} diff --git a/web/src/lib/csv.ts b/web/src/lib/csv.ts new file mode 100644 index 0000000..18a15fc --- /dev/null +++ b/web/src/lib/csv.ts @@ -0,0 +1,28 @@ +/** + * Minimal RFC 4180 CSV writer. String cells that start with a formula + * character are prefixed with an apostrophe so spreadsheet apps do not + * evaluate text (for example LLM output) as a formula. + */ +export type CsvValue = string | number | boolean | null | undefined; + +const FORMULA_START = /^[=+\-@\t\r]/; + +export function csvCell(value: CsvValue): string { + if (value === null || value === undefined) return ""; + if (typeof value === "number") return Number.isFinite(value) ? String(value) : ""; + if (typeof value === "boolean") return value ? "true" : "false"; + let s = value; + if (FORMULA_START.test(s)) s = `'${s}`; + return /[",\n\r]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; +} + +export function toCsv>( + rows: readonly T[], + columns: readonly (keyof T & string)[] = rows.length + ? (Object.keys(rows[0]) as (keyof T & string)[]) + : [], +): string { + const lines = [columns.map(csvCell).join(",")]; + for (const row of rows) lines.push(columns.map((c) => csvCell(row[c])).join(",")); + return `${lines.join("\r\n")}\r\n`; +} diff --git a/web/src/lib/data/alpha-beta-study.json b/web/src/lib/data/alpha-beta-study.json new file mode 100644 index 0000000..9215841 --- /dev/null +++ b/web/src/lib/data/alpha-beta-study.json @@ -0,0 +1 @@ +{"meta":{"generatedBy":"web/scripts/generate-reference-studies.ts","generatedAt":"2026-10-05","node":"v26.10.0","cpu":"Apple M4","implementation":"TypeScript port (parity-tested against the original Python)","config":{"sizes":[4,5,6],"perSize":40,"depths":[2,3],"seed":2022}},"samples":[{"n":4,"depth":2,"order":"shuffled","empty":11,"nodesPruned":124,"nodesFull":124,"ratio":1,"valueMatches":true,"nodesTextbook":80,"ratioTextbook":0.6451612903225806,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":11,"nodesPruned":124,"nodesFull":124,"ratio":1,"valueMatches":true,"nodesTextbook":51,"ratioTextbook":0.4112903225806452,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":11,"nodesPruned":1081,"nodesFull":1081,"ratio":1,"valueMatches":true,"nodesTextbook":190,"ratioTextbook":0.1757631822386679,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":11,"nodesPruned":1081,"nodesFull":1081,"ratio":1,"valueMatches":true,"nodesTextbook":203,"ratioTextbook":0.1877890841813136,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":8,"nodesPruned":65,"nodesFull":65,"ratio":1,"valueMatches":true,"nodesTextbook":29,"ratioTextbook":0.4461538461538462,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":8,"nodesPruned":65,"nodesFull":65,"ratio":1,"valueMatches":true,"nodesTextbook":23,"ratioTextbook":0.35384615384615387,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":8,"nodesPruned":407,"nodesFull":407,"ratio":1,"valueMatches":true,"nodesTextbook":134,"ratioTextbook":0.32923832923832924,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":8,"nodesPruned":407,"nodesFull":407,"ratio":1,"valueMatches":true,"nodesTextbook":87,"ratioTextbook":0.21375921375921375,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":65,"ratioTextbook":0.3299492385786802,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":41,"ratioTextbook":0.20812182741116753,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":14,"nodesPruned":2381,"nodesFull":2381,"ratio":1,"valueMatches":true,"nodesTextbook":360,"ratioTextbook":0.1511969760604788,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":14,"nodesPruned":2381,"nodesFull":2381,"ratio":1,"valueMatches":true,"nodesTextbook":233,"ratioTextbook":0.09785804283914322,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":11,"nodesPruned":126,"nodesFull":126,"ratio":1,"valueMatches":true,"nodesTextbook":54,"ratioTextbook":0.42857142857142855,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":11,"nodesPruned":126,"nodesFull":126,"ratio":1,"valueMatches":true,"nodesTextbook":40,"ratioTextbook":0.31746031746031744,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":11,"nodesPruned":1208,"nodesFull":1208,"ratio":1,"valueMatches":true,"nodesTextbook":252,"ratioTextbook":0.20860927152317882,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":11,"nodesPruned":1208,"nodesFull":1208,"ratio":1,"valueMatches":true,"nodesTextbook":358,"ratioTextbook":0.29635761589403975,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":8,"nodesPruned":65,"nodesFull":65,"ratio":1,"valueMatches":true,"nodesTextbook":26,"ratioTextbook":0.4,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":8,"nodesPruned":65,"nodesFull":65,"ratio":1,"valueMatches":true,"nodesTextbook":23,"ratioTextbook":0.35384615384615387,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":8,"nodesPruned":405,"nodesFull":405,"ratio":1,"valueMatches":true,"nodesTextbook":191,"ratioTextbook":0.47160493827160493,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":8,"nodesPruned":405,"nodesFull":405,"ratio":1,"valueMatches":true,"nodesTextbook":100,"ratioTextbook":0.24691358024691357,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":78,"ratioTextbook":0.39593908629441626,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":116,"ratioTextbook":0.5888324873096447,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":14,"nodesPruned":2387,"nodesFull":2387,"ratio":1,"valueMatches":true,"nodesTextbook":424,"ratioTextbook":0.1776288227901131,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":14,"nodesPruned":2387,"nodesFull":2387,"ratio":1,"valueMatches":true,"nodesTextbook":418,"ratioTextbook":0.17511520737327188,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":6,"nodesPruned":41,"nodesFull":41,"ratio":1,"valueMatches":true,"nodesTextbook":27,"ratioTextbook":0.6585365853658537,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":6,"nodesPruned":41,"nodesFull":41,"ratio":1,"valueMatches":true,"nodesTextbook":23,"ratioTextbook":0.5609756097560976,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":6,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":107,"ratioTextbook":0.5431472081218274,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":6,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":95,"ratioTextbook":0.48223350253807107,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":7,"nodesPruned":9,"nodesFull":44,"ratio":0.20454545454545456,"valueMatches":true,"nodesTextbook":9,"ratioTextbook":0.20454545454545456,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":7,"nodesPruned":23,"nodesFull":44,"ratio":0.5227272727272727,"valueMatches":true,"nodesTextbook":13,"ratioTextbook":0.29545454545454547,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":7,"nodesPruned":256,"nodesFull":256,"ratio":1,"valueMatches":true,"nodesTextbook":105,"ratioTextbook":0.41015625,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":7,"nodesPruned":127,"nodesFull":256,"ratio":0.49609375,"valueMatches":true,"nodesTextbook":43,"ratioTextbook":0.16796875,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":8,"nodesPruned":58,"nodesFull":58,"ratio":1,"valueMatches":true,"nodesTextbook":27,"ratioTextbook":0.46551724137931033,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":8,"nodesPruned":58,"nodesFull":58,"ratio":1,"valueMatches":true,"nodesTextbook":2,"ratioTextbook":0.034482758620689655,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":8,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":119,"ratioTextbook":0.3287292817679558,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":8,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":2,"ratioTextbook":0.0055248618784530384,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":10,"nodesPruned":101,"nodesFull":101,"ratio":1,"valueMatches":true,"nodesTextbook":41,"ratioTextbook":0.40594059405940597,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":10,"nodesPruned":101,"nodesFull":101,"ratio":1,"valueMatches":true,"nodesTextbook":55,"ratioTextbook":0.5445544554455446,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":10,"nodesPruned":821,"nodesFull":821,"ratio":1,"valueMatches":true,"nodesTextbook":412,"ratioTextbook":0.5018270401948843,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":10,"nodesPruned":821,"nodesFull":821,"ratio":1,"valueMatches":true,"nodesTextbook":324,"ratioTextbook":0.3946406820950061,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":65,"ratioTextbook":0.3299492385786802,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":93,"ratioTextbook":0.4720812182741117,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":14,"nodesPruned":2381,"nodesFull":2381,"ratio":1,"valueMatches":true,"nodesTextbook":431,"ratioTextbook":0.18101637967240655,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":14,"nodesPruned":2381,"nodesFull":2381,"ratio":1,"valueMatches":true,"nodesTextbook":639,"ratioTextbook":0.26837463250734983,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":8,"nodesPruned":50,"nodesFull":58,"ratio":0.8620689655172413,"valueMatches":true,"nodesTextbook":26,"ratioTextbook":0.4482758620689655,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":8,"nodesPruned":34,"nodesFull":58,"ratio":0.5862068965517241,"valueMatches":true,"nodesTextbook":16,"ratioTextbook":0.27586206896551724,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":8,"nodesPruned":106,"nodesFull":358,"ratio":0.29608938547486036,"valueMatches":true,"nodesTextbook":70,"ratioTextbook":0.19553072625698323,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":8,"nodesPruned":204,"nodesFull":358,"ratio":0.5698324022346368,"valueMatches":true,"nodesTextbook":59,"ratioTextbook":0.164804469273743,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":45,"ratioTextbook":0.3103448275862069,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":54,"ratioTextbook":0.3724137931034483,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":12,"nodesPruned":1491,"nodesFull":1491,"ratio":1,"valueMatches":true,"nodesTextbook":246,"ratioTextbook":0.16498993963782696,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":12,"nodesPruned":1491,"nodesFull":1491,"ratio":1,"valueMatches":true,"nodesTextbook":328,"ratioTextbook":0.2199865861837693,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":54,"ratioTextbook":0.27411167512690354,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":41,"ratioTextbook":0.20812182741116753,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":14,"nodesPruned":2383,"nodesFull":2383,"ratio":1,"valueMatches":true,"nodesTextbook":334,"ratioTextbook":0.14015946286193873,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":14,"nodesPruned":2383,"nodesFull":2383,"ratio":1,"valueMatches":true,"nodesTextbook":221,"ratioTextbook":0.09274024339068401,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":44,"ratioTextbook":0.30344827586206896,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":49,"ratioTextbook":0.33793103448275863,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":12,"nodesPruned":1469,"nodesFull":1469,"ratio":1,"valueMatches":true,"nodesTextbook":423,"ratioTextbook":0.28795098706603134,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":12,"nodesPruned":1469,"nodesFull":1469,"ratio":1,"valueMatches":true,"nodesTextbook":341,"ratioTextbook":0.23213070115724982,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":11,"nodesPruned":122,"nodesFull":122,"ratio":1,"valueMatches":true,"nodesTextbook":78,"ratioTextbook":0.639344262295082,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":11,"nodesPruned":122,"nodesFull":122,"ratio":1,"valueMatches":true,"nodesTextbook":91,"ratioTextbook":0.7459016393442623,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":11,"nodesPruned":1114,"nodesFull":1114,"ratio":1,"valueMatches":true,"nodesTextbook":371,"ratioTextbook":0.33303411131059246,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":11,"nodesPruned":1114,"nodesFull":1114,"ratio":1,"valueMatches":true,"nodesTextbook":358,"ratioTextbook":0.3213644524236984,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":112,"ratioTextbook":0.49557522123893805,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":44,"ratioTextbook":0.19469026548672566,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":15,"nodesPruned":2956,"nodesFull":2956,"ratio":1,"valueMatches":true,"nodesTextbook":794,"ratioTextbook":0.26860622462787553,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":15,"nodesPruned":2956,"nodesFull":2956,"ratio":1,"valueMatches":true,"nodesTextbook":281,"ratioTextbook":0.09506089309878214,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":13,"nodesPruned":172,"nodesFull":172,"ratio":1,"valueMatches":true,"nodesTextbook":54,"ratioTextbook":0.313953488372093,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":13,"nodesPruned":172,"nodesFull":172,"ratio":1,"valueMatches":true,"nodesTextbook":51,"ratioTextbook":0.29651162790697677,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":13,"nodesPruned":1948,"nodesFull":1948,"ratio":1,"valueMatches":true,"nodesTextbook":483,"ratioTextbook":0.24794661190965092,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":13,"nodesPruned":1948,"nodesFull":1948,"ratio":1,"valueMatches":true,"nodesTextbook":247,"ratioTextbook":0.12679671457905545,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":9,"nodesPruned":82,"nodesFull":82,"ratio":1,"valueMatches":true,"nodesTextbook":52,"ratioTextbook":0.6341463414634146,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":9,"nodesPruned":82,"nodesFull":82,"ratio":1,"valueMatches":true,"nodesTextbook":36,"ratioTextbook":0.43902439024390244,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":9,"nodesPruned":276,"nodesFull":532,"ratio":0.518796992481203,"valueMatches":true,"nodesTextbook":197,"ratioTextbook":0.37030075187969924,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":9,"nodesPruned":364,"nodesFull":532,"ratio":0.6842105263157895,"valueMatches":true,"nodesTextbook":230,"ratioTextbook":0.4323308270676692,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":50,"ratioTextbook":0.3448275862068966,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":35,"ratioTextbook":0.2413793103448276,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":12,"nodesPruned":1471,"nodesFull":1471,"ratio":1,"valueMatches":true,"nodesTextbook":282,"ratioTextbook":0.19170632222977566,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":12,"nodesPruned":1471,"nodesFull":1471,"ratio":1,"valueMatches":true,"nodesTextbook":231,"ratioTextbook":0.15703602991162474,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":4,"nodesPruned":19,"nodesFull":19,"ratio":1,"valueMatches":true,"nodesTextbook":15,"ratioTextbook":0.7894736842105263,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":4,"nodesPruned":19,"nodesFull":19,"ratio":1,"valueMatches":true,"nodesTextbook":13,"ratioTextbook":0.6842105263157895,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":4,"nodesPruned":47,"nodesFull":47,"ratio":1,"valueMatches":true,"nodesTextbook":32,"ratioTextbook":0.6808510638297872,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":4,"nodesPruned":47,"nodesFull":47,"ratio":1,"valueMatches":true,"nodesTextbook":29,"ratioTextbook":0.6170212765957447,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":5,"nodesPruned":28,"nodesFull":28,"ratio":1,"valueMatches":true,"nodesTextbook":23,"ratioTextbook":0.8214285714285714,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":5,"nodesPruned":28,"nodesFull":28,"ratio":1,"valueMatches":true,"nodesTextbook":16,"ratioTextbook":0.5714285714285714,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":5,"nodesPruned":67,"nodesFull":101,"ratio":0.6633663366336634,"valueMatches":true,"nodesTextbook":56,"ratioTextbook":0.5544554455445545,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":5,"nodesPruned":93,"nodesFull":101,"ratio":0.9207920792079208,"valueMatches":true,"nodesTextbook":50,"ratioTextbook":0.49504950495049505,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":13,"nodesPruned":170,"nodesFull":170,"ratio":1,"valueMatches":true,"nodesTextbook":52,"ratioTextbook":0.3058823529411765,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":13,"nodesPruned":170,"nodesFull":170,"ratio":1,"valueMatches":true,"nodesTextbook":38,"ratioTextbook":0.2235294117647059,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":13,"nodesPruned":1886,"nodesFull":1886,"ratio":1,"valueMatches":true,"nodesTextbook":441,"ratioTextbook":0.23382820784729585,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":13,"nodesPruned":1886,"nodesFull":1886,"ratio":1,"valueMatches":true,"nodesTextbook":368,"ratioTextbook":0.1951219512195122,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":47,"ratioTextbook":0.32413793103448274,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":43,"ratioTextbook":0.296551724137931,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":12,"nodesPruned":1465,"nodesFull":1465,"ratio":1,"valueMatches":true,"nodesTextbook":452,"ratioTextbook":0.30853242320819113,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":12,"nodesPruned":1465,"nodesFull":1465,"ratio":1,"valueMatches":true,"nodesTextbook":391,"ratioTextbook":0.2668941979522184,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":80,"ratioTextbook":0.40609137055837563,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":41,"ratioTextbook":0.20812182741116753,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":14,"nodesPruned":2387,"nodesFull":2387,"ratio":1,"valueMatches":true,"nodesTextbook":455,"ratioTextbook":0.1906158357771261,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":14,"nodesPruned":2387,"nodesFull":2387,"ratio":1,"valueMatches":true,"nodesTextbook":313,"ratioTextbook":0.13112693757855048,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":13,"nodesPruned":170,"nodesFull":170,"ratio":1,"valueMatches":true,"nodesTextbook":54,"ratioTextbook":0.3176470588235294,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":13,"nodesPruned":170,"nodesFull":170,"ratio":1,"valueMatches":true,"nodesTextbook":49,"ratioTextbook":0.28823529411764703,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":13,"nodesPruned":1890,"nodesFull":1890,"ratio":1,"valueMatches":true,"nodesTextbook":344,"ratioTextbook":0.182010582010582,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":13,"nodesPruned":1890,"nodesFull":1890,"ratio":1,"valueMatches":true,"nodesTextbook":495,"ratioTextbook":0.2619047619047619,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":9,"nodesPruned":82,"nodesFull":82,"ratio":1,"valueMatches":true,"nodesTextbook":29,"ratioTextbook":0.35365853658536583,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":9,"nodesPruned":82,"nodesFull":82,"ratio":1,"valueMatches":true,"nodesTextbook":33,"ratioTextbook":0.4024390243902439,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":9,"nodesPruned":592,"nodesFull":592,"ratio":1,"valueMatches":true,"nodesTextbook":180,"ratioTextbook":0.30405405405405406,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":9,"nodesPruned":592,"nodesFull":592,"ratio":1,"valueMatches":true,"nodesTextbook":174,"ratioTextbook":0.2939189189189189,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":46,"ratioTextbook":0.233502538071066,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":41,"ratioTextbook":0.20812182741116753,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":14,"nodesPruned":2381,"nodesFull":2381,"ratio":1,"valueMatches":true,"nodesTextbook":296,"ratioTextbook":0.124317513649727,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":14,"nodesPruned":2381,"nodesFull":2381,"ratio":1,"valueMatches":true,"nodesTextbook":372,"ratioTextbook":0.15623687526249475,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":9,"nodesPruned":82,"nodesFull":82,"ratio":1,"valueMatches":true,"nodesTextbook":64,"ratioTextbook":0.7804878048780488,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":9,"nodesPruned":82,"nodesFull":82,"ratio":1,"valueMatches":true,"nodesTextbook":65,"ratioTextbook":0.7926829268292683,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":9,"nodesPruned":306,"nodesFull":530,"ratio":0.5773584905660377,"valueMatches":true,"nodesTextbook":230,"ratioTextbook":0.4339622641509434,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":9,"nodesPruned":138,"nodesFull":530,"ratio":0.26037735849056604,"valueMatches":true,"nodesTextbook":119,"ratioTextbook":0.22452830188679246,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":7,"nodesPruned":50,"nodesFull":50,"ratio":1,"valueMatches":true,"nodesTextbook":35,"ratioTextbook":0.7,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":7,"nodesPruned":50,"nodesFull":50,"ratio":1,"valueMatches":true,"nodesTextbook":20,"ratioTextbook":0.4,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":7,"nodesPruned":266,"nodesFull":266,"ratio":1,"valueMatches":true,"nodesTextbook":161,"ratioTextbook":0.6052631578947368,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":7,"nodesPruned":266,"nodesFull":266,"ratio":1,"valueMatches":true,"nodesTextbook":72,"ratioTextbook":0.2706766917293233,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":8,"nodesPruned":65,"nodesFull":65,"ratio":1,"valueMatches":true,"nodesTextbook":35,"ratioTextbook":0.5384615384615384,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":8,"nodesPruned":65,"nodesFull":65,"ratio":1,"valueMatches":true,"nodesTextbook":64,"ratioTextbook":0.9846153846153847,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":8,"nodesPruned":403,"nodesFull":403,"ratio":1,"valueMatches":true,"nodesTextbook":115,"ratioTextbook":0.2853598014888337,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":8,"nodesPruned":403,"nodesFull":403,"ratio":1,"valueMatches":true,"nodesTextbook":317,"ratioTextbook":0.7866004962779156,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":10,"nodesPruned":101,"nodesFull":101,"ratio":1,"valueMatches":true,"nodesTextbook":49,"ratioTextbook":0.48514851485148514,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":10,"nodesPruned":101,"nodesFull":101,"ratio":1,"valueMatches":true,"nodesTextbook":40,"ratioTextbook":0.39603960396039606,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":10,"nodesPruned":823,"nodesFull":823,"ratio":1,"valueMatches":true,"nodesTextbook":297,"ratioTextbook":0.36087484811664644,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":10,"nodesPruned":823,"nodesFull":823,"ratio":1,"valueMatches":true,"nodesTextbook":206,"ratioTextbook":0.2503037667071689,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":51,"ratioTextbook":0.25888324873096447,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":47,"ratioTextbook":0.23857868020304568,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":14,"nodesPruned":2381,"nodesFull":2381,"ratio":1,"valueMatches":true,"nodesTextbook":445,"ratioTextbook":0.1868962620747585,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":14,"nodesPruned":2381,"nodesFull":2381,"ratio":1,"valueMatches":true,"nodesTextbook":488,"ratioTextbook":0.20495590088198237,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":10,"nodesPruned":101,"nodesFull":101,"ratio":1,"valueMatches":true,"nodesTextbook":61,"ratioTextbook":0.6039603960396039,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":10,"nodesPruned":101,"nodesFull":101,"ratio":1,"valueMatches":true,"nodesTextbook":37,"ratioTextbook":0.36633663366336633,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":10,"nodesPruned":827,"nodesFull":827,"ratio":1,"valueMatches":true,"nodesTextbook":266,"ratioTextbook":0.3216444981862152,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":10,"nodesPruned":827,"nodesFull":827,"ratio":1,"valueMatches":true,"nodesTextbook":268,"ratioTextbook":0.32406287787182586,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":56,"ratioTextbook":0.24778761061946902,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":44,"ratioTextbook":0.19469026548672566,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":15,"nodesPruned":2956,"nodesFull":2956,"ratio":1,"valueMatches":true,"nodesTextbook":316,"ratioTextbook":0.10690121786197564,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":15,"nodesPruned":2956,"nodesFull":2956,"ratio":1,"valueMatches":true,"nodesTextbook":252,"ratioTextbook":0.08525033829499323,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":10,"nodesPruned":101,"nodesFull":101,"ratio":1,"valueMatches":true,"nodesTextbook":55,"ratioTextbook":0.5445544554455446,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":10,"nodesPruned":101,"nodesFull":101,"ratio":1,"valueMatches":true,"nodesTextbook":92,"ratioTextbook":0.9108910891089109,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":10,"nodesPruned":841,"nodesFull":841,"ratio":1,"valueMatches":true,"nodesTextbook":346,"ratioTextbook":0.4114149821640904,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":10,"nodesPruned":841,"nodesFull":841,"ratio":1,"valueMatches":true,"nodesTextbook":601,"ratioTextbook":0.7146254458977408,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":53,"ratioTextbook":0.2345132743362832,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":44,"ratioTextbook":0.19469026548672566,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":15,"nodesPruned":2956,"nodesFull":2956,"ratio":1,"valueMatches":true,"nodesTextbook":371,"ratioTextbook":0.12550744248985116,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":15,"nodesPruned":2956,"nodesFull":2956,"ratio":1,"valueMatches":true,"nodesTextbook":252,"ratioTextbook":0.08525033829499323,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":8,"nodesPruned":65,"nodesFull":65,"ratio":1,"valueMatches":true,"nodesTextbook":49,"ratioTextbook":0.7538461538461538,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":8,"nodesPruned":65,"nodesFull":65,"ratio":1,"valueMatches":true,"nodesTextbook":49,"ratioTextbook":0.7538461538461538,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":8,"nodesPruned":405,"nodesFull":405,"ratio":1,"valueMatches":true,"nodesTextbook":177,"ratioTextbook":0.43703703703703706,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":8,"nodesPruned":405,"nodesFull":405,"ratio":1,"valueMatches":true,"nodesTextbook":261,"ratioTextbook":0.6444444444444445,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":13,"nodesPruned":170,"nodesFull":170,"ratio":1,"valueMatches":true,"nodesTextbook":54,"ratioTextbook":0.3176470588235294,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":13,"nodesPruned":170,"nodesFull":170,"ratio":1,"valueMatches":true,"nodesTextbook":60,"ratioTextbook":0.35294117647058826,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":13,"nodesPruned":1886,"nodesFull":1886,"ratio":1,"valueMatches":true,"nodesTextbook":300,"ratioTextbook":0.15906680805938495,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":13,"nodesPruned":1886,"nodesFull":1886,"ratio":1,"valueMatches":true,"nodesTextbook":330,"ratioTextbook":0.17497348886532343,"textbookValueMatches":true},{"n":4,"depth":2,"order":"shuffled","empty":8,"nodesPruned":18,"nodesFull":58,"ratio":0.3103448275862069,"valueMatches":true,"nodesTextbook":18,"ratioTextbook":0.3103448275862069,"textbookValueMatches":true},{"n":4,"depth":2,"order":"canonical","empty":8,"nodesPruned":2,"nodesFull":58,"ratio":0.034482758620689655,"valueMatches":true,"nodesTextbook":2,"ratioTextbook":0.034482758620689655,"textbookValueMatches":true},{"n":4,"depth":3,"order":"shuffled","empty":8,"nodesPruned":102,"nodesFull":356,"ratio":0.28651685393258425,"valueMatches":true,"nodesTextbook":53,"ratioTextbook":0.14887640449438203,"textbookValueMatches":true},{"n":4,"depth":3,"order":"canonical","empty":8,"nodesPruned":2,"nodesFull":356,"ratio":0.0056179775280898875,"valueMatches":true,"nodesTextbook":2,"ratioTextbook":0.0056179775280898875,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":4,"nodesPruned":2,"nodesFull":16,"ratio":0.125,"valueMatches":true,"nodesTextbook":2,"ratioTextbook":0.125,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":4,"nodesPruned":16,"nodesFull":16,"ratio":1,"valueMatches":true,"nodesTextbook":15,"ratioTextbook":0.9375,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":4,"nodesPruned":44,"nodesFull":44,"ratio":1,"valueMatches":true,"nodesTextbook":33,"ratioTextbook":0.75,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":4,"nodesPruned":44,"nodesFull":44,"ratio":1,"valueMatches":true,"nodesTextbook":38,"ratioTextbook":0.8636363636363636,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":184,"ratioTextbook":0.416289592760181,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":125,"ratioTextbook":0.2828054298642534,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":21,"nodesPruned":8428,"nodesFull":8428,"ratio":1,"valueMatches":true,"nodesTextbook":1868,"ratioTextbook":0.2216421452301851,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":21,"nodesPruned":8428,"nodesFull":8428,"ratio":1,"valueMatches":true,"nodesTextbook":1193,"ratioTextbook":0.14155196962505934,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":20,"nodesPruned":401,"nodesFull":401,"ratio":1,"valueMatches":true,"nodesTextbook":213,"ratioTextbook":0.5311720698254364,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":20,"nodesPruned":401,"nodesFull":401,"ratio":1,"valueMatches":true,"nodesTextbook":160,"ratioTextbook":0.39900249376558605,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":20,"nodesPruned":7291,"nodesFull":7291,"ratio":1,"valueMatches":true,"nodesTextbook":1217,"ratioTextbook":0.16691811822795227,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":20,"nodesPruned":7291,"nodesFull":7291,"ratio":1,"valueMatches":true,"nodesTextbook":1143,"ratioTextbook":0.15676861884515156,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":24,"nodesPruned":577,"nodesFull":577,"ratio":1,"valueMatches":true,"nodesTextbook":78,"ratioTextbook":0.13518197573656845,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":24,"nodesPruned":577,"nodesFull":577,"ratio":1,"valueMatches":true,"nodesTextbook":71,"ratioTextbook":0.12305025996533796,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":24,"nodesPruned":12721,"nodesFull":12721,"ratio":1,"valueMatches":true,"nodesTextbook":810,"ratioTextbook":0.06367423944658439,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":24,"nodesPruned":12721,"nodesFull":12721,"ratio":1,"valueMatches":true,"nodesTextbook":642,"ratioTextbook":0.050467730524329846,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":16,"nodesPruned":257,"nodesFull":257,"ratio":1,"valueMatches":true,"nodesTextbook":77,"ratioTextbook":0.29961089494163423,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":16,"nodesPruned":257,"nodesFull":257,"ratio":1,"valueMatches":true,"nodesTextbook":86,"ratioTextbook":0.3346303501945525,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":16,"nodesPruned":3623,"nodesFull":3623,"ratio":1,"valueMatches":true,"nodesTextbook":697,"ratioTextbook":0.19238200386420093,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":16,"nodesPruned":3623,"nodesFull":3623,"ratio":1,"valueMatches":true,"nodesTextbook":608,"ratioTextbook":0.16781672646977644,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":76,"ratioTextbook":0.14339622641509434,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":68,"ratioTextbook":0.12830188679245283,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":23,"nodesPruned":11156,"nodesFull":11156,"ratio":1,"valueMatches":true,"nodesTextbook":1004,"ratioTextbook":0.08999641448547867,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":23,"nodesPruned":11156,"nodesFull":11156,"ratio":1,"valueMatches":true,"nodesTextbook":937,"ratioTextbook":0.08399067766224454,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":107,"ratioTextbook":0.47345132743362833,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":81,"ratioTextbook":0.3584070796460177,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":15,"nodesPruned":2972,"nodesFull":2972,"ratio":1,"valueMatches":true,"nodesTextbook":782,"ratioTextbook":0.2631224764468372,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":15,"nodesPruned":2972,"nodesFull":2972,"ratio":1,"valueMatches":true,"nodesTextbook":656,"ratioTextbook":0.22072678331090176,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":66,"ratioTextbook":0.2920353982300885,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":54,"ratioTextbook":0.23893805309734514,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":15,"nodesPruned":2962,"nodesFull":2962,"ratio":1,"valueMatches":true,"nodesTextbook":647,"ratioTextbook":0.21843349088453748,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":15,"nodesPruned":2962,"nodesFull":2962,"ratio":1,"valueMatches":true,"nodesTextbook":789,"ratioTextbook":0.2663740715732613,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":20,"nodesPruned":403,"nodesFull":403,"ratio":1,"valueMatches":true,"nodesTextbook":162,"ratioTextbook":0.40198511166253104,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":20,"nodesPruned":403,"nodesFull":403,"ratio":1,"valueMatches":true,"nodesTextbook":269,"ratioTextbook":0.6674937965260546,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":20,"nodesPruned":7366,"nodesFull":7366,"ratio":1,"valueMatches":true,"nodesTextbook":2493,"ratioTextbook":0.3384469182731469,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":20,"nodesPruned":7366,"nodesFull":7366,"ratio":1,"valueMatches":true,"nodesTextbook":4087,"ratioTextbook":0.5548465924518056,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":44,"ratioTextbook":0.30344827586206896,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":118,"ratioTextbook":0.8137931034482758,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":12,"nodesPruned":740,"nodesFull":1373,"ratio":0.538965768390386,"valueMatches":true,"nodesTextbook":483,"ratioTextbook":0.35178441369264385,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":12,"nodesPruned":815,"nodesFull":1373,"ratio":0.593590677348871,"valueMatches":true,"nodesTextbook":539,"ratioTextbook":0.39257101238164605,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":13,"nodesPruned":172,"nodesFull":172,"ratio":1,"valueMatches":true,"nodesTextbook":63,"ratioTextbook":0.36627906976744184,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":13,"nodesPruned":172,"nodesFull":172,"ratio":1,"valueMatches":true,"nodesTextbook":73,"ratioTextbook":0.42441860465116277,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":13,"nodesPruned":1954,"nodesFull":1954,"ratio":1,"valueMatches":true,"nodesTextbook":425,"ratioTextbook":0.21750255885363357,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":13,"nodesPruned":1954,"nodesFull":1954,"ratio":1,"valueMatches":true,"nodesTextbook":597,"ratioTextbook":0.3055271238485159,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":20,"nodesPruned":401,"nodesFull":401,"ratio":1,"valueMatches":true,"nodesTextbook":88,"ratioTextbook":0.2194513715710723,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":20,"nodesPruned":401,"nodesFull":401,"ratio":1,"valueMatches":true,"nodesTextbook":59,"ratioTextbook":0.14713216957605985,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":20,"nodesPruned":7245,"nodesFull":7245,"ratio":1,"valueMatches":true,"nodesTextbook":1071,"ratioTextbook":0.14782608695652175,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":20,"nodesPruned":7245,"nodesFull":7245,"ratio":1,"valueMatches":true,"nodesTextbook":1025,"ratioTextbook":0.1414768806073154,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":79,"ratioTextbook":0.4010152284263959,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":14,"nodesPruned":197,"nodesFull":197,"ratio":1,"valueMatches":true,"nodesTextbook":94,"ratioTextbook":0.47715736040609136,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":14,"nodesPruned":2395,"nodesFull":2395,"ratio":1,"valueMatches":true,"nodesTextbook":747,"ratioTextbook":0.3118997912317328,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":14,"nodesPruned":2395,"nodesFull":2395,"ratio":1,"valueMatches":true,"nodesTextbook":587,"ratioTextbook":0.24509394572025053,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":73,"ratioTextbook":0.13773584905660377,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":68,"ratioTextbook":0.12830188679245283,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":23,"nodesPruned":11156,"nodesFull":11156,"ratio":1,"valueMatches":true,"nodesTextbook":1010,"ratioTextbook":0.09053424166367874,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":23,"nodesPruned":11156,"nodesFull":11156,"ratio":1,"valueMatches":true,"nodesTextbook":1651,"ratioTextbook":0.14799211186805306,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":24,"nodesPruned":577,"nodesFull":577,"ratio":1,"valueMatches":true,"nodesTextbook":74,"ratioTextbook":0.12824956672443674,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":24,"nodesPruned":577,"nodesFull":577,"ratio":1,"valueMatches":true,"nodesTextbook":71,"ratioTextbook":0.12305025996533796,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":24,"nodesPruned":12721,"nodesFull":12721,"ratio":1,"valueMatches":true,"nodesTextbook":792,"ratioTextbook":0.0622592563477714,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":24,"nodesPruned":12721,"nodesFull":12721,"ratio":1,"valueMatches":true,"nodesTextbook":621,"ratioTextbook":0.04881691690904803,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":17,"nodesPruned":290,"nodesFull":290,"ratio":1,"valueMatches":true,"nodesTextbook":122,"ratioTextbook":0.4206896551724138,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":17,"nodesPruned":290,"nodesFull":290,"ratio":1,"valueMatches":true,"nodesTextbook":174,"ratioTextbook":0.6,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":17,"nodesPruned":4384,"nodesFull":4384,"ratio":1,"valueMatches":true,"nodesTextbook":1114,"ratioTextbook":0.2541058394160584,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":17,"nodesPruned":4384,"nodesFull":4384,"ratio":1,"valueMatches":true,"nodesTextbook":1731,"ratioTextbook":0.3948448905109489,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":13,"nodesPruned":172,"nodesFull":172,"ratio":1,"valueMatches":true,"nodesTextbook":75,"ratioTextbook":0.436046511627907,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":13,"nodesPruned":172,"nodesFull":172,"ratio":1,"valueMatches":true,"nodesTextbook":110,"ratioTextbook":0.6395348837209303,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":13,"nodesPruned":1823,"nodesFull":1823,"ratio":1,"valueMatches":true,"nodesTextbook":711,"ratioTextbook":0.390016456390565,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":13,"nodesPruned":1823,"nodesFull":1823,"ratio":1,"valueMatches":true,"nodesTextbook":798,"ratioTextbook":0.43773998902907296,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":82,"ratioTextbook":0.36283185840707965,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":66,"ratioTextbook":0.2920353982300885,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":15,"nodesPruned":2960,"nodesFull":2960,"ratio":1,"valueMatches":true,"nodesTextbook":537,"ratioTextbook":0.18141891891891893,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":15,"nodesPruned":2960,"nodesFull":2960,"ratio":1,"valueMatches":true,"nodesTextbook":525,"ratioTextbook":0.17736486486486486,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":141,"ratioTextbook":0.3190045248868778,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":95,"ratioTextbook":0.2149321266968326,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":21,"nodesPruned":8422,"nodesFull":8422,"ratio":1,"valueMatches":true,"nodesTextbook":1068,"ratioTextbook":0.12681073379244834,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":21,"nodesPruned":8422,"nodesFull":8422,"ratio":1,"valueMatches":true,"nodesTextbook":4106,"ratioTextbook":0.4875326525765851,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":54,"ratioTextbook":0.3724137931034483,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":45,"ratioTextbook":0.3103448275862069,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":12,"nodesPruned":1475,"nodesFull":1475,"ratio":1,"valueMatches":true,"nodesTextbook":399,"ratioTextbook":0.2705084745762712,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":12,"nodesPruned":1475,"nodesFull":1475,"ratio":1,"valueMatches":true,"nodesTextbook":286,"ratioTextbook":0.19389830508474576,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":11,"nodesPruned":124,"nodesFull":124,"ratio":1,"valueMatches":true,"nodesTextbook":85,"ratioTextbook":0.6854838709677419,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":11,"nodesPruned":124,"nodesFull":124,"ratio":1,"valueMatches":true,"nodesTextbook":34,"ratioTextbook":0.27419354838709675,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":11,"nodesPruned":1160,"nodesFull":1160,"ratio":1,"valueMatches":true,"nodesTextbook":266,"ratioTextbook":0.2293103448275862,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":11,"nodesPruned":1160,"nodesFull":1160,"ratio":1,"valueMatches":true,"nodesTextbook":178,"ratioTextbook":0.15344827586206897,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":207,"ratioTextbook":0.4683257918552036,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":324,"ratioTextbook":0.7330316742081447,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":21,"nodesPruned":8470,"nodesFull":8470,"ratio":1,"valueMatches":true,"nodesTextbook":1819,"ratioTextbook":0.21475796930342386,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":21,"nodesPruned":8470,"nodesFull":8470,"ratio":1,"valueMatches":true,"nodesTextbook":3176,"ratioTextbook":0.37497048406139316,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":107,"ratioTextbook":0.2018867924528302,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":68,"ratioTextbook":0.12830188679245283,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":23,"nodesPruned":11156,"nodesFull":11156,"ratio":1,"valueMatches":true,"nodesTextbook":966,"ratioTextbook":0.08659017569021155,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":23,"nodesPruned":11156,"nodesFull":11156,"ratio":1,"valueMatches":true,"nodesTextbook":724,"ratioTextbook":0.06489781283614199,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":22,"nodesPruned":485,"nodesFull":485,"ratio":1,"valueMatches":true,"nodesTextbook":80,"ratioTextbook":0.16494845360824742,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":22,"nodesPruned":485,"nodesFull":485,"ratio":1,"valueMatches":true,"nodesTextbook":65,"ratioTextbook":0.13402061855670103,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":22,"nodesPruned":9731,"nodesFull":9731,"ratio":1,"valueMatches":true,"nodesTextbook":1163,"ratioTextbook":0.11951495221457199,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":22,"nodesPruned":9731,"nodesFull":9731,"ratio":1,"valueMatches":true,"nodesTextbook":1245,"ratioTextbook":0.12794162984277052,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":17,"nodesPruned":290,"nodesFull":290,"ratio":1,"valueMatches":true,"nodesTextbook":119,"ratioTextbook":0.4103448275862069,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":17,"nodesPruned":290,"nodesFull":290,"ratio":1,"valueMatches":true,"nodesTextbook":91,"ratioTextbook":0.3137931034482759,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":17,"nodesPruned":4417,"nodesFull":4417,"ratio":1,"valueMatches":true,"nodesTextbook":875,"ratioTextbook":0.19809825673534073,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":17,"nodesPruned":4417,"nodesFull":4417,"ratio":1,"valueMatches":true,"nodesTextbook":887,"ratioTextbook":0.20081503282771113,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":18,"nodesPruned":325,"nodesFull":325,"ratio":1,"valueMatches":true,"nodesTextbook":105,"ratioTextbook":0.3230769230769231,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":18,"nodesPruned":325,"nodesFull":325,"ratio":1,"valueMatches":true,"nodesTextbook":265,"ratioTextbook":0.8153846153846154,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":18,"nodesPruned":5259,"nodesFull":5259,"ratio":1,"valueMatches":true,"nodesTextbook":1208,"ratioTextbook":0.22970146415668377,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":18,"nodesPruned":5259,"nodesFull":5259,"ratio":1,"valueMatches":true,"nodesTextbook":3159,"ratioTextbook":0.6006845407872219,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":176,"ratioTextbook":0.39819004524886875,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":277,"ratioTextbook":0.6266968325791855,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":21,"nodesPruned":8422,"nodesFull":8422,"ratio":1,"valueMatches":true,"nodesTextbook":1058,"ratioTextbook":0.12562336737117075,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":21,"nodesPruned":8422,"nodesFull":8422,"ratio":1,"valueMatches":true,"nodesTextbook":1710,"ratioTextbook":0.20303965803847068,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":8,"nodesPruned":67,"nodesFull":67,"ratio":1,"valueMatches":true,"nodesTextbook":31,"ratioTextbook":0.4626865671641791,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":8,"nodesPruned":67,"nodesFull":67,"ratio":1,"valueMatches":true,"nodesTextbook":61,"ratioTextbook":0.9104477611940298,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":8,"nodesPruned":132,"nodesFull":289,"ratio":0.45674740484429066,"valueMatches":true,"nodesTextbook":84,"ratioTextbook":0.2906574394463668,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":8,"nodesPruned":181,"nodesFull":289,"ratio":0.6262975778546713,"valueMatches":true,"nodesTextbook":117,"ratioTextbook":0.40484429065743943,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":124,"ratioTextbook":0.28054298642533937,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":62,"ratioTextbook":0.14027149321266968,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":21,"nodesPruned":8432,"nodesFull":8432,"ratio":1,"valueMatches":true,"nodesTextbook":1306,"ratioTextbook":0.15488614800759012,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":21,"nodesPruned":8432,"nodesFull":8432,"ratio":1,"valueMatches":true,"nodesTextbook":918,"ratioTextbook":0.10887096774193548,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":134,"ratioTextbook":0.5929203539823009,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":57,"ratioTextbook":0.252212389380531,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":15,"nodesPruned":2966,"nodesFull":2966,"ratio":1,"valueMatches":true,"nodesTextbook":638,"ratioTextbook":0.21510451786918408,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":15,"nodesPruned":2966,"nodesFull":2966,"ratio":1,"valueMatches":true,"nodesTextbook":418,"ratioTextbook":0.1409305461901551,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":18,"nodesPruned":325,"nodesFull":325,"ratio":1,"valueMatches":true,"nodesTextbook":100,"ratioTextbook":0.3076923076923077,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":18,"nodesPruned":325,"nodesFull":325,"ratio":1,"valueMatches":true,"nodesTextbook":53,"ratioTextbook":0.16307692307692306,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":18,"nodesPruned":5243,"nodesFull":5243,"ratio":1,"valueMatches":true,"nodesTextbook":829,"ratioTextbook":0.1581155826816708,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":18,"nodesPruned":5243,"nodesFull":5243,"ratio":1,"valueMatches":true,"nodesTextbook":733,"ratioTextbook":0.13980545489223728,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":123,"ratioTextbook":0.2320754716981132,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":110,"ratioTextbook":0.20754716981132076,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":23,"nodesPruned":11156,"nodesFull":11156,"ratio":1,"valueMatches":true,"nodesTextbook":1025,"ratioTextbook":0.09187880960917892,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":23,"nodesPruned":11156,"nodesFull":11156,"ratio":1,"valueMatches":true,"nodesTextbook":1651,"ratioTextbook":0.14799211186805306,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":17,"nodesPruned":290,"nodesFull":290,"ratio":1,"valueMatches":true,"nodesTextbook":109,"ratioTextbook":0.3758620689655172,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":17,"nodesPruned":290,"nodesFull":290,"ratio":1,"valueMatches":true,"nodesTextbook":50,"ratioTextbook":0.1724137931034483,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":17,"nodesPruned":4380,"nodesFull":4380,"ratio":1,"valueMatches":true,"nodesTextbook":897,"ratioTextbook":0.2047945205479452,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":17,"nodesPruned":4380,"nodesFull":4380,"ratio":1,"valueMatches":true,"nodesTextbook":369,"ratioTextbook":0.08424657534246575,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":17,"nodesPruned":292,"nodesFull":292,"ratio":1,"valueMatches":true,"nodesTextbook":146,"ratioTextbook":0.5,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":17,"nodesPruned":292,"nodesFull":292,"ratio":1,"valueMatches":true,"nodesTextbook":114,"ratioTextbook":0.3904109589041096,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":17,"nodesPruned":4444,"nodesFull":4444,"ratio":1,"valueMatches":true,"nodesTextbook":652,"ratioTextbook":0.1467146714671467,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":17,"nodesPruned":4444,"nodesFull":4444,"ratio":1,"valueMatches":true,"nodesTextbook":788,"ratioTextbook":0.1773177317731773,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":16,"nodesPruned":259,"nodesFull":259,"ratio":1,"valueMatches":true,"nodesTextbook":144,"ratioTextbook":0.555984555984556,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":16,"nodesPruned":259,"nodesFull":259,"ratio":1,"valueMatches":true,"nodesTextbook":86,"ratioTextbook":0.33204633204633205,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":16,"nodesPruned":3693,"nodesFull":3693,"ratio":1,"valueMatches":true,"nodesTextbook":714,"ratioTextbook":0.1933387489845654,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":16,"nodesPruned":3693,"nodesFull":3693,"ratio":1,"valueMatches":true,"nodesTextbook":630,"ratioTextbook":0.17059301380991065,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":104,"ratioTextbook":0.46017699115044247,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":98,"ratioTextbook":0.4336283185840708,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":15,"nodesPruned":2960,"nodesFull":2960,"ratio":1,"valueMatches":true,"nodesTextbook":784,"ratioTextbook":0.2648648648648649,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":15,"nodesPruned":2960,"nodesFull":2960,"ratio":1,"valueMatches":true,"nodesTextbook":1077,"ratioTextbook":0.3638513513513513,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":16,"nodesPruned":257,"nodesFull":257,"ratio":1,"valueMatches":true,"nodesTextbook":111,"ratioTextbook":0.43190661478599224,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":16,"nodesPruned":257,"nodesFull":257,"ratio":1,"valueMatches":true,"nodesTextbook":101,"ratioTextbook":0.39299610894941633,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":16,"nodesPruned":1132,"nodesFull":3201,"ratio":0.3536394876601062,"valueMatches":true,"nodesTextbook":624,"ratioTextbook":0.1949390815370197,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":16,"nodesPruned":2300,"nodesFull":3201,"ratio":0.718525460793502,"valueMatches":true,"nodesTextbook":845,"ratioTextbook":0.26398000624804746,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":49,"ratioTextbook":0.33793103448275863,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":12,"nodesPruned":145,"nodesFull":145,"ratio":1,"valueMatches":true,"nodesTextbook":92,"ratioTextbook":0.6344827586206897,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":12,"nodesPruned":1496,"nodesFull":1496,"ratio":1,"valueMatches":true,"nodesTextbook":503,"ratioTextbook":0.3362299465240642,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":12,"nodesPruned":1496,"nodesFull":1496,"ratio":1,"valueMatches":true,"nodesTextbook":869,"ratioTextbook":0.5808823529411765,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":81,"ratioTextbook":0.1832579185520362,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":21,"nodesPruned":442,"nodesFull":442,"ratio":1,"valueMatches":true,"nodesTextbook":62,"ratioTextbook":0.14027149321266968,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":21,"nodesPruned":8422,"nodesFull":8422,"ratio":1,"valueMatches":true,"nodesTextbook":904,"ratioTextbook":0.1073379244834956,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":21,"nodesPruned":8422,"nodesFull":8422,"ratio":1,"valueMatches":true,"nodesTextbook":518,"ratioTextbook":0.061505580622180006,"textbookValueMatches":true},{"n":5,"depth":2,"order":"shuffled","empty":19,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":131,"ratioTextbook":0.36187845303867405,"textbookValueMatches":true},{"n":5,"depth":2,"order":"canonical","empty":19,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":163,"ratioTextbook":0.45027624309392267,"textbookValueMatches":true},{"n":5,"depth":3,"order":"shuffled","empty":19,"nodesPruned":6176,"nodesFull":6176,"ratio":1,"valueMatches":true,"nodesTextbook":1224,"ratioTextbook":0.19818652849740934,"textbookValueMatches":true},{"n":5,"depth":3,"order":"canonical","empty":19,"nodesPruned":6176,"nodesFull":6176,"ratio":1,"valueMatches":true,"nodesTextbook":2073,"ratioTextbook":0.33565414507772023,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":32,"nodesPruned":1025,"nodesFull":1025,"ratio":1,"valueMatches":true,"nodesTextbook":127,"ratioTextbook":0.12390243902439024,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":32,"nodesPruned":1025,"nodesFull":1025,"ratio":1,"valueMatches":true,"nodesTextbook":125,"ratioTextbook":0.12195121951219512,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":32,"nodesPruned":30785,"nodesFull":30785,"ratio":1,"valueMatches":true,"nodesTextbook":3259,"ratioTextbook":0.10586324508689297,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":32,"nodesPruned":30785,"nodesFull":30785,"ratio":1,"valueMatches":true,"nodesTextbook":1207,"ratioTextbook":0.03920740620432028,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":29,"nodesPruned":842,"nodesFull":842,"ratio":1,"valueMatches":true,"nodesTextbook":88,"ratioTextbook":0.10451306413301663,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":29,"nodesPruned":842,"nodesFull":842,"ratio":1,"valueMatches":true,"nodesTextbook":113,"ratioTextbook":0.1342042755344418,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":29,"nodesPruned":22772,"nodesFull":22772,"ratio":1,"valueMatches":true,"nodesTextbook":2703,"ratioTextbook":0.11869840154575795,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":29,"nodesPruned":22772,"nodesFull":22772,"ratio":1,"valueMatches":true,"nodesTextbook":1431,"ratioTextbook":0.06284033023010716,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":29,"nodesPruned":842,"nodesFull":842,"ratio":1,"valueMatches":true,"nodesTextbook":312,"ratioTextbook":0.37054631828978624,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":29,"nodesPruned":842,"nodesFull":842,"ratio":1,"valueMatches":true,"nodesTextbook":141,"ratioTextbook":0.167458432304038,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":29,"nodesPruned":22766,"nodesFull":22766,"ratio":1,"valueMatches":true,"nodesTextbook":3658,"ratioTextbook":0.16067820433980498,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":29,"nodesPruned":22766,"nodesFull":22766,"ratio":1,"valueMatches":true,"nodesTextbook":1355,"ratioTextbook":0.05951858033910217,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":25,"nodesPruned":626,"nodesFull":626,"ratio":1,"valueMatches":true,"nodesTextbook":156,"ratioTextbook":0.24920127795527156,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":25,"nodesPruned":626,"nodesFull":626,"ratio":1,"valueMatches":true,"nodesTextbook":168,"ratioTextbook":0.268370607028754,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":25,"nodesPruned":14440,"nodesFull":14440,"ratio":1,"valueMatches":true,"nodesTextbook":1742,"ratioTextbook":0.1206371191135734,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":25,"nodesPruned":14440,"nodesFull":14440,"ratio":1,"valueMatches":true,"nodesTextbook":1576,"ratioTextbook":0.10914127423822714,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":27,"nodesPruned":730,"nodesFull":730,"ratio":1,"valueMatches":true,"nodesTextbook":238,"ratioTextbook":0.32602739726027397,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":27,"nodesPruned":730,"nodesFull":730,"ratio":1,"valueMatches":true,"nodesTextbook":187,"ratioTextbook":0.25616438356164384,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":27,"nodesPruned":18288,"nodesFull":18288,"ratio":1,"valueMatches":true,"nodesTextbook":2288,"ratioTextbook":0.12510936132983377,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":27,"nodesPruned":18288,"nodesFull":18288,"ratio":1,"valueMatches":true,"nodesTextbook":1112,"ratioTextbook":0.06080489938757655,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":22,"nodesPruned":398,"nodesFull":466,"ratio":0.8540772532188842,"valueMatches":true,"nodesTextbook":167,"ratioTextbook":0.3583690987124464,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":22,"nodesPruned":24,"nodesFull":466,"ratio":0.05150214592274678,"valueMatches":true,"nodesTextbook":24,"ratioTextbook":0.05150214592274678,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":22,"nodesPruned":2220,"nodesFull":9424,"ratio":0.23556876061120544,"valueMatches":true,"nodesTextbook":558,"ratioTextbook":0.05921052631578947,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":22,"nodesPruned":446,"nodesFull":9424,"ratio":0.04732597623089983,"valueMatches":true,"nodesTextbook":92,"ratioTextbook":0.009762308998302207,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":85,"ratioTextbook":0.37610619469026546,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":100,"ratioTextbook":0.4424778761061947,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":15,"nodesPruned":3004,"nodesFull":3004,"ratio":1,"valueMatches":true,"nodesTextbook":790,"ratioTextbook":0.262982689747004,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":15,"nodesPruned":3004,"nodesFull":3004,"ratio":1,"valueMatches":true,"nodesTextbook":632,"ratioTextbook":0.2103861517976032,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":22,"nodesPruned":485,"nodesFull":485,"ratio":1,"valueMatches":true,"nodesTextbook":238,"ratioTextbook":0.49072164948453606,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":22,"nodesPruned":485,"nodesFull":485,"ratio":1,"valueMatches":true,"nodesTextbook":127,"ratioTextbook":0.2618556701030928,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":22,"nodesPruned":9771,"nodesFull":9771,"ratio":1,"valueMatches":true,"nodesTextbook":2718,"ratioTextbook":0.27817009517961316,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":22,"nodesPruned":9771,"nodesFull":9771,"ratio":1,"valueMatches":true,"nodesTextbook":1225,"ratioTextbook":0.12537099580390954,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":19,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":173,"ratioTextbook":0.47790055248618785,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":19,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":232,"ratioTextbook":0.6408839779005525,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":19,"nodesPruned":2343,"nodesFull":5568,"ratio":0.4207974137931034,"valueMatches":true,"nodesTextbook":1083,"ratioTextbook":0.1945043103448276,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":19,"nodesPruned":705,"nodesFull":5568,"ratio":0.12661637931034483,"valueMatches":true,"nodesTextbook":480,"ratioTextbook":0.08620689655172414,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":29,"nodesPruned":842,"nodesFull":842,"ratio":1,"valueMatches":true,"nodesTextbook":139,"ratioTextbook":0.16508313539192399,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":29,"nodesPruned":842,"nodesFull":842,"ratio":1,"valueMatches":true,"nodesTextbook":105,"ratioTextbook":0.12470308788598575,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":29,"nodesPruned":22774,"nodesFull":22774,"ratio":1,"valueMatches":true,"nodesTextbook":1878,"ratioTextbook":0.08246245718802143,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":29,"nodesPruned":22774,"nodesFull":22774,"ratio":1,"valueMatches":true,"nodesTextbook":1861,"ratioTextbook":0.08171599192061123,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":18,"nodesPruned":325,"nodesFull":325,"ratio":1,"valueMatches":true,"nodesTextbook":144,"ratioTextbook":0.4430769230769231,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":18,"nodesPruned":325,"nodesFull":325,"ratio":1,"valueMatches":true,"nodesTextbook":230,"ratioTextbook":0.7076923076923077,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":18,"nodesPruned":5229,"nodesFull":5229,"ratio":1,"valueMatches":true,"nodesTextbook":1368,"ratioTextbook":0.26161790017211706,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":18,"nodesPruned":5229,"nodesFull":5229,"ratio":1,"valueMatches":true,"nodesTextbook":1497,"ratioTextbook":0.2862880091795754,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":33,"nodesPruned":1090,"nodesFull":1090,"ratio":1,"valueMatches":true,"nodesTextbook":466,"ratioTextbook":0.42752293577981654,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":33,"nodesPruned":1090,"nodesFull":1090,"ratio":1,"valueMatches":true,"nodesTextbook":908,"ratioTextbook":0.8330275229357799,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":33,"nodesPruned":33826,"nodesFull":33826,"ratio":1,"valueMatches":true,"nodesTextbook":6589,"ratioTextbook":0.19479098917992077,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":33,"nodesPruned":33826,"nodesFull":33826,"ratio":1,"valueMatches":true,"nodesTextbook":15273,"ratioTextbook":0.45151658487553953,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":35,"nodesPruned":1226,"nodesFull":1226,"ratio":1,"valueMatches":true,"nodesTextbook":117,"ratioTextbook":0.09543230016313213,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":35,"nodesPruned":1226,"nodesFull":1226,"ratio":1,"valueMatches":true,"nodesTextbook":104,"ratioTextbook":0.08482871125611746,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":35,"nodesPruned":40496,"nodesFull":40496,"ratio":1,"valueMatches":true,"nodesTextbook":1935,"ratioTextbook":0.04778249703674437,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":35,"nodesPruned":40496,"nodesFull":40496,"ratio":1,"valueMatches":true,"nodesTextbook":1324,"ratioTextbook":0.032694587119715526,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":24,"nodesPruned":579,"nodesFull":579,"ratio":1,"valueMatches":true,"nodesTextbook":203,"ratioTextbook":0.35060449050086356,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":24,"nodesPruned":579,"nodesFull":579,"ratio":1,"valueMatches":true,"nodesTextbook":198,"ratioTextbook":0.34196891191709844,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":24,"nodesPruned":12827,"nodesFull":12827,"ratio":1,"valueMatches":true,"nodesTextbook":2169,"ratioTextbook":0.1690964372027754,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":24,"nodesPruned":12827,"nodesFull":12827,"ratio":1,"valueMatches":true,"nodesTextbook":3201,"ratioTextbook":0.24955172682622592,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":30,"nodesPruned":901,"nodesFull":901,"ratio":1,"valueMatches":true,"nodesTextbook":244,"ratioTextbook":0.27081021087680357,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":30,"nodesPruned":901,"nodesFull":901,"ratio":1,"valueMatches":true,"nodesTextbook":104,"ratioTextbook":0.11542730299667037,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":30,"nodesPruned":25267,"nodesFull":25267,"ratio":1,"valueMatches":true,"nodesTextbook":2439,"ratioTextbook":0.0965290695373412,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":30,"nodesPruned":25267,"nodesFull":25267,"ratio":1,"valueMatches":true,"nodesTextbook":1455,"ratioTextbook":0.05758499228242372,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":81,"ratioTextbook":0.3584070796460177,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":15,"nodesPruned":226,"nodesFull":226,"ratio":1,"valueMatches":true,"nodesTextbook":72,"ratioTextbook":0.3185840707964602,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":15,"nodesPruned":2972,"nodesFull":2972,"ratio":1,"valueMatches":true,"nodesTextbook":736,"ratioTextbook":0.24764468371467024,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":15,"nodesPruned":2972,"nodesFull":2972,"ratio":1,"valueMatches":true,"nodesTextbook":417,"ratioTextbook":0.14030955585464333,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":14,"nodesPruned":203,"nodesFull":203,"ratio":1,"valueMatches":true,"nodesTextbook":85,"ratioTextbook":0.4187192118226601,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":14,"nodesPruned":203,"nodesFull":203,"ratio":1,"valueMatches":true,"nodesTextbook":87,"ratioTextbook":0.42857142857142855,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":14,"nodesPruned":2439,"nodesFull":2439,"ratio":1,"valueMatches":true,"nodesTextbook":742,"ratioTextbook":0.3042230422304223,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":14,"nodesPruned":2439,"nodesFull":2439,"ratio":1,"valueMatches":true,"nodesTextbook":301,"ratioTextbook":0.12341123411234112,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":18,"nodesPruned":325,"nodesFull":325,"ratio":1,"valueMatches":true,"nodesTextbook":134,"ratioTextbook":0.4123076923076923,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":18,"nodesPruned":325,"nodesFull":325,"ratio":1,"valueMatches":true,"nodesTextbook":138,"ratioTextbook":0.4246153846153846,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":18,"nodesPruned":5241,"nodesFull":5241,"ratio":1,"valueMatches":true,"nodesTextbook":1032,"ratioTextbook":0.19690898683457356,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":18,"nodesPruned":5241,"nodesFull":5241,"ratio":1,"valueMatches":true,"nodesTextbook":1298,"ratioTextbook":0.2476626597977485,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":22,"nodesPruned":485,"nodesFull":485,"ratio":1,"valueMatches":true,"nodesTextbook":204,"ratioTextbook":0.42061855670103093,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":22,"nodesPruned":485,"nodesFull":485,"ratio":1,"valueMatches":true,"nodesTextbook":85,"ratioTextbook":0.17525773195876287,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":22,"nodesPruned":9745,"nodesFull":9745,"ratio":1,"valueMatches":true,"nodesTextbook":1475,"ratioTextbook":0.15135967162647512,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":22,"nodesPruned":9745,"nodesFull":9745,"ratio":1,"valueMatches":true,"nodesTextbook":941,"ratioTextbook":0.09656233966136481,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":13,"nodesPruned":170,"nodesFull":170,"ratio":1,"valueMatches":true,"nodesTextbook":72,"ratioTextbook":0.4235294117647059,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":13,"nodesPruned":170,"nodesFull":170,"ratio":1,"valueMatches":true,"nodesTextbook":49,"ratioTextbook":0.28823529411764703,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":13,"nodesPruned":1931,"nodesFull":1931,"ratio":1,"valueMatches":true,"nodesTextbook":505,"ratioTextbook":0.2615225271879855,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":13,"nodesPruned":1931,"nodesFull":1931,"ratio":1,"valueMatches":true,"nodesTextbook":235,"ratioTextbook":0.12169860176074573,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":138,"ratioTextbook":0.26037735849056604,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":23,"nodesPruned":530,"nodesFull":530,"ratio":1,"valueMatches":true,"nodesTextbook":210,"ratioTextbook":0.39622641509433965,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":23,"nodesPruned":11166,"nodesFull":11166,"ratio":1,"valueMatches":true,"nodesTextbook":1803,"ratioTextbook":0.161472326706072,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":23,"nodesPruned":11166,"nodesFull":11166,"ratio":1,"valueMatches":true,"nodesTextbook":2685,"ratioTextbook":0.24046211714132187,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":18,"nodesPruned":331,"nodesFull":331,"ratio":1,"valueMatches":true,"nodesTextbook":183,"ratioTextbook":0.552870090634441,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":18,"nodesPruned":331,"nodesFull":331,"ratio":1,"valueMatches":true,"nodesTextbook":119,"ratioTextbook":0.3595166163141994,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":18,"nodesPruned":5453,"nodesFull":5453,"ratio":1,"valueMatches":true,"nodesTextbook":1464,"ratioTextbook":0.2684760682193288,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":18,"nodesPruned":5453,"nodesFull":5453,"ratio":1,"valueMatches":true,"nodesTextbook":768,"ratioTextbook":0.1408399046396479,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":25,"nodesPruned":626,"nodesFull":626,"ratio":1,"valueMatches":true,"nodesTextbook":177,"ratioTextbook":0.2827476038338658,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":25,"nodesPruned":626,"nodesFull":626,"ratio":1,"valueMatches":true,"nodesTextbook":209,"ratioTextbook":0.33386581469648563,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":25,"nodesPruned":14430,"nodesFull":14430,"ratio":1,"valueMatches":true,"nodesTextbook":2100,"ratioTextbook":0.14553014553014554,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":25,"nodesPruned":14430,"nodesFull":14430,"ratio":1,"valueMatches":true,"nodesTextbook":3099,"ratioTextbook":0.21476091476091477,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":12,"nodesPruned":54,"nodesFull":127,"ratio":0.4251968503937008,"valueMatches":true,"nodesTextbook":54,"ratioTextbook":0.4251968503937008,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":12,"nodesPruned":26,"nodesFull":127,"ratio":0.2047244094488189,"valueMatches":true,"nodesTextbook":16,"ratioTextbook":0.12598425196850394,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":12,"nodesPruned":956,"nodesFull":1323,"ratio":0.7226001511715797,"valueMatches":true,"nodesTextbook":339,"ratioTextbook":0.2562358276643991,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":12,"nodesPruned":248,"nodesFull":1323,"ratio":0.1874527588813303,"valueMatches":true,"nodesTextbook":71,"ratioTextbook":0.05366591080876795,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":31,"nodesPruned":962,"nodesFull":962,"ratio":1,"valueMatches":true,"nodesTextbook":164,"ratioTextbook":0.1704781704781705,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":31,"nodesPruned":962,"nodesFull":962,"ratio":1,"valueMatches":true,"nodesTextbook":121,"ratioTextbook":0.1257796257796258,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":31,"nodesPruned":27932,"nodesFull":27932,"ratio":1,"valueMatches":true,"nodesTextbook":3526,"ratioTextbook":0.1262351424889016,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":31,"nodesPruned":27932,"nodesFull":27932,"ratio":1,"valueMatches":true,"nodesTextbook":7890,"ratioTextbook":0.28247171702706575,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":17,"nodesPruned":274,"nodesFull":274,"ratio":1,"valueMatches":true,"nodesTextbook":45,"ratioTextbook":0.16423357664233576,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":17,"nodesPruned":274,"nodesFull":274,"ratio":1,"valueMatches":true,"nodesTextbook":131,"ratioTextbook":0.4781021897810219,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":17,"nodesPruned":4178,"nodesFull":4178,"ratio":1,"valueMatches":true,"nodesTextbook":985,"ratioTextbook":0.23575873623743418,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":17,"nodesPruned":4178,"nodesFull":4178,"ratio":1,"valueMatches":true,"nodesTextbook":1547,"ratioTextbook":0.3702728578267113,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":25,"nodesPruned":626,"nodesFull":626,"ratio":1,"valueMatches":true,"nodesTextbook":227,"ratioTextbook":0.36261980830670926,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":25,"nodesPruned":626,"nodesFull":626,"ratio":1,"valueMatches":true,"nodesTextbook":258,"ratioTextbook":0.41214057507987223,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":25,"nodesPruned":14428,"nodesFull":14428,"ratio":1,"valueMatches":true,"nodesTextbook":2491,"ratioTextbook":0.17265040199611867,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":25,"nodesPruned":14428,"nodesFull":14428,"ratio":1,"valueMatches":true,"nodesTextbook":2227,"ratioTextbook":0.1543526476296091,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":20,"nodesPruned":403,"nodesFull":403,"ratio":1,"valueMatches":true,"nodesTextbook":243,"ratioTextbook":0.6029776674937966,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":20,"nodesPruned":403,"nodesFull":403,"ratio":1,"valueMatches":true,"nodesTextbook":137,"ratioTextbook":0.3399503722084367,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":20,"nodesPruned":7379,"nodesFull":7379,"ratio":1,"valueMatches":true,"nodesTextbook":1864,"ratioTextbook":0.2526087545737905,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":20,"nodesPruned":7379,"nodesFull":7379,"ratio":1,"valueMatches":true,"nodesTextbook":1164,"ratioTextbook":0.15774495189050006,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":17,"nodesPruned":290,"nodesFull":290,"ratio":1,"valueMatches":true,"nodesTextbook":85,"ratioTextbook":0.29310344827586204,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":17,"nodesPruned":290,"nodesFull":290,"ratio":1,"valueMatches":true,"nodesTextbook":132,"ratioTextbook":0.45517241379310347,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":17,"nodesPruned":2412,"nodesFull":4204,"ratio":0.5737392959086585,"valueMatches":true,"nodesTextbook":1383,"ratioTextbook":0.32897240723120835,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":17,"nodesPruned":2972,"nodesFull":4204,"ratio":0.7069457659372027,"valueMatches":true,"nodesTextbook":1726,"ratioTextbook":0.4105613701236917,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":26,"nodesPruned":677,"nodesFull":677,"ratio":1,"valueMatches":true,"nodesTextbook":167,"ratioTextbook":0.2466765140324963,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":26,"nodesPruned":677,"nodesFull":677,"ratio":1,"valueMatches":true,"nodesTextbook":242,"ratioTextbook":0.35745937961595275,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":26,"nodesPruned":16277,"nodesFull":16277,"ratio":1,"valueMatches":true,"nodesTextbook":2044,"ratioTextbook":0.1255759660871168,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":26,"nodesPruned":16277,"nodesFull":16277,"ratio":1,"valueMatches":true,"nodesTextbook":4414,"ratioTextbook":0.2711801929102414,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":20,"nodesPruned":401,"nodesFull":401,"ratio":1,"valueMatches":true,"nodesTextbook":99,"ratioTextbook":0.24688279301745636,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":20,"nodesPruned":401,"nodesFull":401,"ratio":1,"valueMatches":true,"nodesTextbook":84,"ratioTextbook":0.20947630922693267,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":20,"nodesPruned":7255,"nodesFull":7255,"ratio":1,"valueMatches":true,"nodesTextbook":1096,"ratioTextbook":0.1510682288077188,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":20,"nodesPruned":7255,"nodesFull":7255,"ratio":1,"valueMatches":true,"nodesTextbook":651,"ratioTextbook":0.08973121984838042,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":31,"nodesPruned":962,"nodesFull":962,"ratio":1,"valueMatches":true,"nodesTextbook":347,"ratioTextbook":0.3607068607068607,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":31,"nodesPruned":962,"nodesFull":962,"ratio":1,"valueMatches":true,"nodesTextbook":385,"ratioTextbook":0.4002079002079002,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":31,"nodesPruned":27932,"nodesFull":27932,"ratio":1,"valueMatches":true,"nodesTextbook":5362,"ratioTextbook":0.19196620363740513,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":31,"nodesPruned":27932,"nodesFull":27932,"ratio":1,"valueMatches":true,"nodesTextbook":7198,"ratioTextbook":0.25769726478590865,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":29,"nodesPruned":844,"nodesFull":844,"ratio":1,"valueMatches":true,"nodesTextbook":164,"ratioTextbook":0.1943127962085308,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":29,"nodesPruned":844,"nodesFull":844,"ratio":1,"valueMatches":true,"nodesTextbook":127,"ratioTextbook":0.1504739336492891,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":29,"nodesPruned":22898,"nodesFull":22898,"ratio":1,"valueMatches":true,"nodesTextbook":1960,"ratioTextbook":0.08559699537077474,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":29,"nodesPruned":22898,"nodesFull":22898,"ratio":1,"valueMatches":true,"nodesTextbook":1576,"ratioTextbook":0.06882697178792907,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":22,"nodesPruned":485,"nodesFull":485,"ratio":1,"valueMatches":true,"nodesTextbook":129,"ratioTextbook":0.26597938144329897,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":22,"nodesPruned":485,"nodesFull":485,"ratio":1,"valueMatches":true,"nodesTextbook":105,"ratioTextbook":0.21649484536082475,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":22,"nodesPruned":9735,"nodesFull":9735,"ratio":1,"valueMatches":true,"nodesTextbook":1363,"ratioTextbook":0.14001027221366205,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":22,"nodesPruned":9735,"nodesFull":9735,"ratio":1,"valueMatches":true,"nodesTextbook":2016,"ratioTextbook":0.20708782742681048,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":19,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":140,"ratioTextbook":0.3867403314917127,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":19,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":76,"ratioTextbook":0.20994475138121546,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":19,"nodesPruned":6188,"nodesFull":6188,"ratio":1,"valueMatches":true,"nodesTextbook":1670,"ratioTextbook":0.2698771816418875,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":19,"nodesPruned":6188,"nodesFull":6188,"ratio":1,"valueMatches":true,"nodesTextbook":761,"ratioTextbook":0.12297996121525533,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":31,"nodesPruned":962,"nodesFull":962,"ratio":1,"valueMatches":true,"nodesTextbook":207,"ratioTextbook":0.2151767151767152,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":31,"nodesPruned":962,"nodesFull":962,"ratio":1,"valueMatches":true,"nodesTextbook":361,"ratioTextbook":0.37525987525987525,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":31,"nodesPruned":27932,"nodesFull":27932,"ratio":1,"valueMatches":true,"nodesTextbook":5732,"ratioTextbook":0.20521265931548044,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":31,"nodesPruned":27932,"nodesFull":27932,"ratio":1,"valueMatches":true,"nodesTextbook":10069,"ratioTextbook":0.3604826006014607,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":17,"nodesPruned":292,"nodesFull":292,"ratio":1,"valueMatches":true,"nodesTextbook":106,"ratioTextbook":0.363013698630137,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":17,"nodesPruned":292,"nodesFull":292,"ratio":1,"valueMatches":true,"nodesTextbook":88,"ratioTextbook":0.3013698630136986,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":17,"nodesPruned":4450,"nodesFull":4450,"ratio":1,"valueMatches":true,"nodesTextbook":1083,"ratioTextbook":0.24337078651685393,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":17,"nodesPruned":4450,"nodesFull":4450,"ratio":1,"valueMatches":true,"nodesTextbook":1233,"ratioTextbook":0.27707865168539325,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":27,"nodesPruned":730,"nodesFull":730,"ratio":1,"valueMatches":true,"nodesTextbook":195,"ratioTextbook":0.2671232876712329,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":27,"nodesPruned":730,"nodesFull":730,"ratio":1,"valueMatches":true,"nodesTextbook":172,"ratioTextbook":0.2356164383561644,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":27,"nodesPruned":18300,"nodesFull":18300,"ratio":1,"valueMatches":true,"nodesTextbook":2260,"ratioTextbook":0.12349726775956284,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":27,"nodesPruned":18300,"nodesFull":18300,"ratio":1,"valueMatches":true,"nodesTextbook":2017,"ratioTextbook":0.11021857923497268,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":19,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":109,"ratioTextbook":0.3011049723756906,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":19,"nodesPruned":362,"nodesFull":362,"ratio":1,"valueMatches":true,"nodesTextbook":58,"ratioTextbook":0.16022099447513813,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":19,"nodesPruned":6230,"nodesFull":6230,"ratio":1,"valueMatches":true,"nodesTextbook":992,"ratioTextbook":0.1592295345104334,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":19,"nodesPruned":6230,"nodesFull":6230,"ratio":1,"valueMatches":true,"nodesTextbook":618,"ratioTextbook":0.09919743178170144,"textbookValueMatches":true},{"n":6,"depth":2,"order":"shuffled","empty":20,"nodesPruned":401,"nodesFull":401,"ratio":1,"valueMatches":true,"nodesTextbook":128,"ratioTextbook":0.3192019950124688,"textbookValueMatches":true},{"n":6,"depth":2,"order":"canonical","empty":20,"nodesPruned":401,"nodesFull":401,"ratio":1,"valueMatches":true,"nodesTextbook":77,"ratioTextbook":0.19201995012468828,"textbookValueMatches":true},{"n":6,"depth":3,"order":"shuffled","empty":20,"nodesPruned":7289,"nodesFull":7289,"ratio":1,"valueMatches":true,"nodesTextbook":1077,"ratioTextbook":0.14775689394978736,"textbookValueMatches":true},{"n":6,"depth":3,"order":"canonical","empty":20,"nodesPruned":7289,"nodesFull":7289,"ratio":1,"valueMatches":true,"nodesTextbook":1249,"ratioTextbook":0.17135409521196324,"textbookValueMatches":true}]} diff --git a/web/src/lib/data/astar-paired-study.json b/web/src/lib/data/astar-paired-study.json new file mode 100644 index 0000000..cbc1adf --- /dev/null +++ b/web/src/lib/data/astar-paired-study.json @@ -0,0 +1 @@ +{"meta":{"generatedBy":"web/scripts/generate-reference-studies.ts","generatedAt":"2026-10-05","node":"v26.10.0","cpu":"Apple M4","implementation":"TypeScript port (parity-tested against the original Python)","config":{"dimensions":[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99],"boardsPerDimension":10,"seed":2022}},"rows":[{"dimension":2,"board":0,"optimalCells":3,"manhattan":{"expansions":3,"pops":4,"cells":3},"euclidean":{"expansions":3,"pops":4,"cells":3}},{"dimension":2,"board":1,"optimalCells":2,"manhattan":{"expansions":2,"pops":2,"cells":2},"euclidean":{"expansions":2,"pops":2,"cells":2}},{"dimension":2,"board":2,"optimalCells":2,"manhattan":{"expansions":3,"pops":2,"cells":2},"euclidean":{"expansions":3,"pops":2,"cells":2}},{"dimension":2,"board":3,"optimalCells":2,"manhattan":{"expansions":2,"pops":2,"cells":2},"euclidean":{"expansions":2,"pops":2,"cells":2}},{"dimension":2,"board":4,"optimalCells":3,"manhattan":{"expansions":3,"pops":4,"cells":3},"euclidean":{"expansions":3,"pops":4,"cells":3}},{"dimension":2,"board":5,"optimalCells":2,"manhattan":{"expansions":2,"pops":2,"cells":2},"euclidean":{"expansions":2,"pops":2,"cells":2}},{"dimension":2,"board":6,"optimalCells":2,"manhattan":{"expansions":2,"pops":2,"cells":2},"euclidean":{"expansions":2,"pops":2,"cells":2}},{"dimension":2,"board":7,"optimalCells":2,"manhattan":{"expansions":3,"pops":2,"cells":2},"euclidean":{"expansions":3,"pops":2,"cells":2}},{"dimension":2,"board":8,"optimalCells":2,"manhattan":{"expansions":3,"pops":2,"cells":2},"euclidean":{"expansions":3,"pops":2,"cells":2}},{"dimension":2,"board":9,"optimalCells":2,"manhattan":{"expansions":2,"pops":2,"cells":2},"euclidean":{"expansions":2,"pops":2,"cells":2}},{"dimension":3,"board":0,"optimalCells":4,"manhattan":{"expansions":7,"pops":6,"cells":4},"euclidean":{"expansions":7,"pops":6,"cells":4}},{"dimension":3,"board":1,"optimalCells":2,"manhattan":{"expansions":2,"pops":2,"cells":2},"euclidean":{"expansions":2,"pops":2,"cells":2}},{"dimension":3,"board":2,"optimalCells":4,"manhattan":{"expansions":5,"pops":4,"cells":4},"euclidean":{"expansions":5,"pops":4,"cells":4}},{"dimension":3,"board":3,"optimalCells":2,"manhattan":{"expansions":3,"pops":2,"cells":2},"euclidean":{"expansions":3,"pops":2,"cells":2}},{"dimension":3,"board":4,"optimalCells":3,"manhattan":{"expansions":5,"pops":3,"cells":3},"euclidean":{"expansions":5,"pops":3,"cells":3}},{"dimension":3,"board":5,"optimalCells":2,"manhattan":{"expansions":3,"pops":2,"cells":2},"euclidean":{"expansions":3,"pops":2,"cells":2}},{"dimension":3,"board":6,"optimalCells":3,"manhattan":{"expansions":5,"pops":3,"cells":3},"euclidean":{"expansions":5,"pops":3,"cells":3}},{"dimension":3,"board":7,"optimalCells":2,"manhattan":{"expansions":4,"pops":2,"cells":2},"euclidean":{"expansions":4,"pops":2,"cells":2}},{"dimension":3,"board":8,"optimalCells":4,"manhattan":{"expansions":6,"pops":5,"cells":4},"euclidean":{"expansions":6,"pops":5,"cells":4}},{"dimension":3,"board":9,"optimalCells":4,"manhattan":{"expansions":5,"pops":4,"cells":4},"euclidean":{"expansions":5,"pops":4,"cells":4}},{"dimension":4,"board":0,"optimalCells":2,"manhattan":{"expansions":3,"pops":2,"cells":2},"euclidean":{"expansions":3,"pops":2,"cells":2}},{"dimension":4,"board":1,"optimalCells":2,"manhattan":{"expansions":6,"pops":2,"cells":2},"euclidean":{"expansions":6,"pops":2,"cells":2}},{"dimension":4,"board":2,"optimalCells":2,"manhattan":{"expansions":2,"pops":2,"cells":2},"euclidean":{"expansions":2,"pops":2,"cells":2}},{"dimension":4,"board":3,"optimalCells":3,"manhattan":{"expansions":6,"pops":4,"cells":3},"euclidean":{"expansions":4,"pops":3,"cells":3}},{"dimension":4,"board":4,"optimalCells":null,"manhattan":{"expansions":5,"pops":6,"cells":0},"euclidean":{"expansions":5,"pops":6,"cells":0}},{"dimension":4,"board":5,"optimalCells":2,"manhattan":{"expansions":6,"pops":2,"cells":2},"euclidean":{"expansions":6,"pops":2,"cells":2}},{"dimension":4,"board":6,"optimalCells":4,"manhattan":{"expansions":6,"pops":4,"cells":4},"euclidean":{"expansions":6,"pops":4,"cells":4}},{"dimension":4,"board":7,"optimalCells":4,"manhattan":{"expansions":11,"pops":5,"cells":4},"euclidean":{"expansions":8,"pops":4,"cells":4}},{"dimension":4,"board":8,"optimalCells":6,"manhattan":{"expansions":9,"pops":7,"cells":6},"euclidean":{"expansions":9,"pops":8,"cells":6}},{"dimension":4,"board":9,"optimalCells":3,"manhattan":{"expansions":5,"pops":3,"cells":3},"euclidean":{"expansions":5,"pops":3,"cells":3}},{"dimension":5,"board":0,"optimalCells":5,"manhattan":{"expansions":11,"pops":7,"cells":5},"euclidean":{"expansions":13,"pops":8,"cells":5}},{"dimension":5,"board":1,"optimalCells":4,"manhattan":{"expansions":12,"pops":5,"cells":4},"euclidean":{"expansions":12,"pops":5,"cells":4}},{"dimension":5,"board":2,"optimalCells":4,"manhattan":{"expansions":7,"pops":4,"cells":4},"euclidean":{"expansions":7,"pops":4,"cells":4}},{"dimension":5,"board":3,"optimalCells":4,"manhattan":{"expansions":8,"pops":4,"cells":4},"euclidean":{"expansions":8,"pops":4,"cells":4}},{"dimension":5,"board":4,"optimalCells":7,"manhattan":{"expansions":19,"pops":13,"cells":7},"euclidean":{"expansions":20,"pops":15,"cells":7}},{"dimension":5,"board":5,"optimalCells":4,"manhattan":{"expansions":9,"pops":4,"cells":4},"euclidean":{"expansions":9,"pops":4,"cells":4}},{"dimension":5,"board":6,"optimalCells":3,"manhattan":{"expansions":4,"pops":3,"cells":3},"euclidean":{"expansions":4,"pops":3,"cells":3}},{"dimension":5,"board":7,"optimalCells":3,"manhattan":{"expansions":6,"pops":3,"cells":3},"euclidean":{"expansions":6,"pops":3,"cells":3}},{"dimension":5,"board":8,"optimalCells":3,"manhattan":{"expansions":4,"pops":3,"cells":3},"euclidean":{"expansions":4,"pops":3,"cells":3}},{"dimension":5,"board":9,"optimalCells":5,"manhattan":{"expansions":8,"pops":5,"cells":5},"euclidean":{"expansions":8,"pops":5,"cells":5}},{"dimension":6,"board":0,"optimalCells":5,"manhattan":{"expansions":9,"pops":5,"cells":5},"euclidean":{"expansions":9,"pops":5,"cells":5}},{"dimension":6,"board":1,"optimalCells":4,"manhattan":{"expansions":10,"pops":4,"cells":4},"euclidean":{"expansions":10,"pops":4,"cells":4}},{"dimension":6,"board":2,"optimalCells":5,"manhattan":{"expansions":10,"pops":6,"cells":6},"euclidean":{"expansions":16,"pops":8,"cells":5}},{"dimension":6,"board":3,"optimalCells":3,"manhattan":{"expansions":11,"pops":4,"cells":3},"euclidean":{"expansions":8,"pops":3,"cells":3}},{"dimension":6,"board":4,"optimalCells":4,"manhattan":{"expansions":8,"pops":6,"cells":4},"euclidean":{"expansions":8,"pops":6,"cells":4}},{"dimension":6,"board":5,"optimalCells":8,"manhattan":{"expansions":19,"pops":13,"cells":8},"euclidean":{"expansions":19,"pops":13,"cells":8}},{"dimension":6,"board":6,"optimalCells":2,"manhattan":{"expansions":5,"pops":2,"cells":2},"euclidean":{"expansions":5,"pops":2,"cells":2}},{"dimension":6,"board":7,"optimalCells":2,"manhattan":{"expansions":3,"pops":2,"cells":2},"euclidean":{"expansions":3,"pops":2,"cells":2}},{"dimension":6,"board":8,"optimalCells":3,"manhattan":{"expansions":3,"pops":3,"cells":3},"euclidean":{"expansions":3,"pops":3,"cells":3}},{"dimension":6,"board":9,"optimalCells":5,"manhattan":{"expansions":11,"pops":6,"cells":5},"euclidean":{"expansions":12,"pops":7,"cells":5}},{"dimension":7,"board":0,"optimalCells":4,"manhattan":{"expansions":9,"pops":4,"cells":4},"euclidean":{"expansions":9,"pops":4,"cells":4}},{"dimension":7,"board":1,"optimalCells":8,"manhattan":{"expansions":17,"pops":12,"cells":8},"euclidean":{"expansions":17,"pops":13,"cells":8}},{"dimension":7,"board":2,"optimalCells":4,"manhattan":{"expansions":8,"pops":4,"cells":4},"euclidean":{"expansions":8,"pops":4,"cells":4}},{"dimension":7,"board":3,"optimalCells":null,"manhattan":{"expansions":24,"pops":25,"cells":0},"euclidean":{"expansions":24,"pops":25,"cells":0}},{"dimension":7,"board":4,"optimalCells":3,"manhattan":{"expansions":9,"pops":3,"cells":3},"euclidean":{"expansions":9,"pops":3,"cells":3}},{"dimension":7,"board":5,"optimalCells":7,"manhattan":{"expansions":24,"pops":16,"cells":7},"euclidean":{"expansions":22,"pops":14,"cells":7}},{"dimension":7,"board":6,"optimalCells":9,"manhattan":{"expansions":21,"pops":15,"cells":9},"euclidean":{"expansions":29,"pops":22,"cells":9}},{"dimension":7,"board":7,"optimalCells":5,"manhattan":{"expansions":12,"pops":6,"cells":6},"euclidean":{"expansions":12,"pops":5,"cells":5}},{"dimension":7,"board":8,"optimalCells":2,"manhattan":{"expansions":4,"pops":2,"cells":2},"euclidean":{"expansions":4,"pops":2,"cells":2}},{"dimension":7,"board":9,"optimalCells":3,"manhattan":{"expansions":10,"pops":4,"cells":3},"euclidean":{"expansions":10,"pops":4,"cells":3}},{"dimension":8,"board":0,"optimalCells":11,"manhattan":{"expansions":13,"pops":12,"cells":11},"euclidean":{"expansions":13,"pops":12,"cells":11}},{"dimension":8,"board":1,"optimalCells":7,"manhattan":{"expansions":10,"pops":8,"cells":7},"euclidean":{"expansions":12,"pops":10,"cells":7}},{"dimension":8,"board":2,"optimalCells":5,"manhattan":{"expansions":13,"pops":5,"cells":5},"euclidean":{"expansions":13,"pops":5,"cells":5}},{"dimension":8,"board":3,"optimalCells":4,"manhattan":{"expansions":7,"pops":4,"cells":4},"euclidean":{"expansions":7,"pops":4,"cells":4}},{"dimension":8,"board":4,"optimalCells":6,"manhattan":{"expansions":12,"pops":6,"cells":6},"euclidean":{"expansions":12,"pops":6,"cells":6}},{"dimension":8,"board":5,"optimalCells":7,"manhattan":{"expansions":19,"pops":13,"cells":7},"euclidean":{"expansions":20,"pops":14,"cells":7}},{"dimension":8,"board":6,"optimalCells":4,"manhattan":{"expansions":7,"pops":4,"cells":4},"euclidean":{"expansions":7,"pops":4,"cells":4}},{"dimension":8,"board":7,"optimalCells":3,"manhattan":{"expansions":7,"pops":3,"cells":3},"euclidean":{"expansions":7,"pops":3,"cells":3}},{"dimension":8,"board":8,"optimalCells":8,"manhattan":{"expansions":24,"pops":12,"cells":8},"euclidean":{"expansions":24,"pops":16,"cells":8}},{"dimension":8,"board":9,"optimalCells":8,"manhattan":{"expansions":18,"pops":15,"cells":8},"euclidean":{"expansions":20,"pops":16,"cells":8}},{"dimension":9,"board":0,"optimalCells":4,"manhattan":{"expansions":8,"pops":4,"cells":4},"euclidean":{"expansions":8,"pops":4,"cells":4}},{"dimension":9,"board":1,"optimalCells":13,"manhattan":{"expansions":44,"pops":38,"cells":13},"euclidean":{"expansions":44,"pops":38,"cells":13}},{"dimension":9,"board":2,"optimalCells":10,"manhattan":{"expansions":31,"pops":19,"cells":10},"euclidean":{"expansions":36,"pops":22,"cells":10}},{"dimension":9,"board":3,"optimalCells":10,"manhattan":{"expansions":39,"pops":21,"cells":10},"euclidean":{"expansions":48,"pops":30,"cells":10}},{"dimension":9,"board":4,"optimalCells":2,"manhattan":{"expansions":4,"pops":2,"cells":2},"euclidean":{"expansions":4,"pops":2,"cells":2}},{"dimension":9,"board":5,"optimalCells":7,"manhattan":{"expansions":21,"pops":14,"cells":7},"euclidean":{"expansions":21,"pops":13,"cells":7}},{"dimension":9,"board":6,"optimalCells":6,"manhattan":{"expansions":14,"pops":9,"cells":6},"euclidean":{"expansions":17,"pops":11,"cells":6}},{"dimension":9,"board":7,"optimalCells":6,"manhattan":{"expansions":8,"pops":7,"cells":6},"euclidean":{"expansions":8,"pops":7,"cells":6}},{"dimension":9,"board":8,"optimalCells":7,"manhattan":{"expansions":18,"pops":11,"cells":7},"euclidean":{"expansions":16,"pops":10,"cells":7}},{"dimension":9,"board":9,"optimalCells":8,"manhattan":{"expansions":23,"pops":12,"cells":8},"euclidean":{"expansions":32,"pops":19,"cells":8}},{"dimension":10,"board":0,"optimalCells":9,"manhattan":{"expansions":19,"pops":11,"cells":9},"euclidean":{"expansions":29,"pops":20,"cells":9}},{"dimension":10,"board":1,"optimalCells":null,"manhattan":{"expansions":52,"pops":53,"cells":0},"euclidean":{"expansions":52,"pops":53,"cells":0}},{"dimension":10,"board":2,"optimalCells":4,"manhattan":{"expansions":8,"pops":4,"cells":4},"euclidean":{"expansions":8,"pops":4,"cells":4}},{"dimension":10,"board":3,"optimalCells":5,"manhattan":{"expansions":10,"pops":5,"cells":5},"euclidean":{"expansions":10,"pops":5,"cells":5}},{"dimension":10,"board":4,"optimalCells":9,"manhattan":{"expansions":30,"pops":21,"cells":9},"euclidean":{"expansions":34,"pops":23,"cells":9}},{"dimension":10,"board":5,"optimalCells":7,"manhattan":{"expansions":13,"pops":9,"cells":7},"euclidean":{"expansions":13,"pops":8,"cells":7}},{"dimension":10,"board":6,"optimalCells":6,"manhattan":{"expansions":9,"pops":7,"cells":6},"euclidean":{"expansions":9,"pops":7,"cells":6}},{"dimension":10,"board":7,"optimalCells":2,"manhattan":{"expansions":4,"pops":2,"cells":2},"euclidean":{"expansions":4,"pops":2,"cells":2}},{"dimension":10,"board":8,"optimalCells":4,"manhattan":{"expansions":11,"pops":4,"cells":4},"euclidean":{"expansions":11,"pops":4,"cells":4}},{"dimension":10,"board":9,"optimalCells":9,"manhattan":{"expansions":19,"pops":12,"cells":9},"euclidean":{"expansions":19,"pops":12,"cells":9}},{"dimension":11,"board":0,"optimalCells":7,"manhattan":{"expansions":12,"pops":7,"cells":7},"euclidean":{"expansions":12,"pops":7,"cells":7}},{"dimension":11,"board":1,"optimalCells":7,"manhattan":{"expansions":19,"pops":7,"cells":7},"euclidean":{"expansions":19,"pops":7,"cells":7}},{"dimension":11,"board":2,"optimalCells":6,"manhattan":{"expansions":18,"pops":7,"cells":6},"euclidean":{"expansions":22,"pops":9,"cells":6}},{"dimension":11,"board":3,"optimalCells":null,"manhattan":{"expansions":43,"pops":44,"cells":0},"euclidean":{"expansions":43,"pops":44,"cells":0}},{"dimension":11,"board":4,"optimalCells":9,"manhattan":{"expansions":28,"pops":16,"cells":9},"euclidean":{"expansions":35,"pops":22,"cells":9}},{"dimension":11,"board":5,"optimalCells":9,"manhattan":{"expansions":25,"pops":16,"cells":9},"euclidean":{"expansions":34,"pops":23,"cells":9}},{"dimension":11,"board":6,"optimalCells":7,"manhattan":{"expansions":23,"pops":11,"cells":7},"euclidean":{"expansions":27,"pops":14,"cells":7}},{"dimension":11,"board":7,"optimalCells":5,"manhattan":{"expansions":10,"pops":5,"cells":5},"euclidean":{"expansions":10,"pops":5,"cells":5}},{"dimension":11,"board":8,"optimalCells":11,"manhattan":{"expansions":35,"pops":24,"cells":11},"euclidean":{"expansions":46,"pops":29,"cells":11}},{"dimension":11,"board":9,"optimalCells":5,"manhattan":{"expansions":10,"pops":5,"cells":5},"euclidean":{"expansions":10,"pops":5,"cells":5}},{"dimension":12,"board":0,"optimalCells":14,"manhattan":{"expansions":46,"pops":30,"cells":14},"euclidean":{"expansions":66,"pops":50,"cells":14}},{"dimension":12,"board":1,"optimalCells":11,"manhattan":{"expansions":25,"pops":19,"cells":11},"euclidean":{"expansions":25,"pops":19,"cells":11}},{"dimension":12,"board":2,"optimalCells":6,"manhattan":{"expansions":11,"pops":6,"cells":6},"euclidean":{"expansions":11,"pops":6,"cells":6}},{"dimension":12,"board":3,"optimalCells":3,"manhattan":{"expansions":9,"pops":3,"cells":3},"euclidean":{"expansions":9,"pops":3,"cells":3}},{"dimension":12,"board":4,"optimalCells":4,"manhattan":{"expansions":10,"pops":4,"cells":4},"euclidean":{"expansions":10,"pops":4,"cells":4}},{"dimension":12,"board":5,"optimalCells":9,"manhattan":{"expansions":27,"pops":9,"cells":9},"euclidean":{"expansions":27,"pops":9,"cells":9}},{"dimension":12,"board":6,"optimalCells":6,"manhattan":{"expansions":11,"pops":6,"cells":6},"euclidean":{"expansions":11,"pops":6,"cells":6}},{"dimension":12,"board":7,"optimalCells":4,"manhattan":{"expansions":12,"pops":4,"cells":4},"euclidean":{"expansions":12,"pops":4,"cells":4}},{"dimension":12,"board":8,"optimalCells":4,"manhattan":{"expansions":4,"pops":4,"cells":4},"euclidean":{"expansions":4,"pops":4,"cells":4}},{"dimension":12,"board":9,"optimalCells":6,"manhattan":{"expansions":17,"pops":11,"cells":6},"euclidean":{"expansions":17,"pops":10,"cells":6}},{"dimension":13,"board":0,"optimalCells":2,"manhattan":{"expansions":3,"pops":2,"cells":2},"euclidean":{"expansions":3,"pops":2,"cells":2}},{"dimension":13,"board":1,"optimalCells":5,"manhattan":{"expansions":15,"pops":5,"cells":5},"euclidean":{"expansions":15,"pops":5,"cells":5}},{"dimension":13,"board":2,"optimalCells":null,"manhattan":{"expansions":98,"pops":99,"cells":0},"euclidean":{"expansions":97,"pops":98,"cells":0}},{"dimension":13,"board":3,"optimalCells":7,"manhattan":{"expansions":14,"pops":9,"cells":7},"euclidean":{"expansions":12,"pops":8,"cells":7}},{"dimension":13,"board":4,"optimalCells":10,"manhattan":{"expansions":35,"pops":22,"cells":10},"euclidean":{"expansions":45,"pops":30,"cells":10}},{"dimension":13,"board":5,"optimalCells":9,"manhattan":{"expansions":25,"pops":17,"cells":9},"euclidean":{"expansions":29,"pops":19,"cells":9}},{"dimension":13,"board":6,"optimalCells":14,"manhattan":{"expansions":40,"pops":23,"cells":14},"euclidean":{"expansions":47,"pops":31,"cells":14}},{"dimension":13,"board":7,"optimalCells":null,"manhattan":{"expansions":100,"pops":101,"cells":0},"euclidean":{"expansions":84,"pops":85,"cells":0}},{"dimension":13,"board":8,"optimalCells":5,"manhattan":{"expansions":10,"pops":5,"cells":5},"euclidean":{"expansions":10,"pops":5,"cells":5}},{"dimension":13,"board":9,"optimalCells":9,"manhattan":{"expansions":21,"pops":9,"cells":9},"euclidean":{"expansions":21,"pops":9,"cells":9}},{"dimension":14,"board":0,"optimalCells":11,"manhattan":{"expansions":24,"pops":13,"cells":11},"euclidean":{"expansions":24,"pops":13,"cells":11}},{"dimension":14,"board":1,"optimalCells":19,"manhattan":{"expansions":95,"pops":70,"cells":19},"euclidean":{"expansions":136,"pops":102,"cells":19}},{"dimension":14,"board":2,"optimalCells":11,"manhattan":{"expansions":43,"pops":27,"cells":11},"euclidean":{"expansions":49,"pops":29,"cells":11}},{"dimension":14,"board":3,"optimalCells":9,"manhattan":{"expansions":27,"pops":9,"cells":9},"euclidean":{"expansions":27,"pops":9,"cells":9}},{"dimension":14,"board":4,"optimalCells":7,"manhattan":{"expansions":21,"pops":7,"cells":7},"euclidean":{"expansions":21,"pops":7,"cells":7}},{"dimension":14,"board":5,"optimalCells":9,"manhattan":{"expansions":21,"pops":14,"cells":9},"euclidean":{"expansions":25,"pops":17,"cells":9}},{"dimension":14,"board":6,"optimalCells":7,"manhattan":{"expansions":31,"pops":16,"cells":7},"euclidean":{"expansions":25,"pops":11,"cells":7}},{"dimension":14,"board":7,"optimalCells":8,"manhattan":{"expansions":34,"pops":15,"cells":9},"euclidean":{"expansions":38,"pops":18,"cells":9}},{"dimension":14,"board":8,"optimalCells":5,"manhattan":{"expansions":13,"pops":6,"cells":5},"euclidean":{"expansions":13,"pops":6,"cells":5}},{"dimension":14,"board":9,"optimalCells":7,"manhattan":{"expansions":19,"pops":13,"cells":7},"euclidean":{"expansions":19,"pops":13,"cells":7}},{"dimension":15,"board":0,"optimalCells":7,"manhattan":{"expansions":27,"pops":12,"cells":7},"euclidean":{"expansions":31,"pops":15,"cells":7}},{"dimension":15,"board":1,"optimalCells":3,"manhattan":{"expansions":5,"pops":3,"cells":3},"euclidean":{"expansions":5,"pops":3,"cells":3}},{"dimension":15,"board":2,"optimalCells":16,"manhattan":{"expansions":54,"pops":30,"cells":17},"euclidean":{"expansions":47,"pops":30,"cells":16}},{"dimension":15,"board":3,"optimalCells":6,"manhattan":{"expansions":17,"pops":6,"cells":6},"euclidean":{"expansions":17,"pops":6,"cells":6}},{"dimension":15,"board":4,"optimalCells":6,"manhattan":{"expansions":18,"pops":6,"cells":6},"euclidean":{"expansions":18,"pops":6,"cells":6}},{"dimension":15,"board":5,"optimalCells":6,"manhattan":{"expansions":15,"pops":6,"cells":6},"euclidean":{"expansions":15,"pops":6,"cells":6}},{"dimension":15,"board":6,"optimalCells":17,"manhattan":{"expansions":44,"pops":33,"cells":17},"euclidean":{"expansions":45,"pops":36,"cells":17}},{"dimension":15,"board":7,"optimalCells":12,"manhattan":{"expansions":46,"pops":27,"cells":12},"euclidean":{"expansions":62,"pops":36,"cells":12}},{"dimension":15,"board":8,"optimalCells":10,"manhattan":{"expansions":17,"pops":12,"cells":10},"euclidean":{"expansions":17,"pops":12,"cells":10}},{"dimension":15,"board":9,"optimalCells":7,"manhattan":{"expansions":27,"pops":12,"cells":7},"euclidean":{"expansions":31,"pops":15,"cells":7}},{"dimension":16,"board":0,"optimalCells":11,"manhattan":{"expansions":23,"pops":11,"cells":11},"euclidean":{"expansions":23,"pops":11,"cells":11}},{"dimension":16,"board":1,"optimalCells":5,"manhattan":{"expansions":7,"pops":5,"cells":5},"euclidean":{"expansions":7,"pops":5,"cells":5}},{"dimension":16,"board":2,"optimalCells":14,"manhattan":{"expansions":34,"pops":15,"cells":14},"euclidean":{"expansions":34,"pops":15,"cells":14}},{"dimension":16,"board":3,"optimalCells":23,"manhattan":{"expansions":129,"pops":106,"cells":23},"euclidean":{"expansions":138,"pops":129,"cells":23}},{"dimension":16,"board":4,"optimalCells":null,"manhattan":{"expansions":104,"pops":105,"cells":0},"euclidean":{"expansions":104,"pops":105,"cells":0}},{"dimension":16,"board":5,"optimalCells":12,"manhattan":{"expansions":26,"pops":17,"cells":12},"euclidean":{"expansions":26,"pops":17,"cells":12}},{"dimension":16,"board":6,"optimalCells":9,"manhattan":{"expansions":15,"pops":11,"cells":9},"euclidean":{"expansions":18,"pops":13,"cells":9}},{"dimension":16,"board":7,"optimalCells":13,"manhattan":{"expansions":31,"pops":15,"cells":13},"euclidean":{"expansions":29,"pops":14,"cells":13}},{"dimension":16,"board":8,"optimalCells":7,"manhattan":{"expansions":20,"pops":7,"cells":7},"euclidean":{"expansions":20,"pops":7,"cells":7}},{"dimension":16,"board":9,"optimalCells":11,"manhattan":{"expansions":34,"pops":16,"cells":11},"euclidean":{"expansions":38,"pops":21,"cells":11}},{"dimension":17,"board":0,"optimalCells":2,"manhattan":{"expansions":4,"pops":2,"cells":2},"euclidean":{"expansions":4,"pops":2,"cells":2}},{"dimension":17,"board":1,"optimalCells":3,"manhattan":{"expansions":9,"pops":3,"cells":3},"euclidean":{"expansions":9,"pops":3,"cells":3}},{"dimension":17,"board":2,"optimalCells":13,"manhattan":{"expansions":69,"pops":53,"cells":13},"euclidean":{"expansions":72,"pops":57,"cells":13}},{"dimension":17,"board":3,"optimalCells":5,"manhattan":{"expansions":13,"pops":5,"cells":5},"euclidean":{"expansions":13,"pops":5,"cells":5}},{"dimension":17,"board":4,"optimalCells":null,"manhattan":{"expansions":33,"pops":34,"cells":0},"euclidean":{"expansions":33,"pops":34,"cells":0}},{"dimension":17,"board":5,"optimalCells":4,"manhattan":{"expansions":6,"pops":4,"cells":4},"euclidean":{"expansions":6,"pops":4,"cells":4}},{"dimension":17,"board":6,"optimalCells":23,"manhattan":{"expansions":137,"pops":105,"cells":23},"euclidean":{"expansions":186,"pops":157,"cells":23}},{"dimension":17,"board":7,"optimalCells":15,"manhattan":{"expansions":60,"pops":44,"cells":16},"euclidean":{"expansions":67,"pops":51,"cells":16}},{"dimension":17,"board":8,"optimalCells":17,"manhattan":{"expansions":69,"pops":42,"cells":18},"euclidean":{"expansions":96,"pops":63,"cells":18}},{"dimension":17,"board":9,"optimalCells":10,"manhattan":{"expansions":29,"pops":10,"cells":10},"euclidean":{"expansions":29,"pops":10,"cells":10}},{"dimension":18,"board":0,"optimalCells":12,"manhattan":{"expansions":37,"pops":15,"cells":12},"euclidean":{"expansions":36,"pops":14,"cells":12}},{"dimension":18,"board":1,"optimalCells":11,"manhattan":{"expansions":36,"pops":30,"cells":14},"euclidean":{"expansions":41,"pops":29,"cells":11}},{"dimension":18,"board":2,"optimalCells":8,"manhattan":{"expansions":19,"pops":8,"cells":8},"euclidean":{"expansions":19,"pops":8,"cells":8}},{"dimension":18,"board":3,"optimalCells":5,"manhattan":{"expansions":8,"pops":5,"cells":5},"euclidean":{"expansions":8,"pops":5,"cells":5}},{"dimension":18,"board":4,"optimalCells":9,"manhattan":{"expansions":30,"pops":15,"cells":9},"euclidean":{"expansions":36,"pops":22,"cells":9}},{"dimension":18,"board":5,"optimalCells":7,"manhattan":{"expansions":18,"pops":7,"cells":7},"euclidean":{"expansions":18,"pops":7,"cells":7}},{"dimension":18,"board":6,"optimalCells":20,"manhattan":{"expansions":76,"pops":64,"cells":20},"euclidean":{"expansions":74,"pops":59,"cells":20}},{"dimension":18,"board":7,"optimalCells":8,"manhattan":{"expansions":27,"pops":12,"cells":8},"euclidean":{"expansions":31,"pops":15,"cells":8}},{"dimension":18,"board":8,"optimalCells":11,"manhattan":{"expansions":37,"pops":15,"cells":12},"euclidean":{"expansions":28,"pops":11,"cells":11}},{"dimension":18,"board":9,"optimalCells":12,"manhattan":{"expansions":36,"pops":17,"cells":13},"euclidean":{"expansions":44,"pops":24,"cells":13}},{"dimension":19,"board":0,"optimalCells":20,"manhattan":{"expansions":38,"pops":25,"cells":20},"euclidean":{"expansions":45,"pops":31,"cells":20}},{"dimension":19,"board":1,"optimalCells":16,"manhattan":{"expansions":45,"pops":16,"cells":16},"euclidean":{"expansions":45,"pops":16,"cells":16}},{"dimension":19,"board":2,"optimalCells":14,"manhattan":{"expansions":35,"pops":19,"cells":16},"euclidean":{"expansions":35,"pops":19,"cells":14}},{"dimension":19,"board":3,"optimalCells":16,"manhattan":{"expansions":85,"pops":65,"cells":16},"euclidean":{"expansions":76,"pops":52,"cells":16}},{"dimension":19,"board":4,"optimalCells":15,"manhattan":{"expansions":43,"pops":16,"cells":16},"euclidean":{"expansions":39,"pops":15,"cells":15}},{"dimension":19,"board":5,"optimalCells":11,"manhattan":{"expansions":32,"pops":13,"cells":12},"euclidean":{"expansions":31,"pops":13,"cells":12}},{"dimension":19,"board":6,"optimalCells":14,"manhattan":{"expansions":37,"pops":24,"cells":14},"euclidean":{"expansions":48,"pops":34,"cells":14}},{"dimension":19,"board":7,"optimalCells":26,"manhattan":{"expansions":108,"pops":97,"cells":27},"euclidean":{"expansions":109,"pops":101,"cells":27}},{"dimension":19,"board":8,"optimalCells":10,"manhattan":{"expansions":27,"pops":10,"cells":10},"euclidean":{"expansions":27,"pops":10,"cells":10}},{"dimension":19,"board":9,"optimalCells":15,"manhattan":{"expansions":61,"pops":35,"cells":15},"euclidean":{"expansions":84,"pops":57,"cells":15}},{"dimension":20,"board":0,"optimalCells":11,"manhattan":{"expansions":37,"pops":21,"cells":11},"euclidean":{"expansions":45,"pops":30,"cells":11}},{"dimension":20,"board":1,"optimalCells":9,"manhattan":{"expansions":26,"pops":9,"cells":9},"euclidean":{"expansions":26,"pops":9,"cells":9}},{"dimension":20,"board":2,"optimalCells":15,"manhattan":{"expansions":42,"pops":30,"cells":16},"euclidean":{"expansions":38,"pops":25,"cells":15}},{"dimension":20,"board":3,"optimalCells":null,"manhattan":{"expansions":190,"pops":191,"cells":0},"euclidean":{"expansions":189,"pops":190,"cells":0}},{"dimension":20,"board":4,"optimalCells":13,"manhattan":{"expansions":49,"pops":28,"cells":13},"euclidean":{"expansions":59,"pops":38,"cells":13}},{"dimension":20,"board":5,"optimalCells":19,"manhattan":{"expansions":38,"pops":20,"cells":19},"euclidean":{"expansions":38,"pops":20,"cells":19}},{"dimension":20,"board":6,"optimalCells":13,"manhattan":{"expansions":38,"pops":17,"cells":14},"euclidean":{"expansions":48,"pops":24,"cells":14}},{"dimension":20,"board":7,"optimalCells":18,"manhattan":{"expansions":85,"pops":66,"cells":18},"euclidean":{"expansions":125,"pops":99,"cells":18}},{"dimension":20,"board":8,"optimalCells":16,"manhattan":{"expansions":85,"pops":57,"cells":16},"euclidean":{"expansions":119,"pops":77,"cells":16}},{"dimension":20,"board":9,"optimalCells":null,"manhattan":{"expansions":6,"pops":7,"cells":0},"euclidean":{"expansions":6,"pops":7,"cells":0}},{"dimension":21,"board":0,"optimalCells":27,"manhattan":{"expansions":124,"pops":99,"cells":27},"euclidean":{"expansions":135,"pops":122,"cells":27}},{"dimension":21,"board":1,"optimalCells":19,"manhattan":{"expansions":51,"pops":28,"cells":19},"euclidean":{"expansions":50,"pops":28,"cells":19}},{"dimension":21,"board":2,"optimalCells":20,"manhattan":{"expansions":78,"pops":46,"cells":20},"euclidean":{"expansions":109,"pops":71,"cells":20}},{"dimension":21,"board":3,"optimalCells":26,"manhattan":{"expansions":139,"pops":110,"cells":26},"euclidean":{"expansions":194,"pops":161,"cells":26}},{"dimension":21,"board":4,"optimalCells":9,"manhattan":{"expansions":22,"pops":9,"cells":9},"euclidean":{"expansions":22,"pops":9,"cells":9}},{"dimension":21,"board":5,"optimalCells":9,"manhattan":{"expansions":25,"pops":9,"cells":9},"euclidean":{"expansions":25,"pops":9,"cells":9}},{"dimension":21,"board":6,"optimalCells":24,"manhattan":{"expansions":115,"pops":83,"cells":24},"euclidean":{"expansions":170,"pops":135,"cells":24}},{"dimension":21,"board":7,"optimalCells":15,"manhattan":{"expansions":46,"pops":31,"cells":15},"euclidean":{"expansions":77,"pops":54,"cells":15}},{"dimension":21,"board":8,"optimalCells":null,"manhattan":{"expansions":3,"pops":4,"cells":0},"euclidean":{"expansions":3,"pops":4,"cells":0}},{"dimension":21,"board":9,"optimalCells":null,"manhattan":{"expansions":192,"pops":193,"cells":0},"euclidean":{"expansions":192,"pops":193,"cells":0}},{"dimension":22,"board":0,"optimalCells":19,"manhattan":{"expansions":48,"pops":22,"cells":19},"euclidean":{"expansions":46,"pops":21,"cells":19}},{"dimension":22,"board":1,"optimalCells":28,"manhattan":{"expansions":205,"pops":178,"cells":28},"euclidean":{"expansions":296,"pops":259,"cells":28}},{"dimension":22,"board":2,"optimalCells":12,"manhattan":{"expansions":52,"pops":30,"cells":12},"euclidean":{"expansions":69,"pops":43,"cells":12}},{"dimension":22,"board":3,"optimalCells":9,"manhattan":{"expansions":24,"pops":12,"cells":9},"euclidean":{"expansions":26,"pops":16,"cells":9}},{"dimension":22,"board":4,"optimalCells":21,"manhattan":{"expansions":51,"pops":21,"cells":21},"euclidean":{"expansions":51,"pops":21,"cells":21}},{"dimension":22,"board":5,"optimalCells":null,"manhattan":{"expansions":77,"pops":78,"cells":0},"euclidean":{"expansions":77,"pops":78,"cells":0}},{"dimension":22,"board":6,"optimalCells":26,"manhattan":{"expansions":226,"pops":175,"cells":26},"euclidean":{"expansions":309,"pops":256,"cells":26}},{"dimension":22,"board":7,"optimalCells":17,"manhattan":{"expansions":101,"pops":76,"cells":17},"euclidean":{"expansions":114,"pops":91,"cells":17}},{"dimension":22,"board":8,"optimalCells":10,"manhattan":{"expansions":30,"pops":10,"cells":10},"euclidean":{"expansions":30,"pops":10,"cells":10}},{"dimension":22,"board":9,"optimalCells":11,"manhattan":{"expansions":27,"pops":18,"cells":11},"euclidean":{"expansions":30,"pops":21,"cells":11}},{"dimension":23,"board":0,"optimalCells":22,"manhattan":{"expansions":89,"pops":57,"cells":22},"euclidean":{"expansions":143,"pops":106,"cells":22}},{"dimension":23,"board":1,"optimalCells":9,"manhattan":{"expansions":23,"pops":12,"cells":10},"euclidean":{"expansions":26,"pops":15,"cells":10}},{"dimension":23,"board":2,"optimalCells":25,"manhattan":{"expansions":136,"pops":97,"cells":25},"euclidean":{"expansions":237,"pops":188,"cells":25}},{"dimension":23,"board":3,"optimalCells":29,"manhattan":{"expansions":158,"pops":142,"cells":29},"euclidean":{"expansions":171,"pops":149,"cells":29}},{"dimension":23,"board":4,"optimalCells":19,"manhattan":{"expansions":58,"pops":40,"cells":19},"euclidean":{"expansions":79,"pops":57,"cells":19}},{"dimension":23,"board":5,"optimalCells":17,"manhattan":{"expansions":53,"pops":19,"cells":18},"euclidean":{"expansions":47,"pops":17,"cells":17}},{"dimension":23,"board":6,"optimalCells":16,"manhattan":{"expansions":88,"pops":56,"cells":16},"euclidean":{"expansions":96,"pops":71,"cells":16}},{"dimension":23,"board":7,"optimalCells":16,"manhattan":{"expansions":84,"pops":52,"cells":16},"euclidean":{"expansions":118,"pops":81,"cells":16}},{"dimension":23,"board":8,"optimalCells":4,"manhattan":{"expansions":11,"pops":4,"cells":4},"euclidean":{"expansions":11,"pops":4,"cells":4}},{"dimension":23,"board":9,"optimalCells":28,"manhattan":{"expansions":220,"pops":171,"cells":28},"euclidean":{"expansions":310,"pops":250,"cells":28}},{"dimension":24,"board":0,"optimalCells":24,"manhattan":{"expansions":168,"pops":124,"cells":24},"euclidean":{"expansions":255,"pops":198,"cells":24}},{"dimension":24,"board":1,"optimalCells":null,"manhattan":{"expansions":5,"pops":6,"cells":0},"euclidean":{"expansions":5,"pops":6,"cells":0}},{"dimension":24,"board":2,"optimalCells":18,"manhattan":{"expansions":39,"pops":18,"cells":18},"euclidean":{"expansions":40,"pops":19,"cells":18}},{"dimension":24,"board":3,"optimalCells":7,"manhattan":{"expansions":21,"pops":7,"cells":7},"euclidean":{"expansions":21,"pops":7,"cells":7}},{"dimension":24,"board":4,"optimalCells":4,"manhattan":{"expansions":7,"pops":4,"cells":4},"euclidean":{"expansions":7,"pops":4,"cells":4}},{"dimension":24,"board":5,"optimalCells":35,"manhattan":{"expansions":218,"pops":199,"cells":35},"euclidean":{"expansions":228,"pops":203,"cells":35}},{"dimension":24,"board":6,"optimalCells":15,"manhattan":{"expansions":43,"pops":15,"cells":15},"euclidean":{"expansions":43,"pops":15,"cells":15}},{"dimension":24,"board":7,"optimalCells":13,"manhattan":{"expansions":35,"pops":22,"cells":13},"euclidean":{"expansions":42,"pops":32,"cells":13}},{"dimension":24,"board":8,"optimalCells":30,"manhattan":{"expansions":125,"pops":80,"cells":30},"euclidean":{"expansions":222,"pops":186,"cells":30}},{"dimension":24,"board":9,"optimalCells":15,"manhattan":{"expansions":49,"pops":30,"cells":17},"euclidean":{"expansions":60,"pops":40,"cells":17}},{"dimension":25,"board":0,"optimalCells":21,"manhattan":{"expansions":41,"pops":22,"cells":21},"euclidean":{"expansions":51,"pops":34,"cells":21}},{"dimension":25,"board":1,"optimalCells":17,"manhattan":{"expansions":91,"pops":63,"cells":17},"euclidean":{"expansions":122,"pops":88,"cells":17}},{"dimension":25,"board":2,"optimalCells":5,"manhattan":{"expansions":10,"pops":5,"cells":5},"euclidean":{"expansions":10,"pops":5,"cells":5}},{"dimension":25,"board":3,"optimalCells":6,"manhattan":{"expansions":11,"pops":6,"cells":6},"euclidean":{"expansions":11,"pops":6,"cells":6}},{"dimension":25,"board":4,"optimalCells":null,"manhattan":{"expansions":421,"pops":422,"cells":0},"euclidean":{"expansions":386,"pops":387,"cells":0}},{"dimension":25,"board":5,"optimalCells":8,"manhattan":{"expansions":22,"pops":8,"cells":8},"euclidean":{"expansions":22,"pops":8,"cells":8}},{"dimension":25,"board":6,"optimalCells":11,"manhattan":{"expansions":29,"pops":11,"cells":11},"euclidean":{"expansions":29,"pops":11,"cells":11}},{"dimension":25,"board":7,"optimalCells":14,"manhattan":{"expansions":65,"pops":40,"cells":16},"euclidean":{"expansions":93,"pops":58,"cells":14}},{"dimension":25,"board":8,"optimalCells":19,"manhattan":{"expansions":87,"pops":50,"cells":19},"euclidean":{"expansions":131,"pops":87,"cells":19}},{"dimension":25,"board":9,"optimalCells":19,"manhattan":{"expansions":86,"pops":53,"cells":19},"euclidean":{"expansions":114,"pops":83,"cells":19}},{"dimension":26,"board":0,"optimalCells":21,"manhattan":{"expansions":60,"pops":42,"cells":21},"euclidean":{"expansions":97,"pops":75,"cells":21}},{"dimension":26,"board":1,"optimalCells":22,"manhattan":{"expansions":146,"pops":118,"cells":22},"euclidean":{"expansions":121,"pops":95,"cells":22}},{"dimension":26,"board":2,"optimalCells":25,"manhattan":{"expansions":111,"pops":84,"cells":29},"euclidean":{"expansions":133,"pops":94,"cells":25}},{"dimension":26,"board":3,"optimalCells":19,"manhattan":{"expansions":59,"pops":40,"cells":19},"euclidean":{"expansions":76,"pops":60,"cells":19}},{"dimension":26,"board":4,"optimalCells":10,"manhattan":{"expansions":30,"pops":14,"cells":10},"euclidean":{"expansions":31,"pops":16,"cells":10}},{"dimension":26,"board":5,"optimalCells":16,"manhattan":{"expansions":43,"pops":17,"cells":17},"euclidean":{"expansions":44,"pops":17,"cells":16}},{"dimension":26,"board":6,"optimalCells":19,"manhattan":{"expansions":69,"pops":49,"cells":21},"euclidean":{"expansions":85,"pops":63,"cells":20}},{"dimension":26,"board":7,"optimalCells":16,"manhattan":{"expansions":101,"pops":69,"cells":16},"euclidean":{"expansions":137,"pops":97,"cells":16}},{"dimension":26,"board":8,"optimalCells":11,"manhattan":{"expansions":39,"pops":20,"cells":11},"euclidean":{"expansions":52,"pops":31,"cells":11}},{"dimension":26,"board":9,"optimalCells":13,"manhattan":{"expansions":42,"pops":15,"cells":15},"euclidean":{"expansions":36,"pops":13,"cells":13}},{"dimension":27,"board":0,"optimalCells":7,"manhattan":{"expansions":16,"pops":10,"cells":7},"euclidean":{"expansions":17,"pops":11,"cells":7}},{"dimension":27,"board":1,"optimalCells":27,"manhattan":{"expansions":95,"pops":47,"cells":27},"euclidean":{"expansions":146,"pops":95,"cells":27}},{"dimension":27,"board":2,"optimalCells":17,"manhattan":{"expansions":84,"pops":63,"cells":17},"euclidean":{"expansions":107,"pops":77,"cells":17}},{"dimension":27,"board":3,"optimalCells":12,"manhattan":{"expansions":35,"pops":26,"cells":12},"euclidean":{"expansions":47,"pops":34,"cells":12}},{"dimension":27,"board":4,"optimalCells":12,"manhattan":{"expansions":26,"pops":12,"cells":12},"euclidean":{"expansions":26,"pops":12,"cells":12}},{"dimension":27,"board":5,"optimalCells":8,"manhattan":{"expansions":29,"pops":19,"cells":8},"euclidean":{"expansions":24,"pops":15,"cells":8}},{"dimension":27,"board":6,"optimalCells":10,"manhattan":{"expansions":45,"pops":29,"cells":10},"euclidean":{"expansions":57,"pops":35,"cells":10}},{"dimension":27,"board":7,"optimalCells":17,"manhattan":{"expansions":53,"pops":43,"cells":17},"euclidean":{"expansions":62,"pops":49,"cells":17}},{"dimension":27,"board":8,"optimalCells":null,"manhattan":{"expansions":38,"pops":39,"cells":0},"euclidean":{"expansions":38,"pops":39,"cells":0}},{"dimension":27,"board":9,"optimalCells":9,"manhattan":{"expansions":32,"pops":17,"cells":9},"euclidean":{"expansions":33,"pops":21,"cells":9}},{"dimension":28,"board":0,"optimalCells":35,"manhattan":{"expansions":389,"pops":319,"cells":35},"euclidean":{"expansions":493,"pops":426,"cells":35}},{"dimension":28,"board":1,"optimalCells":13,"manhattan":{"expansions":37,"pops":13,"cells":13},"euclidean":{"expansions":37,"pops":13,"cells":13}},{"dimension":28,"board":2,"optimalCells":17,"manhattan":{"expansions":52,"pops":20,"cells":17},"euclidean":{"expansions":90,"pops":45,"cells":17}},{"dimension":28,"board":3,"optimalCells":18,"manhattan":{"expansions":44,"pops":30,"cells":18},"euclidean":{"expansions":66,"pops":53,"cells":18}},{"dimension":28,"board":4,"optimalCells":10,"manhattan":{"expansions":29,"pops":18,"cells":10},"euclidean":{"expansions":26,"pops":17,"cells":10}},{"dimension":28,"board":5,"optimalCells":28,"manhattan":{"expansions":154,"pops":111,"cells":28},"euclidean":{"expansions":230,"pops":187,"cells":28}},{"dimension":28,"board":6,"optimalCells":17,"manhattan":{"expansions":70,"pops":42,"cells":17},"euclidean":{"expansions":101,"pops":71,"cells":17}},{"dimension":28,"board":7,"optimalCells":25,"manhattan":{"expansions":168,"pops":137,"cells":25},"euclidean":{"expansions":264,"pops":210,"cells":25}},{"dimension":28,"board":8,"optimalCells":28,"manhattan":{"expansions":77,"pops":53,"cells":28},"euclidean":{"expansions":80,"pops":57,"cells":28}},{"dimension":28,"board":9,"optimalCells":22,"manhattan":{"expansions":132,"pops":87,"cells":22},"euclidean":{"expansions":201,"pops":145,"cells":22}},{"dimension":29,"board":0,"optimalCells":27,"manhattan":{"expansions":83,"pops":35,"cells":28},"euclidean":{"expansions":155,"pops":83,"cells":28}},{"dimension":29,"board":1,"optimalCells":7,"manhattan":{"expansions":21,"pops":7,"cells":7},"euclidean":{"expansions":21,"pops":7,"cells":7}},{"dimension":29,"board":2,"optimalCells":8,"manhattan":{"expansions":21,"pops":11,"cells":8},"euclidean":{"expansions":23,"pops":12,"cells":8}},{"dimension":29,"board":3,"optimalCells":10,"manhattan":{"expansions":39,"pops":23,"cells":10},"euclidean":{"expansions":46,"pops":28,"cells":10}},{"dimension":29,"board":4,"optimalCells":15,"manhattan":{"expansions":67,"pops":44,"cells":15},"euclidean":{"expansions":81,"pops":55,"cells":15}},{"dimension":29,"board":5,"optimalCells":11,"manhattan":{"expansions":38,"pops":16,"cells":11},"euclidean":{"expansions":48,"pops":22,"cells":11}},{"dimension":29,"board":6,"optimalCells":22,"manhattan":{"expansions":82,"pops":39,"cells":23},"euclidean":{"expansions":139,"pops":86,"cells":23}},{"dimension":29,"board":7,"optimalCells":25,"manhattan":{"expansions":87,"pops":52,"cells":25},"euclidean":{"expansions":165,"pops":114,"cells":25}},{"dimension":29,"board":8,"optimalCells":9,"manhattan":{"expansions":31,"pops":18,"cells":11},"euclidean":{"expansions":22,"pops":10,"cells":9}},{"dimension":29,"board":9,"optimalCells":12,"manhattan":{"expansions":48,"pops":24,"cells":12},"euclidean":{"expansions":65,"pops":40,"cells":12}},{"dimension":30,"board":0,"optimalCells":28,"manhattan":{"expansions":178,"pops":138,"cells":28},"euclidean":{"expansions":308,"pops":253,"cells":28}},{"dimension":30,"board":1,"optimalCells":17,"manhattan":{"expansions":89,"pops":65,"cells":18},"euclidean":{"expansions":71,"pops":50,"cells":18}},{"dimension":30,"board":2,"optimalCells":36,"manhattan":{"expansions":343,"pops":284,"cells":36},"euclidean":{"expansions":417,"pops":363,"cells":36}},{"dimension":30,"board":3,"optimalCells":13,"manhattan":{"expansions":40,"pops":26,"cells":13},"euclidean":{"expansions":41,"pops":32,"cells":13}},{"dimension":30,"board":4,"optimalCells":6,"manhattan":{"expansions":18,"pops":8,"cells":6},"euclidean":{"expansions":14,"pops":6,"cells":6}},{"dimension":30,"board":5,"optimalCells":42,"manhattan":{"expansions":285,"pops":244,"cells":42},"euclidean":{"expansions":505,"pops":458,"cells":42}},{"dimension":30,"board":6,"optimalCells":29,"manhattan":{"expansions":102,"pops":52,"cells":30},"euclidean":{"expansions":174,"pops":110,"cells":30}},{"dimension":30,"board":7,"optimalCells":18,"manhattan":{"expansions":114,"pops":100,"cells":18},"euclidean":{"expansions":120,"pops":104,"cells":18}},{"dimension":30,"board":8,"optimalCells":13,"manhattan":{"expansions":46,"pops":32,"cells":13},"euclidean":{"expansions":53,"pops":37,"cells":13}},{"dimension":30,"board":9,"optimalCells":27,"manhattan":{"expansions":103,"pops":60,"cells":27},"euclidean":{"expansions":192,"pops":150,"cells":27}},{"dimension":31,"board":0,"optimalCells":33,"manhattan":{"expansions":219,"pops":184,"cells":33},"euclidean":{"expansions":249,"pops":222,"cells":33}},{"dimension":31,"board":1,"optimalCells":24,"manhattan":{"expansions":70,"pops":35,"cells":26},"euclidean":{"expansions":78,"pops":45,"cells":25}},{"dimension":31,"board":2,"optimalCells":26,"manhattan":{"expansions":100,"pops":76,"cells":26},"euclidean":{"expansions":125,"pops":98,"cells":26}},{"dimension":31,"board":3,"optimalCells":29,"manhattan":{"expansions":95,"pops":42,"cells":30},"euclidean":{"expansions":171,"pops":103,"cells":30}},{"dimension":31,"board":4,"optimalCells":14,"manhattan":{"expansions":32,"pops":14,"cells":14},"euclidean":{"expansions":33,"pops":14,"cells":14}},{"dimension":31,"board":5,"optimalCells":8,"manhattan":{"expansions":23,"pops":15,"cells":8},"euclidean":{"expansions":27,"pops":17,"cells":8}},{"dimension":31,"board":6,"optimalCells":27,"manhattan":{"expansions":88,"pops":42,"cells":28},"euclidean":{"expansions":138,"pops":79,"cells":28}},{"dimension":31,"board":7,"optimalCells":22,"manhattan":{"expansions":59,"pops":22,"cells":22},"euclidean":{"expansions":59,"pops":22,"cells":22}},{"dimension":31,"board":8,"optimalCells":10,"manhattan":{"expansions":40,"pops":21,"cells":10},"euclidean":{"expansions":46,"pops":28,"cells":10}},{"dimension":31,"board":9,"optimalCells":10,"manhattan":{"expansions":27,"pops":10,"cells":10},"euclidean":{"expansions":27,"pops":10,"cells":10}},{"dimension":32,"board":0,"optimalCells":10,"manhattan":{"expansions":27,"pops":17,"cells":10},"euclidean":{"expansions":24,"pops":15,"cells":10}},{"dimension":32,"board":1,"optimalCells":23,"manhattan":{"expansions":81,"pops":48,"cells":23},"euclidean":{"expansions":130,"pops":95,"cells":23}},{"dimension":32,"board":2,"optimalCells":31,"manhattan":{"expansions":261,"pops":220,"cells":31},"euclidean":{"expansions":261,"pops":226,"cells":31}},{"dimension":32,"board":3,"optimalCells":41,"manhattan":{"expansions":251,"pops":191,"cells":41},"euclidean":{"expansions":378,"pops":327,"cells":41}},{"dimension":32,"board":4,"optimalCells":34,"manhattan":{"expansions":253,"pops":206,"cells":34},"euclidean":{"expansions":334,"pops":279,"cells":34}},{"dimension":32,"board":5,"optimalCells":16,"manhattan":{"expansions":65,"pops":33,"cells":16},"euclidean":{"expansions":96,"pops":65,"cells":16}},{"dimension":32,"board":6,"optimalCells":9,"manhattan":{"expansions":33,"pops":15,"cells":9},"euclidean":{"expansions":32,"pops":14,"cells":9}},{"dimension":32,"board":7,"optimalCells":18,"manhattan":{"expansions":49,"pops":18,"cells":18},"euclidean":{"expansions":49,"pops":18,"cells":18}},{"dimension":32,"board":8,"optimalCells":17,"manhattan":{"expansions":81,"pops":50,"cells":17},"euclidean":{"expansions":131,"pops":88,"cells":17}},{"dimension":32,"board":9,"optimalCells":7,"manhattan":{"expansions":17,"pops":10,"cells":7},"euclidean":{"expansions":15,"pops":9,"cells":7}},{"dimension":33,"board":0,"optimalCells":4,"manhattan":{"expansions":6,"pops":4,"cells":4},"euclidean":{"expansions":6,"pops":4,"cells":4}},{"dimension":33,"board":1,"optimalCells":37,"manhattan":{"expansions":151,"pops":124,"cells":37},"euclidean":{"expansions":184,"pops":150,"cells":37}},{"dimension":33,"board":2,"optimalCells":46,"manhattan":{"expansions":307,"pops":287,"cells":46},"euclidean":{"expansions":327,"pops":310,"cells":46}},{"dimension":33,"board":3,"optimalCells":13,"manhattan":{"expansions":44,"pops":18,"cells":17},"euclidean":{"expansions":32,"pops":13,"cells":13}},{"dimension":33,"board":4,"optimalCells":18,"manhattan":{"expansions":49,"pops":27,"cells":21},"euclidean":{"expansions":47,"pops":26,"cells":18}},{"dimension":33,"board":5,"optimalCells":13,"manhattan":{"expansions":34,"pops":14,"cells":13},"euclidean":{"expansions":37,"pops":16,"cells":13}},{"dimension":33,"board":6,"optimalCells":21,"manhattan":{"expansions":74,"pops":40,"cells":21},"euclidean":{"expansions":142,"pops":98,"cells":21}},{"dimension":33,"board":7,"optimalCells":18,"manhattan":{"expansions":82,"pops":57,"cells":24},"euclidean":{"expansions":67,"pops":47,"cells":18}},{"dimension":33,"board":8,"optimalCells":15,"manhattan":{"expansions":78,"pops":53,"cells":15},"euclidean":{"expansions":113,"pops":79,"cells":15}},{"dimension":33,"board":9,"optimalCells":31,"manhattan":{"expansions":119,"pops":103,"cells":31},"euclidean":{"expansions":116,"pops":98,"cells":31}},{"dimension":34,"board":0,"optimalCells":17,"manhattan":{"expansions":96,"pops":63,"cells":17},"euclidean":{"expansions":132,"pops":94,"cells":17}},{"dimension":34,"board":1,"optimalCells":26,"manhattan":{"expansions":168,"pops":145,"cells":26},"euclidean":{"expansions":154,"pops":132,"cells":26}},{"dimension":34,"board":2,"optimalCells":8,"manhattan":{"expansions":22,"pops":8,"cells":8},"euclidean":{"expansions":22,"pops":8,"cells":8}},{"dimension":34,"board":3,"optimalCells":16,"manhattan":{"expansions":45,"pops":16,"cells":16},"euclidean":{"expansions":45,"pops":16,"cells":16}},{"dimension":34,"board":4,"optimalCells":10,"manhattan":{"expansions":28,"pops":12,"cells":12},"euclidean":{"expansions":25,"pops":11,"cells":11}},{"dimension":34,"board":5,"optimalCells":6,"manhattan":{"expansions":22,"pops":12,"cells":6},"euclidean":{"expansions":13,"pops":6,"cells":6}},{"dimension":34,"board":6,"optimalCells":26,"manhattan":{"expansions":108,"pops":72,"cells":28},"euclidean":{"expansions":115,"pops":71,"cells":26}},{"dimension":34,"board":7,"optimalCells":18,"manhattan":{"expansions":68,"pops":39,"cells":18},"euclidean":{"expansions":100,"pops":67,"cells":18}},{"dimension":34,"board":8,"optimalCells":33,"manhattan":{"expansions":191,"pops":168,"cells":33},"euclidean":{"expansions":192,"pops":171,"cells":33}},{"dimension":34,"board":9,"optimalCells":16,"manhattan":{"expansions":78,"pops":55,"cells":16},"euclidean":{"expansions":104,"pops":78,"cells":16}},{"dimension":35,"board":0,"optimalCells":30,"manhattan":{"expansions":73,"pops":46,"cells":30},"euclidean":{"expansions":111,"pops":76,"cells":30}},{"dimension":35,"board":1,"optimalCells":25,"manhattan":{"expansions":73,"pops":25,"cells":25},"euclidean":{"expansions":73,"pops":25,"cells":25}},{"dimension":35,"board":2,"optimalCells":16,"manhattan":{"expansions":71,"pops":52,"cells":19},"euclidean":{"expansions":42,"pops":23,"cells":16}},{"dimension":35,"board":3,"optimalCells":43,"manhattan":{"expansions":551,"pops":467,"cells":43},"euclidean":{"expansions":696,"pops":619,"cells":43}},{"dimension":35,"board":4,"optimalCells":7,"manhattan":{"expansions":21,"pops":7,"cells":7},"euclidean":{"expansions":21,"pops":7,"cells":7}},{"dimension":35,"board":5,"optimalCells":17,"manhattan":{"expansions":69,"pops":35,"cells":18},"euclidean":{"expansions":111,"pops":70,"cells":18}},{"dimension":35,"board":6,"optimalCells":null,"manhattan":{"expansions":517,"pops":518,"cells":0},"euclidean":{"expansions":511,"pops":512,"cells":0}},{"dimension":35,"board":7,"optimalCells":13,"manhattan":{"expansions":28,"pops":13,"cells":13},"euclidean":{"expansions":28,"pops":13,"cells":13}},{"dimension":35,"board":8,"optimalCells":9,"manhattan":{"expansions":25,"pops":9,"cells":9},"euclidean":{"expansions":25,"pops":9,"cells":9}},{"dimension":35,"board":9,"optimalCells":45,"manhattan":{"expansions":484,"pops":452,"cells":45},"euclidean":{"expansions":441,"pops":418,"cells":45}},{"dimension":36,"board":0,"optimalCells":21,"manhattan":{"expansions":63,"pops":44,"cells":21},"euclidean":{"expansions":76,"pops":57,"cells":21}},{"dimension":36,"board":1,"optimalCells":37,"manhattan":{"expansions":228,"pops":178,"cells":38},"euclidean":{"expansions":336,"pops":289,"cells":38}},{"dimension":36,"board":2,"optimalCells":27,"manhattan":{"expansions":110,"pops":81,"cells":27},"euclidean":{"expansions":147,"pops":120,"cells":27}},{"dimension":36,"board":3,"optimalCells":43,"manhattan":{"expansions":221,"pops":185,"cells":43},"euclidean":{"expansions":295,"pops":266,"cells":43}},{"dimension":36,"board":4,"optimalCells":48,"manhattan":{"expansions":668,"pops":578,"cells":48},"euclidean":{"expansions":828,"pops":752,"cells":48}},{"dimension":36,"board":5,"optimalCells":35,"manhattan":{"expansions":282,"pops":221,"cells":35},"euclidean":{"expansions":307,"pops":261,"cells":35}},{"dimension":36,"board":6,"optimalCells":29,"manhattan":{"expansions":103,"pops":68,"cells":29},"euclidean":{"expansions":211,"pops":174,"cells":29}},{"dimension":36,"board":7,"optimalCells":27,"manhattan":{"expansions":93,"pops":44,"cells":28},"euclidean":{"expansions":138,"pops":84,"cells":28}},{"dimension":36,"board":8,"optimalCells":19,"manhattan":{"expansions":48,"pops":33,"cells":19},"euclidean":{"expansions":54,"pops":40,"cells":19}},{"dimension":36,"board":9,"optimalCells":17,"manhattan":{"expansions":48,"pops":17,"cells":17},"euclidean":{"expansions":48,"pops":17,"cells":17}},{"dimension":37,"board":0,"optimalCells":31,"manhattan":{"expansions":89,"pops":40,"cells":34},"euclidean":{"expansions":73,"pops":34,"cells":31}},{"dimension":37,"board":1,"optimalCells":15,"manhattan":{"expansions":71,"pops":55,"cells":15},"euclidean":{"expansions":70,"pops":54,"cells":15}},{"dimension":37,"board":2,"optimalCells":63,"manhattan":{"expansions":251,"pops":227,"cells":63},"euclidean":{"expansions":271,"pops":255,"cells":63}},{"dimension":37,"board":3,"optimalCells":12,"manhattan":{"expansions":32,"pops":12,"cells":12},"euclidean":{"expansions":32,"pops":12,"cells":12}},{"dimension":37,"board":4,"optimalCells":53,"manhattan":{"expansions":303,"pops":243,"cells":53},"euclidean":{"expansions":524,"pops":483,"cells":53}},{"dimension":37,"board":5,"optimalCells":12,"manhattan":{"expansions":49,"pops":24,"cells":12},"euclidean":{"expansions":53,"pops":30,"cells":12}},{"dimension":37,"board":6,"optimalCells":19,"manhattan":{"expansions":63,"pops":50,"cells":19},"euclidean":{"expansions":92,"pops":71,"cells":19}},{"dimension":37,"board":7,"optimalCells":21,"manhattan":{"expansions":63,"pops":21,"cells":21},"euclidean":{"expansions":63,"pops":21,"cells":21}},{"dimension":37,"board":8,"optimalCells":14,"manhattan":{"expansions":37,"pops":17,"cells":15},"euclidean":{"expansions":45,"pops":21,"cells":14}},{"dimension":37,"board":9,"optimalCells":20,"manhattan":{"expansions":92,"pops":57,"cells":21},"euclidean":{"expansions":132,"pops":93,"cells":21}},{"dimension":38,"board":0,"optimalCells":14,"manhattan":{"expansions":47,"pops":29,"cells":14},"euclidean":{"expansions":69,"pops":46,"cells":14}},{"dimension":38,"board":1,"optimalCells":27,"manhattan":{"expansions":111,"pops":84,"cells":33},"euclidean":{"expansions":202,"pops":177,"cells":31}},{"dimension":38,"board":2,"optimalCells":25,"manhattan":{"expansions":54,"pops":30,"cells":27},"euclidean":{"expansions":79,"pops":49,"cells":26}},{"dimension":38,"board":3,"optimalCells":34,"manhattan":{"expansions":126,"pops":72,"cells":34},"euclidean":{"expansions":249,"pops":196,"cells":34}},{"dimension":38,"board":4,"optimalCells":28,"manhattan":{"expansions":99,"pops":57,"cells":30},"euclidean":{"expansions":154,"pops":100,"cells":28}},{"dimension":38,"board":5,"optimalCells":40,"manhattan":{"expansions":200,"pops":147,"cells":40},"euclidean":{"expansions":352,"pops":305,"cells":40}},{"dimension":38,"board":6,"optimalCells":34,"manhattan":{"expansions":320,"pops":262,"cells":34},"euclidean":{"expansions":444,"pops":378,"cells":34}},{"dimension":38,"board":7,"optimalCells":18,"manhattan":{"expansions":60,"pops":32,"cells":18},"euclidean":{"expansions":99,"pops":66,"cells":18}},{"dimension":38,"board":8,"optimalCells":20,"manhattan":{"expansions":113,"pops":89,"cells":20},"euclidean":{"expansions":83,"pops":54,"cells":20}},{"dimension":38,"board":9,"optimalCells":15,"manhattan":{"expansions":33,"pops":26,"cells":16},"euclidean":{"expansions":31,"pops":23,"cells":16}},{"dimension":39,"board":0,"optimalCells":null,"manhattan":{"expansions":57,"pops":58,"cells":0},"euclidean":{"expansions":57,"pops":58,"cells":0}},{"dimension":39,"board":1,"optimalCells":35,"manhattan":{"expansions":79,"pops":58,"cells":35},"euclidean":{"expansions":72,"pops":54,"cells":35}},{"dimension":39,"board":2,"optimalCells":13,"manhattan":{"expansions":41,"pops":17,"cells":13},"euclidean":{"expansions":39,"pops":16,"cells":13}},{"dimension":39,"board":3,"optimalCells":21,"manhattan":{"expansions":40,"pops":23,"cells":21},"euclidean":{"expansions":41,"pops":25,"cells":21}},{"dimension":39,"board":4,"optimalCells":15,"manhattan":{"expansions":44,"pops":27,"cells":15},"euclidean":{"expansions":76,"pops":52,"cells":15}},{"dimension":39,"board":5,"optimalCells":31,"manhattan":{"expansions":138,"pops":90,"cells":31},"euclidean":{"expansions":336,"pops":266,"cells":31}},{"dimension":39,"board":6,"optimalCells":11,"manhattan":{"expansions":31,"pops":13,"cells":13},"euclidean":{"expansions":27,"pops":11,"cells":11}},{"dimension":39,"board":7,"optimalCells":19,"manhattan":{"expansions":56,"pops":34,"cells":20},"euclidean":{"expansions":80,"pops":59,"cells":20}},{"dimension":39,"board":8,"optimalCells":85,"manhattan":{"expansions":497,"pops":479,"cells":85},"euclidean":{"expansions":527,"pops":511,"cells":85}},{"dimension":39,"board":9,"optimalCells":27,"manhattan":{"expansions":75,"pops":52,"cells":27},"euclidean":{"expansions":77,"pops":55,"cells":27}},{"dimension":40,"board":0,"optimalCells":19,"manhattan":{"expansions":58,"pops":38,"cells":19},"euclidean":{"expansions":82,"pops":56,"cells":19}},{"dimension":40,"board":1,"optimalCells":51,"manhattan":{"expansions":269,"pops":205,"cells":51},"euclidean":{"expansions":621,"pops":553,"cells":51}},{"dimension":40,"board":2,"optimalCells":47,"manhattan":{"expansions":148,"pops":98,"cells":49},"euclidean":{"expansions":217,"pops":161,"cells":49}},{"dimension":40,"board":3,"optimalCells":9,"manhattan":{"expansions":25,"pops":9,"cells":9},"euclidean":{"expansions":25,"pops":9,"cells":9}},{"dimension":40,"board":4,"optimalCells":60,"manhattan":{"expansions":553,"pops":465,"cells":60},"euclidean":{"expansions":781,"pops":733,"cells":60}},{"dimension":40,"board":5,"optimalCells":29,"manhattan":{"expansions":135,"pops":104,"cells":29},"euclidean":{"expansions":183,"pops":155,"cells":29}},{"dimension":40,"board":6,"optimalCells":31,"manhattan":{"expansions":104,"pops":79,"cells":31},"euclidean":{"expansions":211,"pops":168,"cells":31}},{"dimension":40,"board":7,"optimalCells":17,"manhattan":{"expansions":49,"pops":17,"cells":17},"euclidean":{"expansions":49,"pops":17,"cells":17}},{"dimension":40,"board":8,"optimalCells":20,"manhattan":{"expansions":83,"pops":48,"cells":21},"euclidean":{"expansions":98,"pops":73,"cells":21}},{"dimension":40,"board":9,"optimalCells":8,"manhattan":{"expansions":23,"pops":8,"cells":8},"euclidean":{"expansions":23,"pops":8,"cells":8}},{"dimension":41,"board":0,"optimalCells":24,"manhattan":{"expansions":93,"pops":60,"cells":24},"euclidean":{"expansions":155,"pops":111,"cells":24}},{"dimension":41,"board":1,"optimalCells":68,"manhattan":{"expansions":631,"pops":538,"cells":68},"euclidean":{"expansions":1030,"pops":979,"cells":68}},{"dimension":41,"board":2,"optimalCells":54,"manhattan":{"expansions":283,"pops":246,"cells":56},"euclidean":{"expansions":235,"pops":206,"cells":54}},{"dimension":41,"board":3,"optimalCells":27,"manhattan":{"expansions":68,"pops":27,"cells":27},"euclidean":{"expansions":68,"pops":27,"cells":27}},{"dimension":41,"board":4,"optimalCells":12,"manhattan":{"expansions":29,"pops":12,"cells":12},"euclidean":{"expansions":31,"pops":14,"cells":12}},{"dimension":41,"board":5,"optimalCells":null,"manhattan":{"expansions":700,"pops":701,"cells":0},"euclidean":{"expansions":691,"pops":692,"cells":0}},{"dimension":41,"board":6,"optimalCells":60,"manhattan":{"expansions":390,"pops":362,"cells":60},"euclidean":{"expansions":396,"pops":368,"cells":60}},{"dimension":41,"board":7,"optimalCells":26,"manhattan":{"expansions":114,"pops":76,"cells":26},"euclidean":{"expansions":172,"pops":130,"cells":26}},{"dimension":41,"board":8,"optimalCells":24,"manhattan":{"expansions":66,"pops":24,"cells":24},"euclidean":{"expansions":66,"pops":24,"cells":24}},{"dimension":41,"board":9,"optimalCells":36,"manhattan":{"expansions":202,"pops":178,"cells":37},"euclidean":{"expansions":207,"pops":189,"cells":37}},{"dimension":42,"board":0,"optimalCells":40,"manhattan":{"expansions":258,"pops":181,"cells":40},"euclidean":{"expansions":483,"pops":417,"cells":40}},{"dimension":42,"board":1,"optimalCells":13,"manhattan":{"expansions":46,"pops":28,"cells":13},"euclidean":{"expansions":54,"pops":35,"cells":13}},{"dimension":42,"board":2,"optimalCells":39,"manhattan":{"expansions":251,"pops":205,"cells":39},"euclidean":{"expansions":436,"pops":390,"cells":39}},{"dimension":42,"board":3,"optimalCells":31,"manhattan":{"expansions":80,"pops":62,"cells":31},"euclidean":{"expansions":117,"pops":97,"cells":31}},{"dimension":42,"board":4,"optimalCells":55,"manhattan":{"expansions":449,"pops":417,"cells":55},"euclidean":{"expansions":507,"pops":479,"cells":55}},{"dimension":42,"board":5,"optimalCells":19,"manhattan":{"expansions":103,"pops":64,"cells":19},"euclidean":{"expansions":155,"pops":109,"cells":19}},{"dimension":42,"board":6,"optimalCells":26,"manhattan":{"expansions":70,"pops":56,"cells":26},"euclidean":{"expansions":84,"pops":69,"cells":26}},{"dimension":42,"board":7,"optimalCells":11,"manhattan":{"expansions":27,"pops":13,"cells":11},"euclidean":{"expansions":25,"pops":13,"cells":11}},{"dimension":42,"board":8,"optimalCells":57,"manhattan":{"expansions":718,"pops":620,"cells":57},"euclidean":{"expansions":1007,"pops":902,"cells":57}},{"dimension":42,"board":9,"optimalCells":27,"manhattan":{"expansions":106,"pops":68,"cells":27},"euclidean":{"expansions":165,"pops":124,"cells":27}},{"dimension":43,"board":0,"optimalCells":null,"manhattan":{"expansions":7,"pops":8,"cells":0},"euclidean":{"expansions":7,"pops":8,"cells":0}},{"dimension":43,"board":1,"optimalCells":67,"manhattan":{"expansions":507,"pops":492,"cells":67},"euclidean":{"expansions":596,"pops":585,"cells":67}},{"dimension":43,"board":2,"optimalCells":4,"manhattan":{"expansions":9,"pops":5,"cells":4},"euclidean":{"expansions":9,"pops":5,"cells":4}},{"dimension":43,"board":3,"optimalCells":32,"manhattan":{"expansions":236,"pops":196,"cells":32},"euclidean":{"expansions":394,"pops":332,"cells":32}},{"dimension":43,"board":4,"optimalCells":13,"manhattan":{"expansions":29,"pops":13,"cells":13},"euclidean":{"expansions":29,"pops":13,"cells":13}},{"dimension":43,"board":5,"optimalCells":39,"manhattan":{"expansions":141,"pops":97,"cells":39},"euclidean":{"expansions":311,"pops":272,"cells":39}},{"dimension":43,"board":6,"optimalCells":35,"manhattan":{"expansions":153,"pops":93,"cells":39},"euclidean":{"expansions":184,"pops":114,"cells":36}},{"dimension":43,"board":7,"optimalCells":6,"manhattan":{"expansions":11,"pops":7,"cells":6},"euclidean":{"expansions":11,"pops":7,"cells":6}},{"dimension":43,"board":8,"optimalCells":26,"manhattan":{"expansions":65,"pops":39,"cells":26},"euclidean":{"expansions":103,"pops":72,"cells":26}},{"dimension":43,"board":9,"optimalCells":42,"manhattan":{"expansions":212,"pops":189,"cells":45},"euclidean":{"expansions":275,"pops":249,"cells":42}},{"dimension":44,"board":0,"optimalCells":37,"manhattan":{"expansions":119,"pops":80,"cells":37},"euclidean":{"expansions":380,"pops":315,"cells":37}},{"dimension":44,"board":1,"optimalCells":15,"manhattan":{"expansions":32,"pops":19,"cells":16},"euclidean":{"expansions":42,"pops":26,"cells":15}},{"dimension":44,"board":2,"optimalCells":17,"manhattan":{"expansions":66,"pops":50,"cells":17},"euclidean":{"expansions":61,"pops":46,"cells":17}},{"dimension":44,"board":3,"optimalCells":null,"manhattan":{"expansions":224,"pops":225,"cells":0},"euclidean":{"expansions":204,"pops":205,"cells":0}},{"dimension":44,"board":4,"optimalCells":40,"manhattan":{"expansions":244,"pops":198,"cells":40},"euclidean":{"expansions":115,"pops":82,"cells":40}},{"dimension":44,"board":5,"optimalCells":19,"manhattan":{"expansions":79,"pops":69,"cells":19},"euclidean":{"expansions":73,"pops":64,"cells":19}},{"dimension":44,"board":6,"optimalCells":19,"manhattan":{"expansions":134,"pops":95,"cells":19},"euclidean":{"expansions":185,"pops":137,"cells":19}},{"dimension":44,"board":7,"optimalCells":34,"manhattan":{"expansions":210,"pops":163,"cells":34},"euclidean":{"expansions":424,"pops":353,"cells":34}},{"dimension":44,"board":8,"optimalCells":39,"manhattan":{"expansions":260,"pops":214,"cells":39},"euclidean":{"expansions":346,"pops":305,"cells":39}},{"dimension":44,"board":9,"optimalCells":25,"manhattan":{"expansions":157,"pops":112,"cells":25},"euclidean":{"expansions":230,"pops":182,"cells":25}},{"dimension":45,"board":0,"optimalCells":19,"manhattan":{"expansions":119,"pops":82,"cells":19},"euclidean":{"expansions":166,"pops":118,"cells":19}},{"dimension":45,"board":1,"optimalCells":38,"manhattan":{"expansions":175,"pops":117,"cells":38},"euclidean":{"expansions":437,"pops":365,"cells":38}},{"dimension":45,"board":2,"optimalCells":25,"manhattan":{"expansions":111,"pops":79,"cells":25},"euclidean":{"expansions":150,"pops":119,"cells":25}},{"dimension":45,"board":3,"optimalCells":19,"manhattan":{"expansions":71,"pops":34,"cells":23},"euclidean":{"expansions":51,"pops":24,"cells":19}},{"dimension":45,"board":4,"optimalCells":null,"manhattan":{"expansions":8,"pops":9,"cells":0},"euclidean":{"expansions":8,"pops":9,"cells":0}},{"dimension":45,"board":5,"optimalCells":40,"manhattan":{"expansions":164,"pops":124,"cells":41},"euclidean":{"expansions":364,"pops":325,"cells":40}},{"dimension":45,"board":6,"optimalCells":17,"manhattan":{"expansions":58,"pops":26,"cells":20},"euclidean":{"expansions":53,"pops":23,"cells":17}},{"dimension":45,"board":7,"optimalCells":52,"manhattan":{"expansions":359,"pops":277,"cells":52},"euclidean":{"expansions":646,"pops":565,"cells":52}},{"dimension":45,"board":8,"optimalCells":17,"manhattan":{"expansions":69,"pops":51,"cells":17},"euclidean":{"expansions":66,"pops":48,"cells":17}},{"dimension":45,"board":9,"optimalCells":57,"manhattan":{"expansions":516,"pops":437,"cells":57},"euclidean":{"expansions":882,"pops":823,"cells":57}},{"dimension":46,"board":0,"optimalCells":null,"manhattan":{"expansions":319,"pops":320,"cells":0},"euclidean":{"expansions":318,"pops":319,"cells":0}},{"dimension":46,"board":1,"optimalCells":21,"manhattan":{"expansions":83,"pops":49,"cells":21},"euclidean":{"expansions":131,"pops":93,"cells":21}},{"dimension":46,"board":2,"optimalCells":33,"manhattan":{"expansions":129,"pops":92,"cells":33},"euclidean":{"expansions":310,"pops":255,"cells":33}},{"dimension":46,"board":3,"optimalCells":10,"manhattan":{"expansions":29,"pops":10,"cells":10},"euclidean":{"expansions":29,"pops":10,"cells":10}},{"dimension":46,"board":4,"optimalCells":41,"manhattan":{"expansions":94,"pops":60,"cells":44},"euclidean":{"expansions":118,"pops":76,"cells":42}},{"dimension":46,"board":5,"optimalCells":9,"manhattan":{"expansions":18,"pops":11,"cells":9},"euclidean":{"expansions":17,"pops":10,"cells":9}},{"dimension":46,"board":6,"optimalCells":13,"manhattan":{"expansions":46,"pops":34,"cells":13},"euclidean":{"expansions":54,"pops":40,"cells":13}},{"dimension":46,"board":7,"optimalCells":9,"manhattan":{"expansions":26,"pops":13,"cells":9},"euclidean":{"expansions":30,"pops":18,"cells":9}},{"dimension":46,"board":8,"optimalCells":null,"manhattan":{"expansions":5,"pops":6,"cells":0},"euclidean":{"expansions":5,"pops":6,"cells":0}},{"dimension":46,"board":9,"optimalCells":3,"manhattan":{"expansions":6,"pops":3,"cells":3},"euclidean":{"expansions":6,"pops":3,"cells":3}},{"dimension":47,"board":0,"optimalCells":41,"manhattan":{"expansions":226,"pops":195,"cells":41},"euclidean":{"expansions":221,"pops":196,"cells":41}},{"dimension":47,"board":1,"optimalCells":70,"manhattan":{"expansions":572,"pops":465,"cells":70},"euclidean":{"expansions":1255,"pops":1168,"cells":70}},{"dimension":47,"board":2,"optimalCells":46,"manhattan":{"expansions":268,"pops":219,"cells":46},"euclidean":{"expansions":534,"pops":469,"cells":46}},{"dimension":47,"board":3,"optimalCells":29,"manhattan":{"expansions":81,"pops":40,"cells":30},"euclidean":{"expansions":85,"pops":51,"cells":29}},{"dimension":47,"board":4,"optimalCells":21,"manhattan":{"expansions":116,"pops":91,"cells":21},"euclidean":{"expansions":186,"pops":145,"cells":21}},{"dimension":47,"board":5,"optimalCells":33,"manhattan":{"expansions":105,"pops":47,"cells":38},"euclidean":{"expansions":96,"pops":38,"cells":34}},{"dimension":47,"board":6,"optimalCells":null,"manhattan":{"expansions":1572,"pops":1573,"cells":0},"euclidean":{"expansions":1391,"pops":1392,"cells":0}},{"dimension":47,"board":7,"optimalCells":25,"manhattan":{"expansions":73,"pops":25,"cells":25},"euclidean":{"expansions":73,"pops":25,"cells":25}},{"dimension":47,"board":8,"optimalCells":30,"manhattan":{"expansions":130,"pops":84,"cells":30},"euclidean":{"expansions":249,"pops":189,"cells":30}},{"dimension":47,"board":9,"optimalCells":39,"manhattan":{"expansions":199,"pops":127,"cells":44},"euclidean":{"expansions":330,"pops":236,"cells":39}},{"dimension":48,"board":0,"optimalCells":23,"manhattan":{"expansions":78,"pops":37,"cells":26},"euclidean":{"expansions":85,"pops":46,"cells":24}},{"dimension":48,"board":1,"optimalCells":41,"manhattan":{"expansions":162,"pops":92,"cells":42},"euclidean":{"expansions":377,"pops":276,"cells":42}},{"dimension":48,"board":2,"optimalCells":21,"manhattan":{"expansions":156,"pops":118,"cells":21},"euclidean":{"expansions":180,"pops":149,"cells":21}},{"dimension":48,"board":3,"optimalCells":29,"manhattan":{"expansions":109,"pops":53,"cells":29},"euclidean":{"expansions":188,"pops":118,"cells":29}},{"dimension":48,"board":4,"optimalCells":37,"manhattan":{"expansions":254,"pops":195,"cells":37},"euclidean":{"expansions":447,"pops":377,"cells":37}},{"dimension":48,"board":5,"optimalCells":46,"manhattan":{"expansions":605,"pops":516,"cells":46},"euclidean":{"expansions":959,"pops":834,"cells":46}},{"dimension":48,"board":6,"optimalCells":33,"manhattan":{"expansions":98,"pops":33,"cells":33},"euclidean":{"expansions":98,"pops":33,"cells":33}},{"dimension":48,"board":7,"optimalCells":26,"manhattan":{"expansions":107,"pops":67,"cells":29},"euclidean":{"expansions":155,"pops":105,"cells":27}},{"dimension":48,"board":8,"optimalCells":23,"manhattan":{"expansions":75,"pops":37,"cells":28},"euclidean":{"expansions":59,"pops":26,"cells":24}},{"dimension":48,"board":9,"optimalCells":57,"manhattan":{"expansions":304,"pops":256,"cells":57},"euclidean":{"expansions":428,"pops":374,"cells":57}},{"dimension":49,"board":0,"optimalCells":30,"manhattan":{"expansions":54,"pops":37,"cells":30},"euclidean":{"expansions":65,"pops":54,"cells":30}},{"dimension":49,"board":1,"optimalCells":40,"manhattan":{"expansions":241,"pops":200,"cells":40},"euclidean":{"expansions":339,"pops":298,"cells":40}},{"dimension":49,"board":2,"optimalCells":null,"manhattan":{"expansions":149,"pops":150,"cells":0},"euclidean":{"expansions":149,"pops":150,"cells":0}},{"dimension":49,"board":3,"optimalCells":50,"manhattan":{"expansions":436,"pops":350,"cells":50},"euclidean":{"expansions":866,"pops":746,"cells":50}},{"dimension":49,"board":4,"optimalCells":28,"manhattan":{"expansions":194,"pops":161,"cells":28},"euclidean":{"expansions":194,"pops":159,"cells":28}},{"dimension":49,"board":5,"optimalCells":17,"manhattan":{"expansions":80,"pops":48,"cells":17},"euclidean":{"expansions":93,"pops":68,"cells":17}},{"dimension":49,"board":6,"optimalCells":18,"manhattan":{"expansions":61,"pops":30,"cells":19},"euclidean":{"expansions":79,"pops":47,"cells":19}},{"dimension":49,"board":7,"optimalCells":10,"manhattan":{"expansions":39,"pops":18,"cells":11},"euclidean":{"expansions":47,"pops":23,"cells":11}},{"dimension":49,"board":8,"optimalCells":9,"manhattan":{"expansions":20,"pops":10,"cells":10},"euclidean":{"expansions":20,"pops":9,"cells":9}},{"dimension":49,"board":9,"optimalCells":50,"manhattan":{"expansions":651,"pops":561,"cells":50},"euclidean":{"expansions":976,"pops":865,"cells":50}},{"dimension":50,"board":0,"optimalCells":40,"manhattan":{"expansions":321,"pops":255,"cells":40},"euclidean":{"expansions":556,"pops":471,"cells":40}},{"dimension":50,"board":1,"optimalCells":38,"manhattan":{"expansions":332,"pops":259,"cells":38},"euclidean":{"expansions":567,"pops":467,"cells":38}},{"dimension":50,"board":2,"optimalCells":36,"manhattan":{"expansions":286,"pops":221,"cells":36},"euclidean":{"expansions":465,"pops":380,"cells":36}},{"dimension":50,"board":3,"optimalCells":26,"manhattan":{"expansions":191,"pops":145,"cells":26},"euclidean":{"expansions":292,"pops":230,"cells":26}},{"dimension":50,"board":4,"optimalCells":54,"manhattan":{"expansions":366,"pops":285,"cells":54},"euclidean":{"expansions":462,"pops":411,"cells":54}},{"dimension":50,"board":5,"optimalCells":35,"manhattan":{"expansions":124,"pops":59,"cells":36},"euclidean":{"expansions":206,"pops":123,"cells":36}},{"dimension":50,"board":6,"optimalCells":33,"manhattan":{"expansions":220,"pops":189,"cells":33},"euclidean":{"expansions":243,"pops":216,"cells":33}},{"dimension":50,"board":7,"optimalCells":null,"manhattan":{"expansions":705,"pops":706,"cells":0},"euclidean":{"expansions":667,"pops":668,"cells":0}},{"dimension":50,"board":8,"optimalCells":49,"manhattan":{"expansions":630,"pops":541,"cells":49},"euclidean":{"expansions":1044,"pops":912,"cells":49}},{"dimension":50,"board":9,"optimalCells":69,"manhattan":{"expansions":1353,"pops":1214,"cells":69},"euclidean":{"expansions":1676,"pops":1580,"cells":69}},{"dimension":51,"board":0,"optimalCells":4,"manhattan":{"expansions":12,"pops":4,"cells":4},"euclidean":{"expansions":12,"pops":4,"cells":4}},{"dimension":51,"board":1,"optimalCells":null,"manhattan":{"expansions":686,"pops":687,"cells":0},"euclidean":{"expansions":683,"pops":684,"cells":0}},{"dimension":51,"board":2,"optimalCells":25,"manhattan":{"expansions":53,"pops":27,"cells":25},"euclidean":{"expansions":56,"pops":32,"cells":25}},{"dimension":51,"board":3,"optimalCells":33,"manhattan":{"expansions":176,"pops":106,"cells":34},"euclidean":{"expansions":290,"pops":221,"cells":34}},{"dimension":51,"board":4,"optimalCells":14,"manhattan":{"expansions":61,"pops":35,"cells":14},"euclidean":{"expansions":86,"pops":55,"cells":14}},{"dimension":51,"board":5,"optimalCells":23,"manhattan":{"expansions":66,"pops":23,"cells":23},"euclidean":{"expansions":66,"pops":23,"cells":23}},{"dimension":51,"board":6,"optimalCells":27,"manhattan":{"expansions":79,"pops":27,"cells":27},"euclidean":{"expansions":79,"pops":27,"cells":27}},{"dimension":51,"board":7,"optimalCells":53,"manhattan":{"expansions":492,"pops":396,"cells":53},"euclidean":{"expansions":778,"pops":699,"cells":53}},{"dimension":51,"board":8,"optimalCells":5,"manhattan":{"expansions":11,"pops":5,"cells":5},"euclidean":{"expansions":11,"pops":5,"cells":5}},{"dimension":51,"board":9,"optimalCells":19,"manhattan":{"expansions":81,"pops":52,"cells":24},"euclidean":{"expansions":64,"pops":36,"cells":19}},{"dimension":52,"board":0,"optimalCells":13,"manhattan":{"expansions":44,"pops":21,"cells":13},"euclidean":{"expansions":52,"pops":32,"cells":13}},{"dimension":52,"board":1,"optimalCells":66,"manhattan":{"expansions":378,"pops":280,"cells":66},"euclidean":{"expansions":936,"pops":871,"cells":66}},{"dimension":52,"board":2,"optimalCells":39,"manhattan":{"expansions":125,"pops":51,"cells":40},"euclidean":{"expansions":185,"pops":98,"cells":40}},{"dimension":52,"board":3,"optimalCells":22,"manhattan":{"expansions":76,"pops":45,"cells":24},"euclidean":{"expansions":98,"pops":64,"cells":23}},{"dimension":52,"board":4,"optimalCells":62,"manhattan":{"expansions":372,"pops":313,"cells":62},"euclidean":{"expansions":660,"pops":595,"cells":62}},{"dimension":52,"board":5,"optimalCells":18,"manhattan":{"expansions":68,"pops":33,"cells":18},"euclidean":{"expansions":101,"pops":55,"cells":18}},{"dimension":52,"board":6,"optimalCells":61,"manhattan":{"expansions":963,"pops":852,"cells":61},"euclidean":{"expansions":1310,"pops":1183,"cells":61}},{"dimension":52,"board":7,"optimalCells":22,"manhattan":{"expansions":61,"pops":29,"cells":23},"euclidean":{"expansions":82,"pops":45,"cells":23}},{"dimension":52,"board":8,"optimalCells":32,"manhattan":{"expansions":150,"pops":110,"cells":33},"euclidean":{"expansions":159,"pops":130,"cells":33}},{"dimension":52,"board":9,"optimalCells":63,"manhattan":{"expansions":494,"pops":478,"cells":63},"euclidean":{"expansions":515,"pops":495,"cells":63}},{"dimension":53,"board":0,"optimalCells":66,"manhattan":{"expansions":549,"pops":431,"cells":66},"euclidean":{"expansions":963,"pops":891,"cells":66}},{"dimension":53,"board":1,"optimalCells":38,"manhattan":{"expansions":182,"pops":155,"cells":38},"euclidean":{"expansions":272,"pops":239,"cells":38}},{"dimension":53,"board":2,"optimalCells":62,"manhattan":{"expansions":761,"pops":637,"cells":62},"euclidean":{"expansions":1328,"pops":1205,"cells":62}},{"dimension":53,"board":3,"optimalCells":49,"manhattan":{"expansions":318,"pops":236,"cells":51},"euclidean":{"expansions":468,"pops":402,"cells":50}},{"dimension":53,"board":4,"optimalCells":36,"manhattan":{"expansions":159,"pops":106,"cells":42},"euclidean":{"expansions":154,"pops":108,"cells":37}},{"dimension":53,"board":5,"optimalCells":32,"manhattan":{"expansions":271,"pops":239,"cells":32},"euclidean":{"expansions":291,"pops":256,"cells":32}},{"dimension":53,"board":6,"optimalCells":20,"manhattan":{"expansions":94,"pops":67,"cells":22},"euclidean":{"expansions":68,"pops":46,"cells":20}},{"dimension":53,"board":7,"optimalCells":52,"manhattan":{"expansions":115,"pops":69,"cells":55},"euclidean":{"expansions":129,"pops":82,"cells":52}},{"dimension":53,"board":8,"optimalCells":12,"manhattan":{"expansions":58,"pops":38,"cells":12},"euclidean":{"expansions":56,"pops":38,"cells":12}},{"dimension":53,"board":9,"optimalCells":9,"manhattan":{"expansions":34,"pops":17,"cells":9},"euclidean":{"expansions":42,"pops":23,"cells":9}},{"dimension":54,"board":0,"optimalCells":40,"manhattan":{"expansions":401,"pops":326,"cells":40},"euclidean":{"expansions":676,"pops":570,"cells":40}},{"dimension":54,"board":1,"optimalCells":20,"manhattan":{"expansions":65,"pops":56,"cells":20},"euclidean":{"expansions":67,"pops":55,"cells":20}},{"dimension":54,"board":2,"optimalCells":30,"manhattan":{"expansions":280,"pops":220,"cells":30},"euclidean":{"expansions":419,"pops":339,"cells":30}},{"dimension":54,"board":3,"optimalCells":40,"manhattan":{"expansions":302,"pops":259,"cells":40},"euclidean":{"expansions":428,"pops":377,"cells":40}},{"dimension":54,"board":4,"optimalCells":40,"manhattan":{"expansions":392,"pops":367,"cells":40},"euclidean":{"expansions":461,"pops":421,"cells":40}},{"dimension":54,"board":5,"optimalCells":23,"manhattan":{"expansions":55,"pops":38,"cells":23},"euclidean":{"expansions":81,"pops":66,"cells":23}},{"dimension":54,"board":6,"optimalCells":72,"manhattan":{"expansions":623,"pops":533,"cells":72},"euclidean":{"expansions":1000,"pops":946,"cells":72}},{"dimension":54,"board":7,"optimalCells":63,"manhattan":{"expansions":431,"pops":404,"cells":63},"euclidean":{"expansions":473,"pops":442,"cells":63}},{"dimension":54,"board":8,"optimalCells":39,"manhattan":{"expansions":134,"pops":57,"cells":40},"euclidean":{"expansions":252,"pops":157,"cells":40}},{"dimension":54,"board":9,"optimalCells":26,"manhattan":{"expansions":75,"pops":28,"cells":28},"euclidean":{"expansions":72,"pops":26,"cells":26}},{"dimension":55,"board":0,"optimalCells":52,"manhattan":{"expansions":237,"pops":155,"cells":52},"euclidean":{"expansions":592,"pops":476,"cells":52}},{"dimension":55,"board":1,"optimalCells":28,"manhattan":{"expansions":118,"pops":88,"cells":28},"euclidean":{"expansions":169,"pops":138,"cells":28}},{"dimension":55,"board":2,"optimalCells":30,"manhattan":{"expansions":293,"pops":257,"cells":30},"euclidean":{"expansions":310,"pops":269,"cells":30}},{"dimension":55,"board":3,"optimalCells":31,"manhattan":{"expansions":100,"pops":70,"cells":31},"euclidean":{"expansions":162,"pops":125,"cells":31}},{"dimension":55,"board":4,"optimalCells":47,"manhattan":{"expansions":266,"pops":174,"cells":47},"euclidean":{"expansions":604,"pops":495,"cells":47}},{"dimension":55,"board":5,"optimalCells":27,"manhattan":{"expansions":94,"pops":66,"cells":27},"euclidean":{"expansions":157,"pops":125,"cells":27}},{"dimension":55,"board":6,"optimalCells":18,"manhattan":{"expansions":52,"pops":36,"cells":18},"euclidean":{"expansions":67,"pops":52,"cells":18}},{"dimension":55,"board":7,"optimalCells":58,"manhattan":{"expansions":470,"pops":409,"cells":67},"euclidean":{"expansions":263,"pops":203,"cells":58}},{"dimension":55,"board":8,"optimalCells":30,"manhattan":{"expansions":197,"pops":156,"cells":30},"euclidean":{"expansions":257,"pops":214,"cells":30}},{"dimension":55,"board":9,"optimalCells":40,"manhattan":{"expansions":159,"pops":88,"cells":46},"euclidean":{"expansions":93,"pops":40,"cells":40}},{"dimension":56,"board":0,"optimalCells":17,"manhattan":{"expansions":69,"pops":51,"cells":17},"euclidean":{"expansions":74,"pops":56,"cells":17}},{"dimension":56,"board":1,"optimalCells":28,"manhattan":{"expansions":76,"pops":29,"cells":28},"euclidean":{"expansions":76,"pops":29,"cells":28}},{"dimension":56,"board":2,"optimalCells":15,"manhattan":{"expansions":76,"pops":52,"cells":15},"euclidean":{"expansions":108,"pops":75,"cells":15}},{"dimension":56,"board":3,"optimalCells":53,"manhattan":{"expansions":366,"pops":271,"cells":53},"euclidean":{"expansions":496,"pops":448,"cells":53}},{"dimension":56,"board":4,"optimalCells":56,"manhattan":{"expansions":409,"pops":362,"cells":56},"euclidean":{"expansions":662,"pops":607,"cells":56}},{"dimension":56,"board":5,"optimalCells":30,"manhattan":{"expansions":79,"pops":30,"cells":30},"euclidean":{"expansions":80,"pops":31,"cells":30}},{"dimension":56,"board":6,"optimalCells":53,"manhattan":{"expansions":237,"pops":169,"cells":60},"euclidean":{"expansions":197,"pops":133,"cells":54}},{"dimension":56,"board":7,"optimalCells":32,"manhattan":{"expansions":138,"pops":95,"cells":32},"euclidean":{"expansions":258,"pops":204,"cells":32}},{"dimension":56,"board":8,"optimalCells":75,"manhattan":{"expansions":1244,"pops":1130,"cells":75},"euclidean":{"expansions":2049,"pops":1895,"cells":75}},{"dimension":56,"board":9,"optimalCells":11,"manhattan":{"expansions":24,"pops":13,"cells":11},"euclidean":{"expansions":27,"pops":18,"cells":11}},{"dimension":57,"board":0,"optimalCells":10,"manhattan":{"expansions":25,"pops":10,"cells":10},"euclidean":{"expansions":25,"pops":10,"cells":10}},{"dimension":57,"board":1,"optimalCells":72,"manhattan":{"expansions":518,"pops":488,"cells":72},"euclidean":{"expansions":697,"pops":655,"cells":72}},{"dimension":57,"board":2,"optimalCells":57,"manhattan":{"expansions":677,"pops":633,"cells":58},"euclidean":{"expansions":679,"pops":632,"cells":57}},{"dimension":57,"board":3,"optimalCells":28,"manhattan":{"expansions":84,"pops":28,"cells":28},"euclidean":{"expansions":84,"pops":28,"cells":28}},{"dimension":57,"board":4,"optimalCells":14,"manhattan":{"expansions":67,"pops":42,"cells":14},"euclidean":{"expansions":88,"pops":56,"cells":14}},{"dimension":57,"board":5,"optimalCells":null,"manhattan":{"expansions":4,"pops":5,"cells":0},"euclidean":{"expansions":4,"pops":5,"cells":0}},{"dimension":57,"board":6,"optimalCells":33,"manhattan":{"expansions":210,"pops":154,"cells":33},"euclidean":{"expansions":363,"pops":303,"cells":33}},{"dimension":57,"board":7,"optimalCells":31,"manhattan":{"expansions":119,"pops":75,"cells":31},"euclidean":{"expansions":203,"pops":147,"cells":31}},{"dimension":57,"board":8,"optimalCells":19,"manhattan":{"expansions":76,"pops":44,"cells":19},"euclidean":{"expansions":112,"pops":71,"cells":19}},{"dimension":57,"board":9,"optimalCells":12,"manhattan":{"expansions":38,"pops":21,"cells":12},"euclidean":{"expansions":61,"pops":40,"cells":12}},{"dimension":58,"board":0,"optimalCells":37,"manhattan":{"expansions":299,"pops":257,"cells":37},"euclidean":{"expansions":371,"pops":337,"cells":37}},{"dimension":58,"board":1,"optimalCells":67,"manhattan":{"expansions":1088,"pops":989,"cells":67},"euclidean":{"expansions":1894,"pops":1733,"cells":67}},{"dimension":58,"board":2,"optimalCells":51,"manhattan":{"expansions":422,"pops":367,"cells":51},"euclidean":{"expansions":544,"pops":497,"cells":51}},{"dimension":58,"board":3,"optimalCells":null,"manhattan":{"expansions":329,"pops":330,"cells":0},"euclidean":{"expansions":329,"pops":330,"cells":0}},{"dimension":58,"board":4,"optimalCells":20,"manhattan":{"expansions":55,"pops":34,"cells":20},"euclidean":{"expansions":81,"pops":56,"cells":20}},{"dimension":58,"board":5,"optimalCells":42,"manhattan":{"expansions":124,"pops":42,"cells":42},"euclidean":{"expansions":124,"pops":42,"cells":42}},{"dimension":58,"board":6,"optimalCells":9,"manhattan":{"expansions":16,"pops":9,"cells":9},"euclidean":{"expansions":16,"pops":9,"cells":9}},{"dimension":58,"board":7,"optimalCells":17,"manhattan":{"expansions":42,"pops":17,"cells":17},"euclidean":{"expansions":42,"pops":17,"cells":17}},{"dimension":58,"board":8,"optimalCells":13,"manhattan":{"expansions":58,"pops":33,"cells":13},"euclidean":{"expansions":80,"pops":49,"cells":13}},{"dimension":58,"board":9,"optimalCells":50,"manhattan":{"expansions":730,"pops":629,"cells":50},"euclidean":{"expansions":1138,"pops":1006,"cells":50}},{"dimension":59,"board":0,"optimalCells":31,"manhattan":{"expansions":212,"pops":168,"cells":33},"euclidean":{"expansions":271,"pops":233,"cells":32}},{"dimension":59,"board":1,"optimalCells":25,"manhattan":{"expansions":73,"pops":25,"cells":25},"euclidean":{"expansions":73,"pops":25,"cells":25}},{"dimension":59,"board":2,"optimalCells":45,"manhattan":{"expansions":96,"pops":56,"cells":46},"euclidean":{"expansions":93,"pops":56,"cells":46}},{"dimension":59,"board":3,"optimalCells":11,"manhattan":{"expansions":28,"pops":11,"cells":11},"euclidean":{"expansions":28,"pops":11,"cells":11}},{"dimension":59,"board":4,"optimalCells":49,"manhattan":{"expansions":469,"pops":412,"cells":49},"euclidean":{"expansions":695,"pops":622,"cells":49}},{"dimension":59,"board":5,"optimalCells":50,"manhattan":{"expansions":501,"pops":416,"cells":50},"euclidean":{"expansions":928,"pops":808,"cells":50}},{"dimension":59,"board":6,"optimalCells":24,"manhattan":{"expansions":58,"pops":25,"cells":25},"euclidean":{"expansions":58,"pops":24,"cells":24}},{"dimension":59,"board":7,"optimalCells":53,"manhattan":{"expansions":438,"pops":383,"cells":56},"euclidean":{"expansions":550,"pops":481,"cells":54}},{"dimension":59,"board":8,"optimalCells":null,"manhattan":{"expansions":52,"pops":53,"cells":0},"euclidean":{"expansions":52,"pops":53,"cells":0}},{"dimension":59,"board":9,"optimalCells":null,"manhattan":{"expansions":10,"pops":11,"cells":0},"euclidean":{"expansions":10,"pops":11,"cells":0}},{"dimension":60,"board":0,"optimalCells":13,"manhattan":{"expansions":49,"pops":29,"cells":16},"euclidean":{"expansions":56,"pops":29,"cells":13}},{"dimension":60,"board":1,"optimalCells":null,"manhattan":{"expansions":2050,"pops":2051,"cells":0},"euclidean":{"expansions":1768,"pops":1769,"cells":0}},{"dimension":60,"board":2,"optimalCells":25,"manhattan":{"expansions":92,"pops":47,"cells":25},"euclidean":{"expansions":170,"pops":116,"cells":25}},{"dimension":60,"board":3,"optimalCells":21,"manhattan":{"expansions":79,"pops":36,"cells":22},"euclidean":{"expansions":114,"pops":68,"cells":22}},{"dimension":60,"board":4,"optimalCells":24,"manhattan":{"expansions":106,"pops":74,"cells":25},"euclidean":{"expansions":152,"pops":113,"cells":24}},{"dimension":60,"board":5,"optimalCells":null,"manhattan":{"expansions":2030,"pops":2031,"cells":0},"euclidean":{"expansions":1948,"pops":1949,"cells":0}},{"dimension":60,"board":6,"optimalCells":33,"manhattan":{"expansions":105,"pops":51,"cells":38},"euclidean":{"expansions":81,"pops":33,"cells":33}},{"dimension":60,"board":7,"optimalCells":25,"manhattan":{"expansions":74,"pops":25,"cells":25},"euclidean":{"expansions":74,"pops":25,"cells":25}},{"dimension":60,"board":8,"optimalCells":22,"manhattan":{"expansions":54,"pops":33,"cells":24},"euclidean":{"expansions":95,"pops":61,"cells":22}},{"dimension":60,"board":9,"optimalCells":25,"manhattan":{"expansions":127,"pops":98,"cells":25},"euclidean":{"expansions":155,"pops":122,"cells":25}},{"dimension":61,"board":0,"optimalCells":24,"manhattan":{"expansions":116,"pops":85,"cells":24},"euclidean":{"expansions":142,"pops":112,"cells":24}},{"dimension":61,"board":1,"optimalCells":50,"manhattan":{"expansions":564,"pops":483,"cells":50},"euclidean":{"expansions":896,"pops":786,"cells":50}},{"dimension":61,"board":2,"optimalCells":4,"manhattan":{"expansions":12,"pops":6,"cells":4},"euclidean":{"expansions":12,"pops":6,"cells":4}},{"dimension":61,"board":3,"optimalCells":37,"manhattan":{"expansions":295,"pops":228,"cells":37},"euclidean":{"expansions":514,"pops":428,"cells":37}},{"dimension":61,"board":4,"optimalCells":62,"manhattan":{"expansions":1096,"pops":971,"cells":62},"euclidean":{"expansions":1225,"pops":1151,"cells":62}},{"dimension":61,"board":5,"optimalCells":8,"manhattan":{"expansions":21,"pops":8,"cells":8},"euclidean":{"expansions":21,"pops":8,"cells":8}},{"dimension":61,"board":6,"optimalCells":32,"manhattan":{"expansions":120,"pops":79,"cells":32},"euclidean":{"expansions":219,"pops":173,"cells":32}},{"dimension":61,"board":7,"optimalCells":25,"manhattan":{"expansions":60,"pops":26,"cells":26},"euclidean":{"expansions":59,"pops":27,"cells":25}},{"dimension":61,"board":8,"optimalCells":51,"manhattan":{"expansions":712,"pops":609,"cells":51},"euclidean":{"expansions":1030,"pops":932,"cells":51}},{"dimension":61,"board":9,"optimalCells":20,"manhattan":{"expansions":124,"pops":84,"cells":20},"euclidean":{"expansions":186,"pops":134,"cells":20}},{"dimension":62,"board":0,"optimalCells":20,"manhattan":{"expansions":61,"pops":25,"cells":21},"euclidean":{"expansions":67,"pops":29,"cells":21}},{"dimension":62,"board":1,"optimalCells":35,"manhattan":{"expansions":187,"pops":125,"cells":35},"euclidean":{"expansions":382,"pops":314,"cells":35}},{"dimension":62,"board":2,"optimalCells":null,"manhattan":{"expansions":2540,"pops":2541,"cells":0},"euclidean":{"expansions":2217,"pops":2218,"cells":0}},{"dimension":62,"board":3,"optimalCells":42,"manhattan":{"expansions":197,"pops":150,"cells":42},"euclidean":{"expansions":295,"pops":252,"cells":42}},{"dimension":62,"board":4,"optimalCells":36,"manhattan":{"expansions":99,"pops":69,"cells":37},"euclidean":{"expansions":102,"pops":83,"cells":36}},{"dimension":62,"board":5,"optimalCells":49,"manhattan":{"expansions":603,"pops":512,"cells":49},"euclidean":{"expansions":839,"pops":742,"cells":49}},{"dimension":62,"board":6,"optimalCells":null,"manhattan":{"expansions":7,"pops":8,"cells":0},"euclidean":{"expansions":7,"pops":8,"cells":0}},{"dimension":62,"board":7,"optimalCells":45,"manhattan":{"expansions":134,"pops":45,"cells":45},"euclidean":{"expansions":134,"pops":45,"cells":45}},{"dimension":62,"board":8,"optimalCells":14,"manhattan":{"expansions":66,"pops":45,"cells":14},"euclidean":{"expansions":67,"pops":48,"cells":14}},{"dimension":62,"board":9,"optimalCells":56,"manhattan":{"expansions":317,"pops":260,"cells":56},"euclidean":{"expansions":573,"pops":513,"cells":56}},{"dimension":63,"board":0,"optimalCells":66,"manhattan":{"expansions":696,"pops":629,"cells":70},"euclidean":{"expansions":1041,"pops":960,"cells":67}},{"dimension":63,"board":1,"optimalCells":45,"manhattan":{"expansions":273,"pops":218,"cells":45},"euclidean":{"expansions":420,"pops":368,"cells":45}},{"dimension":63,"board":2,"optimalCells":65,"manhattan":{"expansions":692,"pops":593,"cells":65},"euclidean":{"expansions":1288,"pops":1161,"cells":65}},{"dimension":63,"board":3,"optimalCells":17,"manhattan":{"expansions":52,"pops":27,"cells":18},"euclidean":{"expansions":32,"pops":17,"cells":17}},{"dimension":63,"board":4,"optimalCells":83,"manhattan":{"expansions":1326,"pops":1193,"cells":83},"euclidean":{"expansions":2229,"pops":2063,"cells":83}},{"dimension":63,"board":5,"optimalCells":42,"manhattan":{"expansions":123,"pops":87,"cells":42},"euclidean":{"expansions":133,"pops":97,"cells":42}},{"dimension":63,"board":6,"optimalCells":51,"manhattan":{"expansions":258,"pops":157,"cells":52},"euclidean":{"expansions":553,"pops":427,"cells":52}},{"dimension":63,"board":7,"optimalCells":29,"manhattan":{"expansions":86,"pops":31,"cells":29},"euclidean":{"expansions":81,"pops":29,"cells":29}},{"dimension":63,"board":8,"optimalCells":64,"manhattan":{"expansions":617,"pops":542,"cells":65},"euclidean":{"expansions":604,"pops":544,"cells":64}},{"dimension":63,"board":9,"optimalCells":23,"manhattan":{"expansions":50,"pops":24,"cells":23},"euclidean":{"expansions":49,"pops":24,"cells":23}},{"dimension":64,"board":0,"optimalCells":44,"manhattan":{"expansions":315,"pops":239,"cells":44},"euclidean":{"expansions":615,"pops":516,"cells":44}},{"dimension":64,"board":1,"optimalCells":32,"manhattan":{"expansions":91,"pops":34,"cells":33},"euclidean":{"expansions":87,"pops":33,"cells":32}},{"dimension":64,"board":2,"optimalCells":10,"manhattan":{"expansions":33,"pops":20,"cells":10},"euclidean":{"expansions":29,"pops":16,"cells":10}},{"dimension":64,"board":3,"optimalCells":11,"manhattan":{"expansions":28,"pops":11,"cells":11},"euclidean":{"expansions":28,"pops":11,"cells":11}},{"dimension":64,"board":4,"optimalCells":32,"manhattan":{"expansions":94,"pops":55,"cells":33},"euclidean":{"expansions":93,"pops":60,"cells":32}},{"dimension":64,"board":5,"optimalCells":36,"manhattan":{"expansions":220,"pops":173,"cells":39},"euclidean":{"expansions":287,"pops":242,"cells":37}},{"dimension":64,"board":6,"optimalCells":21,"manhattan":{"expansions":60,"pops":22,"cells":21},"euclidean":{"expansions":58,"pops":21,"cells":21}},{"dimension":64,"board":7,"optimalCells":55,"manhattan":{"expansions":692,"pops":597,"cells":55},"euclidean":{"expansions":1180,"pops":1030,"cells":55}},{"dimension":64,"board":8,"optimalCells":36,"manhattan":{"expansions":138,"pops":104,"cells":36},"euclidean":{"expansions":279,"pops":226,"cells":36}},{"dimension":64,"board":9,"optimalCells":26,"manhattan":{"expansions":140,"pops":112,"cells":27},"euclidean":{"expansions":198,"pops":156,"cells":26}},{"dimension":65,"board":0,"optimalCells":5,"manhattan":{"expansions":9,"pops":5,"cells":5},"euclidean":{"expansions":9,"pops":5,"cells":5}},{"dimension":65,"board":1,"optimalCells":15,"manhattan":{"expansions":55,"pops":34,"cells":15},"euclidean":{"expansions":59,"pops":37,"cells":15}},{"dimension":65,"board":2,"optimalCells":null,"manhattan":{"expansions":445,"pops":446,"cells":0},"euclidean":{"expansions":445,"pops":446,"cells":0}},{"dimension":65,"board":3,"optimalCells":51,"manhattan":{"expansions":202,"pops":131,"cells":51},"euclidean":{"expansions":589,"pops":502,"cells":51}},{"dimension":65,"board":4,"optimalCells":18,"manhattan":{"expansions":52,"pops":19,"cells":19},"euclidean":{"expansions":50,"pops":18,"cells":18}},{"dimension":65,"board":5,"optimalCells":56,"manhattan":{"expansions":717,"pops":658,"cells":56},"euclidean":{"expansions":785,"pops":726,"cells":56}},{"dimension":65,"board":6,"optimalCells":22,"manhattan":{"expansions":74,"pops":37,"cells":22},"euclidean":{"expansions":99,"pops":60,"cells":22}},{"dimension":65,"board":7,"optimalCells":47,"manhattan":{"expansions":334,"pops":262,"cells":47},"euclidean":{"expansions":682,"pops":577,"cells":47}},{"dimension":65,"board":8,"optimalCells":null,"manhattan":{"expansions":4140,"pops":4141,"cells":0},"euclidean":{"expansions":2997,"pops":2998,"cells":0}},{"dimension":65,"board":9,"optimalCells":72,"manhattan":{"expansions":512,"pops":422,"cells":72},"euclidean":{"expansions":1056,"pops":955,"cells":72}},{"dimension":66,"board":0,"optimalCells":43,"manhattan":{"expansions":143,"pops":110,"cells":43},"euclidean":{"expansions":213,"pops":176,"cells":43}},{"dimension":66,"board":1,"optimalCells":74,"manhattan":{"expansions":707,"pops":602,"cells":74},"euclidean":{"expansions":998,"pops":951,"cells":74}},{"dimension":66,"board":2,"optimalCells":57,"manhattan":{"expansions":236,"pops":131,"cells":57},"euclidean":{"expansions":573,"pops":440,"cells":57}},{"dimension":66,"board":3,"optimalCells":83,"manhattan":{"expansions":710,"pops":601,"cells":83},"euclidean":{"expansions":1281,"pops":1217,"cells":83}},{"dimension":66,"board":4,"optimalCells":32,"manhattan":{"expansions":110,"pops":50,"cells":34},"euclidean":{"expansions":130,"pops":61,"cells":32}},{"dimension":66,"board":5,"optimalCells":26,"manhattan":{"expansions":144,"pops":100,"cells":26},"euclidean":{"expansions":226,"pops":171,"cells":26}},{"dimension":66,"board":6,"optimalCells":55,"manhattan":{"expansions":441,"pops":346,"cells":55},"euclidean":{"expansions":991,"pops":869,"cells":55}},{"dimension":66,"board":7,"optimalCells":7,"manhattan":{"expansions":28,"pops":13,"cells":8},"euclidean":{"expansions":31,"pops":15,"cells":8}},{"dimension":66,"board":8,"optimalCells":28,"manhattan":{"expansions":176,"pops":131,"cells":28},"euclidean":{"expansions":237,"pops":186,"cells":28}},{"dimension":66,"board":9,"optimalCells":61,"manhattan":{"expansions":221,"pops":104,"cells":62},"euclidean":{"expansions":437,"pops":290,"cells":62}},{"dimension":67,"board":0,"optimalCells":24,"manhattan":{"expansions":89,"pops":77,"cells":24},"euclidean":{"expansions":109,"pops":97,"cells":24}},{"dimension":67,"board":1,"optimalCells":54,"manhattan":{"expansions":262,"pops":191,"cells":54},"euclidean":{"expansions":805,"pops":707,"cells":54}},{"dimension":67,"board":2,"optimalCells":55,"manhattan":{"expansions":844,"pops":776,"cells":56},"euclidean":{"expansions":794,"pops":727,"cells":55}},{"dimension":67,"board":3,"optimalCells":26,"manhattan":{"expansions":77,"pops":39,"cells":28},"euclidean":{"expansions":86,"pops":49,"cells":28}},{"dimension":67,"board":4,"optimalCells":37,"manhattan":{"expansions":138,"pops":90,"cells":41},"euclidean":{"expansions":222,"pops":167,"cells":40}},{"dimension":67,"board":5,"optimalCells":7,"manhattan":{"expansions":19,"pops":7,"cells":7},"euclidean":{"expansions":19,"pops":7,"cells":7}},{"dimension":67,"board":6,"optimalCells":34,"manhattan":{"expansions":222,"pops":168,"cells":34},"euclidean":{"expansions":411,"pops":340,"cells":34}},{"dimension":67,"board":7,"optimalCells":39,"manhattan":{"expansions":191,"pops":160,"cells":41},"euclidean":{"expansions":208,"pops":174,"cells":39}},{"dimension":67,"board":8,"optimalCells":91,"manhattan":{"expansions":1058,"pops":893,"cells":91},"euclidean":{"expansions":2639,"pops":2462,"cells":91}},{"dimension":67,"board":9,"optimalCells":15,"manhattan":{"expansions":43,"pops":15,"cells":15},"euclidean":{"expansions":43,"pops":15,"cells":15}},{"dimension":68,"board":0,"optimalCells":60,"manhattan":{"expansions":750,"pops":643,"cells":60},"euclidean":{"expansions":1293,"pops":1162,"cells":60}},{"dimension":68,"board":1,"optimalCells":13,"manhattan":{"expansions":41,"pops":25,"cells":13},"euclidean":{"expansions":52,"pops":34,"cells":13}},{"dimension":68,"board":2,"optimalCells":35,"manhattan":{"expansions":103,"pops":35,"cells":35},"euclidean":{"expansions":103,"pops":35,"cells":35}},{"dimension":68,"board":3,"optimalCells":21,"manhattan":{"expansions":74,"pops":43,"cells":22},"euclidean":{"expansions":110,"pops":74,"cells":22}},{"dimension":68,"board":4,"optimalCells":6,"manhattan":{"expansions":16,"pops":6,"cells":6},"euclidean":{"expansions":16,"pops":6,"cells":6}},{"dimension":68,"board":5,"optimalCells":35,"manhattan":{"expansions":149,"pops":125,"cells":35},"euclidean":{"expansions":167,"pops":141,"cells":35}},{"dimension":68,"board":6,"optimalCells":48,"manhattan":{"expansions":147,"pops":78,"cells":53},"euclidean":{"expansions":156,"pops":95,"cells":51}},{"dimension":68,"board":7,"optimalCells":95,"manhattan":{"expansions":1393,"pops":1175,"cells":95},"euclidean":{"expansions":2408,"pops":2288,"cells":95}},{"dimension":68,"board":8,"optimalCells":39,"manhattan":{"expansions":173,"pops":121,"cells":39},"euclidean":{"expansions":379,"pops":305,"cells":39}},{"dimension":68,"board":9,"optimalCells":73,"manhattan":{"expansions":623,"pops":565,"cells":73},"euclidean":{"expansions":533,"pops":486,"cells":73}},{"dimension":69,"board":0,"optimalCells":53,"manhattan":{"expansions":446,"pops":386,"cells":54},"euclidean":{"expansions":587,"pops":520,"cells":53}},{"dimension":69,"board":1,"optimalCells":45,"manhattan":{"expansions":257,"pops":206,"cells":45},"euclidean":{"expansions":535,"pops":470,"cells":45}},{"dimension":69,"board":2,"optimalCells":67,"manhattan":{"expansions":726,"pops":618,"cells":67},"euclidean":{"expansions":1106,"pops":1017,"cells":67}},{"dimension":69,"board":3,"optimalCells":45,"manhattan":{"expansions":297,"pops":268,"cells":45},"euclidean":{"expansions":327,"pops":298,"cells":45}},{"dimension":69,"board":4,"optimalCells":52,"manhattan":{"expansions":618,"pops":525,"cells":52},"euclidean":{"expansions":1096,"pops":960,"cells":52}},{"dimension":69,"board":5,"optimalCells":15,"manhattan":{"expansions":27,"pops":18,"cells":15},"euclidean":{"expansions":27,"pops":17,"cells":15}},{"dimension":69,"board":6,"optimalCells":50,"manhattan":{"expansions":279,"pops":241,"cells":50},"euclidean":{"expansions":433,"pops":394,"cells":50}},{"dimension":69,"board":7,"optimalCells":85,"manhattan":{"expansions":1454,"pops":1299,"cells":85},"euclidean":{"expansions":2003,"pops":1879,"cells":85}},{"dimension":69,"board":8,"optimalCells":53,"manhattan":{"expansions":161,"pops":66,"cells":57},"euclidean":{"expansions":141,"pops":54,"cells":54}},{"dimension":69,"board":9,"optimalCells":5,"manhattan":{"expansions":12,"pops":7,"cells":5},"euclidean":{"expansions":12,"pops":8,"cells":5}},{"dimension":70,"board":0,"optimalCells":29,"manhattan":{"expansions":141,"pops":107,"cells":33},"euclidean":{"expansions":207,"pops":152,"cells":29}},{"dimension":70,"board":1,"optimalCells":55,"manhattan":{"expansions":323,"pops":270,"cells":57},"euclidean":{"expansions":550,"pops":475,"cells":55}},{"dimension":70,"board":2,"optimalCells":38,"manhattan":{"expansions":273,"pops":231,"cells":39},"euclidean":{"expansions":348,"pops":305,"cells":38}},{"dimension":70,"board":3,"optimalCells":55,"manhattan":{"expansions":567,"pops":499,"cells":56},"euclidean":{"expansions":809,"pops":740,"cells":56}},{"dimension":70,"board":4,"optimalCells":53,"manhattan":{"expansions":153,"pops":64,"cells":55},"euclidean":{"expansions":146,"pops":60,"cells":55}},{"dimension":70,"board":5,"optimalCells":51,"manhattan":{"expansions":385,"pops":290,"cells":51},"euclidean":{"expansions":774,"pops":639,"cells":51}},{"dimension":70,"board":6,"optimalCells":58,"manhattan":{"expansions":312,"pops":267,"cells":58},"euclidean":{"expansions":495,"pops":457,"cells":58}},{"dimension":70,"board":7,"optimalCells":45,"manhattan":{"expansions":287,"pops":267,"cells":48},"euclidean":{"expansions":335,"pops":301,"cells":45}},{"dimension":70,"board":8,"optimalCells":68,"manhattan":{"expansions":579,"pops":542,"cells":68},"euclidean":{"expansions":664,"pops":622,"cells":68}},{"dimension":70,"board":9,"optimalCells":54,"manhattan":{"expansions":321,"pops":231,"cells":55},"euclidean":{"expansions":630,"pops":524,"cells":55}},{"dimension":71,"board":0,"optimalCells":17,"manhattan":{"expansions":63,"pops":44,"cells":17},"euclidean":{"expansions":87,"pops":66,"cells":17}},{"dimension":71,"board":1,"optimalCells":79,"manhattan":{"expansions":1518,"pops":1367,"cells":79},"euclidean":{"expansions":2400,"pops":2229,"cells":79}},{"dimension":71,"board":2,"optimalCells":28,"manhattan":{"expansions":110,"pops":79,"cells":28},"euclidean":{"expansions":145,"pops":113,"cells":28}},{"dimension":71,"board":3,"optimalCells":40,"manhattan":{"expansions":156,"pops":118,"cells":43},"euclidean":{"expansions":266,"pops":204,"cells":42}},{"dimension":71,"board":4,"optimalCells":72,"manhattan":{"expansions":1093,"pops":949,"cells":72},"euclidean":{"expansions":1538,"pops":1410,"cells":72}},{"dimension":71,"board":5,"optimalCells":133,"manhattan":{"expansions":1267,"pops":1241,"cells":133},"euclidean":{"expansions":1346,"pops":1327,"cells":133}},{"dimension":71,"board":6,"optimalCells":20,"manhattan":{"expansions":77,"pops":35,"cells":21},"euclidean":{"expansions":105,"pops":58,"cells":21}},{"dimension":71,"board":7,"optimalCells":30,"manhattan":{"expansions":96,"pops":45,"cells":31},"euclidean":{"expansions":136,"pops":79,"cells":31}},{"dimension":71,"board":8,"optimalCells":null,"manhattan":{"expansions":6,"pops":7,"cells":0},"euclidean":{"expansions":6,"pops":7,"cells":0}},{"dimension":71,"board":9,"optimalCells":34,"manhattan":{"expansions":157,"pops":118,"cells":34},"euclidean":{"expansions":312,"pops":258,"cells":34}},{"dimension":72,"board":0,"optimalCells":26,"manhattan":{"expansions":138,"pops":97,"cells":26},"euclidean":{"expansions":202,"pops":160,"cells":26}},{"dimension":72,"board":1,"optimalCells":27,"manhattan":{"expansions":134,"pops":93,"cells":28},"euclidean":{"expansions":226,"pops":173,"cells":28}},{"dimension":72,"board":2,"optimalCells":34,"manhattan":{"expansions":95,"pops":34,"cells":34},"euclidean":{"expansions":95,"pops":34,"cells":34}},{"dimension":72,"board":3,"optimalCells":89,"manhattan":{"expansions":727,"pops":649,"cells":89},"euclidean":{"expansions":1153,"pops":1089,"cells":89}},{"dimension":72,"board":4,"optimalCells":28,"manhattan":{"expansions":107,"pops":75,"cells":28},"euclidean":{"expansions":172,"pops":141,"cells":28}},{"dimension":72,"board":5,"optimalCells":56,"manhattan":{"expansions":922,"pops":809,"cells":56},"euclidean":{"expansions":1438,"pops":1293,"cells":56}},{"dimension":72,"board":6,"optimalCells":8,"manhattan":{"expansions":22,"pops":8,"cells":8},"euclidean":{"expansions":22,"pops":8,"cells":8}},{"dimension":72,"board":7,"optimalCells":17,"manhattan":{"expansions":59,"pops":30,"cells":19},"euclidean":{"expansions":88,"pops":55,"cells":17}},{"dimension":72,"board":8,"optimalCells":37,"manhattan":{"expansions":117,"pops":48,"cells":38},"euclidean":{"expansions":121,"pops":52,"cells":38}},{"dimension":72,"board":9,"optimalCells":65,"manhattan":{"expansions":194,"pops":104,"cells":67},"euclidean":{"expansions":273,"pops":143,"cells":65}},{"dimension":73,"board":0,"optimalCells":35,"manhattan":{"expansions":149,"pops":99,"cells":35},"euclidean":{"expansions":419,"pops":344,"cells":35}},{"dimension":73,"board":1,"optimalCells":33,"manhattan":{"expansions":255,"pops":189,"cells":33},"euclidean":{"expansions":424,"pops":343,"cells":33}},{"dimension":73,"board":2,"optimalCells":50,"manhattan":{"expansions":454,"pops":347,"cells":50},"euclidean":{"expansions":883,"pops":767,"cells":50}},{"dimension":73,"board":3,"optimalCells":23,"manhattan":{"expansions":99,"pops":58,"cells":23},"euclidean":{"expansions":130,"pops":87,"cells":23}},{"dimension":73,"board":4,"optimalCells":55,"manhattan":{"expansions":389,"pops":317,"cells":55},"euclidean":{"expansions":743,"pops":681,"cells":55}},{"dimension":73,"board":5,"optimalCells":77,"manhattan":{"expansions":1576,"pops":1442,"cells":77},"euclidean":{"expansions":1823,"pops":1714,"cells":77}},{"dimension":73,"board":6,"optimalCells":37,"manhattan":{"expansions":167,"pops":132,"cells":43},"euclidean":{"expansions":283,"pops":234,"cells":40}},{"dimension":73,"board":7,"optimalCells":null,"manhattan":{"expansions":2252,"pops":2253,"cells":0},"euclidean":{"expansions":2252,"pops":2253,"cells":0}},{"dimension":73,"board":8,"optimalCells":62,"manhattan":{"expansions":367,"pops":271,"cells":62},"euclidean":{"expansions":793,"pops":673,"cells":62}},{"dimension":73,"board":9,"optimalCells":55,"manhattan":{"expansions":246,"pops":156,"cells":61},"euclidean":{"expansions":319,"pops":213,"cells":56}},{"dimension":74,"board":0,"optimalCells":50,"manhattan":{"expansions":219,"pops":120,"cells":52},"euclidean":{"expansions":304,"pops":217,"cells":51}},{"dimension":74,"board":1,"optimalCells":56,"manhattan":{"expansions":371,"pops":271,"cells":56},"euclidean":{"expansions":980,"pops":865,"cells":56}},{"dimension":74,"board":2,"optimalCells":28,"manhattan":{"expansions":78,"pops":28,"cells":28},"euclidean":{"expansions":78,"pops":28,"cells":28}},{"dimension":74,"board":3,"optimalCells":11,"manhattan":{"expansions":57,"pops":37,"cells":11},"euclidean":{"expansions":46,"pops":28,"cells":11}},{"dimension":74,"board":4,"optimalCells":45,"manhattan":{"expansions":289,"pops":248,"cells":47},"euclidean":{"expansions":387,"pops":336,"cells":45}},{"dimension":74,"board":5,"optimalCells":32,"manhattan":{"expansions":151,"pops":89,"cells":34},"euclidean":{"expansions":220,"pops":132,"cells":32}},{"dimension":74,"board":6,"optimalCells":70,"manhattan":{"expansions":419,"pops":369,"cells":71},"euclidean":{"expansions":366,"pops":313,"cells":70}},{"dimension":74,"board":7,"optimalCells":23,"manhattan":{"expansions":104,"pops":61,"cells":23},"euclidean":{"expansions":166,"pops":112,"cells":23}},{"dimension":74,"board":8,"optimalCells":81,"manhattan":{"expansions":717,"pops":573,"cells":81},"euclidean":{"expansions":1045,"pops":984,"cells":81}},{"dimension":74,"board":9,"optimalCells":18,"manhattan":{"expansions":53,"pops":34,"cells":20},"euclidean":{"expansions":53,"pops":31,"cells":18}},{"dimension":75,"board":0,"optimalCells":68,"manhattan":{"expansions":661,"pops":512,"cells":72},"euclidean":{"expansions":1095,"pops":962,"cells":70}},{"dimension":75,"board":1,"optimalCells":15,"manhattan":{"expansions":44,"pops":15,"cells":15},"euclidean":{"expansions":44,"pops":15,"cells":15}},{"dimension":75,"board":2,"optimalCells":28,"manhattan":{"expansions":80,"pops":45,"cells":31},"euclidean":{"expansions":78,"pops":44,"cells":30}},{"dimension":75,"board":3,"optimalCells":null,"manhattan":{"expansions":116,"pops":117,"cells":0},"euclidean":{"expansions":110,"pops":111,"cells":0}},{"dimension":75,"board":4,"optimalCells":70,"manhattan":{"expansions":365,"pops":236,"cells":70},"euclidean":{"expansions":989,"pops":813,"cells":70}},{"dimension":75,"board":5,"optimalCells":38,"manhattan":{"expansions":99,"pops":41,"cells":40},"euclidean":{"expansions":97,"pops":40,"cells":39}},{"dimension":75,"board":6,"optimalCells":51,"manhattan":{"expansions":315,"pops":284,"cells":51},"euclidean":{"expansions":282,"pops":251,"cells":51}},{"dimension":75,"board":7,"optimalCells":78,"manhattan":{"expansions":1296,"pops":1148,"cells":78},"euclidean":{"expansions":1442,"pops":1335,"cells":78}},{"dimension":75,"board":8,"optimalCells":34,"manhattan":{"expansions":170,"pops":137,"cells":36},"euclidean":{"expansions":202,"pops":174,"cells":35}},{"dimension":75,"board":9,"optimalCells":55,"manhattan":{"expansions":260,"pops":207,"cells":67},"euclidean":{"expansions":319,"pops":250,"cells":56}},{"dimension":76,"board":0,"optimalCells":32,"manhattan":{"expansions":228,"pops":166,"cells":35},"euclidean":{"expansions":205,"pops":138,"cells":32}},{"dimension":76,"board":1,"optimalCells":56,"manhattan":{"expansions":487,"pops":367,"cells":56},"euclidean":{"expansions":881,"pops":790,"cells":56}},{"dimension":76,"board":2,"optimalCells":75,"manhattan":{"expansions":1073,"pops":994,"cells":75},"euclidean":{"expansions":1459,"pops":1365,"cells":75}},{"dimension":76,"board":3,"optimalCells":119,"manhattan":{"expansions":2205,"pops":2137,"cells":121},"euclidean":{"expansions":2478,"pops":2420,"cells":119}},{"dimension":76,"board":4,"optimalCells":43,"manhattan":{"expansions":224,"pops":133,"cells":46},"euclidean":{"expansions":301,"pops":199,"cells":44}},{"dimension":76,"board":5,"optimalCells":43,"manhattan":{"expansions":227,"pops":163,"cells":48},"euclidean":{"expansions":405,"pops":335,"cells":45}},{"dimension":76,"board":6,"optimalCells":51,"manhattan":{"expansions":188,"pops":150,"cells":51},"euclidean":{"expansions":230,"pops":207,"cells":51}},{"dimension":76,"board":7,"optimalCells":85,"manhattan":{"expansions":1212,"pops":1148,"cells":91},"euclidean":{"expansions":1332,"pops":1269,"cells":86}},{"dimension":76,"board":8,"optimalCells":48,"manhattan":{"expansions":300,"pops":213,"cells":51},"euclidean":{"expansions":571,"pops":437,"cells":48}},{"dimension":76,"board":9,"optimalCells":14,"manhattan":{"expansions":41,"pops":14,"cells":14},"euclidean":{"expansions":41,"pops":14,"cells":14}},{"dimension":77,"board":0,"optimalCells":42,"manhattan":{"expansions":116,"pops":52,"cells":45},"euclidean":{"expansions":127,"pops":62,"cells":43}},{"dimension":77,"board":1,"optimalCells":37,"manhattan":{"expansions":124,"pops":96,"cells":37},"euclidean":{"expansions":190,"pops":164,"cells":37}},{"dimension":77,"board":2,"optimalCells":null,"manhattan":{"expansions":2927,"pops":2928,"cells":0},"euclidean":{"expansions":2875,"pops":2876,"cells":0}},{"dimension":77,"board":3,"optimalCells":74,"manhattan":{"expansions":703,"pops":566,"cells":74},"euclidean":{"expansions":1663,"pops":1515,"cells":74}},{"dimension":77,"board":4,"optimalCells":38,"manhattan":{"expansions":110,"pops":38,"cells":38},"euclidean":{"expansions":110,"pops":38,"cells":38}},{"dimension":77,"board":5,"optimalCells":100,"manhattan":{"expansions":1073,"pops":1021,"cells":100},"euclidean":{"expansions":1260,"pops":1219,"cells":100}},{"dimension":77,"board":6,"optimalCells":74,"manhattan":{"expansions":890,"pops":782,"cells":76},"euclidean":{"expansions":1163,"pops":1043,"cells":75}},{"dimension":77,"board":7,"optimalCells":39,"manhattan":{"expansions":293,"pops":237,"cells":39},"euclidean":{"expansions":506,"pops":427,"cells":39}},{"dimension":77,"board":8,"optimalCells":46,"manhattan":{"expansions":204,"pops":138,"cells":49},"euclidean":{"expansions":182,"pops":119,"cells":47}},{"dimension":77,"board":9,"optimalCells":112,"manhattan":{"expansions":659,"pops":591,"cells":118},"euclidean":{"expansions":1045,"pops":972,"cells":113}},{"dimension":78,"board":0,"optimalCells":8,"manhattan":{"expansions":32,"pops":18,"cells":8},"euclidean":{"expansions":40,"pops":22,"cells":8}},{"dimension":78,"board":1,"optimalCells":65,"manhattan":{"expansions":367,"pops":278,"cells":65},"euclidean":{"expansions":867,"pops":772,"cells":65}},{"dimension":78,"board":2,"optimalCells":15,"manhattan":{"expansions":38,"pops":15,"cells":15},"euclidean":{"expansions":38,"pops":15,"cells":15}},{"dimension":78,"board":3,"optimalCells":55,"manhattan":{"expansions":825,"pops":753,"cells":55},"euclidean":{"expansions":838,"pops":768,"cells":55}},{"dimension":78,"board":4,"optimalCells":42,"manhattan":{"expansions":289,"pops":221,"cells":42},"euclidean":{"expansions":474,"pops":396,"cells":42}},{"dimension":78,"board":5,"optimalCells":5,"manhattan":{"expansions":18,"pops":10,"cells":5},"euclidean":{"expansions":16,"pops":9,"cells":5}},{"dimension":78,"board":6,"optimalCells":47,"manhattan":{"expansions":364,"pops":333,"cells":49},"euclidean":{"expansions":403,"pops":374,"cells":47}},{"dimension":78,"board":7,"optimalCells":75,"manhattan":{"expansions":672,"pops":576,"cells":75},"euclidean":{"expansions":1168,"pops":1055,"cells":75}},{"dimension":78,"board":8,"optimalCells":74,"manhattan":{"expansions":1008,"pops":894,"cells":77},"euclidean":{"expansions":1542,"pops":1410,"cells":74}},{"dimension":78,"board":9,"optimalCells":56,"manhattan":{"expansions":155,"pops":58,"cells":57},"euclidean":{"expansions":154,"pops":56,"cells":56}},{"dimension":79,"board":0,"optimalCells":67,"manhattan":{"expansions":513,"pops":419,"cells":67},"euclidean":{"expansions":1044,"pops":958,"cells":67}},{"dimension":79,"board":1,"optimalCells":38,"manhattan":{"expansions":201,"pops":157,"cells":38},"euclidean":{"expansions":280,"pops":241,"cells":38}},{"dimension":79,"board":2,"optimalCells":67,"manhattan":{"expansions":441,"pops":326,"cells":67},"euclidean":{"expansions":984,"pops":882,"cells":67}},{"dimension":79,"board":3,"optimalCells":35,"manhattan":{"expansions":159,"pops":106,"cells":35},"euclidean":{"expansions":221,"pops":167,"cells":35}},{"dimension":79,"board":4,"optimalCells":53,"manhattan":{"expansions":278,"pops":215,"cells":58},"euclidean":{"expansions":382,"pops":325,"cells":58}},{"dimension":79,"board":5,"optimalCells":48,"manhattan":{"expansions":240,"pops":170,"cells":52},"euclidean":{"expansions":434,"pops":313,"cells":49}},{"dimension":79,"board":6,"optimalCells":35,"manhattan":{"expansions":237,"pops":169,"cells":37},"euclidean":{"expansions":279,"pops":209,"cells":36}},{"dimension":79,"board":7,"optimalCells":22,"manhattan":{"expansions":75,"pops":45,"cells":22},"euclidean":{"expansions":146,"pops":106,"cells":22}},{"dimension":79,"board":8,"optimalCells":121,"manhattan":{"expansions":1697,"pops":1503,"cells":121},"euclidean":{"expansions":3272,"pops":3113,"cells":121}},{"dimension":79,"board":9,"optimalCells":49,"manhattan":{"expansions":232,"pops":181,"cells":52},"euclidean":{"expansions":228,"pops":190,"cells":50}},{"dimension":80,"board":0,"optimalCells":14,"manhattan":{"expansions":53,"pops":26,"cells":15},"euclidean":{"expansions":72,"pops":38,"cells":15}},{"dimension":80,"board":1,"optimalCells":45,"manhattan":{"expansions":118,"pops":58,"cells":47},"euclidean":{"expansions":131,"pops":69,"cells":47}},{"dimension":80,"board":2,"optimalCells":105,"manhattan":{"expansions":2803,"pops":2719,"cells":105},"euclidean":{"expansions":2687,"pops":2616,"cells":105}},{"dimension":80,"board":3,"optimalCells":45,"manhattan":{"expansions":433,"pops":353,"cells":45},"euclidean":{"expansions":783,"pops":664,"cells":45}},{"dimension":80,"board":4,"optimalCells":76,"manhattan":{"expansions":590,"pops":453,"cells":76},"euclidean":{"expansions":1629,"pops":1515,"cells":76}},{"dimension":80,"board":5,"optimalCells":36,"manhattan":{"expansions":218,"pops":182,"cells":36},"euclidean":{"expansions":244,"pops":215,"cells":36}},{"dimension":80,"board":6,"optimalCells":73,"manhattan":{"expansions":508,"pops":451,"cells":73},"euclidean":{"expansions":817,"pops":772,"cells":73}},{"dimension":80,"board":7,"optimalCells":45,"manhattan":{"expansions":198,"pops":121,"cells":45},"euclidean":{"expansions":313,"pops":251,"cells":45}},{"dimension":80,"board":8,"optimalCells":112,"manhattan":{"expansions":1587,"pops":1435,"cells":112},"euclidean":{"expansions":2450,"pops":2360,"cells":112}},{"dimension":80,"board":9,"optimalCells":42,"manhattan":{"expansions":153,"pops":84,"cells":43},"euclidean":{"expansions":334,"pops":234,"cells":43}},{"dimension":81,"board":0,"optimalCells":19,"manhattan":{"expansions":57,"pops":37,"cells":21},"euclidean":{"expansions":82,"pops":53,"cells":19}},{"dimension":81,"board":1,"optimalCells":55,"manhattan":{"expansions":185,"pops":97,"cells":59},"euclidean":{"expansions":310,"pops":192,"cells":57}},{"dimension":81,"board":2,"optimalCells":65,"manhattan":{"expansions":355,"pops":249,"cells":67},"euclidean":{"expansions":845,"pops":713,"cells":67}},{"dimension":81,"board":3,"optimalCells":41,"manhattan":{"expansions":255,"pops":208,"cells":41},"euclidean":{"expansions":440,"pops":376,"cells":41}},{"dimension":81,"board":4,"optimalCells":53,"manhattan":{"expansions":493,"pops":393,"cells":53},"euclidean":{"expansions":948,"pops":825,"cells":53}},{"dimension":81,"board":5,"optimalCells":64,"manhattan":{"expansions":352,"pops":236,"cells":64},"euclidean":{"expansions":708,"pops":607,"cells":64}},{"dimension":81,"board":6,"optimalCells":31,"manhattan":{"expansions":88,"pops":31,"cells":31},"euclidean":{"expansions":88,"pops":31,"cells":31}},{"dimension":81,"board":7,"optimalCells":99,"manhattan":{"expansions":1833,"pops":1648,"cells":99},"euclidean":{"expansions":3350,"pops":3167,"cells":99}},{"dimension":81,"board":8,"optimalCells":96,"manhattan":{"expansions":1368,"pops":1296,"cells":96},"euclidean":{"expansions":1209,"pops":1172,"cells":96}},{"dimension":81,"board":9,"optimalCells":79,"manhattan":{"expansions":1078,"pops":939,"cells":79},"euclidean":{"expansions":1904,"pops":1775,"cells":79}},{"dimension":82,"board":0,"optimalCells":65,"manhattan":{"expansions":1130,"pops":1000,"cells":65},"euclidean":{"expansions":1448,"pops":1326,"cells":65}},{"dimension":82,"board":1,"optimalCells":61,"manhattan":{"expansions":340,"pops":262,"cells":61},"euclidean":{"expansions":784,"pops":691,"cells":61}},{"dimension":82,"board":2,"optimalCells":80,"manhattan":{"expansions":1390,"pops":1239,"cells":80},"euclidean":{"expansions":2173,"pops":1997,"cells":80}},{"dimension":82,"board":3,"optimalCells":63,"manhattan":{"expansions":744,"pops":638,"cells":63},"euclidean":{"expansions":1274,"pops":1180,"cells":63}},{"dimension":82,"board":4,"optimalCells":108,"manhattan":{"expansions":2997,"pops":2788,"cells":108},"euclidean":{"expansions":4162,"pops":3956,"cells":108}},{"dimension":82,"board":5,"optimalCells":46,"manhattan":{"expansions":221,"pops":187,"cells":46},"euclidean":{"expansions":269,"pops":244,"cells":46}},{"dimension":82,"board":6,"optimalCells":35,"manhattan":{"expansions":410,"pops":357,"cells":41},"euclidean":{"expansions":179,"pops":132,"cells":35}},{"dimension":82,"board":7,"optimalCells":32,"manhattan":{"expansions":138,"pops":97,"cells":32},"euclidean":{"expansions":306,"pops":244,"cells":32}},{"dimension":82,"board":8,"optimalCells":36,"manhattan":{"expansions":155,"pops":100,"cells":36},"euclidean":{"expansions":390,"pops":307,"cells":36}},{"dimension":82,"board":9,"optimalCells":34,"manhattan":{"expansions":94,"pops":68,"cells":34},"euclidean":{"expansions":290,"pops":259,"cells":34}},{"dimension":83,"board":0,"optimalCells":57,"manhattan":{"expansions":418,"pops":305,"cells":57},"euclidean":{"expansions":881,"pops":740,"cells":57}},{"dimension":83,"board":1,"optimalCells":52,"manhattan":{"expansions":329,"pops":261,"cells":52},"euclidean":{"expansions":577,"pops":507,"cells":52}},{"dimension":83,"board":2,"optimalCells":10,"manhattan":{"expansions":18,"pops":10,"cells":10},"euclidean":{"expansions":19,"pops":11,"cells":10}},{"dimension":83,"board":3,"optimalCells":22,"manhattan":{"expansions":119,"pops":98,"cells":22},"euclidean":{"expansions":123,"pops":106,"cells":22}},{"dimension":83,"board":4,"optimalCells":81,"manhattan":{"expansions":1516,"pops":1368,"cells":81},"euclidean":{"expansions":2579,"pops":2361,"cells":81}},{"dimension":83,"board":5,"optimalCells":83,"manhattan":{"expansions":550,"pops":520,"cells":83},"euclidean":{"expansions":614,"pops":591,"cells":83}},{"dimension":83,"board":6,"optimalCells":48,"manhattan":{"expansions":137,"pops":48,"cells":48},"euclidean":{"expansions":137,"pops":48,"cells":48}},{"dimension":83,"board":7,"optimalCells":6,"manhattan":{"expansions":13,"pops":6,"cells":6},"euclidean":{"expansions":13,"pops":7,"cells":6}},{"dimension":83,"board":8,"optimalCells":31,"manhattan":{"expansions":77,"pops":35,"cells":33},"euclidean":{"expansions":81,"pops":38,"cells":33}},{"dimension":83,"board":9,"optimalCells":46,"manhattan":{"expansions":157,"pops":87,"cells":56},"euclidean":{"expansions":188,"pops":118,"cells":47}},{"dimension":84,"board":0,"optimalCells":43,"manhattan":{"expansions":364,"pops":299,"cells":46},"euclidean":{"expansions":302,"pops":199,"cells":43}},{"dimension":84,"board":1,"optimalCells":68,"manhattan":{"expansions":202,"pops":68,"cells":68},"euclidean":{"expansions":202,"pops":68,"cells":68}},{"dimension":84,"board":2,"optimalCells":50,"manhattan":{"expansions":445,"pops":405,"cells":53},"euclidean":{"expansions":589,"pops":542,"cells":50}},{"dimension":84,"board":3,"optimalCells":41,"manhattan":{"expansions":125,"pops":51,"cells":46},"euclidean":{"expansions":108,"pops":42,"cells":41}},{"dimension":84,"board":4,"optimalCells":null,"manhattan":{"expansions":521,"pops":522,"cells":0},"euclidean":{"expansions":516,"pops":517,"cells":0}},{"dimension":84,"board":5,"optimalCells":35,"manhattan":{"expansions":104,"pops":35,"cells":35},"euclidean":{"expansions":104,"pops":35,"cells":35}},{"dimension":84,"board":6,"optimalCells":64,"manhattan":{"expansions":333,"pops":227,"cells":68},"euclidean":{"expansions":925,"pops":745,"cells":65}},{"dimension":84,"board":7,"optimalCells":67,"manhattan":{"expansions":1011,"pops":896,"cells":67},"euclidean":{"expansions":1695,"pops":1540,"cells":67}},{"dimension":84,"board":8,"optimalCells":24,"manhattan":{"expansions":41,"pops":24,"cells":24},"euclidean":{"expansions":42,"pops":25,"cells":24}},{"dimension":84,"board":9,"optimalCells":38,"manhattan":{"expansions":257,"pops":186,"cells":38},"euclidean":{"expansions":408,"pops":328,"cells":38}},{"dimension":85,"board":0,"optimalCells":69,"manhattan":{"expansions":690,"pops":608,"cells":70},"euclidean":{"expansions":882,"pops":812,"cells":70}},{"dimension":85,"board":1,"optimalCells":76,"manhattan":{"expansions":676,"pops":590,"cells":76},"euclidean":{"expansions":1154,"pops":1085,"cells":76}},{"dimension":85,"board":2,"optimalCells":95,"manhattan":{"expansions":1098,"pops":912,"cells":95},"euclidean":{"expansions":2315,"pops":2198,"cells":95}},{"dimension":85,"board":3,"optimalCells":55,"manhattan":{"expansions":164,"pops":55,"cells":55},"euclidean":{"expansions":164,"pops":55,"cells":55}},{"dimension":85,"board":4,"optimalCells":18,"manhattan":{"expansions":108,"pops":78,"cells":18},"euclidean":{"expansions":125,"pops":96,"cells":18}},{"dimension":85,"board":5,"optimalCells":60,"manhattan":{"expansions":297,"pops":189,"cells":67},"euclidean":{"expansions":329,"pops":221,"cells":62}},{"dimension":85,"board":6,"optimalCells":34,"manhattan":{"expansions":122,"pops":82,"cells":35},"euclidean":{"expansions":171,"pops":125,"cells":34}},{"dimension":85,"board":7,"optimalCells":20,"manhattan":{"expansions":58,"pops":42,"cells":20},"euclidean":{"expansions":69,"pops":52,"cells":20}},{"dimension":85,"board":8,"optimalCells":28,"manhattan":{"expansions":71,"pops":35,"cells":31},"euclidean":{"expansions":139,"pops":94,"cells":28}},{"dimension":85,"board":9,"optimalCells":59,"manhattan":{"expansions":684,"pops":579,"cells":59},"euclidean":{"expansions":1254,"pops":1111,"cells":59}},{"dimension":86,"board":0,"optimalCells":72,"manhattan":{"expansions":808,"pops":769,"cells":72},"euclidean":{"expansions":1068,"pops":1017,"cells":72}},{"dimension":86,"board":1,"optimalCells":86,"manhattan":{"expansions":1138,"pops":990,"cells":86},"euclidean":{"expansions":1790,"pops":1683,"cells":86}},{"dimension":86,"board":2,"optimalCells":null,"manhattan":{"expansions":330,"pops":331,"cells":0},"euclidean":{"expansions":327,"pops":328,"cells":0}},{"dimension":86,"board":3,"optimalCells":76,"manhattan":{"expansions":990,"pops":879,"cells":76},"euclidean":{"expansions":1433,"pops":1325,"cells":76}},{"dimension":86,"board":4,"optimalCells":78,"manhattan":{"expansions":537,"pops":412,"cells":78},"euclidean":{"expansions":1466,"pops":1326,"cells":78}},{"dimension":86,"board":5,"optimalCells":9,"manhattan":{"expansions":25,"pops":10,"cells":9},"euclidean":{"expansions":22,"pops":9,"cells":9}},{"dimension":86,"board":6,"optimalCells":49,"manhattan":{"expansions":382,"pops":306,"cells":49},"euclidean":{"expansions":733,"pops":645,"cells":49}},{"dimension":86,"board":7,"optimalCells":43,"manhattan":{"expansions":214,"pops":137,"cells":46},"euclidean":{"expansions":245,"pops":144,"cells":44}},{"dimension":86,"board":8,"optimalCells":84,"manhattan":{"expansions":755,"pops":708,"cells":84},"euclidean":{"expansions":980,"pops":926,"cells":84}},{"dimension":86,"board":9,"optimalCells":82,"manhattan":{"expansions":644,"pops":600,"cells":82},"euclidean":{"expansions":712,"pops":671,"cells":82}},{"dimension":87,"board":0,"optimalCells":106,"manhattan":{"expansions":1129,"pops":1021,"cells":106},"euclidean":{"expansions":2079,"pops":1975,"cells":106}},{"dimension":87,"board":1,"optimalCells":60,"manhattan":{"expansions":797,"pops":684,"cells":60},"euclidean":{"expansions":1382,"pops":1218,"cells":60}},{"dimension":87,"board":2,"optimalCells":null,"manhattan":{"expansions":1,"pops":2,"cells":0},"euclidean":{"expansions":1,"pops":2,"cells":0}},{"dimension":87,"board":3,"optimalCells":64,"manhattan":{"expansions":433,"pops":342,"cells":73},"euclidean":{"expansions":831,"pops":691,"cells":66}},{"dimension":87,"board":4,"optimalCells":null,"manhattan":{"expansions":4367,"pops":4368,"cells":0},"euclidean":{"expansions":3650,"pops":3651,"cells":0}},{"dimension":87,"board":5,"optimalCells":76,"manhattan":{"expansions":763,"pops":606,"cells":76},"euclidean":{"expansions":1664,"pops":1522,"cells":76}},{"dimension":87,"board":6,"optimalCells":67,"manhattan":{"expansions":473,"pops":338,"cells":71},"euclidean":{"expansions":1057,"pops":895,"cells":68}},{"dimension":87,"board":7,"optimalCells":48,"manhattan":{"expansions":503,"pops":450,"cells":48},"euclidean":{"expansions":571,"pops":528,"cells":48}},{"dimension":87,"board":8,"optimalCells":48,"manhattan":{"expansions":231,"pops":142,"cells":49},"euclidean":{"expansions":458,"pops":341,"cells":49}},{"dimension":87,"board":9,"optimalCells":80,"manhattan":{"expansions":1335,"pops":1182,"cells":80},"euclidean":{"expansions":2225,"pops":2047,"cells":80}},{"dimension":88,"board":0,"optimalCells":44,"manhattan":{"expansions":296,"pops":239,"cells":45},"euclidean":{"expansions":452,"pops":396,"cells":45}},{"dimension":88,"board":1,"optimalCells":87,"manhattan":{"expansions":1237,"pops":1086,"cells":87},"euclidean":{"expansions":2707,"pops":2508,"cells":87}},{"dimension":88,"board":2,"optimalCells":52,"manhattan":{"expansions":639,"pops":535,"cells":52},"euclidean":{"expansions":1049,"pops":908,"cells":52}},{"dimension":88,"board":3,"optimalCells":42,"manhattan":{"expansions":223,"pops":166,"cells":49},"euclidean":{"expansions":269,"pops":196,"cells":44}},{"dimension":88,"board":4,"optimalCells":41,"manhattan":{"expansions":194,"pops":112,"cells":46},"euclidean":{"expansions":128,"pops":63,"cells":42}},{"dimension":88,"board":5,"optimalCells":54,"manhattan":{"expansions":474,"pops":395,"cells":54},"euclidean":{"expansions":811,"pops":735,"cells":54}},{"dimension":88,"board":6,"optimalCells":123,"manhattan":{"expansions":2694,"pops":2475,"cells":123},"euclidean":{"expansions":4319,"pops":4153,"cells":123}},{"dimension":88,"board":7,"optimalCells":83,"manhattan":{"expansions":672,"pops":526,"cells":83},"euclidean":{"expansions":1735,"pops":1580,"cells":83}},{"dimension":88,"board":8,"optimalCells":22,"manhattan":{"expansions":61,"pops":22,"cells":22},"euclidean":{"expansions":61,"pops":22,"cells":22}},{"dimension":88,"board":9,"optimalCells":56,"manhattan":{"expansions":398,"pops":339,"cells":56},"euclidean":{"expansions":623,"pops":567,"cells":56}},{"dimension":89,"board":0,"optimalCells":106,"manhattan":{"expansions":1172,"pops":1075,"cells":107},"euclidean":{"expansions":1702,"pops":1620,"cells":107}},{"dimension":89,"board":1,"optimalCells":87,"manhattan":{"expansions":1000,"pops":886,"cells":87},"euclidean":{"expansions":1936,"pops":1785,"cells":87}},{"dimension":89,"board":2,"optimalCells":46,"manhattan":{"expansions":242,"pops":152,"cells":49},"euclidean":{"expansions":426,"pops":300,"cells":47}},{"dimension":89,"board":3,"optimalCells":59,"manhattan":{"expansions":409,"pops":357,"cells":71},"euclidean":{"expansions":395,"pops":333,"cells":59}},{"dimension":89,"board":4,"optimalCells":78,"manhattan":{"expansions":327,"pops":234,"cells":82},"euclidean":{"expansions":750,"pops":654,"cells":78}},{"dimension":89,"board":5,"optimalCells":116,"manhattan":{"expansions":2330,"pops":2098,"cells":116},"euclidean":{"expansions":3845,"pops":3658,"cells":116}},{"dimension":89,"board":6,"optimalCells":50,"manhattan":{"expansions":125,"pops":53,"cells":53},"euclidean":{"expansions":128,"pops":52,"cells":51}},{"dimension":89,"board":7,"optimalCells":85,"manhattan":{"expansions":347,"pops":263,"cells":86},"euclidean":{"expansions":479,"pops":383,"cells":85}},{"dimension":89,"board":8,"optimalCells":69,"manhattan":{"expansions":516,"pops":427,"cells":69},"euclidean":{"expansions":1007,"pops":926,"cells":69}},{"dimension":89,"board":9,"optimalCells":58,"manhattan":{"expansions":208,"pops":93,"cells":59},"euclidean":{"expansions":335,"pops":215,"cells":59}},{"dimension":90,"board":0,"optimalCells":99,"manhattan":{"expansions":1276,"pops":1139,"cells":99},"euclidean":{"expansions":2399,"pops":2224,"cells":99}},{"dimension":90,"board":1,"optimalCells":39,"manhattan":{"expansions":165,"pops":92,"cells":40},"euclidean":{"expansions":278,"pops":200,"cells":40}},{"dimension":90,"board":2,"optimalCells":28,"manhattan":{"expansions":65,"pops":28,"cells":28},"euclidean":{"expansions":65,"pops":28,"cells":28}},{"dimension":90,"board":3,"optimalCells":91,"manhattan":{"expansions":1165,"pops":1119,"cells":91},"euclidean":{"expansions":1711,"pops":1645,"cells":91}},{"dimension":90,"board":4,"optimalCells":47,"manhattan":{"expansions":416,"pops":335,"cells":47},"euclidean":{"expansions":488,"pops":417,"cells":47}},{"dimension":90,"board":5,"optimalCells":28,"manhattan":{"expansions":84,"pops":39,"cells":29},"euclidean":{"expansions":71,"pops":32,"cells":28}},{"dimension":90,"board":6,"optimalCells":58,"manhattan":{"expansions":167,"pops":70,"cells":60},"euclidean":{"expansions":227,"pops":112,"cells":60}},{"dimension":90,"board":7,"optimalCells":43,"manhattan":{"expansions":152,"pops":114,"cells":45},"euclidean":{"expansions":242,"pops":198,"cells":43}},{"dimension":90,"board":8,"optimalCells":83,"manhattan":{"expansions":740,"pops":677,"cells":94},"euclidean":{"expansions":1286,"pops":1174,"cells":83}},{"dimension":90,"board":9,"optimalCells":68,"manhattan":{"expansions":565,"pops":461,"cells":68},"euclidean":{"expansions":622,"pops":503,"cells":68}},{"dimension":91,"board":0,"optimalCells":59,"manhattan":{"expansions":505,"pops":408,"cells":61},"euclidean":{"expansions":899,"pops":788,"cells":60}},{"dimension":91,"board":1,"optimalCells":55,"manhattan":{"expansions":223,"pops":93,"cells":55},"euclidean":{"expansions":388,"pops":247,"cells":55}},{"dimension":91,"board":2,"optimalCells":133,"manhattan":{"expansions":2276,"pops":2137,"cells":133},"euclidean":{"expansions":2915,"pops":2842,"cells":133}},{"dimension":91,"board":3,"optimalCells":46,"manhattan":{"expansions":631,"pops":542,"cells":46},"euclidean":{"expansions":937,"pops":834,"cells":46}},{"dimension":91,"board":4,"optimalCells":23,"manhattan":{"expansions":166,"pops":123,"cells":23},"euclidean":{"expansions":244,"pops":183,"cells":23}},{"dimension":91,"board":5,"optimalCells":114,"manhattan":{"expansions":678,"pops":595,"cells":116},"euclidean":{"expansions":1449,"pops":1369,"cells":114}},{"dimension":91,"board":6,"optimalCells":23,"manhattan":{"expansions":65,"pops":23,"cells":23},"euclidean":{"expansions":65,"pops":23,"cells":23}},{"dimension":91,"board":7,"optimalCells":48,"manhattan":{"expansions":177,"pops":141,"cells":48},"euclidean":{"expansions":221,"pops":178,"cells":48}},{"dimension":91,"board":8,"optimalCells":36,"manhattan":{"expansions":280,"pops":217,"cells":36},"euclidean":{"expansions":497,"pops":401,"cells":36}},{"dimension":91,"board":9,"optimalCells":60,"manhattan":{"expansions":180,"pops":60,"cells":60},"euclidean":{"expansions":180,"pops":60,"cells":60}},{"dimension":92,"board":0,"optimalCells":37,"manhattan":{"expansions":166,"pops":86,"cells":39},"euclidean":{"expansions":179,"pops":94,"cells":38}},{"dimension":92,"board":1,"optimalCells":81,"manhattan":{"expansions":259,"pops":97,"cells":82},"euclidean":{"expansions":432,"pops":240,"cells":82}},{"dimension":92,"board":2,"optimalCells":28,"manhattan":{"expansions":245,"pops":195,"cells":28},"euclidean":{"expansions":350,"pops":284,"cells":28}},{"dimension":92,"board":3,"optimalCells":50,"manhattan":{"expansions":526,"pops":454,"cells":50},"euclidean":{"expansions":734,"pops":646,"cells":50}},{"dimension":92,"board":4,"optimalCells":150,"manhattan":{"expansions":1278,"pops":1244,"cells":150},"euclidean":{"expansions":1600,"pops":1547,"cells":150}},{"dimension":92,"board":5,"optimalCells":40,"manhattan":{"expansions":150,"pops":86,"cells":40},"euclidean":{"expansions":410,"pops":321,"cells":40}},{"dimension":92,"board":6,"optimalCells":35,"manhattan":{"expansions":108,"pops":77,"cells":38},"euclidean":{"expansions":117,"pops":69,"cells":35}},{"dimension":92,"board":7,"optimalCells":48,"manhattan":{"expansions":255,"pops":162,"cells":48},"euclidean":{"expansions":564,"pops":450,"cells":48}},{"dimension":92,"board":8,"optimalCells":62,"manhattan":{"expansions":271,"pops":200,"cells":68},"euclidean":{"expansions":458,"pops":331,"cells":62}},{"dimension":92,"board":9,"optimalCells":24,"manhattan":{"expansions":69,"pops":27,"cells":27},"euclidean":{"expansions":68,"pops":26,"cells":26}},{"dimension":93,"board":0,"optimalCells":60,"manhattan":{"expansions":442,"pops":413,"cells":60},"euclidean":{"expansions":446,"pops":415,"cells":60}},{"dimension":93,"board":1,"optimalCells":32,"manhattan":{"expansions":104,"pops":57,"cells":35},"euclidean":{"expansions":164,"pops":102,"cells":33}},{"dimension":93,"board":2,"optimalCells":37,"manhattan":{"expansions":263,"pops":232,"cells":37},"euclidean":{"expansions":284,"pops":248,"cells":37}},{"dimension":93,"board":3,"optimalCells":102,"manhattan":{"expansions":656,"pops":512,"cells":102},"euclidean":{"expansions":2552,"pops":2404,"cells":102}},{"dimension":93,"board":4,"optimalCells":19,"manhattan":{"expansions":118,"pops":82,"cells":19},"euclidean":{"expansions":169,"pops":119,"cells":19}},{"dimension":93,"board":5,"optimalCells":40,"manhattan":{"expansions":228,"pops":179,"cells":40},"euclidean":{"expansions":437,"pops":361,"cells":40}},{"dimension":93,"board":6,"optimalCells":72,"manhattan":{"expansions":351,"pops":240,"cells":81},"euclidean":{"expansions":728,"pops":621,"cells":76}},{"dimension":93,"board":7,"optimalCells":45,"manhattan":{"expansions":161,"pops":93,"cells":46},"euclidean":{"expansions":339,"pops":254,"cells":46}},{"dimension":93,"board":8,"optimalCells":22,"manhattan":{"expansions":49,"pops":24,"cells":22},"euclidean":{"expansions":48,"pops":23,"cells":22}},{"dimension":93,"board":9,"optimalCells":69,"manhattan":{"expansions":591,"pops":471,"cells":69},"euclidean":{"expansions":1244,"pops":1093,"cells":69}},{"dimension":94,"board":0,"optimalCells":125,"manhattan":{"expansions":662,"pops":571,"cells":126},"euclidean":{"expansions":957,"pops":884,"cells":125}},{"dimension":94,"board":1,"optimalCells":52,"manhattan":{"expansions":466,"pops":379,"cells":52},"euclidean":{"expansions":944,"pops":813,"cells":52}},{"dimension":94,"board":2,"optimalCells":46,"manhattan":{"expansions":137,"pops":46,"cells":46},"euclidean":{"expansions":137,"pops":46,"cells":46}},{"dimension":94,"board":3,"optimalCells":21,"manhattan":{"expansions":91,"pops":66,"cells":23},"euclidean":{"expansions":114,"pops":76,"cells":21}},{"dimension":94,"board":4,"optimalCells":55,"manhattan":{"expansions":611,"pops":510,"cells":57},"euclidean":{"expansions":961,"pops":875,"cells":55}},{"dimension":94,"board":5,"optimalCells":63,"manhattan":{"expansions":833,"pops":728,"cells":63},"euclidean":{"expansions":1283,"pops":1177,"cells":63}},{"dimension":94,"board":6,"optimalCells":null,"manhattan":{"expansions":3236,"pops":3237,"cells":0},"euclidean":{"expansions":3222,"pops":3223,"cells":0}},{"dimension":94,"board":7,"optimalCells":55,"manhattan":{"expansions":159,"pops":57,"cells":57},"euclidean":{"expansions":157,"pops":56,"cells":56}},{"dimension":94,"board":8,"optimalCells":null,"manhattan":{"expansions":370,"pops":371,"cells":0},"euclidean":{"expansions":369,"pops":370,"cells":0}},{"dimension":94,"board":9,"optimalCells":41,"manhattan":{"expansions":219,"pops":177,"cells":41},"euclidean":{"expansions":150,"pops":108,"cells":41}},{"dimension":95,"board":0,"optimalCells":24,"manhattan":{"expansions":123,"pops":79,"cells":27},"euclidean":{"expansions":156,"pops":111,"cells":24}},{"dimension":95,"board":1,"optimalCells":33,"manhattan":{"expansions":111,"pops":50,"cells":35},"euclidean":{"expansions":148,"pops":83,"cells":33}},{"dimension":95,"board":2,"optimalCells":85,"manhattan":{"expansions":1590,"pops":1410,"cells":85},"euclidean":{"expansions":2749,"pops":2520,"cells":85}},{"dimension":95,"board":3,"optimalCells":71,"manhattan":{"expansions":562,"pops":426,"cells":72},"euclidean":{"expansions":1028,"pops":932,"cells":72}},{"dimension":95,"board":4,"optimalCells":83,"manhattan":{"expansions":480,"pops":393,"cells":97},"euclidean":{"expansions":371,"pops":264,"cells":86}},{"dimension":95,"board":5,"optimalCells":95,"manhattan":{"expansions":641,"pops":452,"cells":95},"euclidean":{"expansions":1720,"pops":1491,"cells":95}},{"dimension":95,"board":6,"optimalCells":23,"manhattan":{"expansions":151,"pops":107,"cells":23},"euclidean":{"expansions":229,"pops":174,"cells":23}},{"dimension":95,"board":7,"optimalCells":46,"manhattan":{"expansions":159,"pops":80,"cells":48},"euclidean":{"expansions":330,"pops":222,"cells":47}},{"dimension":95,"board":8,"optimalCells":61,"manhattan":{"expansions":496,"pops":438,"cells":62},"euclidean":{"expansions":686,"pops":618,"cells":61}},{"dimension":95,"board":9,"optimalCells":51,"manhattan":{"expansions":169,"pops":88,"cells":57},"euclidean":{"expansions":192,"pops":108,"cells":54}},{"dimension":96,"board":0,"optimalCells":48,"manhattan":{"expansions":425,"pops":333,"cells":51},"euclidean":{"expansions":648,"pops":526,"cells":49}},{"dimension":96,"board":1,"optimalCells":31,"manhattan":{"expansions":174,"pops":135,"cells":32},"euclidean":{"expansions":250,"pops":213,"cells":31}},{"dimension":96,"board":2,"optimalCells":19,"manhattan":{"expansions":58,"pops":47,"cells":19},"euclidean":{"expansions":65,"pops":57,"cells":19}},{"dimension":96,"board":3,"optimalCells":101,"manhattan":{"expansions":882,"pops":829,"cells":102},"euclidean":{"expansions":952,"pops":891,"cells":101}},{"dimension":96,"board":4,"optimalCells":99,"manhattan":{"expansions":1597,"pops":1498,"cells":99},"euclidean":{"expansions":2049,"pops":1952,"cells":99}},{"dimension":96,"board":5,"optimalCells":13,"manhattan":{"expansions":56,"pops":32,"cells":13},"euclidean":{"expansions":66,"pops":43,"cells":13}},{"dimension":96,"board":6,"optimalCells":45,"manhattan":{"expansions":188,"pops":113,"cells":46},"euclidean":{"expansions":498,"pops":399,"cells":45}},{"dimension":96,"board":7,"optimalCells":62,"manhattan":{"expansions":196,"pops":75,"cells":63},"euclidean":{"expansions":451,"pops":279,"cells":63}},{"dimension":96,"board":8,"optimalCells":15,"manhattan":{"expansions":40,"pops":15,"cells":15},"euclidean":{"expansions":40,"pops":15,"cells":15}},{"dimension":96,"board":9,"optimalCells":35,"manhattan":{"expansions":138,"pops":75,"cells":37},"euclidean":{"expansions":277,"pops":201,"cells":36}},{"dimension":97,"board":0,"optimalCells":28,"manhattan":{"expansions":107,"pops":101,"cells":28},"euclidean":{"expansions":109,"pops":103,"cells":28}},{"dimension":97,"board":1,"optimalCells":18,"manhattan":{"expansions":58,"pops":27,"cells":19},"euclidean":{"expansions":62,"pops":33,"cells":19}},{"dimension":97,"board":2,"optimalCells":40,"manhattan":{"expansions":106,"pops":42,"cells":40},"euclidean":{"expansions":108,"pops":45,"cells":42}},{"dimension":97,"board":3,"optimalCells":42,"manhattan":{"expansions":143,"pops":110,"cells":48},"euclidean":{"expansions":254,"pops":197,"cells":42}},{"dimension":97,"board":4,"optimalCells":69,"manhattan":{"expansions":688,"pops":557,"cells":70},"euclidean":{"expansions":1219,"pops":1101,"cells":69}},{"dimension":97,"board":5,"optimalCells":91,"manhattan":{"expansions":736,"pops":660,"cells":91},"euclidean":{"expansions":967,"pops":904,"cells":91}},{"dimension":97,"board":6,"optimalCells":58,"manhattan":{"expansions":688,"pops":643,"cells":65},"euclidean":{"expansions":680,"pops":618,"cells":58}},{"dimension":97,"board":7,"optimalCells":100,"manhattan":{"expansions":369,"pops":266,"cells":110},"euclidean":{"expansions":573,"pops":433,"cells":103}},{"dimension":97,"board":8,"optimalCells":34,"manhattan":{"expansions":147,"pops":87,"cells":39},"euclidean":{"expansions":137,"pops":82,"cells":34}},{"dimension":97,"board":9,"optimalCells":46,"manhattan":{"expansions":155,"pops":83,"cells":48},"euclidean":{"expansions":270,"pops":149,"cells":46}},{"dimension":98,"board":0,"optimalCells":null,"manhattan":{"expansions":5798,"pops":5799,"cells":0},"euclidean":{"expansions":5658,"pops":5659,"cells":0}},{"dimension":98,"board":1,"optimalCells":41,"manhattan":{"expansions":205,"pops":166,"cells":46},"euclidean":{"expansions":192,"pops":146,"cells":41}},{"dimension":98,"board":2,"optimalCells":36,"manhattan":{"expansions":125,"pops":62,"cells":41},"euclidean":{"expansions":89,"pops":36,"cells":36}},{"dimension":98,"board":3,"optimalCells":44,"manhattan":{"expansions":382,"pops":295,"cells":44},"euclidean":{"expansions":685,"pops":575,"cells":44}},{"dimension":98,"board":4,"optimalCells":18,"manhattan":{"expansions":60,"pops":36,"cells":18},"euclidean":{"expansions":60,"pops":41,"cells":18}},{"dimension":98,"board":5,"optimalCells":36,"manhattan":{"expansions":246,"pops":199,"cells":36},"euclidean":{"expansions":335,"pops":284,"cells":36}},{"dimension":98,"board":6,"optimalCells":40,"manhattan":{"expansions":408,"pops":336,"cells":40},"euclidean":{"expansions":643,"pops":551,"cells":40}},{"dimension":98,"board":7,"optimalCells":25,"manhattan":{"expansions":57,"pops":30,"cells":25},"euclidean":{"expansions":49,"pops":25,"cells":25}},{"dimension":98,"board":8,"optimalCells":57,"manhattan":{"expansions":483,"pops":432,"cells":57},"euclidean":{"expansions":644,"pops":592,"cells":57}},{"dimension":98,"board":9,"optimalCells":47,"manhattan":{"expansions":174,"pops":131,"cells":58},"euclidean":{"expansions":125,"pops":87,"cells":47}},{"dimension":99,"board":0,"optimalCells":10,"manhattan":{"expansions":38,"pops":22,"cells":10},"euclidean":{"expansions":49,"pops":28,"cells":10}},{"dimension":99,"board":1,"optimalCells":60,"manhattan":{"expansions":308,"pops":242,"cells":60},"euclidean":{"expansions":785,"pops":718,"cells":60}},{"dimension":99,"board":2,"optimalCells":25,"manhattan":{"expansions":121,"pops":88,"cells":25},"euclidean":{"expansions":195,"pops":150,"cells":25}},{"dimension":99,"board":3,"optimalCells":54,"manhattan":{"expansions":362,"pops":296,"cells":54},"euclidean":{"expansions":836,"pops":756,"cells":54}},{"dimension":99,"board":4,"optimalCells":49,"manhattan":{"expansions":137,"pops":50,"cells":49},"euclidean":{"expansions":136,"pops":50,"cells":49}},{"dimension":99,"board":5,"optimalCells":62,"manhattan":{"expansions":244,"pops":202,"cells":68},"euclidean":{"expansions":451,"pops":386,"cells":62}},{"dimension":99,"board":6,"optimalCells":55,"manhattan":{"expansions":199,"pops":95,"cells":57},"euclidean":{"expansions":330,"pops":190,"cells":56}},{"dimension":99,"board":7,"optimalCells":40,"manhattan":{"expansions":214,"pops":131,"cells":41},"euclidean":{"expansions":465,"pops":371,"cells":41}},{"dimension":99,"board":8,"optimalCells":69,"manhattan":{"expansions":400,"pops":333,"cells":69},"euclidean":{"expansions":785,"pops":698,"cells":69}},{"dimension":99,"board":9,"optimalCells":20,"manhattan":{"expansions":67,"pops":29,"cells":21},"euclidean":{"expansions":70,"pops":32,"cells":21}}]} diff --git a/web/src/lib/data/load.ts b/web/src/lib/data/load.ts new file mode 100644 index 0000000..05b4be9 --- /dev/null +++ b/web/src/lib/data/load.ts @@ -0,0 +1,41 @@ +/** + * Build-time loaders for the generated study data. Read with fs (not + * `import`) so tsc does not infer types for large JSON files; only used by + * Server Components and route handlers, which run at build time. + */ +import { readFileSync } from "node:fs"; +import path from "node:path"; + +import type { PruningSample } from "@/lib/analysis/alpha-beta"; +import type { PairedStudyRow } from "@/lib/analysis/astar-paired"; +import type { PythonGame } from "@/lib/tournament/crosscheck"; +import type { GameRecord } from "@/lib/tournament/play"; + +export interface StudyMeta { + generatedBy: string; + generatedAt?: string; + node?: string; + python?: string; + cpu?: string; + implementation: string; + config: Record; + seconds?: number; +} + +const DATA_DIR = path.join(process.cwd(), "src", "lib", "data"); + +function read(name: string): T { + return JSON.parse(readFileSync(path.join(DATA_DIR, name), "utf8")) as T; +} + +export const loadReferenceTournament = () => + read<{ meta: StudyMeta; games: GameRecord[] }>("reference-tournament.json"); + +export const loadAstarStudy = () => + read<{ meta: StudyMeta; rows: PairedStudyRow[] }>("astar-paired-study.json"); + +export const loadAlphaBetaStudy = () => + read<{ meta: StudyMeta; samples: PruningSample[] }>("alpha-beta-study.json"); + +export const loadPythonCrosscheck = () => + read<{ meta: StudyMeta; games: PythonGame[] }>("python-crosscheck.json"); diff --git a/web/src/lib/data/python-crosscheck.json b/web/src/lib/data/python-crosscheck.json new file mode 100644 index 0000000..e24e295 --- /dev/null +++ b/web/src/lib/data/python-crosscheck.json @@ -0,0 +1 @@ +{"meta": {"generatedBy": "scripts/crosscheck_tournament.py", "implementation": "original Python (coursework/Project Part B), variants by patching one knob", "python": "3.12.7", "pythonHashSeed": "0", "config": {"agents": ["minimax-dynamic", "minimax-d2", "greedy", "random"], "sizes": [4, 5], "rounds": 20, "seed": 2022}, "seconds": 212.7}, "games": [{"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046105, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046105, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046106, "winner": "blue", "turns": 10}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046106, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046107, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046107, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046108, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046108, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046109, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046109, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046110, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046110, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046111, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046111, "winner": "red", "turns": 17}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046112, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046112, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046113, "winner": "blue", "turns": 20}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046113, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046114, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046114, "winner": "blue", "turns": 10}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046115, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046115, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046116, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046116, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046117, "winner": "blue", "turns": 20}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046117, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046118, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046118, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046119, "winner": "blue", "turns": 18}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046119, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046120, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046120, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046121, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046121, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046122, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046122, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046123, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046123, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022046124, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022046124, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046116, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046116, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046117, "winner": "blue", "turns": 10}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046117, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046118, "winner": "red", "turns": 13}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046118, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046119, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046119, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046120, "winner": "red", "turns": 13}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046120, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046121, "winner": "blue", "turns": 18}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046121, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046122, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046122, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046123, "winner": "red", "turns": 13}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046123, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046124, "winner": "red", "turns": 17}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046124, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046125, "winner": "red", "turns": 15}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046125, "winner": "red", "turns": 17}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046126, "winner": "red", "turns": 17}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046126, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046127, "winner": "red", "turns": 13}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046127, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046128, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046128, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046129, "winner": "red", "turns": 19}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046129, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046130, "winner": "red", "turns": 15}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046130, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046131, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046131, "winner": "blue", "turns": 18}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046132, "winner": "red", "turns": 13}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046132, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046133, "winner": "red", "turns": 17}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046133, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046134, "winner": "red", "turns": 13}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046134, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022046135, "winner": "blue", "turns": 16}, {"n": 4, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022046135, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046127, "winner": "blue", "turns": 10}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046127, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046128, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046128, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046129, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046129, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046130, "winner": "blue", "turns": 14}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046130, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046131, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046131, "winner": "blue", "turns": 10}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046132, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046132, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046133, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046133, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046134, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046134, "winner": "blue", "turns": 10}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046135, "winner": "blue", "turns": 18}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046135, "winner": "red", "turns": 7}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046136, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046136, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046137, "winner": "red", "turns": 9}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046137, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046138, "winner": "red", "turns": 9}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046138, "winner": "red", "turns": 9}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046139, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046139, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046140, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046140, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046141, "winner": "red", "turns": 19}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046141, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046142, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046142, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046143, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046143, "winner": "blue", "turns": 10}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046144, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046144, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046145, "winner": "blue", "turns": 16}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046145, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-dynamic", "blue": "random", "seed": 2022046146, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "minimax-dynamic", "seed": 2022046146, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046217, "winner": "red", "turns": 13}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046217, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046218, "winner": "blue", "turns": 16}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046218, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046219, "winner": "blue", "turns": 10}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046219, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046220, "winner": "red", "turns": 17}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046220, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046221, "winner": "red", "turns": 13}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046221, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046222, "winner": "red", "turns": 15}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046222, "winner": "red", "turns": 9}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046223, "winner": "blue", "turns": 12}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046223, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046224, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046224, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046225, "winner": "blue", "turns": 10}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046225, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046226, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046226, "winner": "red", "turns": 17}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046227, "winner": "red", "turns": 11}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046227, "winner": "red", "turns": 13}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046228, "winner": "blue", "turns": 10}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046228, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046229, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046229, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046230, "winner": "blue", "turns": 10}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046230, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046231, "winner": "red", "turns": 15}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046231, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046232, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046232, "winner": "red", "turns": 9}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046233, "winner": "red", "turns": 21}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046233, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046234, "winner": "red", "turns": 15}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046234, "winner": "red", "turns": 11}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046235, "winner": "red", "turns": 15}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046235, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "greedy", "seed": 2022046236, "winner": "red", "turns": 15}, {"n": 4, "red": "greedy", "blue": "minimax-d2", "seed": 2022046236, "winner": "blue", "turns": 10}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046228, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046228, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046229, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046229, "winner": "blue", "turns": 18}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046230, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046230, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046231, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046231, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046232, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046232, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046233, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046233, "winner": "blue", "turns": 18}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046234, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046234, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046235, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046235, "winner": "blue", "turns": 18}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046236, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046236, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046237, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046237, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046238, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046238, "winner": "blue", "turns": 14}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046239, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046239, "winner": "blue", "turns": 18}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046240, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046240, "winner": "red", "turns": 7}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046241, "winner": "red", "turns": 19}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046241, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046242, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046242, "winner": "blue", "turns": 16}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046243, "winner": "blue", "turns": 12}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046243, "winner": "blue", "turns": 12}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046244, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046244, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046245, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046245, "winner": "blue", "turns": 10}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046246, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046246, "winner": "red", "turns": 15}, {"n": 4, "red": "minimax-d2", "blue": "random", "seed": 2022046247, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "minimax-d2", "seed": 2022046247, "winner": "red", "turns": 15}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046329, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046329, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046330, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046330, "winner": "blue", "turns": 12}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046331, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046331, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046332, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046332, "winner": "blue", "turns": 18}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046333, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046333, "winner": "red", "turns": 11}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046334, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046334, "winner": "blue", "turns": 16}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046335, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046335, "winner": "blue", "turns": 14}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046336, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046336, "winner": "red", "turns": 11}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046337, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046337, "winner": "blue", "turns": 16}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046338, "winner": "blue", "turns": 14}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046338, "winner": "blue", "turns": 12}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046339, "winner": "blue", "turns": 12}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046339, "winner": "blue", "turns": 12}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046340, "winner": "blue", "turns": 14}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046340, "winner": "red", "turns": 15}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046341, "winner": "blue", "turns": 18}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046341, "winner": "blue", "turns": 16}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046342, "winner": "blue", "turns": 10}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046342, "winner": "blue", "turns": 16}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046343, "winner": "red", "turns": 11}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046343, "winner": "blue", "turns": 12}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046344, "winner": "blue", "turns": 12}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046344, "winner": "blue", "turns": 12}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046345, "winner": "red", "turns": 13}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046345, "winner": "blue", "turns": 18}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046346, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046346, "winner": "red", "turns": 13}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046347, "winner": "red", "turns": 15}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046347, "winner": "blue", "turns": 16}, {"n": 4, "red": "greedy", "blue": "random", "seed": 2022046348, "winner": "red", "turns": 17}, {"n": 4, "red": "random", "blue": "greedy", "seed": 2022046348, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056112, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056112, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056113, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056113, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056114, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056114, "winner": "blue", "turns": 28}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056115, "winner": "red", "turns": 21}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056115, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056116, "winner": "red", "turns": 29}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056116, "winner": "red", "turns": 15}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056117, "winner": "red", "turns": 29}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056117, "winner": "red", "turns": 29}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056118, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056118, "winner": "red", "turns": 23}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056119, "winner": "blue", "turns": 24}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056119, "winner": "red", "turns": 23}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056120, "winner": "red", "turns": 19}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056120, "winner": "red", "turns": 23}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056121, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056121, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056122, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056122, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056123, "winner": "red", "turns": 19}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056123, "winner": "red", "turns": 27}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056124, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056124, "winner": "blue", "turns": 16}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056125, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056125, "winner": "red", "turns": 17}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056126, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056126, "winner": "blue", "turns": 16}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056127, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056127, "winner": "blue", "turns": 28}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056128, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056128, "winner": "red", "turns": 21}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056129, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056129, "winner": "red", "turns": 27}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056130, "winner": "red", "turns": 27}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056130, "winner": "red", "turns": 25}, {"n": 5, "red": "minimax-dynamic", "blue": "minimax-d2", "seed": 2022056131, "winner": "red", "turns": 21}, {"n": 5, "red": "minimax-d2", "blue": "minimax-dynamic", "seed": 2022056131, "winner": "red", "turns": 33}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056123, "winner": "blue", "turns": 26}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056123, "winner": "red", "turns": 17}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056124, "winner": "red", "turns": 27}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056124, "winner": "red", "turns": 21}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056125, "winner": "red", "turns": 21}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056125, "winner": "blue", "turns": 16}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056126, "winner": "blue", "turns": 20}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056126, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056127, "winner": "red", "turns": 17}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056127, "winner": "blue", "turns": 16}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056128, "winner": "blue", "turns": 18}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056128, "winner": "red", "turns": 27}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056129, "winner": "blue", "turns": 24}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056129, "winner": "red", "turns": 25}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056130, "winner": "red", "turns": 19}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056130, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056131, "winner": "blue", "turns": 26}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056131, "winner": "blue", "turns": 26}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056132, "winner": "blue", "turns": 18}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056132, "winner": "red", "turns": 29}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056133, "winner": "red", "turns": 17}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056133, "winner": "red", "turns": 17}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056134, "winner": "blue", "turns": 18}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056134, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056135, "winner": "blue", "turns": 20}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056135, "winner": "red", "turns": 23}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056136, "winner": "blue", "turns": 34}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056136, "winner": "red", "turns": 19}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056137, "winner": "blue", "turns": 22}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056137, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056138, "winner": "red", "turns": 21}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056138, "winner": "red", "turns": 19}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056139, "winner": "red", "turns": 29}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056139, "winner": "red", "turns": 21}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056140, "winner": "blue", "turns": 18}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056140, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056141, "winner": "red", "turns": 19}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056141, "winner": "blue", "turns": 16}, {"n": 5, "red": "minimax-dynamic", "blue": "greedy", "seed": 2022056142, "winner": "red", "turns": 19}, {"n": 5, "red": "greedy", "blue": "minimax-dynamic", "seed": 2022056142, "winner": "red", "turns": 23}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056134, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056134, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056135, "winner": "red", "turns": 31}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056135, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056136, "winner": "blue", "turns": 30}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056136, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056137, "winner": "red", "turns": 25}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056137, "winner": "blue", "turns": 26}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056138, "winner": "blue", "turns": 24}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056138, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056139, "winner": "red", "turns": 21}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056139, "winner": "blue", "turns": 28}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056140, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056140, "winner": "blue", "turns": 28}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056141, "winner": "red", "turns": 23}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056141, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056142, "winner": "red", "turns": 23}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056142, "winner": "blue", "turns": 28}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056143, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056143, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056144, "winner": "red", "turns": 29}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056144, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056145, "winner": "blue", "turns": 22}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056145, "winner": "blue", "turns": 12}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056146, "winner": "red", "turns": 23}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056146, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056147, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056147, "winner": "blue", "turns": 26}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056148, "winner": "red", "turns": 17}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056148, "winner": "blue", "turns": 24}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056149, "winner": "red", "turns": 17}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056149, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056150, "winner": "red", "turns": 27}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056150, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056151, "winner": "red", "turns": 15}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056151, "winner": "blue", "turns": 24}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056152, "winner": "red", "turns": 17}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056152, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-dynamic", "blue": "random", "seed": 2022056153, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "minimax-dynamic", "seed": 2022056153, "winner": "red", "turns": 21}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056224, "winner": "red", "turns": 19}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056224, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056225, "winner": "red", "turns": 25}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056225, "winner": "blue", "turns": 26}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056226, "winner": "blue", "turns": 18}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056226, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056227, "winner": "blue", "turns": 24}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056227, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056228, "winner": "red", "turns": 21}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056228, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056229, "winner": "blue", "turns": 14}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056229, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056230, "winner": "blue", "turns": 22}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056230, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056231, "winner": "blue", "turns": 20}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056231, "winner": "red", "turns": 25}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056232, "winner": "red", "turns": 23}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056232, "winner": "red", "turns": 21}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056233, "winner": "red", "turns": 23}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056233, "winner": "blue", "turns": 24}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056234, "winner": "blue", "turns": 20}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056234, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056235, "winner": "red", "turns": 15}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056235, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056236, "winner": "blue", "turns": 26}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056236, "winner": "blue", "turns": 24}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056237, "winner": "blue", "turns": 18}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056237, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056238, "winner": "blue", "turns": 16}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056238, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056239, "winner": "red", "turns": 25}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056239, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056240, "winner": "blue", "turns": 16}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056240, "winner": "blue", "turns": 16}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056241, "winner": "blue", "turns": 20}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056241, "winner": "red", "turns": 29}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056242, "winner": "red", "turns": 23}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056242, "winner": "red", "turns": 19}, {"n": 5, "red": "minimax-d2", "blue": "greedy", "seed": 2022056243, "winner": "blue", "turns": 22}, {"n": 5, "red": "greedy", "blue": "minimax-d2", "seed": 2022056243, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056235, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056235, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056236, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056236, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056237, "winner": "red", "turns": 29}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056237, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056238, "winner": "red", "turns": 23}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056238, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056239, "winner": "blue", "turns": 26}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056239, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056240, "winner": "red", "turns": 23}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056240, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056241, "winner": "red", "turns": 27}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056241, "winner": "blue", "turns": 24}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056242, "winner": "red", "turns": 21}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056242, "winner": "blue", "turns": 34}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056243, "winner": "red", "turns": 27}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056243, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056244, "winner": "red", "turns": 25}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056244, "winner": "blue", "turns": 24}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056245, "winner": "red", "turns": 27}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056245, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056246, "winner": "red", "turns": 17}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056246, "winner": "blue", "turns": 22}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056247, "winner": "red", "turns": 25}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056247, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056248, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056248, "winner": "blue", "turns": 18}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056249, "winner": "red", "turns": 23}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056249, "winner": "blue", "turns": 14}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056250, "winner": "red", "turns": 15}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056250, "winner": "blue", "turns": 24}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056251, "winner": "red", "turns": 25}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056251, "winner": "blue", "turns": 24}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056252, "winner": "red", "turns": 25}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056252, "winner": "blue", "turns": 20}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056253, "winner": "red", "turns": 21}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056253, "winner": "blue", "turns": 28}, {"n": 5, "red": "minimax-d2", "blue": "random", "seed": 2022056254, "winner": "red", "turns": 23}, {"n": 5, "red": "random", "blue": "minimax-d2", "seed": 2022056254, "winner": "blue", "turns": 14}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056336, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056336, "winner": "red", "turns": 17}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056337, "winner": "red", "turns": 23}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056337, "winner": "blue", "turns": 24}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056338, "winner": "blue", "turns": 22}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056338, "winner": "blue", "turns": 16}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056339, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056339, "winner": "blue", "turns": 22}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056340, "winner": "red", "turns": 25}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056340, "winner": "blue", "turns": 20}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056341, "winner": "red", "turns": 15}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056341, "winner": "blue", "turns": 14}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056342, "winner": "red", "turns": 17}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056342, "winner": "blue", "turns": 26}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056343, "winner": "red", "turns": 17}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056343, "winner": "blue", "turns": 18}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056344, "winner": "red", "turns": 21}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056344, "winner": "blue", "turns": 20}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056345, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056345, "winner": "blue", "turns": 26}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056346, "winner": "red", "turns": 19}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056346, "winner": "blue", "turns": 26}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056347, "winner": "red", "turns": 27}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056347, "winner": "red", "turns": 25}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056348, "winner": "red", "turns": 23}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056348, "winner": "blue", "turns": 18}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056349, "winner": "red", "turns": 17}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056349, "winner": "blue", "turns": 32}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056350, "winner": "red", "turns": 27}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056350, "winner": "blue", "turns": 22}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056351, "winner": "red", "turns": 25}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056351, "winner": "red", "turns": 19}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056352, "winner": "red", "turns": 17}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056352, "winner": "blue", "turns": 32}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056353, "winner": "red", "turns": 15}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056353, "winner": "blue", "turns": 24}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056354, "winner": "red", "turns": 21}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056354, "winner": "blue", "turns": 16}, {"n": 5, "red": "greedy", "blue": "random", "seed": 2022056355, "winner": "red", "turns": 13}, {"n": 5, "red": "random", "blue": "greedy", "seed": 2022056355, "winner": "blue", "turns": 18}]} diff --git a/web/src/lib/data/reference-config.ts b/web/src/lib/data/reference-config.ts new file mode 100644 index 0000000..41b8b16 --- /dev/null +++ b/web/src/lib/data/reference-config.ts @@ -0,0 +1,28 @@ +/** + * Configurations of the precomputed reference studies (see + * web/scripts/generate-reference-studies.ts). Kept in one place so the pages + * can state exactly how each result was produced. + */ +import type { AgentId } from "@/lib/tournament/agents"; + +export const REFERENCE_TOURNAMENT_CONFIG = { + agents: ["minimax-dynamic", "minimax-d2", "minimax-d3", "greedy", "random"] as AgentId[], + sizes: [4, 5, 6], + /** Colour-swapped pairs per pairing per size → 40 games per pairing per size. */ + rounds: 20, + seed: 2022, +}; + +export const ASTAR_STUDY_CONFIG = { + /** The notebook's range: every board size from 2 to 99. */ + dimensions: Array.from({ length: 98 }, (_, i) => i + 2), + boardsPerDimension: 10, + seed: 2022, +}; + +export const ALPHA_BETA_CONFIG = { + sizes: [4, 5, 6], + perSize: 40, + depths: [2, 3], + seed: 2022, +}; diff --git a/web/src/lib/data/reference-tournament.json b/web/src/lib/data/reference-tournament.json new file mode 100644 index 0000000..600801e --- /dev/null +++ b/web/src/lib/data/reference-tournament.json @@ -0,0 +1 @@ +{"meta":{"generatedBy":"web/scripts/generate-reference-studies.ts","generatedAt":"2026-10-05","node":"v26.10.0","cpu":"Apple M4","implementation":"TypeScript port (parity-tested against the original Python)","config":{"agents":["minimax-dynamic","minimax-d2","minimax-d3","greedy","random"],"sizes":[4,5,6],"rounds":20,"seed":2022}},"games":[{"id":"4:minimax-dynamic:minimax-d2:0:a","n":4,"seed":2697343011,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":2.677,"maxMs":1.358,"nodes":84,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.21,"maxMs":3.381,"nodes":651,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:0:b","n":4,"seed":2697343011,"round":0,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d2","moves":6,"totalMs":3.176,"maxMs":0.959,"nodes":602,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.388,"maxMs":0.11,"nodes":50,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:1:a","n":4,"seed":1282145319,"round":1,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.459,"maxMs":0.096,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":3.92,"maxMs":1.323,"nodes":545,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:1:b","n":4,"seed":1282145319,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":3.925,"maxMs":1.261,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.617,"maxMs":0.211,"nodes":48,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:2:a","n":4,"seed":1793063484,"round":2,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.516,"maxMs":0.189,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":2.689,"maxMs":0.845,"nodes":545,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:2:b","n":4,"seed":1793063484,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.82,"maxMs":0.676,"nodes":690,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.64,"maxMs":0.193,"nodes":60,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:3:a","n":4,"seed":3157601157,"round":3,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.415,"maxMs":0.111,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":2.299,"maxMs":0.655,"nodes":545,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:3:b","n":4,"seed":3157601157,"round":3,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":3.716,"maxMs":0.806,"nodes":818,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.731,"maxMs":0.166,"nodes":77,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:4:a","n":4,"seed":3825177986,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.494,"maxMs":0.119,"nodes":68,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":2.406,"maxMs":0.672,"nodes":547,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:4:b","n":4,"seed":3825177986,"round":4,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d2","moves":10,"totalMs":3.518,"maxMs":0.913,"nodes":780,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.641,"maxMs":0.135,"nodes":78,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:5:a","n":4,"seed":285257503,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.471,"maxMs":0.108,"nodes":68,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":2.379,"maxMs":0.661,"nodes":547,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:5:b","n":4,"seed":285257503,"round":5,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":3.229,"maxMs":0.681,"nodes":678,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.464,"maxMs":0.114,"nodes":62,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:6:a","n":4,"seed":1906584895,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.573,"maxMs":0.189,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":2.412,"maxMs":0.829,"nodes":508,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:6:b","n":4,"seed":1906584895,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d2","moves":7,"totalMs":3.559,"maxMs":1.019,"nodes":678,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.493,"maxMs":0.164,"nodes":55,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:7:a","n":4,"seed":287260280,"round":7,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.422,"maxMs":0.072,"nodes":66,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":2.402,"maxMs":0.647,"nodes":562,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:7:b","n":4,"seed":287260280,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":2.592,"maxMs":0.725,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.355,"maxMs":0.125,"nodes":48,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:8:a","n":4,"seed":522595925,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.458,"maxMs":0.099,"nodes":70,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":2.459,"maxMs":0.697,"nodes":575,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:8:b","n":4,"seed":522595925,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":2.515,"maxMs":0.663,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.3,"maxMs":0.072,"nodes":48,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:9:a","n":4,"seed":413321559,"round":9,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.449,"maxMs":0.113,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":2.423,"maxMs":0.792,"nodes":545,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:9:b","n":4,"seed":413321559,"round":9,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":4.507,"maxMs":1.734,"nodes":736,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.841,"maxMs":0.23,"nodes":66,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:10:a","n":4,"seed":669628618,"round":10,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.284,"maxMs":0.074,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":2.199,"maxMs":0.748,"nodes":508,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:10:b","n":4,"seed":669628618,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d2","moves":10,"totalMs":3.604,"maxMs":0.724,"nodes":879,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.555,"maxMs":0.103,"nodes":80,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:11:a","n":4,"seed":1005057571,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.461,"maxMs":0.129,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":2.196,"maxMs":0.719,"nodes":508,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:11:b","n":4,"seed":1005057571,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d2","moves":10,"totalMs":4.143,"maxMs":0.688,"nodes":918,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.762,"maxMs":0.227,"nodes":84,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:12:a","n":4,"seed":29841239,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.39,"maxMs":0.068,"nodes":68,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":2.292,"maxMs":0.634,"nodes":547,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:12:b","n":4,"seed":29841239,"round":12,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":3.525,"maxMs":0.985,"nodes":736,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.428,"maxMs":0.097,"nodes":66,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:13:a","n":4,"seed":331591001,"round":13,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.64,"maxMs":0.101,"nodes":90,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":3.389,"maxMs":0.676,"nodes":725,"searches":9,"deepSearches":9,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:13:b","n":4,"seed":331591001,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":2.599,"maxMs":0.72,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.274,"maxMs":0.07,"nodes":48,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:14:a","n":4,"seed":1883898108,"round":14,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.642,"maxMs":0.157,"nodes":70,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":3.236,"maxMs":0.905,"nodes":581,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:14:b","n":4,"seed":1883898108,"round":14,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.604,"maxMs":0.655,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.395,"maxMs":0.091,"nodes":60,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:15:a","n":4,"seed":2890127628,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.459,"maxMs":0.105,"nodes":72,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":2.412,"maxMs":0.606,"nodes":564,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:15:b","n":4,"seed":2890127628,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":2.298,"maxMs":0.627,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.269,"maxMs":0.09,"nodes":48,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:16:a","n":4,"seed":4089049837,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.283,"maxMs":0.073,"nodes":68,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.747,"maxMs":0.461,"nodes":547,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:16:b","n":4,"seed":4089049837,"round":16,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":2.21,"maxMs":0.636,"nodes":684,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.23,"maxMs":0.048,"nodes":59,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:17:a","n":4,"seed":359974136,"round":17,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.431,"maxMs":0.106,"nodes":72,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":2.451,"maxMs":0.615,"nodes":599,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:17:b","n":4,"seed":359974136,"round":17,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":2.064,"maxMs":0.542,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.24,"maxMs":0.053,"nodes":55,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:18:a","n":4,"seed":619441063,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.371,"maxMs":0.061,"nodes":84,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":2.296,"maxMs":0.526,"nodes":651,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:18:b","n":4,"seed":619441063,"round":18,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.923,"maxMs":0.489,"nodes":652,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.264,"maxMs":0.08,"nodes":57,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:19:a","n":4,"seed":3542338713,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.35,"maxMs":0.088,"nodes":66,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.727,"maxMs":0.49,"nodes":545,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d2:19:b","n":4,"seed":3542338713,"round":19,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.048,"maxMs":0.487,"nodes":678,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.253,"maxMs":0.047,"nodes":62,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:0:a","n":4,"seed":1325686512,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-dynamic","moves":5,"totalMs":0.271,"maxMs":0.098,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":15.048,"maxMs":6.981,"nodes":4703,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:0:b","n":4,"seed":1325686512,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d3","moves":8,"totalMs":21.533,"maxMs":7.666,"nodes":6934,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.323,"maxMs":0.081,"nodes":60,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:1:a","n":4,"seed":2575660283,"round":1,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.577,"maxMs":0.308,"nodes":66,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":17.345,"maxMs":6.499,"nodes":5247,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:1:b","n":4,"seed":2575660283,"round":1,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":19.192,"maxMs":7.02,"nodes":6552,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.24,"maxMs":0.094,"nodes":48,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:2:a","n":4,"seed":190517020,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.331,"maxMs":0.102,"nodes":62,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":15.666,"maxMs":6.36,"nodes":4929,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:2:b","n":4,"seed":190517020,"round":2,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":20.391,"maxMs":6.743,"nodes":6932,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.379,"maxMs":0.093,"nodes":65,"searches":7,"deepSearches":1,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:3:a","n":4,"seed":1578310835,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.245,"maxMs":0.057,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":15.489,"maxMs":6.46,"nodes":4935,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:3:b","n":4,"seed":1578310835,"round":3,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":21.76,"maxMs":7.121,"nodes":6940,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.301,"maxMs":0.057,"nodes":62,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:4:a","n":4,"seed":1165657324,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-dynamic","moves":5,"totalMs":0.198,"maxMs":0.055,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.896,"maxMs":6.446,"nodes":4681,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:4:b","n":4,"seed":1165657324,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d3","moves":7,"totalMs":19.468,"maxMs":6.917,"nodes":6846,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.298,"maxMs":0.101,"nodes":55,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:5:a","n":4,"seed":1929689094,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.274,"maxMs":0.085,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":15.326,"maxMs":6.396,"nodes":5123,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:5:b","n":4,"seed":1929689094,"round":5,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":19.551,"maxMs":6.804,"nodes":6935,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.304,"maxMs":0.05,"nodes":65,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:6:a","n":4,"seed":878395786,"round":6,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.299,"maxMs":0.057,"nodes":66,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":15.715,"maxMs":6.012,"nodes":5229,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:6:b","n":4,"seed":878395786,"round":6,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":20.182,"maxMs":6.913,"nodes":6924,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.301,"maxMs":0.061,"nodes":62,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:7:a","n":4,"seed":3570703529,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.326,"maxMs":0.058,"nodes":70,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":16.37,"maxMs":5.724,"nodes":5282,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:7:b","n":4,"seed":3570703529,"round":7,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":20.414,"maxMs":6.415,"nodes":7175,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.353,"maxMs":0.122,"nodes":64,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:8:a","n":4,"seed":3329959345,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.279,"maxMs":0.064,"nodes":66,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":16.268,"maxMs":5.646,"nodes":5261,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:8:b","n":4,"seed":3329959345,"round":8,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.305,"maxMs":6.664,"nodes":6892,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.271,"maxMs":0.051,"nodes":60,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:9:a","n":4,"seed":3770760132,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-dynamic","moves":5,"totalMs":0.241,"maxMs":0.091,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.954,"maxMs":6.358,"nodes":4712,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:9:b","n":4,"seed":3770760132,"round":9,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.895,"maxMs":6.678,"nodes":6924,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.293,"maxMs":0.064,"nodes":60,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:10:a","n":4,"seed":1322819714,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-dynamic","moves":5,"totalMs":0.231,"maxMs":0.087,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.8,"maxMs":5.972,"nodes":4699,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:10:b","n":4,"seed":1322819714,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d3","moves":7,"totalMs":19.765,"maxMs":6.546,"nodes":6990,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.246,"maxMs":0.051,"nodes":55,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:11:a","n":4,"seed":926006190,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.29,"maxMs":0.053,"nodes":66,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":16.094,"maxMs":6.095,"nodes":5259,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:11:b","n":4,"seed":926006190,"round":11,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":21.263,"maxMs":7.22,"nodes":7175,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.325,"maxMs":0.061,"nodes":64,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:12:a","n":4,"seed":2211736213,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-dynamic","moves":5,"totalMs":0.197,"maxMs":0.052,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.616,"maxMs":6.161,"nodes":4683,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:12:b","n":4,"seed":2211736213,"round":12,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":21.17,"maxMs":7.812,"nodes":6556,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.354,"maxMs":0.188,"nodes":48,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:13:a","n":4,"seed":1474854407,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.344,"maxMs":0.1,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":15.889,"maxMs":5.994,"nodes":5106,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:13:b","n":4,"seed":1474854407,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d3","moves":9,"totalMs":20.489,"maxMs":6.615,"nodes":7091,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.344,"maxMs":0.054,"nodes":67,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:14:a","n":4,"seed":1288345184,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.256,"maxMs":0.061,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":16,"maxMs":6.159,"nodes":5125,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:14:b","n":4,"seed":1288345184,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d3","moves":11,"totalMs":22.658,"maxMs":6.608,"nodes":7634,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.441,"maxMs":0.059,"nodes":83,"searches":9,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:15:a","n":4,"seed":896408338,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-dynamic","moves":5,"totalMs":0.381,"maxMs":0.192,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.479,"maxMs":6.047,"nodes":4697,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:15:b","n":4,"seed":896408338,"round":15,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":23.895,"maxMs":6.838,"nodes":8050,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.435,"maxMs":0.118,"nodes":77,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:16:a","n":4,"seed":1329366132,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.35,"maxMs":0.065,"nodes":66,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":18.072,"maxMs":6.103,"nodes":5271,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:16:b","n":4,"seed":1329366132,"round":16,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":21.277,"maxMs":6.595,"nodes":6920,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.529,"maxMs":0.215,"nodes":62,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:17:a","n":4,"seed":3084461827,"round":17,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.289,"maxMs":0.063,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":16.94,"maxMs":6.473,"nodes":5103,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:17:b","n":4,"seed":3084461827,"round":17,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.923,"maxMs":6.746,"nodes":6938,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.308,"maxMs":0.061,"nodes":62,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:18:a","n":4,"seed":3198742483,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-dynamic","moves":5,"totalMs":0.26,"maxMs":0.09,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.84,"maxMs":6.097,"nodes":4710,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:18:b","n":4,"seed":3198742483,"round":18,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.949,"maxMs":6.531,"nodes":7126,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.289,"maxMs":0.052,"nodes":64,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:19:a","n":4,"seed":1188079619,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-dynamic","moves":5,"totalMs":0.187,"maxMs":0.051,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.635,"maxMs":6.111,"nodes":4709,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-dynamic:minimax-d3:19:b","n":4,"seed":1188079619,"round":19,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":18.646,"maxMs":6.706,"nodes":6858,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.232,"maxMs":0.052,"nodes":57,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:0:a","n":4,"seed":463822163,"round":0,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.287,"maxMs":0.091,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.337,"maxMs":0.105,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:0:b","n":4,"seed":463822163,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.376,"maxMs":0.079,"nodes":82,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.267,"maxMs":0.048,"nodes":54,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:1:a","n":4,"seed":2309501453,"round":1,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.194,"maxMs":0.051,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.266,"maxMs":0.088,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:1:b","n":4,"seed":2309501453,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.248,"maxMs":0.046,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.193,"maxMs":0.047,"nodes":44,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:2:a","n":4,"seed":3109754803,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.274,"maxMs":0.047,"nodes":70,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.344,"maxMs":0.094,"nodes":74,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:2:b","n":4,"seed":3109754803,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.42,"maxMs":0.116,"nodes":76,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.26,"maxMs":0.089,"nodes":46,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:3:a","n":4,"seed":1762577907,"round":3,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.339,"maxMs":0.123,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.331,"maxMs":0.09,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:3:b","n":4,"seed":1762577907,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.388,"maxMs":0.096,"nodes":82,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.267,"maxMs":0.046,"nodes":54,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:4:a","n":4,"seed":1646671091,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.253,"maxMs":0.045,"nodes":66,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.268,"maxMs":0.047,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:4:b","n":4,"seed":1646671091,"round":4,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.32,"maxMs":0.096,"nodes":74,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.24,"maxMs":0.051,"nodes":54,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:5:a","n":4,"seed":4046245596,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.434,"maxMs":0.092,"nodes":96,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.392,"maxMs":0.05,"nodes":101,"searches":9,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:5:b","n":4,"seed":4046245596,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"greedy","moves":5,"totalMs":0.201,"maxMs":0.044,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.135,"maxMs":0.045,"nodes":36,"searches":3,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:6:a","n":4,"seed":3333187376,"round":6,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.259,"maxMs":0.044,"nodes":68,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.33,"maxMs":0.081,"nodes":81,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:6:b","n":4,"seed":3333187376,"round":6,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.282,"maxMs":0.046,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.213,"maxMs":0.043,"nodes":52,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:7:a","n":4,"seed":1552084852,"round":7,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.178,"maxMs":0.046,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.213,"maxMs":0.046,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:7:b","n":4,"seed":1552084852,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.258,"maxMs":0.052,"nodes":74,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.232,"maxMs":0.053,"nodes":44,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:8:a","n":4,"seed":3283250160,"round":8,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.177,"maxMs":0.046,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.212,"maxMs":0.046,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:8:b","n":4,"seed":3283250160,"round":8,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.254,"maxMs":0.045,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.311,"maxMs":0.133,"nodes":50,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:9:a","n":4,"seed":753177673,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.224,"maxMs":0.048,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.235,"maxMs":0.047,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:9:b","n":4,"seed":753177673,"round":9,"result":"win","winner":"red","drawReason":null,"turns":9,"red":{"agent":"greedy","moves":5,"totalMs":0.19,"maxMs":0.064,"nodes":56,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":4,"totalMs":0.135,"maxMs":0.046,"nodes":36,"searches":3,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:10:a","n":4,"seed":676223646,"round":10,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.268,"maxMs":0.078,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.269,"maxMs":0.052,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:10:b","n":4,"seed":676223646,"round":10,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.331,"maxMs":0.105,"nodes":77,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.233,"maxMs":0.055,"nodes":55,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:11:a","n":4,"seed":2180504651,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.332,"maxMs":0.057,"nodes":76,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.323,"maxMs":0.05,"nodes":83,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:11:b","n":4,"seed":2180504651,"round":11,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.209,"maxMs":0.046,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.217,"maxMs":0.082,"nodes":44,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:12:a","n":4,"seed":3816490963,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.307,"maxMs":0.054,"nodes":76,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.339,"maxMs":0.08,"nodes":81,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:12:b","n":4,"seed":3816490963,"round":12,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.249,"maxMs":0.084,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.174,"maxMs":0.045,"nodes":44,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:13:a","n":4,"seed":2930697538,"round":13,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.216,"maxMs":0.044,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.289,"maxMs":0.083,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:13:b","n":4,"seed":2930697538,"round":13,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.21,"maxMs":0.046,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.21,"maxMs":0.076,"nodes":44,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:14:a","n":4,"seed":2922631138,"round":14,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.178,"maxMs":0.049,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.269,"maxMs":0.094,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:14:b","n":4,"seed":2922631138,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.252,"maxMs":0.046,"nodes":76,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.186,"maxMs":0.046,"nodes":46,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:15:a","n":4,"seed":2027012120,"round":15,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.173,"maxMs":0.048,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.259,"maxMs":0.087,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:15:b","n":4,"seed":2027012120,"round":15,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.218,"maxMs":0.048,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.184,"maxMs":0.049,"nodes":44,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:16:a","n":4,"seed":950847575,"round":16,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.256,"maxMs":0.083,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.282,"maxMs":0.074,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:16:b","n":4,"seed":950847575,"round":16,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.272,"maxMs":0.054,"nodes":74,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.238,"maxMs":0.052,"nodes":54,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:17:a","n":4,"seed":283106451,"round":17,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.174,"maxMs":0.045,"nodes":52,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.262,"maxMs":0.09,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:17:b","n":4,"seed":283106451,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.318,"maxMs":0.045,"nodes":82,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.311,"maxMs":0.062,"nodes":54,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:18:a","n":4,"seed":3445234118,"round":18,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.337,"maxMs":0.13,"nodes":62,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.324,"maxMs":0.065,"nodes":76,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:18:b","n":4,"seed":3445234118,"round":18,"result":"win","winner":"red","drawReason":null,"turns":9,"red":{"agent":"greedy","moves":5,"totalMs":0.164,"maxMs":0.043,"nodes":56,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":4,"totalMs":0.142,"maxMs":0.052,"nodes":36,"searches":3,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:19:a","n":4,"seed":3722051402,"round":19,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.233,"maxMs":0.058,"nodes":60,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.261,"maxMs":0.051,"nodes":74,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:greedy:19:b","n":4,"seed":3722051402,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.348,"maxMs":0.09,"nodes":85,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.255,"maxMs":0.062,"nodes":56,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:0:a","n":4,"seed":1077779755,"round":0,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.356,"maxMs":0.058,"nodes":78,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.224,"maxMs":0.134,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:0:b","n":4,"seed":1077779755,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.024,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.198,"maxMs":0.051,"nodes":48,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:1:a","n":4,"seed":1247481347,"round":1,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.329,"maxMs":0.095,"nodes":68,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.027,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:1:b","n":4,"seed":1247481347,"round":1,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"random","moves":8,"totalMs":0.028,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.256,"maxMs":0.05,"nodes":54,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:2:a","n":4,"seed":975105033,"round":2,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.278,"maxMs":0.05,"nodes":66,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.025,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:2:b","n":4,"seed":975105033,"round":2,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"random","moves":9,"totalMs":0.036,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.338,"maxMs":0.093,"nodes":66,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:3:a","n":4,"seed":158381940,"round":3,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.283,"maxMs":0.053,"nodes":76,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.028,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:3:b","n":4,"seed":158381940,"round":3,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"random","moves":9,"totalMs":0.039,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.364,"maxMs":0.08,"nodes":66,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:4:a","n":4,"seed":2395322408,"round":4,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.175,"maxMs":0.046,"nodes":54,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.016,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:4:b","n":4,"seed":2395322408,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.052,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.353,"maxMs":0.045,"nodes":70,"searches":9,"deepSearches":1,"illegal":0}},{"id":"4:minimax-dynamic:random:5:a","n":4,"seed":3788329792,"round":5,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.321,"maxMs":0.089,"nodes":64,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.026,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:5:b","n":4,"seed":3788329792,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.023,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.24,"maxMs":0.054,"nodes":50,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:6:a","n":4,"seed":2811393122,"round":6,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.397,"maxMs":0.057,"nodes":86,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":9,"totalMs":0.039,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:6:b","n":4,"seed":2811393122,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.017,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.227,"maxMs":0.081,"nodes":52,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:7:a","n":4,"seed":4178541482,"round":7,"result":"win","winner":"red","drawReason":null,"turns":9,"red":{"agent":"minimax-dynamic","moves":5,"totalMs":0.126,"maxMs":0.041,"nodes":42,"searches":3,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":4,"totalMs":0.012,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:7:b","n":4,"seed":4178541482,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.037,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.357,"maxMs":0.12,"nodes":58,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:8:a","n":4,"seed":2857838620,"round":8,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.197,"maxMs":0.048,"nodes":50,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.016,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:8:b","n":4,"seed":2857838620,"round":8,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"random","moves":6,"totalMs":0.023,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.247,"maxMs":0.103,"nodes":44,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:9:a","n":4,"seed":1829656933,"round":9,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.273,"maxMs":0.047,"nodes":62,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.026,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:9:b","n":4,"seed":1829656933,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.013,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.146,"maxMs":0.046,"nodes":38,"searches":3,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:10:a","n":4,"seed":3772418401,"round":10,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.213,"maxMs":0.055,"nodes":50,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.018,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:10:b","n":4,"seed":3772418401,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.024,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.284,"maxMs":0.099,"nodes":54,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:11:a","n":4,"seed":3053271800,"round":11,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.317,"maxMs":0.049,"nodes":73,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.031,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:11:b","n":4,"seed":3053271800,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.022,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.233,"maxMs":0.048,"nodes":56,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:12:a","n":4,"seed":1833408530,"round":12,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.323,"maxMs":0.088,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.025,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:12:b","n":4,"seed":1833408530,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.022,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":5,"totalMs":0.142,"maxMs":0.049,"nodes":36,"searches":3,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:13:a","n":4,"seed":3958780920,"round":13,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.268,"maxMs":0.049,"nodes":68,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.025,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:13:b","n":4,"seed":3958780920,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.051,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.506,"maxMs":0.111,"nodes":94,"searches":9,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:14:a","n":4,"seed":3920536134,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.266,"maxMs":0.049,"nodes":60,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.02,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:14:b","n":4,"seed":3920536134,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.022,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.311,"maxMs":0.103,"nodes":60,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:15:a","n":4,"seed":516430859,"round":15,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.362,"maxMs":0.046,"nodes":80,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.037,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:15:b","n":4,"seed":516430859,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.024,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.287,"maxMs":0.056,"nodes":64,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:16:a","n":4,"seed":761750165,"round":16,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.27,"maxMs":0.092,"nodes":55,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.015,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:16:b","n":4,"seed":761750165,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.026,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.185,"maxMs":0.045,"nodes":44,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:17:a","n":4,"seed":734829983,"round":17,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.194,"maxMs":0.061,"nodes":54,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.012,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:17:b","n":4,"seed":734829983,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.018,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.227,"maxMs":0.054,"nodes":50,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:18:a","n":4,"seed":3588409252,"round":18,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.308,"maxMs":0.083,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.019,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:18:b","n":4,"seed":3588409252,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.022,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.278,"maxMs":0.05,"nodes":66,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:19:a","n":4,"seed":1343996072,"round":19,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.223,"maxMs":0.046,"nodes":66,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.014,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-dynamic:random:19:b","n":4,"seed":1343996072,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.013,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":6,"totalMs":0.246,"maxMs":0.095,"nodes":50,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:0:a","n":4,"seed":1286578329,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.813,"maxMs":0.422,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":16.033,"maxMs":6.72,"nodes":5102,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:0:b","n":4,"seed":1286578329,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d3","moves":8,"totalMs":22.091,"maxMs":6.89,"nodes":7416,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":2.055,"maxMs":0.463,"nodes":612,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:1:a","n":4,"seed":807579707,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.914,"maxMs":0.462,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":16.835,"maxMs":6.251,"nodes":5271,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:1:b","n":4,"seed":807579707,"round":1,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":23.115,"maxMs":6.7,"nodes":7837,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":2.591,"maxMs":0.494,"nodes":742,"searches":10,"deepSearches":10,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:2:a","n":4,"seed":2665367694,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-d2","moves":5,"totalMs":1.582,"maxMs":0.449,"nodes":600,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":12.887,"maxMs":5.576,"nodes":4699,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:2:b","n":4,"seed":2665367694,"round":2,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":17.885,"maxMs":6.745,"nodes":6558,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.437,"maxMs":0.429,"nodes":508,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:3:a","n":4,"seed":526854556,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.981,"maxMs":0.52,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":15.636,"maxMs":5.781,"nodes":5289,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:3:b","n":4,"seed":526854556,"round":3,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":18.969,"maxMs":6.361,"nodes":6898,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.688,"maxMs":0.428,"nodes":562,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:4:a","n":4,"seed":1602159095,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.839,"maxMs":0.427,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":16.103,"maxMs":5.74,"nodes":5096,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:4:b","n":4,"seed":1602159095,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.622,"maxMs":6.813,"nodes":6926,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.66,"maxMs":0.423,"nodes":562,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:5:a","n":4,"seed":2576710799,"round":5,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.875,"maxMs":0.469,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":15.286,"maxMs":6.071,"nodes":5139,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:5:b","n":4,"seed":2576710799,"round":5,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":19.235,"maxMs":6.846,"nodes":6934,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.761,"maxMs":0.45,"nodes":567,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:6:a","n":4,"seed":1472758852,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-d2","moves":5,"totalMs":1.605,"maxMs":0.416,"nodes":600,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.698,"maxMs":5.944,"nodes":4679,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:6:b","n":4,"seed":1472758852,"round":6,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":18.024,"maxMs":6.682,"nodes":6586,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.571,"maxMs":0.446,"nodes":544,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:7:a","n":4,"seed":3663229386,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.982,"maxMs":0.48,"nodes":700,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":15.749,"maxMs":5.625,"nodes":5275,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:7:b","n":4,"seed":3663229386,"round":7,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.912,"maxMs":6.402,"nodes":7153,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.84,"maxMs":0.436,"nodes":610,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:8:a","n":4,"seed":1647295560,"round":8,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":1.806,"maxMs":0.414,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":15.905,"maxMs":5.766,"nodes":5263,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:8:b","n":4,"seed":1647295560,"round":8,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":19.554,"maxMs":7.297,"nodes":6936,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.811,"maxMs":0.432,"nodes":567,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:9:a","n":4,"seed":3910739066,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.992,"maxMs":0.468,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":16.85,"maxMs":6.225,"nodes":5273,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:9:b","n":4,"seed":3910739066,"round":9,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":21.058,"maxMs":6.634,"nodes":7371,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":2.081,"maxMs":0.455,"nodes":649,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:10:a","n":4,"seed":1862592204,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-d2","moves":5,"totalMs":1.523,"maxMs":0.423,"nodes":600,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":15.443,"maxMs":7.381,"nodes":4679,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:10:b","n":4,"seed":1862592204,"round":10,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":21.078,"maxMs":6.521,"nodes":7371,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.971,"maxMs":0.43,"nodes":649,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:11:a","n":4,"seed":666194945,"round":11,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.011,"maxMs":0.477,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":15.875,"maxMs":6.078,"nodes":5252,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:11:b","n":4,"seed":666194945,"round":11,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":17.975,"maxMs":6.959,"nodes":6560,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.454,"maxMs":0.446,"nodes":508,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:12:a","n":4,"seed":1550524873,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":2.267,"maxMs":0.483,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":15.131,"maxMs":5.814,"nodes":5110,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:12:b","n":4,"seed":1550524873,"round":12,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.419,"maxMs":6.337,"nodes":6898,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.783,"maxMs":0.443,"nodes":582,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:13:a","n":4,"seed":3743660482,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.952,"maxMs":0.518,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":15.599,"maxMs":5.79,"nodes":5289,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:13:b","n":4,"seed":3743660482,"round":13,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":18.203,"maxMs":6.47,"nodes":6762,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.446,"maxMs":0.392,"nodes":545,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:14:a","n":4,"seed":3320064985,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.763,"maxMs":0.416,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":14.578,"maxMs":6.071,"nodes":4867,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:14:b","n":4,"seed":3320064985,"round":14,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.362,"maxMs":6.707,"nodes":6933,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.796,"maxMs":0.525,"nodes":562,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:15:a","n":4,"seed":1815623379,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.756,"maxMs":0.479,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":14.989,"maxMs":6.109,"nodes":5072,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:15:b","n":4,"seed":1815623379,"round":15,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":20.073,"maxMs":6.948,"nodes":6928,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.725,"maxMs":0.407,"nodes":567,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:16:a","n":4,"seed":2812280319,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-d2","moves":5,"totalMs":1.537,"maxMs":0.422,"nodes":600,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.989,"maxMs":6.061,"nodes":4687,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:16:b","n":4,"seed":2812280319,"round":16,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":19.068,"maxMs":6.409,"nodes":6818,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.765,"maxMs":0.473,"nodes":545,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:17:a","n":4,"seed":2718799764,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d2","moves":7,"totalMs":2.098,"maxMs":0.474,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":16.429,"maxMs":5.937,"nodes":5247,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:17:b","n":4,"seed":2718799764,"round":17,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.52,"maxMs":6.471,"nodes":6928,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.764,"maxMs":0.446,"nodes":562,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:18:a","n":4,"seed":1392041245,"round":18,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.569,"maxMs":0.431,"nodes":600,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.765,"maxMs":6.195,"nodes":4778,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:18:b","n":4,"seed":1392041245,"round":18,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":18.055,"maxMs":6.869,"nodes":6617,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.606,"maxMs":0.471,"nodes":544,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:19:a","n":4,"seed":2940285513,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-d2","moves":5,"totalMs":1.588,"maxMs":0.435,"nodes":600,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":13.243,"maxMs":6.066,"nodes":4683,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d2:minimax-d3:19:b","n":4,"seed":2940285513,"round":19,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":20.026,"maxMs":6.77,"nodes":6916,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.846,"maxMs":0.453,"nodes":562,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:greedy:0:a","n":4,"seed":4053350081,"round":0,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d2","moves":10,"totalMs":2.333,"maxMs":0.46,"nodes":770,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.358,"maxMs":0.046,"nodes":91,"searches":9,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:0:b","n":4,"seed":4053350081,"round":0,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.319,"maxMs":0.097,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.302,"maxMs":0.462,"nodes":424,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:greedy:1:a","n":4,"seed":2360785490,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.01,"maxMs":0.441,"nodes":686,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.302,"maxMs":0.048,"nodes":77,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:1:b","n":4,"seed":2360785490,"round":1,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.255,"maxMs":0.045,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.483,"maxMs":0.467,"nodes":450,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:greedy:2:a","n":4,"seed":1156160642,"round":2,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.455,"maxMs":0.674,"nodes":678,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.408,"maxMs":0.13,"nodes":79,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:2:b","n":4,"seed":1156160642,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.29,"maxMs":0.048,"nodes":83,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.749,"maxMs":0.491,"nodes":545,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:greedy:3:a","n":4,"seed":553593201,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.247,"maxMs":0.622,"nodes":704,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.302,"maxMs":0.06,"nodes":77,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:3:b","n":4,"seed":553593201,"round":3,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.202,"maxMs":0.042,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.29,"maxMs":0.421,"nodes":424,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:greedy:4:a","n":4,"seed":2195973840,"round":4,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.817,"maxMs":0.454,"nodes":684,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.24,"maxMs":0.043,"nodes":76,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:4:b","n":4,"seed":2195973840,"round":4,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.195,"maxMs":0.042,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.296,"maxMs":0.406,"nodes":424,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:greedy:5:a","n":4,"seed":886605442,"round":5,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":2.455,"maxMs":0.512,"nodes":850,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.41,"maxMs":0.129,"nodes":96,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:5:b","n":4,"seed":886605442,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.298,"maxMs":0.042,"nodes":82,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.497,"maxMs":0.403,"nodes":462,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:greedy:6:a","n":4,"seed":161840683,"round":6,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.742,"maxMs":0.442,"nodes":654,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.238,"maxMs":0.043,"nodes":74,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:6:b","n":4,"seed":161840683,"round":6,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.345,"maxMs":0.096,"nodes":77,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.63,"maxMs":0.484,"nodes":462,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:greedy:7:a","n":4,"seed":1380735084,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"minimax-d2","moves":5,"totalMs":1.615,"maxMs":0.518,"nodes":600,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.17,"maxMs":0.044,"nodes":56,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:7:b","n":4,"seed":1380735084,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.243,"maxMs":0.053,"nodes":74,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.314,"maxMs":0.439,"nodes":426,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:greedy:8:a","n":4,"seed":2456224780,"round":8,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":2.207,"maxMs":0.438,"nodes":816,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.399,"maxMs":0.085,"nodes":92,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:8:b","n":4,"seed":2456224780,"round":8,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.204,"maxMs":0.045,"nodes":69,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.43,"maxMs":0.449,"nodes":508,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:greedy:9:a","n":4,"seed":3954891492,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.159,"maxMs":0.429,"nodes":752,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.344,"maxMs":0.086,"nodes":81,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:9:b","n":4,"seed":3954891492,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.293,"maxMs":0.042,"nodes":82,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.471,"maxMs":0.397,"nodes":462,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:greedy:10:a","n":4,"seed":1887905423,"round":10,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":1.937,"maxMs":0.44,"nodes":688,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.351,"maxMs":0.083,"nodes":82,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:10:b","n":4,"seed":1887905423,"round":10,"result":"win","winner":"red","drawReason":null,"turns":9,"red":{"agent":"greedy","moves":5,"totalMs":0.168,"maxMs":0.046,"nodes":56,"searches":4,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":4,"totalMs":1.305,"maxMs":0.638,"nodes":374,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d2:greedy:11:a","n":4,"seed":4172684224,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":2.585,"maxMs":0.836,"nodes":652,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.364,"maxMs":0.147,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:11:b","n":4,"seed":4172684224,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.368,"maxMs":0.09,"nodes":79,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":2.275,"maxMs":0.793,"nodes":452,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:greedy:12:a","n":4,"seed":1138651947,"round":12,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":2.132,"maxMs":0.47,"nodes":784,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.311,"maxMs":0.042,"nodes":90,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:12:b","n":4,"seed":1138651947,"round":12,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.246,"maxMs":0.092,"nodes":69,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.812,"maxMs":0.613,"nodes":508,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:greedy:13:a","n":4,"seed":2874573784,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.856,"maxMs":0.513,"nodes":652,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.227,"maxMs":0.045,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:13:b","n":4,"seed":2874573784,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":0.418,"maxMs":0.078,"nodes":93,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":1.935,"maxMs":0.456,"nodes":554,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:greedy:14:a","n":4,"seed":961219998,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.849,"maxMs":0.415,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.261,"maxMs":0.047,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:14:b","n":4,"seed":961219998,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.343,"maxMs":0.05,"nodes":82,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.728,"maxMs":0.447,"nodes":462,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:greedy:15:a","n":4,"seed":2633025130,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.463,"maxMs":0.475,"nodes":818,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.385,"maxMs":0.125,"nodes":85,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:15:b","n":4,"seed":2633025130,"round":15,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.211,"maxMs":0.046,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.427,"maxMs":0.433,"nodes":424,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:greedy:16:a","n":4,"seed":271410032,"round":16,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":1.847,"maxMs":0.416,"nodes":676,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.279,"maxMs":0.044,"nodes":77,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:16:b","n":4,"seed":271410032,"round":16,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.277,"maxMs":0.043,"nodes":77,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.442,"maxMs":0.402,"nodes":460,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:greedy:17:a","n":4,"seed":3218172949,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.163,"maxMs":0.422,"nodes":752,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.303,"maxMs":0.048,"nodes":81,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:17:b","n":4,"seed":3218172949,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.232,"maxMs":0.042,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.298,"maxMs":0.476,"nodes":424,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:greedy:18:a","n":4,"seed":173649364,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.731,"maxMs":0.46,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.209,"maxMs":0.043,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:18:b","n":4,"seed":173649364,"round":18,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.406,"maxMs":0.15,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.654,"maxMs":0.483,"nodes":450,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:greedy:19:a","n":4,"seed":3411682386,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.792,"maxMs":0.532,"nodes":650,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.216,"maxMs":0.049,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:greedy:19:b","n":4,"seed":3411682386,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.358,"maxMs":0.086,"nodes":91,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.77,"maxMs":0.461,"nodes":584,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:random:0:a","n":4,"seed":3061522886,"round":0,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.884,"maxMs":0.446,"nodes":649,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.022,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:0:b","n":4,"seed":3061522886,"round":0,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"random","moves":9,"totalMs":0.033,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.906,"maxMs":0.413,"nodes":632,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:random:1:a","n":4,"seed":3980755399,"round":1,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.973,"maxMs":0.456,"nodes":693,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.018,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:1:b","n":4,"seed":3980755399,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.014,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.386,"maxMs":0.506,"nodes":428,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:random:2:a","n":4,"seed":1018173285,"round":2,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":2.073,"maxMs":0.507,"nodes":724,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.019,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:2:b","n":4,"seed":1018173285,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.015,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.653,"maxMs":0.441,"nodes":588,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:random:3:a","n":4,"seed":3449121993,"round":3,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.178,"maxMs":0.569,"nodes":650,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.022,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:3:b","n":4,"seed":3449121993,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.03,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":2.101,"maxMs":0.396,"nodes":644,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:random:4:a","n":4,"seed":2530861162,"round":4,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.933,"maxMs":0.461,"nodes":684,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.015,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:4:b","n":4,"seed":2530861162,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.016,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.55,"maxMs":0.408,"nodes":540,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:random:5:a","n":4,"seed":1731815511,"round":5,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":1.898,"maxMs":0.57,"nodes":615,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.024,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:5:b","n":4,"seed":1731815511,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.017,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.699,"maxMs":0.475,"nodes":577,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:random:6:a","n":4,"seed":818465685,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d2","moves":9,"totalMs":2.446,"maxMs":0.461,"nodes":830,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"random","moves":9,"totalMs":0.031,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:6:b","n":4,"seed":818465685,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.033,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":1.734,"maxMs":0.407,"nodes":518,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:random:7:a","n":4,"seed":2988368963,"round":7,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.868,"maxMs":0.429,"nodes":611,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.022,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:7:b","n":4,"seed":2988368963,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.014,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.073,"maxMs":0.443,"nodes":374,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d2:random:8:a","n":4,"seed":1051098821,"round":8,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.665,"maxMs":0.55,"nodes":553,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.016,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:8:b","n":4,"seed":1051098821,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.017,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.478,"maxMs":0.47,"nodes":452,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:random:9:a","n":4,"seed":832367481,"round":9,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":2.776,"maxMs":0.475,"nodes":936,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.054,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:9:b","n":4,"seed":832367481,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.009,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.104,"maxMs":0.416,"nodes":374,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d2:random:10:a","n":4,"seed":77667761,"round":10,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.081,"maxMs":0.413,"nodes":776,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.019,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:10:b","n":4,"seed":77667761,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.028,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.469,"maxMs":0.387,"nodes":480,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:random:11:a","n":4,"seed":2849687775,"round":11,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.562,"maxMs":0.806,"nodes":736,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.036,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:11:b","n":4,"seed":2849687775,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.019,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.75,"maxMs":0.431,"nodes":547,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:random:12:a","n":4,"seed":683812457,"round":12,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.684,"maxMs":0.477,"nodes":642,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.012,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:12:b","n":4,"seed":683812457,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.016,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.3,"maxMs":0.381,"nodes":450,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:random:13:a","n":4,"seed":3070803376,"round":13,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d2","moves":10,"totalMs":2.347,"maxMs":0.45,"nodes":856,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"random","moves":9,"totalMs":0.028,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:13:b","n":4,"seed":3070803376,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.017,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.503,"maxMs":0.412,"nodes":508,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:random:14:a","n":4,"seed":2350484263,"round":14,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d2","moves":6,"totalMs":1.673,"maxMs":0.446,"nodes":644,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.013,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:14:b","n":4,"seed":2350484263,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.018,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":1.446,"maxMs":0.437,"nodes":460,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d2:random:15:a","n":4,"seed":2181997440,"round":15,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":2.096,"maxMs":0.409,"nodes":776,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.021,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:15:b","n":4,"seed":2181997440,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.023,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":1.532,"maxMs":0.41,"nodes":507,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d2:random:16:a","n":4,"seed":695879078,"round":16,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":1.919,"maxMs":0.464,"nodes":684,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.02,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:16:b","n":4,"seed":695879078,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.048,"maxMs":0.014,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":2.394,"maxMs":0.582,"nodes":656,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d2:random:17:a","n":4,"seed":3663324224,"round":17,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.974,"maxMs":0.492,"nodes":684,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.017,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:17:b","n":4,"seed":3663324224,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.014,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":1.548,"maxMs":0.45,"nodes":500,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d2:random:18:a","n":4,"seed":1258795218,"round":18,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":1.877,"maxMs":0.443,"nodes":605,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.025,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:18:b","n":4,"seed":1258795218,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.009,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.073,"maxMs":0.407,"nodes":374,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d2:random:19:a","n":4,"seed":3474729713,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d2","moves":7,"totalMs":1.659,"maxMs":0.433,"nodes":562,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.021,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d2:random:19:b","n":4,"seed":3474729713,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.01,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":5,"totalMs":1.139,"maxMs":0.41,"nodes":416,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d3:greedy:0:a","n":4,"seed":3207707080,"round":0,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":17.924,"maxMs":6.956,"nodes":6562,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.306,"maxMs":0.129,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:0:b","n":4,"seed":3207707080,"round":0,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.27,"maxMs":0.05,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":12.207,"maxMs":5.19,"nodes":3923,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:greedy:1:a","n":4,"seed":2725520152,"round":1,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":21.73,"maxMs":6.229,"nodes":7490,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.367,"maxMs":0.076,"nodes":83,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:1:b","n":4,"seed":2725520152,"round":1,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.224,"maxMs":0.049,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":11.846,"maxMs":5.414,"nodes":3717,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:greedy:2:a","n":4,"seed":2871353029,"round":2,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":18.213,"maxMs":6.26,"nodes":6768,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.375,"maxMs":0.163,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:2:b","n":4,"seed":2871353029,"round":2,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.283,"maxMs":0.055,"nodes":77,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":15.311,"maxMs":6.353,"nodes":5104,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:greedy:3:a","n":4,"seed":1218748353,"round":3,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":18.676,"maxMs":6.772,"nodes":6854,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.272,"maxMs":0.047,"nodes":74,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:3:b","n":4,"seed":1218748353,"round":3,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.255,"maxMs":0.049,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":12.015,"maxMs":5.485,"nodes":3913,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:greedy:4:a","n":4,"seed":3823103917,"round":4,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":17.062,"maxMs":6.608,"nodes":6494,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.217,"maxMs":0.047,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:4:b","n":4,"seed":3823103917,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.341,"maxMs":0.091,"nodes":77,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":12.468,"maxMs":4.993,"nodes":3898,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:greedy:5:a","n":4,"seed":2963572384,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d3","moves":9,"totalMs":18.765,"maxMs":6.212,"nodes":6940,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.324,"maxMs":0.05,"nodes":80,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:5:b","n":4,"seed":2963572384,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.33,"maxMs":0.055,"nodes":87,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":15.922,"maxMs":5.999,"nodes":5343,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d3:greedy:6:a","n":4,"seed":1158885291,"round":6,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":19.591,"maxMs":6.273,"nodes":7191,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.348,"maxMs":0.053,"nodes":86,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:6:b","n":4,"seed":1158885291,"round":6,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.245,"maxMs":0.057,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":12.259,"maxMs":5.405,"nodes":3692,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:greedy:7:a","n":4,"seed":1653380667,"round":7,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":18.619,"maxMs":6.285,"nodes":6852,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.262,"maxMs":0.054,"nodes":74,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:7:b","n":4,"seed":1653380667,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"greedy","moves":5,"totalMs":0.278,"maxMs":0.107,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":11.544,"maxMs":5.452,"nodes":3604,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d3:greedy:8:a","n":4,"seed":868771161,"round":8,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":17.654,"maxMs":6.412,"nodes":6550,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.444,"maxMs":0.21,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:8:b","n":4,"seed":868771161,"round":8,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.349,"maxMs":0.062,"nodes":84,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":12.308,"maxMs":5.037,"nodes":3901,"searches":7,"deepSearches":7,"illegal":0}},{"id":"4:minimax-d3:greedy:9:a","n":4,"seed":1673050818,"round":9,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":19.774,"maxMs":6.125,"nodes":7228,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.35,"maxMs":0.065,"nodes":86,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:9:b","n":4,"seed":1673050818,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.377,"maxMs":0.149,"nodes":72,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":12.445,"maxMs":4.962,"nodes":3869,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:greedy:10:a","n":4,"seed":908068585,"round":10,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":19.199,"maxMs":6.189,"nodes":6912,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.311,"maxMs":0.051,"nodes":77,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:10:b","n":4,"seed":908068585,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.299,"maxMs":0.055,"nodes":77,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":12.555,"maxMs":5.122,"nodes":4001,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:greedy:11:a","n":4,"seed":1969530172,"round":11,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":22.611,"maxMs":6.367,"nodes":8084,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.405,"maxMs":0.102,"nodes":92,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:11:b","n":4,"seed":1969530172,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.278,"maxMs":0.061,"nodes":77,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":15.516,"maxMs":5.888,"nodes":5096,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:greedy:12:a","n":4,"seed":707026154,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d3","moves":6,"totalMs":19.559,"maxMs":6.411,"nodes":6930,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.242,"maxMs":0.057,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:12:b","n":4,"seed":707026154,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.41,"maxMs":0.116,"nodes":80,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":14.587,"maxMs":5.928,"nodes":4010,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d3:greedy:13:a","n":4,"seed":1825965305,"round":13,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":18.231,"maxMs":7.185,"nodes":6500,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.247,"maxMs":0.065,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:13:b","n":4,"seed":1825965305,"round":13,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.272,"maxMs":0.078,"nodes":69,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":15.244,"maxMs":6.46,"nodes":4802,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:greedy:14:a","n":4,"seed":3422855365,"round":14,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":19.12,"maxMs":7.311,"nodes":6762,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.285,"maxMs":0.058,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:14:b","n":4,"seed":3422855365,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.34,"maxMs":0.068,"nodes":79,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":14.109,"maxMs":6.455,"nodes":3965,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:greedy:15:a","n":4,"seed":3278198814,"round":15,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":20.277,"maxMs":7.457,"nodes":6917,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.369,"maxMs":0.075,"nodes":79,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:15:b","n":4,"seed":3278198814,"round":15,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.314,"maxMs":0.051,"nodes":77,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":13.958,"maxMs":6.295,"nodes":3965,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d3:greedy:16:a","n":4,"seed":3644449129,"round":16,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":19.115,"maxMs":7.134,"nodes":6570,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.253,"maxMs":0.058,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:16:b","n":4,"seed":3644449129,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.385,"maxMs":0.085,"nodes":77,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":13.601,"maxMs":6.457,"nodes":3937,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:greedy:17:a","n":4,"seed":685501803,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d3","moves":7,"totalMs":20.018,"maxMs":7.476,"nodes":6990,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.285,"maxMs":0.049,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:17:b","n":4,"seed":685501803,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"greedy","moves":5,"totalMs":0.221,"maxMs":0.056,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":11.391,"maxMs":5.496,"nodes":3610,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d3:greedy:18:a","n":4,"seed":1050948070,"round":18,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":17.181,"maxMs":6.922,"nodes":6500,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.348,"maxMs":0.135,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:18:b","n":4,"seed":1050948070,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.309,"maxMs":0.07,"nodes":74,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":12.584,"maxMs":5.705,"nodes":3796,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:greedy:19:a","n":4,"seed":432345983,"round":19,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d3","moves":10,"totalMs":24.133,"maxMs":6.445,"nodes":8178,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.567,"maxMs":0.123,"nodes":97,"searches":9,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:greedy:19:b","n":4,"seed":432345983,"round":19,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.228,"maxMs":0.052,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":11.475,"maxMs":5.549,"nodes":3619,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:random:0:a","n":4,"seed":2056391150,"round":0,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":20.772,"maxMs":6.742,"nodes":7700,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.039,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:0:b","n":4,"seed":2056391150,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.053,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":12.553,"maxMs":5.837,"nodes":3508,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d3:random:1:a","n":4,"seed":953977068,"round":1,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":17.822,"maxMs":6.513,"nodes":5589,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.028,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:1:b","n":4,"seed":953977068,"round":1,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"random","moves":8,"totalMs":0.038,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":15.7,"maxMs":6.275,"nodes":4563,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d3:random:2:a","n":4,"seed":4236816859,"round":2,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":23.489,"maxMs":7.719,"nodes":7752,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.061,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:2:b","n":4,"seed":4236816859,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":8,"red":{"agent":"random","moves":4,"totalMs":0.021,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":4,"totalMs":7.458,"maxMs":5.23,"nodes":2570,"searches":2,"deepSearches":2,"illegal":0}},{"id":"4:minimax-d3:random:3:a","n":4,"seed":275571364,"round":3,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":15.855,"maxMs":6.556,"nodes":5044,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.042,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:3:b","n":4,"seed":275571364,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.028,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":12.132,"maxMs":5.183,"nodes":3669,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:random:4:a","n":4,"seed":2994560946,"round":4,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":24.055,"maxMs":6.313,"nodes":8850,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.048,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:4:b","n":4,"seed":2994560946,"round":4,"result":"win","winner":"red","drawReason":null,"turns":7,"red":{"agent":"random","moves":4,"totalMs":0.011,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":3,"totalMs":6.267,"maxMs":5.426,"nodes":2175,"searches":2,"deepSearches":2,"illegal":0}},{"id":"4:minimax-d3:random:5:a","n":4,"seed":172402713,"round":5,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":15.597,"maxMs":5.581,"nodes":5315,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.033,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:5:b","n":4,"seed":172402713,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.017,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":10.66,"maxMs":4.905,"nodes":3636,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d3:random:6:a","n":4,"seed":2397058936,"round":6,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":17.069,"maxMs":6.399,"nodes":5556,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.029,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:6:b","n":4,"seed":2397058936,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.024,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":11.268,"maxMs":5.232,"nodes":3627,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d3:random:7:a","n":4,"seed":1867976404,"round":7,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":16.799,"maxMs":6.256,"nodes":6526,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.023,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:7:b","n":4,"seed":1867976404,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.024,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":12.042,"maxMs":5.126,"nodes":3866,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:random:8:a","n":4,"seed":742053772,"round":8,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":14.933,"maxMs":5.84,"nodes":5138,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.025,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:8:b","n":4,"seed":742053772,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.021,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":11.559,"maxMs":5.186,"nodes":3640,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d3:random:9:a","n":4,"seed":2997662824,"round":9,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":14.639,"maxMs":5.934,"nodes":5026,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.023,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:9:b","n":4,"seed":2997662824,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.032,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":13.13,"maxMs":5.087,"nodes":4043,"searches":6,"deepSearches":6,"illegal":0}},{"id":"4:minimax-d3:random:10:a","n":4,"seed":129681713,"round":10,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":20.82,"maxMs":6.231,"nodes":7340,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.044,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:10:b","n":4,"seed":129681713,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.033,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":12.457,"maxMs":4.759,"nodes":3862,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:random:11:a","n":4,"seed":2897537476,"round":11,"result":"win","winner":"red","drawReason":null,"turns":7,"red":{"agent":"minimax-d3","moves":4,"totalMs":10.857,"maxMs":5.891,"nodes":3846,"searches":2,"deepSearches":2,"illegal":0},"blue":{"agent":"random","moves":3,"totalMs":0.012,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:11:b","n":4,"seed":2897537476,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.03,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":13.645,"maxMs":5.065,"nodes":4322,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:random:12:a","n":4,"seed":704268634,"round":12,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":14.554,"maxMs":6.262,"nodes":4990,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.023,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:12:b","n":4,"seed":704268634,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.033,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":13.854,"maxMs":5.668,"nodes":4218,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:random:13:a","n":4,"seed":2131652595,"round":13,"result":"win","winner":"red","drawReason":null,"turns":9,"red":{"agent":"minimax-d3","moves":5,"totalMs":16.199,"maxMs":5.952,"nodes":5395,"searches":3,"deepSearches":3,"illegal":0},"blue":{"agent":"random","moves":4,"totalMs":0.025,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:13:b","n":4,"seed":2131652595,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.031,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":15.796,"maxMs":5.801,"nodes":4472,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:random:14:a","n":4,"seed":3375949843,"round":14,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":19.769,"maxMs":6.776,"nodes":7114,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.037,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:14:b","n":4,"seed":3375949843,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.025,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":12.434,"maxMs":5.87,"nodes":3778,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d3:random:15:a","n":4,"seed":4146960723,"round":15,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":23.43,"maxMs":6.31,"nodes":8331,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.055,"maxMs":0.024,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:15:b","n":4,"seed":4146960723,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.027,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":10.383,"maxMs":5.167,"nodes":3473,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:random:16:a","n":4,"seed":1753342570,"round":16,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":24.525,"maxMs":6.372,"nodes":8283,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.046,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:16:b","n":4,"seed":1753342570,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.036,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":15.447,"maxMs":5.421,"nodes":4518,"searches":5,"deepSearches":5,"illegal":0}},{"id":"4:minimax-d3:random:17:a","n":4,"seed":3323985844,"round":17,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"minimax-d3","moves":6,"totalMs":21.045,"maxMs":6.904,"nodes":7896,"searches":4,"deepSearches":4,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.027,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:17:b","n":4,"seed":3323985844,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.017,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":10.103,"maxMs":5.192,"nodes":3288,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:minimax-d3:random:18:a","n":4,"seed":3546655332,"round":18,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":19.862,"maxMs":6.27,"nodes":6591,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.03,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:18:b","n":4,"seed":3546655332,"round":18,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"random","moves":6,"totalMs":0.018,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":9.918,"maxMs":5.652,"nodes":3204,"searches":4,"deepSearches":4,"illegal":0}},{"id":"4:minimax-d3:random:19:a","n":4,"seed":3849685026,"round":19,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":20.033,"maxMs":6.633,"nodes":7180,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.041,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:minimax-d3:random:19:b","n":4,"seed":3849685026,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.021,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":5,"totalMs":14.649,"maxMs":5.44,"nodes":4958,"searches":3,"deepSearches":3,"illegal":0}},{"id":"4:greedy:random:0:a","n":4,"seed":2310353951,"round":0,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.303,"maxMs":0.049,"nodes":89,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.019,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:0:b","n":4,"seed":2310353951,"round":0,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"random","moves":9,"totalMs":0.026,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.353,"maxMs":0.05,"nodes":88,"searches":8,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:1:a","n":4,"seed":257011862,"round":1,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.249,"maxMs":0.075,"nodes":73,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.009,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:1:b","n":4,"seed":257011862,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.011,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.222,"maxMs":0.048,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:2:a","n":4,"seed":1828872169,"round":2,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.215,"maxMs":0.049,"nodes":65,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.01,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:2:b","n":4,"seed":1828872169,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.014,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.256,"maxMs":0.048,"nodes":72,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:3:a","n":4,"seed":1747326573,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.331,"maxMs":0.057,"nodes":84,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.029,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:3:b","n":4,"seed":1747326573,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.012,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.222,"maxMs":0.048,"nodes":67,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:4:a","n":4,"seed":2625493615,"round":4,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.27,"maxMs":0.101,"nodes":71,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.043,"maxMs":0.035,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:4:b","n":4,"seed":2625493615,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.016,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.216,"maxMs":0.048,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:5:a","n":4,"seed":3224668059,"round":5,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.258,"maxMs":0.048,"nodes":79,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.014,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:5:b","n":4,"seed":3224668059,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.013,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.28,"maxMs":0.094,"nodes":67,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:6:a","n":4,"seed":2723690355,"round":6,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.206,"maxMs":0.045,"nodes":71,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.009,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:6:b","n":4,"seed":2723690355,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":10,"red":{"agent":"random","moves":5,"totalMs":0.008,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.172,"maxMs":0.046,"nodes":56,"searches":4,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:7:a","n":4,"seed":3604595885,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.304,"maxMs":0.047,"nodes":87,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.021,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:7:b","n":4,"seed":3604595885,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.033,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.454,"maxMs":0.132,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:8:a","n":4,"seed":3149261863,"round":8,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.358,"maxMs":0.05,"nodes":89,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.027,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:8:b","n":4,"seed":3149261863,"round":8,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"random","moves":6,"totalMs":0.019,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":5,"totalMs":0.248,"maxMs":0.052,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:9:a","n":4,"seed":3942836941,"round":9,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.29,"maxMs":0.049,"nodes":77,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.02,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:9:b","n":4,"seed":3942836941,"round":9,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"random","moves":8,"totalMs":0.02,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.282,"maxMs":0.043,"nodes":77,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:10:a","n":4,"seed":1374924490,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":0.332,"maxMs":0.046,"nodes":91,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":9,"totalMs":0.026,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:10:b","n":4,"seed":1374924490,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.015,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.301,"maxMs":0.093,"nodes":78,"searches":6,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:11:a","n":4,"seed":300480153,"round":11,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.255,"maxMs":0.048,"nodes":83,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.014,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:11:b","n":4,"seed":300480153,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.012,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.24,"maxMs":0.055,"nodes":69,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:12:a","n":4,"seed":3887592603,"round":12,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.343,"maxMs":0.049,"nodes":97,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.023,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:12:b","n":4,"seed":3887592603,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.03,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.35,"maxMs":0.044,"nodes":87,"searches":9,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:13:a","n":4,"seed":3178405031,"round":13,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.276,"maxMs":0.043,"nodes":83,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.017,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:13:b","n":4,"seed":3178405031,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.02,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.34,"maxMs":0.083,"nodes":77,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:14:a","n":4,"seed":1135482123,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.264,"maxMs":0.043,"nodes":77,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.018,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:14:b","n":4,"seed":1135482123,"round":14,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"random","moves":8,"totalMs":0.019,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.287,"maxMs":0.048,"nodes":81,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:15:a","n":4,"seed":4062417433,"round":15,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"greedy","moves":7,"totalMs":0.235,"maxMs":0.045,"nodes":77,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.012,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:15:b","n":4,"seed":4062417433,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.011,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":6,"totalMs":0.196,"maxMs":0.044,"nodes":65,"searches":5,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:16:a","n":4,"seed":3001902720,"round":16,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.334,"maxMs":0.067,"nodes":80,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.023,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:16:b","n":4,"seed":3001902720,"round":16,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"random","moves":10,"totalMs":0.03,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.347,"maxMs":0.045,"nodes":87,"searches":9,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:17:a","n":4,"seed":3879962572,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.239,"maxMs":0.046,"nodes":81,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.013,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:17:b","n":4,"seed":3879962572,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":8,"red":{"agent":"random","moves":4,"totalMs":0.005,"maxMs":0.002,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":4,"totalMs":0.121,"maxMs":0.041,"nodes":45,"searches":3,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:18:a","n":4,"seed":1652865246,"round":18,"result":"win","winner":"red","drawReason":null,"turns":11,"red":{"agent":"greedy","moves":6,"totalMs":0.199,"maxMs":0.045,"nodes":71,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":5,"totalMs":0.009,"maxMs":0.003,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:18:b","n":4,"seed":1652865246,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.019,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.282,"maxMs":0.046,"nodes":77,"searches":7,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:19:a","n":4,"seed":1569178180,"round":19,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.284,"maxMs":0.046,"nodes":77,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.019,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"4:greedy:random:19:b","n":4,"seed":1569178180,"round":19,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"random","moves":9,"totalMs":0.024,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.349,"maxMs":0.082,"nodes":80,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:0:a","n":5,"seed":1606945800,"round":0,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":1.013,"maxMs":0.15,"nodes":160,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":9.869,"maxMs":1.466,"nodes":2300,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:0:b","n":5,"seed":1606945800,"round":0,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d2","moves":16,"totalMs":12.303,"maxMs":1.407,"nodes":2966,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":1.229,"maxMs":0.107,"nodes":196,"searches":14,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:1:a","n":5,"seed":371807006,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":1.255,"maxMs":0.114,"nodes":204,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":12.908,"maxMs":1.726,"nodes":2688,"searches":13,"deepSearches":13,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:1:b","n":5,"seed":371807006,"round":1,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":11.231,"maxMs":1.962,"nodes":2553,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":1.008,"maxMs":0.204,"nodes":144,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:2:a","n":5,"seed":1945461847,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.615,"maxMs":0.165,"nodes":122,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":7.298,"maxMs":1.597,"nodes":1852,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:2:b","n":5,"seed":1945461847,"round":2,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":9.657,"maxMs":1.529,"nodes":2553,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.751,"maxMs":0.093,"nodes":144,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:3:a","n":5,"seed":1294273508,"round":3,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":1.234,"maxMs":0.191,"nodes":185,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":11.708,"maxMs":2.244,"nodes":2476,"searches":13,"deepSearches":13,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:3:b","n":5,"seed":1294273508,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d2","moves":11,"totalMs":12.533,"maxMs":1.849,"nodes":2780,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.983,"maxMs":0.177,"nodes":152,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:4:a","n":5,"seed":2986737568,"round":4,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.734,"maxMs":0.1,"nodes":144,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.113,"maxMs":1.45,"nodes":2224,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:4:b","n":5,"seed":2986737568,"round":4,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d2","moves":14,"totalMs":11.774,"maxMs":1.815,"nodes":2794,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.03,"maxMs":0.1,"nodes":172,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:5:a","n":5,"seed":1761968949,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":1.054,"maxMs":0.127,"nodes":170,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":10.627,"maxMs":2.054,"nodes":2312,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:5:b","n":5,"seed":1761968949,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d2","moves":12,"totalMs":11.976,"maxMs":1.529,"nodes":2723,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.221,"maxMs":0.274,"nodes":156,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:6:a","n":5,"seed":3256436148,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.962,"maxMs":0.216,"nodes":155,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":9.562,"maxMs":1.733,"nodes":2226,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:6:b","n":5,"seed":3256436148,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d2","moves":12,"totalMs":13.175,"maxMs":2.343,"nodes":2687,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.118,"maxMs":0.249,"nodes":154,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:7:a","n":5,"seed":380151437,"round":7,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.876,"maxMs":0.13,"nodes":153,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":11.476,"maxMs":2.008,"nodes":2274,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:7:b","n":5,"seed":380151437,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":8.711,"maxMs":1.479,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.594,"maxMs":0.155,"nodes":114,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:8:a","n":5,"seed":451582188,"round":8,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":0.893,"maxMs":0.097,"nodes":178,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":12.173,"maxMs":1.795,"nodes":2760,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:8:b","n":5,"seed":451582188,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d2","moves":9,"totalMs":9.857,"maxMs":1.7,"nodes":2488,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.705,"maxMs":0.135,"nodes":126,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:9:a","n":5,"seed":3124163200,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.681,"maxMs":0.178,"nodes":133,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":7.63,"maxMs":1.462,"nodes":2020,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:9:b","n":5,"seed":3124163200,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d2","moves":9,"totalMs":9.666,"maxMs":2.083,"nodes":2488,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.707,"maxMs":0.132,"nodes":126,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:10:a","n":5,"seed":1683244991,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.846,"maxMs":0.197,"nodes":133,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":7.885,"maxMs":1.403,"nodes":2020,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:10:b","n":5,"seed":1683244991,"round":10,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d2","moves":10,"totalMs":9.467,"maxMs":1.647,"nodes":2488,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.789,"maxMs":0.199,"nodes":136,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:11:a","n":5,"seed":376514909,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.723,"maxMs":0.156,"nodes":144,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":8.624,"maxMs":1.435,"nodes":2142,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:11:b","n":5,"seed":376514909,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d2","moves":9,"totalMs":8.728,"maxMs":1.337,"nodes":2488,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.611,"maxMs":0.093,"nodes":126,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:12:a","n":5,"seed":153818286,"round":12,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.583,"maxMs":0.092,"nodes":133,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":8.528,"maxMs":1.874,"nodes":2142,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:12:b","n":5,"seed":153818286,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d2","moves":10,"totalMs":9.395,"maxMs":1.413,"nodes":2553,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.716,"maxMs":0.133,"nodes":136,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:13:a","n":5,"seed":783232238,"round":13,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.626,"maxMs":0.098,"nodes":135,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":8.973,"maxMs":1.604,"nodes":2250,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:13:b","n":5,"seed":783232238,"round":13,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d2","moves":16,"totalMs":12.081,"maxMs":1.561,"nodes":2850,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":1.257,"maxMs":0.146,"nodes":184,"searches":14,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:14:a","n":5,"seed":1204692375,"round":14,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.876,"maxMs":0.214,"nodes":144,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.193,"maxMs":1.465,"nodes":2224,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:14:b","n":5,"seed":1204692375,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d2","moves":13,"totalMs":11.227,"maxMs":1.418,"nodes":2760,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":0.944,"maxMs":0.101,"nodes":164,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:15:a","n":5,"seed":834880765,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.771,"maxMs":0.194,"nodes":144,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":8.551,"maxMs":1.802,"nodes":2142,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:15:b","n":5,"seed":834880765,"round":15,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d2","moves":12,"totalMs":10.177,"maxMs":1.387,"nodes":2592,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.979,"maxMs":0.138,"nodes":152,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:16:a","n":5,"seed":3614914481,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":1.134,"maxMs":0.132,"nodes":193,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":11.708,"maxMs":1.714,"nodes":2602,"searches":12,"deepSearches":12,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:16:b","n":5,"seed":3614914481,"round":16,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d2","moves":12,"totalMs":11.127,"maxMs":1.851,"nodes":2592,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.925,"maxMs":0.133,"nodes":152,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:17:a","n":5,"seed":2136346945,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.957,"maxMs":0.222,"nodes":153,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":9.656,"maxMs":1.664,"nodes":2224,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:17:b","n":5,"seed":2136346945,"round":17,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d2","moves":10,"totalMs":9.635,"maxMs":1.537,"nodes":2490,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.8,"maxMs":0.165,"nodes":138,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:18:a","n":5,"seed":2571492803,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.838,"maxMs":0.137,"nodes":144,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.248,"maxMs":1.702,"nodes":2142,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:18:b","n":5,"seed":2571492803,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d2","moves":14,"totalMs":10.185,"maxMs":1.348,"nodes":2665,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":1.021,"maxMs":0.1,"nodes":170,"searches":12,"deepSearches":1,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:19:a","n":5,"seed":3882748089,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.807,"maxMs":0.209,"nodes":133,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":8.232,"maxMs":2.303,"nodes":2020,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d2:19:b","n":5,"seed":3882748089,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d2","moves":14,"totalMs":12.46,"maxMs":1.612,"nodes":2825,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":1.149,"maxMs":0.199,"nodes":174,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:0:a","n":5,"seed":61641387,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.619,"maxMs":0.137,"nodes":120,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":130.601,"maxMs":32.23,"nodes":33138,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:0:b","n":5,"seed":61641387,"round":0,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":193.097,"maxMs":37.15,"nodes":44025,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.334,"maxMs":0.246,"nodes":158,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:1:a","n":5,"seed":800081749,"round":1,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.886,"maxMs":0.246,"nodes":133,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":141.271,"maxMs":33.949,"nodes":34865,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:1:b","n":5,"seed":800081749,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d3","moves":7,"totalMs":151.245,"maxMs":31.462,"nodes":40626,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.554,"maxMs":0.137,"nodes":100,"searches":5,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:2:a","n":5,"seed":825180,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":1.052,"maxMs":0.122,"nodes":165,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":147.12,"maxMs":31.067,"nodes":37080,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:2:b","n":5,"seed":825180,"round":2,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":190.089,"maxMs":31.56,"nodes":47469,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.311,"maxMs":0.229,"nodes":170,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:3:a","n":5,"seed":2329563330,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":1.325,"maxMs":0.179,"nodes":182,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":172.763,"maxMs":36.065,"nodes":39106,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:3:b","n":5,"seed":2329563330,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d3","moves":13,"totalMs":165.807,"maxMs":32.214,"nodes":43896,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.052,"maxMs":0.143,"nodes":156,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:4:a","n":5,"seed":539275163,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":1.199,"maxMs":0.2,"nodes":175,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":160.056,"maxMs":31.055,"nodes":38994,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:4:b","n":5,"seed":539275163,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d3","moves":8,"totalMs":159.857,"maxMs":32.262,"nodes":42875,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.76,"maxMs":0.246,"nodes":114,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:5:a","n":5,"seed":376047287,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.491,"maxMs":0.13,"nodes":107,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":108.538,"maxMs":32.679,"nodes":30265,"searches":4,"deepSearches":4,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:5:b","n":5,"seed":376047287,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d3","moves":14,"totalMs":166.907,"maxMs":31.256,"nodes":44334,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":1.177,"maxMs":0.125,"nodes":170,"searches":12,"deepSearches":1,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:6:a","n":5,"seed":1007935568,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-dynamic","moves":6,"totalMs":0.53,"maxMs":0.135,"nodes":105,"searches":5,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":117.695,"maxMs":39.257,"nodes":30176,"searches":4,"deepSearches":4,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:6:b","n":5,"seed":1007935568,"round":6,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":154.879,"maxMs":34.41,"nodes":40972,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.635,"maxMs":0.12,"nodes":114,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:7:a","n":5,"seed":3123620197,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.606,"maxMs":0.119,"nodes":120,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":128.972,"maxMs":31.003,"nodes":33138,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:7:b","n":5,"seed":3123620197,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d3","moves":14,"totalMs":187.337,"maxMs":33.037,"nodes":46883,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":1.428,"maxMs":0.227,"nodes":174,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:8:a","n":5,"seed":12693131,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":1.121,"maxMs":0.202,"nodes":165,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":144.602,"maxMs":30.497,"nodes":37132,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:8:b","n":5,"seed":12693131,"round":8,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":170.196,"maxMs":31.293,"nodes":44482,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":1.118,"maxMs":0.165,"nodes":158,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:9:a","n":5,"seed":142225492,"round":9,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.649,"maxMs":0.146,"nodes":120,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":124.367,"maxMs":30.417,"nodes":33661,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:9:b","n":5,"seed":142225492,"round":9,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":152.547,"maxMs":32.65,"nodes":42449,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.712,"maxMs":0.121,"nodes":126,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:10:a","n":5,"seed":1031454277,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":1.255,"maxMs":0.247,"nodes":167,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":157.703,"maxMs":31.273,"nodes":37154,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:10:b","n":5,"seed":1031454277,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-d3","moves":15,"totalMs":253.601,"maxMs":60.856,"nodes":49199,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":1.515,"maxMs":0.235,"nodes":190,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:11:a","n":5,"seed":889105609,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.906,"maxMs":0.109,"nodes":162,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":143.104,"maxMs":31.07,"nodes":36991,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:11:b","n":5,"seed":889105609,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d3","moves":8,"totalMs":157.767,"maxMs":31.202,"nodes":42177,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.791,"maxMs":0.247,"nodes":114,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:12:a","n":5,"seed":2168545147,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.762,"maxMs":0.11,"nodes":146,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":9,"totalMs":139.76,"maxMs":31.71,"nodes":36234,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:12:b","n":5,"seed":2168545147,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d3","moves":11,"totalMs":168.54,"maxMs":34.889,"nodes":43782,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.965,"maxMs":0.167,"nodes":144,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:13:a","n":5,"seed":1704787389,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.916,"maxMs":0.141,"nodes":157,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":146.439,"maxMs":30.062,"nodes":37407,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:13:b","n":5,"seed":1704787389,"round":13,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":162.012,"maxMs":31.937,"nodes":43806,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":1.199,"maxMs":0.243,"nodes":150,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:14:a","n":5,"seed":922382284,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.911,"maxMs":0.112,"nodes":159,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":157.864,"maxMs":31.305,"nodes":38132,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:14:b","n":5,"seed":922382284,"round":14,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":176.186,"maxMs":32.589,"nodes":44694,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.183,"maxMs":0.123,"nodes":168,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:15:a","n":5,"seed":2745791285,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.939,"maxMs":0.134,"nodes":155,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":146.516,"maxMs":31.132,"nodes":36776,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:15:b","n":5,"seed":2745791285,"round":15,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":158.918,"maxMs":31.113,"nodes":43848,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.995,"maxMs":0.149,"nodes":152,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:16:a","n":5,"seed":1556136033,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":1.108,"maxMs":0.188,"nodes":165,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":148.241,"maxMs":32.187,"nodes":37109,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:16:b","n":5,"seed":1556136033,"round":16,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":159.169,"maxMs":32.176,"nodes":43708,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.866,"maxMs":0.105,"nodes":144,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:17:a","n":5,"seed":2922342788,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":1.124,"maxMs":0.173,"nodes":170,"searches":12,"deepSearches":1,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":148.02,"maxMs":30.677,"nodes":37138,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:17:b","n":5,"seed":2922342788,"round":17,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":161.836,"maxMs":31.275,"nodes":43478,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.836,"maxMs":0.182,"nodes":130,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:18:a","n":5,"seed":2680180626,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":1.046,"maxMs":0.119,"nodes":166,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":157.973,"maxMs":32.983,"nodes":37982,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:18:b","n":5,"seed":2680180626,"round":18,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":166.638,"maxMs":31.164,"nodes":43832,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":1.159,"maxMs":0.231,"nodes":152,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:19:a","n":5,"seed":3424242822,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.853,"maxMs":0.166,"nodes":135,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":141.765,"maxMs":35.041,"nodes":35121,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-dynamic:minimax-d3:19:b","n":5,"seed":3424242822,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d3","moves":12,"totalMs":163.852,"maxMs":31.299,"nodes":43857,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.102,"maxMs":0.156,"nodes":150,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:0:a","n":5,"seed":2360984532,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":0.976,"maxMs":0.094,"nodes":176,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.087,"maxMs":0.17,"nodes":188,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:0:b","n":5,"seed":2360984532,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"greedy","moves":10,"totalMs":0.857,"maxMs":0.096,"nodes":177,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.708,"maxMs":0.097,"nodes":134,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:1:a","n":5,"seed":336190782,"round":1,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.908,"maxMs":0.167,"nodes":153,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.938,"maxMs":0.133,"nodes":170,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:1:b","n":5,"seed":336190782,"round":1,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.612,"maxMs":0.108,"nodes":139,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.58,"maxMs":0.115,"nodes":110,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:2:a","n":5,"seed":1915697798,"round":2,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.499,"maxMs":0.099,"nodes":122,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.572,"maxMs":0.094,"nodes":144,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:2:b","n":5,"seed":1915697798,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.705,"maxMs":0.146,"nodes":151,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.548,"maxMs":0.1,"nodes":108,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:3:a","n":5,"seed":637054772,"round":3,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.757,"maxMs":0.095,"nodes":153,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.814,"maxMs":0.099,"nodes":170,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:3:b","n":5,"seed":637054772,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"greedy","moves":12,"totalMs":1.036,"maxMs":0.157,"nodes":181,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":0.935,"maxMs":0.166,"nodes":140,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:4:a","n":5,"seed":1726377628,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-dynamic","moves":7,"totalMs":0.523,"maxMs":0.107,"nodes":120,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.554,"maxMs":0.135,"nodes":126,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:4:b","n":5,"seed":1726377628,"round":4,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"greedy","moves":14,"totalMs":1.337,"maxMs":0.194,"nodes":193,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.135,"maxMs":0.151,"nodes":158,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:5:a","n":5,"seed":1255986265,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.746,"maxMs":0.094,"nodes":153,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.778,"maxMs":0.096,"nodes":162,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:5:b","n":5,"seed":1255986265,"round":5,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"greedy","moves":10,"totalMs":0.75,"maxMs":0.098,"nodes":161,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.775,"maxMs":0.164,"nodes":130,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:6:a","n":5,"seed":4231196856,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.711,"maxMs":0.101,"nodes":150,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.701,"maxMs":0.104,"nodes":156,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:6:b","n":5,"seed":4231196856,"round":6,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"greedy","moves":10,"totalMs":0.766,"maxMs":0.099,"nodes":161,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.703,"maxMs":0.098,"nodes":128,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:7:a","n":5,"seed":3326570832,"round":7,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":0.947,"maxMs":0.107,"nodes":167,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":1.046,"maxMs":0.122,"nodes":184,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:7:b","n":5,"seed":3326570832,"round":7,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":0.916,"maxMs":0.095,"nodes":187,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.943,"maxMs":0.144,"nodes":156,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:8:a","n":5,"seed":2949321839,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.856,"maxMs":0.175,"nodes":157,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.758,"maxMs":0.095,"nodes":166,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:8:b","n":5,"seed":2949321839,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":0.857,"maxMs":0.158,"nodes":163,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.646,"maxMs":0.099,"nodes":119,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:9:a","n":5,"seed":603062061,"round":9,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.646,"maxMs":0.118,"nodes":133,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.872,"maxMs":0.176,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:9:b","n":5,"seed":603062061,"round":9,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"greedy","moves":14,"totalMs":1.066,"maxMs":0.098,"nodes":189,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.096,"maxMs":0.166,"nodes":156,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:10:a","n":5,"seed":2608070357,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.658,"maxMs":0.09,"nodes":146,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.667,"maxMs":0.095,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:10:b","n":5,"seed":2608070357,"round":10,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":1.183,"maxMs":0.145,"nodes":209,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":1.083,"maxMs":0.094,"nodes":175,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:11:a","n":5,"seed":246169904,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.694,"maxMs":0.099,"nodes":144,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.704,"maxMs":0.103,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:11:b","n":5,"seed":246169904,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":0.851,"maxMs":0.185,"nodes":161,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.715,"maxMs":0.163,"nodes":119,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:12:a","n":5,"seed":1241848127,"round":12,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":0.918,"maxMs":0.13,"nodes":160,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":0.92,"maxMs":0.093,"nodes":176,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:12:b","n":5,"seed":1241848127,"round":12,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":0.891,"maxMs":0.097,"nodes":175,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.888,"maxMs":0.126,"nodes":140,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:13:a","n":5,"seed":1556351690,"round":13,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":1.095,"maxMs":0.111,"nodes":190,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.202,"maxMs":0.138,"nodes":206,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:13:b","n":5,"seed":1556351690,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.664,"maxMs":0.143,"nodes":139,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":7,"totalMs":0.659,"maxMs":0.264,"nodes":95,"searches":5,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:14:a","n":5,"seed":2514874144,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.578,"maxMs":0.092,"nodes":133,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.593,"maxMs":0.094,"nodes":140,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:14:b","n":5,"seed":2514874144,"round":14,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":0.987,"maxMs":0.185,"nodes":175,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.852,"maxMs":0.098,"nodes":140,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:15:a","n":5,"seed":4172979844,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.888,"maxMs":0.174,"nodes":159,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.812,"maxMs":0.105,"nodes":166,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:15:b","n":5,"seed":4172979844,"round":15,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":0.942,"maxMs":0.102,"nodes":181,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.854,"maxMs":0.092,"nodes":148,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:16:a","n":5,"seed":4252162739,"round":16,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":1.047,"maxMs":0.142,"nodes":178,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.032,"maxMs":0.091,"nodes":192,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:16:b","n":5,"seed":4252162739,"round":16,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":0.952,"maxMs":0.143,"nodes":181,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.847,"maxMs":0.09,"nodes":150,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:17:a","n":5,"seed":3067864896,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.66,"maxMs":0.092,"nodes":148,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.677,"maxMs":0.096,"nodes":154,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:17:b","n":5,"seed":3067864896,"round":17,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":0.934,"maxMs":0.121,"nodes":175,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.829,"maxMs":0.091,"nodes":142,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:18:a","n":5,"seed":2796316090,"round":18,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.613,"maxMs":0.107,"nodes":133,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.672,"maxMs":0.097,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:18:b","n":5,"seed":2796316090,"round":18,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"greedy","moves":10,"totalMs":1.065,"maxMs":0.24,"nodes":169,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":1.035,"maxMs":0.213,"nodes":136,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:19:a","n":5,"seed":3131961485,"round":19,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.757,"maxMs":0.196,"nodes":135,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.761,"maxMs":0.135,"nodes":156,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:greedy:19:b","n":5,"seed":3131961485,"round":19,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"greedy","moves":13,"totalMs":0.974,"maxMs":0.092,"nodes":191,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":0.942,"maxMs":0.093,"nodes":157,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:0:a","n":5,"seed":1151323532,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.711,"maxMs":0.164,"nodes":130,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.077,"maxMs":0.031,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:0:b","n":5,"seed":1151323532,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.142,"maxMs":0.064,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":0.997,"maxMs":0.115,"nodes":161,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:1:a","n":5,"seed":2140195228,"round":1,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":0.957,"maxMs":0.11,"nodes":180,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.058,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:1:b","n":5,"seed":2140195228,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.059,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.805,"maxMs":0.102,"nodes":149,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:2:a","n":5,"seed":899007921,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"minimax-dynamic","moves":16,"totalMs":1.5,"maxMs":0.226,"nodes":215,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.123,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:2:b","n":5,"seed":899007921,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.072,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":0.93,"maxMs":0.097,"nodes":164,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:3:a","n":5,"seed":1707955630,"round":3,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.86,"maxMs":0.107,"nodes":168,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.055,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:3:b","n":5,"seed":1707955630,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.066,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":0.979,"maxMs":0.162,"nodes":156,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:4:a","n":5,"seed":1198099845,"round":4,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":0.862,"maxMs":0.102,"nodes":179,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.056,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:4:b","n":5,"seed":1198099845,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.135,"maxMs":0.033,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.394,"maxMs":0.225,"nodes":165,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:5:a","n":5,"seed":2298919643,"round":5,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":1.222,"maxMs":0.204,"nodes":174,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.067,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:5:b","n":5,"seed":2298919643,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.029,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":8,"totalMs":0.545,"maxMs":0.093,"nodes":110,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:6:a","n":5,"seed":2741787223,"round":6,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.912,"maxMs":0.133,"nodes":160,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.048,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:6:b","n":5,"seed":2741787223,"round":6,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"random","moves":16,"totalMs":0.094,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":1.432,"maxMs":0.18,"nodes":202,"searches":14,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:7:a","n":5,"seed":873288982,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.806,"maxMs":0.106,"nodes":163,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.037,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:7:b","n":5,"seed":873288982,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.062,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":0.943,"maxMs":0.1,"nodes":168,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:8:a","n":5,"seed":268178456,"round":8,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.691,"maxMs":0.119,"nodes":134,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.029,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:8:b","n":5,"seed":268178456,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.055,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.051,"maxMs":0.176,"nodes":154,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:9:a","n":5,"seed":1228001398,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":1.083,"maxMs":0.111,"nodes":200,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.065,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:9:b","n":5,"seed":1228001398,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.038,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.711,"maxMs":0.092,"nodes":142,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:10:a","n":5,"seed":1562513779,"round":10,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-dynamic","moves":8,"totalMs":0.544,"maxMs":0.1,"nodes":120,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.022,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:10:b","n":5,"seed":1562513779,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.062,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.025,"maxMs":0.164,"nodes":159,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:11:a","n":5,"seed":3067335959,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":1.14,"maxMs":0.11,"nodes":188,"searches":13,"deepSearches":1,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.069,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:11:b","n":5,"seed":3067335959,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.043,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":0.829,"maxMs":0.099,"nodes":155,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:12:a","n":5,"seed":616850111,"round":12,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":1.026,"maxMs":0.162,"nodes":177,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.06,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:12:b","n":5,"seed":616850111,"round":12,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"random","moves":13,"totalMs":0.058,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.009,"maxMs":0.115,"nodes":153,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:13:a","n":5,"seed":3076070219,"round":13,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":1.571,"maxMs":0.236,"nodes":209,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.102,"maxMs":0.019,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:13:b","n":5,"seed":3076070219,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.083,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":1.288,"maxMs":0.201,"nodes":188,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:14:a","n":5,"seed":2032792111,"round":14,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.728,"maxMs":0.102,"nodes":142,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":9,"totalMs":0.036,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:14:b","n":5,"seed":2032792111,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.036,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.688,"maxMs":0.092,"nodes":136,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:15:a","n":5,"seed":3865804354,"round":15,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":0.917,"maxMs":0.103,"nodes":170,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.046,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:15:b","n":5,"seed":3865804354,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.031,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.716,"maxMs":0.187,"nodes":131,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:16:a","n":5,"seed":306761365,"round":16,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":0.971,"maxMs":0.095,"nodes":174,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.05,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:16:b","n":5,"seed":306761365,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.037,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":0.645,"maxMs":0.089,"nodes":132,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:17:a","n":5,"seed":1957235827,"round":17,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.741,"maxMs":0.095,"nodes":168,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.035,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:17:b","n":5,"seed":1957235827,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.057,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.029,"maxMs":0.153,"nodes":185,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:18:a","n":5,"seed":1394870808,"round":18,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":0.712,"maxMs":0.102,"nodes":154,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":9,"totalMs":0.032,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:18:b","n":5,"seed":1394870808,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.029,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":0.645,"maxMs":0.098,"nodes":121,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:19:a","n":5,"seed":1811535624,"round":19,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":0.789,"maxMs":0.098,"nodes":167,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.034,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-dynamic:random:19:b","n":5,"seed":1811535624,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.048,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":0.907,"maxMs":0.137,"nodes":156,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:0:a","n":5,"seed":2838380457,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d2","moves":11,"totalMs":10.159,"maxMs":1.466,"nodes":2590,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":148.077,"maxMs":30.405,"nodes":37064,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:0:b","n":5,"seed":2838380457,"round":0,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":196.717,"maxMs":34.217,"nodes":43481,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":13.005,"maxMs":2.987,"nodes":2274,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:1:a","n":5,"seed":36915689,"round":1,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":12.887,"maxMs":2.136,"nodes":2607,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":182.092,"maxMs":39.582,"nodes":37025,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:1:b","n":5,"seed":36915689,"round":1,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":163.364,"maxMs":32.379,"nodes":43855,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":9.994,"maxMs":1.463,"nodes":2326,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:2:a","n":5,"seed":1565880073,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":11.797,"maxMs":3.148,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":137.052,"maxMs":33.648,"nodes":33992,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:2:b","n":5,"seed":1565880073,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d3","moves":10,"totalMs":171.511,"maxMs":33.155,"nodes":44019,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":9.646,"maxMs":1.701,"nodes":2226,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:3:a","n":5,"seed":3894324494,"round":3,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d2","moves":15,"totalMs":10.879,"maxMs":1.413,"nodes":2741,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":152.986,"maxMs":30.328,"nodes":37928,"searches":13,"deepSearches":13,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:3:b","n":5,"seed":3894324494,"round":3,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":149.047,"maxMs":32.347,"nodes":40938,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":8.053,"maxMs":1.64,"nodes":2020,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:4:a","n":5,"seed":2046990932,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d2","moves":12,"totalMs":10.162,"maxMs":1.437,"nodes":2607,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":145.996,"maxMs":32.135,"nodes":37151,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:4:b","n":5,"seed":2046990932,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d3","moves":13,"totalMs":174.524,"maxMs":32.379,"nodes":44774,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":10.428,"maxMs":1.746,"nodes":2442,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:5:a","n":5,"seed":1291608623,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d2","moves":12,"totalMs":13.391,"maxMs":2.623,"nodes":2627,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":168.075,"maxMs":34.505,"nodes":37049,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:5:b","n":5,"seed":1291608623,"round":5,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":158.153,"maxMs":31.557,"nodes":43651,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":9.176,"maxMs":1.579,"nodes":2274,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:6:a","n":5,"seed":1825272548,"round":6,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":9.696,"maxMs":1.454,"nodes":2555,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":145.064,"maxMs":31.846,"nodes":36555,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:6:b","n":5,"seed":1825272548,"round":6,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":154.285,"maxMs":31.579,"nodes":42459,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":8.692,"maxMs":1.399,"nodes":2190,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:7:a","n":5,"seed":1591172621,"round":7,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":10.274,"maxMs":1.452,"nodes":2609,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":153.549,"maxMs":31.926,"nodes":37111,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:7:b","n":5,"seed":1591172621,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d3","moves":10,"totalMs":157.57,"maxMs":31.584,"nodes":43573,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":9.236,"maxMs":1.424,"nodes":2224,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:8:a","n":5,"seed":3389777582,"round":8,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d2","moves":16,"totalMs":11.372,"maxMs":1.422,"nodes":2830,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-d3","moves":15,"totalMs":154.218,"maxMs":32.21,"nodes":38573,"searches":14,"deepSearches":14,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:8:b","n":5,"seed":3389777582,"round":8,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d3","moves":10,"totalMs":151.813,"maxMs":31.444,"nodes":43154,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":8.749,"maxMs":1.62,"nodes":2224,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:9:a","n":5,"seed":3010035609,"round":9,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":10.297,"maxMs":1.505,"nodes":2609,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":149.642,"maxMs":30.258,"nodes":37053,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:9:b","n":5,"seed":3010035609,"round":9,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":181.408,"maxMs":32.329,"nodes":46539,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":11.556,"maxMs":1.638,"nodes":2563,"searches":12,"deepSearches":12,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:10:a","n":5,"seed":2278163210,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d2","moves":12,"totalMs":10.759,"maxMs":1.717,"nodes":2607,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":146.538,"maxMs":31.326,"nodes":36886,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:10:b","n":5,"seed":2278163210,"round":10,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":170.278,"maxMs":33.815,"nodes":44334,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":12.396,"maxMs":2.991,"nodes":2392,"searches":12,"deepSearches":12,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:11:a","n":5,"seed":1659578422,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":11.15,"maxMs":3.824,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":150.839,"maxMs":33.41,"nodes":35064,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:11:b","n":5,"seed":1659578422,"round":11,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d3","moves":15,"totalMs":224.619,"maxMs":41.41,"nodes":53127,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":14.006,"maxMs":1.748,"nodes":3168,"searches":13,"deepSearches":13,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:12:a","n":5,"seed":119651130,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"minimax-d2","moves":16,"totalMs":11.601,"maxMs":1.389,"nodes":2761,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-d3","moves":16,"totalMs":150.75,"maxMs":31.075,"nodes":37584,"searches":14,"deepSearches":14,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:12:b","n":5,"seed":119651130,"round":12,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":169.614,"maxMs":33.735,"nodes":43817,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":9.794,"maxMs":1.418,"nodes":2302,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:13:a","n":5,"seed":1843943598,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"minimax-d2","moves":6,"totalMs":6.686,"maxMs":1.744,"nodes":2045,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":103.446,"maxMs":30.568,"nodes":30132,"searches":4,"deepSearches":4,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:13:b","n":5,"seed":1843943598,"round":13,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d3","moves":10,"totalMs":158.7,"maxMs":32.363,"nodes":43204,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":8.988,"maxMs":1.481,"nodes":2264,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:14:a","n":5,"seed":3196168628,"round":14,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":10.171,"maxMs":1.579,"nodes":2633,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":142.18,"maxMs":29.505,"nodes":37209,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:14:b","n":5,"seed":3196168628,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d3","moves":9,"totalMs":150.072,"maxMs":30.588,"nodes":43100,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":8.109,"maxMs":1.536,"nodes":2142,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:15:a","n":5,"seed":4100265140,"round":15,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":9.44,"maxMs":1.412,"nodes":2555,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":139.26,"maxMs":29.7,"nodes":36439,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:15:b","n":5,"seed":4100265140,"round":15,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":153.825,"maxMs":30.857,"nodes":43778,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":8.838,"maxMs":1.359,"nodes":2300,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:16:a","n":5,"seed":1090237860,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":9.951,"maxMs":1.698,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":146.172,"maxMs":32.035,"nodes":35056,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:16:b","n":5,"seed":1090237860,"round":16,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":142.243,"maxMs":33.778,"nodes":38539,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"minimax-d2","moves":6,"totalMs":7.431,"maxMs":1.685,"nodes":1850,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:17:a","n":5,"seed":3609482325,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":9.289,"maxMs":1.652,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":153.853,"maxMs":32.97,"nodes":35032,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:17:b","n":5,"seed":3609482325,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d3","moves":14,"totalMs":276.368,"maxMs":47.04,"nodes":44367,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":21.947,"maxMs":4.069,"nodes":2394,"searches":12,"deepSearches":12,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:18:a","n":5,"seed":3319731727,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d2","moves":13,"totalMs":16.996,"maxMs":2.725,"nodes":2612,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":303.16,"maxMs":76.46,"nodes":37072,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:18:b","n":5,"seed":3319731727,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-d3","moves":15,"totalMs":238.254,"maxMs":33.991,"nodes":55760,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":14.912,"maxMs":1.536,"nodes":3154,"searches":13,"deepSearches":13,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:19:a","n":5,"seed":3316495337,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d2","moves":12,"totalMs":11.876,"maxMs":2.213,"nodes":2607,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":152.59,"maxMs":32.869,"nodes":37042,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:minimax-d3:19:b","n":5,"seed":3316495337,"round":19,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":180.19,"maxMs":33.052,"nodes":43819,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":11.383,"maxMs":2.04,"nodes":2330,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:greedy:0:a","n":5,"seed":2947018501,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d2","moves":14,"totalMs":14.687,"maxMs":1.738,"nodes":2895,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":1.345,"maxMs":0.241,"nodes":202,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:0:b","n":5,"seed":2947018501,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"greedy","moves":13,"totalMs":1.545,"maxMs":0.209,"nodes":201,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":11.484,"maxMs":1.585,"nodes":2359,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:greedy:1:a","n":5,"seed":1659349577,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d2","moves":12,"totalMs":17.335,"maxMs":2.595,"nodes":2657,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":1.63,"maxMs":0.279,"nodes":178,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:1:b","n":5,"seed":1659349577,"round":1,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":1.929,"maxMs":0.309,"nodes":177,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":19.542,"maxMs":2.683,"nodes":2080,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:greedy:2:a","n":5,"seed":1127799071,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d2","moves":9,"totalMs":17.065,"maxMs":3.227,"nodes":2488,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":1.393,"maxMs":0.241,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:2:b","n":5,"seed":1127799071,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":1.25,"maxMs":0.211,"nodes":161,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":13.361,"maxMs":2.359,"nodes":1911,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:greedy:3:a","n":5,"seed":3057275608,"round":3,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":11.111,"maxMs":2.149,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":1.142,"maxMs":0.389,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:3:b","n":5,"seed":3057275608,"round":3,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"greedy","moves":10,"totalMs":1.057,"maxMs":0.274,"nodes":169,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":12.322,"maxMs":1.956,"nodes":2224,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d2:greedy:4:a","n":5,"seed":3624808853,"round":4,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d2","moves":14,"totalMs":15.268,"maxMs":2.416,"nodes":2714,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.768,"maxMs":0.277,"nodes":194,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:4:b","n":5,"seed":3624808853,"round":4,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.737,"maxMs":0.118,"nodes":151,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":11.04,"maxMs":3.16,"nodes":1911,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:greedy:5:a","n":5,"seed":3343687111,"round":5,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d2","moves":14,"totalMs":11.6,"maxMs":1.877,"nodes":2676,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.186,"maxMs":0.143,"nodes":192,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:5:b","n":5,"seed":3343687111,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"greedy","moves":12,"totalMs":1.855,"maxMs":0.771,"nodes":195,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":13.565,"maxMs":2.774,"nodes":2268,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:greedy:6:a","n":5,"seed":2065992246,"round":6,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":9.441,"maxMs":1.495,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.797,"maxMs":0.153,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:6:b","n":5,"seed":2065992246,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"greedy","moves":10,"totalMs":0.879,"maxMs":0.115,"nodes":175,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":9.324,"maxMs":1.627,"nodes":2060,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d2:greedy:7:a","n":5,"seed":1496460740,"round":7,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":8.565,"maxMs":1.825,"nodes":2304,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.596,"maxMs":0.101,"nodes":144,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:7:b","n":5,"seed":1496460740,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"greedy","moves":13,"totalMs":1.317,"maxMs":0.256,"nodes":197,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":10.193,"maxMs":1.476,"nodes":2289,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:greedy:8:a","n":5,"seed":2056990394,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d2","moves":9,"totalMs":10.477,"maxMs":1.696,"nodes":2488,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.908,"maxMs":0.14,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:8:b","n":5,"seed":2056990394,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":0.767,"maxMs":0.121,"nodes":161,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":8.596,"maxMs":1.593,"nodes":1911,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:greedy:9:a","n":5,"seed":893924958,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":9.611,"maxMs":1.812,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.696,"maxMs":0.155,"nodes":140,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:9:b","n":5,"seed":893924958,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":0.848,"maxMs":0.138,"nodes":161,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":8.866,"maxMs":1.884,"nodes":1911,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:greedy:10:a","n":5,"seed":373012053,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d2","moves":12,"totalMs":13.096,"maxMs":1.509,"nodes":3031,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":1.067,"maxMs":0.158,"nodes":196,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:10:b","n":5,"seed":373012053,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.659,"maxMs":0.154,"nodes":139,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":6.691,"maxMs":1.46,"nodes":1665,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:minimax-d2:greedy:11:a","n":5,"seed":2175431640,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":10.432,"maxMs":2.126,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.692,"maxMs":0.135,"nodes":140,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:11:b","n":5,"seed":2175431640,"round":11,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.547,"maxMs":0.092,"nodes":139,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":7,"totalMs":6.856,"maxMs":1.42,"nodes":1810,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d2:greedy:12:a","n":5,"seed":2138130524,"round":12,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":10.682,"maxMs":2.111,"nodes":2553,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.995,"maxMs":0.165,"nodes":170,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:12:b","n":5,"seed":2138130524,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"greedy","moves":15,"totalMs":1.434,"maxMs":0.17,"nodes":231,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":13.671,"maxMs":1.525,"nodes":2813,"searches":13,"deepSearches":13,"illegal":0}},{"id":"5:minimax-d2:greedy:13:a","n":5,"seed":625885639,"round":13,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":11.08,"maxMs":1.431,"nodes":2657,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":1.202,"maxMs":0.263,"nodes":186,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:13:b","n":5,"seed":625885639,"round":13,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":1.219,"maxMs":0.161,"nodes":199,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":10.351,"maxMs":1.504,"nodes":2253,"searches":13,"deepSearches":13,"illegal":0}},{"id":"5:minimax-d2:greedy:14:a","n":5,"seed":97619825,"round":14,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":10.083,"maxMs":1.586,"nodes":2555,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":1.178,"maxMs":0.219,"nodes":172,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:14:b","n":5,"seed":97619825,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"greedy","moves":17,"totalMs":1.514,"maxMs":0.188,"nodes":229,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":17,"totalMs":12.18,"maxMs":1.464,"nodes":2435,"searches":15,"deepSearches":15,"illegal":0}},{"id":"5:minimax-d2:greedy:15:a","n":5,"seed":3293908912,"round":15,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":10.936,"maxMs":1.707,"nodes":2555,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.931,"maxMs":0.13,"nodes":172,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:15:b","n":5,"seed":3293908912,"round":15,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"greedy","moves":13,"totalMs":0.999,"maxMs":0.105,"nodes":183,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":9.499,"maxMs":1.5,"nodes":2089,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:greedy:16:a","n":5,"seed":776307791,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d2","moves":8,"totalMs":9.053,"maxMs":1.716,"nodes":2387,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.641,"maxMs":0.119,"nodes":140,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:16:b","n":5,"seed":776307791,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"greedy","moves":14,"totalMs":1.562,"maxMs":0.32,"nodes":223,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":13.467,"maxMs":1.811,"nodes":2576,"searches":12,"deepSearches":12,"illegal":0}},{"id":"5:minimax-d2:greedy:17:a","n":5,"seed":2968838878,"round":17,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d2","moves":10,"totalMs":10.297,"maxMs":1.707,"nodes":2488,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":0.933,"maxMs":0.182,"nodes":162,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:17:b","n":5,"seed":2968838878,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.773,"maxMs":0.16,"nodes":151,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":8.297,"maxMs":2.177,"nodes":1810,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d2:greedy:18:a","n":5,"seed":4233279521,"round":18,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d2","moves":12,"totalMs":10.925,"maxMs":1.459,"nodes":2592,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":1.266,"maxMs":0.209,"nodes":178,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:18:b","n":5,"seed":4233279521,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":0.76,"maxMs":0.147,"nodes":153,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":7.55,"maxMs":1.525,"nodes":1814,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d2:greedy:19:a","n":5,"seed":1610444215,"round":19,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":12.241,"maxMs":2.257,"nodes":2553,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":1.049,"maxMs":0.228,"nodes":170,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:greedy:19:b","n":5,"seed":1610444215,"round":19,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"greedy","moves":10,"totalMs":0.842,"maxMs":0.115,"nodes":163,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.538,"maxMs":1.469,"nodes":2060,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d2:random:0:a","n":5,"seed":2565409517,"round":0,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":9.001,"maxMs":1.529,"nodes":2569,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.037,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:0:b","n":5,"seed":2565409517,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.131,"maxMs":0.021,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":14.279,"maxMs":2.773,"nodes":2752,"searches":13,"deepSearches":13,"illegal":0}},{"id":"5:minimax-d2:random:1:a","n":5,"seed":1148825826,"round":1,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":7.496,"maxMs":1.825,"nodes":1856,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.031,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:1:b","n":5,"seed":1148825826,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.045,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.561,"maxMs":1.947,"nodes":2267,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:random:2:a","n":5,"seed":1543740455,"round":2,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d2","moves":7,"totalMs":7.446,"maxMs":1.738,"nodes":1852,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.05,"maxMs":0.029,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:2:b","n":5,"seed":1543740455,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.081,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":10.094,"maxMs":1.484,"nodes":2201,"searches":12,"deepSearches":12,"illegal":0}},{"id":"5:minimax-d2:random:3:a","n":5,"seed":2944524929,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d2","moves":13,"totalMs":14.72,"maxMs":2.772,"nodes":2938,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.107,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:3:b","n":5,"seed":2944524929,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.069,"maxMs":0.027,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.046,"maxMs":1.734,"nodes":2071,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:random:4:a","n":5,"seed":1107073440,"round":4,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":11.468,"maxMs":1.948,"nodes":3021,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.047,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:4:b","n":5,"seed":1107073440,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.047,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.12,"maxMs":2.133,"nodes":1959,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:random:5:a","n":5,"seed":3297150426,"round":5,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":7.25,"maxMs":1.415,"nodes":2246,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.025,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:5:b","n":5,"seed":3297150426,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.036,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":8.22,"maxMs":1.702,"nodes":1911,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:random:6:a","n":5,"seed":1172022026,"round":6,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":8.682,"maxMs":1.393,"nodes":2370,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.035,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:6:b","n":5,"seed":1172022026,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.056,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":10.549,"maxMs":2.305,"nodes":2355,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d2:random:7:a","n":5,"seed":1262688316,"round":7,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":13.004,"maxMs":1.689,"nodes":3105,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.076,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:7:b","n":5,"seed":1262688316,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.151,"maxMs":0.027,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":16.09,"maxMs":2.623,"nodes":2119,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:random:8:a","n":5,"seed":1989761374,"round":8,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":17.196,"maxMs":3.149,"nodes":2778,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.159,"maxMs":0.061,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:8:b","n":5,"seed":1989761374,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.146,"maxMs":0.072,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":13.02,"maxMs":2.014,"nodes":2110,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d2:random:9:a","n":5,"seed":3662440927,"round":9,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":11.3,"maxMs":1.94,"nodes":2653,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.056,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:9:b","n":5,"seed":3662440927,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.088,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":16.396,"maxMs":3.146,"nodes":2341,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d2:random:10:a","n":5,"seed":2804193786,"round":10,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d2","moves":9,"totalMs":13.279,"maxMs":2.397,"nodes":2645,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.071,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:10:b","n":5,"seed":2804193786,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.053,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.748,"maxMs":2.473,"nodes":1967,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:random:11:a","n":5,"seed":2289349908,"round":11,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d2","moves":16,"totalMs":12.892,"maxMs":1.356,"nodes":3012,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.113,"maxMs":0.028,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:11:b","n":5,"seed":2289349908,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.074,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":11.746,"maxMs":1.573,"nodes":2667,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d2:random:12:a","n":5,"seed":4288819082,"round":12,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d2","moves":14,"totalMs":15.496,"maxMs":1.922,"nodes":3122,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.103,"maxMs":0.021,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:12:b","n":5,"seed":4288819082,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.124,"maxMs":0.036,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":12.302,"maxMs":2.107,"nodes":2332,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d2:random:13:a","n":5,"seed":1288212864,"round":13,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":16.264,"maxMs":1.998,"nodes":3163,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.126,"maxMs":0.023,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:13:b","n":5,"seed":1288212864,"round":13,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"random","moves":9,"totalMs":0.104,"maxMs":0.047,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":15.062,"maxMs":3.037,"nodes":1973,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:random:14:a","n":5,"seed":3178020408,"round":14,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d2","moves":10,"totalMs":12.656,"maxMs":2.08,"nodes":2436,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"random","moves":9,"totalMs":0.068,"maxMs":0.02,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:14:b","n":5,"seed":3178020408,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.155,"maxMs":0.041,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":17.008,"maxMs":2.265,"nodes":2728,"searches":12,"deepSearches":12,"illegal":0}},{"id":"5:minimax-d2:random:15:a","n":5,"seed":856633910,"round":15,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":11.529,"maxMs":1.685,"nodes":2793,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.052,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:15:b","n":5,"seed":856633910,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.064,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":12.119,"maxMs":2.768,"nodes":2516,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d2:random:16:a","n":5,"seed":2521500577,"round":16,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":8.112,"maxMs":1.851,"nodes":2084,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.038,"maxMs":0.019,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:16:b","n":5,"seed":2521500577,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.036,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":8,"totalMs":8.545,"maxMs":1.863,"nodes":2136,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d2:random:17:a","n":5,"seed":3137397964,"round":17,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d2","moves":8,"totalMs":8.969,"maxMs":1.725,"nodes":2024,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.031,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:17:b","n":5,"seed":3137397964,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.055,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":10.345,"maxMs":1.531,"nodes":2505,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d2:random:18:a","n":5,"seed":3591579908,"round":18,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":11.927,"maxMs":1.897,"nodes":2610,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.095,"maxMs":0.02,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:18:b","n":5,"seed":3591579908,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.04,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":9.436,"maxMs":1.707,"nodes":2137,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d2:random:19:a","n":5,"seed":3427584984,"round":19,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":11.246,"maxMs":1.653,"nodes":3043,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.049,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d2:random:19:b","n":5,"seed":3427584984,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"random","moves":9,"totalMs":0.044,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":10.346,"maxMs":2.545,"nodes":2299,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d3:greedy:0:a","n":5,"seed":3669876099,"round":0,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":185.16,"maxMs":34.596,"nodes":44135,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":1.051,"maxMs":0.171,"nodes":174,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:0:b","n":5,"seed":3669876099,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":0.978,"maxMs":0.377,"nodes":125,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":122.964,"maxMs":33.161,"nodes":25804,"searches":4,"deepSearches":4,"illegal":0}},{"id":"5:minimax-d3:greedy:1:a","n":5,"seed":2520753804,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d3","moves":13,"totalMs":282.311,"maxMs":56.273,"nodes":50014,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.738,"maxMs":0.267,"nodes":206,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:1:b","n":5,"seed":2520753804,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"greedy","moves":11,"totalMs":1.597,"maxMs":0.314,"nodes":175,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":182.21,"maxMs":40.985,"nodes":31149,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d3:greedy:2:a","n":5,"seed":4209688703,"round":2,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":334.03,"maxMs":84.772,"nodes":44776,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":1.58,"maxMs":0.502,"nodes":158,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:2:b","n":5,"seed":4209688703,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":1.141,"maxMs":0.333,"nodes":139,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":214.509,"maxMs":56.827,"nodes":28261,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:minimax-d3:greedy:3:a","n":5,"seed":4136962505,"round":3,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":235.865,"maxMs":46.439,"nodes":43848,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":1.249,"maxMs":0.185,"nodes":176,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:3:b","n":5,"seed":4136962505,"round":3,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":1.389,"maxMs":0.253,"nodes":175,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":163.7,"maxMs":36.944,"nodes":31188,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d3:greedy:4:a","n":5,"seed":2805139624,"round":4,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d3","moves":10,"totalMs":220.639,"maxMs":35.073,"nodes":43220,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":1.126,"maxMs":0.204,"nodes":162,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:4:b","n":5,"seed":2805139624,"round":4,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"greedy","moves":11,"totalMs":1.256,"maxMs":0.249,"nodes":169,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":199.712,"maxMs":76.04,"nodes":30804,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d3:greedy:5:a","n":5,"seed":3803462612,"round":5,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":189.372,"maxMs":43.111,"nodes":41020,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.945,"maxMs":0.237,"nodes":142,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:5:b","n":5,"seed":3803462612,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"greedy","moves":10,"totalMs":1.547,"maxMs":0.499,"nodes":169,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":181.665,"maxMs":43.942,"nodes":30926,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:greedy:6:a","n":5,"seed":823776380,"round":6,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d3","moves":15,"totalMs":204.778,"maxMs":35.768,"nodes":44792,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":1.436,"maxMs":0.157,"nodes":200,"searches":14,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:6:b","n":5,"seed":823776380,"round":6,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.976,"maxMs":0.282,"nodes":151,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":148.702,"maxMs":38.361,"nodes":29388,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d3:greedy:7:a","n":5,"seed":61426245,"round":7,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":285.445,"maxMs":60.658,"nodes":43692,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":1.713,"maxMs":0.316,"nodes":170,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:7:b","n":5,"seed":61426245,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"greedy","moves":6,"totalMs":1.241,"maxMs":0.385,"nodes":125,"searches":6,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":180.146,"maxMs":48.631,"nodes":25875,"searches":4,"deepSearches":4,"illegal":0}},{"id":"5:minimax-d3:greedy:8:a","n":5,"seed":3466563122,"round":8,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":302.068,"maxMs":80.542,"nodes":43899,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":1.95,"maxMs":0.434,"nodes":182,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:8:b","n":5,"seed":3466563122,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"greedy","moves":10,"totalMs":1.198,"maxMs":0.182,"nodes":171,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":145.635,"maxMs":35.659,"nodes":30982,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:greedy:9:a","n":5,"seed":1601905598,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d3","moves":13,"totalMs":179.52,"maxMs":34.86,"nodes":43867,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.473,"maxMs":0.267,"nodes":180,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:9:b","n":5,"seed":1601905598,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":1.079,"maxMs":0.276,"nodes":165,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":9,"totalMs":140.369,"maxMs":34.814,"nodes":31253,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d3:greedy:10:a","n":5,"seed":1882580599,"round":10,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":189.098,"maxMs":44.542,"nodes":42343,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":1.109,"maxMs":0.295,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:10:b","n":5,"seed":1882580599,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"greedy","moves":12,"totalMs":1.472,"maxMs":0.267,"nodes":179,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":187.778,"maxMs":34.587,"nodes":31121,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d3:greedy:11:a","n":5,"seed":3597402190,"round":11,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":250.922,"maxMs":43.769,"nodes":45938,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":2.071,"maxMs":0.368,"nodes":202,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:11:b","n":5,"seed":3597402190,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":1.278,"maxMs":0.25,"nodes":151,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":162.775,"maxMs":43.599,"nodes":29718,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d3:greedy:12:a","n":5,"seed":2708720597,"round":12,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":175.388,"maxMs":35.859,"nodes":43762,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":1.213,"maxMs":0.294,"nodes":176,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:12:b","n":5,"seed":2708720597,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"greedy","moves":7,"totalMs":0.618,"maxMs":0.11,"nodes":139,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":113.868,"maxMs":31.445,"nodes":28227,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:minimax-d3:greedy:13:a","n":5,"seed":3367530552,"round":13,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":178.32,"maxMs":32.143,"nodes":43649,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.912,"maxMs":0.111,"nodes":170,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:13:b","n":5,"seed":3367530552,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"greedy","moves":10,"totalMs":1.063,"maxMs":0.188,"nodes":169,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":138.126,"maxMs":31.706,"nodes":31052,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:greedy:14:a","n":5,"seed":859808517,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"minimax-d3","moves":8,"totalMs":161.244,"maxMs":33.508,"nodes":42181,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.726,"maxMs":0.137,"nodes":140,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:14:b","n":5,"seed":859808517,"round":14,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.706,"maxMs":0.109,"nodes":139,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":133.773,"maxMs":34.941,"nodes":28542,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d3:greedy:15:a","n":5,"seed":2266626337,"round":15,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":203.245,"maxMs":57.338,"nodes":42451,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.889,"maxMs":0.19,"nodes":152,"searches":8,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:15:b","n":5,"seed":2266626337,"round":15,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.984,"maxMs":0.257,"nodes":139,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":152.488,"maxMs":35.301,"nodes":28739,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d3:greedy:16:a","n":5,"seed":3410380811,"round":16,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":251.726,"maxMs":50.619,"nodes":45913,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.696,"maxMs":0.258,"nodes":204,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:16:b","n":5,"seed":3410380811,"round":16,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"greedy","moves":10,"totalMs":0.872,"maxMs":0.148,"nodes":161,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":9,"totalMs":125.719,"maxMs":29.601,"nodes":30209,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:greedy:17:a","n":5,"seed":3239241338,"round":17,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":170.911,"maxMs":31.503,"nodes":44142,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.985,"maxMs":0.114,"nodes":174,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:17:b","n":5,"seed":3239241338,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"greedy","moves":10,"totalMs":1.401,"maxMs":0.245,"nodes":171,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":172.665,"maxMs":38.973,"nodes":30954,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:greedy:18:a","n":5,"seed":286974457,"round":18,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":320.852,"maxMs":73.093,"nodes":43838,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":1.314,"maxMs":0.247,"nodes":176,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:18:b","n":5,"seed":286974457,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":1.311,"maxMs":0.485,"nodes":151,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":170.465,"maxMs":40.434,"nodes":29769,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d3:greedy:19:a","n":5,"seed":296689867,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"minimax-d3","moves":7,"totalMs":175.627,"maxMs":40.548,"nodes":40606,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.676,"maxMs":0.165,"nodes":126,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:greedy:19:b","n":5,"seed":296689867,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":0.909,"maxMs":0.203,"nodes":161,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":9,"totalMs":131.254,"maxMs":30.111,"nodes":30559,"searches":7,"deepSearches":7,"illegal":0}},{"id":"5:minimax-d3:random:0:a","n":5,"seed":20425136,"round":0,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":180.93,"maxMs":35.79,"nodes":41314,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.108,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:0:b","n":5,"seed":20425136,"round":0,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"random","moves":8,"totalMs":0.065,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":125.182,"maxMs":33.491,"nodes":32060,"searches":6,"deepSearches":6,"illegal":0}},{"id":"5:minimax-d3:random:1:a","n":5,"seed":3911016521,"round":1,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":143.907,"maxMs":29.513,"nodes":38995,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.102,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:1:b","n":5,"seed":3911016521,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.096,"maxMs":0.019,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":195.456,"maxMs":60.723,"nodes":30043,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d3:random:2:a","n":5,"seed":2614746446,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d3","moves":12,"totalMs":161.194,"maxMs":30.018,"nodes":40231,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.148,"maxMs":0.046,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:2:b","n":5,"seed":2614746446,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.117,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":151.991,"maxMs":28.685,"nodes":36823,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d3:random:3:a","n":5,"seed":312006548,"round":3,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":165.343,"maxMs":32.811,"nodes":38853,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.113,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:3:b","n":5,"seed":312006548,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.165,"maxMs":0.03,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":213.147,"maxMs":34.926,"nodes":35571,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d3:random:4:a","n":5,"seed":3610653328,"round":4,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":177.652,"maxMs":53.734,"nodes":33162,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.057,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:4:b","n":5,"seed":3610653328,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.121,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":348.983,"maxMs":75.668,"nodes":34658,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:random:5:a","n":5,"seed":3547502761,"round":5,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":187.922,"maxMs":46.16,"nodes":36228,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.138,"maxMs":0.06,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:5:b","n":5,"seed":3547502761,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.126,"maxMs":0.028,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":234.74,"maxMs":85.756,"nodes":31781,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d3:random:6:a","n":5,"seed":3143705393,"round":6,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d3","moves":16,"totalMs":241.851,"maxMs":53.021,"nodes":51838,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.217,"maxMs":0.024,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:6:b","n":5,"seed":3143705393,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.111,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":160.559,"maxMs":33.442,"nodes":36515,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d3:random:7:a","n":5,"seed":3775448606,"round":7,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":177.275,"maxMs":33.721,"nodes":41186,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.137,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:7:b","n":5,"seed":3775448606,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.144,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":202.585,"maxMs":35.239,"nodes":44338,"searches":11,"deepSearches":11,"illegal":0}},{"id":"5:minimax-d3:random:8:a","n":5,"seed":3267483643,"round":8,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":200.835,"maxMs":33.336,"nodes":44775,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.166,"maxMs":0.031,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:8:b","n":5,"seed":3267483643,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.098,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":170.715,"maxMs":32.687,"nodes":36004,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:random:9:a","n":5,"seed":4276935363,"round":9,"result":"win","winner":"red","drawReason":null,"turns":13,"red":{"agent":"minimax-d3","moves":7,"totalMs":135.956,"maxMs":33.094,"nodes":38813,"searches":5,"deepSearches":5,"illegal":0},"blue":{"agent":"random","moves":6,"totalMs":0.064,"maxMs":0.023,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:9:b","n":5,"seed":4276935363,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.096,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":137.799,"maxMs":31.542,"nodes":31102,"searches":9,"deepSearches":9,"illegal":0}},{"id":"5:minimax-d3:random:10:a","n":5,"seed":1884031185,"round":10,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":194.95,"maxMs":40.421,"nodes":45198,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.25,"maxMs":0.125,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:10:b","n":5,"seed":1884031185,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.061,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":129.934,"maxMs":32.181,"nodes":31178,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:minimax-d3:random:11:a","n":5,"seed":2474599747,"round":11,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"minimax-d3","moves":8,"totalMs":148.096,"maxMs":33.235,"nodes":39354,"searches":6,"deepSearches":6,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.057,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:11:b","n":5,"seed":2474599747,"round":11,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"random","moves":12,"totalMs":0.114,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":159.103,"maxMs":30.547,"nodes":37890,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d3:random:12:a","n":5,"seed":2103208095,"round":12,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":163.802,"maxMs":30.754,"nodes":43852,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.103,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:12:b","n":5,"seed":2103208095,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.142,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":177.628,"maxMs":31.75,"nodes":41300,"searches":12,"deepSearches":12,"illegal":0}},{"id":"5:minimax-d3:random:13:a","n":5,"seed":728070758,"round":13,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":160.338,"maxMs":31.759,"nodes":38499,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.15,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:13:b","n":5,"seed":728070758,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.137,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":167.376,"maxMs":31.389,"nodes":37994,"searches":10,"deepSearches":10,"illegal":0}},{"id":"5:minimax-d3:random:14:a","n":5,"seed":2473442876,"round":14,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":159.963,"maxMs":30.997,"nodes":39279,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.137,"maxMs":0.027,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:14:b","n":5,"seed":2473442876,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.056,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":91.591,"maxMs":41.331,"nodes":21382,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:minimax-d3:random:15:a","n":5,"seed":688168107,"round":15,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":151.649,"maxMs":31.65,"nodes":42107,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.089,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:15:b","n":5,"seed":688168107,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":12,"red":{"agent":"random","moves":6,"totalMs":0.041,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":6,"totalMs":102.21,"maxMs":30.257,"nodes":25872,"searches":4,"deepSearches":4,"illegal":0}},{"id":"5:minimax-d3:random:16:a","n":5,"seed":1766073184,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d3","moves":10,"totalMs":157.768,"maxMs":31.996,"nodes":44617,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.087,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:16:b","n":5,"seed":1766073184,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.075,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":131.292,"maxMs":28.964,"nodes":32950,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:random:17:a","n":5,"seed":2906873132,"round":17,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":222.099,"maxMs":39.865,"nodes":54981,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.135,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:17:b","n":5,"seed":2906873132,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.087,"maxMs":0.014,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":153.754,"maxMs":28.259,"nodes":40563,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:random:18:a","n":5,"seed":2001874700,"round":18,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":128.12,"maxMs":28.931,"nodes":36192,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.087,"maxMs":0.034,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:18:b","n":5,"seed":2001874700,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.084,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":149.349,"maxMs":28.993,"nodes":39665,"searches":8,"deepSearches":8,"illegal":0}},{"id":"5:minimax-d3:random:19:a","n":5,"seed":3466055151,"round":19,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":139.699,"maxMs":31.821,"nodes":36194,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.107,"maxMs":0.027,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:minimax-d3:random:19:b","n":5,"seed":3466055151,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.052,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":7,"totalMs":110.561,"maxMs":31.755,"nodes":28505,"searches":5,"deepSearches":5,"illegal":0}},{"id":"5:greedy:random:0:a","n":5,"seed":4284306191,"round":0,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.746,"maxMs":0.205,"nodes":160,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.027,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:0:b","n":5,"seed":4284306191,"round":0,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"random","moves":11,"totalMs":0.041,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.93,"maxMs":0.176,"nodes":188,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:1:a","n":5,"seed":1867054296,"round":1,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"greedy","moves":10,"totalMs":0.69,"maxMs":0.088,"nodes":173,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":9,"totalMs":0.028,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:1:b","n":5,"seed":1867054296,"round":1,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"random","moves":16,"totalMs":0.079,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":1.241,"maxMs":0.097,"nodes":232,"searches":15,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:2:a","n":5,"seed":843646527,"round":2,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"greedy","moves":11,"totalMs":0.773,"maxMs":0.091,"nodes":190,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.035,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:2:b","n":5,"seed":843646527,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.02,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.603,"maxMs":0.118,"nodes":142,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:3:a","n":5,"seed":1875777075,"round":3,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.628,"maxMs":0.098,"nodes":166,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.034,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:3:b","n":5,"seed":1875777075,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.066,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":1.06,"maxMs":0.1,"nodes":204,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:4:a","n":5,"seed":4211304951,"round":4,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.656,"maxMs":0.096,"nodes":161,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.028,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:4:b","n":5,"seed":4211304951,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.037,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":0.875,"maxMs":0.141,"nodes":180,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:5:a","n":5,"seed":3984293353,"round":5,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.516,"maxMs":0.088,"nodes":147,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.017,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:5:b","n":5,"seed":3984293353,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.051,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":0.943,"maxMs":0.092,"nodes":196,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:6:a","n":5,"seed":1609711076,"round":6,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":0.953,"maxMs":0.107,"nodes":193,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.044,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:6:b","n":5,"seed":1609711076,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.066,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":1.191,"maxMs":0.196,"nodes":200,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:7:a","n":5,"seed":1131768598,"round":7,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"greedy","moves":11,"totalMs":0.8,"maxMs":0.089,"nodes":184,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.035,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:7:b","n":5,"seed":1131768598,"round":7,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"random","moves":12,"totalMs":0.045,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":0.879,"maxMs":0.09,"nodes":182,"searches":11,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:8:a","n":5,"seed":1062005759,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"greedy","moves":10,"totalMs":0.863,"maxMs":0.156,"nodes":179,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.036,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:8:b","n":5,"seed":1062005759,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.02,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":0.535,"maxMs":0.088,"nodes":140,"searches":7,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:9:a","n":5,"seed":2742123398,"round":9,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.846,"maxMs":0.227,"nodes":164,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.034,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:9:b","n":5,"seed":2742123398,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.054,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.091,"maxMs":0.1,"nodes":202,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:10:a","n":5,"seed":2155267654,"round":10,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.685,"maxMs":0.165,"nodes":159,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.024,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:10:b","n":5,"seed":2155267654,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.071,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":1.232,"maxMs":0.149,"nodes":226,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:11:a","n":5,"seed":985971464,"round":11,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"greedy","moves":13,"totalMs":0.921,"maxMs":0.087,"nodes":197,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.049,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:11:b","n":5,"seed":985971464,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.031,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.727,"maxMs":0.091,"nodes":162,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:12:a","n":5,"seed":2469517482,"round":12,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":0.927,"maxMs":0.142,"nodes":205,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.039,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:12:b","n":5,"seed":2469517482,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.043,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":0.899,"maxMs":0.111,"nodes":180,"searches":10,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:13:a","n":5,"seed":247293504,"round":13,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"greedy","moves":10,"totalMs":0.732,"maxMs":0.09,"nodes":165,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":9,"totalMs":0.031,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:13:b","n":5,"seed":247293504,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.032,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":0.777,"maxMs":0.1,"nodes":166,"searches":9,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:14:a","n":5,"seed":1655621585,"round":14,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":0.95,"maxMs":0.146,"nodes":209,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.039,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:14:b","n":5,"seed":1655621585,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.062,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":1.105,"maxMs":0.097,"nodes":212,"searches":13,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:15:a","n":5,"seed":4236179319,"round":15,"result":"win","winner":"red","drawReason":null,"turns":15,"red":{"agent":"greedy","moves":8,"totalMs":0.545,"maxMs":0.095,"nodes":147,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":7,"totalMs":0.02,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:15:b","n":5,"seed":4236179319,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":14,"red":{"agent":"random","moves":7,"totalMs":0.016,"maxMs":0.004,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":7,"totalMs":0.478,"maxMs":0.094,"nodes":130,"searches":6,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:16:a","n":5,"seed":368218006,"round":16,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"greedy","moves":9,"totalMs":0.674,"maxMs":0.137,"nodes":157,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.023,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:16:b","n":5,"seed":368218006,"round":16,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"random","moves":13,"totalMs":0.05,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":0.924,"maxMs":0.089,"nodes":188,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:17:a","n":5,"seed":3676231428,"round":17,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"greedy","moves":13,"totalMs":1.161,"maxMs":0.17,"nodes":208,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.056,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:17:b","n":5,"seed":3676231428,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.056,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.048,"maxMs":0.175,"nodes":200,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:18:a","n":5,"seed":1131273406,"round":18,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"greedy","moves":14,"totalMs":0.984,"maxMs":0.086,"nodes":199,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.057,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:18:b","n":5,"seed":1131273406,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.052,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.014,"maxMs":0.097,"nodes":202,"searches":12,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:19:a","n":5,"seed":1706090125,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"greedy","moves":10,"totalMs":0.891,"maxMs":0.179,"nodes":177,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.038,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"5:greedy:random:19:b","n":5,"seed":1706090125,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.067,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":1.172,"maxMs":0.117,"nodes":209,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:0:a","n":6,"seed":2264427037,"round":0,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-dynamic","moves":17,"totalMs":2.264,"maxMs":0.172,"nodes":346,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":16,"totalMs":39.083,"maxMs":3.734,"nodes":7587,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:0:b","n":6,"seed":2264427037,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d2","moves":13,"totalMs":37.85,"maxMs":4.115,"nodes":7496,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":2.002,"maxMs":0.292,"nodes":275,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:1:a","n":6,"seed":2864164822,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-dynamic","moves":18,"totalMs":2.645,"maxMs":0.224,"nodes":362,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":18,"totalMs":40.278,"maxMs":4.034,"nodes":7626,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:1:b","n":6,"seed":2864164822,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d2","moves":13,"totalMs":37.268,"maxMs":3.838,"nodes":7618,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":2.012,"maxMs":0.332,"nodes":277,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:2:a","n":6,"seed":1058628940,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":2.009,"maxMs":0.197,"nodes":312,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":35.221,"maxMs":3.815,"nodes":6932,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:2:b","n":6,"seed":1058628940,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"minimax-d2","moves":20,"totalMs":44.134,"maxMs":4.235,"nodes":8170,"searches":19,"deepSearches":19,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":20,"totalMs":2.993,"maxMs":0.351,"nodes":352,"searches":18,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:3:a","n":6,"seed":1293994995,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.324,"maxMs":0.298,"nodes":330,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":37.98,"maxMs":3.771,"nodes":7191,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:3:b","n":6,"seed":1293994995,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d2","moves":14,"totalMs":39.354,"maxMs":4.08,"nodes":7618,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":1.975,"maxMs":0.188,"nodes":288,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:4:a","n":6,"seed":418950961,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.345,"maxMs":0.222,"nodes":338,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":39.907,"maxMs":3.982,"nodes":7511,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:4:b","n":6,"seed":418950961,"round":4,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":37.529,"maxMs":4.238,"nodes":7392,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.93,"maxMs":0.285,"nodes":279,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:5:a","n":6,"seed":3925366516,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.323,"maxMs":0.215,"nodes":332,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":41.038,"maxMs":4.183,"nodes":7243,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:5:b","n":6,"seed":3925366516,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-d2","moves":9,"totalMs":26.575,"maxMs":3.898,"nodes":6448,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":9,"totalMs":1.23,"maxMs":0.274,"nodes":203,"searches":7,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:6:a","n":6,"seed":3844463854,"round":6,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":2.138,"maxMs":0.278,"nodes":300,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":36.111,"maxMs":3.723,"nodes":6932,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:6:b","n":6,"seed":3844463854,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":44,"red":{"agent":"minimax-d2","moves":22,"totalMs":43.609,"maxMs":4.092,"nodes":7960,"searches":21,"deepSearches":21,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":22,"totalMs":3.261,"maxMs":0.336,"nodes":372,"searches":20,"deepSearches":2,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:7:a","n":6,"seed":1907435595,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.311,"maxMs":0.225,"nodes":324,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":36.944,"maxMs":3.71,"nodes":7035,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:7:b","n":6,"seed":1907435595,"round":7,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d2","moves":18,"totalMs":41.937,"maxMs":3.961,"nodes":8098,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":17,"totalMs":2.576,"maxMs":0.223,"nodes":338,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:8:a","n":6,"seed":113862939,"round":8,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":1.732,"maxMs":0.277,"nodes":270,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":33.291,"maxMs":3.891,"nodes":6590,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:8:b","n":6,"seed":113862939,"round":8,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d2","moves":17,"totalMs":38.533,"maxMs":3.734,"nodes":7752,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":16,"totalMs":2.53,"maxMs":0.346,"nodes":317,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:9:a","n":6,"seed":34079558,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":2.052,"maxMs":0.34,"nodes":306,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":35.129,"maxMs":4.361,"nodes":6919,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:9:b","n":6,"seed":34079558,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-d2","moves":15,"totalMs":40.986,"maxMs":4.047,"nodes":7960,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":2.177,"maxMs":0.215,"nodes":307,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:10:a","n":6,"seed":371068814,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-dynamic","moves":10,"totalMs":1.53,"maxMs":0.211,"nodes":252,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":28.498,"maxMs":4.048,"nodes":6008,"searches":8,"deepSearches":8,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:10:b","n":6,"seed":371068814,"round":10,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":30.573,"maxMs":3.916,"nodes":6980,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":1.353,"maxMs":0.179,"nodes":249,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:11:a","n":6,"seed":1235586954,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":42,"red":{"agent":"minimax-dynamic","moves":21,"totalMs":3.408,"maxMs":0.264,"nodes":386,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":21,"totalMs":45.069,"maxMs":4.326,"nodes":7635,"searches":19,"deepSearches":19,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:11:b","n":6,"seed":1235586954,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"minimax-d2","moves":16,"totalMs":55.723,"maxMs":5.577,"nodes":7864,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":16,"totalMs":3.457,"maxMs":0.401,"nodes":312,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:12:a","n":6,"seed":3630931622,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":2.633,"maxMs":0.293,"nodes":286,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":52.722,"maxMs":6.9,"nodes":6590,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:12:b","n":6,"seed":3630931622,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d2","moves":11,"totalMs":54.198,"maxMs":7.631,"nodes":7100,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":3.245,"maxMs":0.59,"nodes":243,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:13:a","n":6,"seed":2421968397,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.619,"maxMs":0.368,"nodes":324,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":41.648,"maxMs":6.035,"nodes":7035,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:13:b","n":6,"seed":2421968397,"round":13,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d2","moves":16,"totalMs":39.197,"maxMs":3.797,"nodes":7700,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":2.231,"maxMs":0.194,"nodes":308,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:14:a","n":6,"seed":2429611183,"round":14,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-dynamic","moves":17,"totalMs":3.158,"maxMs":0.439,"nodes":332,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":16,"totalMs":43.773,"maxMs":4.434,"nodes":7201,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:14:b","n":6,"seed":2429611183,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-d2","moves":12,"totalMs":50.817,"maxMs":7.627,"nodes":7326,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":2.642,"maxMs":0.509,"nodes":260,"searches":10,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:15:a","n":6,"seed":3145476703,"round":15,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":1.889,"maxMs":0.255,"nodes":294,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":39.635,"maxMs":5.605,"nodes":7077,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:15:b","n":6,"seed":3145476703,"round":15,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d2","moves":16,"totalMs":53.102,"maxMs":8.057,"nodes":7702,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":3.61,"maxMs":0.456,"nodes":310,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:16:a","n":6,"seed":1912903639,"round":16,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":2.806,"maxMs":0.354,"nodes":286,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":48.348,"maxMs":6.696,"nodes":6787,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:16:b","n":6,"seed":1912903639,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":44,"red":{"agent":"minimax-d2","moves":22,"totalMs":55.51,"maxMs":5.321,"nodes":8962,"searches":21,"deepSearches":21,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":22,"totalMs":3.446,"maxMs":0.263,"nodes":394,"searches":20,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:17:a","n":6,"seed":2962343262,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":2.571,"maxMs":0.464,"nodes":316,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":43.208,"maxMs":6.104,"nodes":6988,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:17:b","n":6,"seed":2962343262,"round":17,"result":"win","winner":"red","drawReason":null,"turns":45,"red":{"agent":"minimax-d2","moves":23,"totalMs":49.583,"maxMs":4.467,"nodes":8500,"searches":21,"deepSearches":21,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":22,"totalMs":3.628,"maxMs":0.35,"nodes":385,"searches":21,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:18:a","n":6,"seed":317039434,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.097,"maxMs":0.182,"nodes":322,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":35.707,"maxMs":3.55,"nodes":7033,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:18:b","n":6,"seed":317039434,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d2","moves":13,"totalMs":34.582,"maxMs":3.608,"nodes":7496,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.768,"maxMs":0.208,"nodes":275,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:19:a","n":6,"seed":3051017648,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.197,"maxMs":0.226,"nodes":324,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":35.801,"maxMs":3.639,"nodes":7035,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d2:19:b","n":6,"seed":3051017648,"round":19,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":32.836,"maxMs":3.542,"nodes":7326,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.719,"maxMs":0.203,"nodes":275,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:0:a","n":6,"seed":3646807393,"round":0,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":2.064,"maxMs":0.374,"nodes":286,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":817.212,"maxMs":109.096,"nodes":167977,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:0:b","n":6,"seed":3646807393,"round":0,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-d3","moves":19,"totalMs":1242.662,"maxMs":116.172,"nodes":198817,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":4.596,"maxMs":0.627,"nodes":345,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:1:a","n":6,"seed":3337799031,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":6.793,"maxMs":4.79,"nodes":270,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":1586.584,"maxMs":453.939,"nodes":164869,"searches":9,"deepSearches":9,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:1:b","n":6,"seed":3337799031,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":50,"red":{"agent":"minimax-d3","moves":25,"totalMs":1350.498,"maxMs":115.467,"nodes":224167,"searches":24,"deepSearches":24,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":25,"totalMs":4.48,"maxMs":0.303,"nodes":455,"searches":23,"deepSearches":1,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:2:a","n":6,"seed":2093274386,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":2.187,"maxMs":0.37,"nodes":286,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":835.07,"maxMs":107.681,"nodes":168448,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:2:b","n":6,"seed":2093274386,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d3","moves":13,"totalMs":990.93,"maxMs":122.354,"nodes":192558,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":2.231,"maxMs":0.415,"nodes":275,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:3:a","n":6,"seed":2208646296,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-dynamic","moves":18,"totalMs":3.186,"maxMs":0.355,"nodes":382,"searches":17,"deepSearches":2,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":895.519,"maxMs":117.9,"nodes":173784,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:3:b","n":6,"seed":2208646296,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-d3","moves":18,"totalMs":1001.779,"maxMs":109.669,"nodes":206232,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":2.85,"maxMs":0.262,"nodes":340,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:4:a","n":6,"seed":2391108771,"round":4,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-dynamic","moves":18,"totalMs":2.927,"maxMs":0.278,"nodes":358,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":926.368,"maxMs":110.752,"nodes":182504,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:4:b","n":6,"seed":2391108771,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d3","moves":14,"totalMs":903.583,"maxMs":113.123,"nodes":193819,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":2.197,"maxMs":0.225,"nodes":288,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:5:a","n":6,"seed":45953651,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"minimax-dynamic","moves":20,"totalMs":4.263,"maxMs":0.569,"nodes":402,"searches":19,"deepSearches":3,"illegal":0},"blue":{"agent":"minimax-d3","moves":20,"totalMs":1054.163,"maxMs":137.32,"nodes":177606,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:5:b","n":6,"seed":45953651,"round":5,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":1229.227,"maxMs":203.937,"nodes":192824,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":2.935,"maxMs":0.519,"nodes":288,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:6:a","n":6,"seed":1781663992,"round":6,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-dynamic","moves":19,"totalMs":4.091,"maxMs":0.814,"nodes":395,"searches":17,"deepSearches":2,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":866.393,"maxMs":105.357,"nodes":173753,"searches":17,"deepSearches":17,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:6:b","n":6,"seed":1781663992,"round":6,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":930.121,"maxMs":119.023,"nodes":190748,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":2.073,"maxMs":0.232,"nodes":275,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:7:a","n":6,"seed":2004731760,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":1.469,"maxMs":0.258,"nodes":232,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":9,"totalMs":757.24,"maxMs":124.286,"nodes":152349,"searches":7,"deepSearches":7,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:7:b","n":6,"seed":2004731760,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"minimax-d3","moves":16,"totalMs":1107.868,"maxMs":138.394,"nodes":209547,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":16,"totalMs":2.701,"maxMs":0.283,"nodes":334,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:8:a","n":6,"seed":4281792080,"round":8,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":2.023,"maxMs":0.389,"nodes":270,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":924.767,"maxMs":160.209,"nodes":163628,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:8:b","n":6,"seed":4281792080,"round":8,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d3","moves":18,"totalMs":924.977,"maxMs":114.421,"nodes":195009,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":17,"totalMs":2.75,"maxMs":0.242,"nodes":332,"searches":16,"deepSearches":1,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:9:a","n":6,"seed":3067140833,"round":9,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-dynamic","moves":20,"totalMs":3.041,"maxMs":0.245,"nodes":374,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":19,"totalMs":954.81,"maxMs":117.724,"nodes":181233,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:9:b","n":6,"seed":3067140833,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-d3","moves":18,"totalMs":1025.586,"maxMs":121.895,"nodes":206375,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":3.023,"maxMs":0.444,"nodes":352,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:10:a","n":6,"seed":3178892231,"round":10,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-dynamic","moves":17,"totalMs":3.641,"maxMs":0.569,"nodes":330,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":16,"totalMs":1336.041,"maxMs":191.141,"nodes":173650,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:10:b","n":6,"seed":3178892231,"round":10,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d3","moves":16,"totalMs":961.85,"maxMs":114.217,"nodes":194617,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":2.616,"maxMs":0.36,"nodes":308,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:11:a","n":6,"seed":3309851016,"round":11,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-dynamic","moves":18,"totalMs":3.479,"maxMs":0.404,"nodes":358,"searches":16,"deepSearches":1,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":1191.356,"maxMs":190.856,"nodes":173728,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:11:b","n":6,"seed":3309851016,"round":11,"result":"win","winner":"red","drawReason":null,"turns":43,"red":{"agent":"minimax-d3","moves":22,"totalMs":1247.911,"maxMs":138.607,"nodes":216476,"searches":20,"deepSearches":20,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":21,"totalMs":4.197,"maxMs":0.334,"nodes":408,"searches":20,"deepSearches":1,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:12:a","n":6,"seed":4269078529,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":46,"red":{"agent":"minimax-dynamic","moves":23,"totalMs":3.654,"maxMs":0.196,"nodes":430,"searches":22,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":23,"totalMs":1017.046,"maxMs":129.011,"nodes":188449,"searches":21,"deepSearches":21,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:12:b","n":6,"seed":4269078529,"round":12,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":891.097,"maxMs":114.114,"nodes":195780,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":1.577,"maxMs":0.21,"nodes":253,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:13:a","n":6,"seed":1005671370,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-dynamic","moves":18,"totalMs":3.411,"maxMs":0.532,"nodes":382,"searches":17,"deepSearches":2,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":858.451,"maxMs":110.314,"nodes":173790,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:13:b","n":6,"seed":1005671370,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-d3","moves":15,"totalMs":906.189,"maxMs":109.514,"nodes":194502,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":2.313,"maxMs":0.272,"nodes":299,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:14:a","n":6,"seed":3160942313,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":2.23,"maxMs":0.257,"nodes":306,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":864.488,"maxMs":111.32,"nodes":173945,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:14:b","n":6,"seed":3160942313,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":48,"red":{"agent":"minimax-d3","moves":24,"totalMs":1084.657,"maxMs":116.362,"nodes":214665,"searches":23,"deepSearches":23,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":24,"totalMs":3.875,"maxMs":0.236,"nodes":428,"searches":22,"deepSearches":1,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:15:a","n":6,"seed":3168645076,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"minimax-dynamic","moves":17,"totalMs":3.112,"maxMs":0.545,"nodes":342,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":990.685,"maxMs":146.043,"nodes":174385,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:15:b","n":6,"seed":3168645076,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d3","moves":10,"totalMs":776.233,"maxMs":107.657,"nodes":182922,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":1.278,"maxMs":0.194,"nodes":224,"searches":8,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:16:a","n":6,"seed":2959752968,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":42,"red":{"agent":"minimax-dynamic","moves":21,"totalMs":3.207,"maxMs":0.2,"nodes":387,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":21,"totalMs":984.176,"maxMs":125.745,"nodes":184868,"searches":19,"deepSearches":19,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:16:b","n":6,"seed":2959752968,"round":16,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":897.79,"maxMs":120.65,"nodes":191000,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":2.095,"maxMs":0.363,"nodes":275,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:17:a","n":6,"seed":528596009,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"minimax-dynamic","moves":20,"totalMs":3.935,"maxMs":0.664,"nodes":377,"searches":19,"deepSearches":1,"illegal":0},"blue":{"agent":"minimax-d3","moves":20,"totalMs":892.48,"maxMs":109.263,"nodes":174268,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:17:b","n":6,"seed":528596009,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"minimax-d3","moves":16,"totalMs":900.934,"maxMs":113.046,"nodes":195035,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":16,"totalMs":2.355,"maxMs":0.278,"nodes":308,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:18:a","n":6,"seed":1337290896,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":2.485,"maxMs":0.571,"nodes":300,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":844.005,"maxMs":111.632,"nodes":171049,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:18:b","n":6,"seed":1337290896,"round":18,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d3","moves":15,"totalMs":1085.405,"maxMs":151.251,"nodes":208274,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":2.592,"maxMs":0.264,"nodes":319,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:19:a","n":6,"seed":3516328502,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-dynamic","moves":18,"totalMs":3.245,"maxMs":0.444,"nodes":378,"searches":17,"deepSearches":1,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":939.062,"maxMs":109.804,"nodes":181120,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-dynamic:minimax-d3:19:b","n":6,"seed":3516328502,"round":19,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-d3","moves":19,"totalMs":1056.965,"maxMs":123.576,"nodes":205516,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":2.866,"maxMs":0.194,"nodes":355,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:0:a","n":6,"seed":4287374889,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.902,"maxMs":0.656,"nodes":324,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":2.515,"maxMs":0.453,"nodes":336,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:0:b","n":6,"seed":4287374889,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"greedy","moves":16,"totalMs":2.587,"maxMs":0.218,"nodes":370,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":16,"totalMs":2.526,"maxMs":0.292,"nodes":310,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:1:a","n":6,"seed":2619727467,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":2.025,"maxMs":0.2,"nodes":312,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":2.126,"maxMs":0.258,"nodes":325,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:1:b","n":6,"seed":2619727467,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"greedy","moves":15,"totalMs":2.404,"maxMs":0.204,"nodes":365,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":2.363,"maxMs":0.266,"nodes":302,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:2:a","n":6,"seed":3683841281,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"minimax-dynamic","moves":12,"totalMs":2.137,"maxMs":0.3,"nodes":290,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":1.912,"maxMs":0.292,"nodes":299,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:2:b","n":6,"seed":3683841281,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"greedy","moves":18,"totalMs":2.806,"maxMs":0.184,"nodes":404,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":2.928,"maxMs":0.293,"nodes":344,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:3:a","n":6,"seed":3245917411,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":2.134,"maxMs":0.273,"nodes":324,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":2.062,"maxMs":0.197,"nodes":337,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:3:b","n":6,"seed":3245917411,"round":3,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":2.495,"maxMs":0.513,"nodes":340,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":2.316,"maxMs":0.267,"nodes":290,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:4:a","n":6,"seed":2702345588,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":2.402,"maxMs":0.346,"nodes":312,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":2.498,"maxMs":0.332,"nodes":325,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:4:b","n":6,"seed":2702345588,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"greedy","moves":11,"totalMs":1.65,"maxMs":0.193,"nodes":297,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":1.533,"maxMs":0.192,"nodes":234,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:5:a","n":6,"seed":3972817056,"round":5,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-dynamic","moves":16,"totalMs":2.368,"maxMs":0.276,"nodes":328,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":2.35,"maxMs":0.22,"nodes":353,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:5:b","n":6,"seed":3972817056,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"greedy","moves":13,"totalMs":2.396,"maxMs":0.396,"nodes":325,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":2.105,"maxMs":0.447,"nodes":264,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:6:a","n":6,"seed":3735160888,"round":6,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-dynamic","moves":13,"totalMs":1.864,"maxMs":0.277,"nodes":286,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":1.93,"maxMs":0.192,"nodes":312,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:6:b","n":6,"seed":3735160888,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"greedy","moves":12,"totalMs":1.949,"maxMs":0.332,"nodes":318,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":1.691,"maxMs":0.239,"nodes":254,"searches":10,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:7:a","n":6,"seed":181478679,"round":7,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"minimax-dynamic","moves":21,"totalMs":3.23,"maxMs":0.301,"nodes":394,"searches":19,"deepSearches":1,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":2.892,"maxMs":0.178,"nodes":396,"searches":20,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:7:b","n":6,"seed":181478679,"round":7,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":2.718,"maxMs":0.329,"nodes":336,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":2.365,"maxMs":0.284,"nodes":286,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:8:a","n":6,"seed":4020415645,"round":8,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"minimax-dynamic","moves":21,"totalMs":3.251,"maxMs":0.315,"nodes":412,"searches":19,"deepSearches":1,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":3.136,"maxMs":0.228,"nodes":414,"searches":20,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:8:b","n":6,"seed":4020415645,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":56,"red":{"agent":"greedy","moves":28,"totalMs":4.558,"maxMs":0.271,"nodes":514,"searches":28,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":28,"totalMs":5.137,"maxMs":0.378,"nodes":498,"searches":26,"deepSearches":2,"illegal":0}},{"id":"6:minimax-dynamic:greedy:9:a","n":6,"seed":2297961512,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":44,"red":{"agent":"minimax-dynamic","moves":22,"totalMs":3.35,"maxMs":0.302,"nodes":408,"searches":21,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":22,"totalMs":3.221,"maxMs":0.22,"nodes":421,"searches":21,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:9:b","n":6,"seed":2297961512,"round":9,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"greedy","moves":19,"totalMs":3.058,"maxMs":0.283,"nodes":386,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":2.978,"maxMs":0.349,"nodes":336,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:10:a","n":6,"seed":4142282423,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"minimax-dynamic","moves":17,"totalMs":2.41,"maxMs":0.181,"nodes":338,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":2.545,"maxMs":0.295,"nodes":352,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:10:b","n":6,"seed":4142282423,"round":10,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"greedy","moves":19,"totalMs":2.78,"maxMs":0.247,"nodes":370,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":2.9,"maxMs":0.305,"nodes":345,"searches":17,"deepSearches":2,"illegal":0}},{"id":"6:minimax-dynamic:greedy:11:a","n":6,"seed":3670576550,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":42,"red":{"agent":"minimax-dynamic","moves":21,"totalMs":3.429,"maxMs":0.426,"nodes":380,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":21,"totalMs":3.576,"maxMs":0.461,"nodes":396,"searches":20,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:11:b","n":6,"seed":3670576550,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"greedy","moves":13,"totalMs":2.095,"maxMs":0.274,"nodes":327,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.801,"maxMs":0.186,"nodes":264,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:12:a","n":6,"seed":2509999809,"round":12,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-dynamic","moves":11,"totalMs":1.397,"maxMs":0.188,"nodes":252,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":1.581,"maxMs":0.22,"nodes":280,"searches":10,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:12:b","n":6,"seed":2509999809,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"greedy","moves":13,"totalMs":2.403,"maxMs":0.512,"nodes":331,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":2.335,"maxMs":0.479,"nodes":268,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:13:a","n":6,"seed":2645802735,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":38,"red":{"agent":"minimax-dynamic","moves":19,"totalMs":2.884,"maxMs":0.221,"nodes":372,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":19,"totalMs":3.118,"maxMs":0.299,"nodes":386,"searches":18,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:13:b","n":6,"seed":2645802735,"round":13,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"greedy","moves":11,"totalMs":1.611,"maxMs":0.265,"nodes":280,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":1.487,"maxMs":0.2,"nodes":234,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:14:a","n":6,"seed":2559126845,"round":14,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-dynamic","moves":18,"totalMs":3.195,"maxMs":0.573,"nodes":356,"searches":16,"deepSearches":1,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":2.809,"maxMs":0.472,"nodes":357,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:14:b","n":6,"seed":2559126845,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"greedy","moves":17,"totalMs":2.882,"maxMs":0.405,"nodes":369,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":17,"totalMs":2.549,"maxMs":0.297,"nodes":310,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:15:a","n":6,"seed":2025112360,"round":15,"result":"win","winner":"red","drawReason":null,"turns":43,"red":{"agent":"minimax-dynamic","moves":22,"totalMs":3.378,"maxMs":0.378,"nodes":422,"searches":20,"deepSearches":1,"illegal":0},"blue":{"agent":"greedy","moves":21,"totalMs":3.214,"maxMs":0.275,"nodes":421,"searches":21,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:15:b","n":6,"seed":2025112360,"round":15,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"greedy","moves":11,"totalMs":1.62,"maxMs":0.305,"nodes":280,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":1.449,"maxMs":0.197,"nodes":234,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:16:a","n":6,"seed":3035276770,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":48,"red":{"agent":"minimax-dynamic","moves":24,"totalMs":4.065,"maxMs":0.352,"nodes":454,"searches":23,"deepSearches":1,"illegal":0},"blue":{"agent":"greedy","moves":24,"totalMs":3.874,"maxMs":0.454,"nodes":449,"searches":23,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:16:b","n":6,"seed":3035276770,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"greedy","moves":14,"totalMs":2.178,"maxMs":0.189,"nodes":336,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":2.109,"maxMs":0.268,"nodes":276,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:17:a","n":6,"seed":3889077454,"round":17,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-dynamic","moves":18,"totalMs":2.808,"maxMs":0.301,"nodes":346,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":2.643,"maxMs":0.227,"nodes":369,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:17:b","n":6,"seed":3889077454,"round":17,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":1.703,"maxMs":0.275,"nodes":297,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":1.534,"maxMs":0.17,"nodes":250,"searches":10,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:18:a","n":6,"seed":2737218408,"round":18,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-dynamic","moves":16,"totalMs":2.614,"maxMs":0.402,"nodes":324,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":2.453,"maxMs":0.262,"nodes":349,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:18:b","n":6,"seed":2737218408,"round":18,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"greedy","moves":13,"totalMs":2.234,"maxMs":0.405,"nodes":314,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":12,"totalMs":2.202,"maxMs":0.321,"nodes":268,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:19:a","n":6,"seed":4271464139,"round":19,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.074,"maxMs":0.192,"nodes":312,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":2.289,"maxMs":0.269,"nodes":336,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:greedy:19:b","n":6,"seed":4271464139,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"greedy","moves":20,"totalMs":3.158,"maxMs":0.47,"nodes":418,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":20,"totalMs":3.179,"maxMs":0.383,"nodes":358,"searches":18,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:0:a","n":6,"seed":3546205765,"round":0,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":0.957,"maxMs":0.159,"nodes":209,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.028,"maxMs":0.005,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:0:b","n":6,"seed":3546205765,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.103,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":17,"totalMs":2.555,"maxMs":0.262,"nodes":368,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:1:a","n":6,"seed":409356218,"round":1,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-dynamic","moves":17,"totalMs":2.471,"maxMs":0.251,"nodes":358,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.091,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:1:b","n":6,"seed":409356218,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.076,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":2.206,"maxMs":0.188,"nodes":315,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:2:a","n":6,"seed":1611649398,"round":2,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":2.15,"maxMs":0.288,"nodes":322,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.069,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:2:b","n":6,"seed":1611649398,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.115,"maxMs":0.019,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":2.862,"maxMs":0.467,"nodes":326,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:3:a","n":6,"seed":3318807833,"round":3,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"minimax-dynamic","moves":21,"totalMs":3.116,"maxMs":0.274,"nodes":444,"searches":19,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":20,"totalMs":0.143,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:3:b","n":6,"seed":3318807833,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"random","moves":18,"totalMs":0.114,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":2.703,"maxMs":0.179,"nodes":384,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:4:a","n":6,"seed":907041536,"round":4,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.246,"maxMs":0.302,"nodes":336,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.075,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:4:b","n":6,"seed":907041536,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.098,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":17,"totalMs":2.551,"maxMs":0.279,"nodes":336,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:5:a","n":6,"seed":2188711791,"round":5,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":1.785,"maxMs":0.217,"nodes":310,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.059,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:5:b","n":6,"seed":2188711791,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"random","moves":18,"totalMs":0.107,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":2.511,"maxMs":0.178,"nodes":358,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:6:a","n":6,"seed":3850575767,"round":6,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-dynamic","moves":18,"totalMs":4.042,"maxMs":0.492,"nodes":418,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":17,"totalMs":0.18,"maxMs":0.028,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:6:b","n":6,"seed":3850575767,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.043,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":1.587,"maxMs":0.298,"nodes":258,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:7:a","n":6,"seed":315499486,"round":7,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-dynamic","moves":15,"totalMs":2.129,"maxMs":0.184,"nodes":321,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.069,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:7:b","n":6,"seed":315499486,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.061,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":13,"totalMs":1.876,"maxMs":0.249,"nodes":294,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:8:a","n":6,"seed":2562876113,"round":8,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-dynamic","moves":20,"totalMs":2.942,"maxMs":0.245,"nodes":416,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":19,"totalMs":0.123,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:8:b","n":6,"seed":2562876113,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.083,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":2.218,"maxMs":0.299,"nodes":320,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:9:a","n":6,"seed":3849213620,"round":9,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-dynamic","moves":17,"totalMs":3.354,"maxMs":0.45,"nodes":365,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.159,"maxMs":0.056,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:9:b","n":6,"seed":3849213620,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.052,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":1.966,"maxMs":0.316,"nodes":244,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:10:a","n":6,"seed":3697979226,"round":10,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-dynamic","moves":16,"totalMs":2.144,"maxMs":0.185,"nodes":340,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.079,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:10:b","n":6,"seed":3697979226,"round":10,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"random","moves":17,"totalMs":0.1,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":16,"totalMs":2.431,"maxMs":0.219,"nodes":328,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:11:a","n":6,"seed":216891610,"round":11,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-dynamic","moves":14,"totalMs":2.018,"maxMs":0.275,"nodes":302,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.061,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:11:b","n":6,"seed":216891610,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.04,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":1.412,"maxMs":0.182,"nodes":248,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:12:a","n":6,"seed":2806626638,"round":12,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-dynamic","moves":19,"totalMs":2.741,"maxMs":0.249,"nodes":359,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":18,"totalMs":0.111,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:12:b","n":6,"seed":2806626638,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.064,"maxMs":0.028,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":11,"totalMs":1.593,"maxMs":0.315,"nodes":242,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:13:a","n":6,"seed":2312227692,"round":13,"result":"win","winner":"red","drawReason":null,"turns":43,"red":{"agent":"minimax-dynamic","moves":22,"totalMs":3.533,"maxMs":0.24,"nodes":430,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":21,"totalMs":0.166,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:13:b","n":6,"seed":2312227692,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.036,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":1.26,"maxMs":0.176,"nodes":224,"searches":8,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:14:a","n":6,"seed":3002411558,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":42,"red":{"agent":"minimax-dynamic","moves":21,"totalMs":3.739,"maxMs":0.363,"nodes":436,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":21,"totalMs":0.206,"maxMs":0.045,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:14:b","n":6,"seed":3002411558,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.037,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":10,"totalMs":1.43,"maxMs":0.284,"nodes":226,"searches":8,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:15:a","n":6,"seed":2724246570,"round":15,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-dynamic","moves":16,"totalMs":2.228,"maxMs":0.181,"nodes":352,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.08,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:15:b","n":6,"seed":2724246570,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"random","moves":18,"totalMs":0.146,"maxMs":0.032,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":18,"totalMs":3.148,"maxMs":0.47,"nodes":360,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:16:a","n":6,"seed":3301743379,"round":16,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-dynamic","moves":19,"totalMs":2.73,"maxMs":0.284,"nodes":361,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":18,"totalMs":0.111,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:16:b","n":6,"seed":3301743379,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.068,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":1.901,"maxMs":0.24,"nodes":320,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:17:a","n":6,"seed":665789155,"round":17,"result":"win","winner":"red","drawReason":null,"turns":49,"red":{"agent":"minimax-dynamic","moves":25,"totalMs":4.1,"maxMs":0.412,"nodes":461,"searches":23,"deepSearches":1,"illegal":0},"blue":{"agent":"random","moves":24,"totalMs":0.204,"maxMs":0.019,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:17:b","n":6,"seed":665789155,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.081,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":14,"totalMs":2.291,"maxMs":0.301,"nodes":300,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:18:a","n":6,"seed":1031211080,"round":18,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-dynamic","moves":17,"totalMs":2.379,"maxMs":0.211,"nodes":376,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.087,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:18:b","n":6,"seed":1031211080,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"random","moves":20,"totalMs":0.15,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":20,"totalMs":3.275,"maxMs":0.361,"nodes":400,"searches":18,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:19:a","n":6,"seed":1997309922,"round":19,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-dynamic","moves":9,"totalMs":1.02,"maxMs":0.164,"nodes":215,"searches":7,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":8,"totalMs":0.027,"maxMs":0.006,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-dynamic:random:19:b","n":6,"seed":1997309922,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.078,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-dynamic","moves":15,"totalMs":2.278,"maxMs":0.238,"nodes":304,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:0:a","n":6,"seed":2042429757,"round":0,"result":"win","winner":"red","drawReason":null,"turns":47,"red":{"agent":"minimax-d2","moves":24,"totalMs":51.111,"maxMs":4.388,"nodes":8520,"searches":22,"deepSearches":22,"illegal":0},"blue":{"agent":"minimax-d3","moves":23,"totalMs":1048.088,"maxMs":154.212,"nodes":180572,"searches":22,"deepSearches":22,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:0:b","n":6,"seed":2042429757,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-d3","moves":18,"totalMs":953.924,"maxMs":119.636,"nodes":194751,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-d2","moves":18,"totalMs":40.33,"maxMs":3.979,"nodes":7206,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:1:a","n":6,"seed":985035898,"round":1,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d2","moves":17,"totalMs":57.446,"maxMs":7.418,"nodes":8066,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-d3","moves":16,"totalMs":1152.306,"maxMs":156.929,"nodes":176737,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:1:b","n":6,"seed":985035898,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-d3","moves":18,"totalMs":913.079,"maxMs":111.142,"nodes":195197,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-d2","moves":18,"totalMs":38.371,"maxMs":3.757,"nodes":7202,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:2:a","n":6,"seed":2752894269,"round":2,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-d2","moves":19,"totalMs":42.782,"maxMs":3.844,"nodes":8347,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":909.165,"maxMs":113.122,"nodes":180992,"searches":17,"deepSearches":17,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:2:b","n":6,"seed":2752894269,"round":2,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d3","moves":18,"totalMs":943.223,"maxMs":112.833,"nodes":194892,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"minimax-d2","moves":17,"totalMs":42.59,"maxMs":4.394,"nodes":7172,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:3:a","n":6,"seed":4175761494,"round":3,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d2","moves":18,"totalMs":39.927,"maxMs":3.742,"nodes":7778,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":859.169,"maxMs":111.292,"nodes":173751,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:3:b","n":6,"seed":4175761494,"round":3,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-d3","moves":20,"totalMs":1163.913,"maxMs":180.168,"nodes":195231,"searches":18,"deepSearches":18,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":49.661,"maxMs":6.883,"nodes":7234,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:4:a","n":6,"seed":1550466921,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"minimax-d2","moves":16,"totalMs":40.631,"maxMs":3.949,"nodes":7870,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-d3","moves":16,"totalMs":874.526,"maxMs":111.693,"nodes":174299,"searches":14,"deepSearches":14,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:4:b","n":6,"seed":1550466921,"round":4,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":988.477,"maxMs":137.959,"nodes":194758,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-d2","moves":16,"totalMs":43.028,"maxMs":6.14,"nodes":7146,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:5:a","n":6,"seed":2927094322,"round":5,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d2","moves":18,"totalMs":42.853,"maxMs":5.067,"nodes":7834,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":936.741,"maxMs":119.188,"nodes":173893,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:5:b","n":6,"seed":2927094322,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"minimax-d3","moves":16,"totalMs":1173.335,"maxMs":163.602,"nodes":194798,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-d2","moves":16,"totalMs":45.138,"maxMs":8.994,"nodes":7098,"searches":14,"deepSearches":14,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:6:a","n":6,"seed":752035648,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-d2","moves":18,"totalMs":40.197,"maxMs":3.999,"nodes":7802,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":875.178,"maxMs":114.56,"nodes":173787,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:6:b","n":6,"seed":752035648,"round":6,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":987.499,"maxMs":138.14,"nodes":192696,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":39.843,"maxMs":4.686,"nodes":6932,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:7:a","n":6,"seed":4058305060,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-d2","moves":18,"totalMs":46.067,"maxMs":4.043,"nodes":8268,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":986.644,"maxMs":121.932,"nodes":180816,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:7:b","n":6,"seed":4058305060,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"minimax-d3","moves":17,"totalMs":1048.389,"maxMs":118.74,"nodes":208076,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"minimax-d2","moves":17,"totalMs":44.318,"maxMs":3.945,"nodes":7831,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:8:a","n":6,"seed":395449729,"round":8,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-d2","moves":20,"totalMs":51.881,"maxMs":5.231,"nodes":8192,"searches":18,"deepSearches":18,"illegal":0},"blue":{"agent":"minimax-d3","moves":19,"totalMs":1042.664,"maxMs":114.746,"nodes":179239,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:8:b","n":6,"seed":395449729,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d3","moves":14,"totalMs":1061.411,"maxMs":143.938,"nodes":196224,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":42.597,"maxMs":6.987,"nodes":7046,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:9:a","n":6,"seed":1179329160,"round":9,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d2","moves":15,"totalMs":40.158,"maxMs":3.803,"nodes":7620,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":876.797,"maxMs":117.814,"nodes":172087,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:9:b","n":6,"seed":1179329160,"round":9,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-d3","moves":20,"totalMs":968.483,"maxMs":130.397,"nodes":197961,"searches":18,"deepSearches":18,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":42.425,"maxMs":4.145,"nodes":7444,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:10:a","n":6,"seed":4059031224,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-d2","moves":18,"totalMs":39.372,"maxMs":3.669,"nodes":7804,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":850.681,"maxMs":108.303,"nodes":173586,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:10:b","n":6,"seed":4059031224,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d3","moves":13,"totalMs":887.94,"maxMs":113.52,"nodes":193312,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":34.973,"maxMs":3.638,"nodes":6789,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:11:a","n":6,"seed":4193382781,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"minimax-d2","moves":17,"totalMs":40.982,"maxMs":3.646,"nodes":8034,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":893.687,"maxMs":110.87,"nodes":176256,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:11:b","n":6,"seed":4193382781,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d3","moves":14,"totalMs":911.13,"maxMs":114.341,"nodes":194195,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":36.534,"maxMs":4,"nodes":6936,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:12:a","n":6,"seed":518028062,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d2","moves":11,"totalMs":44.506,"maxMs":11.769,"nodes":7100,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":861.667,"maxMs":131.192,"nodes":164967,"searches":9,"deepSearches":9,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:12:b","n":6,"seed":518028062,"round":12,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":874.84,"maxMs":108.898,"nodes":192758,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":36.101,"maxMs":3.94,"nodes":6932,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:13:a","n":6,"seed":1719680921,"round":13,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d2","moves":11,"totalMs":29.29,"maxMs":3.708,"nodes":6812,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":701.795,"maxMs":113.229,"nodes":158908,"searches":9,"deepSearches":9,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:13:b","n":6,"seed":1719680921,"round":13,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":790.196,"maxMs":110.518,"nodes":183620,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":31.014,"maxMs":3.93,"nodes":6333,"searches":9,"deepSearches":9,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:14:a","n":6,"seed":2108812626,"round":14,"result":"win","winner":"red","drawReason":null,"turns":45,"red":{"agent":"minimax-d2","moves":23,"totalMs":45.179,"maxMs":3.815,"nodes":8352,"searches":21,"deepSearches":21,"illegal":0},"blue":{"agent":"minimax-d3","moves":22,"totalMs":916.013,"maxMs":111.019,"nodes":178866,"searches":21,"deepSearches":21,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:14:b","n":6,"seed":2108812626,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d3","moves":10,"totalMs":799.684,"maxMs":110.913,"nodes":182938,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":27.469,"maxMs":3.686,"nodes":6008,"searches":8,"deepSearches":8,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:15:a","n":6,"seed":1019111476,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":48,"red":{"agent":"minimax-d2","moves":24,"totalMs":49.689,"maxMs":4.332,"nodes":8892,"searches":23,"deepSearches":23,"illegal":0},"blue":{"agent":"minimax-d3","moves":24,"totalMs":1049.276,"maxMs":154.942,"nodes":187365,"searches":22,"deepSearches":22,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:15:b","n":6,"seed":1019111476,"round":15,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-d3","moves":19,"totalMs":948.265,"maxMs":111.352,"nodes":194922,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-d2","moves":18,"totalMs":41.363,"maxMs":3.827,"nodes":7191,"searches":17,"deepSearches":17,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:16:a","n":6,"seed":3703520225,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d2","moves":10,"totalMs":32.062,"maxMs":4.688,"nodes":6810,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"minimax-d3","moves":10,"totalMs":843.089,"maxMs":160.811,"nodes":159560,"searches":8,"deepSearches":8,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:16:b","n":6,"seed":3703520225,"round":16,"result":"draw","winner":null,"drawReason":"repetition","turns":89,"red":{"agent":"minimax-d3","moves":45,"totalMs":1202.26,"maxMs":114.062,"nodes":224678,"searches":44,"deepSearches":44,"illegal":0},"blue":{"agent":"minimax-d2","moves":44,"totalMs":70.787,"maxMs":4.073,"nodes":10257,"searches":43,"deepSearches":43,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:17:a","n":6,"seed":2692575944,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"minimax-d2","moves":17,"totalMs":42.222,"maxMs":4.042,"nodes":7906,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":904.272,"maxMs":123.33,"nodes":175004,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:17:b","n":6,"seed":2692575944,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-d3","moves":15,"totalMs":1004.578,"maxMs":141.693,"nodes":195000,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":38.643,"maxMs":4.192,"nodes":7077,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:18:a","n":6,"seed":3170102352,"round":18,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d2","moves":18,"totalMs":45.995,"maxMs":5.592,"nodes":7834,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":1035.664,"maxMs":145.887,"nodes":173892,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:18:b","n":6,"seed":3170102352,"round":18,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-d3","moves":20,"totalMs":1131.825,"maxMs":122.481,"nodes":201767,"searches":18,"deepSearches":18,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":47.105,"maxMs":4.177,"nodes":7804,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:19:a","n":6,"seed":3805178362,"round":19,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-d2","moves":19,"totalMs":43.164,"maxMs":5.161,"nodes":7788,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":912.053,"maxMs":147.336,"nodes":173697,"searches":17,"deepSearches":17,"illegal":0}},{"id":"6:minimax-d2:minimax-d3:19:b","n":6,"seed":3805178362,"round":19,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":976.665,"maxMs":149.145,"nodes":194518,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"minimax-d2","moves":16,"totalMs":39.332,"maxMs":4.407,"nodes":7163,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:greedy:0:a","n":6,"seed":3006343707,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d2","moves":11,"totalMs":32.527,"maxMs":3.776,"nodes":7100,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":1.653,"maxMs":0.192,"nodes":280,"searches":10,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:0:b","n":6,"seed":3006343707,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"greedy","moves":10,"totalMs":1.487,"maxMs":0.219,"nodes":280,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":27.16,"maxMs":3.912,"nodes":5584,"searches":8,"deepSearches":8,"illegal":0}},{"id":"6:minimax-d2:greedy:1:a","n":6,"seed":4231641555,"round":1,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d2","moves":14,"totalMs":35.265,"maxMs":3.885,"nodes":7496,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":1.937,"maxMs":0.178,"nodes":325,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:1:b","n":6,"seed":4231641555,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"greedy","moves":18,"totalMs":2.808,"maxMs":0.183,"nodes":414,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":18,"totalMs":43.936,"maxMs":3.824,"nodes":7670,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:greedy:2:a","n":6,"seed":3967186249,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d2","moves":14,"totalMs":36.892,"maxMs":4.192,"nodes":7618,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":1.956,"maxMs":0.181,"nodes":325,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:2:b","n":6,"seed":3967186249,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"greedy","moves":12,"totalMs":1.852,"maxMs":0.204,"nodes":324,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":33.637,"maxMs":4.035,"nodes":6502,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-d2:greedy:3:a","n":6,"seed":1687727740,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d2","moves":10,"totalMs":29.629,"maxMs":3.921,"nodes":6810,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":1.313,"maxMs":0.217,"nodes":261,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:3:b","n":6,"seed":1687727740,"round":3,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":1.754,"maxMs":0.23,"nodes":297,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":33.234,"maxMs":4.834,"nodes":6100,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-d2:greedy:4:a","n":6,"seed":2692315026,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d2","moves":14,"totalMs":41.883,"maxMs":3.851,"nodes":8212,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":2.106,"maxMs":0.211,"nodes":341,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:4:b","n":6,"seed":2692315026,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":38,"red":{"agent":"greedy","moves":19,"totalMs":2.974,"maxMs":0.217,"nodes":421,"searches":19,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":44.321,"maxMs":3.857,"nodes":7654,"searches":17,"deepSearches":17,"illegal":0}},{"id":"6:minimax-d2:greedy:5:a","n":6,"seed":756102637,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"minimax-d2","moves":15,"totalMs":39.331,"maxMs":4.152,"nodes":7700,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":2.25,"maxMs":0.221,"nodes":336,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:5:b","n":6,"seed":756102637,"round":5,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"greedy","moves":20,"totalMs":2.889,"maxMs":0.254,"nodes":389,"searches":19,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":39.534,"maxMs":3.839,"nodes":7006,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d2:greedy:6:a","n":6,"seed":2212936879,"round":6,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"minimax-d2","moves":21,"totalMs":44.796,"maxMs":4.023,"nodes":8448,"searches":19,"deepSearches":19,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":3.008,"maxMs":0.186,"nodes":414,"searches":20,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:6:b","n":6,"seed":2212936879,"round":6,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"greedy","moves":20,"totalMs":3.379,"maxMs":0.399,"nodes":379,"searches":19,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":42.644,"maxMs":4.487,"nodes":6780,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d2:greedy:7:a","n":6,"seed":290126535,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d2","moves":11,"totalMs":39.26,"maxMs":4.632,"nodes":7100,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":1.703,"maxMs":0.27,"nodes":280,"searches":10,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:7:b","n":6,"seed":290126535,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"greedy","moves":12,"totalMs":2.856,"maxMs":0.487,"nodes":314,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":50.371,"maxMs":8.08,"nodes":6102,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-d2:greedy:8:a","n":6,"seed":3447816334,"round":8,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d2","moves":15,"totalMs":48.29,"maxMs":6.748,"nodes":7620,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":2.677,"maxMs":0.331,"nodes":338,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:8:b","n":6,"seed":3447816334,"round":8,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":2.475,"maxMs":0.355,"nodes":336,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":37.115,"maxMs":3.672,"nodes":6474,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d2:greedy:9:a","n":6,"seed":298600514,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"minimax-d2","moves":14,"totalMs":48.216,"maxMs":6.668,"nodes":7618,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":2.801,"maxMs":0.388,"nodes":325,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:9:b","n":6,"seed":298600514,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"greedy","moves":18,"totalMs":2.912,"maxMs":0.311,"nodes":386,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":18,"totalMs":42.215,"maxMs":5.013,"nodes":6888,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:greedy:10:a","n":6,"seed":2958173623,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d2","moves":11,"totalMs":35.184,"maxMs":4.231,"nodes":7100,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":1.615,"maxMs":0.203,"nodes":280,"searches":10,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:10:b","n":6,"seed":2958173623,"round":10,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"greedy","moves":10,"totalMs":1.497,"maxMs":0.269,"nodes":261,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":29.488,"maxMs":4.003,"nodes":5584,"searches":8,"deepSearches":8,"illegal":0}},{"id":"6:minimax-d2:greedy:11:a","n":6,"seed":1400265672,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"minimax-d2","moves":17,"totalMs":44.854,"maxMs":4.068,"nodes":8154,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":2.745,"maxMs":0.295,"nodes":368,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:11:b","n":6,"seed":1400265672,"round":11,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"greedy","moves":13,"totalMs":2.355,"maxMs":0.362,"nodes":312,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":12,"totalMs":36.965,"maxMs":4.528,"nodes":6270,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-d2:greedy:12:a","n":6,"seed":1329203820,"round":12,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d2","moves":17,"totalMs":49.823,"maxMs":4.452,"nodes":8064,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"greedy","moves":16,"totalMs":3.389,"maxMs":0.454,"nodes":366,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:12:b","n":6,"seed":1329203820,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"greedy","moves":17,"totalMs":3.8,"maxMs":0.599,"nodes":373,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":17,"totalMs":51.702,"maxMs":6.021,"nodes":6816,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:greedy:13:a","n":6,"seed":4104491700,"round":13,"result":"win","winner":"red","drawReason":null,"turns":47,"red":{"agent":"minimax-d2","moves":24,"totalMs":69.685,"maxMs":7.768,"nodes":8264,"searches":22,"deepSearches":22,"illegal":0},"blue":{"agent":"greedy","moves":23,"totalMs":6.006,"maxMs":0.677,"nodes":417,"searches":23,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:13:b","n":6,"seed":4104491700,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"greedy","moves":14,"totalMs":2.73,"maxMs":0.53,"nodes":336,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":54.426,"maxMs":8.812,"nodes":6392,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d2:greedy:14:a","n":6,"seed":3313527373,"round":14,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":42.64,"maxMs":5.144,"nodes":7326,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":2.422,"maxMs":0.468,"nodes":312,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:14:b","n":6,"seed":3313527373,"round":14,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"greedy","moves":20,"totalMs":6.137,"maxMs":0.544,"nodes":403,"searches":19,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":80.353,"maxMs":9.67,"nodes":7308,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d2:greedy:15:a","n":6,"seed":1252132880,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"minimax-d2","moves":18,"totalMs":118.093,"maxMs":11.927,"nodes":8236,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"greedy","moves":18,"totalMs":6.08,"maxMs":0.668,"nodes":377,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:15:b","n":6,"seed":1252132880,"round":15,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"greedy","moves":21,"totalMs":4.129,"maxMs":0.516,"nodes":398,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":20,"totalMs":53.818,"maxMs":5.79,"nodes":7050,"searches":19,"deepSearches":19,"illegal":0}},{"id":"6:minimax-d2:greedy:16:a","n":6,"seed":487941701,"round":16,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"minimax-d2","moves":21,"totalMs":90.622,"maxMs":12.109,"nodes":8274,"searches":19,"deepSearches":19,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":7.724,"maxMs":1.749,"nodes":404,"searches":20,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:16:b","n":6,"seed":487941701,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":18,"red":{"agent":"greedy","moves":9,"totalMs":1.636,"maxMs":0.408,"nodes":267,"searches":9,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":9,"totalMs":26.493,"maxMs":4.432,"nodes":5408,"searches":7,"deepSearches":7,"illegal":0}},{"id":"6:minimax-d2:greedy:17:a","n":6,"seed":169132342,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"minimax-d2","moves":10,"totalMs":42.758,"maxMs":6.609,"nodes":6810,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"greedy","moves":10,"totalMs":1.831,"maxMs":0.342,"nodes":261,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:17:b","n":6,"seed":169132342,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"greedy","moves":14,"totalMs":2.826,"maxMs":0.348,"nodes":336,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":37.652,"maxMs":4.571,"nodes":6392,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d2:greedy:18:a","n":6,"seed":3103033745,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"minimax-d2","moves":16,"totalMs":40.714,"maxMs":4.087,"nodes":7864,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"greedy","moves":16,"totalMs":2.702,"maxMs":0.418,"nodes":349,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:18:b","n":6,"seed":3103033745,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"greedy","moves":13,"totalMs":2.418,"maxMs":0.3,"nodes":325,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":13,"totalMs":38.038,"maxMs":5.421,"nodes":6270,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-d2:greedy:19:a","n":6,"seed":2288861074,"round":19,"result":"win","winner":"red","drawReason":null,"turns":51,"red":{"agent":"minimax-d2","moves":26,"totalMs":50.358,"maxMs":5.624,"nodes":8572,"searches":24,"deepSearches":24,"illegal":0},"blue":{"agent":"greedy","moves":25,"totalMs":3.782,"maxMs":0.23,"nodes":439,"searches":25,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:greedy:19:b","n":6,"seed":2288861074,"round":19,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"greedy","moves":11,"totalMs":1.576,"maxMs":0.216,"nodes":280,"searches":10,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":31.215,"maxMs":3.945,"nodes":5874,"searches":9,"deepSearches":9,"illegal":0}},{"id":"6:minimax-d2:random:0:a","n":6,"seed":1316931862,"round":0,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d2","moves":13,"totalMs":37.303,"maxMs":4.123,"nodes":7975,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.085,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:0:b","n":6,"seed":1316931862,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.21,"maxMs":0.071,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":17,"totalMs":45.496,"maxMs":3.866,"nodes":8186,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:random:1:a","n":6,"seed":2744780603,"round":1,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d2","moves":15,"totalMs":48.381,"maxMs":6.223,"nodes":8560,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.114,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:1:b","n":6,"seed":2744780603,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.223,"maxMs":0.068,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":17,"totalMs":45.549,"maxMs":4.433,"nodes":7810,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:random:2:a","n":6,"seed":2006942235,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"minimax-d2","moves":16,"totalMs":46.244,"maxMs":4.553,"nodes":8968,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.124,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:2:b","n":6,"seed":2006942235,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"random","moves":20,"totalMs":0.229,"maxMs":0.041,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":20,"totalMs":53.66,"maxMs":4.389,"nodes":8834,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d2:random:3:a","n":6,"seed":1220243347,"round":3,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d2","moves":17,"totalMs":48.293,"maxMs":5.005,"nodes":8976,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.15,"maxMs":0.027,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:3:b","n":6,"seed":1220243347,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":38,"red":{"agent":"random","moves":19,"totalMs":0.182,"maxMs":0.032,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":47.584,"maxMs":4.299,"nodes":8212,"searches":17,"deepSearches":17,"illegal":0}},{"id":"6:minimax-d2:random:4:a","n":6,"seed":4205934393,"round":4,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d2","moves":12,"totalMs":34.221,"maxMs":4.596,"nodes":7359,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.156,"maxMs":0.076,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:4:b","n":6,"seed":4205934393,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.119,"maxMs":0.024,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":40.111,"maxMs":4.324,"nodes":7254,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d2:random:5:a","n":6,"seed":2766119108,"round":5,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d2","moves":12,"totalMs":38.161,"maxMs":4.825,"nodes":7126,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.087,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:5:b","n":6,"seed":2766119108,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":38,"red":{"agent":"random","moves":19,"totalMs":0.152,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":44.212,"maxMs":3.999,"nodes":7706,"searches":17,"deepSearches":17,"illegal":0}},{"id":"6:minimax-d2:random:6:a","n":6,"seed":2300963238,"round":6,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d2","moves":17,"totalMs":45.954,"maxMs":4.655,"nodes":8189,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.127,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:6:b","n":6,"seed":2300963238,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.056,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":27.937,"maxMs":4.005,"nodes":6040,"searches":8,"deepSearches":8,"illegal":0}},{"id":"6:minimax-d2:random:7:a","n":6,"seed":65938959,"round":7,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-d2","moves":19,"totalMs":52.505,"maxMs":4.228,"nodes":9830,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"random","moves":18,"totalMs":0.168,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:7:b","n":6,"seed":65938959,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":20,"red":{"agent":"random","moves":10,"totalMs":0.074,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":10,"totalMs":31.943,"maxMs":4.449,"nodes":5666,"searches":8,"deepSearches":8,"illegal":0}},{"id":"6:minimax-d2:random:8:a","n":6,"seed":4081452901,"round":8,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d2","moves":17,"totalMs":62.403,"maxMs":7.195,"nodes":9530,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.198,"maxMs":0.028,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:8:b","n":6,"seed":4081452901,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"random","moves":16,"totalMs":0.163,"maxMs":0.042,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":16,"totalMs":44.658,"maxMs":4.068,"nodes":8261,"searches":14,"deepSearches":14,"illegal":0}},{"id":"6:minimax-d2:random:9:a","n":6,"seed":2202858139,"round":9,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d2","moves":12,"totalMs":39.951,"maxMs":4.839,"nodes":7344,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.105,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:9:b","n":6,"seed":2202858139,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":38,"red":{"agent":"random","moves":19,"totalMs":0.209,"maxMs":0.02,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":19,"totalMs":49.548,"maxMs":4.516,"nodes":8355,"searches":17,"deepSearches":17,"illegal":0}},{"id":"6:minimax-d2:random:10:a","n":6,"seed":539556585,"round":10,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d2","moves":17,"totalMs":48.119,"maxMs":4.238,"nodes":9388,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.129,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:10:b","n":6,"seed":539556585,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.103,"maxMs":0.021,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":14,"totalMs":34.861,"maxMs":3.405,"nodes":6708,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d2:random:11:a","n":6,"seed":3803567490,"round":11,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-d2","moves":20,"totalMs":48.502,"maxMs":3.865,"nodes":8956,"searches":18,"deepSearches":18,"illegal":0},"blue":{"agent":"random","moves":19,"totalMs":0.257,"maxMs":0.057,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:11:b","n":6,"seed":3803567490,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.075,"maxMs":0.014,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":11,"totalMs":33.981,"maxMs":4.27,"nodes":6320,"searches":9,"deepSearches":9,"illegal":0}},{"id":"6:minimax-d2:random:12:a","n":6,"seed":2843685656,"round":12,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d2","moves":16,"totalMs":44.207,"maxMs":5.14,"nodes":8170,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.143,"maxMs":0.021,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:12:b","n":6,"seed":2843685656,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.19,"maxMs":0.038,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":17,"totalMs":53.936,"maxMs":4.435,"nodes":7999,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:random:13:a","n":6,"seed":555208411,"round":13,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d2","moves":16,"totalMs":59.129,"maxMs":6.787,"nodes":8518,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.176,"maxMs":0.028,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:13:b","n":6,"seed":555208411,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.138,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":43.098,"maxMs":4.578,"nodes":7904,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d2:random:14:a","n":6,"seed":2613150986,"round":14,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d2","moves":18,"totalMs":50.708,"maxMs":5.404,"nodes":8798,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"random","moves":17,"totalMs":0.142,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:14:b","n":6,"seed":2613150986,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.092,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":40.644,"maxMs":3.833,"nodes":7987,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d2:random:15:a","n":6,"seed":2096098838,"round":15,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-d2","moves":20,"totalMs":43.595,"maxMs":3.57,"nodes":8214,"searches":18,"deepSearches":18,"illegal":0},"blue":{"agent":"random","moves":19,"totalMs":0.158,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:15:b","n":6,"seed":2096098838,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.125,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":15,"totalMs":38.978,"maxMs":4.379,"nodes":6864,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d2:random:16:a","n":6,"seed":2429613257,"round":16,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d2","moves":16,"totalMs":45.799,"maxMs":4.165,"nodes":9350,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.126,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:16:b","n":6,"seed":2429613257,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"random","moves":18,"totalMs":0.193,"maxMs":0.031,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":18,"totalMs":55.475,"maxMs":5.789,"nodes":8182,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d2:random:17:a","n":6,"seed":3314675227,"round":17,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d2","moves":15,"totalMs":51.047,"maxMs":6.546,"nodes":8558,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.163,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:17:b","n":6,"seed":3314675227,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.279,"maxMs":0.094,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":17,"totalMs":45.867,"maxMs":5.216,"nodes":6903,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:random:18:a","n":6,"seed":740912087,"round":18,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d2","moves":17,"totalMs":82.282,"maxMs":12.361,"nodes":8724,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.247,"maxMs":0.029,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:18:b","n":6,"seed":740912087,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.216,"maxMs":0.038,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":17,"totalMs":48.926,"maxMs":5.289,"nodes":7482,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d2:random:19:a","n":6,"seed":3711049178,"round":19,"result":"win","winner":"red","drawReason":null,"turns":43,"red":{"agent":"minimax-d2","moves":22,"totalMs":61.886,"maxMs":5.692,"nodes":8766,"searches":20,"deepSearches":20,"illegal":0},"blue":{"agent":"random","moves":21,"totalMs":0.275,"maxMs":0.029,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d2:random:19:b","n":6,"seed":3711049178,"round":19,"result":"win","winner":"red","drawReason":null,"turns":49,"red":{"agent":"random","moves":25,"totalMs":0.245,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d2","moves":24,"totalMs":54.128,"maxMs":3.887,"nodes":8787,"searches":23,"deepSearches":23,"illegal":0}},{"id":"6:minimax-d3:greedy:0:a","n":6,"seed":4064720225,"round":0,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":725.12,"maxMs":134.424,"nodes":168968,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":1.202,"maxMs":0.197,"nodes":240,"searches":8,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:0:b","n":6,"seed":4064720225,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"greedy","moves":17,"totalMs":2.646,"maxMs":0.209,"nodes":359,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":802.803,"maxMs":109.913,"nodes":154470,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d3:greedy:1:a","n":6,"seed":2412564136,"round":1,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":936.685,"maxMs":114.048,"nodes":196205,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"greedy","moves":16,"totalMs":3.079,"maxMs":0.383,"nodes":360,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:1:b","n":6,"seed":2412564136,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"greedy","moves":14,"totalMs":2.246,"maxMs":0.182,"nodes":348,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":827.07,"maxMs":110.872,"nodes":157913,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d3:greedy:2:a","n":6,"seed":3095825230,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"minimax-d3","moves":20,"totalMs":938.59,"maxMs":110.815,"nodes":197632,"searches":19,"deepSearches":19,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":2.944,"maxMs":0.204,"nodes":383,"searches":19,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:2:b","n":6,"seed":3095825230,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"greedy","moves":20,"totalMs":3.225,"maxMs":0.218,"nodes":410,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":20,"totalMs":845.233,"maxMs":112.032,"nodes":163081,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d3:greedy:3:a","n":6,"seed":273901396,"round":3,"result":"win","winner":"red","drawReason":null,"turns":19,"red":{"agent":"minimax-d3","moves":10,"totalMs":763.253,"maxMs":111.163,"nodes":177441,"searches":8,"deepSearches":8,"illegal":0},"blue":{"agent":"greedy","moves":9,"totalMs":1.819,"maxMs":0.504,"nodes":261,"searches":9,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:3:b","n":6,"seed":273901396,"round":3,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"greedy","moves":16,"totalMs":3.176,"maxMs":0.376,"nodes":349,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":15,"totalMs":1116.978,"maxMs":219.911,"nodes":155101,"searches":14,"deepSearches":14,"illegal":0}},{"id":"6:minimax-d3:greedy:4:a","n":6,"seed":1352979736,"round":4,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":1113.801,"maxMs":139.401,"nodes":194742,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"greedy","moves":16,"totalMs":3.601,"maxMs":0.51,"nodes":354,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:4:b","n":6,"seed":1352979736,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"greedy","moves":18,"totalMs":2.913,"maxMs":0.193,"nodes":372,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":944.787,"maxMs":174.23,"nodes":156408,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d3:greedy:5:a","n":6,"seed":4229530513,"round":5,"result":"win","winner":"red","drawReason":null,"turns":17,"red":{"agent":"minimax-d3","moves":9,"totalMs":772.592,"maxMs":131.035,"nodes":169164,"searches":7,"deepSearches":7,"illegal":0},"blue":{"agent":"greedy","moves":8,"totalMs":1.195,"maxMs":0.202,"nodes":242,"searches":8,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:5:b","n":6,"seed":4229530513,"round":5,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"greedy","moves":16,"totalMs":2.782,"maxMs":0.43,"nodes":345,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":15,"totalMs":1083.998,"maxMs":179.308,"nodes":154076,"searches":14,"deepSearches":14,"illegal":0}},{"id":"6:minimax-d3:greedy:6:a","n":6,"seed":3694232451,"round":6,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d3","moves":18,"totalMs":983.227,"maxMs":122.088,"nodes":195078,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":2.961,"maxMs":0.279,"nodes":359,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:6:b","n":6,"seed":3694232451,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":42,"red":{"agent":"greedy","moves":21,"totalMs":3.371,"maxMs":0.314,"nodes":399,"searches":21,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":21,"totalMs":948.331,"maxMs":158.513,"nodes":155150,"searches":19,"deepSearches":19,"illegal":0}},{"id":"6:minimax-d3:greedy:7:a","n":6,"seed":3163981398,"round":7,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":967.006,"maxMs":112.048,"nodes":194820,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"greedy","moves":16,"totalMs":2.897,"maxMs":0.303,"nodes":354,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:7:b","n":6,"seed":3163981398,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"greedy","moves":17,"totalMs":2.587,"maxMs":0.19,"nodes":375,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":842.384,"maxMs":115.505,"nodes":160678,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d3:greedy:8:a","n":6,"seed":2182082952,"round":8,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"minimax-d3","moves":12,"totalMs":841.382,"maxMs":109.251,"nodes":187908,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":1.782,"maxMs":0.192,"nodes":297,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:8:b","n":6,"seed":2182082952,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"greedy","moves":13,"totalMs":2.103,"maxMs":0.263,"nodes":325,"searches":13,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":802.664,"maxMs":112.818,"nodes":152296,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-d3:greedy:9:a","n":6,"seed":3755257513,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"minimax-d3","moves":11,"totalMs":845.784,"maxMs":113.785,"nodes":187536,"searches":10,"deepSearches":10,"illegal":0},"blue":{"agent":"greedy","moves":11,"totalMs":1.625,"maxMs":0.215,"nodes":280,"searches":10,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:9:b","n":6,"seed":3755257513,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":38,"red":{"agent":"greedy","moves":19,"totalMs":3.506,"maxMs":0.395,"nodes":407,"searches":19,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":19,"totalMs":1037.516,"maxMs":176.614,"nodes":169582,"searches":17,"deepSearches":17,"illegal":0}},{"id":"6:minimax-d3:greedy:10:a","n":6,"seed":3366619702,"round":10,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"minimax-d3","moves":21,"totalMs":1038.685,"maxMs":118.805,"nodes":204672,"searches":19,"deepSearches":19,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":3.232,"maxMs":0.212,"nodes":406,"searches":20,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:10:b","n":6,"seed":3366619702,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"greedy","moves":15,"totalMs":2.352,"maxMs":0.195,"nodes":361,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":15,"totalMs":873.315,"maxMs":113.416,"nodes":172792,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d3:greedy:11:a","n":6,"seed":4221210584,"round":11,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d3","moves":18,"totalMs":994.885,"maxMs":122.218,"nodes":201160,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":2.952,"maxMs":0.271,"nodes":373,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:11:b","n":6,"seed":4221210584,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"greedy","moves":16,"totalMs":2.93,"maxMs":0.321,"nodes":384,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":16,"totalMs":1043.657,"maxMs":129.986,"nodes":169399,"searches":14,"deepSearches":14,"illegal":0}},{"id":"6:minimax-d3:greedy:12:a","n":6,"seed":3845616595,"round":12,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-d3","moves":20,"totalMs":1089.686,"maxMs":171.816,"nodes":195039,"searches":18,"deepSearches":18,"illegal":0},"blue":{"agent":"greedy","moves":19,"totalMs":3.67,"maxMs":0.395,"nodes":369,"searches":19,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:12:b","n":6,"seed":3845616595,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"greedy","moves":18,"totalMs":2.88,"maxMs":0.27,"nodes":376,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":841.044,"maxMs":129.782,"nodes":156700,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d3:greedy:13:a","n":6,"seed":2323275090,"round":13,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":881.582,"maxMs":106.226,"nodes":192645,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":2.149,"maxMs":0.218,"nodes":325,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:13:b","n":6,"seed":2323275090,"round":13,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":2.212,"maxMs":0.229,"nodes":336,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":778.789,"maxMs":107.159,"nodes":153042,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d3:greedy:14:a","n":6,"seed":677004524,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"minimax-d3","moves":13,"totalMs":933.102,"maxMs":111.086,"nodes":192558,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":2.377,"maxMs":0.516,"nodes":312,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:14:b","n":6,"seed":677004524,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"greedy","moves":15,"totalMs":2.587,"maxMs":0.31,"nodes":361,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":15,"totalMs":897.859,"maxMs":112.763,"nodes":164712,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d3:greedy:15:a","n":6,"seed":603189921,"round":15,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":917.707,"maxMs":126.035,"nodes":190634,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":2.02,"maxMs":0.238,"nodes":314,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:15:b","n":6,"seed":603189921,"round":15,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"greedy","moves":18,"totalMs":2.859,"maxMs":0.215,"nodes":375,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":884.401,"maxMs":108.89,"nodes":159110,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d3:greedy:16:a","n":6,"seed":295286150,"round":16,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"minimax-d3","moves":21,"totalMs":1115.79,"maxMs":202.527,"nodes":196440,"searches":19,"deepSearches":19,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":3.668,"maxMs":0.435,"nodes":386,"searches":20,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:16:b","n":6,"seed":295286150,"round":16,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"greedy","moves":16,"totalMs":2.507,"maxMs":0.253,"nodes":345,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":15,"totalMs":860.736,"maxMs":121.713,"nodes":153844,"searches":14,"deepSearches":14,"illegal":0}},{"id":"6:minimax-d3:greedy:17:a","n":6,"seed":531458014,"round":17,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d3","moves":15,"totalMs":966.429,"maxMs":114.525,"nodes":203358,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":2.352,"maxMs":0.279,"nodes":352,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:17:b","n":6,"seed":531458014,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"greedy","moves":17,"totalMs":2.751,"maxMs":0.242,"nodes":373,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":876.921,"maxMs":107.473,"nodes":160678,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d3:greedy:18:a","n":6,"seed":672884720,"round":18,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d3","moves":16,"totalMs":1037.834,"maxMs":112.163,"nodes":214254,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":2.471,"maxMs":0.19,"nodes":379,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:18:b","n":6,"seed":672884720,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"greedy","moves":12,"totalMs":1.854,"maxMs":0.198,"nodes":314,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":754.993,"maxMs":109.866,"nodes":150595,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-d3:greedy:19:a","n":6,"seed":1628057979,"round":19,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":964.015,"maxMs":143.778,"nodes":192944,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":2.231,"maxMs":0.278,"nodes":325,"searches":13,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:greedy:19:b","n":6,"seed":1628057979,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"greedy","moves":8,"totalMs":1.125,"maxMs":0.179,"nodes":247,"searches":8,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":661.656,"maxMs":124.095,"nodes":142695,"searches":6,"deepSearches":6,"illegal":0}},{"id":"6:minimax-d3:random:0:a","n":6,"seed":2577681578,"round":0,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d3","moves":16,"totalMs":1026.73,"maxMs":116.007,"nodes":197153,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.195,"maxMs":0.02,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:0:b","n":6,"seed":2577681578,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.14,"maxMs":0.016,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":842.057,"maxMs":109.103,"nodes":174233,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-d3:random:1:a","n":6,"seed":4004995844,"round":1,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d3","moves":15,"totalMs":915.414,"maxMs":107.737,"nodes":205484,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.169,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:1:b","n":6,"seed":4004995844,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.164,"maxMs":0.03,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":1139.257,"maxMs":158.119,"nodes":167782,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-d3:random:2:a","n":6,"seed":3452618656,"round":2,"result":"win","winner":"red","drawReason":null,"turns":21,"red":{"agent":"minimax-d3","moves":11,"totalMs":833.661,"maxMs":119.168,"nodes":185852,"searches":9,"deepSearches":9,"illegal":0},"blue":{"agent":"random","moves":10,"totalMs":0.101,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:2:b","n":6,"seed":3452618656,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.211,"maxMs":0.049,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":1011.342,"maxMs":125.469,"nodes":190771,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d3:random:3:a","n":6,"seed":3058814981,"round":3,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":1075.753,"maxMs":113.019,"nodes":234264,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.213,"maxMs":0.02,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:3:b","n":6,"seed":3058814981,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.194,"maxMs":0.03,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":1376.302,"maxMs":188.423,"nodes":178393,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d3:random:4:a","n":6,"seed":828562478,"round":4,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":1028.328,"maxMs":128.573,"nodes":192273,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.226,"maxMs":0.028,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:4:b","n":6,"seed":828562478,"round":4,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.176,"maxMs":0.021,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":1067.2,"maxMs":174.218,"nodes":191558,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d3:random:5:a","n":6,"seed":2998898852,"round":5,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":1171.523,"maxMs":130.895,"nodes":225647,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.233,"maxMs":0.021,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:5:b","n":6,"seed":2998898852,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":44,"red":{"agent":"random","moves":22,"totalMs":0.845,"maxMs":0.448,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":22,"totalMs":1257.603,"maxMs":139.414,"nodes":185202,"searches":20,"deepSearches":20,"illegal":0}},{"id":"6:minimax-d3:random:6:a","n":6,"seed":1737120948,"round":6,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":1440.327,"maxMs":148.92,"nodes":215862,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.248,"maxMs":0.023,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:6:b","n":6,"seed":1737120948,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.147,"maxMs":0.02,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":920.406,"maxMs":123.989,"nodes":174621,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-d3:random:7:a","n":6,"seed":1774284330,"round":7,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d3","moves":16,"totalMs":1187.885,"maxMs":127.88,"nodes":222985,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.218,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:7:b","n":6,"seed":1774284330,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"random","moves":20,"totalMs":0.318,"maxMs":0.027,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":20,"totalMs":1102.376,"maxMs":149.016,"nodes":190166,"searches":18,"deepSearches":18,"illegal":0}},{"id":"6:minimax-d3:random:8:a","n":6,"seed":1157145199,"round":8,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"minimax-d3","moves":19,"totalMs":1430.697,"maxMs":123.755,"nodes":227825,"searches":17,"deepSearches":17,"illegal":0},"blue":{"agent":"random","moves":18,"totalMs":0.371,"maxMs":0.083,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:8:b","n":6,"seed":1157145199,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"random","moves":18,"totalMs":0.24,"maxMs":0.025,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":18,"totalMs":873.603,"maxMs":114.02,"nodes":161754,"searches":16,"deepSearches":16,"illegal":0}},{"id":"6:minimax-d3:random:9:a","n":6,"seed":2604851162,"round":9,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"minimax-d3","moves":18,"totalMs":1109.709,"maxMs":150.218,"nodes":201589,"searches":16,"deepSearches":16,"illegal":0},"blue":{"agent":"random","moves":17,"totalMs":0.283,"maxMs":0.073,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:9:b","n":6,"seed":2604851162,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.24,"maxMs":0.028,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":17,"totalMs":1061.17,"maxMs":163.792,"nodes":180356,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d3:random:10:a","n":6,"seed":2057013741,"round":10,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":1402.017,"maxMs":182.27,"nodes":259002,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.219,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:10:b","n":6,"seed":2057013741,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.15,"maxMs":0.026,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":878.568,"maxMs":157.228,"nodes":169588,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-d3:random:11:a","n":6,"seed":2008278560,"round":11,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"minimax-d3","moves":16,"totalMs":1174.087,"maxMs":116.814,"nodes":199489,"searches":14,"deepSearches":14,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.201,"maxMs":0.021,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:11:b","n":6,"seed":2008278560,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":22,"red":{"agent":"random","moves":11,"totalMs":0.108,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":11,"totalMs":896.412,"maxMs":161.817,"nodes":175287,"searches":9,"deepSearches":9,"illegal":0}},{"id":"6:minimax-d3:random:12:a","n":6,"seed":1187471904,"round":12,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":1138.311,"maxMs":184.015,"nodes":205045,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.162,"maxMs":0.019,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:12:b","n":6,"seed":1187471904,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.186,"maxMs":0.057,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":12,"totalMs":795.841,"maxMs":116.754,"nodes":150191,"searches":10,"deepSearches":10,"illegal":0}},{"id":"6:minimax-d3:random:13:a","n":6,"seed":2249069895,"round":13,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"minimax-d3","moves":17,"totalMs":1066.51,"maxMs":135.549,"nodes":194614,"searches":15,"deepSearches":15,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.32,"maxMs":0.098,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:13:b","n":6,"seed":2249069895,"round":13,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.149,"maxMs":0.019,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":984.495,"maxMs":128.209,"nodes":177478,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:minimax-d3:random:14:a","n":6,"seed":3901433970,"round":14,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"minimax-d3","moves":13,"totalMs":1007.546,"maxMs":118.084,"nodes":203159,"searches":11,"deepSearches":11,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.148,"maxMs":0.019,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:14:b","n":6,"seed":3901433970,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.175,"maxMs":0.024,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":922.773,"maxMs":115.045,"nodes":171376,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d3:random:15:a","n":6,"seed":776329080,"round":15,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"minimax-d3","moves":21,"totalMs":1065.244,"maxMs":119.073,"nodes":204799,"searches":19,"deepSearches":19,"illegal":0},"blue":{"agent":"random","moves":20,"totalMs":0.319,"maxMs":0.024,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:15:b","n":6,"seed":776329080,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.207,"maxMs":0.045,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":14,"totalMs":920.521,"maxMs":132.475,"nodes":165040,"searches":12,"deepSearches":12,"illegal":0}},{"id":"6:minimax-d3:random:16:a","n":6,"seed":1396609737,"round":16,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"minimax-d3","moves":15,"totalMs":1142.525,"maxMs":165.324,"nodes":214669,"searches":13,"deepSearches":13,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.21,"maxMs":0.035,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:16:b","n":6,"seed":1396609737,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.154,"maxMs":0.019,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":15,"totalMs":1146.374,"maxMs":153.266,"nodes":191645,"searches":13,"deepSearches":13,"illegal":0}},{"id":"6:minimax-d3:random:17:a","n":6,"seed":3554728446,"round":17,"result":"win","winner":"red","drawReason":null,"turns":27,"red":{"agent":"minimax-d3","moves":14,"totalMs":1091.153,"maxMs":202.121,"nodes":205614,"searches":12,"deepSearches":12,"illegal":0},"blue":{"agent":"random","moves":13,"totalMs":0.139,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:17:b","n":6,"seed":3554728446,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":16,"red":{"agent":"random","moves":8,"totalMs":0.05,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":8,"totalMs":603.847,"maxMs":112.056,"nodes":136558,"searches":6,"deepSearches":6,"illegal":0}},{"id":"6:minimax-d3:random:18:a","n":6,"seed":1842363847,"round":18,"result":"win","winner":"red","drawReason":null,"turns":39,"red":{"agent":"minimax-d3","moves":20,"totalMs":1144.202,"maxMs":126.333,"nodes":214283,"searches":18,"deepSearches":18,"illegal":0},"blue":{"agent":"random","moves":19,"totalMs":0.254,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:18:b","n":6,"seed":1842363847,"round":18,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"random","moves":17,"totalMs":0.232,"maxMs":0.034,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":16,"totalMs":988.798,"maxMs":124.419,"nodes":166912,"searches":15,"deepSearches":15,"illegal":0}},{"id":"6:minimax-d3:random:19:a","n":6,"seed":4121670614,"round":19,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"minimax-d3","moves":21,"totalMs":1388.16,"maxMs":195.607,"nodes":253065,"searches":19,"deepSearches":19,"illegal":0},"blue":{"agent":"random","moves":20,"totalMs":0.263,"maxMs":0.022,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:minimax-d3:random:19:b","n":6,"seed":4121670614,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.152,"maxMs":0.045,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"minimax-d3","moves":13,"totalMs":831.698,"maxMs":108.31,"nodes":169326,"searches":11,"deepSearches":11,"illegal":0}},{"id":"6:greedy:random:0:a","n":6,"seed":1761573063,"round":0,"result":"win","winner":"red","drawReason":null,"turns":41,"red":{"agent":"greedy","moves":21,"totalMs":3.005,"maxMs":0.252,"nodes":404,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":20,"totalMs":0.139,"maxMs":0.014,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:0:b","n":6,"seed":1761573063,"round":0,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.089,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":2.543,"maxMs":0.254,"nodes":388,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:1:a","n":6,"seed":608856871,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"greedy","moves":20,"totalMs":4.108,"maxMs":0.554,"nodes":460,"searches":20,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":20,"totalMs":0.169,"maxMs":0.04,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:1:b","n":6,"seed":608856871,"round":1,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"random","moves":16,"totalMs":0.086,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":16,"totalMs":2.718,"maxMs":0.331,"nodes":392,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:2:a","n":6,"seed":1445307772,"round":2,"result":"win","winner":"red","drawReason":null,"turns":25,"red":{"agent":"greedy","moves":13,"totalMs":1.875,"maxMs":0.27,"nodes":345,"searches":12,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":12,"totalMs":0.051,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:2:b","n":6,"seed":1445307772,"round":2,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"random","moves":20,"totalMs":0.132,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":2.858,"maxMs":0.231,"nodes":415,"searches":19,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:3:a","n":6,"seed":4288608777,"round":3,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"greedy","moves":19,"totalMs":2.659,"maxMs":0.26,"nodes":420,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":18,"totalMs":0.108,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:3:b","n":6,"seed":4288608777,"round":3,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"random","moves":18,"totalMs":0.097,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":18,"totalMs":2.623,"maxMs":0.244,"nodes":393,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:4:a","n":6,"seed":149938734,"round":4,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":1.963,"maxMs":0.165,"nodes":346,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.066,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:4:b","n":6,"seed":149938734,"round":4,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"random","moves":18,"totalMs":0.171,"maxMs":0.033,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":4.23,"maxMs":0.79,"nodes":395,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:5:a","n":6,"seed":1308205427,"round":5,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"greedy","moves":19,"totalMs":3.362,"maxMs":0.581,"nodes":433,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":18,"totalMs":0.126,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:5:b","n":6,"seed":1308205427,"round":5,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.102,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":2.497,"maxMs":0.257,"nodes":388,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:6:a","n":6,"seed":806639720,"round":6,"result":"win","winner":"red","drawReason":null,"turns":35,"red":{"agent":"greedy","moves":18,"totalMs":3.238,"maxMs":0.603,"nodes":427,"searches":17,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":17,"totalMs":0.123,"maxMs":0.029,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:6:b","n":6,"seed":806639720,"round":6,"result":"win","winner":"blue","drawReason":null,"turns":32,"red":{"agent":"random","moves":16,"totalMs":0.08,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":16,"totalMs":2.218,"maxMs":0.172,"nodes":377,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:7:a","n":6,"seed":911753572,"round":7,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":2.21,"maxMs":0.205,"nodes":369,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.07,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:7:b","n":6,"seed":911753572,"round":7,"result":"win","winner":"blue","drawReason":null,"turns":36,"red":{"agent":"random","moves":18,"totalMs":0.105,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":18,"totalMs":2.774,"maxMs":0.263,"nodes":385,"searches":17,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:8:a","n":6,"seed":689923035,"round":8,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":2.098,"maxMs":0.24,"nodes":376,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.067,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:8:b","n":6,"seed":689923035,"round":8,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"random","moves":20,"totalMs":0.214,"maxMs":0.097,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":2.687,"maxMs":0.172,"nodes":385,"searches":19,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:9:a","n":6,"seed":745898922,"round":9,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"greedy","moves":16,"totalMs":2.236,"maxMs":0.174,"nodes":363,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.077,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:9:b","n":6,"seed":745898922,"round":9,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.072,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":2.037,"maxMs":0.195,"nodes":370,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:10:a","n":6,"seed":4254412685,"round":10,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"greedy","moves":16,"totalMs":2.397,"maxMs":0.22,"nodes":387,"searches":15,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":15,"totalMs":0.097,"maxMs":0.028,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:10:b","n":6,"seed":4254412685,"round":10,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.077,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":2.43,"maxMs":0.245,"nodes":357,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:11:a","n":6,"seed":2106573534,"round":11,"result":"win","winner":"red","drawReason":null,"turns":37,"red":{"agent":"greedy","moves":19,"totalMs":2.698,"maxMs":0.244,"nodes":443,"searches":18,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":18,"totalMs":0.106,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:11:b","n":6,"seed":2106573534,"round":11,"result":"win","winner":"blue","drawReason":null,"turns":40,"red":{"agent":"random","moves":20,"totalMs":0.126,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":20,"totalMs":3.026,"maxMs":0.234,"nodes":427,"searches":19,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:12:a","n":6,"seed":2080415366,"round":12,"result":"win","winner":"red","drawReason":null,"turns":23,"red":{"agent":"greedy","moves":12,"totalMs":1.532,"maxMs":0.226,"nodes":337,"searches":11,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":11,"totalMs":0.042,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:12:b","n":6,"seed":2080415366,"round":12,"result":"win","winner":"blue","drawReason":null,"turns":38,"red":{"agent":"random","moves":19,"totalMs":0.123,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":19,"totalMs":2.823,"maxMs":0.188,"nodes":408,"searches":18,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:13:a","n":6,"seed":189284120,"round":13,"result":"win","winner":"red","drawReason":null,"turns":47,"red":{"agent":"greedy","moves":24,"totalMs":3.674,"maxMs":0.261,"nodes":473,"searches":23,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":23,"totalMs":0.183,"maxMs":0.015,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:13:b","n":6,"seed":189284120,"round":13,"result":"win","winner":"red","drawReason":null,"turns":31,"red":{"agent":"random","moves":16,"totalMs":0.099,"maxMs":0.018,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":2.962,"maxMs":0.327,"nodes":363,"searches":15,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:14:a","n":6,"seed":3457848742,"round":14,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"greedy","moves":17,"totalMs":2.466,"maxMs":0.23,"nodes":418,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.088,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:14:b","n":6,"seed":3457848742,"round":14,"result":"win","winner":"blue","drawReason":null,"turns":30,"red":{"agent":"random","moves":15,"totalMs":0.069,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":15,"totalMs":2.24,"maxMs":0.224,"nodes":358,"searches":14,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:15:a","n":6,"seed":1708412067,"round":15,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"greedy","moves":17,"totalMs":2.553,"maxMs":0.264,"nodes":388,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.092,"maxMs":0.012,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:15:b","n":6,"seed":1708412067,"round":15,"result":"win","winner":"blue","drawReason":null,"turns":24,"red":{"agent":"random","moves":12,"totalMs":0.043,"maxMs":0.007,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":12,"totalMs":1.567,"maxMs":0.165,"nodes":315,"searches":11,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:16:a","n":6,"seed":466097946,"round":16,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"greedy","moves":17,"totalMs":5.512,"maxMs":0.601,"nodes":401,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.217,"maxMs":0.035,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:16:b","n":6,"seed":466097946,"round":16,"result":"win","winner":"blue","drawReason":null,"turns":26,"red":{"agent":"random","moves":13,"totalMs":0.058,"maxMs":0.008,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":13,"totalMs":2.057,"maxMs":0.292,"nodes":326,"searches":12,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:17:a","n":6,"seed":4019563749,"round":17,"result":"win","winner":"red","drawReason":null,"turns":29,"red":{"agent":"greedy","moves":15,"totalMs":2.116,"maxMs":0.179,"nodes":354,"searches":14,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":14,"totalMs":0.069,"maxMs":0.011,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:17:b","n":6,"seed":4019563749,"round":17,"result":"win","winner":"blue","drawReason":null,"turns":50,"red":{"agent":"random","moves":25,"totalMs":0.276,"maxMs":0.083,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":25,"totalMs":3.66,"maxMs":0.218,"nodes":476,"searches":24,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:18:a","n":6,"seed":2163527119,"round":18,"result":"win","winner":"red","drawReason":null,"turns":45,"red":{"agent":"greedy","moves":23,"totalMs":3.132,"maxMs":0.178,"nodes":428,"searches":22,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":22,"totalMs":0.164,"maxMs":0.017,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:18:b","n":6,"seed":2163527119,"round":18,"result":"win","winner":"blue","drawReason":null,"turns":34,"red":{"agent":"random","moves":17,"totalMs":0.104,"maxMs":0.013,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":17,"totalMs":2.557,"maxMs":0.245,"nodes":390,"searches":16,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:19:a","n":6,"seed":2671863345,"round":19,"result":"win","winner":"red","drawReason":null,"turns":33,"red":{"agent":"greedy","moves":17,"totalMs":2.826,"maxMs":0.33,"nodes":421,"searches":16,"deepSearches":0,"illegal":0},"blue":{"agent":"random","moves":16,"totalMs":0.087,"maxMs":0.01,"nodes":0,"searches":0,"deepSearches":0,"illegal":0}},{"id":"6:greedy:random:19:b","n":6,"seed":2671863345,"round":19,"result":"win","winner":"blue","drawReason":null,"turns":28,"red":{"agent":"random","moves":14,"totalMs":0.061,"maxMs":0.009,"nodes":0,"searches":0,"deepSearches":0,"illegal":0},"blue":{"agent":"greedy","moves":14,"totalMs":2.038,"maxMs":0.24,"nodes":347,"searches":13,"deepSearches":0,"illegal":0}}]} diff --git a/web/src/lib/download.ts b/web/src/lib/download.ts new file mode 100644 index 0000000..51d7859 --- /dev/null +++ b/web/src/lib/download.ts @@ -0,0 +1,12 @@ +/** Save text as a file from the browser (CSV / JSON exports). */ +export function downloadText(filename: string, text: string, type = "text/csv;charset=utf-8") { + const blob = new Blob([text], { type }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + a.remove(); + setTimeout(() => URL.revokeObjectURL(url), 1000); +} diff --git a/web/src/lib/rng.ts b/web/src/lib/rng.ts index 23be1e7..2e33496 100644 --- a/web/src/lib/rng.ts +++ b/web/src/lib/rng.ts @@ -45,3 +45,27 @@ export function sample(rng: Rng, items: readonly T[], k: number): T[] { export function randomSeed(): number { return Math.floor(Math.random() * 2 ** 31); } + +/** + * Derive a 32-bit seed from a parent seed and any number of integer labels + * (board size, pairing, round...). Uses the murmur3 finaliser so nearby + * inputs give unrelated seeds; the same inputs always give the same seed. + */ +export function deriveSeed(...parts: number[]): number { + let h = 0x9e3779b9; + for (const part of parts) { + let k = Math.imul(part | 0, 0xcc9e2d51); + k = (k << 15) | (k >>> 17); + k = Math.imul(k, 0x1b873593); + h ^= k; + h = (h << 13) | (h >>> 19); + h = (Math.imul(h, 5) + 0xe6546b64) | 0; + } + h ^= parts.length; + h ^= h >>> 16; + h = Math.imul(h, 0x85ebca6b); + h ^= h >>> 13; + h = Math.imul(h, 0xc2b2ae35); + h ^= h >>> 16; + return h >>> 0; +} diff --git a/web/src/lib/tournament/agents.ts b/web/src/lib/tournament/agents.ts new file mode 100644 index 0000000..40b4ba1 --- /dev/null +++ b/web/src/lib/tournament/agents.ts @@ -0,0 +1,113 @@ +/** + * The agents in the round-robin harness. Every minimax variant is the ported + * `_4399` agent with exactly one knob changed, so a difference in results can + * be attributed to that knob: + * + * - minimax-dynamic: the original as submitted (dynamic depth 1 to 4); + * - minimax-d2 / minimax-d3: the same agent with the depth fixed; + * - greedy: no opening book and depth fixed at 1 (the instant-win check is + * kept), i.e. one-ply lookahead on the hand-tuned evaluation; + * - random: the subject's random baseline. + * + * The same variants are built from the original Python in + * scripts/crosscheck_tournament.py by patching `dynamic_depth_allocation` + * and passing `enforceGamePlayer=False`. + */ +import { randomBias } from "@/lib/agent/evaluation"; +import { type AgentDecision, type AgentOptions, chooseAgentAction } from "@/lib/agent/player"; +import { chooseRandomAction } from "@/lib/agent/random-player"; +import type { Action, Colour } from "@/lib/cachex/types"; +import type { Rng } from "@/lib/rng"; + +export const AGENT_IDS = [ + "minimax-dynamic", + "minimax-d2", + "minimax-d3", + "greedy", + "random", +] as const; + +export type AgentId = (typeof AGENT_IDS)[number]; + +export interface TournamentAgent { + id: AgentId; + label: string; + short: string; + description: string; + /** What changes relative to the original agent. */ + knob: string; + /** Largest board the in-browser harness offers this agent on (search cost). */ + maxLiveN: number; + options: AgentOptions | null; +} + +export const AGENTS: Record = { + "minimax-dynamic": { + id: "minimax-dynamic", + label: "Minimax, dynamic depth (original)", + short: "Original", + description: + "The _4399 agent as submitted: opening book, instant-win check, then alpha-beta search whose depth grows from 1 to 4 as the board fills.", + knob: "none (as submitted)", + maxLiveN: 8, + options: {}, + }, + "minimax-d2": { + id: "minimax-d2", + label: "Minimax, fixed depth 2", + short: "Depth 2", + description: "The same agent, searching two plies on every move.", + knob: "depth fixed at 2", + maxLiveN: 7, + options: { fixedDepth: 2 }, + }, + "minimax-d3": { + id: "minimax-d3", + label: "Minimax, fixed depth 3", + short: "Depth 3", + description: "The same agent, searching three plies on every move. Slow above 5 × 5.", + knob: "depth fixed at 3", + maxLiveN: 6, + options: { fixedDepth: 3 }, + }, + greedy: { + id: "greedy", + label: "Greedy one-ply", + short: "Greedy", + description: + "No opening book: takes an immediate win if there is one, otherwise the move with the best evaluation one ply ahead.", + knob: "depth fixed at 1, no opening book", + maxLiveN: 8, + options: { fixedDepth: 1, enforceGamePlay: false }, + }, + random: { + id: "random", + label: "Random baseline", + short: "Random", + description: + "The subject's random agent: steals with probability 1/2 as Blue's first move, otherwise a uniformly random empty cell.", + knob: "not a minimax agent", + maxLiveN: 10, + options: null, + }, +}; + +export const isAgentId = (x: unknown): x is AgentId => + typeof x === "string" && (AGENT_IDS as readonly string[]).includes(x); + +/** Ask an agent for its move given the full action history. */ +export function tournamentMove( + id: AgentId, + n: number, + history: readonly Action[], + colour: Colour, + rng: Rng, +): AgentDecision { + const agent = AGENTS[id]; + if (agent.options === null) return chooseRandomAction(n, history, rng); + return chooseAgentAction(n, history, colour, { + ...agent.options, + order: rng, + bias: randomBias(rng), + }); +} diff --git a/web/src/lib/tournament/analyse.ts b/web/src/lib/tournament/analyse.ts new file mode 100644 index 0000000..6697abf --- /dev/null +++ b/web/src/lib/tournament/analyse.ts @@ -0,0 +1,300 @@ +/** + * Turns game records into the numbers the tournament page reports: + * win rates with Wilson intervals, Bradley-Terry strengths on the Elo scale + * with stratified bootstrap intervals, the first-move (colour) effect and + * mean move times with bootstrap intervals. + */ +import { type CsvValue, toCsv } from "@/lib/csv"; +import { type BootstrapCI, bootstrapMean, stratifiedBootstrapVector } from "@/lib/stats/bootstrap"; +import { type PairOutcome, fitBradleyTerry, toElo } from "@/lib/stats/bradley-terry"; +import { type ProportionCI, wilson } from "@/lib/stats/proportion"; +import { AGENTS, type AgentId } from "./agents"; +import { type GameRecord, winningAgent } from "./play"; +import { canonicalAgents, pairKey } from "./schedule"; + +export interface Interval { + estimate: number; + lower: number; + upper: number; +} + +export interface AgentStanding { + id: AgentId; + games: number; + wins: number; + losses: number; + draws: number; + /** Games this agent lost by an illegal move. */ + forfeits: number; + illegalMoves: number; + moves: number; + winRate: ProportionCI; + /** Bradley-Terry strength on the Elo scale (anchored, see summary.anchor). */ + elo: Interval; + /** Mean time per move (ms), averaged per game, with a bootstrap CI over games. */ + moveMs: BootstrapCI; + /** Mean search nodes per move. */ + nodesPerMove: number; + /** Share of searched moves that looked deeper than one ply. */ + deepSearchShare: number; +} + +export interface PairStanding { + a: AgentId; + b: AgentId; + games: number; + aWins: number; + bWins: number; + draws: number; + /** Win rate of `a` against `b` (draws count as not-wins). */ + aWinRate: ProportionCI; + /** Wins for `a` when `a` played Red, and games as Red. */ + aAsRed: { games: number; wins: number }; + aAsBlue: { games: number; wins: number }; +} + +export interface TournamentSummary { + games: number; + sizes: number[]; + agents: AgentId[]; + standings: AgentStanding[]; + pairs: PairStanding[]; + colour: { + games: number; + redWins: number; + blueWins: number; + draws: number; + redWinRate: ProportionCI; + }; + meanTurns: number; + /** Agent whose Elo is fixed at 0 (random when present). */ + anchor: AgentId | null; + bootstrap: { reps: number; seed: number; prior: number }; +} + +export interface SummariseOptions { + reps?: number; + seed?: number; + /** Virtual drawn games per pairing in the Bradley-Terry fit. */ + prior?: number; + sizes?: number[]; +} + +/** Points to each side of one game: 1 / 0, or 0.5 each for a draw. */ +function points(g: GameRecord): { red: number; blue: number } { + if (g.winner === null) return { red: 0.5, blue: 0.5 }; + return g.winner === "red" ? { red: 1, blue: 0 } : { red: 0, blue: 1 }; +} + +function outcomesFor(records: readonly GameRecord[], index: Map): PairOutcome[] { + return records.map((g) => { + const p = points(g); + return { + i: index.get(g.red.agent)!, + j: index.get(g.blue.agent)!, + scoreI: p.red, + scoreJ: p.blue, + }; + }); +} + +export function summariseTournament( + allRecords: readonly GameRecord[], + { reps = 1000, seed = 4399, prior = 1, sizes }: SummariseOptions = {}, +): TournamentSummary { + const records = sizes ? allRecords.filter((g) => sizes.includes(g.n)) : [...allRecords]; + const agents = canonicalAgents([...new Set(records.flatMap((g) => [g.red.agent, g.blue.agent]))]); + const index = new Map(agents.map((id, i) => [id, i])); + const anchor: AgentId | null = agents.includes("random") ? "random" : null; + const anchorIndex = anchor === null ? undefined : index.get(anchor); + + // Bradley-Terry with a bootstrap stratified by pairing and board size. + const strataMap = new Map(); + for (const g of records) { + const key = `${g.n}|${pairKey(g.red.agent, g.blue.agent)}`; + const list = strataMap.get(key) ?? []; + list.push(g); + strataMap.set(key, list); + } + const strata = [...strataMap.values()]; + const eloOf = (s: readonly (readonly GameRecord[])[]) => + toElo( + fitBradleyTerry(agents.length, outcomesFor(s.flat(), index), { prior }).theta, + anchorIndex, + ); + const bt = + agents.length >= 2 && records.length > 0 + ? stratifiedBootstrapVector(strata, eloOf, { reps, seed }) + : null; + + const standings: AgentStanding[] = agents.map((id, k) => { + const mine = records.filter((g) => g.red.agent === id || g.blue.agent === id); + let wins = 0; + let losses = 0; + let draws = 0; + let forfeits = 0; + let illegalMoves = 0; + let moves = 0; + let nodes = 0; + let searches = 0; + let deep = 0; + const perGameMs: number[] = []; + for (const g of mine) { + // Self-play is never scheduled, so each game has exactly one side for `id`. + const side = g.red.agent === id ? "red" : "blue"; + const s = g[side]; + const w = winningAgent(g); + if (w === null) draws++; + else if (g.winner === side) wins++; + else { + losses++; + if (g.result === "forfeit") forfeits++; + } + illegalMoves += s.illegal; + moves += s.moves; + nodes += s.nodes; + searches += s.searches ?? 0; + deep += s.deepSearches ?? 0; + if (s.moves > 0) perGameMs.push(s.totalMs / s.moves); + } + return { + id, + games: mine.length, + wins, + losses, + draws, + forfeits, + illegalMoves, + moves, + winRate: wilson(wins, mine.length), + elo: bt + ? { estimate: bt.estimate[k], lower: bt.lower[k], upper: bt.upper[k] } + : { estimate: NaN, lower: NaN, upper: NaN }, + moveMs: bootstrapMean(perGameMs, { reps: Math.min(reps, 1000), seed: seed + 1 + k }), + nodesPerMove: moves > 0 ? nodes / moves : 0, + deepSearchShare: searches > 0 ? deep / searches : 0, + }; + }); + standings.sort((x, y) => y.elo.estimate - x.elo.estimate); + + const pairs: PairStanding[] = []; + for (let i = 0; i < agents.length; i++) { + for (let j = i + 1; j < agents.length; j++) { + const a = agents[i]; + const b = agents[j]; + const games = records.filter( + (g) => + (g.red.agent === a && g.blue.agent === b) || (g.red.agent === b && g.blue.agent === a), + ); + if (games.length === 0) continue; + const aWins = games.filter((g) => winningAgent(g) === a).length; + const bWins = games.filter((g) => winningAgent(g) === b).length; + const asRed = games.filter((g) => g.red.agent === a); + const asBlue = games.filter((g) => g.blue.agent === a); + pairs.push({ + a, + b, + games: games.length, + aWins, + bWins, + draws: games.length - aWins - bWins, + aWinRate: wilson(aWins, games.length), + aAsRed: { games: asRed.length, wins: asRed.filter((g) => g.winner === "red").length }, + aAsBlue: { games: asBlue.length, wins: asBlue.filter((g) => g.winner === "blue").length }, + }); + } + } + + const redWins = records.filter((g) => g.winner === "red").length; + const blueWins = records.filter((g) => g.winner === "blue").length; + return { + games: records.length, + sizes: [...new Set(records.map((g) => g.n))].sort((a, b) => a - b), + agents, + standings, + pairs, + colour: { + games: records.length, + redWins, + blueWins, + draws: records.length - redWins - blueWins, + redWinRate: wilson(redWins, records.length), + }, + meanTurns: records.length ? records.reduce((s, g) => s + g.turns, 0) / records.length : 0, + anchor, + bootstrap: { reps, seed, prior }, + }; +} + +/** One row per game, for CSV export. */ +export function gamesCsv(records: readonly GameRecord[]): string { + const rows = records.map((g) => ({ + game_id: g.id, + board_n: g.n, + seed: g.seed, + round: g.round, + red_agent: g.red.agent, + blue_agent: g.blue.agent, + result: g.result, + winner_colour: g.winner ?? "", + winner_agent: winningAgent(g) ?? "", + draw_reason: g.drawReason ?? "", + turns: g.turns, + red_moves: g.red.moves, + red_total_ms: Number(g.red.totalMs.toFixed(3)), + red_nodes: g.red.nodes, + red_illegal: g.red.illegal, + blue_moves: g.blue.moves, + blue_total_ms: Number(g.blue.totalMs.toFixed(3)), + blue_nodes: g.blue.nodes, + blue_illegal: g.blue.illegal, + })); + return toCsv(rows); +} + +/** Leaderboard and pairwise rows, for CSV export. */ +export function summaryCsv(summary: TournamentSummary): string { + const r = (x: number, d = 4) => (Number.isFinite(x) ? Number(x.toFixed(d)) : null); + const rows: Record[] = []; + for (const s of summary.standings) { + rows.push({ + table: "standing", + agent: s.id, + opponent: "", + games: s.games, + wins: s.wins, + losses: s.losses, + draws: s.draws, + win_rate: r(s.winRate.p), + win_rate_lo95: r(s.winRate.lower), + win_rate_hi95: r(s.winRate.upper), + elo: r(s.elo.estimate, 1), + elo_lo95: r(s.elo.lower, 1), + elo_hi95: r(s.elo.upper, 1), + illegal_moves: s.illegalMoves, + mean_move_ms: r(s.moveMs.estimate, 3), + }); + } + for (const p of summary.pairs) { + rows.push({ + table: "pairing", + agent: p.a, + opponent: p.b, + games: p.games, + wins: p.aWins, + losses: p.bWins, + draws: p.draws, + win_rate: r(p.aWinRate.p), + win_rate_lo95: r(p.aWinRate.lower), + win_rate_hi95: r(p.aWinRate.upper), + elo: null, + elo_lo95: null, + elo_hi95: null, + illegal_moves: null, + mean_move_ms: null, + }); + } + return toCsv(rows); +} + +export const agentLabel = (id: AgentId) => AGENTS[id].label; diff --git a/web/src/lib/tournament/crosscheck.ts b/web/src/lib/tournament/crosscheck.ts new file mode 100644 index 0000000..95fe9f7 --- /dev/null +++ b/web/src/lib/tournament/crosscheck.ts @@ -0,0 +1,67 @@ +/** + * Compare the TypeScript reference tournament with the original-Python + * cross-check (scripts/crosscheck_tournament.py) on the pairings and board + * sizes both ran. RNG streams differ between the two, so games differ; the + * question is whether the win rates agree within sampling error. + */ +import { + type DifferenceCI, + type ProportionCI, + newcombeDifference, + wilson, +} from "@/lib/stats/proportion"; +import type { AgentId } from "./agents"; +import { type GameRecord, winningAgent } from "./play"; +import { canonicalAgents } from "./schedule"; + +export interface PythonGame { + n: number; + red: AgentId; + blue: AgentId; + seed: number; + winner: "red" | "blue" | null; + turns: number; +} + +export interface CrosscheckRow { + a: AgentId; + b: AgentId; + sizes: number[]; + python: ProportionCI; + typescript: ProportionCI; + /** Python − TypeScript win rate of `a`, Newcombe 95% interval. */ + difference: DifferenceCI; +} + +const winnerOf = (g: PythonGame): AgentId | null => (g.winner === null ? null : g[g.winner]); + +export function compareImplementations( + ts: readonly GameRecord[], + py: readonly PythonGame[], +): CrosscheckRow[] { + const sizes = [...new Set(py.map((g) => g.n))].sort((x, y) => x - y); + const agents = canonicalAgents([...new Set(py.flatMap((g) => [g.red, g.blue]))]); + const rows: CrosscheckRow[] = []; + for (let i = 0; i < agents.length; i++) { + for (let j = i + 1; j < agents.length; j++) { + const a = agents[i]; + const b = agents[j]; + const isPair = (red: AgentId, blue: AgentId) => + (red === a && blue === b) || (red === b && blue === a); + const pyGames = py.filter((g) => sizes.includes(g.n) && isPair(g.red, g.blue)); + const tsGames = ts.filter((g) => sizes.includes(g.n) && isPair(g.red.agent, g.blue.agent)); + if (!pyGames.length || !tsGames.length) continue; + const pyWins = pyGames.filter((g) => winnerOf(g) === a).length; + const tsWins = tsGames.filter((g) => winningAgent(g) === a).length; + rows.push({ + a, + b, + sizes, + python: wilson(pyWins, pyGames.length), + typescript: wilson(tsWins, tsGames.length), + difference: newcombeDifference(pyWins, pyGames.length, tsWins, tsGames.length), + }); + } + } + return rows; +} diff --git a/web/src/lib/tournament/play.ts b/web/src/lib/tournament/play.ts new file mode 100644 index 0000000..4b6acb6 --- /dev/null +++ b/web/src/lib/tournament/play.ts @@ -0,0 +1,146 @@ +/** + * Plays one tournament game under the ported referee rules. The referee + * validates every action; an exception or an illegal action counts as an + * illegal move and forfeits the game to the opponent. + */ +import { Game } from "@/lib/cachex/game"; +import { type Action, type Colour, opponent } from "@/lib/cachex/types"; +import { createRng, deriveSeed } from "@/lib/rng"; +import { type AgentId, tournamentMove } from "./agents"; +import type { GameSpec } from "./schedule"; + +export interface SideStats { + agent: AgentId; + moves: number; + /** Total wall-clock time spent choosing moves, in ms. */ + totalMs: number; + maxMs: number; + /** Search nodes visited across the game (0 for random / book moves). */ + nodes: number; + /** Moves chosen by a minimax search (not the book, an instant win or random). */ + searches: number; + /** Of those, searches deeper than one ply. */ + deepSearches: number; + illegal: number; +} + +export interface GameRecord { + id: string; + n: number; + seed: number; + round: number; + result: "win" | "draw" | "forfeit"; + winner: Colour | null; + drawReason: "repetition" | "max-turns" | null; + turns: number; + red: SideStats; + blue: SideStats; +} + +export type MoveFn = ( + id: AgentId, + n: number, + history: readonly Action[], + colour: Colour, + seed: number, +) => Action | { action: Action; nodes?: number; depth?: number | null }; + +const defaultMove: MoveFn = (id, n, history, colour, seed) => { + const decision = tournamentMove(id, n, history, colour, createRng(seed)); + const e = decision.explanation; + return { + action: decision.action, + nodes: e.kind === "search" ? e.nodes : 0, + depth: e.kind === "search" ? e.depth : null, + }; +}; + +export function playTournamentGame( + spec: GameSpec, + { move = defaultMove, now = () => performance.now() }: { move?: MoveFn; now?: () => number } = {}, +): GameRecord { + const game = new Game(spec.n); + const history: Action[] = []; + const side = (agent: AgentId): SideStats => ({ + agent, + moves: 0, + totalMs: 0, + maxMs: 0, + nodes: 0, + searches: 0, + deepSearches: 0, + illegal: 0, + }); + const stats: Record = { red: side(spec.red), blue: side(spec.blue) }; + + while (!game.over()) { + const colour = game.turnPlayer(); + const s = stats[colour]; + const started = now(); + let action: Action | null = null; + try { + const out = move(s.agent, spec.n, history, colour, deriveSeed(spec.seed, history.length)); + if (Array.isArray(out)) action = out as Action; + else { + const result = out as { action: Action; nodes?: number; depth?: number | null }; + action = result.action; + s.nodes += result.nodes ?? 0; + if (typeof result.depth === "number") { + s.searches += 1; + if (result.depth > 1) s.deepSearches += 1; + } + } + } catch { + action = null; + } + const elapsed = now() - started; + s.moves += 1; + s.totalMs += elapsed; + s.maxMs = Math.max(s.maxMs, elapsed); + + if (action === null || !game.isLegal(action)) { + s.illegal += 1; + return finish(spec, game, stats, { result: "forfeit", winner: opponent(colour) }); + } + game.update(colour, action); + history.push(action); + } + + const r = game.result!; + return finish( + spec, + game, + stats, + r.kind === "win" + ? { result: "win", winner: r.winner } + : { result: "draw", winner: null, drawReason: r.reason }, + ); +} + +function finish( + spec: GameSpec, + game: Game, + stats: Record, + outcome: { + result: GameRecord["result"]; + winner: Colour | null; + drawReason?: GameRecord["drawReason"]; + }, +): GameRecord { + return { + id: spec.id, + n: spec.n, + seed: spec.seed, + round: spec.round, + result: outcome.result, + winner: outcome.winner, + drawReason: outcome.drawReason ?? null, + turns: game.nturns, + red: stats.red, + blue: stats.blue, + }; +} + +/** The agent that won, or null for a draw. */ +export const winningAgent = (g: GameRecord): AgentId | null => + g.winner === null ? null : g[g.winner].agent; diff --git a/web/src/lib/tournament/schedule.ts b/web/src/lib/tournament/schedule.ts new file mode 100644 index 0000000..4355dc5 --- /dev/null +++ b/web/src/lib/tournament/schedule.ts @@ -0,0 +1,64 @@ +/** + * Round-robin schedule. Every pairing plays `rounds` colour-swapped pairs of + * games on every board size: in each round the same seed is used twice, once + * with each agent as Red, so first-move advantage cancels within a pairing. + */ +import { deriveSeed } from "@/lib/rng"; +import { AGENT_IDS, type AgentId } from "./agents"; + +export interface TournamentConfig { + agents: AgentId[]; + sizes: number[]; + /** Colour-swapped game pairs per pairing per board size (games = 2 × rounds). */ + rounds: number; + seed: number; +} + +export interface GameSpec { + id: string; + n: number; + red: AgentId; + blue: AgentId; + /** Shared by both games of a colour-swapped pair. */ + seed: number; + round: number; +} + +/** Agents in canonical order, without duplicates. */ +export const canonicalAgents = (agents: readonly AgentId[]) => + AGENT_IDS.filter((id) => agents.includes(id)); + +export function pairKey(a: AgentId, b: AgentId): string { + const [x, y] = canonicalAgents([a, b]); + return `${x}|${y}`; +} + +export function buildSchedule(config: TournamentConfig): GameSpec[] { + const agents = canonicalAgents(config.agents); + if (agents.length < 2) throw new RangeError("a round robin needs at least two agents"); + if (!Number.isInteger(config.rounds) || config.rounds < 1) { + throw new RangeError("rounds must be a positive integer"); + } + const sizes = [...new Set(config.sizes)].sort((a, b) => a - b); + const games: GameSpec[] = []; + for (const n of sizes) { + for (let i = 0; i < agents.length; i++) { + for (let j = i + 1; j < agents.length; j++) { + const a = agents[i]; + const b = agents[j]; + for (let round = 0; round < config.rounds; round++) { + const seed = deriveSeed( + config.seed, + n, + AGENT_IDS.indexOf(a), + AGENT_IDS.indexOf(b), + round, + ); + games.push({ id: `${n}:${a}:${b}:${round}:a`, n, red: a, blue: b, seed, round }); + games.push({ id: `${n}:${a}:${b}:${round}:b`, n, red: b, blue: a, seed, round }); + } + } + } + } + return games; +} diff --git a/web/src/lib/tournament/tournament.test.ts b/web/src/lib/tournament/tournament.test.ts new file mode 100644 index 0000000..7ee98d6 --- /dev/null +++ b/web/src/lib/tournament/tournament.test.ts @@ -0,0 +1,289 @@ +import { describe, expect, it } from "vitest"; + +import { AgentBoard } from "@/lib/agent/agent-board"; +import { chooseAgentAction } from "@/lib/agent/player"; +import { runAgent } from "@/lib/agent/run-agent"; +import { place } from "@/lib/cachex/types"; +import { csvCell, toCsv } from "@/lib/csv"; +import { AGENT_IDS, AGENTS, tournamentMove } from "./agents"; +import { gamesCsv, summariseTournament, summaryCsv } from "./analyse"; +import { type GameRecord, playTournamentGame } from "./play"; +import { buildSchedule, pairKey } from "./schedule"; +import { createRng } from "@/lib/rng"; + +describe("round-robin schedule", () => { + const config = { + agents: ["random", "greedy", "minimax-dynamic"] as const, + sizes: [5, 4, 4], + rounds: 3, + seed: 11, + }; + const games = buildSchedule({ ...config, agents: [...config.agents] }); + + it("plays every pairing on every size, colour-swapped", () => { + // 3 pairings × 2 sizes × 3 rounds × 2 colours + expect(games).toHaveLength(36); + const byPair = new Map(); + for (const g of games) { + const key = `${g.n}|${pairKey(g.red, g.blue)}`; + byPair.set(key, [...(byPair.get(key) ?? []), g]); + } + expect(byPair.size).toBe(6); + for (const list of byPair.values()) { + expect(list).toHaveLength(6); + const [a, b] = pairKey(list[0].red, list[0].blue).split("|"); + expect(list.filter((g) => g.red === a)).toHaveLength(3); + expect(list.filter((g) => g.red === b)).toHaveLength(3); + } + }); + + it("shares one seed between the two games of a colour-swapped pair", () => { + for (let i = 0; i < games.length; i += 2) { + expect(games[i].seed).toBe(games[i + 1].seed); + expect(games[i].red).toBe(games[i + 1].blue); + } + expect(new Set(games.map((g) => g.seed)).size).toBe(games.length / 2); + expect(new Set(games.map((g) => g.id)).size).toBe(games.length); + }); + + it("is deterministic and rejects degenerate configs", () => { + expect(buildSchedule({ ...config, agents: [...config.agents] })).toEqual(games); + expect(() => buildSchedule({ ...config, agents: ["random"] })).toThrow(RangeError); + expect(() => buildSchedule({ ...config, agents: [...config.agents], rounds: 0 })).toThrow( + RangeError, + ); + }); +}); + +describe("agents", () => { + it("are the original with one knob changed", () => { + const n = 6; + const history = [place(1, 1), place(4, 2), place(2, 3)] as const; + // The original, unpatched, is exactly what /play and /spectate run. + const original = tournamentMove("minimax-dynamic", n, history, "blue", createRng(3)); + const viaPlayPage = runAgent({ + id: 1, + kind: "minimax", + n, + history: [...history], + colour: "blue", + seed: 3, + }); + if (!viaPlayPage.ok) throw new Error(viaPlayPage.error); + expect(original).toEqual(viaPlayPage.decision); + if (original.explanation.kind !== "search") throw new Error("expected a search"); + expect(original.explanation.depth).toBe(1); + + const d3 = tournamentMove("minimax-d3", n, history, "blue", createRng(3)); + if (d3.explanation.kind !== "search") throw new Error("expected a search"); + expect(d3.explanation.depth).toBe(3); + + // Greedy skips the opening book. + const greedyOpening = tournamentMove("greedy", n, [], "red", createRng(1)); + expect(greedyOpening.explanation.kind).toBe("search"); + const bookOpening = tournamentMove("minimax-d2", n, [], "red", createRng(1)); + expect(bookOpening.explanation.kind).toBe("opening"); + expect(tournamentMove("random", n, [], "red", createRng(1)).explanation.kind).toBe("random"); + expect(AGENT_IDS.every((id) => AGENTS[id].id === id)).toBe(true); + }); + + it("fixed depth 1 never looks past one ply", () => { + const board = AgentBoard.fromActions(5, [place(1, 1), place(3, 3), place(2, 2)]); + const d = chooseAgentAction(5, [place(1, 1), place(3, 3), place(2, 2)], "blue", { + fixedDepth: 1, + }); + if (d.explanation.kind !== "search") throw new Error("expected a search"); + expect(d.explanation.depth).toBe(1); + // depth 1 visits the root plus one node per legal move + expect(d.explanation.nodes).toBe(1 + board.emptyCount()); + }); +}); + +describe("playing a game", () => { + const spec = { + id: "t", + n: 4, + red: "minimax-dynamic", + blue: "random", + seed: 99, + round: 0, + } as const; + + it("is reproducible from its seed", () => { + let t = 0; + const now = () => (t += 1); + const a = playTournamentGame({ ...spec }, { now }); + t = 0; + const b = playTournamentGame({ ...spec }, { now }); + expect(a).toEqual(b); + expect(a.result === "win" || a.result === "draw").toBe(true); + expect(a.red.moves + a.blue.moves).toBe(a.turns); + expect(a.red.illegal + a.blue.illegal).toBe(0); + }); + + it("forfeits the game on an illegal move or an exception", () => { + const illegal = playTournamentGame( + { ...spec }, + { + move: (id, n, history, colour) => + colour === "blue" + ? place(9, 9) + : tournamentMove(id, n, history, colour, createRng(1)).action, + }, + ); + expect(illegal).toMatchObject({ result: "forfeit", winner: "red", turns: 1 }); + expect(illegal.blue.illegal).toBe(1); + + const crash = playTournamentGame( + { ...spec }, + { + move: () => { + throw new Error("boom"); + }, + }, + ); + expect(crash).toMatchObject({ result: "forfeit", winner: "blue", turns: 0 }); + expect(crash.red.illegal).toBe(1); + }); +}); + +function record( + red: GameRecord["red"]["agent"], + blue: GameRecord["blue"]["agent"], + winner: "red" | "blue" | null, + n = 4, + i = 0, +): GameRecord { + const side = (agent: GameRecord["red"]["agent"]) => ({ + agent, + moves: 5, + totalMs: 10, + maxMs: 3, + nodes: 20, + searches: 4, + deepSearches: 1, + illegal: 0, + }); + return { + id: `${red}-${blue}-${i}`, + n, + seed: i, + round: i, + result: winner === null ? "draw" : "win", + winner, + drawReason: winner === null ? "repetition" : null, + turns: 10, + red: side(red), + blue: side(blue), + }; +} + +describe("tournament summary", () => { + // Original beats random 9-1, greedy beats random 7-3, original vs greedy 6-4. + const games: GameRecord[] = []; + const add = ( + a: GameRecord["red"]["agent"], + b: GameRecord["red"]["agent"], + aWins: number, + bWins: number, + ) => { + for (let k = 0; k < aWins; k++) + games.push(record(k % 2 ? a : b, k % 2 ? b : a, k % 2 ? "red" : "blue", 4, games.length)); + for (let k = 0; k < bWins; k++) + games.push(record(k % 2 ? a : b, k % 2 ? b : a, k % 2 ? "blue" : "red", 4, games.length)); + }; + add("minimax-dynamic", "random", 9, 1); + add("greedy", "random", 7, 3); + add("minimax-dynamic", "greedy", 6, 4); + games.push(record("greedy", "random", null, 5, games.length)); + const summary = summariseTournament(games, { reps: 200, seed: 1 }); + + it("counts wins, losses and draws per agent with Wilson intervals", () => { + const original = summary.standings.find((s) => s.id === "minimax-dynamic")!; + expect(original).toMatchObject({ games: 20, wins: 15, losses: 5, draws: 0 }); + expect(original.winRate.p).toBe(0.75); + const greedy = summary.standings.find((s) => s.id === "greedy")!; + expect(greedy).toMatchObject({ games: 21, wins: 11, losses: 9, draws: 1 }); + expect(summary.games).toBe(31); + expect(summary.sizes).toEqual([4, 5]); + }); + + it("anchors Elo at the random agent and orders the leaderboard by strength", () => { + expect(summary.anchor).toBe("random"); + expect(summary.standings.map((s) => s.id)).toEqual(["minimax-dynamic", "greedy", "random"]); + const random = summary.standings.find((s) => s.id === "random")!; + expect(random.elo.estimate).toBe(0); + for (const s of summary.standings) { + expect(s.elo.lower).toBeLessThanOrEqual(s.elo.estimate + 1e-9); + expect(s.elo.upper).toBeGreaterThanOrEqual(s.elo.estimate - 1e-9); + } + }); + + it("reports pairings and the colour effect", () => { + const p = summary.pairs.find((x) => x.a === "minimax-dynamic" && x.b === "random")!; + expect(p).toMatchObject({ games: 10, aWins: 9, bWins: 1, draws: 0 }); + expect(p.aAsRed.games + p.aAsBlue.games).toBe(10); + expect(summary.colour.redWins + summary.colour.blueWins + summary.colour.draws).toBe(31); + }); + + it("filters by board size and is reproducible", () => { + const only5 = summariseTournament(games, { reps: 50, seed: 1, sizes: [5] }); + expect(only5.games).toBe(1); + expect(summariseTournament(games, { reps: 200, seed: 1 })).toEqual(summary); + }); + + it("exports CSV", () => { + const csv = gamesCsv(games); + expect(csv.split("\r\n")[0]).toContain("game_id,board_n,seed"); + expect(csv.trim().split("\r\n")).toHaveLength(games.length + 1); + const s = summaryCsv(summary); + expect(s).toContain("standing,minimax-dynamic"); + expect(s).toContain("pairing,minimax-dynamic,random,10,9,1,0,0.9"); + }); +}); + +describe("CSV writer", () => { + it("quotes, escapes and neutralises formulas", () => { + expect(csvCell('say "hi", ok')).toBe('"say ""hi"", ok"'); + expect(csvCell("=HYPERLINK(1)")).toBe("'=HYPERLINK(1)"); + expect(csvCell(-3)).toBe("-3"); + expect(csvCell(null)).toBe(""); + expect(csvCell(NaN)).toBe(""); + expect(toCsv([{ a: 1, b: "x\ny" }])).toBe('a,b\r\n1,"x\ny"\r\n'); + expect(toCsv([])).toBe("\r\n"); + }); +}); + +describe("Python cross-check comparison", () => { + it("compares win rates per pairing on the shared sizes", async () => { + const { compareImplementations } = await import("./crosscheck"); + const ts: GameRecord[] = [ + record("minimax-dynamic", "random", "red", 4, 1), + record("random", "minimax-dynamic", "blue", 4, 2), + record("minimax-dynamic", "random", "blue", 6, 3), // size not in the Python run + ]; + const py = [ + { + n: 4, + red: "minimax-dynamic" as const, + blue: "random" as const, + seed: 1, + winner: "red" as const, + turns: 9, + }, + { + n: 4, + red: "random" as const, + blue: "minimax-dynamic" as const, + seed: 1, + winner: "red" as const, + turns: 9, + }, + ]; + const [row] = compareImplementations(ts, py); + expect(row).toMatchObject({ a: "minimax-dynamic", b: "random", sizes: [4] }); + expect(row.python.p).toBe(0.5); + expect(row.typescript.p).toBe(1); + expect(row.difference.estimate).toBe(-0.5); + }); +}); diff --git a/web/src/workers/astar-benchmark.worker.ts b/web/src/workers/astar-benchmark.worker.ts index 5f5dea9..09b38a5 100644 --- a/web/src/workers/astar-benchmark.worker.ts +++ b/web/src/workers/astar-benchmark.worker.ts @@ -1,16 +1,17 @@ /** - * Runs the Manhattan vs Euclidean heuristic study off the main thread. + * Runs the paired Manhattan vs Euclidean heuristic study off the main thread. */ -import { type BenchmarkRow, runHeuristicBenchmark } from "@/lib/astar/random-board"; +import { type PairedStudyRow, runPairedStudy } from "@/lib/analysis/astar-paired"; export interface BenchmarkRequest { id: number; dimensions: number[]; + boardsPerDimension: number; seed: number; } export type BenchmarkResponse = - | { id: number; ok: true; rows: BenchmarkRow[]; elapsedMs: number } + | { id: number; ok: true; rows: PairedStudyRow[]; elapsedMs: number } | { id: number; ok: false; error: string }; const ctx = self as unknown as { @@ -24,7 +25,7 @@ const ctx = self as unknown as { ctx.addEventListener("message", ({ data }) => { const started = performance.now(); try { - const rows = runHeuristicBenchmark(data.dimensions, data.seed); + const rows = runPairedStudy(data); ctx.postMessage({ id: data.id, ok: true, rows, elapsedMs: performance.now() - started }); } catch (err) { ctx.postMessage({ diff --git a/web/src/workers/tournament.worker.ts b/web/src/workers/tournament.worker.ts new file mode 100644 index 0000000..9069e7a --- /dev/null +++ b/web/src/workers/tournament.worker.ts @@ -0,0 +1,34 @@ +/** + * Plays tournament games off the main thread. The pool in + * use-tournament-pool.ts runs several of these in parallel. + */ +import { type GameRecord, playTournamentGame } from "@/lib/tournament/play"; +import type { GameSpec } from "@/lib/tournament/schedule"; + +export interface TournamentJob { + id: number; + spec: GameSpec; +} + +export type TournamentJobResult = + { id: number; ok: true; record: GameRecord } | { id: number; ok: false; error: string }; + +const ctx = self as unknown as { + postMessage: (message: TournamentJobResult) => void; + addEventListener: ( + type: "message", + listener: (event: MessageEvent) => void, + ) => void; +}; + +ctx.addEventListener("message", ({ data }) => { + try { + ctx.postMessage({ id: data.id, ok: true, record: playTournamentGame(data.spec) }); + } catch (err) { + ctx.postMessage({ + id: data.id, + ok: false, + error: err instanceof Error ? err.message : String(err), + }); + } +}); From dac6fa13e08fffda3371467048558a5d07c4cd9c Mon Sep 17 00:00:00 2001 From: rNLKJA <62606765+rNLKJA@users.noreply.github.com> Date: Tue, 6 Oct 2026 00:59:11 +1030 Subject: [PATCH 03/18] feat(ai): add bring-your-own-key commentator, LLM arena and audit log - AI settings dialog: Anthropic (default, Claude Haiku 4.5 or Sonnet 5.5) or OpenAI (editable model id). The visitor's key is kept in sessionStorage by default, localStorage only on opt-in, with a forget button. Calls go straight from the browser to the provider; the key never reaches this site, the audit log or the repository. - Provider adapters in lib/ai (official Anthropic SDK with browser access, OpenAI Chat Completions with strict JSON schema), zod validation and friendly errors (invalid key, rate limit, overload, network/CORS, refusal, truncation). - Move commentator grounded in the agent's own evaluation breakdown, with an automatic grounding check and accept / edit / reject review. - LLM Arena: the model plays the minimax agent with JSON moves checked against the legal moves (retry, then forfeit), compared on identical seeds with random and greedy baselines; Wilson CIs, illegal-answer rate, latency and tokens, CSV export. - Every call is audit-logged in IndexedDB and viewable at /ai-log with JSON and CSV export. All output is labelled AI-generated. - Tests mock fetch for both providers and assert the key never appears in log entries or exports. Co-Authored-By: Claude Opus 5.5 --- web/src/app/ai-log/page.tsx | 35 ++ web/src/app/layout.tsx | 13 +- web/src/app/llm-arena/page.tsx | 41 ++ web/src/components/ai/ai-badge.tsx | 19 + web/src/components/ai/ai-log-client.tsx | 228 ++++++++ web/src/components/ai/ai-provider.tsx | 147 +++++ web/src/components/ai/ai-settings-button.tsx | 29 + web/src/components/ai/ai-settings-dialog.tsx | 221 +++++++ web/src/components/ai/commentator-panel.tsx | 252 ++++++++ web/src/components/ai/llm-arena-client.tsx | 493 ++++++++++++++++ web/src/components/layout/site-header.tsx | 23 +- web/src/components/play/explain-panel.tsx | 17 +- web/src/components/play/play-client.tsx | 1 + web/src/components/play/spectate-client.tsx | 1 + web/src/components/ui/dialog.tsx | 95 +++ web/src/lib/ai/ai.test.ts | 575 +++++++++++++++++++ web/src/lib/ai/anthropic.ts | 84 +++ web/src/lib/ai/audit-log.ts | 211 +++++++ web/src/lib/ai/client.ts | 90 +++ web/src/lib/ai/commentator.ts | 258 +++++++++ web/src/lib/ai/llm-player.ts | 340 +++++++++++ web/src/lib/ai/models.ts | 23 + web/src/lib/ai/openai.ts | 128 +++++ web/src/lib/ai/settings.ts | 106 ++++ web/src/lib/ai/types.ts | 100 ++++ 25 files changed, 3522 insertions(+), 8 deletions(-) create mode 100644 web/src/app/ai-log/page.tsx create mode 100644 web/src/app/llm-arena/page.tsx create mode 100644 web/src/components/ai/ai-badge.tsx create mode 100644 web/src/components/ai/ai-log-client.tsx create mode 100644 web/src/components/ai/ai-provider.tsx create mode 100644 web/src/components/ai/ai-settings-button.tsx create mode 100644 web/src/components/ai/ai-settings-dialog.tsx create mode 100644 web/src/components/ai/commentator-panel.tsx create mode 100644 web/src/components/ai/llm-arena-client.tsx create mode 100644 web/src/components/ui/dialog.tsx create mode 100644 web/src/lib/ai/ai.test.ts create mode 100644 web/src/lib/ai/anthropic.ts create mode 100644 web/src/lib/ai/audit-log.ts create mode 100644 web/src/lib/ai/client.ts create mode 100644 web/src/lib/ai/commentator.ts create mode 100644 web/src/lib/ai/llm-player.ts create mode 100644 web/src/lib/ai/models.ts create mode 100644 web/src/lib/ai/openai.ts create mode 100644 web/src/lib/ai/settings.ts create mode 100644 web/src/lib/ai/types.ts diff --git a/web/src/app/ai-log/page.tsx b/web/src/app/ai-log/page.tsx new file mode 100644 index 0000000..ddb608b --- /dev/null +++ b/web/src/app/ai-log/page.tsx @@ -0,0 +1,35 @@ +import type { Metadata } from "next"; +import Link from "next/link"; + +import { AiLogClient } from "@/components/ai/ai-log-client"; +import { PageHeader } from "@/components/layout/page-header"; + +export const metadata: Metadata = { + title: "AI audit log", + description: + "Every AI call made from this browser: feature, provider, model, exact input, output, latency, tokens and your review decision. Exportable as JSON or CSV. API keys are never recorded.", +}; + +export default function AiLogPage() { + return ( +
    + +

    + Every call the optional AI features make is recorded here: what was sent, what came back, + which provider and model, how long it took, the tokens the provider reported, and your + decision on the output (accepted, edited or rejected; automated evaluation calls are + marked n/a). +

    +

    + The log lives only in this browser (IndexedDB). This static site has no server, so nothing + here is sent to us. Your API key is never written to the log.{" "} + + AI use statement + + . +

    +
    + +
    + ); +} diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx index 0648690..803c404 100644 --- a/web/src/app/layout.tsx +++ b/web/src/app/layout.tsx @@ -1,6 +1,7 @@ import type { Metadata, Viewport } from "next"; import { Bricolage_Grotesque, Geist, Geist_Mono } from "next/font/google"; +import { AiProvider } from "@/components/ai/ai-provider"; import { SiteFooter } from "@/components/layout/site-footer"; import { SiteHeader } from "@/components/layout/site-header"; import { ThemeProvider } from "@/components/layout/theme-provider"; @@ -62,11 +63,13 @@ export default function RootLayout({ children }: { children: React.ReactNode }) enableSystem disableTransitionOnChange > - -
    - {children} -
    - + + +
    + {children} +
    + +
    diff --git a/web/src/app/llm-arena/page.tsx b/web/src/app/llm-arena/page.tsx new file mode 100644 index 0000000..f4ecd88 --- /dev/null +++ b/web/src/app/llm-arena/page.tsx @@ -0,0 +1,41 @@ +import type { Metadata } from "next"; +import Link from "next/link"; + +import { LlmArenaClient } from "@/components/ai/llm-arena-client"; +import { PageHeader } from "@/components/layout/page-header"; + +export const metadata: Metadata = { + title: "LLM Arena", + description: + "An evaluation harness: a language model (your own API key) plays short games of Cachex against the original minimax agent, with legal-move validation, Wilson intervals and a full audit log.", +}; + +export default function LlmArenaPage() { + return ( +
    +
    + +

    + The model plays short games against the original minimax agent. Each turn it gets the + rules, the board, the move history and the full list of legal moves, and must answer + with a JSON move. The referee checks every answer: an illegal or malformed one is + counted and the model is asked again (up to three times) before it forfeits. +

    +

    + The same seeds and colours are replayed with the random and greedy agents in the + model's seat, so the comparison is like for like. This page is an evaluation + harness, not a claim: a few games give wide intervals.{" "} + + What is sent to the provider + + . +

    +
    + +
    +
    + ); +} diff --git a/web/src/components/ai/ai-badge.tsx b/web/src/components/ai/ai-badge.tsx new file mode 100644 index 0000000..be07f93 --- /dev/null +++ b/web/src/components/ai/ai-badge.tsx @@ -0,0 +1,19 @@ +import { Sparkles } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +/** Visible label on every piece of model output. */ +export function AiBadge({ model, className }: { model?: string; className?: string }) { + return ( + + + AI-generated + {model && · {model}} + + ); +} diff --git a/web/src/components/ai/ai-log-client.tsx b/web/src/components/ai/ai-log-client.tsx new file mode 100644 index 0000000..8529aa3 --- /dev/null +++ b/web/src/components/ai/ai-log-client.tsx @@ -0,0 +1,228 @@ +"use client"; + +import { Download, RefreshCw, Trash2 } from "lucide-react"; +import { useCallback, useEffect, useMemo, useState } from "react"; + +import { Segmented } from "@/components/play/primitives"; +import { Button } from "@/components/ui/button"; +import { + type AuditEntry, + DECISION_LABEL, + auditToCsv, + auditToJson, + onAuditChange, +} from "@/lib/ai/audit-log"; +import { FEATURE_LABEL, PROVIDER_LABEL } from "@/lib/ai/types"; +import { downloadText } from "@/lib/download"; +import { cn } from "@/lib/utils"; +import { AiBadge } from "./ai-badge"; +import { useAi } from "./ai-provider"; + +type Filter = "all" | "commentator" | "llm-player"; + +export function AiLogClient() { + const { audit } = useAi(); + const [entries, setEntries] = useState(null); + const [error, setError] = useState(null); + const [filter, setFilter] = useState("all"); + const [confirmClear, setConfirmClear] = useState(false); + + const refresh = useCallback(() => { + audit + .list() + .then((list) => { + setEntries(list); + setError(null); + }) + .catch((err: unknown) => setError(err instanceof Error ? err.message : String(err))); + }, [audit]); + + useEffect(() => { + // Subscribe first, then load: both callbacks set state asynchronously. + const unsubscribe = onAuditChange(refresh); + const timer = setTimeout(refresh, 0); + return () => { + unsubscribe(); + clearTimeout(timer); + }; + }, [refresh]); + + const shown = useMemo( + () => (entries ?? []).filter((e) => filter === "all" || e.feature === filter), + [entries, filter], + ); + + const stats = useMemo(() => { + const list = entries ?? []; + const reviewed = list.filter((e) => + ["accepted", "edited", "rejected"].includes(e.humanDecision), + ); + return { + calls: list.length, + errors: list.filter((e) => e.error).length, + reviewed: reviewed.length, + accepted: reviewed.filter((e) => e.humanDecision === "accepted").length, + edited: reviewed.filter((e) => e.humanDecision === "edited").length, + rejected: reviewed.filter((e) => e.humanDecision === "rejected").length, + }; + }, [entries]); + + const stamp = new Date().toISOString().slice(0, 10); + + return ( +
    +
    +
    + +
    +
    + + + + {confirmClear ? ( + <> + + + + ) : ( + + )} +
    +
    + +
    + + + + +
    + + {error && ( +

    + Could not read the log: {error} +

    + )} + {entries === null && !error &&

    Loading…

    } + {entries !== null && shown.length === 0 && ( +
    + No AI calls recorded in this browser yet. Use the commentator on /play or /spectate, or + run the LLM Arena, with your own key. +
    + )} + +
      + {shown.map((e) => ( +
    1. +
      + {FEATURE_LABEL[e.feature]} + + {new Date(e.timestamp).toLocaleString("en-AU")} + + + {PROVIDER_LABEL[e.provider]} · {e.model} + + + {Math.round(e.latencyMs).toLocaleString("en-AU")} ms + {e.usage ? ` · ${e.usage.inputTokens} in / ${e.usage.outputTokens} out tokens` : ""} + + + {DECISION_LABEL[e.humanDecision]} + +
      + {e.error ? ( +

      + Error ({e.error.kind}): {e.error.message} +

      + ) : ( +
      + +
      +                  {JSON.stringify(e.output, null, 2)}
      +                
      +
      + )} + {e.editedOutput !== undefined && ( +
      +

      Human-edited version

      +

      {e.editedOutput}

      +
      + )} +
      + + Exact input sent (system prompt, user prompt, schema) + +
      +                {`SYSTEM\n${e.input.system}\n\nUSER\n${e.input.user}\n\nSCHEMA ${e.input.schema}`}
      +                {e.context ? `\n\nCONTEXT ${JSON.stringify(e.context)}` : ""}
      +              
      +
      +
    2. + ))} +
    +
    + ); +} + +function Stat({ label, value }: { label: string; value: string | number }) { + return ( +
    +
    {label}
    +
    {value}
    +
    + ); +} diff --git a/web/src/components/ai/ai-provider.tsx b/web/src/components/ai/ai-provider.tsx new file mode 100644 index 0000000..f6d492e --- /dev/null +++ b/web/src/components/ai/ai-provider.tsx @@ -0,0 +1,147 @@ +"use client"; + +import { + type ReactNode, + createContext, + useCallback, + useContext, + useMemo, + useState, + useSyncExternalStore, +} from "react"; + +import { type AuditStore, getAuditStore } from "@/lib/ai/audit-log"; +import { + type AiPrefs, + DEFAULT_PREFS, + type StoredKey, + forgetKey, + loadKey, + loadPrefs, + saveKey, + savePrefs, +} from "@/lib/ai/settings"; +import type { Credentials } from "@/lib/ai/types"; +import { AiSettingsDialog } from "./ai-settings-dialog"; + +/* + * Browser storage as an external store, so components re-render when the + * settings change (in this tab or another) without effects or hydration + * mismatches: the server snapshot is "not loaded yet". + */ +const listeners = new Set<() => void>(); +let version = 0; +const emit = () => { + version++; + for (const l of listeners) l(); +}; +function subscribe(listener: () => void) { + listeners.add(listener); + const onStorage = () => emit(); + window.addEventListener("storage", onStorage); + return () => { + listeners.delete(listener); + window.removeEventListener("storage", onStorage); + }; +} +const getSnapshot = () => version; +const getServerSnapshot = () => -1; + +const storages = () => ({ + session: typeof sessionStorage === "undefined" ? null : sessionStorage, + local: typeof localStorage === "undefined" ? null : localStorage, +}); + +interface AiContextValue { + /** False until browser storage has been read (always false on the server). */ + ready: boolean; + prefs: AiPrefs; + setPrefs: (prefs: AiPrefs) => void; + /** The stored key for the selected provider, if any. */ + storedKey: StoredKey | null; + saveApiKey: (key: string, remember: boolean) => void; + forgetApiKey: () => void; + /** Ready-to-use credentials, or null when no key is set. */ + credentials: Credentials | null; + audit: AuditStore; + settingsOpen: boolean; + openSettings: () => void; + setSettingsOpen: (open: boolean) => void; +} + +const AiContext = createContext(null); + +export function AiProvider({ children }: { children: ReactNode }) { + const snapshot = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); + const ready = snapshot >= 0; + const [settingsOpen, setSettingsOpen] = useState(false); + + const prefs = useMemo( + () => (snapshot >= 0 ? loadPrefs(storages().local) : DEFAULT_PREFS), + [snapshot], + ); + const storedKey = useMemo(() => { + if (snapshot < 0) return null; + const { session, local } = storages(); + return loadKey(prefs.provider, session, local); + }, [snapshot, prefs.provider]); + + const setPrefs = useCallback((next: AiPrefs) => { + savePrefs(storages().local, next); + emit(); + }, []); + const saveApiKey = useCallback( + (key: string, remember: boolean) => { + const { session, local } = storages(); + saveKey(prefs.provider, key, remember, session, local); + emit(); + }, + [prefs.provider], + ); + const forgetApiKey = useCallback(() => { + const { session, local } = storages(); + forgetKey(prefs.provider, session, local); + emit(); + }, [prefs.provider]); + + const credentials = useMemo( + () => + storedKey + ? { + provider: prefs.provider, + model: prefs.provider === "anthropic" ? prefs.anthropicModel : prefs.openaiModel, + apiKey: storedKey.key, + } + : null, + [prefs, storedKey], + ); + + const audit = useMemo(() => getAuditStore(), []); + + const value: AiContextValue = { + ready, + prefs, + setPrefs, + storedKey, + saveApiKey, + forgetApiKey, + credentials, + audit, + settingsOpen, + openSettings: () => setSettingsOpen(true), + setSettingsOpen, + }; + + return ( + + {children} + + + ); +} + +export function useAi(): AiContextValue { + const ctx = useContext(AiContext); + if (!ctx) throw new Error("useAi must be used inside "); + return ctx; +} diff --git a/web/src/components/ai/ai-settings-button.tsx b/web/src/components/ai/ai-settings-button.tsx new file mode 100644 index 0000000..8fbe9f3 --- /dev/null +++ b/web/src/components/ai/ai-settings-button.tsx @@ -0,0 +1,29 @@ +"use client"; + +import { KeyRound } from "lucide-react"; + +import { Button } from "@/components/ui/button"; +import { useAi } from "./ai-provider"; + +export function AiSettingsButton() { + const { openSettings, storedKey, ready } = useAi(); + const active = ready && storedKey !== null; + return ( + + ); +} diff --git a/web/src/components/ai/ai-settings-dialog.tsx b/web/src/components/ai/ai-settings-dialog.tsx new file mode 100644 index 0000000..ba0ef6f --- /dev/null +++ b/web/src/components/ai/ai-settings-dialog.tsx @@ -0,0 +1,221 @@ +"use client"; + +import { Eye, EyeOff, KeyRound, ShieldCheck, Trash2 } from "lucide-react"; +import Link from "next/link"; +import { useState } from "react"; + +import { Segmented } from "@/components/play/primitives"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { ANTHROPIC_MODELS, DEFAULT_OPENAI_MODEL } from "@/lib/ai/models"; +import { maskKey } from "@/lib/ai/settings"; +import { PROVIDER_LABEL, type Provider } from "@/lib/ai/types"; +import { useAi } from "./ai-provider"; + +export function AiSettingsDialog() { + const { settingsOpen, setSettingsOpen } = useAi(); + return ( + + + {/* Remount the form each time the dialog opens so it starts from saved state. */} + {settingsOpen && setSettingsOpen(false)} />} + + + ); +} + +function SettingsForm({ onDone }: { onDone: () => void }) { + const { prefs, setPrefs, storedKey, saveApiKey, forgetApiKey } = useAi(); + const [draftKey, setDraftKey] = useState(""); + const [remember, setRemember] = useState(storedKey?.remembered ?? false); + const [showKey, setShowKey] = useState(false); + const [openaiModel, setOpenaiModel] = useState(prefs.openaiModel); + + const setProvider = (provider: Provider) => { + setPrefs({ ...prefs, provider }); + setDraftKey(""); + }; + + const save = () => { + setPrefs({ ...prefs, openaiModel: openaiModel.trim() || DEFAULT_OPENAI_MODEL }); + if (draftKey.trim()) saveApiKey(draftKey, remember); + else if (storedKey && storedKey.remembered !== remember) saveApiKey(storedKey.key, remember); + onDone(); + }; + + return ( + <> + + + AI settings + + + Optional. Everything on this site works without a key. With your own key you can turn on + the move commentator and the LLM-as-a-player evaluation. + + + +
    + +

    + Your key stays in this browser. Requests go{" "} + directly from your browser to {PROVIDER_LABEL[prefs.provider]}; this site + has no server that could see the key, and it is never logged or written to the AI audit + log. Calls are billed to your account by the provider. +

    +
    + +
    +
    + + Provider + + +
    + + {prefs.provider === "anthropic" ? ( +
    + + +
    + ) : ( +
    + + setOpenaiModel(e.target.value)} + placeholder={DEFAULT_OPENAI_MODEL} + /> +

    + Any Chat Completions model that supports JSON-schema output. +

    +
    + )} + +
    + +
    + setDraftKey(e.target.value)} + placeholder={storedKey ? `Saved: ${maskKey(storedKey.key)}` : "Paste your key"} + autoComplete="off" + spellCheck={false} + aria-describedby="ai-key-status" + /> + +
    +

    + {storedKey + ? storedKey.remembered + ? `A key (${maskKey(storedKey.key)}) is remembered on this device.` + : `A key (${maskKey(storedKey.key)}) is saved for this tab only.` + : "No key saved."} +

    +
    + +
    + setRemember(v === true)} + className="mt-0.5" + /> + +
    +
    + + + {storedKey && ( + + )} + + + +

    + What the AI features do and never do:{" "} + + AI use statement + + . +

    + + ); +} diff --git a/web/src/components/ai/commentator-panel.tsx b/web/src/components/ai/commentator-panel.tsx new file mode 100644 index 0000000..153d8c7 --- /dev/null +++ b/web/src/components/ai/commentator-panel.tsx @@ -0,0 +1,252 @@ +"use client"; + +import { + Check, + CircleAlert, + CircleCheck, + Loader2, + MessageSquareText, + Pencil, + X, +} from "lucide-react"; +import Link from "next/link"; +import { useState } from "react"; + +import { Button } from "@/components/ui/button"; +import { Textarea } from "@/components/ui/textarea"; +import type { MoveExplanation } from "@/lib/agent/player"; +import { DECISION_LABEL, type HumanDecision } from "@/lib/ai/audit-log"; +import { callStructured } from "@/lib/ai/client"; +import { + type Commentary, + CommentarySchema, + type GroundingResult, + buildCommentaryFacts, + commentaryPrompt, + commentaryToText, + groundingCheck, +} from "@/lib/ai/commentator"; +import { isAiError } from "@/lib/ai/types"; +import type { Action, Colour } from "@/lib/cachex/types"; +import { cn } from "@/lib/utils"; +import { AiBadge } from "./ai-badge"; +import { useAi } from "./ai-provider"; + +type State = + | { status: "idle" } + | { status: "loading" } + | { status: "error"; message: string } + | { + status: "done"; + commentary: Commentary; + grounding: GroundingResult; + entryId: string; + model: string; + decision: HumanDecision; + edited?: string; + }; + +const FEATURE_LABEL: Record = { + empty: "Empty hexes", + triangle: "Triangle formations", + tokens: "Token count", + location: "Positional value", + diamond: "Capturable diamonds", + weakness: "Weak formations", +}; + +/** + * "Explain in plain English": a bring-your-own-key commentary grounded in the + * agent's own evaluation breakdown. Remount (key by move) to reset. + */ +export function CommentatorPanel({ + n, + turn, + colour, + action, + explanation, +}: { + n: number; + turn: number; + colour: Colour; + action: Action; + explanation: Extract; +}) { + const { credentials, ready, openSettings, audit } = useAi(); + const [state, setState] = useState({ status: "idle" }); + const [editing, setEditing] = useState(null); + + const run = async () => { + if (!credentials) return openSettings(); + setState({ status: "loading" }); + const facts = buildCommentaryFacts({ n, turn, colour, action, explanation }); + const prompt = commentaryPrompt(facts); + try { + const res = await callStructured( + credentials, + { + feature: "commentator", + ...prompt, + schema: CommentarySchema, + schemaName: "move_commentary", + maxTokens: 1500, + }, + { audit, context: { boardSize: n, turn, mover: colour } }, + ); + setState({ + status: "done", + commentary: res.data, + grounding: groundingCheck(res.data, facts), + entryId: res.entry.id, + model: res.model, + decision: "pending", + }); + } catch (err) { + setState({ status: "error", message: isAiError(err) ? err.message : String(err) }); + } + }; + + const decide = async (decision: HumanDecision, edited?: string) => { + if (state.status !== "done") return; + await audit.update(state.entryId, { + humanDecision: decision, + decidedAt: new Date().toISOString(), + ...(edited !== undefined ? { editedOutput: edited } : {}), + }); + setState({ ...state, decision, edited }); + setEditing(null); + }; + + return ( +
    +
    +

    + Plain-English commentary +

    + {state.status !== "done" && ( + + )} +
    + + {state.status === "idle" && ( +

    + Optional, with your own API key. The model sees only the numbers above (search depth, + candidate scores and feature breakdown) and is told not to add anything else. +

    + )} + {state.status === "error" && ( +

    + {state.message} +

    + )} + + {state.status === "done" && ( +
    + + {state.decision === "rejected" ? ( +

    You rejected this commentary.

    + ) : editing !== null ? ( +
    +