From 47ee997fa75366501439a38d8ecfce97c0d7a05e Mon Sep 17 00:00:00 2001 From: orosmatthew Date: Mon, 11 Mar 2024 20:23:57 -0400 Subject: [PATCH] [extension] Fix shared projects --- extension/bwcontest/package-lock.json | 38 ++++- extension/bwcontest/package.json | 3 + extension/bwcontest/src/SidebarProvider.ts | 4 +- .../contestMonitor/contestStateSyncManager.ts | 4 +- extension/bwcontest/src/problemPanel.ts | 6 +- extension/bwcontest/src/submit.ts | 2 +- extension/bwcontest/tsconfig.json | 17 +- .../contestMonitorTypes.d.ts} | 0 .../package-lock.json | 0 shared/contest-monitor-types/package.json | 3 + shared/contest-monitor-types/tsconfig.json | 12 ++ shared/extensionWeb/package.json | 9 - shared/extensionWeb/tsconfig.json | 14 -- .../.gitignore | 1 - shared/submission-runner/cpp.cts | 148 +++++++++++++++++ shared/submission-runner/csharp.cts | 94 +++++++++++ shared/submission-runner/dist/cpp.cjs | 157 ++++++++++++++++++ shared/submission-runner/dist/cpp.cjs.map | 1 + shared/submission-runner/dist/cpp.d.cts | 12 ++ shared/submission-runner/dist/cpp.d.cts.map | 1 + shared/submission-runner/dist/csharp.cjs | 119 +++++++++++++ shared/submission-runner/dist/csharp.cjs.map | 1 + shared/submission-runner/dist/csharp.d.cts | 3 + .../submission-runner/dist/csharp.d.cts.map | 1 + shared/submission-runner/dist/java.cjs | 135 +++++++++++++++ shared/submission-runner/dist/java.cjs.map | 1 + shared/submission-runner/dist/java.d.cts | 11 ++ shared/submission-runner/dist/java.d.cts.map | 1 + shared/submission-runner/dist/settings.cjs | 5 + .../submission-runner/dist/settings.cjs.map | 1 + shared/submission-runner/dist/settings.d.cts | 2 + .../submission-runner/dist/settings.d.cts.map | 1 + .../dist/tsconfig.tsbuildinfo | 1 + shared/submission-runner/dist/types.cjs | 21 +++ shared/submission-runner/dist/types.cjs.map | 1 + shared/submission-runner/dist/types.d.cts | 39 +++++ shared/submission-runner/dist/types.d.cts.map | 1 + .../java.cts | 0 .../package-lock.json | 0 .../package.json | 1 + .../settings.cts | 0 .../tsconfig.json | 4 +- .../types.cts | 0 shared/submissionRunner/.gitignore | 2 - shared/submissionRunner/cpp.cts | 139 ---------------- shared/submissionRunner/csharp.cts | 90 ---------- 46 files changed, 828 insertions(+), 278 deletions(-) rename shared/{extensionWeb/contestMonitorTypes.cts => contest-monitor-types/contestMonitorTypes.d.ts} (100%) rename shared/{extensionWeb => contest-monitor-types}/package-lock.json (100%) create mode 100644 shared/contest-monitor-types/package.json create mode 100644 shared/contest-monitor-types/tsconfig.json delete mode 100644 shared/extensionWeb/package.json delete mode 100644 shared/extensionWeb/tsconfig.json rename shared/{extensionWeb => submission-runner}/.gitignore (65%) create mode 100644 shared/submission-runner/cpp.cts create mode 100644 shared/submission-runner/csharp.cts create mode 100644 shared/submission-runner/dist/cpp.cjs create mode 100644 shared/submission-runner/dist/cpp.cjs.map create mode 100644 shared/submission-runner/dist/cpp.d.cts create mode 100644 shared/submission-runner/dist/cpp.d.cts.map create mode 100644 shared/submission-runner/dist/csharp.cjs create mode 100644 shared/submission-runner/dist/csharp.cjs.map create mode 100644 shared/submission-runner/dist/csharp.d.cts create mode 100644 shared/submission-runner/dist/csharp.d.cts.map create mode 100644 shared/submission-runner/dist/java.cjs create mode 100644 shared/submission-runner/dist/java.cjs.map create mode 100644 shared/submission-runner/dist/java.d.cts create mode 100644 shared/submission-runner/dist/java.d.cts.map create mode 100644 shared/submission-runner/dist/settings.cjs create mode 100644 shared/submission-runner/dist/settings.cjs.map create mode 100644 shared/submission-runner/dist/settings.d.cts create mode 100644 shared/submission-runner/dist/settings.d.cts.map create mode 100644 shared/submission-runner/dist/tsconfig.tsbuildinfo create mode 100644 shared/submission-runner/dist/types.cjs create mode 100644 shared/submission-runner/dist/types.cjs.map create mode 100644 shared/submission-runner/dist/types.d.cts create mode 100644 shared/submission-runner/dist/types.d.cts.map rename shared/{submissionRunner => submission-runner}/java.cts (100%) rename shared/{submissionRunner => submission-runner}/package-lock.json (100%) rename shared/{submissionRunner => submission-runner}/package.json (89%) rename shared/{submissionRunner => submission-runner}/settings.cts (100%) rename shared/{submissionRunner => submission-runner}/tsconfig.json (81%) rename shared/{submissionRunner => submission-runner}/types.cts (100%) delete mode 100644 shared/submissionRunner/.gitignore delete mode 100644 shared/submissionRunner/cpp.cts delete mode 100644 shared/submissionRunner/csharp.cts diff --git a/extension/bwcontest/package-lock.json b/extension/bwcontest/package-lock.json index 3ca5fe5..1a3eba8 100644 --- a/extension/bwcontest/package-lock.json +++ b/extension/bwcontest/package-lock.json @@ -10,8 +10,10 @@ "dependencies": { "@vscode/vsce": "^2.22.0", "axios": "^1.6.5", + "contest-monitor-types": "file:../../shared/contest-monitor-types", "fs-extra": "^11.2.0", "isomorphic-git": "^1.25.3", + "submission-runner": "file:../../shared/submission-runner", "tree-kill": "^1.2.2", "url-join": "^5.0.0", "zod": "^3.22.4" @@ -49,7 +51,33 @@ "typescript": "^5.3.3" }, "engines": { - "vscode": "^1.84.0" + "vscode": "^1.85.0" + } + }, + "../../shared/contest-monitor-types": {}, + "../../shared/submission-runner": { + "dependencies": { + "fs-extra": "^11.2.0", + "tree-kill": "^1.2.2", + "typescript": "^5.4.2", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/fs-extra": "^11.0.4", + "@types/node": "20.x" + } + }, + "../../shared/submissionRunner": { + "extraneous": true, + "dependencies": { + "fs-extra": "^11.2.0", + "tree-kill": "^1.2.2", + "typescript": "^5.4.2", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/fs-extra": "^11.0.4", + "@types/node": "20.x" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -2177,6 +2205,10 @@ "node": ">=12" } }, + "node_modules/contest-monitor-types": { + "resolved": "../../shared/contest-monitor-types", + "link": true + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -6096,6 +6128,10 @@ "postcss": "^8.2.15" } }, + "node_modules/submission-runner": { + "resolved": "../../shared/submission-runner", + "link": true + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", diff --git a/extension/bwcontest/package.json b/extension/bwcontest/package.json index 9fe5c5c..aa36af7 100644 --- a/extension/bwcontest/package.json +++ b/extension/bwcontest/package.json @@ -73,6 +73,7 @@ }, "scripts": { "vscode:prepublish": "npm run compile", + "check": "tsc -noEmit", "esbuild-base": "esbuild ./src/extension.ts --bundle --outfile=out/main.js --external:vscode --format=cjs --platform=node", "esbuild": "npm run esbuild-base -- --sourcemap", "compile": "rollup -c && npm run esbuild-base -- --minify", @@ -115,8 +116,10 @@ "dependencies": { "@vscode/vsce": "^2.22.0", "axios": "^1.6.5", + "contest-monitor-types": "file:../../shared/contest-monitor-types", "fs-extra": "^11.2.0", "isomorphic-git": "^1.25.3", + "submission-runner": "file:../../shared/submission-runner", "tree-kill": "^1.2.2", "url-join": "^5.0.0", "zod": "^3.22.4" diff --git a/extension/bwcontest/src/SidebarProvider.ts b/extension/bwcontest/src/SidebarProvider.ts index 114d368..1ef18bb 100644 --- a/extension/bwcontest/src/SidebarProvider.ts +++ b/extension/bwcontest/src/SidebarProvider.ts @@ -4,12 +4,12 @@ import { cloneAndOpenRepo } from './extension'; import { BWPanel } from './problemPanel'; import urlJoin from 'url-join'; import outputPanelLog from './outputPanelLog'; -import { +import type { ContestStateForExtension, ProblemNameForExtension, SubmissionForExtension, SubmissionStateForExtension -} from './contestMonitor/contestMonitorSharedTypes'; +} from 'contest-monitor-types/contestMonitorTypes'; import { TeamData } from './sharedTypes'; import { ContestTeamState, diff --git a/extension/bwcontest/src/contestMonitor/contestStateSyncManager.ts b/extension/bwcontest/src/contestMonitor/contestStateSyncManager.ts index f772cfb..75df388 100644 --- a/extension/bwcontest/src/contestMonitor/contestStateSyncManager.ts +++ b/extension/bwcontest/src/contestMonitor/contestStateSyncManager.ts @@ -2,12 +2,12 @@ import * as vscode from 'vscode'; import urlJoin from 'url-join'; import outputPanelLog from '../outputPanelLog'; import { extensionSettings } from '../extension'; -import { +import type { ContestStateForExtension, ProblemNameForExtension, FullStateForExtension, SubmissionForExtension -} from '@extensionWeb/contestMonitorTypes.cjs'; +} from 'contest-monitor-types/contestMonitorTypes'; import { LiteEvent } from '../utilities/LiteEvent'; export type ContestTeamState = { diff --git a/extension/bwcontest/src/problemPanel.ts b/extension/bwcontest/src/problemPanel.ts index 373dc86..132f9bd 100644 --- a/extension/bwcontest/src/problemPanel.ts +++ b/extension/bwcontest/src/problemPanel.ts @@ -2,11 +2,11 @@ import * as vscode from 'vscode'; import { getNonce } from './getNonce'; import urlJoin from 'url-join'; import { extensionSettings } from './extension'; -import { runJava } from '@submissionRunner/java.cjs'; +import { runJava } from 'submission-runner/java.cjs'; import { join } from 'path'; import { submitProblem } from './submit'; -import { runCSharp } from '@submissionRunner/csharp.cjs'; -import { runCpp } from '@submissionRunner/cpp.cjs'; +import { runCSharp } from 'submission-runner/csharp.cjs'; +import { runCpp } from 'submission-runner/cpp.cjs'; import { TeamData } from './sharedTypes'; import outputPanelLog from './outputPanelLog'; import { recordInitialSubmission } from './contestMonitor/contestStateSyncManager'; diff --git a/extension/bwcontest/src/submit.ts b/extension/bwcontest/src/submit.ts index 226be81..90e76f1 100644 --- a/extension/bwcontest/src/submit.ts +++ b/extension/bwcontest/src/submit.ts @@ -5,7 +5,7 @@ import path = require('path'); import http from 'isomorphic-git/http/node'; import urlJoin from 'url-join'; import outputPanelLog from './outputPanelLog'; -import { SubmissionForExtension } from './contestMonitor/contestMonitorSharedTypes'; +import type { SubmissionForExtension } from 'contest-monitor-types/contestMonitorTypes'; export async function submitProblem( sessionToken: string, diff --git a/extension/bwcontest/tsconfig.json b/extension/bwcontest/tsconfig.json index 4ad872d..1f5da5f 100644 --- a/extension/bwcontest/tsconfig.json +++ b/extension/bwcontest/tsconfig.json @@ -3,22 +3,15 @@ "module": "commonjs", "target": "ES2020", "outDir": "out", - "lib": ["ES2020"], + "lib": ["ES2020", "DOM"], "sourceMap": true, "rootDir": "src", - "strict": true, /* enable all strict type-checking options */ + "esModuleInterop": true, + "strict": true /* enable all strict type-checking options */ /* Additional Checks */ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ // "noUnusedParameters": true, /* Report errors on unused parameters. */ - "paths": { - "@submissionRunner/*": ["../../shared/submissionRunner/*"], - "@extensionWeb/*": ["../../shared/extensionWeb/*"] - }, }, - "exclude": ["webviews"], - "references": [ - { "path": "../../shared/submissionRunner" }, - { "path": "../../shared/extensionWeb" } - ] -} \ No newline at end of file + "exclude": ["webviews"] +} diff --git a/shared/extensionWeb/contestMonitorTypes.cts b/shared/contest-monitor-types/contestMonitorTypes.d.ts similarity index 100% rename from shared/extensionWeb/contestMonitorTypes.cts rename to shared/contest-monitor-types/contestMonitorTypes.d.ts diff --git a/shared/extensionWeb/package-lock.json b/shared/contest-monitor-types/package-lock.json similarity index 100% rename from shared/extensionWeb/package-lock.json rename to shared/contest-monitor-types/package-lock.json diff --git a/shared/contest-monitor-types/package.json b/shared/contest-monitor-types/package.json new file mode 100644 index 0000000..d612ff4 --- /dev/null +++ b/shared/contest-monitor-types/package.json @@ -0,0 +1,3 @@ +{ + "name": "contest-monitor-types" +} diff --git a/shared/contest-monitor-types/tsconfig.json b/shared/contest-monitor-types/tsconfig.json new file mode 100644 index 0000000..c75e988 --- /dev/null +++ b/shared/contest-monitor-types/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "declaration": true, + "composite": true, + "emitDeclarationOnly": true, + "outDir": "./build", + "strict": true, + "target": "ESNext", + "moduleResolution": "Node" + }, + "include": ["*.ts"] +} diff --git a/shared/extensionWeb/package.json b/shared/extensionWeb/package.json deleted file mode 100644 index babd48c..0000000 --- a/shared/extensionWeb/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "scripts": { - "build": "tsc" - }, - "devDependencies": { - }, - "dependencies": { - } -} diff --git a/shared/extensionWeb/tsconfig.json b/shared/extensionWeb/tsconfig.json deleted file mode 100644 index 6a80e3d..0000000 --- a/shared/extensionWeb/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "target": "es2016", - "module": "commonjs", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "outDir": "./build", - "esModuleInterop": true, - "strict": true, - }, - "include": ["/**/*.cts"] -} \ No newline at end of file diff --git a/shared/extensionWeb/.gitignore b/shared/submission-runner/.gitignore similarity index 65% rename from shared/extensionWeb/.gitignore rename to shared/submission-runner/.gitignore index 8c08c51..3c3629e 100644 --- a/shared/extensionWeb/.gitignore +++ b/shared/submission-runner/.gitignore @@ -1,2 +1 @@ node_modules -/build diff --git a/shared/submission-runner/cpp.cts b/shared/submission-runner/cpp.cts new file mode 100644 index 0000000..bb2cfa9 --- /dev/null +++ b/shared/submission-runner/cpp.cts @@ -0,0 +1,148 @@ +import { join } from "path"; +import { exec, spawn } from "child_process"; +import * as util from "util"; +import type { + IRunner, + IRunnerParams, + IRunnerReturn, + RunResult, +} from "./types.cjs"; +import { timeoutSeconds } from "./settings.cjs"; +import kill from "tree-kill"; +import * as os from "os"; +import * as fs from "fs-extra"; + +const execPromise = util.promisify(exec); + +export type CppPlatform = "VisualStudio" | "GCC"; + +interface IRunnerParamsCpp extends IRunnerParams { + srcDir: string; + problemName: string; + input: string; + cppPlatform: CppPlatform; + outputCallback?: (data: string) => void; +} + +export const runCpp: IRunner = async function ( + params: IRunnerParamsCpp +): Promise { + const tmpDir = os.tmpdir(); + const buildDir = join(tmpDir, "bwcontest-cpp"); + if (fs.existsSync(buildDir)) { + fs.removeSync(buildDir); + } + fs.mkdirSync(buildDir); + + console.log(`- BUILD: ${params.problemName}`); + + const configureCommand = `cmake -S ${params.srcDir} -B ${buildDir}`; + try { + await execPromise(configureCommand); + } catch (e) { + const buildErrorText = e?.toString() ?? "Unknown build errors."; + console.log("Build errors: " + buildErrorText); + return { + success: false, + runResult: { kind: "CompileFailed", resultKindReason: buildErrorText }, + }; + } + + const compileCommand = `cmake --build ${buildDir} --target ${params.problemName}`; + try { + await execPromise(compileCommand); + } catch (e) { + const buildErrorText = e?.toString() ?? "Unknown build errors."; + console.log("Build errors: " + buildErrorText); + return { + success: false, + runResult: { kind: "CompileFailed", resultKindReason: buildErrorText }, + }; + } + + console.log(`- RUN: ${params.problemName}`); + + let runCommand = ""; + if (params.cppPlatform === "VisualStudio") { + runCommand = `${join(buildDir, "Debug", `${params.problemName}.exe`)}`; + } else { + runCommand = `${join(buildDir, params.problemName)}`; + } + try { + let outputBuffer = ""; + const child = spawn(runCommand, { shell: true }); + child.stdout.setEncoding("utf8"); + child.stdout.on("data", (data) => { + outputBuffer += data.toString(); + }); + child.stderr.setEncoding("utf8"); + child.stderr.on("data", (data) => { + outputBuffer += data.toString(); + }); + + const runStartTime = performance.now(); + child.stdin.write(params.input); + child.stdin.end(); + + let timeLimitExceeded = false; + let completedNormally = false; + + return { + success: true, + runResult: new Promise((resolve) => { + child.on("close", () => { + completedNormally = !timeLimitExceeded; + + const runEndTime = performance.now(); + const runtimeMilliseconds = Math.floor(runEndTime - runStartTime); + + if (completedNormally) { + clearTimeout(timeoutHandle); + resolve({ + kind: "Completed", + output: outputBuffer, + exitCode: child.exitCode!, + runtimeMilliseconds, + }); + } else { + console.log( + `Process terminated, total sandbox time: ${runtimeMilliseconds}ms` + ); + resolve({ + kind: "TimeLimitExceeded", + output: outputBuffer, + resultKindReason: `Timeout after ${timeoutSeconds} seconds`, + }); + } + }); + + const timeoutHandle = setTimeout(() => { + if (completedNormally) { + return; + } + + console.log( + `Run timed out after ${timeoutSeconds} seconds, killing process...` + ); + timeLimitExceeded = true; + + child.stdin.end(); + child.stdin.destroy(); + child.stdout.destroy(); + child.stderr.destroy(); + child.kill("SIGKILL"); + }, timeoutSeconds * 1000); + }), + killFunc() { + if (child.pid !== undefined) { + if (!completedNormally && !timeLimitExceeded) { + kill(child.pid); + params.outputCallback?.("\n[Manually stopped]"); + } + } + }, + }; + } catch (error) { + return { success: false, runResult: { kind: "RunError" } }; + } +}; diff --git a/shared/submission-runner/csharp.cts b/shared/submission-runner/csharp.cts new file mode 100644 index 0000000..ff05ad5 --- /dev/null +++ b/shared/submission-runner/csharp.cts @@ -0,0 +1,94 @@ +import { spawn } from "child_process"; +import kill from "tree-kill"; +import type { IRunner, IRunnerReturn, RunResult } from "./types.cjs"; +import { timeoutSeconds } from "./settings.cjs"; + +export const runCSharp: IRunner = async function (params: { + srcDir: string; + input: string; + outputCallback?: (data: string) => void; +}): Promise { + console.log(`- RUN: ${params.srcDir}`); + const child = spawn("dotnet run", { shell: true, cwd: params.srcDir }); + + try { + let outputBuffer = ""; + child.stdout.setEncoding("utf8"); + child.stdout.on("data", (data) => { + outputBuffer += data.toString(); + params.outputCallback?.(data.toString()); + }); + child.stderr.setEncoding("utf8"); + child.stderr.on("data", (data) => { + outputBuffer += data.toString(); + params.outputCallback?.(data.toString()); + }); + + const runStartTime = performance.now(); + child.stdin.write(params.input); + child.stdin.end(); + + let timeLimitExceeded = false; + let completedNormally = false; + + return { + success: true, + runResult: new Promise((resolve) => { + child.on("close", () => { + completedNormally = !timeLimitExceeded; + + const runEndTime = performance.now(); + const runtimeMilliseconds = Math.floor(runEndTime - runStartTime); + + if (completedNormally) { + clearTimeout(timeoutHandle); + resolve({ + kind: "Completed", + output: outputBuffer, + exitCode: child.exitCode!, + runtimeMilliseconds, + }); + } else { + console.log( + `Process terminated, total sandbox time: ${runtimeMilliseconds}ms` + ); + resolve({ + kind: "TimeLimitExceeded", + output: outputBuffer, + resultKindReason: `Timeout after ${timeoutSeconds} seconds`, + }); + } + }); + + const timeoutHandle = setTimeout(() => { + if (completedNormally) { + return; + } + + console.log( + `Run timed out after ${timeoutSeconds} seconds, killing process...` + ); + timeLimitExceeded = true; + + child.stdin.end(); + child.stdin.destroy(); + child.stdout.destroy(); + child.stderr.destroy(); + if (child.pid !== undefined) { + kill(child.pid); + } + }, timeoutSeconds * 1000); + }), + killFunc() { + if (child.pid !== undefined) { + if (!completedNormally && !timeLimitExceeded) { + kill(child.pid); + params.outputCallback?.("\n[Manually stopped]"); + } + } + }, + }; + } catch (error) { + return { success: false, runResult: { kind: "RunError" } }; + } +}; diff --git a/shared/submission-runner/dist/cpp.cjs b/shared/submission-runner/dist/cpp.cjs new file mode 100644 index 0000000..1935def --- /dev/null +++ b/shared/submission-runner/dist/cpp.cjs @@ -0,0 +1,157 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runCpp = void 0; +const path_1 = require("path"); +const child_process_1 = require("child_process"); +const util = __importStar(require("util")); +const settings_cjs_1 = require("./settings.cjs"); +const kill = __importStar(require("kill")); +const os = __importStar(require("os")); +const fs = __importStar(require("fs-extra")); +const execPromise = util.promisify(child_process_1.exec); +const runCpp = function (params) { + return __awaiter(this, void 0, void 0, function* () { + var _a, _b; + const tmpDir = os.tmpdir(); + const buildDir = (0, path_1.join)(tmpDir, "bwcontest-cpp"); + if (fs.existsSync(buildDir)) { + fs.removeSync(buildDir); + } + fs.mkdirSync(buildDir); + console.log(`- BUILD: ${params.problemName}`); + const configureCommand = `cmake -S ${params.srcDir} -B ${buildDir}`; + try { + yield execPromise(configureCommand); + } + catch (e) { + const buildErrorText = (_a = e === null || e === void 0 ? void 0 : e.toString()) !== null && _a !== void 0 ? _a : "Unknown build errors."; + console.log("Build errors: " + buildErrorText); + return { + success: false, + runResult: { kind: "CompileFailed", resultKindReason: buildErrorText }, + }; + } + const compileCommand = `cmake --build ${buildDir} --target ${params.problemName}`; + try { + yield execPromise(compileCommand); + } + catch (e) { + const buildErrorText = (_b = e === null || e === void 0 ? void 0 : e.toString()) !== null && _b !== void 0 ? _b : "Unknown build errors."; + console.log("Build errors: " + buildErrorText); + return { + success: false, + runResult: { kind: "CompileFailed", resultKindReason: buildErrorText }, + }; + } + console.log(`- RUN: ${params.problemName}`); + let runCommand = ""; + if (params.cppPlatform === "VisualStudio") { + runCommand = `${(0, path_1.join)(buildDir, "Debug", `${params.problemName}.exe`)}`; + } + else { + runCommand = `${(0, path_1.join)(buildDir, params.problemName)}`; + } + try { + let outputBuffer = ""; + const child = (0, child_process_1.spawn)(runCommand, { shell: true }); + child.stdout.setEncoding("utf8"); + child.stdout.on("data", (data) => { + outputBuffer += data.toString(); + }); + child.stderr.setEncoding("utf8"); + child.stderr.on("data", (data) => { + outputBuffer += data.toString(); + }); + const runStartTime = performance.now(); + child.stdin.write(params.input); + child.stdin.end(); + let timeLimitExceeded = false; + let completedNormally = false; + return { + success: true, + runResult: new Promise((resolve) => { + child.on("close", () => { + completedNormally = !timeLimitExceeded; + const runEndTime = performance.now(); + const runtimeMilliseconds = Math.floor(runEndTime - runStartTime); + if (completedNormally) { + clearTimeout(timeoutHandle); + resolve({ + kind: "Completed", + output: outputBuffer, + exitCode: child.exitCode, + runtimeMilliseconds, + }); + } + else { + console.log(`Process terminated, total sandbox time: ${runtimeMilliseconds}ms`); + resolve({ + kind: "TimeLimitExceeded", + output: outputBuffer, + resultKindReason: `Timeout after ${settings_cjs_1.timeoutSeconds} seconds`, + }); + } + }); + const timeoutHandle = setTimeout(() => { + if (completedNormally) { + return; + } + console.log(`Run timed out after ${settings_cjs_1.timeoutSeconds} seconds, killing process...`); + timeLimitExceeded = true; + child.stdin.end(); + child.stdin.destroy(); + child.stdout.destroy(); + child.stderr.destroy(); + child.kill("SIGKILL"); + }, settings_cjs_1.timeoutSeconds * 1000); + }), + killFunc() { + var _a; + if (child.pid !== undefined) { + if (!completedNormally && !timeLimitExceeded) { + kill(child.pid); + (_a = params.outputCallback) === null || _a === void 0 ? void 0 : _a.call(params, "\n[Manually stopped]"); + } + } + }, + }; + } + catch (error) { + return { success: false, runResult: { kind: "RunError" } }; + } + }); +}; +exports.runCpp = runCpp; +//# sourceMappingURL=cpp.cjs.map \ No newline at end of file diff --git a/shared/submission-runner/dist/cpp.cjs.map b/shared/submission-runner/dist/cpp.cjs.map new file mode 100644 index 0000000..b298605 --- /dev/null +++ b/shared/submission-runner/dist/cpp.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"cpp.cjs","sourceRoot":"","sources":["../cpp.cts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/shared/submission-runner/dist/cpp.d.cts b/shared/submission-runner/dist/cpp.d.cts new file mode 100644 index 0000000..9083eea --- /dev/null +++ b/shared/submission-runner/dist/cpp.d.cts @@ -0,0 +1,12 @@ +import type { IRunner, IRunnerParams } from "./types.cjs"; +export type CppPlatform = "VisualStudio" | "GCC"; +interface IRunnerParamsCpp extends IRunnerParams { + srcDir: string; + problemName: string; + input: string; + cppPlatform: CppPlatform; + outputCallback?: (data: string) => void; +} +export declare const runCpp: IRunner; +export {}; +//# sourceMappingURL=cpp.d.cts.map \ No newline at end of file diff --git a/shared/submission-runner/dist/cpp.d.cts.map b/shared/submission-runner/dist/cpp.d.cts.map new file mode 100644 index 0000000..fbeb823 --- /dev/null +++ b/shared/submission-runner/dist/cpp.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"cpp.d.cts","sourceRoot":"","sources":["../cpp.cts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EAGd,MAAM,aAAa,CAAC;AAQrB,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,KAAK,CAAC;AAEjD,UAAU,gBAAiB,SAAQ,aAAa;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAyH5C,CAAC"} \ No newline at end of file diff --git a/shared/submission-runner/dist/csharp.cjs b/shared/submission-runner/dist/csharp.cjs new file mode 100644 index 0000000..e2f0863 --- /dev/null +++ b/shared/submission-runner/dist/csharp.cjs @@ -0,0 +1,119 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runCSharp = void 0; +const child_process_1 = require("child_process"); +const kill = __importStar(require("tree-kill")); +const settings_cjs_1 = require("./settings.cjs"); +const runCSharp = function (params) { + return __awaiter(this, void 0, void 0, function* () { + console.log(`- RUN: ${params.srcDir}`); + const child = (0, child_process_1.spawn)("dotnet run", { shell: true, cwd: params.srcDir }); + try { + let outputBuffer = ""; + child.stdout.setEncoding("utf8"); + child.stdout.on("data", (data) => { + var _a; + outputBuffer += data.toString(); + (_a = params.outputCallback) === null || _a === void 0 ? void 0 : _a.call(params, data.toString()); + }); + child.stderr.setEncoding("utf8"); + child.stderr.on("data", (data) => { + var _a; + outputBuffer += data.toString(); + (_a = params.outputCallback) === null || _a === void 0 ? void 0 : _a.call(params, data.toString()); + }); + const runStartTime = performance.now(); + child.stdin.write(params.input); + child.stdin.end(); + let timeLimitExceeded = false; + let completedNormally = false; + return { + success: true, + runResult: new Promise((resolve) => { + child.on("close", () => { + completedNormally = !timeLimitExceeded; + const runEndTime = performance.now(); + const runtimeMilliseconds = Math.floor(runEndTime - runStartTime); + if (completedNormally) { + clearTimeout(timeoutHandle); + resolve({ + kind: "Completed", + output: outputBuffer, + exitCode: child.exitCode, + runtimeMilliseconds, + }); + } + else { + console.log(`Process terminated, total sandbox time: ${runtimeMilliseconds}ms`); + resolve({ + kind: "TimeLimitExceeded", + output: outputBuffer, + resultKindReason: `Timeout after ${settings_cjs_1.timeoutSeconds} seconds`, + }); + } + }); + const timeoutHandle = setTimeout(() => { + if (completedNormally) { + return; + } + console.log(`Run timed out after ${settings_cjs_1.timeoutSeconds} seconds, killing process...`); + timeLimitExceeded = true; + child.stdin.end(); + child.stdin.destroy(); + child.stdout.destroy(); + child.stderr.destroy(); + if (child.pid !== undefined) { + kill(child.pid); + } + }, settings_cjs_1.timeoutSeconds * 1000); + }), + killFunc() { + var _a; + if (child.pid !== undefined) { + if (!completedNormally && !timeLimitExceeded) { + kill(child.pid); + (_a = params.outputCallback) === null || _a === void 0 ? void 0 : _a.call(params, "\n[Manually stopped]"); + } + } + }, + }; + } + catch (error) { + return { success: false, runResult: { kind: "RunError" } }; + } + }); +}; +exports.runCSharp = runCSharp; +//# sourceMappingURL=csharp.cjs.map \ No newline at end of file diff --git a/shared/submission-runner/dist/csharp.cjs.map b/shared/submission-runner/dist/csharp.cjs.map new file mode 100644 index 0000000..51d2c85 --- /dev/null +++ b/shared/submission-runner/dist/csharp.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"csharp.cjs","sourceRoot":"","sources":["../csharp.cts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/shared/submission-runner/dist/csharp.d.cts b/shared/submission-runner/dist/csharp.d.cts new file mode 100644 index 0000000..e894b7b --- /dev/null +++ b/shared/submission-runner/dist/csharp.d.cts @@ -0,0 +1,3 @@ +import type { IRunner } from "./types.cjs"; +export declare const runCSharp: IRunner; +//# sourceMappingURL=csharp.d.cts.map \ No newline at end of file diff --git a/shared/submission-runner/dist/csharp.d.cts.map b/shared/submission-runner/dist/csharp.d.cts.map new file mode 100644 index 0000000..cb17bac --- /dev/null +++ b/shared/submission-runner/dist/csharp.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"csharp.d.cts","sourceRoot":"","sources":["../csharp.cts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAA4B,MAAM,aAAa,CAAC;AAGrE,eAAO,MAAM,SAAS,EAAE,OAwFvB,CAAC"} \ No newline at end of file diff --git a/shared/submission-runner/dist/java.cjs b/shared/submission-runner/dist/java.cjs new file mode 100644 index 0000000..ed52545 --- /dev/null +++ b/shared/submission-runner/dist/java.cjs @@ -0,0 +1,135 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runJava = void 0; +const path_1 = require("path"); +const child_process_1 = require("child_process"); +const util = __importStar(require("util")); +const settings_cjs_1 = require("./settings.cjs"); +const kill = require("tree-kill"); +const execPromise = util.promisify(child_process_1.exec); +const runJava = function (params) { + return __awaiter(this, void 0, void 0, function* () { + var _a; + console.log(`- BUILD: ${params.mainFile}`); + const compileCommand = `javac -cp ${(0, path_1.join)(params.srcDir, 'src')} ${params.mainFile} -d ${(0, path_1.join)(params.srcDir, 'build')}`; + try { + yield execPromise(compileCommand); + } + catch (e) { + const buildErrorText = (_a = e === null || e === void 0 ? void 0 : e.toString()) !== null && _a !== void 0 ? _a : 'Unknown build errors.'; + console.log('Build errors: ' + buildErrorText); + return { + success: false, + runResult: { kind: 'CompileFailed', resultKindReason: buildErrorText } + }; + } + console.log(`- RUN: ${params.mainClass}`); + const runCommand = `java -cp "${(0, path_1.join)(params.srcDir, 'build')}" ${params.mainClass}`; + try { + let outputBuffer = ''; + const child = (0, child_process_1.spawn)(runCommand, { shell: true }); + child.stdout.setEncoding('utf8'); + child.stdout.on('data', (data) => { + var _a; + outputBuffer += data.toString(); + (_a = params.outputCallback) === null || _a === void 0 ? void 0 : _a.call(params, data.toString()); + }); + child.stderr.setEncoding('utf8'); + child.stderr.on('data', (data) => { + var _a; + outputBuffer += data.toString(); + (_a = params.outputCallback) === null || _a === void 0 ? void 0 : _a.call(params, data.toString()); + }); + const runStartTime = performance.now(); + child.stdin.write(params.input); + child.stdin.end(); + let timeLimitExceeded = false; + let completedNormally = false; + return { + success: true, + runResult: new Promise((resolve) => { + child.on('close', () => { + completedNormally = !timeLimitExceeded; + const runEndTime = performance.now(); + const runtimeMilliseconds = Math.floor(runEndTime - runStartTime); + if (completedNormally) { + clearTimeout(timeoutHandle); + resolve({ + kind: 'Completed', + output: outputBuffer, + exitCode: child.exitCode, + runtimeMilliseconds + }); + } + else { + console.log(`Process terminated, total sandbox time: ${runtimeMilliseconds}ms`); + resolve({ + kind: 'TimeLimitExceeded', + output: outputBuffer, + resultKindReason: `Timeout after ${settings_cjs_1.timeoutSeconds} seconds` + }); + } + }); + const timeoutHandle = setTimeout(() => { + if (completedNormally) { + return; + } + console.log(`Run timed out after ${settings_cjs_1.timeoutSeconds} seconds, killing process...`); + timeLimitExceeded = true; + child.stdin.end(); + child.stdin.destroy(); + child.stdout.destroy(); + child.stderr.destroy(); + child.kill('SIGKILL'); + }, settings_cjs_1.timeoutSeconds * 1000); + }), + killFunc() { + var _a; + if (child.pid !== undefined) { + if (!completedNormally && !timeLimitExceeded) { + kill(child.pid); + (_a = params.outputCallback) === null || _a === void 0 ? void 0 : _a.call(params, '\n[Manually stopped]'); + } + } + } + }; + } + catch (error) { + return { success: false, runResult: { kind: 'RunError' } }; + } + }); +}; +exports.runJava = runJava; +//# sourceMappingURL=java.cjs.map \ No newline at end of file diff --git a/shared/submission-runner/dist/java.cjs.map b/shared/submission-runner/dist/java.cjs.map new file mode 100644 index 0000000..4b43898 --- /dev/null +++ b/shared/submission-runner/dist/java.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"java.cjs","sourceRoot":"","sources":["../java.cts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/shared/submission-runner/dist/java.d.cts b/shared/submission-runner/dist/java.d.cts new file mode 100644 index 0000000..97d6aa3 --- /dev/null +++ b/shared/submission-runner/dist/java.d.cts @@ -0,0 +1,11 @@ +import type { IRunner, IRunnerParams } from './types.cjs'; +interface IRunnerParamsJava extends IRunnerParams { + srcDir: string; + mainFile: string; + mainClass: string; + input: string; + outputCallback?: (data: string) => void; +} +export declare const runJava: IRunner; +export {}; +//# sourceMappingURL=java.d.cts.map \ No newline at end of file diff --git a/shared/submission-runner/dist/java.d.cts.map b/shared/submission-runner/dist/java.d.cts.map new file mode 100644 index 0000000..b87f707 --- /dev/null +++ b/shared/submission-runner/dist/java.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"java.d.cts","sourceRoot":"","sources":["../java.cts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAA4B,MAAM,aAAa,CAAC;AAOpF,UAAU,iBAAkB,SAAQ,aAAa;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,eAAO,MAAM,OAAO,EAAE,OAAO,CAAC,iBAAiB,CA+F9C,CAAC"} \ No newline at end of file diff --git a/shared/submission-runner/dist/settings.cjs b/shared/submission-runner/dist/settings.cjs new file mode 100644 index 0000000..ba0f793 --- /dev/null +++ b/shared/submission-runner/dist/settings.cjs @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.timeoutSeconds = void 0; +exports.timeoutSeconds = 30; +//# sourceMappingURL=settings.cjs.map \ No newline at end of file diff --git a/shared/submission-runner/dist/settings.cjs.map b/shared/submission-runner/dist/settings.cjs.map new file mode 100644 index 0000000..b910414 --- /dev/null +++ b/shared/submission-runner/dist/settings.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"settings.cjs","sourceRoot":"","sources":["../settings.cts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG,EAAE,CAAC"} \ No newline at end of file diff --git a/shared/submission-runner/dist/settings.d.cts b/shared/submission-runner/dist/settings.d.cts new file mode 100644 index 0000000..ada5067 --- /dev/null +++ b/shared/submission-runner/dist/settings.d.cts @@ -0,0 +1,2 @@ +export declare const timeoutSeconds = 30; +//# sourceMappingURL=settings.d.cts.map \ No newline at end of file diff --git a/shared/submission-runner/dist/settings.d.cts.map b/shared/submission-runner/dist/settings.d.cts.map new file mode 100644 index 0000000..f0b6f7e --- /dev/null +++ b/shared/submission-runner/dist/settings.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"settings.d.cts","sourceRoot":"","sources":["../settings.cts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,KAAK,CAAC"} \ No newline at end of file diff --git a/shared/submission-runner/dist/tsconfig.tsbuildinfo b/shared/submission-runner/dist/tsconfig.tsbuildinfo new file mode 100644 index 0000000..63b5cb1 --- /dev/null +++ b/shared/submission-runner/dist/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../node_modules/typescript/lib/lib.scripthost.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/typescript/lib/lib.es2016.full.d.ts","../node_modules/zod/lib/helpers/typealiases.d.ts","../node_modules/zod/lib/helpers/util.d.ts","../node_modules/zod/lib/zoderror.d.ts","../node_modules/zod/lib/locales/en.d.ts","../node_modules/zod/lib/errors.d.ts","../node_modules/zod/lib/helpers/parseutil.d.ts","../node_modules/zod/lib/helpers/enumutil.d.ts","../node_modules/zod/lib/helpers/errorutil.d.ts","../node_modules/zod/lib/helpers/partialutil.d.ts","../node_modules/zod/lib/types.d.ts","../node_modules/zod/lib/external.d.ts","../node_modules/zod/lib/index.d.ts","../node_modules/zod/index.d.ts","../types.cts","../settings.cts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/globals.global.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/jsonfile/index.d.ts","../node_modules/@types/jsonfile/utils.d.ts","../node_modules/@types/fs-extra/index.d.ts","../cpp.cts","../node_modules/tree-kill/index.d.ts","../csharp.cts","../java.cts"],"fileInfos":[{"version":"824cb491a40f7e8fdeb56f1df5edf91b23f3e3ee6b4cde84d4a99be32338faee","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"87d693a4920d794a73384b3c779cadcb8548ac6945aa7a925832fe2418c9527a","affectsGlobalScope":true},{"version":"76f838d5d49b65de83bc345c04aa54c62a3cfdb72a477dc0c0fce89a30596c30","affectsGlobalScope":true},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true},{"version":"138fb588d26538783b78d1e3b2c2cc12d55840b97bf5e08bca7f7a174fbe2f17","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"b20fe0eca9a4e405f1a5ae24a2b3290b37cf7f21eba6cbe4fc3fab979237d4f3","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"49ed889be54031e1044af0ad2c603d627b8bda8b50c1a68435fe85583901d072","affectsGlobalScope":true},{"version":"e93d098658ce4f0c8a0779e6cab91d0259efb88a318137f686ad76f8410ca270","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"8073890e29d2f46fdbc19b8d6d2eb9ea58db9a2052f8640af20baff9afbc8640","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"13f6e6380c78e15e140243dc4be2fa546c287c6d61f4729bc2dd7cf449605471","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"807e0e0bdc67605dd28efe18f20ab5fcd75d944ef95936120702335f9379094b","5487b97cfa28b26b4a9ef0770f872bdbebd4c46124858de00f242c3eed7519f4","7a01f546ace66019156e4232a1bee2fabc2f8eabeb052473d926ee1693956265","fb53b1c6a6c799b7e3cc2de3fb5c9a1c04a1c60d4380a37792d84c5f8b33933b","8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","c2cb3c8ff388781258ea9ddbcd8a947f751bddd6886e1d3b3ea09ddaa895df80","f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","98a9cc18f661d28e6bd31c436e1984f3980f35e0f0aa9cf795c54f8ccb667ffe","c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","2a317fff5810a628d205a507998a77521120b462b03d36babf6eb387da991bee","f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802",{"version":"0e8210e953575253adcbd281ad25394dc839e28b6b6b204bdb92c2563a87f90b","signature":"66b8c0ccdd3c78425a0a3404062832b5de907d5d49a4a5972198da37ac7da261"},{"version":"a0faf348065305506294a0fb4f77668138a648ee7ea99824776a481c18ca2e8b","signature":"acb8dd08d6b5134cd84c0ac9d62b5cf23ae691fe1cfb8565be2ebe16eca3c03e"},"efc7d584a33fe3422847783d228f315c4cd1afe74bd7cf8e3f0e4c1125129fef","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1",{"version":"a14ed46fa3f5ffc7a8336b497cd07b45c2084213aaca933a22443fcb2eef0d07","affectsGlobalScope":true},"cce1f5f86974c1e916ec4a8cab6eec9aa8e31e8148845bf07fbaa8e1d97b1a2c",{"version":"7fd7fcbf021a5845bdd9397d4649fcf2fe17152d2098140fc723099a215d19ad","affectsGlobalScope":true},"df3389f71a71a38bc931aaf1ef97a65fada98f0a27f19dd12f8b8de2b0f4e461","7b43160a49cf2c6082da0465876c4a0b164e160b81187caeb0a6ca7a281e85ba",{"version":"41fb2a1c108fbf46609ce5a451b7ec78eb9b5ada95fd5b94643e4b26397de0b3","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb",{"version":"a1d2988ad9d2aef7b9915a22b5e52c165c83a878f2851c35621409046bbe3c05","affectsGlobalScope":true},"bd3f5d05b6b5e4bfcea7739a45f3ffb4a7f4a3442ba7baf93e0200799285b8f1","4c775c2fccabf49483c03cd5e3673f87c1ffb6079d98e7b81089c3def79e29c6","8806ae97308ef26363bd7ec8071bca4d07fb575f905ee3d8a91aff226df6d618","af5bf1db6f1804fb0069039ae77a05d60133c77a2158d9635ea27b6bb2828a8f","b7fe70be794e13d1b7940e318b8770cd1fb3eced7707805318a2e3aaac2c3e9e",{"version":"2c71199d1fc83bf17636ad5bf63a945633406b7b94887612bba4ef027c662b3e","affectsGlobalScope":true},{"version":"674168aa3db414ea0a19b2a31d901b2d49705c7a495e43ffdc96928543010f8c","affectsGlobalScope":true},"fe1fd6afdfe77976d4c702f3746c05fb05a7e566845c890e0e970fe9376d6a90","313a0b063f5188037db113509de1b934a0e286f14e9479af24fada241435e707","afb1701fd4be413a8a5a88df6befdd4510c30a31372c07a4138facf61594c66d","87ef1a23caa071b07157c72077fa42b86d30568f9dc9e31eed24d5d14fc30ba8","396a8939b5e177542bdf9b5262b4eee85d29851b2d57681fa9d7eae30e225830","21773f5ac69ddf5a05636ba1f50b5239f4f2d27e4420db147fc2f76a5ae598ac",{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true},"c07146dbbbd8b347241b5df250a51e48f2d7bef19b1e187b1a3f20c849988ff1","45b1053e691c5af9bfe85060a3e1542835f8d84a7e6e2e77ca305251eda0cb3c","0f05c06ff6196958d76b865ae17245b52d8fe01773626ac3c43214a2458ea7b7",{"version":"ae5507fc333d637dec9f37c6b3f4d423105421ea2820a64818de55db85214d66","affectsGlobalScope":true},{"version":"0666f4c99b8688c7be5956df8fecf5d1779d3b22f8f2a88258ae7072c7b6026f","affectsGlobalScope":true},"8abd0566d2854c4bd1c5e48e05df5c74927187f1541e6770001d9637ac41542e","54e854615c4eafbdd3fd7688bd02a3aafd0ccf0e87c98f79d3e9109f047ce6b8","d8dba11dc34d50cb4202de5effa9a1b296d7a2f4a029eec871f894bddfb6430d","8b71dd18e7e63b6f991b511a201fad7c3bf8d1e0dd98acb5e3d844f335a73634","01d8e1419c84affad359cc240b2b551fb9812b450b4d3d456b64cda8102d4f60","8221b00f271cf7f535a8eeec03b0f80f0929c7a16116e2d2df089b41066de69b","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","7424817d5eb498771e6d1808d726ec38f75d2eaf3fa359edd5c0c540c52725c1","9a9634296cca836c3308923ba7aa094fa6ed76bb1e366d8ddcf5c65888ab1024",{"version":"bddce945d552a963c9733db106b17a25474eefcab7fc990157a2134ef55d4954","affectsGlobalScope":true},{"version":"7052b7b0c3829df3b4985bab2fd74531074b4835d5a7b263b75c82f0916ad62f","affectsGlobalScope":true},"aa34c3aa493d1c699601027c441b9664547c3024f9dbab1639df7701d63d18fa","4b55240c2a03b2c71e98a7fc528b16136faa762211c92e781a01c37821915ea6","7c651f8dce91a927ab62925e73f190763574c46098f2b11fb8ddc1b147a6709a","7440ab60f4cb031812940cc38166b8bb6fbf2540cfe599f87c41c08011f0c1df",{"version":"94c086dff8dbc5998749326bc69b520e8e4273fb5b7b58b50e0210e0885dfcde","affectsGlobalScope":true},{"version":"f5b5dc128973498b75f52b1b8c2d5f8629869104899733ae485100c2309b4c12","affectsGlobalScope":true},"ebe5facd12fd7745cda5f4bc3319f91fb29dc1f96e57e9c6f8b260a7cc5b67ee","79bad8541d5779c85e82a9fb119c1fe06af77a71cc40f869d62ad379473d4b75","37dc027f781c75f0f546e329cfac7cf92a6b289f42458f47a9adc25e516b6839",{"version":"629d20681ca284d9e38c0a019f647108f5fe02f9c59ac164d56f5694fc3faf4d","affectsGlobalScope":true},"e7dbf5716d76846c7522e910896c5747b6df1abd538fee8f5291bdc843461795",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"b510d0a18e3db42ac9765d26711083ec1e8b4e21caaca6dc4d25ae6e8623f447","211440ce81e87b3491cdf07155881344b0a61566df6e749acff0be7e8b9d1a07","5d9a0b6e6be8dbb259f64037bce02f34692e8c1519f5cd5d467d7fa4490dced4","880da0e0f3ebca42f9bd1bc2d3e5e7df33f2619d85f18ee0ed4bd16d1800bc32",{"version":"60caceee9512baf05b4581ff527edae01315de7e118fd0cfd063630e5719217e","signature":"2f6007676f1b10310713ddde0d24f1ecd97310fb5ff0e103a7454394a6eb19f8"},"8323e3f5b91261ed250bd7c6b7aba2aa10f8e1c2ef348297c1f7752a403abebd",{"version":"c80b9cd15821480e77c56f488c971ad71128e70d68300f5ccbcecfc5d78831be","signature":"07fe03fc9da559b7d1f1f1dd575bdc399aec87f8aa72b06d313cfb3329530909"},{"version":"4499adcc0f309c7c9cbe74f8b7025a1c6e892da4953f48027f370d3a1b29627e","signature":"28e13d30e85e06577560d06dcbdb08bcc5758eb3d649592ddef0b9fe1f199135"}],"root":[64,65,155,157,158],"options":{"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":1,"outDir":"./","sourceMap":true,"strict":true,"target":3},"fileIdsList":[[64,65,103,123,124,144,154],[64,65,103,156],[64,65,103,124,144,156],[115,151,152,153],[115,143,151],[66],[101],[102,107,135],[103,114,115,122,132,143],[103,104,114,122],[105,144],[106,107,115,123],[107,132,140],[108,110,114,122],[101,109],[110,111],[114],[112,114],[101,114],[114,115,116,132,143],[114,115,116,129,132,135],[99,102,148],[110,114,117,122,132,143],[114,115,117,118,122,132,140,143],[117,119,132,140,143],[66,67,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150],[114,120],[121,143,148],[110,114,122,132],[123],[124],[101,125],[126,142,148],[127],[128],[114,129,130],[129,131,144,146],[102,114,132,133,134,135],[102,132,134],[132,133],[135],[136],[101,132],[114,138,139],[138,139],[107,122,132,140],[141],[122,142],[102,117,128,143],[107,144],[132,145],[121,146],[147],[102,107,114,116,125,132,143,146,148],[132,149],[76,80,143],[76,132,143],[71],[73,76,140,143],[122,140],[151],[71,151],[73,76,122,143],[68,69,72,75,102,114,132,143],[68,74],[72,76,102,135,143,151],[102,151],[92,102,151],[70,71,151],[76],[70,71,72,73,74,75,76,77,78,80,81,82,83,84,85,86,87,88,89,90,91,93,94,95,96,97,98],[76,83,84],[74,76,84,85],[75],[68,71,76],[76,80,84,85],[80],[74,76,79,143],[68,73,74,76,80,83],[102,132],[71,76,92,102,148,151],[62],[53,54],[51,52,53,55,56,60],[52,53],[61],[53],[51,52,53,56,57,58,59],[51,52,62],[63],[64]],"referencedMap":[[155,1],[157,2],[158,3],[154,4],[152,5],[66,6],[67,6],[101,7],[102,8],[103,9],[104,10],[105,11],[106,12],[107,13],[108,14],[109,15],[110,16],[111,16],[113,17],[112,18],[114,19],[115,20],[116,21],[100,22],[117,23],[118,24],[119,25],[151,26],[120,27],[121,28],[122,29],[123,30],[124,31],[125,32],[126,33],[127,34],[128,35],[129,36],[130,36],[131,37],[132,38],[134,39],[133,40],[135,41],[136,42],[137,43],[138,44],[139,45],[140,46],[141,47],[142,48],[143,49],[144,50],[145,51],[146,52],[147,53],[148,54],[149,55],[83,56],[90,57],[82,56],[97,58],[74,59],[73,60],[96,61],[91,62],[94,63],[76,64],[75,65],[71,66],[70,67],[93,68],[72,69],[77,70],[81,70],[99,71],[98,70],[85,72],[86,73],[88,74],[84,75],[87,76],[92,61],[79,77],[80,78],[89,79],[69,80],[95,81],[63,82],[55,83],[61,84],[56,85],[59,82],[62,86],[54,87],[60,88],[53,89],[64,90]],"exportedModulesMap":[[155,91],[157,91],[158,91],[154,4],[152,5],[66,6],[67,6],[101,7],[102,8],[103,9],[104,10],[105,11],[106,12],[107,13],[108,14],[109,15],[110,16],[111,16],[113,17],[112,18],[114,19],[115,20],[116,21],[100,22],[117,23],[118,24],[119,25],[151,26],[120,27],[121,28],[122,29],[123,30],[124,31],[125,32],[126,33],[127,34],[128,35],[129,36],[130,36],[131,37],[132,38],[134,39],[133,40],[135,41],[136,42],[137,43],[138,44],[139,45],[140,46],[141,47],[142,48],[143,49],[144,50],[145,51],[146,52],[147,53],[148,54],[149,55],[83,56],[90,57],[82,56],[97,58],[74,59],[73,60],[96,61],[91,62],[94,63],[76,64],[75,65],[71,66],[70,67],[93,68],[72,69],[77,70],[81,70],[99,71],[98,70],[85,72],[86,73],[88,74],[84,75],[87,76],[92,61],[79,77],[80,78],[89,79],[69,80],[95,81],[63,82],[55,83],[61,84],[56,85],[59,82],[62,86],[54,87],[60,88],[53,89],[64,90]],"semanticDiagnosticsPerFile":[[155,[{"file":"../cpp.cts","start":269,"length":6,"messageText":"Cannot find module 'kill' or its corresponding type declarations.","category":1,"code":2307}]],[157,[{"file":"../csharp.cts","start":2403,"length":4,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type '{ default: { (pid: number, callback?: ((error?: Error | undefined) => void) | undefined): void; (pid: number, signal?: string | number | undefined, callback?: ((error?: Error | undefined) => void) | undefined): void; }; }' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"file":"../csharp.cts","start":39,"length":34,"messageText":"Type originates at this import. A namespace-style import cannot be called or constructed, and will cause a failure at runtime. Consider using a default import or import require here instead.","category":3,"code":7038}]},{"file":"../csharp.cts","start":2605,"length":4,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type '{ default: { (pid: number, callback?: ((error?: Error | undefined) => void) | undefined): void; (pid: number, signal?: string | number | undefined, callback?: ((error?: Error | undefined) => void) | undefined): void; }; }' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"file":"../csharp.cts","start":39,"length":34,"messageText":"Type originates at this import. A namespace-style import cannot be called or constructed, and will cause a failure at runtime. Consider using a default import or import require here instead.","category":3,"code":7038}]}]],158,154,152,153,66,67,101,102,103,104,105,106,107,108,109,110,111,113,112,114,115,116,100,150,117,118,119,151,120,121,122,123,124,125,126,127,128,129,130,131,132,134,133,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,156,48,49,8,9,13,12,2,14,15,16,17,18,19,20,21,3,50,22,4,23,27,24,25,26,28,29,30,5,31,32,33,34,6,38,35,36,37,39,7,40,45,46,41,42,43,44,1,47,11,10,83,90,82,97,74,73,96,91,94,76,75,71,70,93,72,77,78,81,68,99,98,85,86,88,84,87,92,79,80,89,69,95,63,55,61,57,58,56,59,51,52,62,54,60,53,65,64],"latestChangedDtsFile":"./java.d.cts"},"version":"5.4.2"} \ No newline at end of file diff --git a/shared/submission-runner/dist/types.cjs b/shared/submission-runner/dist/types.cjs new file mode 100644 index 0000000..6328ef9 --- /dev/null +++ b/shared/submission-runner/dist/types.cjs @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RunResultZod = void 0; +const zod_1 = require("zod"); +const RunResultKind = zod_1.z.enum([ + 'CompileFailed', + 'TimeLimitExceeded', + 'Completed', + 'SandboxError', + 'RunError' +]); +exports.RunResultZod = zod_1.z + .object({ + kind: RunResultKind, + output: zod_1.z.string().optional(), + exitCode: zod_1.z.number().optional(), + runtimeMilliseconds: zod_1.z.number().optional(), + resultKindReason: zod_1.z.string().optional() +}) + .strict(); +//# sourceMappingURL=types.cjs.map \ No newline at end of file diff --git a/shared/submission-runner/dist/types.cjs.map b/shared/submission-runner/dist/types.cjs.map new file mode 100644 index 0000000..ce0c025 --- /dev/null +++ b/shared/submission-runner/dist/types.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../types.cts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,MAAM,aAAa,GAAG,OAAC,CAAC,IAAI,CAAC;IAC5B,eAAe;IACf,mBAAmB;IACnB,WAAW;IACX,cAAc;IACd,UAAU;CACV,CAAC,CAAC;AAIU,QAAA,YAAY,GAAG,OAAC;KAC3B,MAAM,CAAC;IACP,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,mBAAmB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1C,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC;KACD,MAAM,EAAE,CAAC"} \ No newline at end of file diff --git a/shared/submission-runner/dist/types.d.cts b/shared/submission-runner/dist/types.d.cts new file mode 100644 index 0000000..fc8d6af --- /dev/null +++ b/shared/submission-runner/dist/types.d.cts @@ -0,0 +1,39 @@ +import { z } from 'zod'; +declare const RunResultKind: z.ZodEnum<["CompileFailed", "TimeLimitExceeded", "Completed", "SandboxError", "RunError"]>; +export type RunResultKind = z.infer; +export declare const RunResultZod: z.ZodObject<{ + kind: z.ZodEnum<["CompileFailed", "TimeLimitExceeded", "Completed", "SandboxError", "RunError"]>; + output: z.ZodOptional; + exitCode: z.ZodOptional; + runtimeMilliseconds: z.ZodOptional; + resultKindReason: z.ZodOptional; +}, "strict", z.ZodTypeAny, { + kind: "CompileFailed" | "TimeLimitExceeded" | "Completed" | "SandboxError" | "RunError"; + output?: string | undefined; + exitCode?: number | undefined; + runtimeMilliseconds?: number | undefined; + resultKindReason?: string | undefined; +}, { + kind: "CompileFailed" | "TimeLimitExceeded" | "Completed" | "SandboxError" | "RunError"; + output?: string | undefined; + exitCode?: number | undefined; + runtimeMilliseconds?: number | undefined; + resultKindReason?: string | undefined; +}>; +export type RunResult = z.infer; +export interface IRunnerParams { + srcDir: string; + input: string; + outputCallback?: (data: string) => void; +} +export type IRunnerReturn = { + success: true; + killFunc: () => void; + runResult: Promise; +} | { + success: false; + runResult: RunResult; +}; +export type IRunner = (params: T) => Promise; +export {}; +//# sourceMappingURL=types.d.cts.map \ No newline at end of file diff --git a/shared/submission-runner/dist/types.d.cts.map b/shared/submission-runner/dist/types.d.cts.map new file mode 100644 index 0000000..de98fb7 --- /dev/null +++ b/shared/submission-runner/dist/types.d.cts.map @@ -0,0 +1 @@ +{"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../types.cts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,aAAa,4FAMjB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAQf,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,MAAM,aAAa,GACxB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;CAAE,GACtE;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,IAC1D,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC"} \ No newline at end of file diff --git a/shared/submissionRunner/java.cts b/shared/submission-runner/java.cts similarity index 100% rename from shared/submissionRunner/java.cts rename to shared/submission-runner/java.cts diff --git a/shared/submissionRunner/package-lock.json b/shared/submission-runner/package-lock.json similarity index 100% rename from shared/submissionRunner/package-lock.json rename to shared/submission-runner/package-lock.json diff --git a/shared/submissionRunner/package.json b/shared/submission-runner/package.json similarity index 89% rename from shared/submissionRunner/package.json rename to shared/submission-runner/package.json index 9e2139e..a8f6189 100644 --- a/shared/submissionRunner/package.json +++ b/shared/submission-runner/package.json @@ -1,4 +1,5 @@ { + "name": "submission-runner", "scripts": { "build": "tsc" }, diff --git a/shared/submissionRunner/settings.cts b/shared/submission-runner/settings.cts similarity index 100% rename from shared/submissionRunner/settings.cts rename to shared/submission-runner/settings.cts diff --git a/shared/submissionRunner/tsconfig.json b/shared/submission-runner/tsconfig.json similarity index 81% rename from shared/submissionRunner/tsconfig.json rename to shared/submission-runner/tsconfig.json index 6a80e3d..d927d5c 100644 --- a/shared/submissionRunner/tsconfig.json +++ b/shared/submission-runner/tsconfig.json @@ -6,9 +6,9 @@ "declaration": true, "declarationMap": true, "sourceMap": true, - "outDir": "./build", + "outDir": "./dist", "esModuleInterop": true, "strict": true, }, - "include": ["/**/*.cts"] + "include": ["*.cts"] } \ No newline at end of file diff --git a/shared/submissionRunner/types.cts b/shared/submission-runner/types.cts similarity index 100% rename from shared/submissionRunner/types.cts rename to shared/submission-runner/types.cts diff --git a/shared/submissionRunner/.gitignore b/shared/submissionRunner/.gitignore deleted file mode 100644 index 8c08c51..0000000 --- a/shared/submissionRunner/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -/build diff --git a/shared/submissionRunner/cpp.cts b/shared/submissionRunner/cpp.cts deleted file mode 100644 index 9735a1c..0000000 --- a/shared/submissionRunner/cpp.cts +++ /dev/null @@ -1,139 +0,0 @@ -import { join } from 'path'; -import { exec, spawn } from 'child_process'; -import util from 'util'; -import type { IRunner, IRunnerParams, IRunnerReturn, RunResult } from './types.cjs'; -import { timeoutSeconds } from './settings.cjs'; -import kill from 'tree-kill'; -import os from 'os'; -import fs from 'fs-extra'; - -const execPromise = util.promisify(exec); - -export type CppPlatform = 'VisualStudio' | 'GCC'; - -interface IRunnerParamsCpp extends IRunnerParams { - srcDir: string; - problemName: string; - input: string; - cppPlatform: CppPlatform; - outputCallback?: (data: string) => void; -} - -export const runCpp: IRunner = async function ( - params: IRunnerParamsCpp -): Promise { - const tmpDir = os.tmpdir(); - const buildDir = join(tmpDir, 'bwcontest-cpp'); - if (fs.existsSync(buildDir)) { - fs.removeSync(buildDir); - } - fs.mkdirSync(buildDir); - - console.log(`- BUILD: ${params.problemName}`); - - const configureCommand = `cmake -S ${params.srcDir} -B ${buildDir}`; - try { - await execPromise(configureCommand); - } catch (e) { - const buildErrorText = e?.toString() ?? 'Unknown build errors.'; - console.log('Build errors: ' + buildErrorText); - return { - success: false, - runResult: { kind: 'CompileFailed', resultKindReason: buildErrorText } - }; - } - - const compileCommand = `cmake --build ${buildDir} --target ${params.problemName}`; - try { - await execPromise(compileCommand); - } catch (e) { - const buildErrorText = e?.toString() ?? 'Unknown build errors.'; - console.log('Build errors: ' + buildErrorText); - return { - success: false, - runResult: { kind: 'CompileFailed', resultKindReason: buildErrorText } - }; - } - - console.log(`- RUN: ${params.problemName}`); - - let runCommand = ''; - if (params.cppPlatform === 'VisualStudio') { - runCommand = `${join(buildDir, 'Debug', `${params.problemName}.exe`)}`; - } else { - runCommand = `${join(buildDir, params.problemName)}`; - } - try { - let outputBuffer = ''; - const child = spawn(runCommand, { shell: true }); - child.stdout.setEncoding('utf8'); - child.stdout.on('data', (data) => { - outputBuffer += data.toString(); - }); - child.stderr.setEncoding('utf8'); - child.stderr.on('data', (data) => { - outputBuffer += data.toString(); - }); - - const runStartTime = performance.now(); - child.stdin.write(params.input); - child.stdin.end(); - - let timeLimitExceeded = false; - let completedNormally = false; - - return { - success: true, - runResult: new Promise((resolve) => { - child.on('close', () => { - completedNormally = !timeLimitExceeded; - - const runEndTime = performance.now(); - const runtimeMilliseconds = Math.floor(runEndTime - runStartTime); - - if (completedNormally) { - clearTimeout(timeoutHandle); - resolve({ - kind: 'Completed', - output: outputBuffer, - exitCode: child.exitCode!, - runtimeMilliseconds - }); - } else { - console.log(`Process terminated, total sandbox time: ${runtimeMilliseconds}ms`); - resolve({ - kind: 'TimeLimitExceeded', - output: outputBuffer, - resultKindReason: `Timeout after ${timeoutSeconds} seconds` - }); - } - }); - - const timeoutHandle = setTimeout(() => { - if (completedNormally) { - return; - } - - console.log(`Run timed out after ${timeoutSeconds} seconds, killing process...`); - timeLimitExceeded = true; - - child.stdin.end(); - child.stdin.destroy(); - child.stdout.destroy(); - child.stderr.destroy(); - child.kill('SIGKILL'); - }, timeoutSeconds * 1000); - }), - killFunc() { - if (child.pid !== undefined) { - if (!completedNormally && !timeLimitExceeded) { - kill(child.pid); - params.outputCallback?.('\n[Manually stopped]'); - } - } - } - }; - } catch (error) { - return { success: false, runResult: { kind: 'RunError' } }; - } -}; diff --git a/shared/submissionRunner/csharp.cts b/shared/submissionRunner/csharp.cts deleted file mode 100644 index 17cced7..0000000 --- a/shared/submissionRunner/csharp.cts +++ /dev/null @@ -1,90 +0,0 @@ -import { spawn } from 'child_process'; -import kill from 'tree-kill'; -import type { IRunner, IRunnerReturn, RunResult } from './types.cjs'; -import { timeoutSeconds } from './settings.cjs'; - -export const runCSharp: IRunner = async function (params: { - srcDir: string; - input: string; - outputCallback?: (data: string) => void; -}): Promise { - console.log(`- RUN: ${params.srcDir}`); - const child = spawn('dotnet run', { shell: true, cwd: params.srcDir }); - - try { - let outputBuffer = ''; - child.stdout.setEncoding('utf8'); - child.stdout.on('data', (data) => { - outputBuffer += data.toString(); - params.outputCallback?.(data.toString()); - }); - child.stderr.setEncoding('utf8'); - child.stderr.on('data', (data) => { - outputBuffer += data.toString(); - params.outputCallback?.(data.toString()); - }); - - const runStartTime = performance.now(); - child.stdin.write(params.input); - child.stdin.end(); - - let timeLimitExceeded = false; - let completedNormally = false; - - return { - success: true, - runResult: new Promise((resolve) => { - child.on('close', () => { - completedNormally = !timeLimitExceeded; - - const runEndTime = performance.now(); - const runtimeMilliseconds = Math.floor(runEndTime - runStartTime); - - if (completedNormally) { - clearTimeout(timeoutHandle); - resolve({ - kind: 'Completed', - output: outputBuffer, - exitCode: child.exitCode!, - runtimeMilliseconds - }); - } else { - console.log(`Process terminated, total sandbox time: ${runtimeMilliseconds}ms`); - resolve({ - kind: 'TimeLimitExceeded', - output: outputBuffer, - resultKindReason: `Timeout after ${timeoutSeconds} seconds` - }); - } - }); - - const timeoutHandle = setTimeout(() => { - if (completedNormally) { - return; - } - - console.log(`Run timed out after ${timeoutSeconds} seconds, killing process...`); - timeLimitExceeded = true; - - child.stdin.end(); - child.stdin.destroy(); - child.stdout.destroy(); - child.stderr.destroy(); - if (child.pid !== undefined) { - kill(child.pid); - } - }, timeoutSeconds * 1000); - }), - killFunc() { - if (child.pid !== undefined) { - if (!completedNormally && !timeLimitExceeded) { - kill(child.pid); - params.outputCallback?.('\n[Manually stopped]'); - } - } - } - }; - } catch (error) { - return { success: false, runResult: { kind: 'RunError' } }; - } -};