diff --git a/MODEL_CARD.md b/MODEL_CARD.md index ca69c85..5bab064 100644 --- a/MODEL_CARD.md +++ b/MODEL_CARD.md @@ -5,7 +5,7 @@ - File: `assets/magika/source-student-q4.bin` - Format: weights-only MSQ1 quantized tensor payload - Size: 47,840 bytes -- SHA-256: `59ef24167bddd1364eb9c1650add8a67e1a542b5155fac67f5e1cda07df0c0f0` +- SHA-256: `8493d2d3757572c8661141e414b1c0755aa08d4c4e5382dfbbc6b73b02d89083` - Architecture: `wordseq-b1024-k3-m2048-tiny-3conv-hidden` - Tokenizer: word-unit tokenizer version 3 - Output head: 48 model labels exposed one-to-one as public `Language` variants @@ -19,10 +19,32 @@ decisions, malware classification, or legal identification of file provenance. ## Training Source -The student was trained from Google's Magika v3.3 teacher predictions over a -source-language corpus assembled from extension-suffixed files. The corpus used -for the shipped model was the `bigorig` split, extracted from a GitHub -partial-clone blob index of roughly 6,000 popular code repositories. +The student was originally trained from Google's Magika v3.3 teacher +predictions over a source-language corpus assembled from extension-suffixed +files (the `bigorig` split, extracted from a GitHub partial-clone blob index of +roughly 6,000 popular code repositories). + +The shipped artifact is that model fine-tuned from its exported checkpoint on a +rebuilt public corpus (see `scripts/build_finetune_corpus.py`): per-language +samples from `bigcode/the-stack-smol-xl` and `bigcode/the-stack`, GitHub repo +files for labels absent from The Stack, and a small synthetic set targeting the +Markdown/YAML bare-list ambiguity reported in issue #5, including train-only +bare `- item` lists. + +The fine-tune distills the same Magika v3.3 teacher one-vs-all: per-class +binary cross-entropy against the teacher's raw head-label marginals, plus a +hard term against the teacher argmax discounted by the teacher's in-head +probability mass. Unlike the original softmax distillation, this never +renormalizes away the probability mass the teacher assigns to labels outside +the 48-label head (such as `txt`), so inputs the teacher considers ambiguous +or out-of-scope train toward uniformly low logits and keep low softmax +confidence at inference. + +The shipped run additionally self-distills from a ~2x larger intermediate +parent (`wordseq-b1536-k3-m2048-med-3conv-hidden`, 0.9492 test teacher parity) +trained on the same corpus with the same one-vs-all scheme; the parent's +per-class sigmoid marginals are cached with `scripts/cache_self_distill.py` +and added as a second BCE term. The model distills teacher probabilities and filesystem-extension labels. It does not contain original source files, but its labels and soft targets are @@ -30,10 +52,30 @@ derived from the training corpus and Magika teacher. ## Evaluation -Manifest-aligned held-out filesystem-label test split: +Held-out filesystem-label test split of the rebuilt corpus (34,087 files, +train/valid/test repositories are disjoint, rows where the teacher keeps at +most 10% of its probability mass on the head labels are excluded): -- `test_fs_accuracy=0.965238` -- `macro_recall=0.965411` +- `test_fs_accuracy=0.942353` +- `macro_recall=0.939690` +- `test_teacher_parity=0.944055` + +For comparison, the pre-fine-tune artifact scores `test_fs_accuracy=0.926160`, +`macro_recall=0.929904`, and `test_teacher_parity=0.922111` on the same split. +The rebuilt split is balanced across all 48 labels (including rare classes), +so these numbers are not comparable to the `bigorig` metrics reported for +earlier artifacts. + +On ambiguous bare `- item` lists (valid YAML and valid Markdown), the median +top-1 probability drops from 0.92 (pre-fine-tune) to 0.51, while YAML or +Markdown remains the top prediction. + +Most remaining confusion sits on genuinely ambiguous pairs where the teacher +also splits its probability on the confused files: `c`/`cpp`, +`javascript`/`typescript`, `markdown`/`yaml`, `ini`/`toml`, `batch`/`shell`, +and `php`/`html`. Several other cells are corpus extension-label noise (for +example `.vb` files containing SQL dumps) where the teacher agrees with the +model on 80%+ of the confused files. The README confusion matrix groups the same held-out split by file-size bucket. @@ -42,7 +84,10 @@ The README confusion matrix groups the same held-out split by file-size bucket. - Very short inputs are intentionally rejected when fewer than eight non-whitespace bytes are available. - Ambiguous snippets can put several languages close together even when a human - can infer the language from file naming context. + can infer the language from file naming context. A bare `- item` list with no + heading is valid YAML and valid Markdown; the model reports a split + YAML/Markdown distribution for such inputs rather than picking one with + certainty. - The classifier uses content only. It does not inspect file names, extensions, shebangs outside the model window, repository metadata, or build-system context. diff --git a/README.md b/README.md index 5b9c2b0..67ae610 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ one-to-one with no label aggregation. The confusion matrix uses the same labels: -![Betlang wordseq confusion](https://raw.githubusercontent.com/ealmloff/betlang/92da743c8c97fd11bb57645ec394371ee7cf836f/assets/confusion-overall.png) +![Betlang wordseq confusion](https://raw.githubusercontent.com/ealmloff/betlang/issue5-ova-calibration/assets/confusion-overall.png) ## Model @@ -48,12 +48,13 @@ The embedded model is `assets/magika/source-student-q4.bin`, a 47,840-byte weights-only MSQ1 payload with SHA-256: ```text -59ef24167bddd1364eb9c1650add8a67e1a542b5155fac67f5e1cda07df0c0f0 +8493d2d3757572c8661141e414b1c0755aa08d4c4e5382dfbbc6b73b02d89083 ``` Architecture: `wordseq-b1024-k3-m2048-tiny-3conv-hidden`, tokenizer version 3. -On the manifest-aligned held-out filesystem-label test split it reaches -`test_fs_accuracy=0.965238` with `macro_recall=0.965411`. +On the held-out filesystem-label test split it reaches +`test_fs_accuracy=0.942353` with `macro_recall=0.939690`. Probabilities are +calibrated: ambiguous inputs report split scores instead of a confident label. See [MODEL_CARD.md](MODEL_CARD.md) for the training and evaluation summary. @@ -75,9 +76,9 @@ Apache-2.0. Keep this attribution with redistributed model artifacts. ## Confusion By File Size -The shipped wordseq model is evaluated below on the held-out `bigorig` test -split. Each panel is a row-normalized confusion matrix for one file-size -bucket: actual labels are rows, predicted labels are columns, and the diagonal -is correct classification. +The shipped wordseq model is evaluated below on the held-out test split. Each +panel is a row-normalized confusion matrix for one file-size bucket: actual +labels are rows, predicted labels are columns, and the diagonal is correct +classification. -![Betlang wordseq confusion by file size](https://raw.githubusercontent.com/ealmloff/betlang/92da743c8c97fd11bb57645ec394371ee7cf836f/assets/confusion-by-size.png) +![Betlang wordseq confusion by file size](https://raw.githubusercontent.com/ealmloff/betlang/issue5-ova-calibration/assets/confusion-by-size.png) diff --git a/_typos.toml b/_typos.toml index 196a295..441c4d5 100644 --- a/_typos.toml +++ b/_typos.toml @@ -9,3 +9,5 @@ extend-exclude = [ [default.extend-words] cpy = "cpy" edn = "edn" +# Verilog data-out signal name used by the synthetic hard-pair generator. +dout = "dout" diff --git a/assets/confusion-by-size.png b/assets/confusion-by-size.png index 8b0f50c..9d7d578 100644 Binary files a/assets/confusion-by-size.png and b/assets/confusion-by-size.png differ diff --git a/assets/confusion-overall.png b/assets/confusion-overall.png index c5f9015..5737764 100644 Binary files a/assets/confusion-overall.png and b/assets/confusion-overall.png differ diff --git a/assets/magika/source-student-q4.bin b/assets/magika/source-student-q4.bin index c9b5308..e354bc3 100644 Binary files a/assets/magika/source-student-q4.bin and b/assets/magika/source-student-q4.bin differ diff --git a/examples/detect.rs b/examples/detect.rs index 78a165e..bf10938 100644 --- a/examples/detect.rs +++ b/examples/detect.rs @@ -13,7 +13,7 @@ use std::collections::HashMap; use std::fs; -use std::io::{self, Read}; +use std::io::{self, Read, Seek, SeekFrom}; use std::path::{Path, PathBuf}; use std::process::ExitCode; @@ -58,8 +58,8 @@ fn detect_stdin() -> ExitCode { } fn detect_file(path: &Path) -> ExitCode { - let bytes = match fs::read(path) { - Ok(bytes) => bytes, + let (bytes, _) = match read_model_window(path) { + Ok(window) => window, Err(err) => { eprintln!("betlang: failed to read {}: {err}", path.display()); return ExitCode::from(2); @@ -68,6 +68,29 @@ fn detect_file(path: &Path) -> ExitCode { report_single(betlang::detect(bytes)) } +/// The model only inspects the first and last 4096 bytes of a file, so read +/// just those two windows instead of the whole file. `build_window` derives +/// its begin/end blocks from `source[..4096]` and `source[len - 4096..]`, +/// which the concatenated head + tail preserves exactly. Returns the window +/// bytes and the file's real size. +fn read_model_window(path: &Path) -> io::Result<(Vec, u64)> { + const BLOCK: u64 = 4096; + + let mut file = fs::File::open(path)?; + let size = file.metadata()?.len(); + if size <= 2 * BLOCK { + let mut bytes = Vec::with_capacity(size as usize); + file.read_to_end(&mut bytes)?; + return Ok((bytes, size)); + } + + let mut bytes = vec![0u8; (2 * BLOCK) as usize]; + file.read_exact(&mut bytes[..BLOCK as usize])?; + file.seek(SeekFrom::End(-(BLOCK as i64)))?; + file.read_exact(&mut bytes[BLOCK as usize..])?; + Ok((bytes, size)) +} + fn report_single(detection: betlang::Detection) -> ExitCode { match detection.language() { Some(language) => { @@ -247,8 +270,7 @@ fn display_name(path: &Path, root: &Path, depth: usize) -> String { } fn classify_file(path: &Path) -> Option<(Option, u64)> { - let bytes = fs::read(path).ok()?; - let size = bytes.len() as u64; + let (bytes, size) = read_model_window(path).ok()?; let language = betlang::detect(bytes).language(); Some((language, size)) } diff --git a/reports/actual_dataset_confusion_by_size.csv b/reports/actual_dataset_confusion_by_size.csv index e212fa6..4239ed0 100644 --- a/reports/actual_dataset_confusion_by_size.csv +++ b/reports/actual_dataset_confusion_by_size.csv @@ -1,2452 +1,1032 @@ split,bucket,actual,predicted,count,bytes -test,<=128B,asm,asm,84,6651 -test,<=128B,asm,batch,10,282 -test,<=128B,asm,c,6,290 -test,<=128B,asm,cmake,2,68 -test,<=128B,asm,cpp,1,86 -test,<=128B,asm,ini,5,232 -test,<=128B,asm,json,2,159 -test,<=128B,asm,markdown,5,147 -test,<=128B,asm,ruby,1,21 -test,<=128B,asm,yaml,2,98 -test,<=128B,batch,asm,2,117 -test,<=128B,batch,batch,979,64031 -test,<=128B,batch,clojure,1,77 -test,<=128B,batch,cmake,1,50 -test,<=128B,batch,groovy,1,110 -test,<=128B,batch,haskell,1,22 -test,<=128B,batch,ini,8,349 -test,<=128B,batch,markdown,12,502 -test,<=128B,batch,perl,2,34 -test,<=128B,batch,powershell,5,358 -test,<=128B,batch,ruby,1,62 -test,<=128B,batch,shell,35,2139 -test,<=128B,batch,sql,1,97 -test,<=128B,batch,vba,1,50 -test,<=128B,batch,yaml,1,36 -test,<=128B,c,batch,12,423 -test,<=128B,c,c,242,18710 -test,<=128B,c,cpp,7,571 -test,<=128B,c,css,1,43 -test,<=128B,c,dart,1,48 -test,<=128B,c,ini,2,38 -test,<=128B,c,markdown,2,101 -test,<=128B,c,objectivec,1,65 -test,<=128B,c,shell,1,11 -test,<=128B,clojure,asm,1,46 -test,<=128B,clojure,batch,2,90 -test,<=128B,clojure,clojure,165,14243 -test,<=128B,clojure,css,1,36 -test,<=128B,clojure,ini,2,81 -test,<=128B,clojure,json,4,249 -test,<=128B,clojure,lisp,8,709 -test,<=128B,clojure,markdown,1,25 -test,<=128B,clojure,ocaml,3,157 -test,<=128B,clojure,powershell,1,85 -test,<=128B,clojure,scala,1,19 -test,<=128B,clojure,verilog,1,89 -test,<=128B,cmake,asm,2,169 -test,<=128B,cmake,batch,6,465 -test,<=128B,cmake,c,1,112 -test,<=128B,cmake,cmake,555,45213 -test,<=128B,cmake,gradle,1,40 -test,<=128B,cmake,ini,6,183 -test,<=128B,cmake,javascript,1,54 -test,<=128B,cmake,lisp,3,260 -test,<=128B,cmake,lua,4,193 -test,<=128B,cmake,markdown,9,469 -test,<=128B,cmake,powershell,1,77 -test,<=128B,cmake,r,1,68 -test,<=128B,cmake,shell,8,528 -test,<=128B,cmake,yaml,8,645 -test,<=128B,cobol,cobol,1,118 -test,<=128B,cpp,batch,8,432 -test,<=128B,cpp,c,50,3465 -test,<=128B,cpp,cmake,2,63 -test,<=128B,cpp,cpp,90,8023 -test,<=128B,cpp,css,1,60 -test,<=128B,cpp,html,1,45 -test,<=128B,cpp,json,1,94 -test,<=128B,cpp,markdown,5,90 -test,<=128B,cpp,perl,1,126 -test,<=128B,cpp,powershell,2,80 -test,<=128B,cpp,shell,1,35 -test,<=128B,cpp,sql,1,44 -test,<=128B,cs,cs,19,1922 -test,<=128B,cs,groovy,1,123 -test,<=128B,cs,java,8,781 -test,<=128B,cs,javascript,1,84 -test,<=128B,css,asm,2,62 -test,<=128B,css,batch,8,300 -test,<=128B,css,c,5,272 -test,<=128B,css,css,303,20684 -test,<=128B,css,html,1,15 -test,<=128B,css,ini,8,234 -test,<=128B,css,javascript,4,213 -test,<=128B,css,markdown,2,110 -test,<=128B,css,perl,1,39 -test,<=128B,css,powershell,1,77 -test,<=128B,css,yaml,1,18 -test,<=128B,dart,c,1,25 -test,<=128B,dart,cmake,1,118 -test,<=128B,dart,dart,149,12197 -test,<=128B,dart,groovy,7,401 -test,<=128B,dart,java,1,40 -test,<=128B,dart,javascript,2,74 -test,<=128B,dart,markdown,3,149 -test,<=128B,dart,objectivec,2,98 -test,<=128B,dart,ocaml,1,14 -test,<=128B,dart,perl,2,98 -test,<=128B,dart,python,1,16 -test,<=128B,dart,typescript,6,393 -test,<=128B,dockerfile,batch,1,75 -test,<=128B,dockerfile,dockerfile,264,22079 -test,<=128B,dockerfile,html,1,36 -test,<=128B,dockerfile,ini,3,47 -test,<=128B,dockerfile,scala,2,238 -test,<=128B,dockerfile,shell,1,25 -test,<=128B,elixir,asm,2,144 -test,<=128B,elixir,batch,3,118 -test,<=128B,elixir,elixir,438,35788 -test,<=128B,elixir,ini,1,55 -test,<=128B,elixir,json,2,141 -test,<=128B,elixir,julia,1,123 -test,<=128B,elixir,lua,2,106 -test,<=128B,elixir,markdown,1,27 -test,<=128B,elixir,ruby,3,210 -test,<=128B,elixir,scala,1,45 -test,<=128B,elixir,verilog,1,31 -test,<=128B,elixir,yaml,2,93 -test,<=128B,erlang,batch,1,35 -test,<=128B,erlang,erlang,51,4554 -test,<=128B,erlang,javascript,1,82 -test,<=128B,erlang,json,1,42 -test,<=128B,erlang,lisp,1,67 -test,<=128B,erlang,lua,1,27 -test,<=128B,erlang,objectivec,1,46 -test,<=128B,erlang,perl,3,257 -test,<=128B,erlang,yaml,4,345 -test,<=128B,gemfile,gemfile,179,13969 -test,<=128B,gemfile,markdown,2,31 -test,<=128B,go,go,143,12074 -test,<=128B,go,groovy,2,153 -test,<=128B,go,ini,1,31 -test,<=128B,go,javascript,1,56 -test,<=128B,go,markdown,2,67 -test,<=128B,go,scala,3,193 -test,<=128B,go,sql,1,35 -test,<=128B,go,typescript,2,82 -test,<=128B,gradle,gemfile,1,57 -test,<=128B,gradle,gradle,384,16220 -test,<=128B,gradle,groovy,1,115 -test,<=128B,gradle,ini,3,142 -test,<=128B,gradle,javascript,1,15 -test,<=128B,gradle,markdown,3,187 -test,<=128B,gradle,scala,1,110 -test,<=128B,groovy,dart,1,71 -test,<=128B,groovy,groovy,51,4433 -test,<=128B,groovy,ini,1,70 -test,<=128B,groovy,java,2,153 -test,<=128B,groovy,javascript,1,53 -test,<=128B,groovy,kotlin,4,327 -test,<=128B,groovy,lua,1,88 -test,<=128B,groovy,powershell,1,38 -test,<=128B,groovy,python,1,126 -test,<=128B,groovy,scala,3,174 -test,<=128B,groovy,typescript,1,37 -test,<=128B,groovy,verilog,1,64 -test,<=128B,haskell,asm,2,124 -test,<=128B,haskell,batch,1,41 -test,<=128B,haskell,c,6,373 -test,<=128B,haskell,clojure,1,42 -test,<=128B,haskell,elixir,1,91 -test,<=128B,haskell,haskell,158,13619 -test,<=128B,haskell,ini,22,1085 -test,<=128B,haskell,lua,1,71 -test,<=128B,haskell,markdown,4,45 -test,<=128B,haskell,python,5,305 -test,<=128B,haskell,r,2,171 -test,<=128B,haskell,ruby,1,79 -test,<=128B,haskell,shell,2,89 -test,<=128B,haskell,sql,4,235 -test,<=128B,html,asm,1,43 -test,<=128B,html,batch,9,290 -test,<=128B,html,html,162,11739 -test,<=128B,html,ini,7,158 -test,<=128B,html,json,1,10 -test,<=128B,html,markdown,19,675 -test,<=128B,html,php,2,127 -test,<=128B,html,r,2,150 -test,<=128B,html,sql,1,26 -test,<=128B,html,verilog,1,121 -test,<=128B,html,xml,7,502 -test,<=128B,html,yaml,4,234 -test,<=128B,ini,asm,2,162 -test,<=128B,ini,batch,4,291 -test,<=128B,ini,cobol,1,20 -test,<=128B,ini,ini,221,14205 -test,<=128B,ini,json,2,122 -test,<=128B,ini,markdown,7,206 -test,<=128B,ini,powershell,1,104 -test,<=128B,ini,shell,1,72 -test,<=128B,ini,sql,1,102 -test,<=128B,ini,toml,2,114 -test,<=128B,ini,typescript,1,126 -test,<=128B,ini,xml,1,53 -test,<=128B,ini,yaml,2,179 -test,<=128B,java,batch,1,25 -test,<=128B,java,c,1,68 -test,<=128B,java,groovy,1,105 -test,<=128B,java,java,94,8406 -test,<=128B,java,kotlin,1,68 -test,<=128B,java,markdown,3,115 -test,<=128B,java,objectivec,1,52 -test,<=128B,java,powershell,1,104 -test,<=128B,java,shell,1,70 -test,<=128B,javascript,asm,1,102 -test,<=128B,javascript,batch,1,12 -test,<=128B,javascript,c,3,206 -test,<=128B,javascript,css,1,107 -test,<=128B,javascript,groovy,1,60 -test,<=128B,javascript,haskell,3,268 -test,<=128B,javascript,ini,10,267 -test,<=128B,javascript,javascript,430,31669 -test,<=128B,javascript,json,1,80 -test,<=128B,javascript,lua,3,144 -test,<=128B,javascript,markdown,16,688 -test,<=128B,javascript,powershell,2,124 -test,<=128B,javascript,python,1,23 -test,<=128B,javascript,r,2,177 -test,<=128B,javascript,ruby,7,479 -test,<=128B,javascript,scala,6,368 -test,<=128B,javascript,shell,4,201 -test,<=128B,javascript,toml,2,87 -test,<=128B,javascript,typescript,7,561 -test,<=128B,javascript,yaml,9,789 -test,<=128B,json,css,1,33 -test,<=128B,json,ini,3,37 -test,<=128B,json,javascript,1,16 -test,<=128B,json,json,287,21062 -test,<=128B,json,julia,1,81 -test,<=128B,json,markdown,1,52 -test,<=128B,json,yaml,2,101 -test,<=128B,julia,batch,4,80 -test,<=128B,julia,ini,4,217 -test,<=128B,julia,javascript,5,280 -test,<=128B,julia,julia,240,19001 -test,<=128B,julia,lisp,1,56 -test,<=128B,julia,lua,6,396 -test,<=128B,julia,markdown,3,109 -test,<=128B,julia,objectivec,4,345 -test,<=128B,julia,ocaml,1,16 -test,<=128B,julia,python,3,360 -test,<=128B,julia,r,7,480 -test,<=128B,julia,ruby,10,405 -test,<=128B,julia,scala,3,111 -test,<=128B,julia,yaml,1,36 -test,<=128B,kotlin,cpp,1,92 -test,<=128B,kotlin,elixir,1,47 -test,<=128B,kotlin,go,2,199 -test,<=128B,kotlin,gradle,5,286 -test,<=128B,kotlin,groovy,9,761 -test,<=128B,kotlin,ini,1,26 -test,<=128B,kotlin,json,1,97 -test,<=128B,kotlin,kotlin,154,14930 -test,<=128B,kotlin,lua,1,31 -test,<=128B,kotlin,markdown,1,83 -test,<=128B,kotlin,scala,1,121 -test,<=128B,kotlin,typescript,3,158 -test,<=128B,lisp,asm,3,120 -test,<=128B,lisp,batch,2,120 -test,<=128B,lisp,clojure,5,392 -test,<=128B,lisp,gradle,1,53 -test,<=128B,lisp,html,3,243 -test,<=128B,lisp,ini,3,86 -test,<=128B,lisp,lisp,199,15190 -test,<=128B,lisp,markdown,1,57 -test,<=128B,lisp,ocaml,1,97 -test,<=128B,lisp,powershell,1,46 -test,<=128B,lisp,scala,1,49 -test,<=128B,lua,batch,4,97 -test,<=128B,lua,elixir,1,61 -test,<=128B,lua,gradle,1,74 -test,<=128B,lua,groovy,1,90 -test,<=128B,lua,ini,4,160 -test,<=128B,lua,javascript,13,859 -test,<=128B,lua,json,2,155 -test,<=128B,lua,julia,1,88 -test,<=128B,lua,lua,93,7702 -test,<=128B,lua,objectivec,2,177 -test,<=128B,lua,python,5,149 -test,<=128B,lua,ruby,4,250 -test,<=128B,lua,scala,1,83 -test,<=128B,lua,shell,2,144 -test,<=128B,lua,sql,3,180 -test,<=128B,lua,toml,5,300 -test,<=128B,markdown,batch,21,603 -test,<=128B,markdown,c,1,48 -test,<=128B,markdown,cobol,1,42 -test,<=128B,markdown,dockerfile,1,48 -test,<=128B,markdown,html,1,36 -test,<=128B,markdown,ini,8,439 -test,<=128B,markdown,javascript,1,80 -test,<=128B,markdown,json,1,83 -test,<=128B,markdown,markdown,1066,60636 -test,<=128B,markdown,ocaml,1,54 -test,<=128B,markdown,perl,1,32 -test,<=128B,markdown,powershell,3,127 -test,<=128B,markdown,shell,3,200 -test,<=128B,markdown,sql,1,79 -test,<=128B,markdown,toml,1,82 -test,<=128B,markdown,yaml,5,390 -test,<=128B,objectivec,batch,1,96 -test,<=128B,objectivec,c,1,24 -test,<=128B,objectivec,cmake,1,43 -test,<=128B,objectivec,ini,3,197 -test,<=128B,objectivec,javascript,3,176 -test,<=128B,objectivec,lua,2,157 -test,<=128B,objectivec,markdown,2,110 -test,<=128B,objectivec,objectivec,99,8712 -test,<=128B,objectivec,perl,1,61 -test,<=128B,objectivec,powershell,1,82 -test,<=128B,objectivec,r,5,335 -test,<=128B,ocaml,asm,1,37 -test,<=128B,ocaml,batch,2,41 -test,<=128B,ocaml,cmake,2,62 -test,<=128B,ocaml,gradle,2,86 -test,<=128B,ocaml,ini,4,83 -test,<=128B,ocaml,javascript,4,209 -test,<=128B,ocaml,lisp,2,65 -test,<=128B,ocaml,markdown,17,632 -test,<=128B,ocaml,ocaml,183,13707 -test,<=128B,ocaml,python,2,54 -test,<=128B,ocaml,ruby,2,131 -test,<=128B,ocaml,scala,3,143 -test,<=128B,ocaml,sql,1,66 -test,<=128B,ocaml,typescript,1,101 -test,<=128B,perl,batch,1,46 -test,<=128B,perl,c,5,257 -test,<=128B,perl,cmake,5,235 -test,<=128B,perl,css,1,109 -test,<=128B,perl,groovy,1,41 -test,<=128B,perl,ini,6,278 -test,<=128B,perl,java,2,89 -test,<=128B,perl,javascript,5,465 -test,<=128B,perl,julia,1,120 -test,<=128B,perl,lisp,3,116 -test,<=128B,perl,markdown,7,364 -test,<=128B,perl,objectivec,4,346 -test,<=128B,perl,ocaml,1,84 -test,<=128B,perl,perl,347,26635 -test,<=128B,perl,powershell,1,33 -test,<=128B,perl,r,3,208 -test,<=128B,perl,scala,1,21 -test,<=128B,perl,shell,4,234 -test,<=128B,perl,sql,1,55 -test,<=128B,perl,typescript,1,21 -test,<=128B,perl,verilog,1,79 -test,<=128B,php,batch,4,123 -test,<=128B,php,c,1,42 -test,<=128B,php,cs,1,36 -test,<=128B,php,css,1,31 -test,<=128B,php,html,8,546 -test,<=128B,php,ini,5,286 -test,<=128B,php,javascript,1,59 -test,<=128B,php,json,1,24 -test,<=128B,php,markdown,5,138 -test,<=128B,php,perl,1,86 -test,<=128B,php,php,209,15535 -test,<=128B,php,powershell,1,116 -test,<=128B,php,shell,1,78 -test,<=128B,php,xml,1,16 -test,<=128B,powershell,batch,33,1994 -test,<=128B,powershell,gradle,4,350 -test,<=128B,powershell,groovy,1,121 -test,<=128B,powershell,html,3,146 -test,<=128B,powershell,ini,2,98 -test,<=128B,powershell,javascript,2,127 -test,<=128B,powershell,json,1,29 -test,<=128B,powershell,lua,1,53 -test,<=128B,powershell,markdown,11,496 -test,<=128B,powershell,powershell,120,9019 -test,<=128B,powershell,shell,10,635 -test,<=128B,powershell,yaml,4,218 -test,<=128B,python,batch,1,32 -test,<=128B,python,gemfile,1,68 -test,<=128B,python,gradle,1,69 -test,<=128B,python,groovy,4,318 -test,<=128B,python,haskell,2,87 -test,<=128B,python,ini,8,341 -test,<=128B,python,julia,1,71 -test,<=128B,python,lua,5,240 -test,<=128B,python,markdown,6,406 -test,<=128B,python,python,108,7462 -test,<=128B,python,ruby,1,107 -test,<=128B,python,scala,1,37 -test,<=128B,python,shell,1,24 -test,<=128B,python,toml,2,224 -test,<=128B,python,typescript,1,28 -test,<=128B,python,verilog,1,103 -test,<=128B,r,asm,1,20 -test,<=128B,r,batch,1,80 -test,<=128B,r,cmake,3,89 -test,<=128B,r,dart,1,84 -test,<=128B,r,ini,2,94 -test,<=128B,r,javascript,2,128 -test,<=128B,r,julia,1,110 -test,<=128B,r,lua,6,416 -test,<=128B,r,markdown,5,382 -test,<=128B,r,powershell,1,43 -test,<=128B,r,r,118,9223 -test,<=128B,r,ruby,2,135 -test,<=128B,r,shell,3,116 -test,<=128B,ruby,batch,3,149 -test,<=128B,ruby,elixir,1,67 +test,<=128B,asm,asm,19,1487 +test,<=128B,asm,batch,3,94 +test,<=128B,asm,erlang,2,173 +test,<=128B,asm,gradle,2,28 +test,<=128B,asm,javascript,6,412 +test,<=128B,asm,lua,1,52 +test,<=128B,asm,markdown,6,183 +test,<=128B,asm,perl,1,90 +test,<=128B,asm,sql,2,151 +test,<=128B,asm,yaml,1,77 +test,<=128B,batch,batch,180,11819 +test,<=128B,batch,markdown,7,180 +test,<=128B,batch,shell,2,141 +test,<=128B,c,batch,1,42 +test,<=128B,c,c,4,346 +test,<=128B,c,markdown,3,282 +test,<=128B,clojure,batch,1,75 +test,<=128B,clojure,clojure,32,2447 +test,<=128B,clojure,ini,1,29 +test,<=128B,clojure,lisp,1,44 +test,<=128B,clojure,markdown,1,39 +test,<=128B,cmake,cmake,20,1250 +test,<=128B,cmake,lua,1,98 +test,<=128B,cmake,shell,1,99 +test,<=128B,cobol,cobol,2,210 +test,<=128B,cobol,markdown,1,54 +test,<=128B,cpp,batch,1,57 +test,<=128B,cpp,c,5,274 +test,<=128B,cpp,cmake,1,117 +test,<=128B,cpp,cpp,5,536 +test,<=128B,cpp,markdown,2,119 +test,<=128B,cs,cs,8,817 +test,<=128B,cs,java,1,74 +test,<=128B,cs,javascript,1,71 +test,<=128B,css,css,38,2665 +test,<=128B,dart,dart,12,976 +test,<=128B,dart,gradle,1,30 +test,<=128B,dockerfile,dockerfile,45,3668 +test,<=128B,dockerfile,markdown,1,15 +test,<=128B,elixir,elixir,33,2603 +test,<=128B,elixir,markdown,1,61 +test,<=128B,elixir,python,4,300 +test,<=128B,elixir,shell,1,128 +test,<=128B,erlang,erlang,10,728 +test,<=128B,gemfile,gemfile,143,14289 +test,<=128B,go,batch,1,60 +test,<=128B,go,go,13,996 +test,<=128B,groovy,gradle,5,302 +test,<=128B,groovy,groovy,12,1068 +test,<=128B,groovy,java,1,103 +test,<=128B,groovy,javascript,1,103 +test,<=128B,groovy,python,1,61 +test,<=128B,groovy,toml,1,21 +test,<=128B,haskell,c,1,85 +test,<=128B,haskell,haskell,28,2521 +test,<=128B,haskell,markdown,2,99 +test,<=128B,haskell,sql,1,24 +test,<=128B,haskell,toml,2,91 +test,<=128B,html,html,1,103 +test,<=128B,html,markdown,2,216 +test,<=128B,ini,asm,1,115 +test,<=128B,ini,batch,14,1007 +test,<=128B,ini,c,1,54 +test,<=128B,ini,gradle,3,212 +test,<=128B,ini,ini,78,6884 +test,<=128B,ini,javascript,1,107 +test,<=128B,ini,json,2,148 +test,<=128B,ini,julia,1,66 +test,<=128B,ini,markdown,9,614 +test,<=128B,ini,r,2,158 +test,<=128B,ini,toml,5,274 +test,<=128B,ini,yaml,3,228 +test,<=128B,java,java,6,532 +test,<=128B,javascript,javascript,17,1401 +test,<=128B,javascript,typescript,3,279 +test,<=128B,json,json,19,1568 +test,<=128B,julia,julia,25,2173 +test,<=128B,julia,lua,1,120 +test,<=128B,julia,python,1,125 +test,<=128B,kotlin,groovy,1,82 +test,<=128B,kotlin,kotlin,28,2760 +test,<=128B,kotlin,markdown,2,218 +test,<=128B,lisp,clojure,1,55 +test,<=128B,lisp,cmake,1,67 +test,<=128B,lisp,lisp,21,1853 +test,<=128B,lisp,lua,1,24 +test,<=128B,lua,batch,2,49 +test,<=128B,lua,cmake,1,74 +test,<=128B,lua,elixir,1,103 +test,<=128B,lua,gradle,2,50 +test,<=128B,lua,javascript,1,98 +test,<=128B,lua,julia,1,104 +test,<=128B,lua,lua,18,1652 +test,<=128B,lua,markdown,1,31 +test,<=128B,lua,python,1,39 +test,<=128B,lua,toml,3,108 +test,<=128B,markdown,javascript,1,74 +test,<=128B,markdown,markdown,353,29736 +test,<=128B,markdown,yaml,22,1839 +test,<=128B,ocaml,cmake,1,52 +test,<=128B,ocaml,gradle,1,53 +test,<=128B,ocaml,javascript,1,102 +test,<=128B,ocaml,markdown,4,122 +test,<=128B,ocaml,ocaml,50,4452 +test,<=128B,ocaml,typescript,1,56 +test,<=128B,perl,gradle,1,55 +test,<=128B,perl,javascript,2,95 +test,<=128B,perl,perl,18,1493 +test,<=128B,perl,powershell,1,31 +test,<=128B,perl,sql,1,9 +test,<=128B,php,c,1,83 +test,<=128B,php,markdown,1,13 +test,<=128B,php,php,10,729 +test,<=128B,powershell,batch,4,331 +test,<=128B,powershell,gradle,1,127 +test,<=128B,powershell,javascript,1,120 +test,<=128B,powershell,markdown,5,356 +test,<=128B,powershell,powershell,7,690 +test,<=128B,powershell,shell,1,33 +test,<=128B,powershell,sql,1,45 +test,<=128B,powershell,toml,1,27 +test,<=128B,python,ini,2,186 +test,<=128B,python,markdown,1,30 +test,<=128B,python,python,12,1115 +test,<=128B,python,r,1,22 +test,<=128B,r,asm,2,123 +test,<=128B,r,batch,3,144 +test,<=128B,r,c,2,70 +test,<=128B,r,cmake,1,19 +test,<=128B,r,haskell,1,120 +test,<=128B,r,javascript,1,63 +test,<=128B,r,lua,6,547 +test,<=128B,r,markdown,17,1064 +test,<=128B,r,python,1,79 +test,<=128B,r,r,11,1003 +test,<=128B,r,shell,1,107 +test,<=128B,r,sql,2,240 +test,<=128B,r,yaml,3,95 +test,<=128B,ruby,batch,1,66 +test,<=128B,ruby,cmake,1,37 +test,<=128B,ruby,elixir,1,127 test,<=128B,ruby,gradle,2,150 -test,<=128B,ruby,ini,9,514 -test,<=128B,ruby,javascript,10,678 -test,<=128B,ruby,lua,2,187 -test,<=128B,ruby,markdown,5,228 -test,<=128B,ruby,powershell,2,143 -test,<=128B,ruby,ruby,265,20992 -test,<=128B,ruby,scala,1,47 -test,<=128B,ruby,sql,1,90 -test,<=128B,ruby,toml,1,105 -test,<=128B,ruby,typescript,1,111 -test,<=128B,ruby,yaml,1,28 -test,<=128B,rust,batch,1,12 -test,<=128B,rust,c,1,128 -test,<=128B,rust,cobol,1,93 -test,<=128B,rust,css,1,81 -test,<=128B,rust,groovy,1,21 -test,<=128B,rust,ini,2,102 -test,<=128B,rust,markdown,1,36 -test,<=128B,rust,ocaml,1,86 -test,<=128B,rust,perl,1,39 -test,<=128B,rust,powershell,1,74 -test,<=128B,rust,rust,208,14011 -test,<=128B,rust,shell,1,38 -test,<=128B,rust,sql,1,18 -test,<=128B,rust,typescript,1,57 -test,<=128B,rust,verilog,1,105 -test,<=128B,scala,elixir,1,113 -test,<=128B,scala,go,2,201 -test,<=128B,scala,groovy,7,440 -test,<=128B,scala,ini,1,17 -test,<=128B,scala,javascript,2,102 -test,<=128B,scala,kotlin,18,1352 -test,<=128B,scala,lua,5,351 -test,<=128B,scala,markdown,1,121 -test,<=128B,scala,scala,228,19011 -test,<=128B,shell,batch,81,4919 -test,<=128B,shell,cmake,1,76 -test,<=128B,shell,ini,9,416 -test,<=128B,shell,javascript,1,38 -test,<=128B,shell,julia,2,137 -test,<=128B,shell,lua,1,92 -test,<=128B,shell,markdown,12,869 -test,<=128B,shell,powershell,7,405 -test,<=128B,shell,shell,602,45860 -test,<=128B,shell,sql,1,97 -test,<=128B,shell,typescript,1,50 -test,<=128B,sql,asm,4,312 -test,<=128B,sql,batch,4,119 -test,<=128B,sql,cobol,1,37 -test,<=128B,sql,elixir,1,119 -test,<=128B,sql,ini,4,174 -test,<=128B,sql,javascript,1,57 -test,<=128B,sql,markdown,1,76 -test,<=128B,sql,perl,3,263 -test,<=128B,sql,r,1,127 -test,<=128B,sql,shell,1,83 -test,<=128B,sql,sql,333,24167 -test,<=128B,swift,c,2,77 -test,<=128B,swift,cs,1,71 -test,<=128B,swift,gradle,1,65 -test,<=128B,swift,groovy,2,153 -test,<=128B,swift,java,1,71 -test,<=128B,swift,ocaml,2,116 -test,<=128B,swift,python,4,195 -test,<=128B,swift,r,1,48 -test,<=128B,swift,scala,1,99 -test,<=128B,swift,swift,39,3713 -test,<=128B,toml,html,1,8 -test,<=128B,toml,ini,51,2649 -test,<=128B,toml,markdown,1,49 -test,<=128B,toml,powershell,1,14 -test,<=128B,toml,shell,1,38 -test,<=128B,toml,toml,729,66752 -test,<=128B,typescript,asm,1,75 -test,<=128B,typescript,batch,2,230 -test,<=128B,typescript,html,1,56 -test,<=128B,typescript,javascript,21,1207 -test,<=128B,typescript,markdown,1,14 -test,<=128B,typescript,perl,1,23 -test,<=128B,typescript,shell,1,47 -test,<=128B,typescript,typescript,281,22574 -test,<=128B,vba,elixir,1,61 -test,<=128B,vba,vba,66,4337 -test,<=128B,verilog,batch,6,285 -test,<=128B,verilog,dart,1,124 -test,<=128B,verilog,ini,7,145 -test,<=128B,verilog,markdown,7,443 -test,<=128B,verilog,ocaml,3,107 -test,<=128B,verilog,scala,1,30 -test,<=128B,verilog,verilog,37,3265 -test,<=128B,xml,batch,1,81 -test,<=128B,xml,gradle,2,229 -test,<=128B,xml,html,2,47 -test,<=128B,xml,ini,3,174 -test,<=128B,xml,shell,1,76 -test,<=128B,xml,xml,106,9169 -test,<=128B,yaml,asm,1,41 -test,<=128B,yaml,batch,3,155 -test,<=128B,yaml,css,1,73 -test,<=128B,yaml,ini,5,281 -test,<=128B,yaml,markdown,2,96 -test,<=128B,yaml,powershell,1,119 -test,<=128B,yaml,ruby,1,29 -test,<=128B,yaml,yaml,714,54711 -test,129-512B,asm,asm,466,149445 -test,129-512B,asm,batch,4,1000 -test,129-512B,asm,c,4,1283 -test,129-512B,asm,cmake,1,196 -test,129-512B,asm,cobol,2,721 -test,129-512B,asm,cpp,1,426 -test,129-512B,asm,dart,1,277 -test,129-512B,asm,ini,7,1482 -test,129-512B,asm,markdown,1,248 -test,129-512B,asm,ocaml,3,511 -test,129-512B,asm,perl,1,371 -test,129-512B,asm,r,1,244 -test,129-512B,asm,sql,2,488 -test,129-512B,asm,typescript,1,384 -test,129-512B,asm,vba,1,420 -test,129-512B,asm,verilog,2,519 -test,129-512B,asm,yaml,2,327 -test,129-512B,batch,asm,2,928 -test,129-512B,batch,batch,1199,333399 -test,129-512B,batch,c,2,731 -test,129-512B,batch,ini,3,1056 -test,129-512B,batch,markdown,3,963 -test,129-512B,batch,powershell,4,795 -test,129-512B,batch,shell,13,3041 -test,129-512B,c,asm,3,1091 -test,129-512B,c,batch,2,560 -test,129-512B,c,c,1456,445464 -test,129-512B,c,cpp,32,10768 -test,129-512B,c,cs,3,966 -test,129-512B,c,css,1,188 -test,129-512B,c,dart,1,266 -test,129-512B,c,ini,1,212 -test,129-512B,c,javascript,1,369 -test,129-512B,c,objectivec,4,1218 -test,129-512B,c,perl,1,352 -test,129-512B,c,shell,1,211 -test,129-512B,c,verilog,1,236 -test,129-512B,clojure,clojure,1163,355675 -test,129-512B,clojure,cmake,1,390 -test,129-512B,clojure,html,1,248 -test,129-512B,clojure,json,2,562 -test,129-512B,clojure,lisp,3,817 -test,129-512B,clojure,ocaml,2,609 -test,129-512B,cmake,asm,2,562 -test,129-512B,cmake,batch,4,919 -test,129-512B,cmake,c,3,517 -test,129-512B,cmake,clojure,1,391 -test,129-512B,cmake,cmake,2020,596787 -test,129-512B,cmake,cpp,3,776 -test,129-512B,cmake,cs,1,371 -test,129-512B,cmake,elixir,2,672 -test,129-512B,cmake,ini,2,308 -test,129-512B,cmake,json,1,499 -test,129-512B,cmake,lisp,3,715 -test,129-512B,cmake,markdown,8,2299 -test,129-512B,cmake,powershell,4,1440 -test,129-512B,cmake,r,1,176 -test,129-512B,cmake,ruby,1,214 -test,129-512B,cmake,shell,10,3466 -test,129-512B,cmake,yaml,10,2456 -test,129-512B,cobol,cobol,13,4388 -test,129-512B,cpp,batch,1,171 -test,129-512B,cpp,c,81,24296 -test,129-512B,cpp,cmake,2,761 -test,129-512B,cpp,cpp,407,126939 -test,129-512B,cpp,cs,2,829 -test,129-512B,cpp,css,1,434 -test,129-512B,cpp,markdown,1,287 -test,129-512B,cpp,objectivec,1,233 -test,129-512B,cpp,powershell,1,238 -test,129-512B,cpp,rust,3,916 -test,129-512B,cs,c,1,165 -test,129-512B,cs,cpp,1,246 -test,129-512B,cs,cs,701,235117 -test,129-512B,cs,groovy,1,227 -test,129-512B,cs,java,10,2493 -test,129-512B,cs,markdown,2,531 -test,129-512B,css,batch,2,486 -test,129-512B,css,c,1,334 -test,129-512B,css,css,638,187970 -test,129-512B,css,javascript,2,401 -test,129-512B,css,markdown,1,136 -test,129-512B,css,yaml,5,1106 -test,129-512B,dart,c,2,364 -test,129-512B,dart,cpp,1,167 -test,129-512B,dart,dart,810,262015 -test,129-512B,dart,groovy,2,374 -test,129-512B,dart,java,1,385 -test,129-512B,dart,javascript,2,488 -test,129-512B,dart,swift,2,401 -test,129-512B,dart,typescript,9,2199 -test,129-512B,dart,verilog,4,1057 -test,129-512B,dockerfile,batch,2,449 -test,129-512B,dockerfile,dockerfile,1137,354501 -test,129-512B,dockerfile,shell,1,224 -test,129-512B,elixir,asm,2,547 -test,129-512B,elixir,c,1,412 -test,129-512B,elixir,cobol,1,135 -test,129-512B,elixir,elixir,897,273078 -test,129-512B,elixir,ini,4,606 -test,129-512B,elixir,javascript,1,237 -test,129-512B,elixir,markdown,1,333 -test,129-512B,elixir,perl,1,323 -test,129-512B,elixir,r,1,320 -test,129-512B,elixir,ruby,3,494 -test,129-512B,elixir,shell,2,364 -test,129-512B,elixir,toml,1,315 -test,129-512B,elixir,vba,1,262 -test,129-512B,elixir,yaml,4,1295 -test,129-512B,erlang,batch,1,138 -test,129-512B,erlang,elixir,1,158 -test,129-512B,erlang,erlang,470,150966 -test,129-512B,erlang,lisp,1,233 -test,129-512B,erlang,lua,1,158 -test,129-512B,erlang,markdown,1,248 -test,129-512B,erlang,perl,5,1751 -test,129-512B,gemfile,gemfile,84,21665 -test,129-512B,gemspec,gemspec,9,3777 -test,129-512B,go,batch,1,166 -test,129-512B,go,go,655,203758 -test,129-512B,go,gradle,1,180 -test,129-512B,go,groovy,2,629 -test,129-512B,go,html,1,375 -test,129-512B,go,julia,1,230 -test,129-512B,go,swift,1,310 -test,129-512B,go,typescript,1,134 -test,129-512B,go,yaml,1,180 -test,129-512B,gradle,gradle,276,97376 -test,129-512B,gradle,groovy,7,2366 -test,129-512B,gradle,javascript,1,335 -test,129-512B,gradle,markdown,1,132 -test,129-512B,groovy,batch,2,463 -test,129-512B,groovy,go,1,130 -test,129-512B,groovy,gradle,2,403 -test,129-512B,groovy,groovy,447,138315 -test,129-512B,groovy,java,6,1533 -test,129-512B,groovy,javascript,5,1423 -test,129-512B,groovy,julia,1,336 -test,129-512B,groovy,kotlin,6,1289 -test,129-512B,groovy,python,3,794 -test,129-512B,groovy,scala,6,1584 -test,129-512B,groovy,swift,1,353 -test,129-512B,haskell,asm,1,360 -test,129-512B,haskell,batch,4,1200 -test,129-512B,haskell,c,2,376 -test,129-512B,haskell,groovy,1,204 -test,129-512B,haskell,haskell,586,180069 -test,129-512B,haskell,ini,4,1152 -test,129-512B,haskell,lisp,1,282 -test,129-512B,haskell,lua,4,887 -test,129-512B,haskell,objectivec,1,300 -test,129-512B,haskell,ocaml,5,1201 -test,129-512B,haskell,python,1,245 -test,129-512B,haskell,r,1,155 -test,129-512B,haskell,ruby,2,330 -test,129-512B,haskell,scala,1,179 -test,129-512B,haskell,sql,2,566 -test,129-512B,haskell,yaml,1,310 -test,129-512B,html,batch,1,341 -test,129-512B,html,cs,1,463 -test,129-512B,html,css,2,573 -test,129-512B,html,go,1,473 -test,129-512B,html,groovy,1,400 -test,129-512B,html,html,715,229775 -test,129-512B,html,ini,1,222 -test,129-512B,html,javascript,1,433 -test,129-512B,html,markdown,2,714 -test,129-512B,html,php,1,440 -test,129-512B,html,xml,11,2544 -test,129-512B,ini,asm,1,160 -test,129-512B,ini,batch,7,1816 -test,129-512B,ini,c,1,450 -test,129-512B,ini,cmake,2,761 -test,129-512B,ini,groovy,1,280 -test,129-512B,ini,html,2,924 -test,129-512B,ini,ini,330,99262 -test,129-512B,ini,markdown,2,794 -test,129-512B,ini,shell,1,287 -test,129-512B,ini,toml,10,2278 -test,129-512B,ini,yaml,2,747 -test,129-512B,java,c,1,306 -test,129-512B,java,groovy,2,649 -test,129-512B,java,java,941,315624 -test,129-512B,java,powershell,1,135 -test,129-512B,java,python,1,353 -test,129-512B,java,scala,1,129 -test,129-512B,javascript,asm,1,313 -test,129-512B,javascript,batch,2,517 -test,129-512B,javascript,c,1,200 -test,129-512B,javascript,css,2,528 -test,129-512B,javascript,elixir,1,218 -test,129-512B,javascript,erlang,2,447 -test,129-512B,javascript,gradle,2,606 -test,129-512B,javascript,groovy,4,1065 -test,129-512B,javascript,html,2,685 -test,129-512B,javascript,ini,2,426 -test,129-512B,javascript,javascript,1321,407566 -test,129-512B,javascript,json,6,1531 -test,129-512B,javascript,lua,2,505 -test,129-512B,javascript,markdown,7,1989 -test,129-512B,javascript,php,1,357 -test,129-512B,javascript,python,1,132 -test,129-512B,javascript,r,1,314 -test,129-512B,javascript,ruby,7,1339 -test,129-512B,javascript,typescript,64,19363 -test,129-512B,javascript,verilog,1,493 -test,129-512B,javascript,yaml,25,6501 -test,129-512B,json,elixir,1,288 -test,129-512B,json,ini,2,718 -test,129-512B,json,json,1327,433274 -test,129-512B,json,ruby,1,304 -test,129-512B,json,shell,1,312 -test,129-512B,julia,asm,2,718 -test,129-512B,julia,batch,4,1256 -test,129-512B,julia,c,1,418 -test,129-512B,julia,cmake,1,145 -test,129-512B,julia,elixir,2,329 -test,129-512B,julia,erlang,1,172 -test,129-512B,julia,ini,1,180 -test,129-512B,julia,javascript,3,715 -test,129-512B,julia,julia,519,162884 -test,129-512B,julia,lua,12,3338 -test,129-512B,julia,markdown,1,368 -test,129-512B,julia,objectivec,8,2086 -test,129-512B,julia,python,3,771 -test,129-512B,julia,r,10,3088 -test,129-512B,julia,ruby,10,2112 -test,129-512B,julia,scala,1,141 -test,129-512B,julia,typescript,1,305 -test,129-512B,julia,vba,1,202 -test,129-512B,kotlin,gradle,13,4521 -test,129-512B,kotlin,groovy,7,1679 -test,129-512B,kotlin,kotlin,910,277928 -test,129-512B,kotlin,markdown,1,176 -test,129-512B,kotlin,scala,3,853 -test,129-512B,lisp,asm,2,583 -test,129-512B,lisp,batch,1,296 -test,129-512B,lisp,clojure,4,887 -test,129-512B,lisp,cs,1,249 -test,129-512B,lisp,lisp,505,145201 -test,129-512B,lisp,markdown,1,487 -test,129-512B,lisp,powershell,1,382 -test,129-512B,lua,c,2,738 -test,129-512B,lua,gradle,1,194 -test,129-512B,lua,ini,3,912 -test,129-512B,lua,javascript,14,4643 -test,129-512B,lua,json,4,1395 -test,129-512B,lua,julia,1,223 -test,129-512B,lua,lua,444,142686 -test,129-512B,lua,objectivec,3,962 -test,129-512B,lua,python,1,495 -test,129-512B,lua,r,3,916 -test,129-512B,lua,ruby,3,730 -test,129-512B,lua,sql,5,1473 -test,129-512B,lua,toml,2,563 -test,129-512B,markdown,asm,1,405 -test,129-512B,markdown,batch,3,635 -test,129-512B,markdown,cmake,1,370 -test,129-512B,markdown,cobol,2,525 -test,129-512B,markdown,html,5,1616 -test,129-512B,markdown,ini,2,295 -test,129-512B,markdown,javascript,1,461 -test,129-512B,markdown,json,1,469 -test,129-512B,markdown,lisp,1,300 -test,129-512B,markdown,markdown,806,236201 -test,129-512B,markdown,ocaml,1,444 -test,129-512B,markdown,powershell,1,486 -test,129-512B,markdown,python,1,498 -test,129-512B,markdown,ruby,1,503 -test,129-512B,markdown,scala,1,418 -test,129-512B,markdown,shell,3,913 -test,129-512B,markdown,yaml,7,2113 -test,129-512B,objectivec,asm,3,810 -test,129-512B,objectivec,batch,6,1115 -test,129-512B,objectivec,c,17,5063 -test,129-512B,objectivec,cpp,3,756 -test,129-512B,objectivec,css,1,386 -test,129-512B,objectivec,groovy,1,500 -test,129-512B,objectivec,ini,8,1676 -test,129-512B,objectivec,javascript,1,375 -test,129-512B,objectivec,lisp,1,479 -test,129-512B,objectivec,lua,1,390 -test,129-512B,objectivec,objectivec,1146,379632 -test,129-512B,objectivec,perl,8,2140 -test,129-512B,objectivec,powershell,1,130 -test,129-512B,objectivec,r,7,1849 -test,129-512B,objectivec,ruby,1,133 -test,129-512B,objectivec,shell,1,152 -test,129-512B,objectivec,toml,2,514 -test,129-512B,objectivec,typescript,1,407 -test,129-512B,objectivec,xml,1,236 -test,129-512B,ocaml,batch,1,406 -test,129-512B,ocaml,haskell,1,203 -test,129-512B,ocaml,html,1,159 -test,129-512B,ocaml,lisp,4,1021 -test,129-512B,ocaml,lua,1,141 -test,129-512B,ocaml,markdown,2,327 -test,129-512B,ocaml,ocaml,511,155971 -test,129-512B,ocaml,ruby,1,151 -test,129-512B,ocaml,typescript,3,820 -test,129-512B,ocaml,vba,2,686 -test,129-512B,ocaml,verilog,2,592 -test,129-512B,perl,asm,2,681 -test,129-512B,perl,batch,6,1947 -test,129-512B,perl,c,4,1382 -test,129-512B,perl,clojure,1,161 -test,129-512B,perl,cmake,2,773 -test,129-512B,perl,erlang,6,2187 -test,129-512B,perl,html,1,204 -test,129-512B,perl,javascript,4,902 -test,129-512B,perl,markdown,8,2807 -test,129-512B,perl,objectivec,7,2700 -test,129-512B,perl,perl,1118,346869 -test,129-512B,perl,php,2,623 -test,129-512B,perl,powershell,2,624 -test,129-512B,perl,python,1,141 -test,129-512B,perl,ruby,2,947 -test,129-512B,perl,rust,1,452 -test,129-512B,perl,shell,5,1201 -test,129-512B,perl,typescript,3,801 -test,129-512B,perl,verilog,1,176 -test,129-512B,php,batch,1,222 -test,129-512B,php,cs,1,329 -test,129-512B,php,html,28,8415 -test,129-512B,php,ini,1,427 -test,129-512B,php,markdown,1,176 -test,129-512B,php,perl,1,356 -test,129-512B,php,php,604,189559 -test,129-512B,php,sql,1,302 -test,129-512B,powershell,asm,1,131 -test,129-512B,powershell,batch,33,8560 -test,129-512B,powershell,cmake,1,464 -test,129-512B,powershell,gradle,3,740 -test,129-512B,powershell,groovy,4,777 -test,129-512B,powershell,ini,3,820 -test,129-512B,powershell,javascript,2,655 -test,129-512B,powershell,julia,1,322 -test,129-512B,powershell,markdown,6,1723 -test,129-512B,powershell,objectivec,1,204 -test,129-512B,powershell,powershell,464,150519 -test,129-512B,powershell,ruby,2,374 -test,129-512B,powershell,shell,5,1273 -test,129-512B,powershell,sql,1,242 -test,129-512B,powershell,toml,1,131 -test,129-512B,python,batch,2,518 -test,129-512B,python,cmake,1,273 -test,129-512B,python,groovy,1,495 -test,129-512B,python,haskell,1,179 -test,129-512B,python,html,1,151 -test,129-512B,python,ini,9,2376 -test,129-512B,python,javascript,1,208 -test,129-512B,python,json,1,292 -test,129-512B,python,julia,1,280 -test,129-512B,python,lua,1,236 -test,129-512B,python,markdown,1,454 -test,129-512B,python,perl,1,206 -test,129-512B,python,python,489,160142 -test,129-512B,python,r,3,835 -test,129-512B,python,ruby,1,295 -test,129-512B,python,shell,3,844 -test,129-512B,python,sql,1,154 -test,129-512B,python,toml,2,626 -test,129-512B,python,verilog,1,168 -test,129-512B,python,yaml,1,161 -test,129-512B,r,asm,1,377 -test,129-512B,r,cmake,5,1857 -test,129-512B,r,cpp,2,832 -test,129-512B,r,elixir,1,191 -test,129-512B,r,groovy,1,405 -test,129-512B,r,ini,1,235 -test,129-512B,r,javascript,4,1327 -test,129-512B,r,julia,1,137 -test,129-512B,r,lisp,1,243 -test,129-512B,r,lua,4,937 -test,129-512B,r,markdown,4,864 -test,129-512B,r,objectivec,1,488 -test,129-512B,r,powershell,4,1125 -test,129-512B,r,r,418,135032 -test,129-512B,r,ruby,1,230 -test,129-512B,r,yaml,2,331 -test,129-512B,ruby,gemspec,1,146 -test,129-512B,ruby,gradle,1,350 -test,129-512B,ruby,groovy,1,307 -test,129-512B,ruby,ini,1,444 -test,129-512B,ruby,javascript,6,1657 -test,129-512B,ruby,lua,6,1672 -test,129-512B,ruby,markdown,2,676 -test,129-512B,ruby,powershell,2,880 -test,129-512B,ruby,ruby,773,220060 -test,129-512B,ruby,shell,4,924 -test,129-512B,ruby,toml,1,139 -test,129-512B,rust,asm,1,257 -test,129-512B,rust,javascript,1,133 -test,129-512B,rust,markdown,2,318 -test,129-512B,rust,perl,1,308 -test,129-512B,rust,python,1,307 -test,129-512B,rust,rust,487,146997 -test,129-512B,rust,verilog,1,346 -test,129-512B,scala,cobol,1,441 -test,129-512B,scala,elixir,1,209 -test,129-512B,scala,go,1,191 -test,129-512B,scala,groovy,15,4293 -test,129-512B,scala,java,1,468 -test,129-512B,scala,kotlin,15,3913 -test,129-512B,scala,markdown,2,575 -test,129-512B,scala,perl,1,143 -test,129-512B,scala,r,1,227 -test,129-512B,scala,scala,968,290210 -test,129-512B,shell,batch,71,17784 -test,129-512B,shell,cmake,4,1254 -test,129-512B,shell,groovy,1,171 -test,129-512B,shell,javascript,1,169 -test,129-512B,shell,json,1,303 -test,129-512B,shell,julia,2,402 -test,129-512B,shell,lua,1,173 -test,129-512B,shell,markdown,11,3332 -test,129-512B,shell,ocaml,1,244 -test,129-512B,shell,perl,1,226 -test,129-512B,shell,powershell,12,3123 -test,129-512B,shell,r,1,382 -test,129-512B,shell,shell,1086,312222 -test,129-512B,shell,sql,1,136 -test,129-512B,shell,typescript,2,560 -test,129-512B,sql,asm,2,830 -test,129-512B,sql,batch,2,401 -test,129-512B,sql,haskell,3,660 -test,129-512B,sql,ini,1,512 -test,129-512B,sql,lua,1,175 -test,129-512B,sql,markdown,1,348 -test,129-512B,sql,objectivec,1,299 -test,129-512B,sql,shell,1,271 -test,129-512B,sql,sql,825,241625 -test,129-512B,swift,c,1,348 -test,129-512B,swift,groovy,1,382 -test,129-512B,swift,haskell,1,208 -test,129-512B,swift,kotlin,1,220 -test,129-512B,swift,ocaml,4,1093 -test,129-512B,swift,perl,1,503 -test,129-512B,swift,r,1,207 -test,129-512B,swift,scala,1,326 -test,129-512B,swift,swift,496,180290 -test,129-512B,swift,typescript,2,594 -test,129-512B,toml,asm,2,536 -test,129-512B,toml,ini,34,7516 -test,129-512B,toml,markdown,1,206 -test,129-512B,toml,ruby,2,341 -test,129-512B,toml,toml,1582,413403 -test,129-512B,typescript,batch,3,885 -test,129-512B,typescript,groovy,2,695 -test,129-512B,typescript,java,2,457 -test,129-512B,typescript,javascript,25,6653 -test,129-512B,typescript,lua,1,394 -test,129-512B,typescript,markdown,1,137 -test,129-512B,typescript,r,1,430 -test,129-512B,typescript,scala,2,501 -test,129-512B,typescript,typescript,1048,323266 -test,129-512B,typescript,verilog,1,419 -test,129-512B,typescript,xml,4,790 -test,129-512B,vba,batch,1,204 -test,129-512B,vba,elixir,3,1019 -test,129-512B,vba,ini,1,278 -test,129-512B,vba,lua,2,711 -test,129-512B,vba,r,1,178 -test,129-512B,vba,vba,241,75818 -test,129-512B,verilog,asm,1,234 -test,129-512B,verilog,batch,1,239 -test,129-512B,verilog,c,2,772 -test,129-512B,verilog,cobol,1,131 -test,129-512B,verilog,dart,2,569 -test,129-512B,verilog,elixir,1,476 -test,129-512B,verilog,ini,1,291 -test,129-512B,verilog,markdown,1,188 -test,129-512B,verilog,objectivec,2,473 -test,129-512B,verilog,ocaml,1,386 -test,129-512B,verilog,typescript,1,147 -test,129-512B,verilog,verilog,392,130779 -test,129-512B,xml,html,5,1550 -test,129-512B,xml,ini,1,323 -test,129-512B,xml,json,1,506 -test,129-512B,xml,powershell,1,281 -test,129-512B,xml,python,1,132 -test,129-512B,xml,xml,691,220803 -test,129-512B,yaml,cmake,2,803 -test,129-512B,yaml,javascript,1,158 -test,129-512B,yaml,json,4,1809 -test,129-512B,yaml,lua,1,155 -test,129-512B,yaml,markdown,9,2580 -test,129-512B,yaml,yaml,1578,457803 -test,513B-1KiB,asm,asm,476,359210 -test,513B-1KiB,asm,batch,2,1192 -test,513B-1KiB,asm,c,7,5398 -test,513B-1KiB,asm,cmake,1,842 -test,513B-1KiB,asm,cpp,2,1533 -test,513B-1KiB,asm,cs,1,811 -test,513B-1KiB,asm,elixir,1,772 -test,513B-1KiB,asm,ini,7,5548 -test,513B-1KiB,asm,objectivec,2,1254 -test,513B-1KiB,asm,r,2,1774 -test,513B-1KiB,asm,verilog,2,1624 -test,513B-1KiB,asm,yaml,2,1503 -test,513B-1KiB,batch,asm,1,622 -test,513B-1KiB,batch,batch,496,366781 -test,513B-1KiB,batch,cmake,1,802 -test,513B-1KiB,batch,cobol,2,1412 -test,513B-1KiB,batch,html,1,651 -test,513B-1KiB,batch,ini,2,1727 -test,513B-1KiB,batch,javascript,2,1973 -test,513B-1KiB,batch,markdown,1,631 -test,513B-1KiB,batch,perl,1,784 -test,513B-1KiB,batch,ruby,1,684 -test,513B-1KiB,batch,shell,15,10357 -test,513B-1KiB,batch,sql,1,581 -test,513B-1KiB,batch,yaml,1,721 -test,513B-1KiB,c,asm,3,2060 -test,513B-1KiB,c,c,773,572869 -test,513B-1KiB,c,cmake,1,940 -test,513B-1KiB,c,cpp,41,30926 -test,513B-1KiB,c,ocaml,1,535 -test,513B-1KiB,clojure,clojure,710,524026 -test,513B-1KiB,clojure,dockerfile,1,741 -test,513B-1KiB,clojure,lisp,3,2104 -test,513B-1KiB,cmake,asm,1,634 -test,513B-1KiB,cmake,batch,2,1301 -test,513B-1KiB,cmake,c,2,1434 -test,513B-1KiB,cmake,cmake,1422,1052356 -test,513B-1KiB,cmake,cpp,2,1238 -test,513B-1KiB,cmake,gemfile,1,665 -test,513B-1KiB,cmake,ini,1,811 -test,513B-1KiB,cmake,lua,1,783 -test,513B-1KiB,cmake,markdown,3,1742 -test,513B-1KiB,cmake,ocaml,1,971 -test,513B-1KiB,cmake,powershell,1,1013 -test,513B-1KiB,cmake,shell,4,3026 -test,513B-1KiB,cobol,cobol,32,23128 -test,513B-1KiB,cpp,asm,1,869 -test,513B-1KiB,cpp,c,45,34484 -test,513B-1KiB,cpp,cpp,288,219554 -test,513B-1KiB,cpp,cs,2,1616 -test,513B-1KiB,cpp,groovy,1,654 -test,513B-1KiB,cpp,javascript,1,824 -test,513B-1KiB,cpp,xml,1,667 -test,513B-1KiB,cs,batch,1,830 -test,513B-1KiB,cs,cs,692,508023 -test,513B-1KiB,cs,java,3,1940 -test,513B-1KiB,cs,markdown,1,710 -test,513B-1KiB,cs,scala,1,652 -test,513B-1KiB,css,batch,2,1316 -test,513B-1KiB,css,c,1,709 -test,513B-1KiB,css,cobol,1,805 -test,513B-1KiB,css,css,543,414748 -test,513B-1KiB,css,html,1,593 -test,513B-1KiB,css,markdown,2,1486 -test,513B-1KiB,dart,cpp,1,567 -test,513B-1KiB,dart,dart,648,493161 -test,513B-1KiB,dart,groovy,1,803 -test,513B-1KiB,dart,java,4,2551 -test,513B-1KiB,dart,javascript,3,2720 -test,513B-1KiB,dart,rust,1,519 -test,513B-1KiB,dart,typescript,5,3221 -test,513B-1KiB,dart,verilog,1,597 -test,513B-1KiB,dockerfile,batch,2,1225 -test,513B-1KiB,dockerfile,dockerfile,848,615904 -test,513B-1KiB,dockerfile,markdown,1,581 -test,513B-1KiB,dockerfile,ruby,1,574 -test,513B-1KiB,elixir,asm,1,691 -test,513B-1KiB,elixir,batch,1,911 -test,513B-1KiB,elixir,c,1,852 -test,513B-1KiB,elixir,elixir,980,727723 -test,513B-1KiB,elixir,ini,2,1461 -test,513B-1KiB,elixir,objectivec,1,706 -test,513B-1KiB,elixir,r,1,923 -test,513B-1KiB,elixir,ruby,1,706 -test,513B-1KiB,elixir,shell,2,1592 -test,513B-1KiB,elixir,yaml,2,1166 -test,513B-1KiB,erlang,erlang,577,437489 -test,513B-1KiB,erlang,perl,1,941 -test,513B-1KiB,gemfile,gemfile,33,24974 -test,513B-1KiB,gemspec,gemspec,43,34537 -test,513B-1KiB,go,go,718,545365 -test,513B-1KiB,go,groovy,1,634 -test,513B-1KiB,go,scala,1,659 -test,513B-1KiB,gradle,gradle,604,433749 -test,513B-1KiB,gradle,groovy,4,3711 -test,513B-1KiB,gradle,kotlin,1,873 -test,513B-1KiB,groovy,gradle,4,2989 -test,513B-1KiB,groovy,groovy,309,231479 -test,513B-1KiB,groovy,java,5,3638 -test,513B-1KiB,groovy,javascript,4,3209 -test,513B-1KiB,groovy,kotlin,1,767 -test,513B-1KiB,groovy,lua,1,637 -test,513B-1KiB,groovy,scala,1,572 -test,513B-1KiB,groovy,typescript,2,1489 -test,513B-1KiB,haskell,haskell,531,403301 -test,513B-1KiB,haskell,ocaml,3,2143 -test,513B-1KiB,haskell,ruby,1,582 -test,513B-1KiB,html,asm,1,917 -test,513B-1KiB,html,html,594,447577 -test,513B-1KiB,html,markdown,3,1933 -test,513B-1KiB,html,php,1,678 -test,513B-1KiB,html,swift,1,615 -test,513B-1KiB,html,typescript,1,682 -test,513B-1KiB,html,xml,3,2682 -test,513B-1KiB,ini,asm,2,1649 -test,513B-1KiB,ini,batch,1,549 -test,513B-1KiB,ini,cobol,1,998 -test,513B-1KiB,ini,ini,154,112274 -test,513B-1KiB,ini,lua,1,600 -test,513B-1KiB,ini,markdown,1,563 -test,513B-1KiB,ini,objectivec,1,886 -test,513B-1KiB,ini,powershell,1,606 -test,513B-1KiB,ini,shell,1,776 -test,513B-1KiB,ini,toml,1,514 -test,513B-1KiB,java,dart,1,599 -test,513B-1KiB,java,groovy,2,1382 -test,513B-1KiB,java,java,740,561458 -test,513B-1KiB,javascript,erlang,1,1005 -test,513B-1KiB,javascript,java,1,654 -test,513B-1KiB,javascript,javascript,1277,958689 -test,513B-1KiB,javascript,json,6,4945 -test,513B-1KiB,javascript,markdown,2,1440 -test,513B-1KiB,javascript,php,1,822 -test,513B-1KiB,javascript,ruby,4,2393 -test,513B-1KiB,javascript,scala,3,2401 -test,513B-1KiB,javascript,shell,1,534 -test,513B-1KiB,javascript,swift,1,771 -test,513B-1KiB,javascript,typescript,47,33705 -test,513B-1KiB,javascript,yaml,11,8016 -test,513B-1KiB,json,groovy,1,728 -test,513B-1KiB,json,html,1,518 -test,513B-1KiB,json,javascript,1,806 -test,513B-1KiB,json,json,846,616255 -test,513B-1KiB,json,ruby,1,630 -test,513B-1KiB,julia,julia,570,428762 -test,513B-1KiB,julia,lua,3,2313 -test,513B-1KiB,julia,markdown,1,901 -test,513B-1KiB,julia,objectivec,5,3680 -test,513B-1KiB,julia,perl,2,1724 -test,513B-1KiB,julia,python,1,562 -test,513B-1KiB,julia,r,5,4042 -test,513B-1KiB,julia,ruby,2,1718 -test,513B-1KiB,julia,toml,1,819 -test,513B-1KiB,kotlin,gradle,8,5544 -test,513B-1KiB,kotlin,groovy,3,2431 -test,513B-1KiB,kotlin,kotlin,759,571140 -test,513B-1KiB,kotlin,scala,1,915 -test,513B-1KiB,lisp,clojure,3,1654 -test,513B-1KiB,lisp,html,1,996 -test,513B-1KiB,lisp,lisp,356,267801 -test,513B-1KiB,lisp,php,1,548 -test,513B-1KiB,lisp,powershell,1,645 -test,513B-1KiB,lua,gradle,1,589 -test,513B-1KiB,lua,groovy,1,996 -test,513B-1KiB,lua,json,3,2495 -test,513B-1KiB,lua,lua,510,384059 -test,513B-1KiB,lua,markdown,1,824 -test,513B-1KiB,lua,objectivec,2,1773 -test,513B-1KiB,lua,sql,1,972 -test,513B-1KiB,markdown,asm,1,710 -test,513B-1KiB,markdown,batch,2,1513 -test,513B-1KiB,markdown,c,1,617 -test,513B-1KiB,markdown,cmake,1,540 -test,513B-1KiB,markdown,cobol,1,608 -test,513B-1KiB,markdown,cs,1,851 -test,513B-1KiB,markdown,elixir,2,1653 -test,513B-1KiB,markdown,go,1,703 -test,513B-1KiB,markdown,groovy,1,690 -test,513B-1KiB,markdown,html,3,2402 -test,513B-1KiB,markdown,lisp,1,559 -test,513B-1KiB,markdown,markdown,508,379731 -test,513B-1KiB,markdown,typescript,3,2751 -test,513B-1KiB,markdown,yaml,2,1339 -test,513B-1KiB,objectivec,asm,2,1633 -test,513B-1KiB,objectivec,c,5,4292 -test,513B-1KiB,objectivec,cpp,6,4867 -test,513B-1KiB,objectivec,ini,2,1128 -test,513B-1KiB,objectivec,javascript,5,3389 -test,513B-1KiB,objectivec,lua,2,1453 -test,513B-1KiB,objectivec,markdown,1,972 -test,513B-1KiB,objectivec,objectivec,1099,828684 -test,513B-1KiB,objectivec,perl,5,3874 -test,513B-1KiB,objectivec,r,1,763 -test,513B-1KiB,objectivec,verilog,1,587 -test,513B-1KiB,objectivec,xml,1,775 -test,513B-1KiB,ocaml,asm,1,765 -test,513B-1KiB,ocaml,c,2,1769 -test,513B-1KiB,ocaml,clojure,1,793 -test,513B-1KiB,ocaml,haskell,1,514 -test,513B-1KiB,ocaml,markdown,3,2604 -test,513B-1KiB,ocaml,ocaml,518,395898 -test,513B-1KiB,ocaml,powershell,1,785 -test,513B-1KiB,ocaml,ruby,1,964 -test,513B-1KiB,ocaml,typescript,2,1799 -test,513B-1KiB,ocaml,vba,1,584 -test,513B-1KiB,ocaml,verilog,1,709 -test,513B-1KiB,perl,asm,4,2590 -test,513B-1KiB,perl,batch,1,599 -test,513B-1KiB,perl,erlang,9,6682 -test,513B-1KiB,perl,html,1,927 -test,513B-1KiB,perl,javascript,2,1386 -test,513B-1KiB,perl,julia,1,686 -test,513B-1KiB,perl,markdown,2,1432 -test,513B-1KiB,perl,objectivec,7,5181 -test,513B-1KiB,perl,perl,1008,751925 -test,513B-1KiB,perl,php,1,880 -test,513B-1KiB,perl,powershell,1,764 -test,513B-1KiB,perl,r,1,554 -test,513B-1KiB,perl,ruby,1,653 -test,513B-1KiB,perl,sql,1,684 -test,513B-1KiB,perl,typescript,2,1925 -test,513B-1KiB,php,cs,1,596 -test,513B-1KiB,php,css,1,787 -test,513B-1KiB,php,html,21,15707 -test,513B-1KiB,php,javascript,4,3112 -test,513B-1KiB,php,perl,1,633 -test,513B-1KiB,php,php,622,466182 -test,513B-1KiB,powershell,batch,3,2256 -test,513B-1KiB,powershell,groovy,2,1295 -test,513B-1KiB,powershell,html,1,682 -test,513B-1KiB,powershell,javascript,1,951 -test,513B-1KiB,powershell,perl,1,618 -test,513B-1KiB,powershell,powershell,595,461786 -test,513B-1KiB,powershell,shell,4,3038 -test,513B-1KiB,powershell,yaml,1,734 -test,513B-1KiB,python,elixir,1,1006 -test,513B-1KiB,python,ini,1,548 -test,513B-1KiB,python,julia,1,676 -test,513B-1KiB,python,lua,1,737 -test,513B-1KiB,python,python,579,436132 -test,513B-1KiB,python,r,1,925 -test,513B-1KiB,python,ruby,2,1520 -test,513B-1KiB,python,scala,1,925 -test,513B-1KiB,python,shell,1,611 -test,513B-1KiB,python,toml,1,735 -test,513B-1KiB,python,verilog,1,901 -test,513B-1KiB,r,ini,3,2188 -test,513B-1KiB,r,javascript,1,531 -test,513B-1KiB,r,julia,1,761 -test,513B-1KiB,r,lisp,1,907 -test,513B-1KiB,r,lua,1,617 -test,513B-1KiB,r,markdown,1,643 -test,513B-1KiB,r,perl,1,781 -test,513B-1KiB,r,powershell,3,1860 -test,513B-1KiB,r,r,607,463998 -test,513B-1KiB,r,verilog,1,934 -test,513B-1KiB,ruby,elixir,1,926 -test,513B-1KiB,ruby,gemspec,1,735 -test,513B-1KiB,ruby,javascript,1,968 -test,513B-1KiB,ruby,lua,2,1456 -test,513B-1KiB,ruby,python,2,1217 -test,513B-1KiB,ruby,r,1,732 -test,513B-1KiB,ruby,ruby,476,363056 -test,513B-1KiB,ruby,yaml,1,702 -test,513B-1KiB,rust,asm,2,1595 -test,513B-1KiB,rust,batch,1,997 -test,513B-1KiB,rust,c,1,952 -test,513B-1KiB,rust,css,1,559 -test,513B-1KiB,rust,groovy,1,790 -test,513B-1KiB,rust,java,1,801 -test,513B-1KiB,rust,perl,3,2104 -test,513B-1KiB,rust,rust,488,374227 -test,513B-1KiB,rust,typescript,2,1346 -test,513B-1KiB,scala,elixir,1,911 -test,513B-1KiB,scala,go,1,792 -test,513B-1KiB,scala,groovy,3,1654 -test,513B-1KiB,scala,kotlin,3,2195 -test,513B-1KiB,scala,scala,779,580754 -test,513B-1KiB,shell,batch,13,9117 -test,513B-1KiB,shell,cmake,2,1230 -test,513B-1KiB,shell,dockerfile,1,786 -test,513B-1KiB,shell,json,1,680 -test,513B-1KiB,shell,markdown,3,2660 -test,513B-1KiB,shell,ocaml,1,515 -test,513B-1KiB,shell,perl,1,534 -test,513B-1KiB,shell,php,1,989 -test,513B-1KiB,shell,powershell,8,6603 -test,513B-1KiB,shell,ruby,1,875 -test,513B-1KiB,shell,shell,646,473940 -test,513B-1KiB,sql,cobol,4,3190 -test,513B-1KiB,sql,ini,2,1106 -test,513B-1KiB,sql,javascript,1,594 -test,513B-1KiB,sql,markdown,1,998 -test,513B-1KiB,sql,sql,552,411045 -test,513B-1KiB,sql,vba,1,738 -test,513B-1KiB,sql,verilog,1,527 -test,513B-1KiB,swift,markdown,1,627 -test,513B-1KiB,swift,swift,888,716845 -test,513B-1KiB,toml,ini,2,1363 -test,513B-1KiB,toml,toml,486,343159 -test,513B-1KiB,typescript,groovy,1,792 -test,513B-1KiB,typescript,java,1,756 -test,513B-1KiB,typescript,javascript,15,12447 -test,513B-1KiB,typescript,typescript,775,580884 -test,513B-1KiB,typescript,xml,1,792 -test,513B-1KiB,vba,cobol,6,6072 -test,513B-1KiB,vba,lua,1,971 -test,513B-1KiB,vba,r,1,803 -test,513B-1KiB,vba,vba,225,170193 -test,513B-1KiB,verilog,asm,1,596 -test,513B-1KiB,verilog,c,1,809 -test,513B-1KiB,verilog,dart,1,667 -test,513B-1KiB,verilog,ini,2,1880 -test,513B-1KiB,verilog,javascript,1,894 -test,513B-1KiB,verilog,kotlin,1,737 -test,513B-1KiB,verilog,lisp,1,534 -test,513B-1KiB,verilog,markdown,1,795 -test,513B-1KiB,verilog,scala,1,756 -test,513B-1KiB,verilog,verilog,502,376879 -test,513B-1KiB,xml,html,5,3954 -test,513B-1KiB,xml,markdown,1,798 -test,513B-1KiB,xml,xml,693,513445 -test,513B-1KiB,yaml,markdown,2,1281 -test,513B-1KiB,yaml,ruby,1,525 -test,513B-1KiB,yaml,yaml,704,520523 -test,1-4KiB,asm,asm,1231,2748940 -test,1-4KiB,asm,batch,2,6394 -test,1-4KiB,asm,c,4,8731 -test,1-4KiB,asm,cpp,1,2735 -test,1-4KiB,asm,elixir,3,4790 -test,1-4KiB,asm,erlang,1,2408 -test,1-4KiB,asm,html,4,8407 -test,1-4KiB,asm,ini,3,6616 -test,1-4KiB,asm,javascript,2,6601 -test,1-4KiB,asm,objectivec,2,3812 -test,1-4KiB,asm,perl,1,2368 -test,1-4KiB,asm,r,3,8455 -test,1-4KiB,asm,verilog,4,9127 -test,1-4KiB,asm,yaml,1,1643 -test,1-4KiB,batch,asm,2,4608 -test,1-4KiB,batch,batch,739,1538076 -test,1-4KiB,batch,c,1,1108 -test,1-4KiB,batch,cmake,2,2626 -test,1-4KiB,batch,cobol,2,3499 -test,1-4KiB,batch,ini,5,11739 -test,1-4KiB,batch,javascript,3,4700 -test,1-4KiB,batch,powershell,2,6375 -test,1-4KiB,batch,r,1,1729 -test,1-4KiB,batch,shell,5,10636 -test,1-4KiB,batch,sql,2,4436 -test,1-4KiB,c,asm,4,5191 -test,1-4KiB,c,batch,2,3867 -test,1-4KiB,c,c,1708,3800844 -test,1-4KiB,c,cpp,120,245697 -test,1-4KiB,c,cs,2,2379 -test,1-4KiB,c,dart,1,2351 -test,1-4KiB,c,java,1,3740 -test,1-4KiB,c,javascript,1,1889 -test,1-4KiB,c,markdown,1,1985 -test,1-4KiB,c,objectivec,8,16142 -test,1-4KiB,c,sql,1,2434 -test,1-4KiB,c,swift,3,6182 -test,1-4KiB,c,verilog,1,1318 -test,1-4KiB,clojure,asm,1,1830 -test,1-4KiB,clojure,clojure,1321,2791722 -test,1-4KiB,clojure,json,1,1624 -test,1-4KiB,clojure,lisp,2,3726 -test,1-4KiB,cmake,asm,2,5274 -test,1-4KiB,cmake,batch,1,2469 -test,1-4KiB,cmake,c,3,6887 -test,1-4KiB,cmake,cmake,2141,4373628 -test,1-4KiB,cmake,cpp,2,3262 -test,1-4KiB,cmake,ini,1,2312 -test,1-4KiB,cmake,markdown,3,7210 -test,1-4KiB,cmake,powershell,2,2933 -test,1-4KiB,cmake,r,2,4056 -test,1-4KiB,cmake,shell,2,2193 -test,1-4KiB,cmake,vba,1,1763 -test,1-4KiB,cmake,xml,1,2832 -test,1-4KiB,cmake,yaml,1,1092 -test,1-4KiB,cobol,cobol,71,161544 -test,1-4KiB,cpp,asm,2,3601 -test,1-4KiB,cpp,batch,2,8192 -test,1-4KiB,cpp,c,140,317919 -test,1-4KiB,cpp,cmake,1,2206 -test,1-4KiB,cpp,cpp,1011,2288949 -test,1-4KiB,cpp,cs,6,15450 -test,1-4KiB,cpp,dart,2,2957 -test,1-4KiB,cpp,erlang,1,1265 -test,1-4KiB,cpp,java,2,6538 -test,1-4KiB,cpp,javascript,2,6502 -test,1-4KiB,cpp,julia,1,2429 -test,1-4KiB,cpp,objectivec,2,4390 -test,1-4KiB,cpp,php,1,3859 -test,1-4KiB,cpp,shell,1,1974 -test,1-4KiB,cs,batch,2,2824 -test,1-4KiB,cs,cs,1736,3397193 -test,1-4KiB,cs,dart,1,1942 -test,1-4KiB,cs,groovy,1,2804 -test,1-4KiB,cs,java,5,14771 -test,1-4KiB,cs,powershell,2,5738 -test,1-4KiB,cs,shell,1,1328 -test,1-4KiB,cs,swift,1,3652 -test,1-4KiB,cs,typescript,2,6577 -test,1-4KiB,css,batch,4,16384 -test,1-4KiB,css,css,1194,2616007 -test,1-4KiB,css,html,3,9980 -test,1-4KiB,css,powershell,1,3346 -test,1-4KiB,dart,c,1,1700 -test,1-4KiB,dart,cpp,3,6391 -test,1-4KiB,dart,cs,1,1444 -test,1-4KiB,dart,dart,1475,3142050 -test,1-4KiB,dart,go,1,2093 -test,1-4KiB,dart,groovy,2,5991 -test,1-4KiB,dart,html,1,1030 -test,1-4KiB,dart,java,3,6337 -test,1-4KiB,dart,typescript,4,6538 -test,1-4KiB,dockerfile,batch,1,1492 -test,1-4KiB,dockerfile,cmake,1,1321 -test,1-4KiB,dockerfile,dockerfile,1250,2597528 -test,1-4KiB,dockerfile,markdown,28,75116 -test,1-4KiB,dockerfile,shell,57,138821 -test,1-4KiB,elixir,asm,2,3494 -test,1-4KiB,elixir,batch,2,3016 -test,1-4KiB,elixir,elixir,1185,2055479 -test,1-4KiB,elixir,erlang,2,2304 -test,1-4KiB,elixir,lua,1,1661 -test,1-4KiB,elixir,markdown,1,2752 -test,1-4KiB,elixir,perl,2,5670 -test,1-4KiB,elixir,powershell,2,2526 -test,1-4KiB,elixir,ruby,1,1543 -test,1-4KiB,elixir,shell,2,3107 -test,1-4KiB,elixir,yaml,1,2193 -test,1-4KiB,erlang,erlang,1263,2769243 -test,1-4KiB,erlang,javascript,1,3710 -test,1-4KiB,erlang,json,1,2626 -test,1-4KiB,erlang,perl,1,2501 -test,1-4KiB,gemfile,gemfile,28,44830 -test,1-4KiB,gemfile,ruby,2,3620 -test,1-4KiB,gemspec,gemspec,25,33973 -test,1-4KiB,go,go,1619,3572124 -test,1-4KiB,go,gradle,1,1910 -test,1-4KiB,go,groovy,2,6696 -test,1-4KiB,go,html,1,1651 -test,1-4KiB,go,java,1,1166 -test,1-4KiB,go,julia,1,1276 -test,1-4KiB,go,kotlin,1,4033 -test,1-4KiB,go,sql,1,4020 -test,1-4KiB,go,yaml,1,2168 -test,1-4KiB,gradle,gradle,687,1224620 -test,1-4KiB,gradle,groovy,5,16148 -test,1-4KiB,groovy,gradle,3,4466 -test,1-4KiB,groovy,groovy,628,1354282 -test,1-4KiB,groovy,java,16,34419 -test,1-4KiB,groovy,javascript,2,3420 -test,1-4KiB,groovy,json,1,1669 -test,1-4KiB,groovy,objectivec,1,3627 -test,1-4KiB,groovy,powershell,1,2340 -test,1-4KiB,groovy,scala,2,3478 -test,1-4KiB,groovy,yaml,1,3086 -test,1-4KiB,haskell,asm,1,1373 -test,1-4KiB,haskell,batch,3,4191 -test,1-4KiB,haskell,haskell,1609,3564096 -test,1-4KiB,haskell,markdown,1,1397 -test,1-4KiB,haskell,ocaml,3,9118 -test,1-4KiB,haskell,sql,1,3530 -test,1-4KiB,html,c,1,1700 -test,1-4KiB,html,css,2,5133 -test,1-4KiB,html,html,1127,2418622 -test,1-4KiB,html,ini,1,4096 -test,1-4KiB,html,javascript,3,5455 -test,1-4KiB,html,markdown,1,4041 -test,1-4KiB,html,objectivec,1,1348 -test,1-4KiB,html,php,2,3171 -test,1-4KiB,html,shell,1,1580 -test,1-4KiB,html,typescript,1,2927 -test,1-4KiB,html,yaml,2,2856 -test,1-4KiB,ini,asm,2,5701 -test,1-4KiB,ini,batch,2,5748 -test,1-4KiB,ini,cmake,1,3040 -test,1-4KiB,ini,cobol,1,2493 -test,1-4KiB,ini,elixir,1,1725 -test,1-4KiB,ini,html,1,1486 -test,1-4KiB,ini,ini,147,302493 -test,1-4KiB,ini,lua,1,1226 -test,1-4KiB,ini,objectivec,3,3937 -test,1-4KiB,ini,perl,2,2320 -test,1-4KiB,ini,php,1,1362 -test,1-4KiB,ini,powershell,1,2056 -test,1-4KiB,ini,python,1,1111 -test,1-4KiB,ini,r,2,3878 -test,1-4KiB,ini,shell,1,2019 -test,1-4KiB,ini,sql,1,1754 -test,1-4KiB,ini,toml,4,7545 -test,1-4KiB,java,dockerfile,1,1385 -test,1-4KiB,java,html,1,1790 -test,1-4KiB,java,java,1424,3006364 -test,1-4KiB,java,scala,2,2302 -test,1-4KiB,java,sql,1,2367 -test,1-4KiB,javascript,asm,1,3556 -test,1-4KiB,javascript,batch,1,4096 -test,1-4KiB,javascript,c,2,2535 -test,1-4KiB,javascript,cs,1,1376 -test,1-4KiB,javascript,erlang,4,10974 -test,1-4KiB,javascript,groovy,1,3137 -test,1-4KiB,javascript,html,2,3145 -test,1-4KiB,javascript,java,1,2840 -test,1-4KiB,javascript,javascript,2506,5403368 -test,1-4KiB,javascript,json,7,16501 -test,1-4KiB,javascript,markdown,1,3955 -test,1-4KiB,javascript,powershell,3,5433 -test,1-4KiB,javascript,ruby,1,1430 -test,1-4KiB,javascript,swift,1,1066 -test,1-4KiB,javascript,toml,1,1990 -test,1-4KiB,javascript,typescript,65,130538 -test,1-4KiB,javascript,vba,1,1275 -test,1-4KiB,javascript,verilog,1,1870 -test,1-4KiB,javascript,yaml,11,20452 -test,1-4KiB,json,batch,2,6201 -test,1-4KiB,json,ini,1,1341 -test,1-4KiB,json,javascript,1,1332 -test,1-4KiB,json,json,853,1623402 -test,1-4KiB,json,markdown,1,1869 -test,1-4KiB,json,r,1,2988 -test,1-4KiB,julia,asm,2,2863 -test,1-4KiB,julia,batch,1,1352 -test,1-4KiB,julia,cmake,1,1443 -test,1-4KiB,julia,cpp,1,1574 -test,1-4KiB,julia,ini,1,4096 -test,1-4KiB,julia,julia,1462,3274396 -test,1-4KiB,julia,lua,3,8594 -test,1-4KiB,julia,markdown,2,3375 -test,1-4KiB,julia,objectivec,5,11869 -test,1-4KiB,julia,r,2,3852 -test,1-4KiB,julia,ruby,1,1092 -test,1-4KiB,julia,toml,1,1108 -test,1-4KiB,kotlin,gradle,2,2746 -test,1-4KiB,kotlin,kotlin,1571,3288866 -test,1-4KiB,kotlin,scala,2,6154 -test,1-4KiB,kotlin,typescript,1,4095 -test,1-4KiB,lisp,asm,1,1156 -test,1-4KiB,lisp,batch,1,2942 -test,1-4KiB,lisp,html,2,4403 -test,1-4KiB,lisp,lisp,1118,2537952 -test,1-4KiB,lisp,perl,1,2711 -test,1-4KiB,lua,c,2,4401 -test,1-4KiB,lua,groovy,2,5827 -test,1-4KiB,lua,ini,1,1671 -test,1-4KiB,lua,javascript,3,8716 -test,1-4KiB,lua,json,5,9707 -test,1-4KiB,lua,julia,4,6567 -test,1-4KiB,lua,lua,1420,3253020 -test,1-4KiB,lua,objectivec,2,5518 -test,1-4KiB,lua,r,2,4686 -test,1-4KiB,lua,sql,1,1039 -test,1-4KiB,markdown,asm,3,4277 -test,1-4KiB,markdown,batch,1,2873 -test,1-4KiB,markdown,cmake,1,2848 -test,1-4KiB,markdown,cobol,1,2435 -test,1-4KiB,markdown,cpp,2,3609 -test,1-4KiB,markdown,css,1,1530 -test,1-4KiB,markdown,dockerfile,2,4517 -test,1-4KiB,markdown,elixir,3,3550 -test,1-4KiB,markdown,erlang,2,3927 -test,1-4KiB,markdown,go,3,6025 -test,1-4KiB,markdown,gradle,4,8866 -test,1-4KiB,markdown,groovy,2,4726 -test,1-4KiB,markdown,haskell,2,2743 -test,1-4KiB,markdown,html,9,20338 -test,1-4KiB,markdown,javascript,2,5028 -test,1-4KiB,markdown,markdown,1016,2086155 -test,1-4KiB,markdown,objectivec,2,5205 -test,1-4KiB,markdown,ocaml,2,4197 -test,1-4KiB,markdown,perl,1,2675 -test,1-4KiB,markdown,php,1,2605 -test,1-4KiB,markdown,powershell,1,3353 -test,1-4KiB,markdown,python,1,1287 -test,1-4KiB,markdown,shell,1,3597 -test,1-4KiB,markdown,swift,3,4126 -test,1-4KiB,markdown,typescript,4,9960 -test,1-4KiB,markdown,yaml,6,10013 -test,1-4KiB,objectivec,asm,1,1056 -test,1-4KiB,objectivec,batch,1,4096 -test,1-4KiB,objectivec,c,9,17753 -test,1-4KiB,objectivec,cpp,15,26798 -test,1-4KiB,objectivec,erlang,1,3521 -test,1-4KiB,objectivec,html,1,1291 -test,1-4KiB,objectivec,java,1,1973 -test,1-4KiB,objectivec,javascript,1,2371 -test,1-4KiB,objectivec,julia,2,3256 -test,1-4KiB,objectivec,objectivec,2472,5269226 -test,1-4KiB,objectivec,perl,8,17301 -test,1-4KiB,objectivec,r,1,1437 -test,1-4KiB,ocaml,cobol,1,1376 -test,1-4KiB,ocaml,markdown,1,3437 -test,1-4KiB,ocaml,objectivec,1,3456 -test,1-4KiB,ocaml,ocaml,1378,3053478 -test,1-4KiB,ocaml,sql,1,3167 -test,1-4KiB,ocaml,typescript,2,6265 -test,1-4KiB,ocaml,verilog,3,7600 -test,1-4KiB,ocaml,xml,1,3385 -test,1-4KiB,perl,asm,3,7258 -test,1-4KiB,perl,cmake,1,3816 -test,1-4KiB,perl,cs,1,1184 -test,1-4KiB,perl,erlang,5,6801 -test,1-4KiB,perl,java,3,6118 -test,1-4KiB,perl,json,1,1064 -test,1-4KiB,perl,markdown,2,3864 -test,1-4KiB,perl,objectivec,9,17528 -test,1-4KiB,perl,perl,2510,5504900 -test,1-4KiB,perl,php,1,2945 -test,1-4KiB,perl,powershell,3,7112 -test,1-4KiB,perl,r,1,1107 -test,1-4KiB,perl,rust,1,1523 -test,1-4KiB,perl,typescript,2,5162 -test,1-4KiB,perl,xml,1,2590 -test,1-4KiB,php,batch,6,24576 -test,1-4KiB,php,cs,1,1337 -test,1-4KiB,php,html,41,93369 -test,1-4KiB,php,javascript,2,3556 -test,1-4KiB,php,json,1,1085 -test,1-4KiB,php,perl,1,2483 -test,1-4KiB,php,php,1444,3138664 -test,1-4KiB,powershell,batch,6,13744 -test,1-4KiB,powershell,cs,1,1121 -test,1-4KiB,powershell,dockerfile,1,1146 -test,1-4KiB,powershell,groovy,1,1102 -test,1-4KiB,powershell,ini,4,11285 -test,1-4KiB,powershell,json,1,1331 -test,1-4KiB,powershell,lua,1,1187 -test,1-4KiB,powershell,markdown,1,2968 -test,1-4KiB,powershell,perl,1,2042 -test,1-4KiB,powershell,powershell,1456,3239151 -test,1-4KiB,powershell,ruby,1,1198 -test,1-4KiB,powershell,xml,1,1212 -test,1-4KiB,python,batch,1,4096 -test,1-4KiB,python,c,1,2246 -test,1-4KiB,python,cs,1,2867 -test,1-4KiB,python,gradle,1,1125 -test,1-4KiB,python,groovy,2,3895 -test,1-4KiB,python,ini,3,6652 -test,1-4KiB,python,javascript,1,2800 -test,1-4KiB,python,json,2,4617 -test,1-4KiB,python,julia,2,3874 -test,1-4KiB,python,kotlin,1,1264 -test,1-4KiB,python,lua,1,1661 -test,1-4KiB,python,perl,3,3996 -test,1-4KiB,python,python,1434,3134675 -test,1-4KiB,python,r,2,4179 -test,1-4KiB,python,ruby,1,1704 -test,1-4KiB,python,shell,1,3656 -test,1-4KiB,python,sql,1,1290 -test,1-4KiB,python,toml,3,5691 -test,1-4KiB,r,batch,2,6746 -test,1-4KiB,r,c,1,1134 -test,1-4KiB,r,cmake,2,2782 -test,1-4KiB,r,html,1,1499 -test,1-4KiB,r,ini,5,13225 -test,1-4KiB,r,javascript,5,13319 -test,1-4KiB,r,julia,1,2235 -test,1-4KiB,r,lua,1,1710 -test,1-4KiB,r,markdown,1,1254 -test,1-4KiB,r,perl,1,1222 -test,1-4KiB,r,python,2,3428 -test,1-4KiB,r,r,1693,3727657 -test,1-4KiB,r,sql,1,2705 -test,1-4KiB,r,typescript,1,2435 -test,1-4KiB,r,yaml,1,1955 -test,1-4KiB,ruby,elixir,3,4790 -test,1-4KiB,ruby,gemspec,1,2266 -test,1-4KiB,ruby,go,1,4092 -test,1-4KiB,ruby,javascript,4,7220 -test,1-4KiB,ruby,julia,1,1413 -test,1-4KiB,ruby,lua,1,1738 -test,1-4KiB,ruby,python,2,2625 -test,1-4KiB,ruby,ruby,760,1478047 -test,1-4KiB,ruby,typescript,1,1851 -test,1-4KiB,rust,asm,1,3211 -test,1-4KiB,rust,c,3,7772 -test,1-4KiB,rust,html,1,3477 -test,1-4KiB,rust,kotlin,3,4904 -test,1-4KiB,rust,markdown,2,4071 -test,1-4KiB,rust,perl,3,5047 -test,1-4KiB,rust,rust,1488,3298239 -test,1-4KiB,rust,scala,1,3250 -test,1-4KiB,rust,swift,1,2837 -test,1-4KiB,rust,typescript,2,6172 -test,1-4KiB,rust,verilog,1,2552 -test,1-4KiB,scala,groovy,4,9809 -test,1-4KiB,scala,kotlin,8,14061 -test,1-4KiB,scala,r,1,1342 -test,1-4KiB,scala,scala,1409,2860229 -test,1-4KiB,shell,batch,13,25661 -test,1-4KiB,shell,cmake,3,6775 -test,1-4KiB,shell,elixir,1,1820 -test,1-4KiB,shell,ini,2,3941 -test,1-4KiB,shell,lisp,2,6232 -test,1-4KiB,shell,lua,1,3497 -test,1-4KiB,shell,markdown,3,4756 -test,1-4KiB,shell,objectivec,1,1574 -test,1-4KiB,shell,perl,1,1543 -test,1-4KiB,shell,powershell,16,27030 -test,1-4KiB,shell,python,1,1956 -test,1-4KiB,shell,shell,853,1786676 -test,1-4KiB,shell,sql,1,1499 -test,1-4KiB,shell,xml,1,2107 -test,1-4KiB,sql,asm,1,3440 -test,1-4KiB,sql,batch,1,2774 -test,1-4KiB,sql,ini,1,2806 -test,1-4KiB,sql,lua,1,1237 -test,1-4KiB,sql,markdown,1,1796 -test,1-4KiB,sql,perl,2,2722 -test,1-4KiB,sql,powershell,1,2366 -test,1-4KiB,sql,ruby,1,1030 -test,1-4KiB,sql,shell,1,1663 -test,1-4KiB,sql,sql,941,1984576 -test,1-4KiB,sql,vba,7,17842 -test,1-4KiB,swift,batch,2,8192 -test,1-4KiB,swift,dart,1,1510 -test,1-4KiB,swift,go,1,1446 -test,1-4KiB,swift,groovy,1,1689 -test,1-4KiB,swift,javascript,1,1219 -test,1-4KiB,swift,markdown,1,1190 -test,1-4KiB,swift,ocaml,1,1558 -test,1-4KiB,swift,swift,1859,3984913 -test,1-4KiB,swift,typescript,1,1026 -test,1-4KiB,toml,ini,4,8404 -test,1-4KiB,toml,javascript,1,1127 -test,1-4KiB,toml,powershell,2,4707 -test,1-4KiB,toml,toml,328,612659 -test,1-4KiB,typescript,javascript,11,28410 -test,1-4KiB,typescript,markdown,1,2369 -test,1-4KiB,typescript,typescript,1115,2253838 -test,1-4KiB,typescript,xml,8,19750 -test,1-4KiB,vba,cobol,2,2132 -test,1-4KiB,vba,elixir,1,1167 -test,1-4KiB,vba,lua,3,7303 -test,1-4KiB,vba,powershell,1,1904 -test,1-4KiB,vba,r,3,4670 -test,1-4KiB,vba,typescript,1,2360 -test,1-4KiB,vba,vba,1840,4091686 -test,1-4KiB,vba,verilog,1,4062 -test,1-4KiB,verilog,asm,2,2901 -test,1-4KiB,verilog,batch,2,6000 -test,1-4KiB,verilog,c,1,1620 -test,1-4KiB,verilog,cpp,1,1114 -test,1-4KiB,verilog,elixir,1,2763 -test,1-4KiB,verilog,ini,1,2127 -test,1-4KiB,verilog,javascript,1,1870 -test,1-4KiB,verilog,objectivec,2,5607 -test,1-4KiB,verilog,rust,1,2571 -test,1-4KiB,verilog,scala,1,2504 -test,1-4KiB,verilog,shell,1,2714 -test,1-4KiB,verilog,sql,1,1324 -test,1-4KiB,verilog,typescript,2,6871 -test,1-4KiB,verilog,verilog,1256,2790575 -test,1-4KiB,xml,asm,1,1392 -test,1-4KiB,xml,batch,1,2778 -test,1-4KiB,xml,cobol,1,1379 -test,1-4KiB,xml,cs,1,3671 -test,1-4KiB,xml,html,4,11257 -test,1-4KiB,xml,objectivec,1,2800 -test,1-4KiB,xml,powershell,1,1475 -test,1-4KiB,xml,xml,1221,2595773 -test,1-4KiB,yaml,json,2,3200 -test,1-4KiB,yaml,markdown,1,1573 -test,1-4KiB,yaml,shell,1,1982 -test,1-4KiB,yaml,yaml,784,1517921 -test,4-16KiB,asm,asm,875,7309198 -test,4-16KiB,asm,batch,6,42419 -test,4-16KiB,asm,c,8,82754 -test,4-16KiB,asm,css,1,4548 -test,4-16KiB,asm,ini,4,36098 -test,4-16KiB,asm,lisp,1,11017 -test,4-16KiB,asm,objectivec,2,13671 -test,4-16KiB,asm,perl,1,8267 -test,4-16KiB,asm,php,2,15429 -test,4-16KiB,asm,powershell,2,28366 -test,4-16KiB,asm,r,11,81268 -test,4-16KiB,asm,verilog,2,23009 -test,4-16KiB,asm,xml,1,16172 -test,4-16KiB,batch,asm,1,6002 -test,4-16KiB,batch,batch,249,1920541 -test,4-16KiB,batch,c,1,6338 -test,4-16KiB,batch,cmake,1,12234 -test,4-16KiB,batch,cs,4,27078 -test,4-16KiB,batch,ini,3,27932 -test,4-16KiB,batch,java,1,6747 -test,4-16KiB,batch,lua,1,8777 -test,4-16KiB,batch,markdown,1,7659 -test,4-16KiB,batch,powershell,3,37297 -test,4-16KiB,batch,shell,2,23043 -test,4-16KiB,c,asm,8,63153 -test,4-16KiB,c,batch,2,26114 -test,4-16KiB,c,c,1189,9593018 -test,4-16KiB,c,cpp,70,571122 -test,4-16KiB,c,cs,3,32973 -test,4-16KiB,c,html,2,9537 -test,4-16KiB,c,ini,1,8192 -test,4-16KiB,c,java,1,6499 -test,4-16KiB,c,javascript,1,7620 -test,4-16KiB,c,json,1,9675 -test,4-16KiB,c,lua,1,6962 -test,4-16KiB,c,markdown,2,17159 -test,4-16KiB,c,objectivec,8,68306 -test,4-16KiB,c,perl,1,6800 -test,4-16KiB,c,vba,1,10737 -test,4-16KiB,clojure,clojure,478,3380150 -test,4-16KiB,clojure,lisp,3,28921 -test,4-16KiB,clojure,markdown,1,5759 -test,4-16KiB,clojure,verilog,1,4925 -test,4-16KiB,cmake,asm,1,10297 -test,4-16KiB,cmake,c,1,5242 -test,4-16KiB,cmake,cmake,960,6854747 -test,4-16KiB,cmake,ini,2,18319 -test,4-16KiB,cmake,markdown,2,21051 -test,4-16KiB,cmake,r,1,6490 -test,4-16KiB,cmake,shell,2,24887 -test,4-16KiB,cobol,asm,1,6583 -test,4-16KiB,cobol,cobol,59,444744 -test,4-16KiB,cobol,yaml,1,6393 -test,4-16KiB,cpp,asm,1,7459 -test,4-16KiB,cpp,c,121,1028892 -test,4-16KiB,cpp,cpp,722,5640067 -test,4-16KiB,cpp,cs,5,30215 -test,4-16KiB,cpp,dart,1,12465 -test,4-16KiB,cpp,ini,1,11634 -test,4-16KiB,cpp,java,4,37455 -test,4-16KiB,cpp,javascript,2,10237 -test,4-16KiB,cpp,typescript,1,9266 -test,4-16KiB,cs,asm,1,14029 -test,4-16KiB,cs,cpp,2,27056 -test,4-16KiB,cs,cs,613,4891854 -test,4-16KiB,cs,dart,1,12361 -test,4-16KiB,cs,java,10,98485 -test,4-16KiB,cs,typescript,1,5367 -test,4-16KiB,css,asm,1,4459 -test,4-16KiB,css,css,702,5828489 -test,4-16KiB,css,typescript,1,6091 -test,4-16KiB,dart,c,1,6156 -test,4-16KiB,dart,cs,1,10264 -test,4-16KiB,dart,dart,685,5016041 -test,4-16KiB,dart,java,2,9595 -test,4-16KiB,dart,javascript,1,15184 -test,4-16KiB,dart,typescript,1,13801 -test,4-16KiB,dockerfile,dockerfile,177,1200108 -test,4-16KiB,dockerfile,shell,2,18522 -test,4-16KiB,elixir,elixir,175,1246347 -test,4-16KiB,elixir,shell,1,4302 -test,4-16KiB,elixir,xml,7,45268 -test,4-16KiB,erlang,erlang,779,6017268 -test,4-16KiB,erlang,perl,1,8712 -test,4-16KiB,gemspec,gemspec,1,7141 -test,4-16KiB,go,asm,1,5658 -test,4-16KiB,go,c,1,9575 -test,4-16KiB,go,go,702,5040505 -test,4-16KiB,go,groovy,1,7452 -test,4-16KiB,go,python,1,5242 -test,4-16KiB,go,scala,1,4364 -test,4-16KiB,go,xml,1,5719 -test,4-16KiB,gradle,gradle,92,586180 -test,4-16KiB,gradle,groovy,4,21517 -test,4-16KiB,groovy,asm,1,10513 -test,4-16KiB,groovy,groovy,250,1774299 -test,4-16KiB,groovy,java,7,52166 -test,4-16KiB,groovy,kotlin,1,5027 -test,4-16KiB,groovy,scala,2,13329 -test,4-16KiB,haskell,asm,1,5594 -test,4-16KiB,haskell,haskell,869,6579328 -test,4-16KiB,haskell,lua,1,5375 -test,4-16KiB,haskell,typescript,1,7245 -test,4-16KiB,html,css,1,4116 -test,4-16KiB,html,html,755,6202931 -test,4-16KiB,html,javascript,2,16395 -test,4-16KiB,html,markdown,2,11451 -test,4-16KiB,html,objectivec,4,35342 -test,4-16KiB,html,php,1,4261 -test,4-16KiB,html,r,1,7671 -test,4-16KiB,html,xml,2,12319 -test,4-16KiB,ini,asm,2,9681 -test,4-16KiB,ini,batch,2,16721 -test,4-16KiB,ini,c,1,13134 -test,4-16KiB,ini,ini,83,615968 -test,4-16KiB,ini,perl,1,4880 -test,4-16KiB,ini,sql,2,20612 -test,4-16KiB,ini,toml,4,31069 -test,4-16KiB,ini,xml,2,17057 -test,4-16KiB,java,c,1,4741 -test,4-16KiB,java,cs,2,9743 -test,4-16KiB,java,dart,1,6769 -test,4-16KiB,java,java,641,4783339 -test,4-16KiB,javascript,asm,2,15109 -test,4-16KiB,javascript,batch,1,4968 -test,4-16KiB,javascript,cmake,1,5064 -test,4-16KiB,javascript,cs,1,6461 -test,4-16KiB,javascript,css,1,6752 -test,4-16KiB,javascript,elixir,2,15182 -test,4-16KiB,javascript,gradle,1,5568 -test,4-16KiB,javascript,html,2,15936 -test,4-16KiB,javascript,java,1,5251 -test,4-16KiB,javascript,javascript,1084,8632473 -test,4-16KiB,javascript,json,5,43310 -test,4-16KiB,javascript,python,1,6427 -test,4-16KiB,javascript,shell,1,5981 -test,4-16KiB,javascript,typescript,20,157390 -test,4-16KiB,javascript,yaml,4,32242 -test,4-16KiB,json,asm,1,7891 -test,4-16KiB,json,cs,1,4493 -test,4-16KiB,json,css,1,9407 -test,4-16KiB,json,erlang,1,13236 -test,4-16KiB,json,ini,2,15445 -test,4-16KiB,json,javascript,1,6826 -test,4-16KiB,json,json,240,1957610 -test,4-16KiB,julia,batch,1,7712 -test,4-16KiB,julia,json,1,8197 -test,4-16KiB,julia,julia,847,6539090 -test,4-16KiB,julia,lua,1,10809 -test,4-16KiB,julia,objectivec,2,12256 -test,4-16KiB,julia,perl,1,7792 -test,4-16KiB,julia,r,1,13772 -test,4-16KiB,julia,ruby,3,18716 -test,4-16KiB,julia,yaml,1,6317 -test,4-16KiB,kotlin,groovy,3,19654 -test,4-16KiB,kotlin,java,1,7570 -test,4-16KiB,kotlin,kotlin,486,3475585 -test,4-16KiB,kotlin,scala,2,15773 -test,4-16KiB,kotlin,swift,1,7356 -test,4-16KiB,kotlin,typescript,1,5259 -test,4-16KiB,lisp,clojure,1,4162 -test,4-16KiB,lisp,cmake,1,4448 -test,4-16KiB,lisp,lisp,1046,8732469 -test,4-16KiB,lua,c,1,4356 -test,4-16KiB,lua,ini,1,5012 -test,4-16KiB,lua,javascript,3,19200 -test,4-16KiB,lua,json,1,10173 -test,4-16KiB,lua,julia,1,5004 -test,4-16KiB,lua,lua,1017,8056307 -test,4-16KiB,lua,r,1,10200 -test,4-16KiB,lua,ruby,1,12934 -test,4-16KiB,lua,toml,1,12155 -test,4-16KiB,lua,typescript,1,6462 -test,4-16KiB,markdown,asm,1,6118 -test,4-16KiB,markdown,cmake,1,5818 -test,4-16KiB,markdown,cobol,1,13285 -test,4-16KiB,markdown,elixir,2,9110 -test,4-16KiB,markdown,go,1,4857 -test,4-16KiB,markdown,gradle,1,4317 -test,4-16KiB,markdown,groovy,1,16296 -test,4-16KiB,markdown,html,3,33816 -test,4-16KiB,markdown,java,1,4520 -test,4-16KiB,markdown,javascript,1,5202 -test,4-16KiB,markdown,lisp,1,5802 -test,4-16KiB,markdown,markdown,324,2333988 -test,4-16KiB,markdown,objectivec,2,14542 -test,4-16KiB,markdown,python,1,13087 -test,4-16KiB,markdown,ruby,1,10682 -test,4-16KiB,markdown,swift,1,7056 -test,4-16KiB,markdown,typescript,2,11053 -test,4-16KiB,markdown,xml,1,5140 -test,4-16KiB,markdown,yaml,1,9769 -test,4-16KiB,objectivec,asm,1,7071 -test,4-16KiB,objectivec,c,14,128093 -test,4-16KiB,objectivec,cpp,24,188394 -test,4-16KiB,objectivec,javascript,1,6041 -test,4-16KiB,objectivec,julia,1,4176 -test,4-16KiB,objectivec,objectivec,1026,7731114 -test,4-16KiB,objectivec,perl,3,25954 -test,4-16KiB,objectivec,powershell,1,8482 -test,4-16KiB,objectivec,r,1,13810 -test,4-16KiB,objectivec,xml,3,28179 -test,4-16KiB,ocaml,haskell,1,6170 -test,4-16KiB,ocaml,lisp,1,6874 -test,4-16KiB,ocaml,ocaml,923,7436218 -test,4-16KiB,ocaml,rust,1,4884 -test,4-16KiB,ocaml,typescript,5,37436 -test,4-16KiB,ocaml,verilog,2,12640 -test,4-16KiB,perl,asm,1,13871 -test,4-16KiB,perl,batch,1,7113 -test,4-16KiB,perl,c,3,18999 -test,4-16KiB,perl,cpp,1,9621 -test,4-16KiB,perl,erlang,24,212433 -test,4-16KiB,perl,groovy,1,6121 -test,4-16KiB,perl,ini,3,16407 -test,4-16KiB,perl,javascript,1,4746 -test,4-16KiB,perl,markdown,3,31852 -test,4-16KiB,perl,objectivec,21,185776 -test,4-16KiB,perl,perl,1682,13667148 -test,4-16KiB,perl,php,1,4844 -test,4-16KiB,perl,powershell,5,38757 -test,4-16KiB,perl,r,43,395833 -test,4-16KiB,perl,ruby,1,13935 -test,4-16KiB,perl,typescript,4,23511 -test,4-16KiB,perl,yaml,2,19777 -test,4-16KiB,php,html,32,261382 -test,4-16KiB,php,json,1,6975 -test,4-16KiB,php,objectivec,1,10778 -test,4-16KiB,php,php,729,5383779 -test,4-16KiB,php,xml,1,13155 -test,4-16KiB,powershell,batch,1,9738 -test,4-16KiB,powershell,cs,2,10095 -test,4-16KiB,powershell,javascript,2,13996 -test,4-16KiB,powershell,markdown,1,14460 -test,4-16KiB,powershell,powershell,874,7097846 -test,4-16KiB,python,gradle,2,10704 -test,4-16KiB,python,groovy,1,8674 -test,4-16KiB,python,ini,1,5232 -test,4-16KiB,python,javascript,2,12646 -test,4-16KiB,python,julia,4,21000 -test,4-16KiB,python,lisp,1,6895 -test,4-16KiB,python,lua,1,6533 -test,4-16KiB,python,markdown,1,7309 -test,4-16KiB,python,objectivec,1,5222 -test,4-16KiB,python,powershell,2,15764 -test,4-16KiB,python,python,962,7551929 -test,4-16KiB,python,r,1,4396 -test,4-16KiB,python,shell,1,10428 -test,4-16KiB,r,asm,1,9979 -test,4-16KiB,r,c,2,12315 -test,4-16KiB,r,cmake,1,15772 -test,4-16KiB,r,javascript,2,15789 -test,4-16KiB,r,julia,2,25029 -test,4-16KiB,r,markdown,1,5629 -test,4-16KiB,r,perl,2,16509 -test,4-16KiB,r,powershell,2,11198 -test,4-16KiB,r,r,881,6807076 -test,4-16KiB,ruby,elixir,1,9935 -test,4-16KiB,ruby,markdown,1,4286 -test,4-16KiB,ruby,ocaml,1,7172 -test,4-16KiB,ruby,ruby,185,1362609 -test,4-16KiB,ruby,scala,1,5419 -test,4-16KiB,ruby,typescript,1,5394 -test,4-16KiB,ruby,yaml,1,7803 -test,4-16KiB,rust,c,1,4323 -test,4-16KiB,rust,cpp,1,4262 -test,4-16KiB,rust,cs,1,15368 -test,4-16KiB,rust,javascript,1,12040 -test,4-16KiB,rust,markdown,2,23718 -test,4-16KiB,rust,ocaml,1,7469 -test,4-16KiB,rust,rust,1008,7990062 -test,4-16KiB,rust,swift,2,12557 -test,4-16KiB,rust,typescript,1,5177 -test,4-16KiB,scala,kotlin,3,20262 -test,4-16KiB,scala,scala,471,3398583 -test,4-16KiB,shell,batch,3,28030 -test,4-16KiB,shell,cmake,3,14398 -test,4-16KiB,shell,cobol,1,9009 -test,4-16KiB,shell,cpp,1,10861 -test,4-16KiB,shell,markdown,2,20792 -test,4-16KiB,shell,php,2,9876 -test,4-16KiB,shell,powershell,5,38892 -test,4-16KiB,shell,shell,238,1648332 -test,4-16KiB,shell,sql,1,8957 -test,4-16KiB,sql,asm,1,14695 -test,4-16KiB,sql,html,1,5876 -test,4-16KiB,sql,lua,1,4867 -test,4-16KiB,sql,powershell,3,28212 -test,4-16KiB,sql,sql,584,4945650 -test,4-16KiB,sql,vba,3,19670 -test,4-16KiB,sql,yaml,1,4322 -test,4-16KiB,swift,groovy,1,5768 -test,4-16KiB,swift,kotlin,1,4567 -test,4-16KiB,swift,swift,601,4284938 -test,4-16KiB,toml,ini,1,8043 -test,4-16KiB,toml,lua,1,6607 -test,4-16KiB,toml,powershell,2,11892 -test,4-16KiB,toml,toml,72,524862 -test,4-16KiB,typescript,java,2,18175 -test,4-16KiB,typescript,javascript,6,40645 -test,4-16KiB,typescript,markdown,1,5526 -test,4-16KiB,typescript,typescript,417,3179969 -test,4-16KiB,typescript,xml,3,35472 -test,4-16KiB,vba,lua,2,28524 -test,4-16KiB,vba,markdown,1,5689 -test,4-16KiB,vba,r,1,10618 -test,4-16KiB,vba,ruby,2,12888 -test,4-16KiB,vba,sql,1,6638 -test,4-16KiB,vba,vba,755,6268500 -test,4-16KiB,verilog,asm,2,8960 -test,4-16KiB,verilog,batch,6,48129 -test,4-16KiB,verilog,c,1,5208 -test,4-16KiB,verilog,cobol,1,11980 -test,4-16KiB,verilog,cs,1,10706 -test,4-16KiB,verilog,ini,1,7867 -test,4-16KiB,verilog,perl,1,4624 -test,4-16KiB,verilog,r,1,12168 -test,4-16KiB,verilog,verilog,857,6965121 -test,4-16KiB,xml,cs,1,4261 -test,4-16KiB,xml,html,1,15750 -test,4-16KiB,xml,ini,1,4964 -test,4-16KiB,xml,julia,1,10062 -test,4-16KiB,xml,powershell,2,12295 -test,4-16KiB,xml,xml,481,3713730 -test,4-16KiB,yaml,json,1,9978 -test,4-16KiB,yaml,yaml,133,992578 -test,16-64KiB,asm,asm,385,12351590 -test,16-64KiB,asm,batch,3,126436 -test,16-64KiB,asm,c,1,43312 -test,16-64KiB,asm,cobol,3,86301 -test,16-64KiB,asm,cpp,2,105489 -test,16-64KiB,asm,perl,1,18886 -test,16-64KiB,asm,r,1,20061 -test,16-64KiB,batch,batch,126,4048609 -test,16-64KiB,batch,cmake,2,55217 -test,16-64KiB,batch,ini,6,192417 -test,16-64KiB,batch,verilog,1,29047 -test,16-64KiB,c,asm,3,64157 -test,16-64KiB,c,c,442,13882766 -test,16-64KiB,c,cpp,30,839258 -test,16-64KiB,c,cs,1,39823 -test,16-64KiB,c,dart,1,45057 -test,16-64KiB,c,java,3,77948 -test,16-64KiB,c,javascript,2,59182 -test,16-64KiB,c,typescript,1,21324 -test,16-64KiB,clojure,clojure,51,1315790 -test,16-64KiB,cmake,asm,1,50316 -test,16-64KiB,cmake,batch,1,17975 -test,16-64KiB,cmake,c,1,28408 -test,16-64KiB,cmake,cmake,158,4475817 -test,16-64KiB,cmake,julia,2,57992 -test,16-64KiB,cmake,markdown,1,35072 -test,16-64KiB,cmake,powershell,1,28714 -test,16-64KiB,cmake,yaml,2,63412 -test,16-64KiB,cobol,asm,7,242918 -test,16-64KiB,cobol,cobol,8,193036 -test,16-64KiB,cpp,c,67,2207693 -test,16-64KiB,cpp,cobol,1,23032 -test,16-64KiB,cpp,cpp,192,5597289 -test,16-64KiB,cpp,cs,1,50615 -test,16-64KiB,cpp,java,2,75392 -test,16-64KiB,cpp,typescript,2,35918 -test,16-64KiB,cs,batch,3,106420 -test,16-64KiB,cs,c,1,42568 -test,16-64KiB,cs,cs,142,4275528 -test,16-64KiB,cs,groovy,1,39656 -test,16-64KiB,cs,java,2,79752 -test,16-64KiB,css,asm,1,19654 -test,16-64KiB,css,css,288,8915789 -test,16-64KiB,css,html,2,69775 -test,16-64KiB,css,powershell,1,43642 -test,16-64KiB,dart,dart,117,3453870 -test,16-64KiB,dart,groovy,1,50785 -test,16-64KiB,dart,html,1,20646 -test,16-64KiB,dart,java,2,35708 -test,16-64KiB,dart,typescript,1,60518 -test,16-64KiB,dockerfile,dockerfile,1,16513 -test,16-64KiB,elixir,elixir,16,363543 -test,16-64KiB,elixir,sql,1,21913 -test,16-64KiB,erlang,erlang,170,4886995 -test,16-64KiB,erlang,perl,2,73201 -test,16-64KiB,go,go,109,2745992 -test,16-64KiB,go,markdown,1,28198 -test,16-64KiB,go,scala,1,22612 -test,16-64KiB,gradle,gradle,5,153306 -test,16-64KiB,gradle,groovy,1,19263 -test,16-64KiB,groovy,elixir,2,59314 -test,16-64KiB,groovy,groovy,40,1143247 -test,16-64KiB,groovy,java,3,60934 -test,16-64KiB,groovy,kotlin,1,40885 -test,16-64KiB,haskell,haskell,106,2747217 -test,16-64KiB,haskell,lua,1,24418 -test,16-64KiB,haskell,ocaml,1,17991 -test,16-64KiB,html,batch,1,30000 -test,16-64KiB,html,css,1,59700 -test,16-64KiB,html,html,272,8279522 -test,16-64KiB,html,markdown,2,66714 -test,16-64KiB,html,objectivec,2,60912 -test,16-64KiB,html,perl,1,21992 -test,16-64KiB,ini,cmake,1,43903 -test,16-64KiB,ini,ini,22,794902 -test,16-64KiB,ini,julia,1,29658 -test,16-64KiB,ini,sql,1,22492 -test,16-64KiB,ini,toml,1,29107 -test,16-64KiB,java,c,1,34911 -test,16-64KiB,java,groovy,1,58393 -test,16-64KiB,java,java,116,3101033 -test,16-64KiB,javascript,cs,3,86177 -test,16-64KiB,javascript,gradle,1,19508 -test,16-64KiB,javascript,ini,1,34044 -test,16-64KiB,javascript,java,1,17524 -test,16-64KiB,javascript,javascript,328,10367454 -test,16-64KiB,javascript,json,5,157065 -test,16-64KiB,javascript,julia,1,34459 -test,16-64KiB,javascript,r,1,24074 -test,16-64KiB,javascript,typescript,8,215105 -test,16-64KiB,javascript,verilog,1,18705 -test,16-64KiB,javascript,yaml,1,17468 -test,16-64KiB,json,batch,1,38655 -test,16-64KiB,json,cs,1,45613 -test,16-64KiB,json,gemfile,1,34148 -test,16-64KiB,json,javascript,1,56454 -test,16-64KiB,json,json,133,4563373 -test,16-64KiB,json,ruby,1,17537 -test,16-64KiB,json,yaml,1,40179 -test,16-64KiB,julia,elixir,1,18196 -test,16-64KiB,julia,ini,1,52968 -test,16-64KiB,julia,json,1,16755 -test,16-64KiB,julia,julia,151,4007530 -test,16-64KiB,julia,objectivec,1,46534 -test,16-64KiB,julia,perl,1,53338 -test,16-64KiB,julia,r,1,46306 -test,16-64KiB,julia,ruby,5,169402 -test,16-64KiB,kotlin,groovy,1,46712 -test,16-64KiB,kotlin,kotlin,40,1041902 -test,16-64KiB,kotlin,markdown,1,17100 -test,16-64KiB,kotlin,scala,1,18130 -test,16-64KiB,kotlin,verilog,1,27082 -test,16-64KiB,lisp,asm,2,59028 -test,16-64KiB,lisp,c,1,22127 -test,16-64KiB,lisp,html,2,71697 -test,16-64KiB,lisp,lisp,404,12244510 -test,16-64KiB,lua,ini,1,33482 -test,16-64KiB,lua,lua,269,7852400 -test,16-64KiB,lua,python,3,60298 -test,16-64KiB,lua,toml,2,64005 -test,16-64KiB,markdown,html,1,20916 -test,16-64KiB,markdown,markdown,40,1156861 -test,16-64KiB,markdown,scala,1,22907 -test,16-64KiB,objectivec,asm,1,25648 -test,16-64KiB,objectivec,c,10,305649 -test,16-64KiB,objectivec,cpp,6,213318 -test,16-64KiB,objectivec,html,2,69577 -test,16-64KiB,objectivec,objectivec,177,4848249 -test,16-64KiB,objectivec,powershell,1,27181 -test,16-64KiB,objectivec,shell,1,39462 -test,16-64KiB,objectivec,xml,2,39203 -test,16-64KiB,ocaml,haskell,1,31191 -test,16-64KiB,ocaml,markdown,1,40118 -test,16-64KiB,ocaml,ocaml,240,6761353 -test,16-64KiB,ocaml,perl,1,47600 -test,16-64KiB,ocaml,typescript,1,36779 -test,16-64KiB,ocaml,verilog,2,74081 -test,16-64KiB,perl,batch,1,64451 -test,16-64KiB,perl,c,1,61869 -test,16-64KiB,perl,cmake,3,66756 -test,16-64KiB,perl,erlang,9,273128 -test,16-64KiB,perl,html,3,104395 -test,16-64KiB,perl,julia,4,100958 -test,16-64KiB,perl,markdown,1,22070 -test,16-64KiB,perl,objectivec,8,170105 -test,16-64KiB,perl,perl,558,16725612 -test,16-64KiB,perl,powershell,1,36963 -test,16-64KiB,perl,r,6,145258 -test,16-64KiB,perl,verilog,1,63866 -test,16-64KiB,perl,yaml,3,97319 -test,16-64KiB,php,html,6,217627 -test,16-64KiB,php,markdown,1,17986 -test,16-64KiB,php,php,166,5213450 -test,16-64KiB,powershell,asm,3,83462 -test,16-64KiB,powershell,cmake,1,17098 -test,16-64KiB,powershell,html,2,47796 -test,16-64KiB,powershell,ini,1,27899 -test,16-64KiB,powershell,markdown,2,37074 -test,16-64KiB,powershell,powershell,253,7210606 -test,16-64KiB,powershell,vba,1,16912 -test,16-64KiB,python,cmake,1,17638 -test,16-64KiB,python,javascript,1,23709 -test,16-64KiB,python,python,189,5292187 -test,16-64KiB,r,lua,1,16684 -test,16-64KiB,r,r,149,3967214 -test,16-64KiB,ruby,perl,1,41870 -test,16-64KiB,ruby,ruby,30,953788 -test,16-64KiB,rust,rust,212,5843743 -test,16-64KiB,scala,r,1,22886 -test,16-64KiB,scala,scala,40,1114747 -test,16-64KiB,shell,perl,1,41970 -test,16-64KiB,shell,powershell,2,60749 -test,16-64KiB,shell,shell,29,890802 -test,16-64KiB,sql,powershell,2,67530 -test,16-64KiB,sql,sql,256,7790672 -test,16-64KiB,sql,vba,1,32712 -test,16-64KiB,sql,xml,1,42194 -test,16-64KiB,swift,swift,68,1825995 -test,16-64KiB,toml,elixir,1,34003 -test,16-64KiB,toml,lua,1,41442 -test,16-64KiB,toml,toml,14,513421 -test,16-64KiB,typescript,typescript,114,3642246 -test,16-64KiB,typescript,xml,5,174915 -test,16-64KiB,vba,kotlin,1,23237 -test,16-64KiB,vba,vba,241,7315504 -test,16-64KiB,verilog,asm,1,25286 -test,16-64KiB,verilog,c,2,51921 -test,16-64KiB,verilog,cobol,1,35069 -test,16-64KiB,verilog,javascript,1,61450 -test,16-64KiB,verilog,objectivec,2,109947 -test,16-64KiB,verilog,ocaml,2,45065 -test,16-64KiB,verilog,verilog,248,7081295 -test,16-64KiB,xml,html,2,84262 -test,16-64KiB,xml,xml,192,6417752 -test,16-64KiB,yaml,gemfile,1,44093 -test,16-64KiB,yaml,groovy,1,29913 -test,16-64KiB,yaml,html,1,21354 -test,16-64KiB,yaml,yaml,16,520163 -test,>64KiB,asm,asm,260,786354560 -test,>64KiB,asm,batch,2,4025832 -test,>64KiB,asm,c,1,5389403 -test,>64KiB,asm,cmake,1,1129825 -test,>64KiB,asm,cpp,1,250604 -test,>64KiB,asm,elixir,1,129583 -test,>64KiB,asm,html,1,1313193 -test,>64KiB,asm,ini,3,10474058 -test,>64KiB,asm,verilog,1,146368 -test,>64KiB,batch,batch,10,6920724 -test,>64KiB,batch,ini,2,1513757 -test,>64KiB,batch,r,1,157636 -test,>64KiB,c,asm,1,84236 -test,>64KiB,c,c,100,55492322 -test,>64KiB,c,cpp,7,3221397 -test,>64KiB,c,cs,1,234881 -test,>64KiB,c,html,1,1087020 -test,>64KiB,c,swift,1,607168 -test,>64KiB,c,verilog,1,93613 -test,>64KiB,clojure,asm,1,72115 -test,>64KiB,clojure,clojure,5,2318717 -test,>64KiB,cmake,cmake,33,8364367 -test,>64KiB,cmake,ini,1,104607 -test,>64KiB,cmake,powershell,1,85354 -test,>64KiB,cobol,asm,3,218151 -test,>64KiB,cobol,cobol,1,198811 -test,>64KiB,cobol,yaml,1,66437 -test,>64KiB,cpp,asm,1,73305 -test,>64KiB,cpp,batch,1,920255 -test,>64KiB,cpp,c,16,8286657 -test,>64KiB,cpp,cpp,35,6872309 -test,>64KiB,cpp,dart,1,277243 -test,>64KiB,cpp,html,1,180444 -test,>64KiB,cpp,objectivec,2,260171 -test,>64KiB,cs,batch,2,758092 -test,>64KiB,cs,cs,26,3791492 -test,>64KiB,css,asm,1,149250 -test,>64KiB,css,css,264,48916288 -test,>64KiB,css,markdown,1,722758 -test,>64KiB,dart,dart,19,4449346 -test,>64KiB,dart,groovy,1,82108 -test,>64KiB,dart,html,1,71639 -test,>64KiB,dart,javascript,1,86204 -test,>64KiB,dart,typescript,1,329246 -test,>64KiB,elixir,batch,1,75124 -test,>64KiB,elixir,cmake,1,73568 -test,>64KiB,elixir,elixir,2,338985 -test,>64KiB,erlang,erlang,13,1946225 -test,>64KiB,erlang,json,1,146794 -test,>64KiB,erlang,perl,1,297122 -test,>64KiB,go,go,12,6178251 -test,>64KiB,go,groovy,1,68323 -test,>64KiB,go,lua,1,116002 -test,>64KiB,groovy,groovy,4,725287 -test,>64KiB,haskell,haskell,8,10189292 -test,>64KiB,haskell,markdown,1,66505 -test,>64KiB,html,asm,2,286393 -test,>64KiB,html,html,219,168471516 -test,>64KiB,html,javascript,1,1173873 -test,>64KiB,html,php,1,9606647 -test,>64KiB,html,powershell,1,94822 -test,>64KiB,html,xml,1,325749 -test,>64KiB,ini,ini,19,6151141 -test,>64KiB,java,java,13,2120771 -test,>64KiB,java,kotlin,1,121302 -test,>64KiB,javascript,batch,1,636130 -test,>64KiB,javascript,c,1,89163 -test,>64KiB,javascript,css,2,24529366 -test,>64KiB,javascript,elixir,1,100799 -test,>64KiB,javascript,javascript,267,98133341 -test,>64KiB,javascript,json,6,1973398 -test,>64KiB,javascript,yaml,1,74922 -test,>64KiB,json,batch,1,215238 -test,>64KiB,json,groovy,1,1647036 -test,>64KiB,json,ini,1,99217 -test,>64KiB,json,javascript,1,375095 -test,>64KiB,json,json,183,362692622 -test,>64KiB,julia,cpp,1,69770 -test,>64KiB,julia,json,15,26841843 -test,>64KiB,julia,julia,18,4185721 -test,>64KiB,julia,r,1,133655 -test,>64KiB,kotlin,kotlin,1,152951 -test,>64KiB,lisp,clojure,1,90341 -test,>64KiB,lisp,lisp,108,18940787 -test,>64KiB,lua,ini,4,2438133 -test,>64KiB,lua,javascript,2,694202 -test,>64KiB,lua,json,1,235242 -test,>64KiB,lua,lisp,1,1237754 -test,>64KiB,lua,lua,67,31621519 -test,>64KiB,lua,r,1,136080 -test,>64KiB,lua,sql,3,1182502 -test,>64KiB,lua,toml,1,615525 -test,>64KiB,markdown,markdown,5,573614 -test,>64KiB,markdown,sql,1,74925 -test,>64KiB,markdown,yaml,1,88672 -test,>64KiB,objectivec,batch,3,700523 -test,>64KiB,objectivec,c,1,86509 -test,>64KiB,objectivec,html,4,1950963 -test,>64KiB,objectivec,javascript,2,152881 -test,>64KiB,objectivec,objectivec,22,4136082 -test,>64KiB,ocaml,c,1,91656 -test,>64KiB,ocaml,ini,6,538020 -test,>64KiB,ocaml,ocaml,69,11127336 -test,>64KiB,ocaml,perl,1,180000 -test,>64KiB,perl,asm,1,119862 -test,>64KiB,perl,batch,3,11044904 -test,>64KiB,perl,c,1,448827 -test,>64KiB,perl,ini,1,4084972 -test,>64KiB,perl,json,1,243151 -test,>64KiB,perl,julia,1,79860 -test,>64KiB,perl,markdown,1,471856 -test,>64KiB,perl,objectivec,2,474678 -test,>64KiB,perl,perl,156,89896313 -test,>64KiB,perl,powershell,1,66283 -test,>64KiB,perl,r,22,3524520 -test,>64KiB,perl,shell,2,460034 -test,>64KiB,perl,yaml,1,98330 -test,>64KiB,php,javascript,3,422077 -test,>64KiB,php,php,24,4098137 -test,>64KiB,powershell,powershell,50,22068900 -test,>64KiB,powershell,ruby,1,427747 -test,>64KiB,powershell,xml,1,124376 -test,>64KiB,python,python,21,4771084 -test,>64KiB,python,shell,1,1595408 -test,>64KiB,r,batch,1,202535 -test,>64KiB,r,c,1,674801 -test,>64KiB,r,clojure,1,104953 -test,>64KiB,r,powershell,1,75765 -test,>64KiB,r,r,11,1189192 -test,>64KiB,ruby,ruby,1,75855 -test,>64KiB,rust,asm,1,174684 -test,>64KiB,rust,json,5,2744842 -test,>64KiB,rust,markdown,1,337332 -test,>64KiB,rust,rust,33,8335887 -test,>64KiB,rust,verilog,1,177000 -test,>64KiB,rust,yaml,1,858906 -test,>64KiB,scala,scala,5,1244152 -test,>64KiB,shell,c,1,302472 -test,>64KiB,shell,powershell,1,82881 -test,>64KiB,shell,shell,9,1612447 -test,>64KiB,shell,yaml,1,283672 -test,>64KiB,sql,batch,1,113616 -test,>64KiB,sql,html,1,100426 -test,>64KiB,sql,powershell,6,7588122 -test,>64KiB,sql,sql,285,901654506 -test,>64KiB,sql,vba,3,2939729 -test,>64KiB,swift,swift,7,726266 -test,>64KiB,toml,toml,3,217503 -test,>64KiB,typescript,batch,3,2466184 -test,>64KiB,typescript,typescript,114,37454295 -test,>64KiB,typescript,verilog,2,1856140 -test,>64KiB,typescript,xml,5,1383218 -test,>64KiB,vba,perl,1,89895 -test,>64KiB,vba,ruby,2,327914 -test,>64KiB,vba,vba,57,11151447 -test,>64KiB,verilog,asm,4,22148036 -test,>64KiB,verilog,cobol,2,672628 -test,>64KiB,verilog,shell,1,116125 -test,>64KiB,verilog,verilog,77,74099598 -test,>64KiB,xml,html,1,564176 -test,>64KiB,xml,objectivec,1,74872 -test,>64KiB,xml,xml,150,189912381 -test,>64KiB,yaml,yaml,14,11276543 +test,<=128B,ruby,ini,1,22 +test,<=128B,ruby,javascript,1,79 +test,<=128B,ruby,markdown,1,17 +test,<=128B,ruby,ruby,52,4384 +test,<=128B,rust,batch,1,36 +test,<=128B,rust,markdown,1,47 +test,<=128B,rust,rust,11,953 +test,<=128B,scala,batch,1,115 +test,<=128B,scala,gradle,1,42 +test,<=128B,scala,scala,1,92 +test,<=128B,shell,batch,12,820 +test,<=128B,shell,markdown,6,287 +test,<=128B,shell,shell,71,5781 +test,<=128B,shell,sql,1,123 +test,<=128B,sql,batch,1,33 +test,<=128B,sql,sql,77,5596 +test,<=128B,swift,python,2,207 +test,<=128B,swift,swift,6,584 +test,<=128B,toml,elixir,1,75 +test,<=128B,toml,ini,6,536 +test,<=128B,toml,toml,91,7702 +test,<=128B,typescript,cs,1,112 +test,<=128B,typescript,javascript,5,338 +test,<=128B,typescript,markdown,1,19 +test,<=128B,typescript,typescript,25,1731 +test,<=128B,vba,python,1,109 +test,<=128B,vba,sql,2,247 +test,<=128B,vba,vba,3,286 +test,<=128B,verilog,batch,1,76 +test,<=128B,verilog,gradle,2,36 +test,<=128B,verilog,markdown,1,41 +test,<=128B,verilog,verilog,6,579 +test,<=128B,xml,batch,1,121 +test,<=128B,xml,xml,3,260 +test,<=128B,yaml,markdown,19,1331 +test,<=128B,yaml,yaml,222,16897 +test,129-512B,asm,asm,67,21741 +test,129-512B,asm,batch,1,200 +test,129-512B,asm,go,1,456 +test,129-512B,asm,gradle,1,148 +test,129-512B,asm,ini,1,503 +test,129-512B,asm,javascript,4,803 +test,129-512B,asm,perl,1,438 +test,129-512B,asm,sql,3,907 +test,129-512B,asm,typescript,1,382 +test,129-512B,asm,yaml,3,898 +test,129-512B,batch,batch,209,57948 +test,129-512B,batch,cmake,1,303 +test,129-512B,batch,ini,1,264 +test,129-512B,batch,shell,4,1187 +test,129-512B,c,c,71,26030 +test,129-512B,c,cpp,8,2687 +test,129-512B,c,markdown,1,253 +test,129-512B,c,objectivec,1,493 +test,129-512B,c,rust,1,343 +test,129-512B,clojure,clojure,105,33519 +test,129-512B,clojure,css,1,459 +test,129-512B,clojure,ini,1,171 +test,129-512B,clojure,lisp,1,138 +test,129-512B,cmake,cmake,151,46993 +test,129-512B,cmake,yaml,1,252 +test,129-512B,cobol,cobol,48,15361 +test,129-512B,cobol,yaml,1,477 +test,129-512B,cpp,c,8,2717 +test,129-512B,cpp,cpp,31,10501 +test,129-512B,cpp,groovy,1,463 +test,129-512B,cpp,javascript,1,175 +test,129-512B,cs,batch,1,134 +test,129-512B,cs,c,1,331 +test,129-512B,cs,cs,96,30982 +test,129-512B,cs,html,3,1060 +test,129-512B,cs,java,1,221 +test,129-512B,css,css,117,35424 +test,129-512B,css,javascript,2,553 +test,129-512B,dart,dart,98,33885 +test,129-512B,dart,groovy,2,604 +test,129-512B,dart,javascript,1,206 +test,129-512B,dart,markdown,2,555 +test,129-512B,dockerfile,dockerfile,150,44845 +test,129-512B,elixir,elixir,135,45533 +test,129-512B,elixir,erlang,1,453 +test,129-512B,elixir,python,1,222 +test,129-512B,elixir,ruby,1,472 +test,129-512B,erlang,erlang,53,18672 +test,129-512B,gemfile,gemfile,457,88248 +test,129-512B,gemfile,yaml,1,154 +test,129-512B,gemspec,gemspec,7,3072 +test,129-512B,gemspec,ruby,1,247 +test,129-512B,go,go,57,18192 +test,129-512B,go,python,1,188 +test,129-512B,gradle,gradle,5,1955 +test,129-512B,groovy,go,1,236 +test,129-512B,groovy,gradle,4,1302 +test,129-512B,groovy,groovy,77,26630 +test,129-512B,groovy,javascript,2,432 +test,129-512B,groovy,json,2,460 +test,129-512B,groovy,python,1,346 +test,129-512B,groovy,scala,2,495 +test,129-512B,groovy,swift,1,133 +test,129-512B,haskell,haskell,90,27281 +test,129-512B,haskell,markdown,1,239 +test,129-512B,haskell,python,1,216 +test,129-512B,haskell,sql,1,320 +test,129-512B,html,html,27,9021 +test,129-512B,html,javascript,3,828 +test,129-512B,html,markdown,7,2427 +test,129-512B,html,xml,1,348 +test,129-512B,ini,asm,1,416 +test,129-512B,ini,batch,22,8250 +test,129-512B,ini,gradle,1,407 +test,129-512B,ini,ini,236,63513 +test,129-512B,ini,json,1,401 +test,129-512B,ini,lua,1,181 +test,129-512B,ini,markdown,7,2060 +test,129-512B,ini,python,3,1179 +test,129-512B,ini,shell,10,3378 +test,129-512B,ini,sql,2,316 +test,129-512B,ini,toml,1,345 +test,129-512B,ini,yaml,2,618 +test,129-512B,java,java,74,23145 +test,129-512B,javascript,javascript,108,34276 +test,129-512B,javascript,swift,1,459 +test,129-512B,javascript,typescript,14,4207 +test,129-512B,json,groovy,1,217 +test,129-512B,json,json,91,29952 +test,129-512B,json,lua,1,214 +test,129-512B,json,markdown,1,138 +test,129-512B,julia,elixir,1,212 +test,129-512B,julia,java,1,345 +test,129-512B,julia,javascript,2,510 +test,129-512B,julia,julia,71,22126 +test,129-512B,julia,ruby,2,478 +test,129-512B,kotlin,gradle,2,623 +test,129-512B,kotlin,groovy,1,206 +test,129-512B,kotlin,kotlin,137,42821 +test,129-512B,kotlin,swift,2,685 +test,129-512B,lisp,clojure,5,1803 +test,129-512B,lisp,css,1,250 +test,129-512B,lisp,lisp,114,34305 +test,129-512B,lisp,markdown,1,360 +test,129-512B,lua,asm,1,266 +test,129-512B,lua,cmake,1,226 +test,129-512B,lua,gradle,1,246 +test,129-512B,lua,javascript,2,345 +test,129-512B,lua,julia,1,313 +test,129-512B,lua,lua,101,33585 +test,129-512B,lua,ruby,4,1136 +test,129-512B,lua,sql,1,144 +test,129-512B,markdown,html,1,198 +test,129-512B,markdown,javascript,1,415 +test,129-512B,markdown,markdown,257,51536 +test,129-512B,markdown,yaml,2,327 +test,129-512B,objectivec,objectivec,37,8198 +test,129-512B,ocaml,haskell,2,647 +test,129-512B,ocaml,markdown,1,426 +test,129-512B,ocaml,ocaml,99,29465 +test,129-512B,perl,javascript,4,1085 +test,129-512B,perl,markdown,1,494 +test,129-512B,perl,perl,50,16922 +test,129-512B,perl,ruby,10,4208 +test,129-512B,perl,rust,2,341 +test,129-512B,perl,sql,2,659 +test,129-512B,perl,vba,1,353 +test,129-512B,perl,yaml,1,300 +test,129-512B,php,html,4,1458 +test,129-512B,php,javascript,1,475 +test,129-512B,php,php,101,31675 +test,129-512B,powershell,batch,8,1516 +test,129-512B,powershell,gradle,2,524 +test,129-512B,powershell,groovy,1,436 +test,129-512B,powershell,javascript,3,590 +test,129-512B,powershell,lua,1,187 +test,129-512B,powershell,markdown,1,402 +test,129-512B,powershell,php,1,354 +test,129-512B,powershell,powershell,72,24493 +test,129-512B,powershell,python,1,489 +test,129-512B,powershell,ruby,1,246 +test,129-512B,powershell,shell,4,1388 +test,129-512B,powershell,sql,1,273 +test,129-512B,python,javascript,1,151 +test,129-512B,python,python,81,26913 +test,129-512B,python,sql,3,814 +test,129-512B,r,asm,3,662 +test,129-512B,r,batch,2,445 +test,129-512B,r,cmake,1,231 +test,129-512B,r,gradle,1,250 +test,129-512B,r,haskell,1,352 +test,129-512B,r,javascript,3,716 +test,129-512B,r,lua,17,3040 +test,129-512B,r,markdown,38,7913 +test,129-512B,r,python,9,2422 +test,129-512B,r,r,82,27446 +test,129-512B,r,shell,1,176 +test,129-512B,r,sql,3,737 +test,129-512B,r,yaml,22,4555 +test,129-512B,ruby,dockerfile,1,141 +test,129-512B,ruby,elixir,1,168 +test,129-512B,ruby,gradle,3,758 +test,129-512B,ruby,ruby,164,47465 +test,129-512B,ruby,shell,1,402 +test,129-512B,rust,rust,61,19140 +test,129-512B,scala,cmake,2,336 +test,129-512B,scala,haskell,1,403 +test,129-512B,scala,scala,87,34794 +test,129-512B,shell,batch,10,2299 +test,129-512B,shell,cmake,1,411 +test,129-512B,shell,dockerfile,1,368 +test,129-512B,shell,ini,2,381 +test,129-512B,shell,markdown,4,1157 +test,129-512B,shell,shell,176,50797 +test,129-512B,shell,sql,2,399 +test,129-512B,shell,yaml,2,673 +test,129-512B,sql,sql,201,58145 +test,129-512B,swift,groovy,1,359 +test,129-512B,swift,markdown,1,226 +test,129-512B,swift,ocaml,1,332 +test,129-512B,swift,swift,98,32191 +test,129-512B,toml,ini,3,752 +test,129-512B,toml,python,1,477 +test,129-512B,toml,toml,270,83952 +test,129-512B,typescript,javascript,29,9707 +test,129-512B,typescript,typescript,122,39300 +test,129-512B,typescript,xml,2,681 +test,129-512B,vba,batch,3,929 +test,129-512B,vba,cmake,1,412 +test,129-512B,vba,ocaml,1,175 +test,129-512B,vba,r,1,152 +test,129-512B,vba,sql,3,1407 +test,129-512B,vba,toml,1,158 +test,129-512B,vba,vba,40,15217 +test,129-512B,vba,yaml,1,500 +test,129-512B,verilog,c,2,466 +test,129-512B,verilog,cpp,1,512 +test,129-512B,verilog,javascript,5,1823 +test,129-512B,verilog,markdown,1,447 +test,129-512B,verilog,typescript,1,430 +test,129-512B,verilog,verilog,63,21617 +test,129-512B,xml,xml,96,31866 +test,129-512B,yaml,batch,3,544 +test,129-512B,yaml,markdown,1,153 +test,129-512B,yaml,yaml,186,56473 +test,513B-1KiB,asm,asm,61,45034 +test,513B-1KiB,asm,batch,1,856 +test,513B-1KiB,asm,cmake,1,528 +test,513B-1KiB,asm,go,2,1921 +test,513B-1KiB,asm,javascript,2,1383 +test,513B-1KiB,asm,perl,1,675 +test,513B-1KiB,batch,batch,125,98835 +test,513B-1KiB,batch,cmake,1,525 +test,513B-1KiB,batch,shell,1,515 +test,513B-1KiB,c,c,65,51065 +test,513B-1KiB,c,cpp,13,10176 +test,513B-1KiB,c,ini,1,856 +test,513B-1KiB,c,objectivec,1,785 +test,513B-1KiB,clojure,clojure,109,82106 +test,513B-1KiB,clojure,lisp,1,726 +test,513B-1KiB,cmake,cmake,141,109932 +test,513B-1KiB,cobol,asm,1,532 +test,513B-1KiB,cobol,batch,1,870 +test,513B-1KiB,cobol,cobol,54,39303 +test,513B-1KiB,cpp,c,6,5021 +test,513B-1KiB,cpp,cpp,54,43110 +test,513B-1KiB,cs,cs,126,98155 +test,513B-1KiB,cs,html,4,3194 +test,513B-1KiB,cs,javascript,2,2012 +test,513B-1KiB,cs,kotlin,1,874 +test,513B-1KiB,css,css,96,70967 +test,513B-1KiB,dart,dart,103,80218 +test,513B-1KiB,dockerfile,dockerfile,108,82501 +test,513B-1KiB,elixir,elixir,132,101164 +test,513B-1KiB,erlang,erlang,76,56729 +test,513B-1KiB,gemfile,ruby,1,905 +test,513B-1KiB,gemspec,batch,1,876 +test,513B-1KiB,gemspec,gemspec,169,141981 +test,513B-1KiB,go,go,86,64528 +test,513B-1KiB,gradle,gradle,6,4285 +test,513B-1KiB,gradle,kotlin,1,931 +test,513B-1KiB,groovy,dart,1,519 +test,513B-1KiB,groovy,elixir,1,611 +test,513B-1KiB,groovy,groovy,87,65681 +test,513B-1KiB,groovy,haskell,1,992 +test,513B-1KiB,groovy,java,1,1001 +test,513B-1KiB,groovy,javascript,3,1960 +test,513B-1KiB,groovy,scala,1,905 +test,513B-1KiB,haskell,haskell,100,77812 +test,513B-1KiB,haskell,markdown,1,676 +test,513B-1KiB,html,html,45,34690 +test,513B-1KiB,html,markdown,1,998 +test,513B-1KiB,html,php,2,1608 +test,513B-1KiB,ini,batch,1,970 +test,513B-1KiB,ini,groovy,1,766 +test,513B-1KiB,ini,ini,72,52445 +test,513B-1KiB,ini,javascript,1,883 +test,513B-1KiB,ini,json,1,963 +test,513B-1KiB,ini,markdown,2,1349 +test,513B-1KiB,ini,python,1,752 +test,513B-1KiB,ini,shell,5,3845 +test,513B-1KiB,ini,toml,3,2002 +test,513B-1KiB,ini,xml,2,1770 +test,513B-1KiB,ini,yaml,3,2281 +test,513B-1KiB,java,groovy,1,932 +test,513B-1KiB,java,java,98,72020 +test,513B-1KiB,javascript,dart,1,934 +test,513B-1KiB,javascript,javascript,114,83219 +test,513B-1KiB,javascript,python,1,1015 +test,513B-1KiB,javascript,typescript,4,3443 +test,513B-1KiB,json,batch,1,517 +test,513B-1KiB,json,json,64,44944 +test,513B-1KiB,julia,batch,1,647 +test,513B-1KiB,julia,julia,97,73427 +test,513B-1KiB,julia,ruby,1,747 +test,513B-1KiB,kotlin,gradle,2,1815 +test,513B-1KiB,kotlin,groovy,1,651 +test,513B-1KiB,kotlin,kotlin,116,90333 +test,513B-1KiB,lisp,lisp,65,47359 +test,513B-1KiB,lisp,markdown,3,2020 +test,513B-1KiB,lisp,xml,1,887 +test,513B-1KiB,lua,gradle,4,2350 +test,513B-1KiB,lua,javascript,2,1174 +test,513B-1KiB,lua,lua,86,68169 +test,513B-1KiB,lua,sql,1,1023 +test,513B-1KiB,markdown,json,1,937 +test,513B-1KiB,markdown,markdown,88,68770 +test,513B-1KiB,markdown,yaml,1,513 +test,513B-1KiB,objectivec,c,1,953 +test,513B-1KiB,objectivec,objectivec,25,17988 +test,513B-1KiB,ocaml,erlang,1,632 +test,513B-1KiB,ocaml,ocaml,81,61975 +test,513B-1KiB,perl,c,1,1000 +test,513B-1KiB,perl,haskell,1,579 +test,513B-1KiB,perl,html,1,553 +test,513B-1KiB,perl,javascript,1,575 +test,513B-1KiB,perl,markdown,3,1789 +test,513B-1KiB,perl,objectivec,1,1024 +test,513B-1KiB,perl,perl,85,65182 +test,513B-1KiB,perl,ruby,3,2003 +test,513B-1KiB,perl,shell,2,1190 +test,513B-1KiB,perl,typescript,1,644 +test,513B-1KiB,php,html,5,3823 +test,513B-1KiB,php,javascript,2,1657 +test,513B-1KiB,php,php,149,114907 +test,513B-1KiB,powershell,gradle,1,597 +test,513B-1KiB,powershell,ini,1,664 +test,513B-1KiB,powershell,markdown,2,1188 +test,513B-1KiB,powershell,powershell,113,85577 +test,513B-1KiB,powershell,yaml,1,799 +test,513B-1KiB,python,python,94,72557 +test,513B-1KiB,python,toml,1,882 +test,513B-1KiB,r,asm,1,892 +test,513B-1KiB,r,dockerfile,1,678 +test,513B-1KiB,r,elixir,1,913 +test,513B-1KiB,r,erlang,1,515 +test,513B-1KiB,r,lua,1,526 +test,513B-1KiB,r,markdown,1,585 +test,513B-1KiB,r,python,5,3281 +test,513B-1KiB,r,r,73,53449 +test,513B-1KiB,r,shell,1,638 +test,513B-1KiB,r,yaml,1,713 +test,513B-1KiB,ruby,elixir,3,2376 +test,513B-1KiB,ruby,gemspec,14,9759 +test,513B-1KiB,ruby,gradle,1,567 +test,513B-1KiB,ruby,lua,1,549 +test,513B-1KiB,ruby,python,1,546 +test,513B-1KiB,ruby,ruby,116,87252 +test,513B-1KiB,rust,rust,79,58885 +test,513B-1KiB,rust,verilog,1,894 +test,513B-1KiB,scala,lua,2,1399 +test,513B-1KiB,scala,scala,155,121852 +test,513B-1KiB,scala,swift,1,1020 +test,513B-1KiB,shell,batch,2,1254 +test,513B-1KiB,shell,gradle,1,693 +test,513B-1KiB,shell,ini,2,1273 +test,513B-1KiB,shell,shell,141,104485 +test,513B-1KiB,shell,sql,1,559 +test,513B-1KiB,shell,yaml,1,522 +test,513B-1KiB,sql,erlang,1,681 +test,513B-1KiB,sql,sql,103,77832 +test,513B-1KiB,swift,markdown,1,955 +test,513B-1KiB,swift,swift,102,77536 +test,513B-1KiB,toml,ini,3,1990 +test,513B-1KiB,toml,python,1,556 +test,513B-1KiB,toml,r,1,784 +test,513B-1KiB,toml,toml,192,141051 +test,513B-1KiB,typescript,javascript,20,14433 +test,513B-1KiB,typescript,typescript,109,83780 +test,513B-1KiB,vba,batch,3,1828 +test,513B-1KiB,vba,cmake,1,519 +test,513B-1KiB,vba,html,1,698 +test,513B-1KiB,vba,sql,4,3122 +test,513B-1KiB,vba,vba,75,58144 +test,513B-1KiB,verilog,c,5,3899 +test,513B-1KiB,verilog,cpp,2,1794 +test,513B-1KiB,verilog,erlang,1,570 +test,513B-1KiB,verilog,ini,1,704 +test,513B-1KiB,verilog,javascript,1,819 +test,513B-1KiB,verilog,ocaml,1,812 +test,513B-1KiB,verilog,verilog,63,48239 +test,513B-1KiB,verilog,yaml,1,630 +test,513B-1KiB,xml,xml,120,89159 +test,513B-1KiB,yaml,yaml,156,114151 +test,1-4KiB,asm,asm,131,265883 +test,1-4KiB,asm,batch,1,1105 +test,1-4KiB,asm,c,1,2047 +test,1-4KiB,asm,erlang,1,2360 +test,1-4KiB,asm,go,1,1207 +test,1-4KiB,asm,javascript,1,1450 +test,1-4KiB,asm,markdown,2,3467 +test,1-4KiB,asm,python,12,43154 +test,1-4KiB,asm,yaml,1,3398 +test,1-4KiB,batch,batch,125,241419 +test,1-4KiB,batch,c,2,6746 +test,1-4KiB,batch,javascript,1,1850 +test,1-4KiB,batch,powershell,1,1043 +test,1-4KiB,batch,shell,1,1033 +test,1-4KiB,c,c,208,460062 +test,1-4KiB,c,cpp,64,138394 +test,1-4KiB,c,dart,1,1395 +test,1-4KiB,c,java,1,2681 +test,1-4KiB,clojure,clojure,278,609418 +test,1-4KiB,clojure,markdown,1,3733 +test,1-4KiB,clojure,sql,1,1133 +test,1-4KiB,cmake,c,1,1298 +test,1-4KiB,cmake,cmake,280,551126 +test,1-4KiB,cobol,batch,1,1734 +test,1-4KiB,cobol,cobol,129,266542 +test,1-4KiB,cpp,c,31,76530 +test,1-4KiB,cpp,cpp,220,498784 +test,1-4KiB,cpp,perl,1,1326 +test,1-4KiB,cs,cs,292,655490 +test,1-4KiB,cs,html,5,8470 +test,1-4KiB,cs,java,1,1523 +test,1-4KiB,cs,javascript,1,1136 +test,1-4KiB,css,css,198,427677 +test,1-4KiB,dart,cpp,1,1396 +test,1-4KiB,dart,dart,279,615055 +test,1-4KiB,dart,javascript,2,2572 +test,1-4KiB,dockerfile,dockerfile,327,747516 +test,1-4KiB,elixir,elixir,324,635370 +test,1-4KiB,erlang,erlang,230,533074 +test,1-4KiB,erlang,javascript,1,1202 +test,1-4KiB,gemspec,gemspec,458,735947 +test,1-4KiB,go,go,289,667236 +test,1-4KiB,go,groovy,1,2006 +test,1-4KiB,gradle,gradle,15,36315 +test,1-4KiB,gradle,groovy,1,3784 +test,1-4KiB,gradle,kotlin,4,4905 +test,1-4KiB,groovy,c,1,1249 +test,1-4KiB,groovy,groovy,295,653040 +test,1-4KiB,groovy,java,6,11977 +test,1-4KiB,groovy,javascript,4,7145 +test,1-4KiB,groovy,scala,1,1262 +test,1-4KiB,groovy,swift,1,2617 +test,1-4KiB,haskell,asm,1,1315 +test,1-4KiB,haskell,haskell,286,661906 +test,1-4KiB,haskell,xml,1,2592 +test,1-4KiB,html,html,130,301382 +test,1-4KiB,html,javascript,3,8698 +test,1-4KiB,html,markdown,2,4409 +test,1-4KiB,html,perl,1,1243 +test,1-4KiB,ini,asm,4,5051 +test,1-4KiB,ini,batch,5,7965 +test,1-4KiB,ini,cmake,2,2171 +test,1-4KiB,ini,css,1,2459 +test,1-4KiB,ini,groovy,1,3170 +test,1-4KiB,ini,haskell,1,3047 +test,1-4KiB,ini,ini,114,233278 +test,1-4KiB,ini,javascript,1,3227 +test,1-4KiB,ini,lua,2,5063 +test,1-4KiB,ini,markdown,2,2353 +test,1-4KiB,ini,python,13,18665 +test,1-4KiB,ini,shell,2,5470 +test,1-4KiB,ini,toml,2,5255 +test,1-4KiB,java,c,1,1358 +test,1-4KiB,java,cs,1,3095 +test,1-4KiB,java,dart,1,2496 +test,1-4KiB,java,java,347,794070 +test,1-4KiB,java,javascript,1,2941 +test,1-4KiB,javascript,c,1,2668 +test,1-4KiB,javascript,javascript,271,584314 +test,1-4KiB,javascript,json,1,2399 +test,1-4KiB,javascript,shell,1,1998 +test,1-4KiB,javascript,typescript,8,18231 +test,1-4KiB,json,json,370,753452 +test,1-4KiB,julia,javascript,1,1154 +test,1-4KiB,julia,julia,265,599908 +test,1-4KiB,julia,python,1,2847 +test,1-4KiB,julia,shell,8,15839 +test,1-4KiB,kotlin,gradle,2,4155 +test,1-4KiB,kotlin,groovy,4,12840 +test,1-4KiB,kotlin,kotlin,283,604912 +test,1-4KiB,kotlin,markdown,1,1214 +test,1-4KiB,kotlin,scala,2,6333 +test,1-4KiB,lisp,asm,1,1137 +test,1-4KiB,lisp,clojure,1,3181 +test,1-4KiB,lisp,lisp,174,393167 +test,1-4KiB,lisp,xml,1,2908 +test,1-4KiB,lua,gradle,2,2171 +test,1-4KiB,lua,javascript,1,2233 +test,1-4KiB,lua,lua,252,565747 +test,1-4KiB,lua,toml,1,1689 +test,1-4KiB,markdown,markdown,273,641373 +test,1-4KiB,markdown,objectivec,1,3300 +test,1-4KiB,markdown,python,1,3530 +test,1-4KiB,markdown,toml,1,1862 +test,1-4KiB,objectivec,c,1,4093 +test,1-4KiB,objectivec,objectivec,82,188683 +test,1-4KiB,ocaml,asm,1,1858 +test,1-4KiB,ocaml,ocaml,208,471116 +test,1-4KiB,perl,asm,2,3621 +test,1-4KiB,perl,c,5,9440 +test,1-4KiB,perl,haskell,1,1028 +test,1-4KiB,perl,html,1,3010 +test,1-4KiB,perl,ini,1,4040 +test,1-4KiB,perl,javascript,2,4131 +test,1-4KiB,perl,perl,242,548131 +test,1-4KiB,perl,python,2,6001 +test,1-4KiB,perl,shell,4,8278 +test,1-4KiB,perl,sql,2,4765 +test,1-4KiB,perl,xml,1,2197 +test,1-4KiB,php,html,14,30961 +test,1-4KiB,php,php,266,581656 +test,1-4KiB,powershell,batch,3,4475 +test,1-4KiB,powershell,cs,1,1355 +test,1-4KiB,powershell,powershell,277,596904 +test,1-4KiB,powershell,python,3,6662 +test,1-4KiB,powershell,shell,3,5776 +test,1-4KiB,python,javascript,1,3109 +test,1-4KiB,python,json,1,1156 +test,1-4KiB,python,python,221,500854 +test,1-4KiB,python,r,1,4072 +test,1-4KiB,r,asm,10,24127 +test,1-4KiB,r,c,2,4092 +test,1-4KiB,r,elixir,1,2054 +test,1-4KiB,r,julia,1,1835 +test,1-4KiB,r,lua,1,1978 +test,1-4KiB,r,markdown,8,22492 +test,1-4KiB,r,python,1,2797 +test,1-4KiB,r,r,182,422911 +test,1-4KiB,r,shell,1,1246 +test,1-4KiB,r,yaml,10,23313 +test,1-4KiB,ruby,gemspec,12,18035 +test,1-4KiB,ruby,lua,1,2129 +test,1-4KiB,ruby,python,1,2508 +test,1-4KiB,ruby,ruby,238,506053 +test,1-4KiB,ruby,yaml,3,6281 +test,1-4KiB,rust,erlang,1,2812 +test,1-4KiB,rust,go,1,1822 +test,1-4KiB,rust,rust,245,576327 +test,1-4KiB,rust,swift,1,4035 +test,1-4KiB,scala,r,1,1994 +test,1-4KiB,scala,scala,325,667774 +test,1-4KiB,shell,batch,1,3874 +test,1-4KiB,shell,ini,2,2346 +test,1-4KiB,shell,markdown,3,4361 +test,1-4KiB,shell,shell,206,410600 +test,1-4KiB,sql,erlang,1,2081 +test,1-4KiB,sql,lua,1,1173 +test,1-4KiB,sql,sql,173,367107 +test,1-4KiB,swift,markdown,1,1307 +test,1-4KiB,swift,swift,330,708341 +test,1-4KiB,toml,ini,6,6954 +test,1-4KiB,toml,markdown,1,3654 +test,1-4KiB,toml,toml,141,266925 +test,1-4KiB,typescript,css,1,3689 +test,1-4KiB,typescript,javascript,45,94234 +test,1-4KiB,typescript,typescript,225,479280 +test,1-4KiB,vba,asm,1,3716 +test,1-4KiB,vba,python,2,5165 +test,1-4KiB,vba,sql,86,249442 +test,1-4KiB,vba,vba,287,640046 +test,1-4KiB,verilog,asm,1,2186 +test,1-4KiB,verilog,c,12,26068 +test,1-4KiB,verilog,cpp,16,43417 +test,1-4KiB,verilog,ini,1,1114 +test,1-4KiB,verilog,javascript,6,7449 +test,1-4KiB,verilog,typescript,1,1216 +test,1-4KiB,verilog,verilog,233,525888 +test,1-4KiB,xml,html,1,1546 +test,1-4KiB,xml,markdown,1,1514 +test,1-4KiB,xml,vba,1,2218 +test,1-4KiB,xml,xml,194,425013 +test,1-4KiB,yaml,yaml,229,455065 +test,4-16KiB,asm,asm,67,521415 +test,4-16KiB,asm,python,1,4852 +test,4-16KiB,batch,batch,61,456086 +test,4-16KiB,batch,perl,1,7238 +test,4-16KiB,c,c,140,1216358 +test,4-16KiB,c,cpp,48,374072 +test,4-16KiB,clojure,asm,1,4334 +test,4-16KiB,clojure,clojure,160,1211034 +test,4-16KiB,clojure,markdown,1,6339 +test,4-16KiB,cmake,c,3,19570 +test,4-16KiB,cmake,cmake,122,1035225 +test,4-16KiB,cmake,perl,1,7511 +test,4-16KiB,cobol,c,1,12041 +test,4-16KiB,cobol,cobol,84,655283 +test,4-16KiB,cobol,cpp,1,5662 +test,4-16KiB,cobol,javascript,3,29597 +test,4-16KiB,cpp,c,28,251689 +test,4-16KiB,cpp,cpp,221,1838348 +test,4-16KiB,cpp,javascript,1,4477 +test,4-16KiB,cpp,php,1,5082 +test,4-16KiB,cs,c,1,5521 +test,4-16KiB,cs,cs,147,1151424 +test,4-16KiB,cs,html,1,5934 +test,4-16KiB,cs,java,2,13086 +test,4-16KiB,cs,javascript,3,14861 +test,4-16KiB,css,css,147,1288784 +test,4-16KiB,css,yaml,1,7194 +test,4-16KiB,dart,dart,191,1484830 +test,4-16KiB,dockerfile,dockerfile,119,618268 +test,4-16KiB,elixir,elixir,87,645853 +test,4-16KiB,elixir,javascript,1,7945 +test,4-16KiB,elixir,shell,1,4587 +test,4-16KiB,erlang,erlang,224,1923485 +test,4-16KiB,gemspec,gemspec,20,108845 +test,4-16KiB,go,go,242,1939456 +test,4-16KiB,gradle,gradle,4,25247 +test,4-16KiB,gradle,kotlin,1,6470 +test,4-16KiB,groovy,groovy,182,1459250 +test,4-16KiB,groovy,java,2,9769 +test,4-16KiB,groovy,javascript,1,5592 +test,4-16KiB,groovy,scala,1,16140 +test,4-16KiB,haskell,haskell,183,1470256 +test,4-16KiB,haskell,sql,1,9291 +test,4-16KiB,html,html,247,2191720 +test,4-16KiB,html,markdown,1,4483 +test,4-16KiB,html,php,2,13382 +test,4-16KiB,html,xml,1,4879 +test,4-16KiB,html,yaml,1,8135 +test,4-16KiB,ini,batch,3,24056 +test,4-16KiB,ini,dockerfile,1,6086 +test,4-16KiB,ini,ini,41,342910 +test,4-16KiB,ini,json,1,4609 +test,4-16KiB,ini,python,4,25918 +test,4-16KiB,ini,shell,1,4599 +test,4-16KiB,java,c,2,16907 +test,4-16KiB,java,cs,1,6438 +test,4-16KiB,java,java,160,1299540 +test,4-16KiB,java,javascript,1,4566 +test,4-16KiB,java,markdown,1,15661 +test,4-16KiB,javascript,asm,1,11525 +test,4-16KiB,javascript,html,1,8753 +test,4-16KiB,javascript,javascript,140,1089269 +test,4-16KiB,javascript,json,6,51513 +test,4-16KiB,javascript,sql,1,4478 +test,4-16KiB,javascript,typescript,1,8372 +test,4-16KiB,json,batch,1,8813 +test,4-16KiB,json,erlang,1,5376 +test,4-16KiB,json,haskell,1,9212 +test,4-16KiB,json,html,2,21619 +test,4-16KiB,json,javascript,1,7791 +test,4-16KiB,json,json,124,1020582 +test,4-16KiB,json,lua,1,8434 +test,4-16KiB,julia,c,1,11486 +test,4-16KiB,julia,julia,185,1435073 +test,4-16KiB,julia,python,1,7699 +test,4-16KiB,julia,ruby,1,4701 +test,4-16KiB,kotlin,gradle,1,7887 +test,4-16KiB,kotlin,groovy,2,10638 +test,4-16KiB,kotlin,kotlin,138,1059852 +test,4-16KiB,kotlin,scala,5,36129 +test,4-16KiB,lisp,asm,1,7556 +test,4-16KiB,lisp,lisp,194,1641732 +test,4-16KiB,lua,c,1,7138 +test,4-16KiB,lua,javascript,1,4496 +test,4-16KiB,lua,lua,176,1372206 +test,4-16KiB,markdown,asm,1,7601 +test,4-16KiB,markdown,html,3,17254 +test,4-16KiB,markdown,markdown,174,1337716 +test,4-16KiB,objectivec,c,1,7414 +test,4-16KiB,objectivec,objectivec,39,310927 +test,4-16KiB,ocaml,asm,1,7953 +test,4-16KiB,ocaml,ocaml,186,1470605 +test,4-16KiB,perl,asm,3,28081 +test,4-16KiB,perl,c,1,4483 +test,4-16KiB,perl,erlang,1,11210 +test,4-16KiB,perl,ini,1,6195 +test,4-16KiB,perl,lua,2,9306 +test,4-16KiB,perl,markdown,1,7886 +test,4-16KiB,perl,perl,179,1411194 +test,4-16KiB,perl,python,1,4182 +test,4-16KiB,perl,ruby,4,31752 +test,4-16KiB,perl,vba,1,5043 +test,4-16KiB,php,batch,1,12667 +test,4-16KiB,php,html,14,125903 +test,4-16KiB,php,lua,1,5547 +test,4-16KiB,php,php,140,1049782 +test,4-16KiB,powershell,json,1,6085 +test,4-16KiB,powershell,powershell,166,1361862 +test,4-16KiB,powershell,python,1,13295 +test,4-16KiB,powershell,shell,1,5189 +test,4-16KiB,python,javascript,1,8001 +test,4-16KiB,python,markdown,1,6434 +test,4-16KiB,python,python,237,1932804 +test,4-16KiB,r,asm,3,24530 +test,4-16KiB,r,clojure,1,6914 +test,4-16KiB,r,dockerfile,1,8305 +test,4-16KiB,r,javascript,3,30329 +test,4-16KiB,r,markdown,4,17698 +test,4-16KiB,r,python,2,21502 +test,4-16KiB,r,r,132,1005115 +test,4-16KiB,r,shell,1,14080 +test,4-16KiB,r,swift,1,5111 +test,4-16KiB,r,xml,3,17639 +test,4-16KiB,r,yaml,5,26311 +test,4-16KiB,ruby,dockerfile,1,10365 +test,4-16KiB,ruby,lua,1,4258 +test,4-16KiB,ruby,python,1,4206 +test,4-16KiB,ruby,ruby,107,810838 +test,4-16KiB,rust,javascript,1,6715 +test,4-16KiB,rust,rust,227,1841898 +test,4-16KiB,scala,scala,130,1067859 +test,4-16KiB,shell,cmake,2,20638 +test,4-16KiB,shell,shell,84,633807 +test,4-16KiB,sql,asm,1,13966 +test,4-16KiB,sql,sql,104,875210 +test,4-16KiB,sql,yaml,2,12009 +test,4-16KiB,swift,swift,175,1369891 +test,4-16KiB,toml,c,1,13409 +test,4-16KiB,toml,toml,30,220607 +test,4-16KiB,typescript,batch,1,15947 +test,4-16KiB,typescript,css,1,7399 +test,4-16KiB,typescript,javascript,8,50014 +test,4-16KiB,typescript,typescript,98,785934 +test,4-16KiB,typescript,xml,1,6690 +test,4-16KiB,vba,lua,1,7417 +test,4-16KiB,vba,ruby,1,8302 +test,4-16KiB,vba,sql,36,184118 +test,4-16KiB,vba,vba,140,1061146 +test,4-16KiB,verilog,c,3,22860 +test,4-16KiB,verilog,cpp,7,38993 +test,4-16KiB,verilog,dart,1,15048 +test,4-16KiB,verilog,javascript,3,17775 +test,4-16KiB,verilog,r,1,4480 +test,4-16KiB,verilog,rust,1,15891 +test,4-16KiB,verilog,verilog,207,1773278 +test,4-16KiB,xml,html,2,21317 +test,4-16KiB,xml,xml,130,1063890 +test,4-16KiB,yaml,xml,1,7589 +test,4-16KiB,yaml,yaml,89,699820 +test,16-64KiB,asm,asm,39,1424796 +test,16-64KiB,asm,lua,1,29451 +test,16-64KiB,batch,batch,5,144187 +test,16-64KiB,batch,css,1,60259 +test,16-64KiB,c,c,84,2705765 +test,16-64KiB,c,cpp,11,278297 +test,16-64KiB,clojure,clojure,45,1323797 +test,16-64KiB,cmake,cmake,26,703726 +test,16-64KiB,cmake,markdown,1,26445 +test,16-64KiB,cobol,cobol,15,553316 +test,16-64KiB,cpp,c,14,392058 +test,16-64KiB,cpp,cpp,91,2748343 +test,16-64KiB,cpp,dart,1,24213 +test,16-64KiB,cs,cs,48,1326081 +test,16-64KiB,cs,java,1,34795 +test,16-64KiB,css,css,79,2601916 +test,16-64KiB,dart,dart,47,1481290 +test,16-64KiB,dart,javascript,1,63334 +test,16-64KiB,elixir,elixir,25,708680 +test,16-64KiB,erlang,erlang,128,3917779 +test,16-64KiB,go,go,54,1542404 +test,16-64KiB,groovy,cs,1,41435 +test,16-64KiB,groovy,groovy,42,1138788 +test,16-64KiB,groovy,java,1,43614 +test,16-64KiB,groovy,python,1,17055 +test,16-64KiB,haskell,haskell,46,1403505 +test,16-64KiB,html,html,149,4406808 +test,16-64KiB,ini,batch,2,36539 +test,16-64KiB,ini,ini,12,408441 +test,16-64KiB,ini,python,1,64898 +test,16-64KiB,java,cs,2,64035 +test,16-64KiB,java,dart,1,21359 +test,16-64KiB,java,java,44,1368766 +test,16-64KiB,javascript,javascript,41,1351543 +test,16-64KiB,json,json,38,1127746 +test,16-64KiB,julia,elixir,1,40778 +test,16-64KiB,julia,julia,53,1836425 +test,16-64KiB,julia,python,1,20905 +test,16-64KiB,julia,r,1,19780 +test,16-64KiB,kotlin,kotlin,18,441248 +test,16-64KiB,kotlin,lua,1,61485 +test,16-64KiB,lisp,asm,1,20257 +test,16-64KiB,lisp,lisp,121,3840602 +test,16-64KiB,lua,javascript,1,16639 +test,16-64KiB,lua,lua,67,1855677 +test,16-64KiB,markdown,html,3,116593 +test,16-64KiB,markdown,markdown,38,997136 +test,16-64KiB,objectivec,c,1,46731 +test,16-64KiB,objectivec,objectivec,10,256390 +test,16-64KiB,ocaml,ocaml,87,2151918 +test,16-64KiB,perl,asm,1,54479 +test,16-64KiB,perl,json,1,25453 +test,16-64KiB,perl,perl,56,1584875 +test,16-64KiB,perl,powershell,1,20754 +test,16-64KiB,perl,shell,1,17149 +test,16-64KiB,php,css,1,33390 +test,16-64KiB,php,html,7,198253 +test,16-64KiB,php,php,24,711325 +test,16-64KiB,powershell,powershell,45,1466116 +test,16-64KiB,powershell,shell,1,16816 +test,16-64KiB,powershell,yaml,1,18730 +test,16-64KiB,python,python,73,1981257 +test,16-64KiB,r,asm,2,54776 +test,16-64KiB,r,cobol,1,16932 +test,16-64KiB,r,javascript,1,33433 +test,16-64KiB,r,markdown,1,17732 +test,16-64KiB,r,r,27,700739 +test,16-64KiB,r,swift,1,26197 +test,16-64KiB,r,xml,1,26746 +test,16-64KiB,r,yaml,4,178136 +test,16-64KiB,ruby,ruby,18,490940 +test,16-64KiB,rust,rust,95,2836812 +test,16-64KiB,scala,scala,34,1023873 +test,16-64KiB,shell,shell,13,421810 +test,16-64KiB,sql,asm,1,45037 +test,16-64KiB,sql,ini,1,35008 +test,16-64KiB,sql,sql,56,1695556 +test,16-64KiB,sql,toml,2,42729 +test,16-64KiB,swift,swift,28,827364 +test,16-64KiB,toml,toml,2,34412 +test,16-64KiB,typescript,javascript,4,127987 +test,16-64KiB,typescript,typescript,27,756401 +test,16-64KiB,vba,python,2,43919 +test,16-64KiB,vba,vba,34,1022025 +test,16-64KiB,verilog,asm,1,51235 +test,16-64KiB,verilog,c,1,63479 +test,16-64KiB,verilog,cpp,2,69286 +test,16-64KiB,verilog,python,1,19909 +test,16-64KiB,verilog,verilog,78,2345736 +test,16-64KiB,xml,xml,64,2079324 +test,16-64KiB,yaml,yaml,31,987830 +test,>64KiB,asm,asm,9,1007573 +test,>64KiB,asm,c,1,99935 +test,>64KiB,batch,batch,1,84247 +test,>64KiB,c,c,19,2061034 +test,>64KiB,c,cpp,2,250380 +test,>64KiB,clojure,clojure,8,1133638 +test,>64KiB,cmake,python,1,85420 +test,>64KiB,cobol,cobol,1,87523 +test,>64KiB,cpp,c,4,327509 +test,>64KiB,cpp,cpp,21,2662465 +test,>64KiB,cpp,cs,1,68950 +test,>64KiB,cs,cs,3,476188 +test,>64KiB,css,css,69,10511322 +test,>64KiB,dart,dart,10,1246809 +test,>64KiB,elixir,elixir,3,441915 +test,>64KiB,erlang,erlang,28,2990840 +test,>64KiB,go,go,6,574087 +test,>64KiB,groovy,groovy,4,320898 +test,>64KiB,groovy,java,1,94947 +test,>64KiB,haskell,haskell,3,322283 +test,>64KiB,html,html,36,4046414 +test,>64KiB,ini,batch,4,529617 +test,>64KiB,ini,ini,7,631723 +test,>64KiB,ini,python,1,87287 +test,>64KiB,ini,toml,1,100282 +test,>64KiB,java,java,8,1259790 +test,>64KiB,javascript,javascript,14,1648053 +test,>64KiB,json,elixir,1,139620 +test,>64KiB,json,json,16,2081680 +test,>64KiB,julia,julia,4,435892 +test,>64KiB,kotlin,groovy,1,78212 +test,>64KiB,lisp,asm,1,86350 +test,>64KiB,lisp,lisp,39,5650571 +test,>64KiB,lua,lua,11,1032764 +test,>64KiB,markdown,markdown,3,291417 +test,>64KiB,objectivec,objectivec,3,408062 +test,>64KiB,ocaml,ini,4,357729 +test,>64KiB,ocaml,ocaml,20,2599210 +test,>64KiB,ocaml,perl,1,92145 +test,>64KiB,perl,c,1,116642 +test,>64KiB,perl,perl,9,1066173 +test,>64KiB,php,php,4,464985 +test,>64KiB,powershell,powershell,11,1357832 +test,>64KiB,python,python,16,1833764 +test,>64KiB,r,r,2,165780 +test,>64KiB,rust,rust,25,2712306 +test,>64KiB,scala,scala,4,387363 +test,>64KiB,sql,sql,20,2342974 +test,>64KiB,swift,swift,4,490148 +test,>64KiB,typescript,typescript,9,1246973 +test,>64KiB,typescript,xml,16,2109472 +test,>64KiB,vba,vba,9,913318 +test,>64KiB,verilog,asm,1,114230 +test,>64KiB,verilog,lua,1,124871 +test,>64KiB,verilog,verilog,8,882008 +test,>64KiB,xml,xml,17,2405086 +test,>64KiB,yaml,yaml,8,1080534 diff --git a/reports/actual_dataset_confusion_by_size.md b/reports/actual_dataset_confusion_by_size.md index f55f058..bee06b7 100644 --- a/reports/actual_dataset_confusion_by_size.md +++ b/reports/actual_dataset_confusion_by_size.md @@ -1,26 +1,25 @@ # Actual Dataset Confusion By File Size -Source cache: `/tmp/magika-source-qat-cache-guesslang-direct-fs-pruned48` +Source cache: `/tmp/betlang-finetune-cache` Checkpoint: `assets/magika/source-student-q4.bin` -Alignment manifest: `/tmp/guesslang-corpus/betlang_selected_full_manifest_filename_v2.csv` -Repositories: `/tmp/guesslang-corpus/repositories` +Raw corpus split: `/tmp/betlang-finetune-corpus/files/test` -Cached test rows: 182,700. Manifest blob records scanned for alignment: 212,238. Full-window matched rows: 182,700. Skipped blob records: 95. -Overall test fs accuracy: 96.524%. Teacher parity: 93.216% over 172,303 active-teacher rows. +Cached test rows: 34,087. Raw files scanned for alignment: 34,526. Full-window matched rows: 34,087. Prefix fallback rows: 0. +Overall test fs accuracy: 94.235%. Teacher parity: 94.405% over 34,087 active-teacher rows. -Labels are the 48 exported model labels. Cache labels absent from this model head are not evaluated or predicted: `awk`, `bazel`, `csproj`, `diff`, `erb`, `hcl`, `ipynb`, `jinja`, `jsonl`, `matlab`, `postscript`, `prolog`, `scss`, `solidity`, `textproto`, `vcxproj`, `vhdl`, `vue`, `zig`. Actual labels use `test.fs_labels.mmap`, which is filesystem-extension labels where mapped and teacher fallback where unmapped. +Labels are the 48 exported model labels. Cache labels absent from this model head are not evaluated or predicted: none. Actual labels use `test.fs_labels.mmap`, which is filesystem-extension labels where mapped and teacher fallback where unmapped. ## Summary | Bucket | Files | Bytes | Accuracy | Byte Accuracy | Top confusions | |---|---:|---:|---:|---:|---| -| <=128B | 13,513 | 961.5 KiB | 88.75% | 91.20% | shell->batch 81, toml->ini 51, cpp->c 50, batch->shell 35, powershell->batch 33, haskell->ini 22 | -| 129-512B | 37,610 | 11.0 MiB | 96.17% | 96.51% | cpp->c 81, shell->batch 71, javascript->typescript 64, toml->ini 34, powershell->batch 33, c->cpp 32 | -| 513B-1KiB | 29,967 | 21.4 MiB | 97.70% | 97.71% | javascript->typescript 47, cpp->c 45, c->cpp 41, php->html 21, typescript->javascript 15, batch->shell 15 | -| 1-4KiB | 61,055 | 124.3 MiB | 97.95% | 97.91% | cpp->c 140, c->cpp 120, javascript->typescript 65, dockerfile->shell 57, php->html 41, dockerfile->markdown 28 | -| 4-16KiB | 29,825 | 221.8 MiB | 97.16% | 97.02% | cpp->c 121, c->cpp 70, perl->r 43, php->html 32, perl->erlang 24, objectivec->cpp 24 | -| 16-64KiB | 7,694 | 218.9 MiB | 95.18% | 94.93% | cpp->c 67, c->cpp 30, objectivec->c 10, perl->erlang 9, perl->objectivec 8, javascript->typescript 8 | -| >64KiB | 3,036 | 3.0 GiB | 92.23% | 93.99% | perl->r 22, cpp->c 16, julia->json 15, c->cpp 7, sql->powershell 6, ocaml->ini 6 | +| <=128B | 2,164 | 168.5 KiB | 85.30% | 87.75% | markdown->yaml 22, yaml->markdown 19, r->markdown 17, ini->batch 14, shell->batch 12, ini->markdown 9 | +| 129-512B | 5,774 | 1.6 MiB | 92.24% | 92.54% | r->markdown 38, typescript->javascript 29, r->yaml 22, ini->batch 22, r->lua 17, javascript->typescript 14 | +| 513B-1KiB | 4,796 | 3.5 MiB | 95.37% | 95.50% | typescript->javascript 20, ruby->gemspec 14, c->cpp 13, cpp->c 6, verilog->c 5, r->python 5 | +| 1-4KiB | 11,689 | 24.1 MiB | 95.36% | 95.12% | vba->sql 86, c->cpp 64, typescript->javascript 45, cpp->c 31, verilog->cpp 16, php->html 14 | +| 4-16KiB | 6,882 | 52.3 MiB | 95.61% | 95.92% | c->cpp 48, vba->sql 36, cpp->c 28, php->html 14, typescript->javascript 8, verilog->cpp 7 | +| 16-64KiB | 2,247 | 64.4 MiB | 95.99% | 95.88% | cpp->c 14, c->cpp 11, php->html 7, typescript->javascript 4, r->yaml 4, markdown->html 3 | +| >64KiB | 535 | 63.2 MiB | 91.96% | 92.66% | typescript->xml 16, ocaml->ini 4, ini->batch 4, cpp->c 4, c->cpp 2, verilog->lua 1 | ## Matrices @@ -28,363 +27,355 @@ Each matrix is count-based. Columns are the top predicted labels in that bucket; ### <=128B -| actual \ predicted | markdown | batch | yaml | toml | shell | cmake | javascript | elixir | ini | gradle | perl | sql | c | css | other | +| actual \ predicted | markdown | yaml | batch | gemfile | toml | ini | sql | shell | ruby | ocaml | dockerfile | javascript | css | elixir | other | |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| -| asm | 5 | 10 | 2 | 0 | 0 | 2 | 0 | 0 | 5 | 0 | 0 | 0 | 6 | 0 | 88 | -| batch | 12 | 979 | 1 | 0 | 35 | 1 | 0 | 0 | 8 | 0 | 2 | 1 | 0 | 0 | 12 | -| c | 2 | 12 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 242 | 1 | 9 | -| clojure | 1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 1 | 184 | -| cmake | 9 | 6 | 8 | 0 | 8 | 555 | 1 | 0 | 6 | 1 | 0 | 0 | 1 | 0 | 11 | -| cobol | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| cpp | 5 | 8 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 0 | 1 | 1 | 50 | 1 | 94 | -| cs | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 28 | -| css | 2 | 8 | 1 | 0 | 0 | 0 | 4 | 0 | 8 | 0 | 1 | 0 | 5 | 303 | 4 | -| dart | 3 | 0 | 0 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 2 | 0 | 1 | 0 | 167 | -| dockerfile | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 267 | -| elixir | 1 | 3 | 2 | 0 | 0 | 0 | 0 | 438 | 1 | 0 | 0 | 0 | 0 | 0 | 12 | -| erlang | 0 | 1 | 4 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 55 | -| gemfile | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 179 | -| go | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 150 | -| gradle | 3 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 3 | 384 | 0 | 0 | 0 | 0 | 3 | -| groovy | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 66 | -| haskell | 4 | 1 | 0 | 0 | 2 | 0 | 0 | 1 | 22 | 0 | 0 | 4 | 6 | 0 | 170 | -| html | 19 | 9 | 4 | 0 | 0 | 0 | 0 | 0 | 7 | 0 | 0 | 1 | 0 | 0 | 176 | -| ini | 7 | 4 | 2 | 2 | 1 | 0 | 0 | 0 | 221 | 0 | 0 | 1 | 0 | 0 | 8 | -| java | 3 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 98 | -| javascript | 16 | 1 | 9 | 2 | 4 | 0 | 430 | 0 | 10 | 0 | 0 | 0 | 3 | 1 | 34 | -| json | 1 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 3 | 0 | 0 | 0 | 0 | 1 | 288 | -| julia | 3 | 4 | 1 | 0 | 0 | 0 | 5 | 0 | 4 | 0 | 0 | 0 | 0 | 0 | 275 | -| kotlin | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 5 | 0 | 0 | 0 | 0 | 172 | -| lisp | 1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 1 | 0 | 0 | 0 | 0 | 213 | -| lua | 0 | 4 | 0 | 5 | 2 | 0 | 13 | 1 | 4 | 1 | 0 | 3 | 0 | 0 | 109 | -| markdown | 1066 | 21 | 5 | 1 | 3 | 0 | 1 | 0 | 8 | 0 | 1 | 1 | 1 | 0 | 8 | -| objectivec | 2 | 1 | 0 | 0 | 0 | 1 | 3 | 0 | 3 | 0 | 1 | 0 | 1 | 0 | 107 | -| ocaml | 17 | 2 | 0 | 0 | 0 | 2 | 4 | 0 | 4 | 2 | 0 | 1 | 0 | 0 | 194 | -| perl | 7 | 1 | 0 | 0 | 4 | 5 | 5 | 0 | 6 | 0 | 347 | 1 | 5 | 1 | 19 | -| php | 5 | 4 | 0 | 0 | 1 | 0 | 1 | 0 | 5 | 0 | 1 | 0 | 1 | 1 | 221 | -| powershell | 11 | 33 | 4 | 0 | 10 | 0 | 2 | 0 | 2 | 4 | 0 | 0 | 0 | 0 | 126 | -| python | 6 | 1 | 0 | 2 | 1 | 0 | 0 | 0 | 8 | 1 | 0 | 0 | 0 | 0 | 125 | -| r | 5 | 1 | 0 | 0 | 3 | 3 | 2 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 130 | -| ruby | 5 | 3 | 1 | 1 | 0 | 0 | 10 | 1 | 9 | 2 | 0 | 1 | 0 | 0 | 271 | -| rust | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 0 | 1 | 1 | 1 | 1 | 214 | -| scala | 1 | 0 | 0 | 0 | 0 | 0 | 2 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 260 | -| shell | 12 | 81 | 0 | 0 | 602 | 1 | 1 | 0 | 9 | 0 | 0 | 1 | 0 | 0 | 11 | -| sql | 1 | 4 | 0 | 0 | 1 | 0 | 1 | 1 | 4 | 0 | 3 | 333 | 0 | 0 | 6 | -| swift | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 2 | 0 | 51 | -| toml | 1 | 0 | 0 | 729 | 1 | 0 | 0 | 0 | 51 | 0 | 0 | 0 | 0 | 0 | 2 | -| typescript | 1 | 2 | 0 | 0 | 1 | 0 | 21 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 283 | -| vba | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 66 | -| verilog | 7 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 0 | 0 | 0 | 0 | 0 | 42 | -| xml | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 3 | 2 | 0 | 0 | 0 | 0 | 108 | -| yaml | 2 | 3 | 714 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | 0 | 0 | 0 | 1 | 3 | +| asm | 6 | 1 | 3 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 6 | 0 | 0 | 25 | +| batch | 7 | 0 | 180 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| c | 3 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | +| clojure | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 33 | +| cmake | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 21 | +| cobol | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | +| cpp | 2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 11 | +| cs | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 9 | +| css | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 38 | 0 | 0 | +| dart | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | +| dockerfile | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 45 | 0 | 0 | 0 | 0 | +| elixir | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 33 | 4 | +| erlang | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 10 | +| gemfile | 0 | 0 | 0 | 143 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| go | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | +| groovy | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 19 | +| haskell | 2 | 0 | 0 | 0 | 2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 29 | +| html | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| ini | 9 | 3 | 14 | 0 | 5 | 78 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 10 | +| java | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | +| javascript | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 17 | 0 | 0 | 3 | +| json | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 19 | +| julia | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 27 | +| kotlin | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 29 | +| lisp | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 24 | +| lua | 1 | 0 | 2 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 23 | +| markdown | 353 | 22 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | +| ocaml | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 50 | 0 | 1 | 0 | 0 | 3 | +| perl | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 20 | +| php | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 11 | +| powershell | 5 | 0 | 4 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 8 | +| python | 1 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | +| r | 17 | 3 | 3 | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 24 | +| ruby | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 52 | 0 | 0 | 1 | 0 | 1 | 3 | +| rust | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 11 | +| scala | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | +| shell | 6 | 0 | 12 | 0 | 0 | 0 | 1 | 71 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| sql | 0 | 0 | 1 | 0 | 0 | 0 | 77 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| swift | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | +| toml | 0 | 0 | 0 | 0 | 91 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | +| typescript | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | 0 | 26 | +| vba | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | +| verilog | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | +| xml | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| yaml | 19 | 222 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ### 129-512B -| actual \ predicted | cmake | yaml | toml | c | javascript | batch | json | objectivec | clojure | perl | dockerfile | shell | typescript | scala | other | +| actual \ predicted | gemfile | markdown | toml | batch | ini | yaml | sql | shell | ruby | javascript | cmake | dockerfile | typescript | kotlin | other | |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| -| asm | 1 | 2 | 0 | 4 | 0 | 4 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 487 | -| batch | 0 | 0 | 0 | 2 | 0 | 1199 | 0 | 0 | 0 | 0 | 0 | 13 | 0 | 0 | 12 | -| c | 0 | 0 | 0 | 1456 | 1 | 2 | 0 | 4 | 0 | 1 | 0 | 1 | 0 | 0 | 42 | -| clojure | 1 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 1163 | 0 | 0 | 0 | 0 | 0 | 6 | -| cmake | 2020 | 10 | 0 | 3 | 0 | 4 | 1 | 0 | 1 | 0 | 0 | 10 | 0 | 0 | 27 | -| cobol | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | -| cpp | 2 | 0 | 0 | 81 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 415 | -| cs | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 715 | -| css | 0 | 5 | 0 | 1 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 639 | -| dart | 0 | 0 | 0 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | 0 | 820 | -| dockerfile | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 1137 | 1 | 0 | 0 | 0 | -| elixir | 0 | 4 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 910 | -| erlang | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 5 | 0 | 0 | 0 | 0 | 474 | -| gemfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 84 | -| gemspec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | -| go | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 661 | -| gradle | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 284 | -| groovy | 0 | 0 | 0 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | 467 | -| haskell | 0 | 1 | 0 | 2 | 0 | 4 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 608 | -| html | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 735 | -| ini | 2 | 2 | 10 | 1 | 0 | 7 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 336 | -| java | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 945 | -| javascript | 0 | 25 | 0 | 1 | 1321 | 2 | 6 | 0 | 0 | 0 | 0 | 0 | 64 | 0 | 36 | -| json | 0 | 0 | 0 | 0 | 0 | 0 | 1327 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 4 | -| julia | 1 | 0 | 0 | 1 | 3 | 4 | 0 | 8 | 0 | 0 | 0 | 0 | 1 | 1 | 562 | -| kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 931 | -| lisp | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 4 | 0 | 0 | 0 | 0 | 0 | 510 | -| lua | 0 | 0 | 2 | 2 | 14 | 0 | 4 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 461 | -| markdown | 1 | 7 | 0 | 0 | 1 | 3 | 1 | 0 | 0 | 0 | 0 | 3 | 0 | 1 | 821 | -| objectivec | 0 | 0 | 2 | 17 | 1 | 6 | 0 | 1146 | 0 | 8 | 0 | 1 | 1 | 0 | 28 | -| ocaml | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 525 | -| perl | 2 | 0 | 0 | 4 | 4 | 6 | 0 | 7 | 1 | 1118 | 0 | 5 | 3 | 0 | 26 | -| php | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 636 | -| powershell | 1 | 0 | 1 | 0 | 2 | 33 | 0 | 1 | 0 | 0 | 0 | 5 | 0 | 0 | 485 | -| python | 1 | 1 | 2 | 0 | 1 | 2 | 1 | 0 | 0 | 1 | 0 | 3 | 0 | 0 | 510 | -| r | 5 | 2 | 0 | 0 | 4 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 439 | -| ruby | 0 | 0 | 1 | 0 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 0 | 0 | 787 | -| rust | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 492 | -| scala | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 968 | 37 | -| shell | 4 | 0 | 0 | 0 | 1 | 71 | 1 | 0 | 0 | 1 | 0 | 1086 | 2 | 0 | 30 | -| sql | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 833 | -| swift | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 2 | 1 | 504 | -| toml | 0 | 0 | 1582 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 39 | -| typescript | 0 | 0 | 0 | 0 | 25 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 1048 | 2 | 12 | -| vba | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 248 | -| verilog | 0 | 0 | 0 | 2 | 0 | 1 | 0 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 400 | -| xml | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 699 | -| yaml | 2 | 1578 | 0 | 0 | 1 | 0 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 10 | +| asm | 0 | 0 | 0 | 1 | 1 | 3 | 3 | 0 | 0 | 4 | 0 | 0 | 1 | 0 | 70 | +| batch | 0 | 0 | 0 | 209 | 1 | 0 | 0 | 4 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | +| c | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 81 | +| clojure | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 107 | +| cmake | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 151 | 0 | 0 | 0 | 0 | +| cobol | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 48 | +| cpp | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 40 | +| cs | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 101 | +| css | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 117 | +| dart | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 100 | +| dockerfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 150 | 0 | 0 | 0 | +| elixir | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 137 | +| erlang | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 53 | +| gemfile | 457 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| gemspec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 7 | +| go | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 58 | +| gradle | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | +| groovy | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 88 | +| haskell | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 91 | +| html | 0 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 28 | +| ini | 0 | 7 | 1 | 22 | 236 | 2 | 2 | 10 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | +| java | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 74 | +| javascript | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 108 | 0 | 0 | 14 | 0 | 1 | +| json | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 93 | +| julia | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 2 | 0 | 0 | 0 | 0 | 73 | +| kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 137 | 5 | +| lisp | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 120 | +| lua | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 4 | 2 | 1 | 0 | 0 | 0 | 104 | +| markdown | 0 | 257 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | +| objectivec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 37 | +| ocaml | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 101 | +| perl | 0 | 1 | 0 | 0 | 0 | 1 | 2 | 0 | 10 | 4 | 0 | 0 | 0 | 0 | 53 | +| php | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 105 | +| powershell | 0 | 1 | 0 | 8 | 0 | 0 | 1 | 4 | 1 | 3 | 0 | 0 | 0 | 0 | 78 | +| python | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 81 | +| r | 0 | 38 | 0 | 2 | 0 | 22 | 3 | 1 | 0 | 3 | 1 | 0 | 0 | 0 | 113 | +| ruby | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 164 | 0 | 0 | 1 | 0 | 0 | 4 | +| rust | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 61 | +| scala | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 88 | +| shell | 0 | 4 | 0 | 10 | 2 | 2 | 2 | 176 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | +| sql | 0 | 0 | 0 | 0 | 0 | 0 | 201 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| swift | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 100 | +| toml | 0 | 0 | 270 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| typescript | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 29 | 0 | 0 | 122 | 0 | 2 | +| vba | 0 | 0 | 1 | 3 | 0 | 1 | 3 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 42 | +| verilog | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | 0 | 1 | 0 | 66 | +| xml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 96 | +| yaml | 0 | 1 | 0 | 3 | 0 | 186 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ### 513B-1KiB -| actual \ predicted | cmake | javascript | objectivec | perl | elixir | swift | json | dockerfile | typescript | c | scala | kotlin | java | yaml | other | +| actual \ predicted | toml | gemspec | yaml | scala | php | shell | javascript | cmake | elixir | batch | cs | xml | ruby | kotlin | other | |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| -| asm | 1 | 0 | 2 | 0 | 1 | 0 | 0 | 0 | 0 | 7 | 0 | 0 | 0 | 2 | 492 | -| batch | 1 | 2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 520 | -| c | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 773 | 0 | 0 | 0 | 0 | 45 | -| clojure | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 713 | -| cmake | 1422 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 17 | -| cobol | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 32 | -| cpp | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 45 | 0 | 0 | 0 | 0 | 293 | -| cs | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 3 | 0 | 694 | -| css | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 549 | -| dart | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | 0 | 0 | 4 | 0 | 652 | -| dockerfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 848 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | -| elixir | 0 | 0 | 1 | 0 | 980 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 8 | -| erlang | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 577 | -| gemfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 33 | -| gemspec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 43 | -| go | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 719 | -| gradle | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 608 | -| groovy | 0 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 1 | 1 | 5 | 0 | 314 | -| haskell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 535 | -| html | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 602 | -| ini | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 163 | -| java | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 740 | 0 | 3 | -| javascript | 0 | 1277 | 0 | 0 | 0 | 1 | 6 | 0 | 47 | 0 | 3 | 0 | 1 | 11 | 9 | -| json | 0 | 1 | 0 | 0 | 0 | 0 | 846 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | -| julia | 0 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 583 | -| kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 759 | 0 | 0 | 11 | -| lisp | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 362 | -| lua | 0 | 0 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 514 | -| markdown | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 | 1 | 0 | 0 | 0 | 2 | 519 | -| objectivec | 0 | 5 | 1099 | 5 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | 0 | 0 | 0 | 16 | -| ocaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 2 | 0 | 0 | 0 | 0 | 528 | -| perl | 0 | 2 | 7 | 1008 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 23 | -| php | 0 | 4 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 645 | -| powershell | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 605 | -| python | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 588 | -| r | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 618 | -| ruby | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 482 | -| rust | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 1 | 0 | 493 | -| scala | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 779 | 3 | 0 | 0 | 4 | -| shell | 2 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 673 | -| sql | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 561 | -| swift | 0 | 0 | 0 | 0 | 0 | 888 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| toml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 488 | -| typescript | 0 | 15 | 0 | 0 | 0 | 0 | 0 | 0 | 775 | 0 | 0 | 0 | 1 | 0 | 2 | -| vba | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 233 | -| verilog | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 508 | -| xml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 699 | -| yaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 704 | 3 | +| asm | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 64 | +| batch | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 125 | 0 | 0 | 0 | 0 | 0 | +| c | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 80 | +| clojure | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 110 | +| cmake | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 141 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| cobol | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 55 | +| cpp | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 60 | +| cs | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 126 | 0 | 0 | 1 | 4 | +| css | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 96 | +| dart | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 103 | +| dockerfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 108 | +| elixir | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 132 | 0 | 0 | 0 | 0 | 0 | 0 | +| erlang | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 76 | +| gemfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | +| gemspec | 0 | 169 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | +| go | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 86 | +| gradle | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 6 | +| groovy | 0 | 0 | 0 | 1 | 0 | 0 | 3 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 90 | +| haskell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 101 | +| html | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 46 | +| ini | 3 | 0 | 3 | 0 | 0 | 5 | 1 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 77 | +| java | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 99 | +| javascript | 0 | 0 | 0 | 0 | 0 | 0 | 114 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | +| json | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 64 | +| julia | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 97 | +| kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 116 | 3 | +| lisp | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 68 | +| lua | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 91 | +| markdown | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 89 | +| objectivec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 26 | +| ocaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 82 | +| perl | 0 | 0 | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 93 | +| php | 0 | 0 | 0 | 0 | 149 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | +| powershell | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 117 | +| python | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 94 | +| r | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 83 | +| ruby | 0 | 14 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 116 | 0 | 3 | +| rust | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 80 | +| scala | 0 | 0 | 0 | 155 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| shell | 0 | 0 | 1 | 0 | 0 | 141 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 4 | +| sql | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 104 | +| swift | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 103 | +| toml | 192 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | +| typescript | 0 | 0 | 0 | 0 | 0 | 0 | 20 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 109 | +| vba | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 3 | 0 | 0 | 0 | 0 | 80 | +| verilog | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 73 | +| xml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 120 | 0 | 0 | 0 | +| yaml | 0 | 0 | 156 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ### 1-4KiB -| actual \ predicted | javascript | perl | objectivec | cmake | c | swift | vba | cs | r | go | haskell | kotlin | powershell | rust | other | +| actual \ predicted | gemspec | json | java | javascript | swift | scala | dockerfile | elixir | groovy | cpp | markdown | cs | go | haskell | other | |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| -| asm | 2 | 1 | 2 | 0 | 4 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 1250 | -| batch | 3 | 0 | 0 | 2 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 0 | 755 | -| c | 1 | 0 | 8 | 0 | 1708 | 3 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 131 | -| clojure | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1325 | -| cmake | 0 | 0 | 0 | 2141 | 3 | 0 | 1 | 0 | 2 | 0 | 0 | 0 | 2 | 0 | 13 | -| cobol | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 71 | -| cpp | 2 | 0 | 2 | 1 | 140 | 0 | 0 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 1023 | -| cs | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1736 | 0 | 0 | 0 | 0 | 2 | 0 | 12 | -| css | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1201 | -| dart | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1488 | -| dockerfile | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1336 | -| elixir | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 1197 | -| erlang | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1264 | -| gemfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 30 | -| gemspec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 25 | -| go | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1619 | 0 | 1 | 0 | 0 | 8 | -| gradle | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 692 | -| groovy | 2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 651 | -| haskell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1609 | 0 | 0 | 0 | 9 | -| html | 3 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1137 | -| ini | 0 | 2 | 3 | 1 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 163 | -| java | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1429 | -| javascript | 2506 | 0 | 0 | 0 | 2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 3 | 0 | 97 | -| json | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 857 | -| julia | 0 | 0 | 5 | 1 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 1474 | -| kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1571 | 0 | 0 | 5 | -| lisp | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1122 | -| lua | 3 | 0 | 2 | 0 | 2 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 1433 | -| markdown | 2 | 1 | 2 | 1 | 0 | 3 | 0 | 0 | 0 | 3 | 2 | 0 | 1 | 0 | 1061 | -| objectivec | 1 | 8 | 2472 | 0 | 9 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 22 | -| ocaml | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1387 | -| perl | 0 | 2510 | 9 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 3 | 1 | 18 | -| php | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1492 | -| powershell | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1456 | 0 | 17 | -| python | 1 | 3 | 0 | 0 | 1 | 0 | 0 | 1 | 2 | 0 | 0 | 1 | 0 | 0 | 1452 | -| r | 5 | 1 | 0 | 2 | 1 | 0 | 0 | 0 | 1693 | 0 | 0 | 0 | 0 | 0 | 16 | -| ruby | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 769 | -| rust | 0 | 3 | 0 | 0 | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 1488 | 8 | -| scala | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 8 | 0 | 0 | 1413 | -| shell | 0 | 1 | 1 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 16 | 0 | 878 | -| sql | 0 | 2 | 0 | 0 | 0 | 0 | 7 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 948 | -| swift | 1 | 0 | 0 | 0 | 0 | 1859 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 7 | -| toml | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 332 | -| typescript | 11 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1124 | -| vba | 0 | 0 | 0 | 0 | 0 | 0 | 1840 | 0 | 3 | 0 | 0 | 0 | 1 | 0 | 8 | -| verilog | 1 | 0 | 2 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1268 | -| xml | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1228 | -| yaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 788 | +| asm | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 1 | 0 | 147 | +| batch | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 129 | +| c | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 64 | 0 | 0 | 0 | 0 | 209 | +| clojure | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 279 | +| cmake | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 281 | +| cobol | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 130 | +| cpp | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 220 | 0 | 0 | 0 | 0 | 32 | +| cs | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 292 | 0 | 0 | 5 | +| css | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 198 | +| dart | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 279 | +| dockerfile | 0 | 0 | 0 | 0 | 0 | 0 | 327 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| elixir | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 324 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| erlang | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 230 | +| gemspec | 458 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| go | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 289 | 0 | 0 | +| gradle | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 19 | +| groovy | 0 | 0 | 6 | 4 | 1 | 1 | 0 | 0 | 295 | 0 | 0 | 0 | 0 | 0 | 1 | +| haskell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 286 | 2 | +| html | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 131 | +| ini | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 1 | 145 | +| java | 0 | 0 | 347 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 2 | +| javascript | 0 | 1 | 0 | 271 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 10 | +| json | 0 | 370 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| julia | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 274 | +| kotlin | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 4 | 0 | 1 | 0 | 0 | 0 | 285 | +| lisp | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 177 | +| lua | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | +| markdown | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 273 | 0 | 0 | 0 | 3 | +| objectivec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 83 | +| ocaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 209 | +| perl | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 260 | +| php | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 280 | +| powershell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 286 | +| python | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 222 | +| r | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 8 | 0 | 0 | 0 | 208 | +| ruby | 12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 243 | +| rust | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 246 | +| scala | 0 | 0 | 0 | 0 | 0 | 325 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| shell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 209 | +| sql | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 175 | +| swift | 0 | 0 | 0 | 0 | 330 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | +| toml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 147 | +| typescript | 0 | 0 | 0 | 45 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 226 | +| vba | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 376 | +| verilog | 0 | 0 | 0 | 6 | 0 | 0 | 0 | 0 | 0 | 16 | 0 | 0 | 0 | 0 | 248 | +| xml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 196 | +| yaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 229 | ### 4-16KiB -| actual \ predicted | perl | c | javascript | objectivec | lisp | lua | rust | cmake | python | r | ocaml | asm | powershell | haskell | other | +| actual \ predicted | cpp | html | python | go | rust | erlang | verilog | lisp | dart | ocaml | julia | haskell | groovy | markdown | other | |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| -| asm | 1 | 8 | 0 | 2 | 1 | 0 | 0 | 0 | 0 | 11 | 0 | 875 | 2 | 0 | 16 | -| batch | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 3 | 0 | 260 | -| c | 1 | 1189 | 1 | 8 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 8 | 0 | 0 | 83 | -| clojure | 0 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 480 | -| cmake | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 960 | 0 | 1 | 0 | 1 | 0 | 0 | 6 | -| cobol | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 60 | -| cpp | 0 | 121 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 734 | -| cs | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 627 | -| css | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 703 | -| dart | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 689 | -| dockerfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 179 | -| elixir | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 183 | -| erlang | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 779 | -| gemspec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| go | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 705 | -| gradle | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 96 | -| groovy | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 260 | -| haskell | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 869 | 1 | -| html | 0 | 0 | 2 | 4 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 761 | -| ini | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 93 | -| java | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 644 | -| javascript | 0 | 0 | 1084 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 2 | 0 | 0 | 39 | -| json | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 245 | -| julia | 1 | 0 | 0 | 2 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 853 | -| kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 494 | -| lisp | 0 | 0 | 0 | 0 | 1046 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| lua | 0 | 1 | 3 | 0 | 0 | 1017 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 6 | -| markdown | 0 | 0 | 1 | 2 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 340 | -| objectivec | 3 | 14 | 1 | 1026 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 28 | -| ocaml | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 923 | 0 | 0 | 1 | 7 | -| perl | 1682 | 3 | 1 | 21 | 0 | 0 | 0 | 0 | 0 | 43 | 0 | 1 | 5 | 0 | 41 | -| php | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 763 | -| powershell | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 874 | 0 | 4 | -| python | 0 | 0 | 2 | 1 | 1 | 1 | 0 | 0 | 962 | 1 | 0 | 0 | 2 | 0 | 10 | -| r | 2 | 2 | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 881 | 0 | 1 | 2 | 0 | 3 | -| ruby | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 190 | -| rust | 0 | 1 | 1 | 0 | 0 | 0 | 1008 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 7 | -| scala | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 474 | -| shell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 5 | 0 | 248 | -| sql | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 3 | 0 | 589 | -| swift | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 603 | -| toml | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 73 | -| typescript | 0 | 0 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 423 | -| vba | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 759 | -| verilog | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 866 | -| xml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 485 | -| yaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 134 | +| asm | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 67 | +| batch | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 62 | +| c | 48 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 140 | +| clojure | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 161 | +| cmake | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 126 | +| cobol | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 88 | +| cpp | 221 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 30 | +| cs | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 153 | +| css | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 148 | +| dart | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 191 | 0 | 0 | 0 | 0 | 0 | 0 | +| dockerfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 119 | +| elixir | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 89 | +| erlang | 0 | 0 | 0 | 0 | 0 | 224 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| gemspec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 20 | +| go | 0 | 0 | 0 | 242 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| gradle | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | +| groovy | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 182 | 0 | 4 | +| haskell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 183 | 0 | 0 | 1 | +| html | 0 | 247 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 4 | +| ini | 0 | 0 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 47 | +| java | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 164 | +| javascript | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 149 | +| json | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 127 | +| julia | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 185 | 0 | 0 | 0 | 2 | +| kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 144 | +| lisp | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 194 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| lua | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 178 | +| markdown | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 174 | 1 | +| objectivec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 40 | +| ocaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 186 | 0 | 0 | 0 | 0 | 1 | +| perl | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 191 | +| php | 0 | 14 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 142 | +| powershell | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 168 | +| python | 0 | 0 | 237 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | +| r | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 150 | +| ruby | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 109 | +| rust | 0 | 0 | 0 | 0 | 227 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| scala | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 130 | +| shell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 86 | +| sql | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 107 | +| swift | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 175 | +| toml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 31 | +| typescript | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 109 | +| vba | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 178 | +| verilog | 7 | 0 | 0 | 0 | 1 | 0 | 207 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 7 | +| xml | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 130 | +| yaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 90 | ### 16-64KiB -| actual \ predicted | perl | c | lisp | asm | javascript | html | css | lua | powershell | sql | verilog | ocaml | vba | cpp | other | +| actual \ predicted | html | erlang | lisp | cpp | c | rust | ocaml | css | python | verilog | lua | xml | sql | perl | other | |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| -| asm | 1 | 1 | 0 | 385 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 7 | -| batch | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 134 | -| c | 0 | 442 | 0 | 3 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 30 | 6 | -| clojure | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 51 | -| cmake | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 164 | -| cobol | 0 | 0 | 0 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | -| cpp | 0 | 67 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 192 | 6 | -| cs | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 148 | -| css | 0 | 0 | 0 | 1 | 0 | 2 | 288 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | -| dart | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 121 | -| dockerfile | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| elixir | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 16 | -| erlang | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 170 | -| go | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 111 | -| gradle | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | -| groovy | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 46 | -| haskell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 106 | -| html | 1 | 0 | 0 | 0 | 0 | 272 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | -| ini | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 25 | -| java | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 117 | -| javascript | 0 | 0 | 0 | 0 | 328 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 22 | -| json | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 138 | -| julia | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 161 | -| kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 43 | -| lisp | 0 | 1 | 404 | 2 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -| lua | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 269 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | -| markdown | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 41 | -| objectivec | 0 | 10 | 0 | 1 | 0 | 2 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 6 | 180 | -| ocaml | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 240 | 0 | 0 | 3 | -| perl | 558 | 1 | 0 | 0 | 0 | 3 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 35 | -| php | 0 | 0 | 0 | 0 | 0 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 167 | -| powershell | 0 | 0 | 0 | 3 | 0 | 2 | 0 | 0 | 253 | 0 | 0 | 0 | 1 | 0 | 4 | -| python | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 190 | -| r | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 149 | -| ruby | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 30 | -| rust | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 212 | -| scala | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 41 | -| shell | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 29 | -| sql | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 256 | 0 | 0 | 1 | 0 | 1 | -| swift | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 68 | -| toml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 15 | -| typescript | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 119 | -| vba | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 241 | 0 | 1 | -| verilog | 0 | 2 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 248 | 2 | 0 | 0 | 3 | -| xml | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 192 | -| yaml | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 18 | +| asm | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 39 | +| batch | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | +| c | 0 | 0 | 0 | 11 | 84 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| clojure | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 45 | +| cmake | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 27 | +| cobol | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 15 | +| cpp | 0 | 0 | 0 | 91 | 14 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| cs | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 49 | +| css | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 79 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| dart | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 48 | +| elixir | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 25 | +| erlang | 0 | 128 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| go | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 54 | +| groovy | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 44 | +| haskell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 46 | +| html | 149 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| ini | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 14 | +| java | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 47 | +| javascript | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 41 | +| json | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 38 | +| julia | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 55 | +| kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 18 | +| lisp | 0 | 0 | 121 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| lua | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 67 | 0 | 0 | 0 | 1 | +| markdown | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 38 | +| objectivec | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 10 | +| ocaml | 0 | 0 | 0 | 0 | 0 | 0 | 87 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| perl | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 56 | 4 | +| php | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 24 | +| powershell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 47 | +| python | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 73 | 0 | 0 | 0 | 0 | 0 | 0 | +| r | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 37 | +| ruby | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 18 | +| rust | 0 | 0 | 0 | 0 | 0 | 95 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| scala | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 34 | +| shell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | +| sql | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 56 | 0 | 4 | +| swift | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 28 | +| toml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | +| typescript | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 31 | +| vba | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 34 | +| verilog | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 0 | 1 | 78 | 0 | 0 | 0 | 0 | 1 | +| xml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 64 | 0 | 0 | 0 | +| yaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 31 | ### >64KiB -| actual \ predicted | sql | javascript | asm | css | html | json | perl | xml | c | typescript | lisp | verilog | ocaml | lua | other | +| actual \ predicted | css | lisp | html | xml | erlang | c | rust | cpp | sql | ocaml | python | json | javascript | lua | other | |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| -| asm | 0 | 0 | 260 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 8 | -| batch | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | -| c | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 100 | 0 | 0 | 1 | 0 | 0 | 9 | -| clojure | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | -| cmake | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 35 | -| cobol | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | -| cpp | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 16 | 0 | 0 | 0 | 0 | 0 | 39 | -| cs | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 28 | -| css | 0 | 0 | 1 | 264 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| dart | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 20 | -| elixir | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | -| erlang | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | -| go | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 13 | -| groovy | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | -| haskell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | -| html | 0 | 1 | 2 | 0 | 219 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | -| ini | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 19 | -| java | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 14 | -| javascript | 0 | 267 | 0 | 2 | 0 | 6 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 3 | -| json | 0 | 1 | 0 | 0 | 0 | 183 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | -| julia | 0 | 0 | 0 | 0 | 0 | 15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 20 | +| asm | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | +| batch | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| c | 0 | 0 | 0 | 0 | 0 | 19 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| clojure | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | +| cmake | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | +| cobol | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| cpp | 0 | 0 | 0 | 0 | 0 | 4 | 0 | 21 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| cs | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| css | 69 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| dart | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 10 | +| elixir | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| erlang | 0 | 0 | 0 | 0 | 28 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| go | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | +| groovy | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | +| haskell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| html | 0 | 0 | 36 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| ini | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 12 | +| java | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | +| javascript | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 14 | 0 | 0 | +| json | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 16 | 0 | 0 | 1 | +| julia | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | | kotlin | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| lisp | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 108 | 0 | 0 | 0 | 1 | -| lua | 3 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 67 | 6 | -| markdown | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | -| objectivec | 0 | 2 | 0 | 0 | 4 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 25 | -| ocaml | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 69 | 0 | 6 | -| perl | 0 | 0 | 1 | 0 | 0 | 1 | 156 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 34 | -| php | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 24 | -| powershell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 51 | -| python | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 22 | -| r | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 14 | -| ruby | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| rust | 0 | 0 | 1 | 0 | 0 | 5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 35 | -| scala | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | -| shell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 11 | -| sql | 285 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 10 | -| swift | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | -| toml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | -| typescript | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | 114 | 0 | 2 | 0 | 0 | 3 | -| vba | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 59 | -| verilog | 0 | 0 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 77 | 0 | 0 | 3 | -| xml | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 150 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | -| yaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 14 | +| lisp | 0 | 39 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +| lua | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 11 | 0 | +| markdown | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| objectivec | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | +| ocaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 20 | 0 | 0 | 0 | 0 | 5 | +| perl | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | +| php | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | +| powershell | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 11 | +| python | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 16 | 0 | 0 | 0 | 0 | +| r | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | +| rust | 0 | 0 | 0 | 0 | 0 | 0 | 25 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| scala | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | +| sql | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 20 | 0 | 0 | 0 | 0 | 0 | 0 | +| swift | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | +| typescript | 0 | 0 | 0 | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | +| vba | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | +| verilog | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 9 | +| xml | 0 | 0 | 0 | 17 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| yaml | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | diff --git a/scripts/TRAINING.md b/scripts/TRAINING.md index f22eb5b..75d9c95 100644 --- a/scripts/TRAINING.md +++ b/scripts/TRAINING.md @@ -2,9 +2,19 @@ The model shipped in `assets/magika/source-student-q4.bin` is a 47,840-byte weights-only MSQ1 wordseq payload trained for the fixed 48-label production -head. It uses the v3 word-unit tokenizer and hits **0.965238 fs_accuracy** with -**0.965411 macro_recall** on the manifest-aligned held-out filesystem-label test -split. +head. It uses the v3 word-unit tokenizer. + +The original artifact was trained from scratch with the frozen recipe below on +the `bigorig` corpus and hit **0.965238 fs_accuracy** with **0.965411 +macro_recall** on the manifest-aligned held-out filesystem-label test split. +The shipped artifact is that model fine-tuned on a rebuilt public corpus with +one-vs-all distillation (plus self-distillation from a larger one-vs-all +parent) to fix the Markdown/YAML bare-list confusion and the manufactured +confidence on ambiguous inputs from issue #5 (see "Fine-tuning the shipped +model" below); on the rebuilt held-out split it scores **0.942353 +fs_accuracy**, **0.939690 macro_recall**, and **0.944055 teacher parity** +(versus 0.926160 / 0.929904 / 0.922111 for the pre-fine-tune artifact on the +same split). ## Files @@ -13,6 +23,11 @@ split. | `train_v2_student.py` | Standalone wrapper for the current fixed production recipe. | | `train_magika_qat_student.py` | QAT trainer and metadata-free MSQ1 exporter for the shipped `wordseq-b1024-k3-m2048-tiny-3conv-hidden` model. | | `train_magika_source_student.py` | Magika teacher loader, byte-window feature extraction, cache iteration helpers. Imported by the QAT trainer. | +| `build_finetune_corpus.py` | Rebuilds the fine-tuning corpus from The Stack, GitHub, and synthetic ambiguous Markdown/YAML samples. | +| `make_pruned48_config.py` | Generates the pruned 48-label teacher config from the `magika` pip package config. | +| `build_fs_labels.py` | Builds `{split}.fs_labels.mmap` (filesystem truth with teacher fallback) aligned to the cache. | +| `cache_self_distill.py` | Caches a parent student's per-class predictions as `{split}.self_probabilities.mmap` for self-distillation. | +| `hard_gen_*.py` | Teacher-vetted synthetic hard-boundary generators (kept for experiments; not sampled by the shipped recipe). | | `eval_50kb_model.py` | Loads an exported MSQ1 `.bin`, runs a forward pass, and reports accuracy on a chosen split. | | `confusion_by_size.py` | Evaluates an exported wordseq model, aligns cached rows to raw file sizes, and renders the README confusion-matrix images. | @@ -84,6 +99,155 @@ teacher distribution from a larger capacity student trained as an intermediate step. Skip it (drop `--self-loss-weight`) for a slightly weaker but simpler training; expect ~1 pp accuracy hit. +## Fine-tuning the shipped model + +The shipped artifact was produced by fine-tuning the original `bigorig` +checkpoint on a rebuilt public corpus. This recipe is fully reproducible on a +laptop CPU (the fine-tune itself takes ~20 minutes at ~2,000 examples/sec): + +1. **Teacher assets** — copy `model.onnx` from the `magika` pip package + (`magika/models/standard_v3_3/`) and generate the pruned config: + + ```bash + python3 scripts/make_pruned48_config.py \ + --output /tmp/magika-teacher/config.pruned48.min.json + ``` + +2. **Corpus** — `scripts/build_finetune_corpus.py` downloads per-language + samples from `bigcode/the-stack-smol-xl` (ungated) and `bigcode/the-stack` + (gated; your HF token must have accepted the dataset terms), harvests + Objective-C/Gradle/Gemfile files from GitHub repos, and generates a small + synthetic set of heading + single-word dash-list Markdown files plus YAML + keyed-sequence counterexamples for the issue #5 ambiguity. It also adds + train-only bare `- item` lists (no heading): the teacher's renormalized + target for those is genuinely split between YAML and Markdown, which + teaches the student to report uncertainty instead of a confident YAML + label. Files from one repository always land in the same split. + + ```bash + python3 scripts/build_finetune_corpus.py --output /tmp/betlang-finetune-corpus + ``` + +3. **Cache + labels** — build the teacher cache, unit ids, and fs labels: + + ```bash + python3 scripts/train_magika_qat_student.py \ + --dataset /tmp/betlang-finetune-corpus/files \ + --cache-dir /tmp/betlang-finetune-cache \ + --magika-model /tmp/magika-teacher/model.onnx \ + --magika-config /tmp/magika-teacher/config.pruned48.min.json \ + --output /tmp/out.bin \ + --architecture wordseq-b1024-k3-m2048-tiny-3conv-hidden \ + --unit-tokenizer 3 --prepare-cache-only + python3 scripts/build_fs_labels.py \ + --dataset /tmp/betlang-finetune-corpus/files \ + --cache-dir /tmp/betlang-finetune-cache + ``` + +4. **Parent for self-distillation** — train a ~2x larger student on the same + cache with the same one-vs-all targets, full-precision (QAT never enabled; + the metadata-free exporter only supports the production architecture, so + the best checkpoint is saved as raw weights instead), then cache its + per-class sigmoid marginals: + + ```bash + python3 scripts/train_magika_qat_student.py \ + --dataset /tmp/betlang-finetune-corpus/files \ + --cache-dir /tmp/betlang-finetune-cache \ + --magika-model /tmp/magika-teacher/model.onnx \ + --magika-config /tmp/magika-teacher/config.pruned48.min.json \ + --output /tmp/parent_unused.bin \ + --checkpoint-weights /tmp/parent_med.npz \ + --architecture wordseq-b1536-k3-m2048-med-3conv-hidden \ + --unit-tokenizer 3 --length-buckets \ + --min-teacher-head-mass 0.1 \ + --head-marginal-targets --soft-loss-mode bce \ + --mass-discounted-hard-labels \ + --init-from-checkpoint assets/magika/source-student-q4.bin \ + --epochs 18 --batch-size 128 \ + --learning-rate 4e-4 --cosine-decay --min-learning-rate-ratio 0.05 \ + --weight-bits 4 --qat-start-epoch 99 \ + --distill-temperature 1 --hard-loss-weight 0.5 \ + --label-smoothing 0.05 --cutmix-prob 0.5 \ + --early-stop-patience 18 --eval-every 1 --seed 2 + python3 scripts/cache_self_distill.py \ + --checkpoint /tmp/parent_med.npz \ + --architecture wordseq-b1536-k3-m2048-med-3conv-hidden \ + --cache-dir /tmp/betlang-finetune-cache --output-mode sigmoid + ``` + + The parent initializes from the exported tiny checkpoint (smaller tensors + are tiled up to the wider shapes) and reached 0.9492 test teacher parity. + +5. **Fine-tune** — start from the exported checkpoint with QAT active from + epoch 0 (the ternary/int4 fake-quant is idempotent on exported weights, so + training starts numerically identical to the shipped model). `--eval-initial` + makes the initial checkpoint the export bar, so the output only changes if + validation teacher parity improves: + + ```bash + python3 scripts/train_magika_qat_student.py \ + --dataset /tmp/betlang-finetune-corpus/files \ + --cache-dir /tmp/betlang-finetune-cache \ + --magika-model /tmp/magika-teacher/model.onnx \ + --magika-config /tmp/magika-teacher/config.pruned48.min.json \ + --output assets/magika/source-student-q4.bin \ + --architecture wordseq-b1024-k3-m2048-tiny-3conv-hidden \ + --unit-tokenizer 3 --length-buckets \ + --min-teacher-head-mass 0.1 \ + --head-marginal-targets --soft-loss-mode bce \ + --mass-discounted-hard-labels \ + --self-probabilities /tmp/betlang-finetune-cache --self-loss-weight 0.5 \ + --init-from-checkpoint assets/magika/source-student-q4.bin \ + --eval-initial \ + --epochs 24 --batch-size 128 \ + --learning-rate 2e-4 --cosine-decay --min-learning-rate-ratio 0.05 \ + --weight-bits 4 --qat-start-epoch 0 \ + --distill-temperature 1 --hard-loss-weight 0.3 \ + --label-smoothing 0.05 --cutmix-prob 0.5 \ + --early-stop-patience 24 --eval-every 1 --seed 2 + ``` + + The hard-loss weight drops from the frozen recipe's 0.5 to 0.3: with the + longer schedule and the parent's second soft term, a 0.5 hard term + re-sharpens exactly the ambiguous rows whose uncertainty the one-vs-all + targets are meant to preserve (and drags nearby boundaries like ini/toml). + A/B runs: hard 0.5 at 24 epochs reached the same parity but pushed the + bare-list median top-1 back up to 0.71; hard 0.3 keeps it at 0.51. + + Schedule notes from A/B runs on this fine-tune: FP-then-QAT (the frozen + recipe's 45/60 split) does not survive a short schedule — an FP phase + reaches ~0.952 valid parity but re-quantization at epoch 12/20 drops it to + ~0.930 and the cosine tail cannot recover, so short fine-tunes keep QAT + active from epoch 0. + + The target scheme differs from the frozen from-scratch recipe. The Magika + teacher predicts over 214 labels, and the original cache renormalized its + probabilities over the 48 exported labels — which manufactures confident + targets for inputs the teacher mostly places outside the head (a bare + `- item` list is mostly `txt` to the teacher, and renormalization turned + that into `yaml` at 0.9+). Instead: + + - `--head-marginal-targets` caches the teacher's raw per-class marginals + (rows sum to the in-head mass, <= 1). + - `--soft-loss-mode bce` distills them one-vs-all with per-class sigmoid + cross-entropy, which does not require normalized targets, so + out-of-scope mass simply lowers every class target (cf. "Revisiting + One-vs-All Classifiers for Predictive Uncertainty and OOD Detection", + Padhy et al. 2020). Temperature is unused in this mode. + - `--mass-discounted-hard-labels` scales the hard argmax target by the + in-head mass so it cannot re-sharpen rows the teacher is unsure about. + - `--min-teacher-head-mass 0.1` drops rows that are almost entirely + out-of-scope, whose in-head argmax is noise. + + The runtime is unchanged: its softmax over the 48 logits maps the + BCE-trained per-class log-odds to a near-uniform distribution when every + class is unlikely, and to a confident one when a single class dominates. + + The original self-distillation probabilities from the `bigorig` recipe are + tied to that corpus's cache rows, so the fine-tune trains its own parent + (step 4) instead of reusing them. + ## Verifying the trained model ```bash @@ -94,9 +258,10 @@ python3 scripts/eval_50kb_model.py \ --split test ``` -Expected output: +Expected output for the shipped artifact on the rebuilt fine-tune cache: ``` -test_fs_accuracy=0.965238 +test_teacher_parity=0.944055 +test_fs_accuracy=0.942353 ``` `test_fs_accuracy` is fraction matching `fs_labels.mmap` diff --git a/scripts/build_finetune_corpus.py b/scripts/build_finetune_corpus.py new file mode 100644 index 0000000..8ae9efe --- /dev/null +++ b/scripts/build_finetune_corpus.py @@ -0,0 +1,626 @@ +#!/usr/bin/env python3 +"""Build a fine-tuning corpus for the betlang wordseq student. + +The original `bigorig` corpus (GitHub partial-clone blob index, guesslang-style +repository selection) is not redistributable and no longer exists locally, so +this script rebuilds a corpus with the same layout — `files/{train,valid,test}/ +{label}/...` — from public sources: + +1. `bigcode/the-stack-smol-xl` (ungated) for most programming languages. +2. `bigcode/the-stack` (gated; needs an HF token with accepted terms) for the + config/data formats missing from smol-xl: yaml, json, toml, ini, xml, + swift, cobol, plus extra ruby rows filtered for Gemfile/gemspec. +3. GitHub repo tarballs for objectivec (.m) and gradle (.gradle), which have + no per-language subset in The Stack. +4. A small synthetic set targeting the Markdown/YAML ambiguity from issue #5: + heading + single-word dash-list Markdown files, and YAML keyed-sequence + counterexamples. Teacher probabilities are still assigned by the Magika + teacher when the training cache is built, so these only steer coverage. + +Files from one repository always land in the same split (80/10/10 by repo-name +hash), mirroring the guesslang rule that train/valid/test repositories are +disjoint. + +Usage: + python3 scripts/build_finetune_corpus.py --output /tmp/betlang-finetune-corpus +""" + +from __future__ import annotations + +import argparse +import hashlib +import io +import json +import os +import random +import sys +import tarfile +import urllib.request +from collections import defaultdict +from pathlib import Path + +SMOL_XL = "bigcode/the-stack-smol-xl" +THE_STACK = "bigcode/the-stack" + +# smol-xl language directory -> betlang label. +SMOL_XL_LANGS = { + "assembly": "asm", + "batchfile": "batch", + "c": "c", + "c++": "cpp", + "c-sharp": "cs", + "clojure": "clojure", + "cmake": "cmake", + "common-lisp": "lisp", + "css": "css", + "dart": "dart", + "dockerfile": "dockerfile", + "elixir": "elixir", + "erlang": "erlang", + "go": "go", + "groovy": "groovy", + "haskell": "haskell", + "html": "html", + "java": "java", + "javascript": "javascript", + "julia": "julia", + "kotlin": "kotlin", + "lua": "lua", + "markdown": "markdown", + "ocaml": "ocaml", + "perl": "perl", + "php": "php", + "powershell": "powershell", + "python": "python", + "r": "r", + "ruby": "ruby", + "rust": "rust", + "scala": "scala", + "shell": "shell", + "sql": "sql", + "systemverilog": "verilog", + "typescript": "typescript", + "verilog": "verilog", + "visual-basic": "vba", +} + +# the-stack language directory -> betlang label (first shard only). +STACK_LANGS = { + "yaml": "yaml", + "json": "json", + "toml": "toml", + "ini": "ini", + "xml": "xml", + "swift": "swift", + "cobol": "cobol", +} + +# GitHub tarballs: label -> (repos, extensions). Repos are chosen so that the +# repo-name hash spreads each label across all three splits. +GITHUB_SOURCES = { + "objectivec": ( + [ + "AFNetworking/AFNetworking", + "SDWebImage/SDWebImage", + "CocoaLumberjack/CocoaLumberjack", + "jdg/MBProgressHUD", + "ibireme/YYKit", + "gnustep/libs-base", + "facebookarchive/three20", + "facebookarchive/AsyncDisplayKit", + "BradLarson/GPUImage", + "ccgus/fmdb", + "Mantle/Mantle", + "magicalpanda/MagicalRecord", + "robbiehanson/CocoaAsyncSocket", + "TTTAttributedLabel/TTTAttributedLabel", + "jessesquires/JSQMessagesViewController", + ], + (".m",), + ), + "gradle": ( + [ + "gradle/gradle", + "android/architecture-samples", + "android/compose-samples", + "spring-projects/spring-boot", + "spring-projects/spring-framework", + "micronaut-projects/micronaut-core", + "spockframework/spock", + "nebula-plugins/gradle-lint-plugin", + ], + (".gradle",), + ), +} + +# Single raw-file fetches: label -> (repos, path inside the repo). +RAW_FILE_SOURCES = { + "gemfile": ( + [ + "rails/rails", "jekyll/jekyll", "fastlane/fastlane", "rubocop/rubocop", + "sinatra/sinatra", "rack/rack", "sidekiq/sidekiq", "heartcombo/devise", + "kaminari/kaminari", "activeadmin/activeadmin", "ruby-grape/grape", + "pry/pry", "capistrano/capistrano", "lostisland/faraday", + "octokit/octokit.rb", "teamcapybara/capybara", "sparklemotion/nokogiri", + "varvet/pundit", "doorkeeper-gem/doorkeeper", "drapergem/draper", + "slim-template/slim", "haml/haml", "middleman/middleman", "ruby/rake", + "rubygems/rubygems", "puma/puma", "resque/resque", + "mperham/connection_pool", "thoughtbot/factory_bot", + "carrierwaveuploader/carrierwave", "omniauth/omniauth", + "rspec/rspec-core", "rspec/rspec-rails", "ankane/searchkick", + ], + "Gemfile", + ), +} + +TRAIN_CAP = 3000 +VALID_CAP = 375 +TEST_CAP = 750 +SPLIT_CAPS = {"train": TRAIN_CAP, "valid": VALID_CAP, "test": TEST_CAP} +MIN_BYTES = 8 +MAX_BYTES = 256 * 1024 + +SYNTHETIC_MARKDOWN = {"train": 2000, "valid": 250, "test": 500} +SYNTHETIC_YAML = {"train": 800, "valid": 100, "test": 200} +SYNTHETIC_GEMFILE = {"train": 800, "valid": 100, "test": 200} +# Bare `- item` lists with no heading are valid Markdown and valid YAML; the +# teacher is genuinely split (yaml ~0.6 / markdown ~0.2 after renormalizing to +# the 48-label head), so these rows teach the student *uncertainty* rather +# than a label. Train-only so the valid/test metrics keep measuring +# unambiguous files. Bare `*` lists are excluded: the teacher keeps ~2% of its +# mass in the head there and the renormalized targets are junk. +SYNTHETIC_BARE_LIST = {"train": 1500} + +# Synthetic hard-boundary variants for the student-error clusters seen in the +# confusion matrix. Generators live in the hard_gen_* modules (c<->cpp, +# javascript<->typescript, ini, tsx-markup, systemverilog) and are vetted +# against the teacher: the Magika teacher labels these samples as intended +# while the pre-fine-tune student errs on up to 58% of them. Train-only: +# (module, function, label, extension, count). +# +# The list is intentionally empty for the shipped recipe. Three A/B +# fine-tunes showed that at this model capacity (~50 KB) every hard-pair mix +# that meaningfully moved its target confusion cells paid for it elsewhere: +# - c/cpp + javascript/typescript sets only relocated errors inside those +# genuinely arbitrary boundaries (every JS program is valid TS; +# C-compatible sources are valid C++) and cost ~0.4 pp fs accuracy. +# - The INI set (setup.cfg/editorconfig-flavored styles) shifted the +# ini/toml boundary enough to misread real TOML as INI (+30 errors). +# - The tsx/verilog set alone produced no reliable gain over run-to-run +# seed variance (target cells move by +/-10 counts between seeds). +# The generators are kept for future experiments with larger heads or +# per-pair loss weighting. +SYNTHETIC_HARD_PAIRS: list[tuple[str, str, str, str, int]] = [] + +NAMES = ( + "Alice Bob Carol Dave Erin Frank Grace Heidi Ivan Judy Mallory Oscar " + "Peggy Trent Victor Wendy London Paris Tokyo Berlin Madrid Rome Oslo " + "Monday Tuesday Wednesday Thursday Friday Saturday Sunday January " + "February March April June July August September October November " + "December Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune" +).split() + +GEM_NAMES = ( + "rails rake rspec minitest puma pg sqlite3 redis sidekiq devise pundit " + "kaminari nokogiri faraday webmock vcr rubocop pry byebug debug bootsnap " + "jbuilder turbo-rails stimulus-rails importmap-rails sassc-rails " + "capybara selenium-webdriver factory_bot_rails simplecov yard rdoc " + "activerecord activesupport actionpack sinatra rack thin unicorn " + "aws-sdk-s3 stripe httparty rest-client oj json multi_json dotenv" +).split() + +WORDS = ( + "first second third fourth fifth alpha beta gamma delta epsilon apples " + "bananas carrots oranges grapes monday tuesday wednesday thursday friday " + "setup install configure build deploy test release docs cleanup refactor " + "todo done pending blocked review draft merged closed open backlog " + "red green blue yellow purple orange black white silver golden " + "alice bob carol dave erin frank grace heidi ivan judy " + "parser lexer tokenizer compiler linker runtime kernel driver daemon " + "notes ideas goals tasks items steps points topics sections examples" +).split() + +EXT_FOR_LABEL = { + "asm": ".s", "batch": ".bat", "c": ".c", "clojure": ".clj", "cmake": ".cmake", + "cobol": ".cob", "cpp": ".cpp", "cs": ".cs", "css": ".css", "dart": ".dart", + "dockerfile": ".dockerfile", "elixir": ".ex", "erlang": ".erl", + "gemfile": "", "gemspec": ".gemspec", "go": ".go", "gradle": ".gradle", + "groovy": ".groovy", "haskell": ".hs", "html": ".html", "ini": ".ini", + "java": ".java", "javascript": ".js", "json": ".json", "julia": ".jl", + "kotlin": ".kt", "lisp": ".lisp", "lua": ".lua", "markdown": ".md", + "objectivec": ".m", "ocaml": ".ml", "perl": ".pl", "php": ".php", + "powershell": ".ps1", "python": ".py", "r": ".r", "ruby": ".rb", + "rust": ".rs", "scala": ".scala", "shell": ".sh", "sql": ".sql", + "swift": ".swift", "toml": ".toml", "typescript": ".ts", "vba": ".vb", + "verilog": ".v", "xml": ".xml", "yaml": ".yaml", +} + + +def read_hf_token(explicit: str | None) -> str: + if explicit: + return explicit + env = os.environ.get("HF_TOKEN") + if env: + return env + token_path = Path.home() / ".cache" / "huggingface" / "token" + if token_path.exists(): + return token_path.read_text().strip() + raise SystemExit("no HF token: pass --hf-token, set HF_TOKEN, or run `hf auth login`") + + +def split_for_repo(repo: str) -> str: + bucket = int.from_bytes(hashlib.md5(repo.encode()).digest()[:4], "little") % 10 + if bucket < 8: + return "train" + if bucket == 8: + return "valid" + return "test" + + +class CorpusWriter: + def __init__(self, root: Path): + self.root = root + self.seen: set[bytes] = set() + self.counts: dict[tuple[str, str], int] = defaultdict(int) + + def full(self, label: str, caps: dict[str, int] | None = None) -> bool: + caps = caps or SPLIT_CAPS + return all(self.counts[(split, label)] >= cap for split, cap in caps.items()) + + def add( + self, + label: str, + split: str, + content: bytes, + ext: str, + caps: dict[str, int] | None = None, + ) -> bool: + caps = caps or SPLIT_CAPS + if not (MIN_BYTES <= len(content) <= MAX_BYTES): + return False + if len(content.lstrip()) < MIN_BYTES: + return False + if self.counts[(split, label)] >= caps[split]: + return False + digest = hashlib.sha1(content).digest() + if digest in self.seen: + return False + self.seen.add(digest) + index = self.counts[(split, label)] + directory = self.root / split / label + directory.mkdir(parents=True, exist_ok=True) + (directory / f"{index:06d}{ext}").write_bytes(content) + self.counts[(split, label)] += 1 + return True + + def summary(self) -> str: + labels = sorted({label for _, label in self.counts}) + lines = [f"{'label':<12} {'train':>6} {'valid':>6} {'test':>6}"] + for label in labels: + lines.append( + f"{label:<12} {self.counts[('train', label)]:>6} " + f"{self.counts[('valid', label)]:>6} {self.counts[('test', label)]:>6}" + ) + return "\n".join(lines) + + +def hf_download(repo: str, filename: str, token: str, dest: Path) -> Path: + from huggingface_hub import hf_hub_download + + path = hf_hub_download( + repo_id=repo, + filename=filename, + repo_type="dataset", + token=token, + local_dir=dest.parent / "hf", + ) + return Path(path) + + +def iter_jsonl(path: Path): + with path.open("r", encoding="utf-8") as file: + for line in file: + line = line.strip() + if line: + yield json.loads(line) + + +def harvest_smol_xl(writer: CorpusWriter, token: str, scratch: Path, rng: random.Random) -> None: + for lang, label in SMOL_XL_LANGS.items(): + marker = scratch / f"smolxl.{lang}.done" + if marker.exists(): + print(f"smol-xl {lang}: already harvested", flush=True) + continue + print(f"smol-xl {lang} -> {label}: downloading", flush=True) + data = hf_download(SMOL_XL, f"data/{lang}/data.json", token, scratch / f"{lang}.json") + rows = list(iter_jsonl(data)) + rng.shuffle(rows) + added = 0 + for row in rows: + repo = row.get("max_stars_repo_name") or row["hexsha"] + path = row.get("max_stars_repo_path") or "" + content = row["content"].encode("utf-8", errors="replace") + split = split_for_repo(repo) + row_label = label + base = os.path.basename(path) + if label == "ruby": + if base == "Gemfile": + row_label = "gemfile" + elif base.endswith(".gemspec"): + row_label = "gemspec" + ext = EXT_FOR_LABEL[row_label] + if writer.add(row_label, split, content, ext): + added += 1 + print(f"smol-xl {lang} -> {label}: added {added}", flush=True) + data.unlink() + marker.write_text("done\n") + + +def harvest_stack(writer: CorpusWriter, token: str, scratch: Path, rng: random.Random) -> None: + import pyarrow.parquet as pq + + stack_langs = dict(STACK_LANGS) + stack_langs["ruby"] = "ruby" # extra pass filtered to Gemfile/gemspec rows + for lang, label in stack_langs.items(): + marker = scratch / f"stack.{lang}.done" + if marker.exists(): + print(f"the-stack {lang}: already harvested", flush=True) + continue + listing = json.loads( + urllib.request.urlopen( + urllib.request.Request( + f"https://huggingface.co/api/datasets/{THE_STACK}/tree/main/data/{lang}", + headers={"Authorization": f"Bearer {token}"}, + ) + ).read() + ) + shards = sorted(item["path"] for item in listing if item["path"].endswith(".parquet")) + if not shards: + raise SystemExit(f"the-stack {lang}: no parquet shards found") + print(f"the-stack {lang} -> {label}: downloading {shards[0]}", flush=True) + shard = hf_download(THE_STACK, shards[0], token, scratch / f"{lang}.parquet") + table = pq.read_table( + shard, + columns=["content", "max_stars_repo_name", "max_stars_repo_path"], + ) + rows = list(range(table.num_rows)) + rng.shuffle(rows) + contents = table.column("content") + repos = table.column("max_stars_repo_name") + paths = table.column("max_stars_repo_path") + added = 0 + for i in rows: + repo = repos[i].as_py() or f"row{i}" + path = paths[i].as_py() or "" + base = os.path.basename(path) + if lang == "ruby": + if base == "Gemfile": + row_label = "gemfile" + elif base.endswith(".gemspec"): + row_label = "gemspec" + else: + continue + else: + row_label = label + content = contents[i].as_py().encode("utf-8", errors="replace") + split = split_for_repo(repo) + if writer.add(row_label, split, content, EXT_FOR_LABEL[row_label]): + added += 1 + if lang != "ruby" and writer.full(label): + break + print(f"the-stack {lang} -> {label}: added {added}", flush=True) + shard.unlink() + marker.write_text("done\n") + + +def harvest_github(writer: CorpusWriter, scratch: Path) -> None: + for label, (repos, extensions) in GITHUB_SOURCES.items(): + for repo in repos: + marker = scratch / f"github.{repo.replace('/', '__')}.done" + if marker.exists(): + print(f"github {repo}: already harvested", flush=True) + continue + split = split_for_repo(repo) + url = f"https://codeload.github.com/{repo}/tar.gz/HEAD" + print(f"github {repo} -> {label} ({split}): downloading", flush=True) + added = 0 + with urllib.request.urlopen(url) as response: + stream = io.BufferedReader(response, buffer_size=1 << 20) + with tarfile.open(fileobj=stream, mode="r|gz") as tar: + for member in tar: + if not member.isfile() or member.size > MAX_BYTES: + continue + if not member.name.endswith(extensions): + continue + extracted = tar.extractfile(member) + if extracted is None: + continue + content = extracted.read() + ext = EXT_FOR_LABEL[label] + if writer.add(label, split, content, ext): + added += 1 + print(f"github {repo} -> {label}: added {added}", flush=True) + marker.write_text("done\n") + + +def harvest_raw_files(writer: CorpusWriter, scratch: Path) -> None: + for label, (repos, filename) in RAW_FILE_SOURCES.items(): + for repo in repos: + marker = scratch / f"raw.{repo.replace('/', '__')}.done" + if marker.exists(): + continue + split = split_for_repo(repo) + url = f"https://raw.githubusercontent.com/{repo}/HEAD/{filename}" + try: + with urllib.request.urlopen(url) as response: + content = response.read() + except urllib.error.HTTPError as error: + print(f"raw {repo}/{filename}: {error.code}", flush=True) + marker.write_text("error\n") + continue + added = writer.add(label, split, content, EXT_FOR_LABEL[label]) + print(f"raw {repo}/{filename} -> {label} ({split}): added {int(added)}", flush=True) + marker.write_text("done\n") + + +def synth_gemfile(rng: random.Random) -> bytes: + lines = ['source "https://rubygems.org"'] + if rng.random() < 0.3: + lines.append("") + lines.append("gemspec") + lines.append("") + for _ in range(rng.randint(2, 8)): + gem = rng.choice(GEM_NAMES) + version = rng.random() + if version < 0.4: + lines.append(f'gem "{gem}"') + elif version < 0.7: + major, minor = rng.randint(0, 7), rng.randint(0, 12) + lines.append(f'gem "{gem}", "~> {major}.{minor}"') + else: + lines.append(f'gem "{gem}", ">= {rng.randint(1, 5)}.0"') + if rng.random() < 0.6: + group = rng.choice([":development", ":test", ":development, :test"]) + lines.append("") + lines.append(f"group {group} do") + for _ in range(rng.randint(1, 3)): + lines.append(f' gem "{rng.choice(GEM_NAMES)}"') + lines.append("end") + return ("\n".join(lines) + "\n").encode() + + +def synth_markdown(rng: random.Random) -> bytes: + lines: list[str] = [] + heading_level = rng.choice(["#", "#", "#", "##"]) + words = rng.sample(WORDS, k=rng.randint(1, 3)) + if rng.random() < 0.85: + lines.append(f"{heading_level} {' '.join(w.capitalize() for w in words)}") + lines.append("") + bullet = rng.choice(["-", "-", "-", "-", "*", "+"]) + style = rng.choice(["lower", "lower", "capital", "title", "title", "names"]) + for _ in range(rng.randint(3, 10)): + if style == "names": + item = " ".join(rng.sample(NAMES, k=1 if rng.random() < 0.8 else 2)) + else: + item_words = rng.sample(WORDS, k=rng.randint(1, 2) if rng.random() < 0.8 else 3) + item = " ".join(item_words) + if style == "capital": + item = item.capitalize() + elif style == "title": + item = item.title() + lines.append(f"{bullet} {item}") + if rng.random() < 0.25: + lines.append("") + lines.append(f"## {rng.choice(WORDS).capitalize()}") + lines.append("") + for _ in range(rng.randint(2, 5)): + lines.append(f"{bullet} {rng.choice(WORDS)}") + return ("\n".join(lines) + ("\n" if rng.random() < 0.5 else "")).encode() + + +def synth_bare_list(rng: random.Random) -> bytes: + style = rng.choice(["lower", "lower", "names", "capital", "two-word"]) + lines = [] + for _ in range(rng.randint(3, 10)): + if style == "names": + item = rng.choice(NAMES) + elif style == "capital": + item = rng.choice(WORDS).capitalize() + elif style == "two-word": + item = f"{rng.choice(WORDS)} {rng.choice(WORDS)}" + else: + item = rng.choice(WORDS) + lines.append(f"- {item}") + return ("\n".join(lines) + ("\n" if rng.random() < 0.5 else "")).encode() + + +def synth_yaml(rng: random.Random) -> bytes: + lines: list[str] = [] + if rng.random() < 0.6: + lines.append(f"# {' '.join(rng.sample(WORDS, k=rng.randint(1, 3)))}") + key = rng.choice(["items", "steps", "names", "packages", "tags", "jobs", "hosts"]) + lines.append(f"{key}:") + indent = rng.choice(["", " "]) + for _ in range(rng.randint(3, 8)): + lines.append(f"{indent}- {rng.choice(WORDS)}") + if rng.random() < 0.5: + other = rng.choice(["enabled", "count", "version", "name", "region"]) + value = rng.choice(["true", "false", "3", "1.2.0", "us-east-1", rng.choice(WORDS)]) + lines.append(f"{other}: {value}") + return ("\n".join(lines) + "\n").encode() + + +def synth_fill(writer: CorpusWriter, label: str, split: str, count: int, ext: str, generator, caps) -> int: + added = 0 + for _ in range(count * 100): + if added >= count or writer.counts[(split, label)] >= caps[split]: + break + if writer.add(label, split, generator(), ext, caps=caps): + added += 1 + return added + + +def harvest_hard_pairs(writer: CorpusWriter, rng: random.Random) -> None: + import importlib + + for module_name, fn_name, label, ext, count in SYNTHETIC_HARD_PAIRS: + generator = getattr(importlib.import_module(module_name), fn_name) + caps = {**SPLIT_CAPS, "train": TRAIN_CAP + 20000} + added = synth_fill(writer, label, "train", count, ext, lambda gen=generator: gen(rng), caps) + print(f"hard pairs {fn_name} -> {label}: added {added}", flush=True) + + +def harvest_synthetic(writer: CorpusWriter, rng: random.Random) -> None: + for split, count in SYNTHETIC_MARKDOWN.items(): + caps = {**SPLIT_CAPS, split: SPLIT_CAPS[split] + count + SYNTHETIC_BARE_LIST.get(split, 0)} + synth_fill(writer, "markdown", split, count, ".md", lambda: synth_markdown(rng), caps) + for split, count in SYNTHETIC_BARE_LIST.items(): + caps = {**SPLIT_CAPS, split: SPLIT_CAPS[split] + count + SYNTHETIC_MARKDOWN.get(split, 0)} + synth_fill(writer, "markdown", split, count, ".md", lambda: synth_bare_list(rng), caps) + for split, count in SYNTHETIC_YAML.items(): + caps = {**SPLIT_CAPS, split: SPLIT_CAPS[split] + count} + synth_fill(writer, "yaml", split, count, ".yaml", lambda: synth_yaml(rng), caps) + for split, count in SYNTHETIC_GEMFILE.items(): + synth_fill(writer, "gemfile", split, count, "", lambda: synth_gemfile(rng), SPLIT_CAPS) + print("synthetic markdown/yaml/gemfile: added", flush=True) + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--hf-token", default=None) + parser.add_argument("--seed", type=int, default=2) + args = parser.parse_args() + + token = read_hf_token(args.hf_token) + rng = random.Random(args.seed) + files_root = args.output / "files" + scratch = args.output / "scratch" + scratch.mkdir(parents=True, exist_ok=True) + writer = CorpusWriter(files_root) + + # Rebuild dedup/counters from any files already on disk (resume support). + for split_dir in files_root.glob("*/"): + for label_dir in split_dir.glob("*/"): + for file in label_dir.iterdir(): + writer.seen.add(hashlib.sha1(file.read_bytes()).digest()) + writer.counts[(split_dir.name, label_dir.name)] += 1 + + harvest_smol_xl(writer, token, scratch, rng) + harvest_stack(writer, token, scratch, rng) + harvest_github(writer, scratch) + harvest_raw_files(writer, scratch) + if not (scratch / "synthetic.done").exists(): + harvest_synthetic(writer, rng) + (scratch / "synthetic.done").write_text("done\n") + if not (scratch / "synthetic_hard_pairs.done").exists(): + harvest_hard_pairs(writer, rng) + (scratch / "synthetic_hard_pairs.done").write_text("done\n") + + print(writer.summary()) + (args.output / "corpus_summary.txt").write_text(writer.summary() + "\n") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/build_fs_labels.py b/scripts/build_fs_labels.py new file mode 100644 index 0000000..6f4b464 --- /dev/null +++ b/scripts/build_fs_labels.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 +"""Build {split}.fs_labels.mmap files for a corpus + teacher cache. + +The fs label for each cached row is the "filesystem truth": the label implied +by where the file lives on disk, with teacher fallback when no mapping exists. +Rows are aligned to the cache by walking the corpus in the same order as the +cache builder and matching each file's Magika byte window against +{split}.tokens.mmap, so files the cache builder dropped are skipped here too. + +Label resolution order per file: +1. Parent directory name, when it is one of the cache labels (corpora built by + scripts/build_finetune_corpus.py place files under files/{split}/{label}/). +2. Extension/filename mapping (see EXTENSION_LABELS / FILENAME_LABELS). +3. Teacher argmax from {split}.labels.mmap (counted as ext_unmapped). + +Usage: + python3 scripts/build_fs_labels.py \ + --dataset /path/to/corpus/files --cache-dir /path/to/cache +""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path + +import numpy as np + +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from train_magika_source_student import ( # noqa: E402 + SPLITS, + magika_features, + read_training_windows, + source_paths, +) + +TOKEN_LENGTH = 2048 + +FILENAME_LABELS = { + "Gemfile": "gemfile", + "Dockerfile": "dockerfile", + "Containerfile": "dockerfile", + "CMakeLists.txt": "cmake", +} + +EXTENSION_LABELS = { + "asm": "asm", "s": "asm", + "bat": "batch", "cmd": "batch", + "c": "c", + "clj": "clojure", "cljs": "clojure", "cljc": "clojure", + "cmake": "cmake", + "cob": "cobol", "cbl": "cobol", "cpy": "cobol", + "cpp": "cpp", "cc": "cpp", "cxx": "cpp", "hpp": "cpp", "hh": "cpp", "hxx": "cpp", + "cs": "cs", + "css": "css", + "dart": "dart", + "dockerfile": "dockerfile", + "ex": "elixir", "exs": "elixir", + "erl": "erlang", "hrl": "erlang", + "gemspec": "gemspec", + "go": "go", + "gradle": "gradle", + "groovy": "groovy", "gvy": "groovy", + "hs": "haskell", "lhs": "haskell", + "html": "html", "htm": "html", "xhtml": "html", + "ini": "ini", "cfg": "ini", + "java": "java", + "js": "javascript", "mjs": "javascript", "cjs": "javascript", "jsx": "javascript", + "json": "json", + "jl": "julia", + "kt": "kotlin", "kts": "kotlin", + "lisp": "lisp", "lsp": "lisp", "cl": "lisp", + "lua": "lua", + "md": "markdown", "markdown": "markdown", "mdx": "markdown", + "m": "objectivec", "mm": "objectivec", + "ml": "ocaml", "mli": "ocaml", + "pl": "perl", "pm": "perl", + "php": "php", "phtml": "php", + "ps1": "powershell", "psm1": "powershell", "psd1": "powershell", + "py": "python", "pyi": "python", "pyw": "python", + "r": "r", + "rb": "ruby", "rake": "ruby", + "rs": "rust", + "scala": "scala", "sbt": "scala", + "sh": "shell", "bash": "shell", "zsh": "shell", "ksh": "shell", + "sql": "sql", + "swift": "swift", + "toml": "toml", + "ts": "typescript", "tsx": "typescript", "mts": "typescript", "cts": "typescript", + "vb": "vba", "vbs": "vba", + "v": "verilog", "sv": "verilog", "svh": "verilog", + "xml": "xml", "xsd": "xml", "xsl": "xml", "xslt": "xml", "svg": "xml", + "yaml": "yaml", "yml": "yaml", +} + + +def fs_label_for(path: Path, label_to_index: dict[str, int]) -> int | None: + parent = path.parent.name + if parent in label_to_index: + return label_to_index[parent] + name = path.name + if name in FILENAME_LABELS: + return label_to_index.get(FILENAME_LABELS[name]) + extension = path.suffix.lstrip(".").lower() + label = EXTENSION_LABELS.get(extension) + if label is None: + return None + return label_to_index.get(label) + + +def build_split(dataset: Path, cache_dir: Path, split: str) -> None: + meta = json.loads((cache_dir / f"{split}.json").read_text()) + n = int(meta["count"]) + labels = [str(label) for label in meta["labels"]] + label_to_index = {label: index for index, label in enumerate(labels)} + + tokens = np.memmap(cache_dir / f"{split}.tokens.mmap", dtype=np.uint16, mode="r", shape=(n, TOKEN_LENGTH)) + teacher_labels = np.memmap(cache_dir / f"{split}.labels.mmap", dtype=np.int64, mode="r", shape=(n,)) + fs_labels = np.full(n, -1, dtype=np.int64) + + row = 0 + mapped = 0 + unmapped = 0 + dropped = 0 + for path in source_paths(dataset / split, None): + windows = read_training_windows(path) + if windows is None: + continue + size, prefix, suffix = windows + features = magika_features(size, prefix, suffix) + if features is None: + continue + if row >= n: + raise SystemExit(f"{split}: more corpus windows than cache rows; wrong --dataset?") + if not np.array_equal(np.asarray(features, dtype=np.uint16), tokens[row]): + dropped += 1 + continue + label_index = fs_label_for(path, label_to_index) + if label_index is None: + fs_labels[row] = int(teacher_labels[row]) + unmapped += 1 + else: + fs_labels[row] = label_index + mapped += 1 + row += 1 + + if row != n: + raise SystemExit(f"{split}: aligned {row} rows but cache has {n}; wrong --dataset?") + + out = np.memmap(cache_dir / f"{split}.fs_labels.mmap", dtype=np.int64, mode="w+", shape=(n,)) + out[:] = fs_labels + out.flush() + stats = { + "count": n, + "ext_mapped": mapped, + "ext_unmapped": unmapped, + "cache_dropped_files": dropped, + } + (cache_dir / f"{split}.fs_labels.json").write_text(json.dumps(stats, indent=2, sort_keys=True) + "\n") + print(f"{split}: {json.dumps(stats, sort_keys=True)}", flush=True) + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--dataset", type=Path, required=True) + parser.add_argument("--cache-dir", type=Path, required=True) + parser.add_argument("--splits", nargs="*", default=list(SPLITS)) + args = parser.parse_args() + + for split in args.splits: + build_split(args.dataset, args.cache_dir, split) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/cache_self_distill.py b/scripts/cache_self_distill.py new file mode 100644 index 0000000..6b5f334 --- /dev/null +++ b/scripts/cache_self_distill.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +"""Cache a parent student's predictions as {split}.self_probabilities.mmap. + +Loads a parent checkpoint (either a .npz saved via the trainer's +--checkpoint-weights, or an exported MSQ1 .bin) and runs it over the cached +unit-id rows of each split. With --output-mode sigmoid (default) the stored +targets are per-class sigmoid marginals for one-vs-all self-distillation +(--soft-loss-mode bce); with --output-mode softmax they are the normalized +distribution used by the legacy CE self-loss. + +Usage: + python3 scripts/cache_self_distill.py \ + --checkpoint /tmp/parent.npz \ + --architecture wordseq-b1536-k3-m2048-med-3conv-hidden \ + --cache-dir /tmp/betlang-finetune-cache +""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path + +import numpy as np +import tensorflow as tf + +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from train_magika_qat_student import ( # noqa: E402 + QAT_ACTIVE, + SPLITS, + TOKEN_LENGTH, + architecture_uses_word_units, + build_word_seq_hashembed_hidden_model, + load_exported_layer_weights, + wordseq_config_for_architecture, +) + +QAT_ACTIVE.assign(False) + + +def load_parent(checkpoint: Path, architecture: str, classes: int) -> tf.keras.Model: + if not architecture_uses_word_units(architecture): + raise SystemExit("only wordseq architectures are supported") + cfg = wordseq_config_for_architecture(architecture) + model = build_word_seq_hashembed_hidden_model(classes, bits=4, **cfg) + if checkpoint.suffix == ".npz": + arrays = np.load(checkpoint) + loaded = 0 + for layer in model.layers: + values = [] + index = 0 + while f"{layer.name}|{index}" in arrays: + values.append(arrays[f"{layer.name}|{index}"]) + index += 1 + if not values: + continue + current = layer.get_weights() + if len(current) != len(values) or any(c.shape != v.shape for c, v in zip(current, values)): + raise SystemExit(f"layer {layer.name} shape mismatch against checkpoint") + layer.set_weights([v.astype(c.dtype) for c, v in zip(current, values)]) + loaded += 1 + else: + layer_weights, _ = load_exported_layer_weights(checkpoint) + loaded = 0 + for layer in model.layers: + if layer.name not in layer_weights: + continue + current = layer.get_weights() + target = layer_weights[layer.name] + if len(current) != len(target) or any(c.shape != t.shape for c, t in zip(current, target)): + continue + layer.set_weights([t.astype(c.dtype) for c, t in zip(current, target)]) + loaded += 1 + print(f"loaded weights into {loaded} layers from {checkpoint}", flush=True) + return model + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--checkpoint", type=Path, required=True) + parser.add_argument("--architecture", required=True) + parser.add_argument("--cache-dir", type=Path, required=True) + parser.add_argument("--output-dir", type=Path, default=None, help="defaults to --cache-dir") + parser.add_argument("--output-mode", choices=("sigmoid", "softmax"), default="sigmoid") + parser.add_argument("--unit-tokenizer", type=int, default=3) + parser.add_argument("--batch-size", type=int, default=512) + parser.add_argument("--splits", nargs="*", default=list(SPLITS)) + args = parser.parse_args() + + output_dir = args.output_dir or args.cache_dir + meta = json.loads((args.cache_dir / f"{args.splits[0]}.json").read_text()) + classes = int(meta["classes"]) + model = load_parent(args.checkpoint, args.architecture, classes) + + suffix = "" if args.unit_tokenizer == 1 else f"_v{args.unit_tokenizer}" + for split in args.splits: + split_meta = json.loads((args.cache_dir / f"{split}.json").read_text()) + n = int(split_meta["count"]) + units = np.memmap( + args.cache_dir / f"{split}.units{suffix}.mmap", + dtype=np.int32, + mode="r", + shape=(n, TOKEN_LENGTH), + ) + out = np.memmap( + output_dir / f"{split}.self_probabilities.mmap", + dtype=np.float32, + mode="w+", + shape=(n, classes), + ) + correct = 0 + labels = np.memmap(args.cache_dir / f"{split}.labels.mmap", dtype=np.int64, mode="r", shape=(n,)) + for start in range(0, n, args.batch_size): + end = min(start + args.batch_size, n) + result = model(tf.convert_to_tensor(units[start:end], dtype=tf.int32), training=False) + logits = result[0] if isinstance(result, (list, tuple)) else result + if args.output_mode == "sigmoid": + probs = tf.sigmoid(logits).numpy() + else: + probs = tf.nn.softmax(logits, axis=1).numpy() + out[start:end] = probs.astype(np.float32) + correct += int((probs.argmax(axis=1) == labels[start:end]).sum()) + out.flush() + print(f"{split}: n={n} parent_teacher_parity={correct / n:.6f}", flush=True) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/hard_gen_c_cpp.py b/scripts/hard_gen_c_cpp.py new file mode 100644 index 0000000..b790388 --- /dev/null +++ b/scripts/hard_gen_c_cpp.py @@ -0,0 +1,721 @@ +"""Synthesize "hard boundary" training files for a C-vs-C++ classifier. + +The target model (a small Magika distillation) sees only the first 4096 +bytes of a file, tokenized into case-folded words, punctuation runs and +brackets. It tends to confuse C and C++, so this module emits samples +that sit deliberately close to the decision boundary while remaining +unambiguous to a human labeler: + + synth_hard_c(rng) -> bytes of genuinely-C code (.c) that borrows C++ + surface features: vtable-style OO structs, class-like containers + with new_*/delete_* functions, modern C with // comments and bool, + macro pseudo-templates, and opaque-handle headers. + + synth_hard_cpp(rng) -> bytes of genuinely-C++ code (.cpp) that stays + C-flavored (procedural printf/malloc-style code, no heavy STL soup) + but always carries 2-4 unambiguous C++ markers near the top of the + file: /-style includes, a real class with ctor/dtor + and public:/private: sections, std:: usage, new/delete allocations, + template helpers, or a single std::cout line. + +All randomness comes from the caller-provided random.Random instance so +generation is reproducible. Output is ASCII, roughly 150 B to 4 KB. +""" + +import random # used only for the type of `rng` and the __main__ demo + + +# --------------------------------------------------------------------------- +# word pools (identifier fragments) +# --------------------------------------------------------------------------- + +NOUNS = [ + "buffer", "node", "table", "queue", "stream", "packet", "frame", + "chunk", "cache", "token", "cursor", "widget", "matrix", "vector", + "string", "record", "field", "index", "slot", "page", "block", + "handle", "socket", "channel", "event", "signal", "timer", "clock", + "arena", "pool", "heap", "stack", "list", "tree", "graph", "edge", + "route", "batch", "shard", "bucket", +] + +VERBS = [ + "init", "reset", "update", "flush", "parse", "scan", "emit", "load", + "store", "copy", "move", "swap", "merge", "split", "grow", "shrink", + "insert", "remove", "find", "count", "hash", "pack", "unpack", + "encode", "decode", "open", "close", "read", "write", "seek", + "bind", "attach", "detach", "resize", "clamp", "rotate", +] + +ADJS = [ + "tiny", "fast", "slow", "raw", "packed", "sparse", "dense", "local", + "shared", "dirty", "clean", "hot", "cold", "lazy", "eager", "safe", + "weak", "strong", "inner", "outer", "upper", "lower", "prime", + "spare", "stale", "fresh", "wide", "narrow", "deep", "flat", + "round", "plain", +] + +_INT_TYPES = ["int", "long", "unsigned", "unsigned long"] + + +# --------------------------------------------------------------------------- +# small helpers (all take rng explicitly) +# --------------------------------------------------------------------------- + +def _fresh(rng, used, *pools): + """Join one word from each pool into a fresh snake_case identifier.""" + name = "_".join(rng.choice(p) for p in pools) + for _ in range(24): + if name not in used: + used.add(name) + return name + name = "_".join(rng.choice(p) for p in pools) + name = name + str(rng.randint(2, 97)) + used.add(name) + return name + + +def _int_lit(rng): + r = rng.random() + if r < 0.35: + return str(rng.randint(1, 9999)) + if r < 0.60: + return "0x%x" % rng.randint(1, 0xffff) + return str(rng.choice([2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 4096])) + + +def _flt_lit(rng): + return "%d.%d" % (rng.randint(0, 99), rng.randint(0, 99)) + + +def _comment(rng, line=None): + """A short varied comment; line=True -> //, False -> block, None -> random.""" + if line is None: + line = rng.random() < 0.5 + text = rng.choice([ + "{v} the {a} {n} before reuse", + "{n} {n2}: single {v} pass over the {a} region", + "TODO: {v} the {n} once the {n2} is {a}", + "NOTE: keep the {n} {a}; see {v}_{n2}()", + "{a} {n} helpers ({v} / {v2} paths)", + "internal {n} layout, callers must not {v} it directly", + "{v} at most {k} {n}s per {n2}", + ]).format( + v=rng.choice(VERBS), v2=rng.choice(VERBS), + n=rng.choice(NOUNS), n2=rng.choice(NOUNS), + a=rng.choice(ADJS), k=rng.randint(2, 64), + ) + return "// " + text if line else "/* " + text + " */" + + +def _helper_fn(rng, used, line_comments=None, use_printf=False): + """A small stand-alone function used to pad files to a target size.""" + name = _fresh(rng, used, VERBS, ADJS, NOUNS) + out = [] + if rng.random() < 0.7: + out.append(_comment(rng, line_comments)) + shape = rng.randint(0, 2 + (1 if use_printf else 0)) + if shape == 0: + ret = rng.choice(_INT_TYPES) + out += [ + "static %s %s(%s seed, int rounds) {" % (ret, name, ret), + " %s acc = seed ^ %s;" % (ret, _int_lit(rng)), + " for (int i = 0; i < rounds; ++i) {", + " acc = acc * %s + (%s)i;" % (_int_lit(rng), ret), + " acc ^= acc >> %d;" % rng.randint(1, 13), + " }", + " return acc;", + "}", + ] + elif shape == 1: + out += [ + "static int %s(const unsigned char *bytes, int n) {" % name, + " int total = 0;", + " for (int i = 0; i + 1 < n; i += 2) {", + " total += (bytes[i] << %d) ^ bytes[i + 1];" % rng.randint(1, 7), + " total &= %s;" % _int_lit(rng), + " }", + " return total;", + "}", + ] + elif shape == 2: + out += [ + "static double %s(double base, int steps) {" % name, + " double acc = base;", + " while (steps-- > 0) {", + " acc = acc * %s + %s;" % (_flt_lit(rng), _flt_lit(rng)), + " }", + " return acc < %s ? acc : %s;" % (_flt_lit(rng), _flt_lit(rng)), + "}", + ] + else: + out += [ + "static void %s(int level, long value) {" % name, + " if (level > %s) {" % rng.randint(0, 9), + " printf(\"%s=%ld\\n\", \"" + rng.choice(NOUNS) + "\", value);", + " }", + "}", + ] + return "\n".join(out) + "\n" + + +def _proto(rng, used, tag): + """A declaration line for header-style samples.""" + name = _fresh(rng, used, VERBS, NOUNS) + kind = rng.randint(0, 3) + lines = [] + if rng.random() < 0.4: + lines.append(_comment(rng, False)) + if kind == 0: + lines.append("int %s_%s(struct %s *self, %s value);" + % (tag, name, tag, rng.choice(_INT_TYPES))) + elif kind == 1: + lines.append("void %s_%s(struct %s *self, size_t limit);" + % (tag, name, tag)) + elif kind == 2: + lines.append("typedef int (*%s_fn)(void *ctx, long %s);" + % (name, rng.choice(NOUNS))) + else: + lines.append("extern const unsigned %s_%s[%s];" + % (tag, _fresh(rng, used, ADJS, NOUNS), _int_lit(rng))) + return "\n".join(lines) + "\n" + + +def _assemble(rng, head, extra_maker, tail=()): + """Join head blocks, pad with extra blocks toward a random target size, + append tail, and clamp the result to ~4 KB of ASCII.""" + target = rng.choice([ + rng.randint(260, 700), + rng.randint(700, 1800), + rng.randint(1800, 3600), + ]) + blocks = list(head) + tail = list(tail) + + def render(): + return "\n".join(blocks + tail) + "\n" + + text = render() + guard = 0 + while len(text) < target and guard < 64: + blocks.append(extra_maker(rng)) + text = render() + guard += 1 + while len(text) > 4000 and len(blocks) > len(head): + blocks.pop() + text = render() + if len(text) > 4090: + text = text[:4090] + cut = text.rfind("\n}") + if cut > 0: + text = text[:cut + 2] + "\n" + return text.encode("ascii") + + +# --------------------------------------------------------------------------- +# hard-C sub-styles: real C wearing C++ clothing +# --------------------------------------------------------------------------- + +def _c_style_vtable(rng, used): + """OO-looking C: typedef'd struct + function-pointer vtable + new_/delete_.""" + n = _fresh(rng, used, NOUNS) + ops = n + "_ops" + m1, m2 = rng.sample(VERBS, 2) + f1 = _fresh(rng, used, ADJS, NOUNS) + f2 = _fresh(rng, used, ADJS, NOUNS) + head = [ + _comment(rng, False), + "#include ", + ] + if rng.random() < 0.6: + head.append("#include ") + head += [ + "", + "typedef struct %s %s;" % (n, n), + "", + "typedef struct %s {" % ops, + " void (*destroy)(%s *self);" % n, + " int (*%s)(%s *self, int depth);" % (m1, n), + " long (*%s)(const %s *self);" % (m2, n), + "} %s;" % ops, + "", + "struct %s {" % n, + " const %s *ops;" % ops, + " int refcount;", + " long %s;" % f1, + " double %s;" % f2, + "};", + "", + "%s *new_%s(const %s *ops) {" % (n, n, ops), + " %s *self = (%s *)malloc(sizeof(*self));" % (n, n), + " if (!self) return NULL;", + " self->ops = ops;", + " self->refcount = 1;", + " self->%s = %s;" % (f1, _int_lit(rng)), + " self->%s = %s;" % (f2, _flt_lit(rng)), + " return self;", + "}", + "", + "void delete_%s(%s *self) {" % (n, n), + " if (self && --self->refcount == 0) {", + " self->ops->destroy(self);", + " free(self);", + " }", + "}", + "", + "int %s_%s(%s *self, int depth) {" % (n, m1, n), + " return self->ops->%s(self, depth);" % m1, + "}", + "", + ] + return head, lambda r: _helper_fn(r, used, line_comments=False) + + +def _c_style_container(rng, used): + """Class-like C container: struct string/vector with method functions.""" + n = rng.choice(["string", "vector", "list", "map", "deque"]) + used.add(n) + grow = rng.choice([2, 2, 4]) + verb = rng.choice(["append", "push", "insert", "emit"]) + head = [ + _comment(rng, True), + "#include ", + "#include ", + "", + "struct %s {" % n, + " char *data;", + " size_t size;", + " size_t capacity;", + "};", + "", + "struct %s *new_%s(size_t hint) {" % (n, n), + " struct %s *self = malloc(sizeof *self);" % n, + " if (!self) return NULL;", + " self->size = 0;", + " self->capacity = hint ? hint : %s;" % _int_lit(rng), + " self->data = malloc(self->capacity);", + " return self;", + "}", + "", + "void delete_%s(struct %s *self) {" % (n, n), + " if (self) {", + " free(self->data);", + " free(self);", + " }", + "}", + "", + "static int %s_reserve(struct %s *self, size_t want) {" % (n, n), + " if (want <= self->capacity) return 0;", + " while (self->capacity < want) self->capacity *= %d;" % grow, + " self->data = realloc(self->data, self->capacity);", + " return self->data ? 0 : -1;", + "}", + "", + "int %s_%s(struct %s *self, const char *bytes, size_t n) {" % (n, verb, n), + " if (%s_reserve(self, self->size + n) != 0) return -1;" % n, + " memcpy(self->data + self->size, bytes, n);", + " self->size += n;", + " return 0;", + "}", + "", + ] + return head, lambda r: _helper_fn(r, used) + + +def _c_style_stdbool(rng, used): + """Modern C: stdbool.h, // comments, true/false, fixed-width ints.""" + state = _fresh(rng, used, ADJS, NOUNS) + "_state" + pred = _fresh(rng, used, NOUNS) + verb = _fresh(rng, used, VERBS, NOUNS) + mask = "0x%xu" % rng.randint(1, 0xffff) + head = [ + _comment(rng, True), + "#include ", + "#include ", + "", + "typedef struct {", + " uint32_t flags;", + " int32_t depth;", + " bool active;", + "} %s;" % state, + "", + "static bool %s_is_%s(const %s *s) {" % (pred, rng.choice(ADJS), state), + " return s->active && (s->flags & %s) != 0;" % mask, + "}", + "", + "bool %s(%s *s, int32_t step) {" % (verb, state), + " if (!s) return false;", + " // clamp the walk so the %s stays %s" % (rng.choice(NOUNS), rng.choice(ADJS)), + " for (int32_t i = 0; i < step; ++i) {", + " s->depth += (i & 1) ? %d : -%d;" % (rng.randint(1, 9), rng.randint(1, 9)), + " }", + " s->active = s->depth < %s;" % _int_lit(rng), + " return true;", + "}", + "", + ] + return head, lambda r: _helper_fn(r, used, line_comments=True) + + +def _c_style_macro_template(rng, used): + """Poor-man's templates: a type-parameterized container built with ##.""" + mac = rng.choice(["VEC", "ARR", "SPAN", "SLAB", "RING"]) + used.add(mac) + push = rng.choice(["push", "append", "emit"]) + cap0 = rng.choice([4, 8, 16]) + insts = rng.sample(["int", "long", "double", "float", "short"], rng.randint(2, 3)) + head = [ + "/* generic %s via macros; a poor man's template */" % rng.choice(NOUNS), + "#include ", + "", + "#define %s(T) \\" % mac, + " struct %s_##T { T *data; size_t len; size_t cap; }; \\" % mac.lower(), + " static void %s_##T##_init(struct %s_##T *v) { \\" % (mac.lower(), mac.lower()), + " v->data = 0; v->len = 0; v->cap = 0; \\", + " } \\", + " static int %s_##T##_%s(struct %s_##T *v, T item) { \\" % (mac.lower(), push, mac.lower()), + " if (v->len == v->cap) { \\", + " size_t next = v->cap ? v->cap * 2 : %d; \\" % cap0, + " T *p = (T *)realloc(v->data, next * sizeof(T)); \\", + " if (!p) return -1; \\", + " v->data = p; v->cap = next; \\", + " } \\", + " v->data[v->len++] = item; \\", + " return 0; \\", + " }", + "", + ] + ["%s(%s)" % (mac, t) for t in insts] + [""] + return head, lambda r: _helper_fn(r, used) + + +def _c_style_opaque_header(rng, used): + """Opaque-handle C header: guard, typedefs, callback prototypes.""" + n = _fresh(rng, used, NOUNS) + guard = ("%s_%s_H" % (rng.choice(ADJS), n)).upper() + cb = _fresh(rng, used, VERBS) + head = [ + "#ifndef %s" % guard, + "#define %s" % guard, + "", + _comment(rng, False), + "#include ", + "", + "typedef struct %s %s; /* opaque */" % (n, n), + "typedef void (*%s_%s_fn)(%s *self, void *ctx);" % (n, cb, n), + "", + "%s *%s_create(size_t capacity);" % (n, n), + "void %s_destroy(%s *self);" % (n, n), + "int %s_%s(%s *self, %s_%s_fn cb, void *ctx);" % (n, cb, n, n, cb), + "size_t %s_%s(const %s *self);" % (n, rng.choice(["size", "count", "depth"]), n), + "", + ] + tail = ["#endif /* %s */" % guard] + return head, (lambda r: _proto(r, used, n)), tail + + +def synth_hard_c(rng): + """Return bytes of a file that is clearly C but near the C++ boundary.""" + used = set() + style = rng.choice([ + _c_style_vtable, + _c_style_container, + _c_style_stdbool, + _c_style_macro_template, + _c_style_opaque_header, + ]) + parts = style(rng, used) + if len(parts) == 3: + head, extra, tail = parts + else: + head, extra = parts + tail = () + return _assemble(rng, head, extra, tail) + + +# --------------------------------------------------------------------------- +# hard-C++ sub-styles: real C++ wearing C clothing, but with 2-4 clear +# C++ markers near the top of every file (C++ includes, class with +# ctor/dtor, std:: usage, new/delete, templates, a lone std::cout). +# --------------------------------------------------------------------------- + +def _cpp_helper_fn(rng, used, vector_ok=False): + """C-flavored padding function for C++ files; some shapes lean on + new[]/delete[], std::printf, or std::vector to keep C++ evidence up.""" + name = _fresh(rng, used, VERBS, ADJS, NOUNS) + out = [] + if rng.random() < 0.7: + out.append(_comment(rng)) + shapes = [0, 1, 2] + if vector_ok: + shapes.append(3) + shape = rng.choice(shapes) + if shape == 0: + ret = rng.choice(_INT_TYPES) + out += [ + "static %s %s(%s seed, int rounds) {" % (ret, name, ret), + " %s acc = seed ^ %s;" % (ret, _int_lit(rng)), + " for (int i = 0; i < rounds; ++i) {", + " acc = acc * %s + (%s)i;" % (_int_lit(rng), ret), + " acc ^= acc >> %d;" % rng.randint(1, 13), + " }", + " return acc;", + "}", + ] + elif shape == 1: + out += [ + "static long %s(int n) {" % name, + " long *tmp = new long[n > 0 ? n : 1];", + " long total = 0;", + " for (int i = 0; i < n; ++i) {", + " tmp[i] = (long)i * %d;" % rng.randint(2, 97), + " total += tmp[i];", + " }", + " delete[] tmp;", + " return total;", + "}", + ] + elif shape == 2: + out += [ + "static void %s(int level, long value) {" % name, + " if (level > %d) {" % rng.randint(0, 9), + " std::printf(\"%s=%ld\\n\", \"" + rng.choice(NOUNS) + "\", value);", + " }", + "}", + ] + else: + out += [ + "static long %s(const std::vector &items) {" % name, + " long total = 0;", + " for (std::size_t i = 0; i < items.size(); ++i) {", + " total += items[i] ^ %s;" % _int_lit(rng), + " }", + " return total;", + "}", + ] + return "\n".join(out) + "\n" + + +def _cpp_style_class_ns(rng, used): + """A real class (ctor/dtor, public:/private:) inside a namespace, with + C-style factory functions using new/delete and std::printf.""" + ns = rng.choice(ADJS) + n = _fresh(rng, used, NOUNS) + cls = n.capitalize() + f1 = _fresh(rng, used, ADJS, NOUNS) + verb = rng.choice(VERBS) + head = [ + _comment(rng, False), + "#include ", + "#include ", + "", + "namespace %s {" % ns, + "", + "class %s {" % cls, + "public:", + " explicit %s(int %s) : %s_(%s), scale_(%s) {}" % (cls, f1, f1, f1, _flt_lit(rng)), + " ~%s() { std::printf(\"%s freed: %%d\\n\", %s_); }" % (cls, n, f1), + "", + " int %s(int step) {" % verb, + " %s_ += step;" % f1, + " return %s_;" % f1, + " }", + "", + "private:", + " int %s_;" % f1, + " double scale_;", + "};", + "", + "static %s *make_%s(int seed) {" % (cls, n), + " return new %s(seed %% %d);" % (cls, rng.randint(3, 977)), + "}", + "", + "static void drop_%s(%s *p) {" % (n, cls), + " delete p;", + "}", + "", + ] + tail = ["} // namespace %s" % ns] + return head, (lambda r: _cpp_helper_fn(r, used)), tail + + +def _cpp_style_extern_c(rng, used): + """extern \"C\" API over C-style structs, implemented with std::memcpy + and new[]/delete[] buffers.""" + n = _fresh(rng, used, NOUNS) + verb = rng.choice(VERBS) + f1 = _fresh(rng, used, ADJS, NOUNS) + head = [ + _comment(rng, True), + "#include ", + "#include ", + "", + "extern \"C\" {", + "", + "struct %s_header {" % n, + " unsigned magic;", + " unsigned %s;" % f1, + " unsigned char payload[%s];" % _int_lit(rng), + "};", + "", + "int %s_%s(const unsigned char *bytes, std::size_t len, struct %s_header *out) {" % (verb, n, n), + " if (len < sizeof(*out)) return -1;", + " std::memcpy(out, bytes, sizeof(*out));", + " if (out->magic != %su) return -2;" % _int_lit(rng), + " out->%s &= %s;" % (f1, _int_lit(rng)), + " return 0;", + "}", + "", + "} /* extern \"C\" */", + "", + "static unsigned char *clone_%s(const unsigned char *src, std::size_t n) {" % n, + " unsigned char *copy = new unsigned char[n];", + " std::memcpy(copy, src, n);", + " return copy;", + "}", + "", + "static void free_%s(unsigned char *p) {" % n, + " delete[] p;", + "}", + "", + ] + return head, (lambda r: _cpp_helper_fn(r, used)), () + + +def _cpp_style_template(rng, used): + """Mostly-C procedural code fronted by small template + helpers and std::size_t.""" + n = _fresh(rng, used, NOUNS) + v1, v2 = rng.sample(VERBS, 2) + lim = _int_lit(rng) + head = [ + _comment(rng, rng.random() < 0.5), + "#include ", + "#include ", + "", + "template ", + "static T %s_%s(T value, T lo, T hi) {" % (v1, n), + " if (value < lo) return lo;", + " return value > hi ? hi : value;", + "}", + "", + "template ", + "static T %s_%s(const T *items, std::size_t n) {" % (v2, n), + " T total = T();", + " for (std::size_t i = 0; i < n; ++i) total += items[i];", + " return total;", + "}", + "", + "struct %s_span {" % n, + " const long *data;", + " std::size_t len;", + "};", + "", + "static long fold_%s(const %s_span *s) {" % (n, n), + " long total = %s_%s(s->data, s->len);" % (v2, n), + " return %s_%s(total, -%s, %s);" % (v1, n, lim, lim), + "}", + "", + ] + return head, (lambda r: _cpp_helper_fn(r, used)), () + + +def _cpp_style_vector_lite(rng, used): + """Procedural C-style functions that pass std::vector / std::string + around but otherwise read like C (printf-style output, raw loops).""" + n = _fresh(rng, used, NOUNS) + verb = rng.choice(VERBS) + head = [ + _comment(rng, True), + "#include ", + "#include ", + "#include ", + "", + "struct %s_stats {" % n, + " long total;", + " int count;", + "};", + "", + "static %s_stats %s_%s(const std::vector &samples) {" % (n, verb, n), + " %s_stats st;" % n, + " st.total = 0;", + " st.count = (int)samples.size();", + " for (int i = 0; i < st.count; ++i) st.total += samples[i];", + " return st;", + "}", + "", + "static void dump_%s(const std::string &tag, const %s_stats *st) {" % (n, n), + " std::printf(\"%s: total=%ld count=%d\\n\", tag.c_str(), st->total, st->count);", + "}", + "", + ] + return head, (lambda r: _cpp_helper_fn(r, used, vector_ok=True)), () + + +def _cpp_style_mixed_alloc(rng, used): + """malloc-style pool code that also uses new[]/delete[] and finishes + with a single std::cout line.""" + n = _fresh(rng, used, NOUNS) + pool = n + "_" + rng.choice(["pool", "arena", "bank"]) + push = rng.choice(["push", "add", "put"]) + head = [ + _comment(rng, rng.random() < 0.5), + "#include ", + "#include ", + "#include ", + "", + "struct %s {" % pool, + " long *slots;", + " int used;", + " int cap;", + "};", + "", + "static %s *make_%s(int cap) {" % (pool, n), + " %s *p = (%s *)malloc(sizeof(%s));" % (pool, pool, pool), + " if (!p) return NULL;", + " p->slots = new long[cap > 0 ? cap : %d];" % rng.choice([8, 16, 32]), + " p->used = 0;", + " p->cap = cap;", + " return p;", + "}", + "", + "static void drop_%s(%s *p) {" % (n, pool), + " if (!p) return;", + " delete[] p->slots;", + " free(p);", + "}", + "", + "static int %s_%s(%s *p, long v) {" % (n, push, pool), + " if (p->used == p->cap) return -1;", + " p->slots[p->used++] = v;", + " return p->used;", + "}", + "", + "static void report_%s(const %s *p) {" % (n, pool), + " std::cout << \"%s used=\" << p->used << \"\\n\";" % n, + "}", + "", + ] + return head, (lambda r: _cpp_helper_fn(r, used)), () + + +def synth_hard_cpp(rng): + """Return bytes of a file that is clearly C++ but near the C boundary.""" + used = set() + style = rng.choice([ + _cpp_style_class_ns, + _cpp_style_extern_c, + _cpp_style_template, + _cpp_style_vector_lite, + _cpp_style_mixed_alloc, + ]) + head, extra, tail = style(rng, used) + return _assemble(rng, head, extra, tail) + + +# --------------------------------------------------------------------------- + +if __name__ == "__main__": + demo_rng = random.Random(0) + for fn in (synth_hard_c, synth_hard_cpp): + for _ in range(2): + print(fn(demo_rng).decode("ascii")) + print("=" * 40) diff --git a/scripts/hard_gen_ini.py b/scripts/hard_gen_ini.py new file mode 100644 index 0000000..ca81ab4 --- /dev/null +++ b/scripts/hard_gen_ini.py @@ -0,0 +1,428 @@ +"""Synthesize "hard" INI/config files for stress-testing a source-language classifier. + +Every sample produced by synth_hard_ini() is unambiguously an INI-style config +file (.ini/.cfg: [sections], key=value pairs, ;/# comments), but each one is +deliberately laced with surface features that pull weak byte/token classifiers +(word units, punctuation runs, brackets from the first 4096 bytes) toward +markdown (prose comment paragraphs, bracketed multi-word headers that resemble +link references), batch (%VAR% expansions, drive-letter paths, URLs), or +python (True/None/False literals, comma lists, setup.cfg/tox.ini idioms). +Only the supplied random.Random instance is used, so output is reproducible. +""" + +# --------------------------------------------------------------------------- +# Word pools (shared by all sub-styles; combined randomly, never verbatim). +# --------------------------------------------------------------------------- + +_NOUNS = [ + "cache", "worker", "session", "proxy", "logging", "backend", "storage", + "network", "database", "queue", "metrics", "auth", "token", "cluster", + "replica", "handler", "socket", "buffer", "index", "archive", "mirror", + "policy", "runtime", "sandbox", "monitor", "gateway", "schema", "bundle", + "plugin", "release", "profile", "channel", "webhook", "ledger", "quota", +] + +_ADJS = [ + "primary", "remote", "local", "shared", "default", "internal", "legacy", + "secure", "verbose", "strict", "lazy", "global", "fallback", "staging", + "nightly", "managed", "static", "dynamic", "rotating", "pinned", + "temporary", "persistent", "external", "minimal", "extended", "trusted", + "isolated", "custom", "upstream", "readonly", "batched", "async", +] + +_KEY_SUFFIX = [ + "timeout", "limit", "path", "dir", "host", "port", "size", "level", + "count", "mode", "url", "key", "file", "name", "interval", "retries", + "threshold", "ttl", "prefix", "suffix", "backend", "driver", "user", + "group", "target", "format", "depth", "window", "rate", "weight", +] + +_PROSE = [ + "this", "section", "controls", "how", "the", "service", "handles", + "incoming", "requests", "and", "when", "values", "are", "reloaded", + "from", "disk", "note", "that", "changing", "these", "settings", + "requires", "a", "restart", "of", "every", "running", "instance", + "before", "they", "take", "effect", "see", "operators", "guide", + "for", "details", "on", "tuning", "under", "heavy", "load", "most", + "deployments", "should", "keep", "defaults", "unless", "profiling", + "shows", "otherwise", "older", "releases", "ignored", "this", "field", +] + +_HOSTS = [ + "example.com", "internal.corp", "api.example.org", "cdn.example.net", + "mirror.example.io", "registry.local", "build.example.dev", + "vault.example.co", "stats.example.app", "git.example.org", +] + +_ENV_VARS = [ + "APPDATA", "PROGRAMFILES", "USERPROFILE", "TEMP", "SYSTEMROOT", + "LOCALAPPDATA", "COMPUTERNAME", "PATH", "HOMEDRIVE", "WINDIR", + "JAVA_HOME", "PYTHONPATH", "BUILD_DIR", "CONFIG_HOME", "CACHE_ROOT", +] + +_UNIX_DIRS = [ + "usr/bin", "usr/local/bin", "opt/app", "var/lib", "var/log", "etc", + "srv/data", "usr/share", "home/deploy", "run/lock", +] + +_EXTS = ["py", "js", "toml", "yaml", "json", "md", "rst", "sh", "cfg", "txt"] + +_BOOLS_PY = ["True", "False", "None"] +_BOOLS_INI = ["true", "false", "yes", "no", "on", "off", "1", "0"] + + +# --------------------------------------------------------------------------- +# Small helpers (all take rng explicitly). +# --------------------------------------------------------------------------- + +def _word(rng): + return rng.choice(rng.choice((_NOUNS, _ADJS))) + + +def _key(rng): + style = rng.randrange(4) + a = rng.choice(_ADJS) + b = rng.choice(_NOUNS) + c = rng.choice(_KEY_SUFFIX) + if style == 0: + return "%s_%s" % (b, c) + if style == 1: + return "%s_%s_%s" % (a, b, c) + if style == 2: + return "%s.%s" % (b, c) + return "%s-%s" % (a, c) + + +def _sentence(rng, lo=6, hi=14): + n = rng.randint(lo, hi) + words = [rng.choice(_PROSE) for _ in range(n)] + words[0] = words[0].capitalize() + return " ".join(words) + rng.choice([".", ".", ".", "!", "?"]) + + +def _number(rng): + kind = rng.randrange(5) + if kind == 0: + return str(rng.randint(0, 9)) + if kind == 1: + return str(rng.randint(10, 65535)) + if kind == 2: + return "%.2f" % (rng.random() * rng.choice([1, 10, 100])) + if kind == 3: + return str(rng.choice([1024, 2048, 4096, 8192, 16384]) * rng.randint(1, 8)) + return "%d%s" % (rng.randint(1, 900), rng.choice(["ms", "s", "m", "h", "k", "M"])) + + +def _url(rng): + scheme = rng.choice(["https", "http", "ftp", "ssh"]) + host = rng.choice(_HOSTS) + depth = rng.randint(0, 3) + parts = "/".join(_word(rng) for _ in range(depth)) + tail = "/" + parts if parts else "" + if rng.random() < 0.3: + tail += "?%s=%s" % (_word(rng), _number(rng)) + return "%s://%s%s" % (scheme, host, tail) + + +def _win_path(rng): + drive = rng.choice(["C", "D", "E"]) + parts = [rng.choice(["Program Files", "Users", "ProgramData", "Windows", "Tools"])] + parts += [_word(rng) for _ in range(rng.randint(1, 3))] + leaf = "%s.%s" % (_word(rng), rng.choice(["exe", "bat", "dll", "ini", "log"])) + return drive + ":\\" + "\\".join(parts) + "\\" + leaf + + +def _unix_path(rng): + base = rng.choice(_UNIX_DIRS) + parts = [_word(rng) for _ in range(rng.randint(0, 2))] + leaf = _word(rng) + rng.choice(["", ".%s" % rng.choice(_EXTS)]) + return "/" + "/".join([base] + parts + [leaf]) + + +def _comment_block(rng, mark, lo=1, hi=4): + lines = [] + for _ in range(rng.randint(lo, hi)): + lines.append("%s %s" % (mark, _sentence(rng))) + return lines + + +# --------------------------------------------------------------------------- +# Sub-styles. Each returns a list of text lines. +# --------------------------------------------------------------------------- + +def _style_prose_comments(rng): + """INI dominated by long ;/# comment paragraphs, like markdown prose.""" + mark = rng.choice([";", "#"]) + lines = _comment_block(rng, mark, 2, 5) + lines.append("") + for _ in range(rng.randint(2, 4)): + lines.append("[%s]" % _key(rng).replace(".", "_")) + if rng.random() < 0.9: + lines.extend(_comment_block(rng, mark, 1, 4)) + for _ in range(rng.randint(2, 5)): + val = rng.choice([_number(rng), rng.choice(_BOOLS_INI), _word(rng)]) + lines.append("%s = %s" % (_key(rng), val)) + if rng.random() < 0.4: + lines.append("%s %s" % (mark, _sentence(rng, 4, 9))) + lines.append("") + if rng.random() < 0.5: + lines.extend(_comment_block(rng, mark, 1, 3)) + lines.append("") + return lines + + +def _style_spacey_sections(rng): + """Multi-word [section names with spaces] that resemble md link refs.""" + lines = [] + if rng.random() < 0.6: + lines.append("; %s" % _sentence(rng, 4, 8)) + lines.append("") + for _ in range(rng.randint(3, 6)): + n = rng.randint(2, 4) + title = " ".join(_word(rng) for _ in range(n)) + if rng.random() < 0.4: + title = title.title() + lines.append("[%s]" % title) + for _ in range(rng.randint(2, 5)): + pick = rng.random() + if pick < 0.3: + val = _url(rng) + elif pick < 0.6: + val = "%s: %s" % (_word(rng), _sentence(rng, 3, 6)) + else: + val = _number(rng) + lines.append("%s = %s" % (_key(rng), val)) + lines.append("") + return lines + + +def _style_batchlike(rng): + """Values full of %VAR%, $ENV, drive letters, and URLs (batch-flavored).""" + lines = ["; Generated for host %s" % rng.choice(_HOSTS).split(".")[0]] + for _ in range(rng.randint(2, 4)): + lines.append("") + lines.append("[%s]" % _key(rng)) + for _ in range(rng.randint(3, 6)): + pick = rng.random() + if pick < 0.25: + val = "%%%s%%\\%s" % (rng.choice(_ENV_VARS), _word(rng)) + elif pick < 0.45: + val = "$%s/%s" % (rng.choice(_ENV_VARS), _word(rng)) + elif pick < 0.65: + val = _win_path(rng) + elif pick < 0.85: + val = _url(rng) + else: + val = "%s.%s %s" % (_word(rng), rng.choice(["exe", "bat", "cmd"]), + rng.choice(["/S", "/Q", "-y", "--force", "/norestart"])) + key = _key(rng).replace(".", "_").replace("-", "_") + eq = rng.choice(["=", " = "]) + lines.append("%s%s%s" % (key, eq, val)) + lines.append("") + return lines + + +def _style_systemd(rng): + """systemd unit file: [Unit]/[Service]/[Install] with Exec lines.""" + app = "%s-%s" % (rng.choice(_ADJS), rng.choice(_NOUNS)) + lines = ["[Unit]"] + lines.append("Description=%s %s daemon" % (rng.choice(_ADJS).capitalize(), + rng.choice(_NOUNS))) + if rng.random() < 0.7: + lines.append("After=network%s.target" % rng.choice(["", "-online"])) + if rng.random() < 0.4: + lines.append("Wants=%s.service" % rng.choice(_NOUNS)) + if rng.random() < 0.4: + lines.append("Documentation=%s" % _url(rng)) + lines.append("") + lines.append("[Service]") + lines.append("Type=%s" % rng.choice(["simple", "forking", "notify", "oneshot"])) + flag = rng.choice(["--config", "--listen", "--workers", "--data-dir"]) + lines.append("ExecStart=/%s/%s %s %s" % (rng.choice(["usr/bin", "usr/local/bin", "opt/%s/bin" % app]), + app, flag, + rng.choice([_unix_path(rng), _number(rng)]))) + if rng.random() < 0.5: + lines.append("ExecReload=/bin/kill -HUP $MAINPID") + for k, v in (("Restart", rng.choice(["always", "on-failure", "no"])), + ("RestartSec", _number(rng)), + ("User", rng.choice(["root", "daemon", app.split("-")[1], "nobody"])), + ("Environment", "%s=%s" % (rng.choice(_ENV_VARS), _unix_path(rng))), + ("WorkingDirectory", _unix_path(rng)), + ("LimitNOFILE", str(rng.choice([1024, 4096, 65536])))): + if rng.random() < 0.65: + lines.append("%s=%s" % (k, v)) + lines.append("") + lines.append("[Install]") + lines.append("WantedBy=%s.target" % rng.choice(["multi-user", "default", "graphical"])) + lines.append("") + return lines + + +def _style_editorconfig(rng): + """editorconfig: glob section headers like [*.py] and style knobs.""" + lines = [] + if rng.random() < 0.7: + lines.append("# %s" % _sentence(rng, 4, 8)) + lines.append("root = %s" % rng.choice(["true", "false"])) + lines.append("") + lines.append("[*]") + for k, v in (("charset", rng.choice(["utf-8", "latin1", "utf-16"])), + ("end_of_line", rng.choice(["lf", "crlf"])), + ("insert_final_newline", rng.choice(["true", "false"])), + ("trim_trailing_whitespace", rng.choice(["true", "false"])), + ("indent_style", rng.choice(["space", "tab"]))): + if rng.random() < 0.8: + lines.append("%s = %s" % (k, v)) + exts = rng.sample(_EXTS, rng.randint(2, 4)) + for ext in exts: + lines.append("") + header = rng.choice(["[*.%s]" % ext, + "[{*.%s,*.%s}]" % (ext, rng.choice(_EXTS)), + "[%s/**.%s]" % (_word(rng), ext)]) + lines.append(header) + lines.append("indent_size = %d" % rng.choice([2, 3, 4, 8])) + if rng.random() < 0.5: + lines.append("max_line_length = %d" % rng.choice([79, 88, 100, 120])) + if rng.random() < 0.3: + lines.append("# %s" % _sentence(rng, 3, 7)) + lines.append("") + return lines + + +def _style_gitconfig(rng): + """git-config: [section "subsection"] with tab-indented key = value.""" + indent = rng.choice(["\t", " ", " "]) + lines = [] + sections = rng.randint(3, 5) + for _ in range(sections): + top = rng.choice(["core", "remote", "branch", "alias", "user", "http", + "submodule", "credential", "diff", "fetch"]) + if top in ("remote", "branch", "submodule") or rng.random() < 0.3: + lines.append('[%s "%s"]' % (top, _word(rng))) + else: + lines.append("[%s]" % top) + for _ in range(rng.randint(2, 4)): + pick = rng.random() + if pick < 0.3: + val = _url(rng) + elif pick < 0.5: + val = _unix_path(rng) + elif pick < 0.7: + val = rng.choice(_BOOLS_INI[:4]) + else: + val = _number(rng) + k = rng.choice(_KEY_SUFFIX) + rng.choice(["", rng.choice(_NOUNS).capitalize()]) + lines.append("%s%s = %s" % (indent, k, val)) + if rng.random() < 0.3: + lines.append("%s# %s" % (indent, _sentence(rng, 3, 7))) + lines.append("") + return lines + + +def _style_pythonic(rng): + """setup.cfg / tox.ini / pytest.ini flavor: True/None, comma lists, + multi-line indented list values.""" + lines = [] + kind = rng.randrange(3) + if kind == 0: + lines.append("[metadata]") + lines.append("name = %s-%s" % (rng.choice(_ADJS), rng.choice(_NOUNS))) + lines.append("version = %d.%d.%d" % (rng.randint(0, 4), rng.randint(0, 12), + rng.randint(0, 30))) + if rng.random() < 0.6: + lines.append("description = %s" % _sentence(rng, 4, 9)[:-1]) + lines.append("") + lines.append("[options]") + lines.append("zip_safe = %s" % rng.choice(_BOOLS_PY[:2])) + lines.append("include_package_data = %s" % rng.choice(_BOOLS_PY[:2])) + lines.append("install_requires =") + for _ in range(rng.randint(2, 5)): + lines.append(" %s>=%d.%d" % (rng.choice(_NOUNS), rng.randint(0, 5), + rng.randint(0, 20))) + elif kind == 1: + envs = ["py3%d" % rng.randint(8, 13) for _ in range(rng.randint(2, 4))] + lines.append("[tox]") + lines.append("envlist = %s" % ", ".join(envs + ["lint"])) + lines.append("skipsdist = %s" % rng.choice(_BOOLS_PY[:2])) + lines.append("") + lines.append("[testenv]") + lines.append("deps =") + for _ in range(rng.randint(2, 4)): + lines.append(" %s" % rng.choice(_NOUNS)) + lines.append("commands = pytest {posargs} -%s" % rng.choice(["q", "x", "v"])) + lines.append("setenv =") + lines.append(" %s = %s" % (rng.choice(_ENV_VARS), rng.choice(_BOOLS_PY))) + else: + lines.append("[pytest]") + lines.append("addopts = %s" % " ".join( + rng.sample(["-ra", "--strict-markers", "-q", "--tb=short", + "--maxfail=%d" % rng.randint(1, 5)], rng.randint(2, 3)))) + lines.append("testpaths = %s" % ", ".join( + rng.sample(["tests", "unit", "integration", "functional"], rng.randint(1, 3)))) + lines.append("python_files = test_*.py") + lines.append("filterwarnings =") + lines.append(" %s" % rng.choice(["error", "ignore::DeprecationWarning", + "default::UserWarning"])) + lines.append("") + lines.append("[%s]" % rng.choice(["flake8", "mypy", "isort", "coverage:run", "bdist_wheel"])) + for _ in range(rng.randint(2, 4)): + pick = rng.random() + if pick < 0.35: + val = rng.choice(_BOOLS_PY) + elif pick < 0.7: + val = ", ".join(_word(rng) for _ in range(rng.randint(2, 4))) + else: + val = _number(rng) + lines.append("%s = %s" % (_key(rng).replace("-", "_").replace(".", "_"), val)) + lines.append("") + return lines + + +_STYLES = [ + _style_prose_comments, + _style_spacey_sections, + _style_batchlike, + _style_systemd, + _style_editorconfig, + _style_gitconfig, + _style_pythonic, +] + + +# --------------------------------------------------------------------------- +# Public API. +# --------------------------------------------------------------------------- + +def synth_hard_ini(rng): + """Return one hard-but-genuine INI/config file as ASCII bytes (120B..~3KB).""" + style = rng.choice(_STYLES) + lines = style(rng) + + # Grow small samples by appending extra sections from any style. + text = "\n".join(lines) + while len(text) < 120 or (len(text) < 400 and rng.random() < 0.5): + extra = rng.choice(_STYLES)(rng) + text = text.rstrip("\n") + "\n\n" + "\n".join(extra) + + # Cap at ~3KB on a line boundary so we never cut a line in half. + if len(text) > 3000: + kept = [] + total = 0 + for ln in text.split("\n"): + if total + len(ln) + 1 > 3000: + break + kept.append(ln) + total += len(ln) + 1 + text = "\n".join(kept) + + if not text.endswith("\n"): + text += "\n" + return text.encode("ascii") + + +if __name__ == "__main__": + import random + _rng = random.Random(0) + for _i in range(3): + print(synth_hard_ini(_rng).decode("ascii")) + print("=" * 40) diff --git a/scripts/hard_gen_js_ts.py b/scripts/hard_gen_js_ts.py new file mode 100644 index 0000000..51ec50d --- /dev/null +++ b/scripts/hard_gen_js_ts.py @@ -0,0 +1,621 @@ +"""Synthesizers for "hard boundary" JS/TS training samples. + +This module produces source files that sit near the decision boundary of a +JavaScript-vs-TypeScript classifier (a small Magika-style model that sees the +first 4096 bytes as case-folded word tokens, punctuation runs and brackets). + +- synth_hard_javascript(rng) -> bytes: files that ARE plain JavaScript but + look "typed" (JSDoc annotations, .d.ts-flavored naming, async-heavy ESM, + CommonJS with destructuring/default params). +- synth_hard_typescript(rng) -> bytes: files that ARE TypeScript but are + almost entirely plain JS (sparse type touches, no imports, config-style + default exports, a barely-typed class). + +All randomness flows through the provided random.Random instance so output +is reproducible. Stdlib only, ASCII only. +""" + +# --------------------------------------------------------------------------- +# Word pools and small helpers +# --------------------------------------------------------------------------- + +_NOUNS = [ + "user", "cache", "token", "session", "record", "widget", "payload", + "bucket", "worker", "queue", "batch", "route", "config", "schema", + "metric", "report", "invoice", "order", "product", "account", "profile", + "cluster", "shard", "cursor", "stream", "buffer", "handle", "policy", + "ticket", "vendor", "region", "channel", "manifest", "snapshot", + "registry", "catalog", "segment", "quota", "license", "webhook", +] + +_VERBS = [ + "load", "save", "fetch", "parse", "build", "merge", "split", "filter", + "resolve", "reject", "encode", "decode", "flush", "sync", "track", + "apply", "reduce", "collect", "emit", "drain", "hydrate", "validate", + "normalize", "serialize", "restore", "publish", "consume", "rotate", + "prune", "index", "attach", "detach", "compare", "clone", "format", +] + +_ADJS = [ + "active", "stale", "pending", "remote", "local", "shared", "primary", + "backup", "hidden", "compact", "internal", "legacy", "draft", "final", + "partial", "nested", "cached", "sorted", "unique", "verbose", +] + +_STR_WORDS = [ + "alpha", "beta", "gamma", "delta", "omega", "north", "south", "east", + "west", "ready", "closed", "open", "retry", "fatal", "warn", "info", + "debug", "trace", "green", "amber", "coral", "ivory", "slate", "onyx", +] + +_COMMENT_BITS = [ + "keep this in sync with the server side", + "tuned by hand, do not change casually", + "falls back to defaults when the flag is off", + "used by the nightly batch job", + "cheap enough to run on every request", + "see the runbook for the failure modes", + "order matters here", + "this mirrors the upstream behaviour", + "avoids an extra allocation in the hot path", + "intentionally permissive", + "the retry budget is shared across workers", + "measured on the staging cluster", +] + + +def _cap(w): + return w[:1].upper() + w[1:] + + +def _camel(rng, parts=2): + ws = [rng.choice(_VERBS)] + [rng.choice(_NOUNS) for _ in range(parts - 1)] + return ws[0] + "".join(_cap(w) for w in ws[1:]) + + +def _noun_camel(rng, parts=2): + ws = [rng.choice(_ADJS if rng.random() < 0.4 else _NOUNS)] + ws += [rng.choice(_NOUNS) for _ in range(parts - 1)] + return ws[0] + "".join(_cap(w) for w in ws[1:]) + + +def _pascal(rng, parts=2): + return "".join(_cap(rng.choice(_NOUNS)) for _ in range(parts)) + + +def _const_name(rng): + return "_".join(rng.choice(_NOUNS).upper() for _ in range(rng.randint(1, 2))) + + +def _num(rng): + kind = rng.random() + if kind < 0.3: + return str(rng.randint(0, 9)) + if kind < 0.6: + return str(rng.choice([16, 32, 64, 100, 128, 250, 256, 500, 1000, 1024, 3600, 8080])) + if kind < 0.8: + return str(rng.randint(10, 99999)) + return "%d.%d" % (rng.randint(0, 99), rng.randint(1, 99)) + + +def _str_val(rng): + kind = rng.random() + if kind < 0.35: + return rng.choice(_STR_WORDS) + if kind < 0.55: + return rng.choice(_STR_WORDS) + "-" + rng.choice(_STR_WORDS) + if kind < 0.75: + return "/".join(["api", rng.choice(_NOUNS) + "s", rng.choice(_STR_WORDS)]) + if kind < 0.9: + return rng.choice(_NOUNS) + "." + rng.choice(["json", "yaml", "txt", "log", "csv"]) + return "https://" + rng.choice(_STR_WORDS) + ".example.com/" + rng.choice(_NOUNS) + + +def _line_comment(rng): + return "// " + rng.choice(_COMMENT_BITS) + + +def _maybe_comment(rng, p=0.4): + return _line_comment(rng) + "\n" if rng.random() < p else "" + + +def _target_len(rng): + base = rng.choice([220, 380, 600, 900, 1300, 1900, 2600, 3300]) + return base + rng.randint(-40, 160) + + +def _uniq(rng, maker, used): + """Draw a fresh identifier not previously used in this file.""" + name = maker(rng) + for _ in range(8): + if name not in used: + break + name = maker(rng) + if name in used: + name += str(rng.randint(2, 99)) + used.add(name) + return name + + +def _distinct_pair(rng, maker): + a = maker(rng) + b = maker(rng) + while b == a: + b = maker(rng) + return a, b + + +def _body_stmts(rng, indent=" "): + """A few plain-JS statements usable inside any function body.""" + out = [] + n = rng.randint(1, 3) + declared = set() + for _ in range(n): + k = rng.random() + a = _uniq(rng, _noun_camel, declared) + b = _noun_camel(rng) + while b == a: + b = _noun_camel(rng) + if k < 0.25: + out.append('%sconst %s = %s ?? "%s";' % (indent, a, b, _str_val(rng))) + elif k < 0.5: + out.append("%sif (!%s) {\n%s return %s;\n%s}" % ( + indent, a, indent, rng.choice(["null", "[]", "false", "undefined"]), indent)) + elif k < 0.75: + out.append("%sconst %s = %s.map((item) => item.%s).filter(Boolean);" % ( + indent, a, b + "s", rng.choice(_NOUNS))) + else: + out.append("%slet %s = %s;" % (indent, a, _num(rng))) + return "\n".join(out) + + +def _assemble(rng, header, block_fn, target): + parts = [header] if header else [] + size = len(header) + guard = 0 + while (size < target or size < 150) and guard < 60: + block = block_fn(rng) + parts.append(block) + size += len(block) + 1 + guard += 1 + text = "\n".join(p for p in parts if p) + "\n" + if len(text) > 4000: + cut = text[:4000] + idx = cut.rfind("\n}") + if idx > 150: + text = cut[: idx + 2] + "\n" + return text + + +# --------------------------------------------------------------------------- +# Hard JavaScript sub-styles (valid JS that smells like TS) +# --------------------------------------------------------------------------- + +def _js_jsdoc_module(rng): + """ESM classes and functions saturated with JSDoc type annotations.""" + ty = _pascal(rng) + mod = rng.choice(["node:crypto", "node:path", "node:url", "./" + rng.choice(_NOUNS) + ".js"]) + imp = rng.choice(["createHash", "resolve", "fileURLToPath", _camel(rng)]) + header = 'import { %s } from "%s";\n' % (imp, mod) + header += "\n/**\n * @typedef {Object} %s\n" % ty + for _ in range(rng.randint(2, 4)): + header += " * @property {%s} %s\n" % ( + rng.choice(["string", "number", "boolean", "string[]", "number|null"]), + _noun_camel(rng, 1)) + header += " */\n\n/** @type {Map} */\nconst %s = new Map();\n" % ( + ty, _noun_camel(rng)) + used = {ty} + + def block(rng): + k = rng.random() + fn = _uniq(rng, _camel, used) + p1, p2 = _distinct_pair(rng, lambda r: _noun_camel(r, 1)) + if k < 0.45: + doc = "/**\n * @param {string} %s\n * @param {number} [%s]\n * @returns {%s|undefined}\n */" % (p1, p2, ty) + return "%s\n%sexport function %s(%s, %s = %s) {\n%s\n return undefined;\n}\n" % ( + doc, _maybe_comment(rng), fn, p1, p2, _num(rng), _body_stmts(rng)) + if k < 0.75: + cls = _uniq(rng, _pascal, used) + f1 = _noun_camel(rng, 1) + return ( + "export class %s {\n" + " /** @param {%s} options */\n" + " constructor(options) {\n" + " /** @type {%s} */\n" + " this.%s = options;\n" + " /** @type {number} */\n" + " this.%s = %s;\n" + " }\n\n" + " /** @returns {boolean} */\n" + " %s() {\n%s\n return true;\n }\n" + "}\n" % (cls, ty, ty, f1, _noun_camel(rng, 1), _num(rng), + _camel(rng), _body_stmts(rng, " ")) + ) + cn = _uniq(rng, _const_name, used) + return "/** @type {readonly string[]} */\nconst %s = [%s];\n" % ( + cn, ", ".join('"%s"' % _str_val(rng) for _ in range(rng.randint(2, 4)))) + + return _assemble(rng, header, block, _target_len(rng)) + + +def _js_dts_flavored(rng): + """Plain JS with declaration-file flavored naming (IThing, TResult, enums).""" + kind = _pascal(rng, 1) + "Kind" + members = [_cap(rng.choice(_STR_WORDS)) for _ in range(rng.randint(3, 5))] + header = _maybe_comment(rng, 0.6) + header += "export const %s = Object.freeze({\n" % kind + header += "".join(" %s: %d,\n" % (m, i) for i, m in enumerate(dict.fromkeys(members))) + header += "});\n" + used = {kind} + + def block(rng): + k = rng.random() + iface = _uniq(rng, lambda r: "I" + _pascal(r), used) + if k < 0.35: + return ( + "%sexport class %s {\n" + " constructor(kind, value) {\n" + " this.kind = kind;\n" + " this.value = value;\n" + " }\n\n" + " %s() {\n return this.kind === %s.%s;\n }\n" + "}\n" % (_maybe_comment(rng), iface, _camel(rng), kind, + rng.choice(members)) + ) + if k < 0.65: + tname = _uniq(rng, lambda r: "T" + _pascal(r, 1), used) + return ( + "export function is%s(value) {\n" + ' return value != null && typeof value.%s === "%s";\n' + "}\n\n" + "export function assert%s(value) {\n" + " if (!is%s(value)) {\n" + ' throw new TypeError("expected %s");\n' + " }\n return value;\n}\n" % ( + tname, _noun_camel(rng, 1), + rng.choice(["string", "number", "function"]), + tname, tname, tname.lower()) + ) + rec = _uniq(rng, lambda r: _pascal(r) + "Map", used) + return "export const %s = {\n%s\n};\n" % ( + rec, + "\n".join(' %s: "%s",' % (_noun_camel(rng, 1), _str_val(rng)) + for _ in range(rng.randint(2, 4)))) + + return _assemble(rng, header, block, _target_len(rng)) + + +def _js_async_heavy(rng): + """ESM module dominated by async/await, promises and async generators.""" + base = _noun_camel(rng) + header = _maybe_comment(rng, 0.5) + header += 'const %s = "%s";\nconst %s = %s;\n' % ( + base + "Url", _str_val(rng), _noun_camel(rng, 1) + "Limit", _num(rng)) + used = {base + "Url"} + + def block(rng): + k = rng.random() + fn = _uniq(rng, _camel, used) + if k < 0.35: + return ( + "export async function %s(id, signal) {\n" + " const res = await fetch(`${%s}/${id}`, { signal });\n" + " if (!res.ok) {\n" + " throw new Error(`%s failed: ${res.status}`);\n" + " }\n" + " const data = await res.json();\n%s\n" + " return data;\n" + "}\n" % (fn, base + "Url", fn, _body_stmts(rng)) + ) + if k < 0.6: + return ( + "export async function* %s(ids) {\n" + " for (const id of ids) {\n" + " %s\n" + " yield await %s(id);\n" + " }\n" + "}\n" % (fn, _line_comment(rng), _camel(rng)) + ) + if k < 0.85: + a, b = _distinct_pair(rng, _noun_camel) + return ( + "export async function %s(items) {\n" + " const %s = await Promise.all(items.map(async (item) => {\n" + " const %s = await item.%s();\n" + " return %s ?? %s;\n" + " }));\n" + " return %s.filter((x) => x !== null);\n" + "}\n" % (fn, a, b, _camel(rng), b, _num(rng), a) + ) + return ( + "async function %s(ms) {\n" + " await new Promise((resolve) => setTimeout(resolve, ms));\n" + "}\n" % fn + ) + + return _assemble(rng, header, block, _target_len(rng)) + + +def _js_commonjs(rng): + """CommonJS with destructured requires, default params, module.exports.""" + mods = rng.sample(["fs/promises", "path", "os", "util", "events", "url"], 2) + header = '"use strict";\n\n' if rng.random() < 0.7 else "" + r1, r2 = _distinct_pair(rng, _camel) + header += 'const { %s, %s } = require("%s");\n' % (r1, r2, mods[0]) + header += 'const %s = require("%s");\n' % (mods[1].split("/")[0], mods[1]) + exported = [] + used = {r1, r2} + + def block(rng): + k = rng.random() + fn = _uniq(rng, _camel, used) + exported.append(fn) + p1, p2 = _distinct_pair(rng, lambda r: _noun_camel(r, 1)) + if k < 0.4: + d1 = _uniq(rng, lambda r: _noun_camel(r, 1), {p1, p2}) + d2 = _uniq(rng, lambda r: _noun_camel(r, 1), {p1, p2, d1}) + return ( + '%sfunction %s(%s, %s = %s, prefix = "%s") {\n' + " const { %s, %s = [] } = %s;\n%s\n" + " return { %s, prefix };\n" + "}\n" % (_maybe_comment(rng), fn, p1, p2, _num(rng), _str_val(rng), + d1, d2, p1, _body_stmts(rng), p2) + ) + if k < 0.7: + return ( + "function %s({ %s = %s, %s = \"%s\" } = {}) {\n%s\n" + " return %s;\n" + "}\n" % (fn, p1, _num(rng), p2, _str_val(rng), + _body_stmts(rng), p1) + ) + exported.pop() + cn = _uniq(rng, _const_name, used) + exported.append(cn) + return "const %s = %s; %s\n" % (cn, _num(rng), _line_comment(rng)) + + text = _assemble(rng, header, block, _target_len(rng)) + names = list(dict.fromkeys(exported))[:6] + text += "\nmodule.exports = { %s };\n" % ", ".join(names) + return text + + +# --------------------------------------------------------------------------- +# Hard TypeScript sub-styles (valid TS that is ~95 percent plain JS) +# --------------------------------------------------------------------------- + +def _ts_sparse_types(rng): + """Mostly plain JS; exactly a couple of tiny type touches sprinkled in.""" + touches = rng.sample(["param", "interface", "asconst", "generic", "satisfies"], 2) + header = _maybe_comment(rng, 0.5) + if "interface" in touches: + iface = _pascal(rng) + header += "interface %s {\n %s: string;\n %s: number;\n}\n\n" % ( + iface, _noun_camel(rng, 1), _noun_camel(rng, 1)) + else: + iface = None + + used = {"param": False, "generic": False, "asconst": False, + "satisfies": False, "iface": False} + names = {iface} if iface else set() + + def block(rng): + k = rng.random() + fn = _uniq(rng, _camel, names) + p1 = _noun_camel(rng, 1) + if "param" in touches and not used["param"]: + used["param"] = True + return ( + "export function %s(%s: string, options = {}) {\n%s\n" + " return %s.trim();\n" + "}\n" % (fn, p1, _body_stmts(rng), p1) + ) + if "generic" in touches and not used["generic"]: + used["generic"] = True + arr = _uniq(rng, lambda r: _noun_camel(r, 1) + "s", names) + return ( + "const %s: Array = [];\n\n" + "export function %s(value) {\n" + " %s.push(value | 0);\n" + " return %s.length;\n" + "}\n" % (arr, fn, arr, arr) + ) + if "asconst" in touches and not used["asconst"]: + used["asconst"] = True + return "const %s = [%s] as const;\n" % ( + _uniq(rng, _const_name, names), + ", ".join('"%s"' % _str_val(rng) for _ in range(rng.randint(2, 4)))) + if "satisfies" in touches and not used["satisfies"]: + used["satisfies"] = True + k1, k2 = _distinct_pair(rng, lambda r: _noun_camel(r, 1)) + return ( + "export const %s = {\n %s: %s,\n %s: \"%s\",\n} satisfies Record;\n" % ( + _uniq(rng, _noun_camel, names), k1, _num(rng), + k2, _str_val(rng)) + ) + if iface and not used["iface"]: + used["iface"] = True + return ( + "export function %s(entry: %s) {\n" + " return `${entry.%s}`;\n" + "}\n" % (fn, iface, _noun_camel(rng, 1)) + ) + if k < 0.5: + return ( + "%sexport function %s(%s, limit = %s) {\n%s\n" + " return %s;\n" + "}\n" % (_maybe_comment(rng), fn, p1, _num(rng), + _body_stmts(rng), p1) + ) + return ( + "function %s(list) {\n" + " return list.reduce((acc, item) => acc + (item.%s || 0), 0);\n" + "}\n" % (fn, _noun_camel(rng, 1)) + ) + + return _assemble(rng, header, block, _target_len(rng)) + + +def _ts_no_imports(rng): + """Standalone TS: no imports at all, a lone type alias, plain helpers.""" + alias = _pascal(rng, 1) + "Id" + header = _maybe_comment(rng, 0.5) + header += "type %s = string;\n" % alias + used = {alias} + + def block(rng): + k = rng.random() + fn = _uniq(rng, _camel, used) + p1 = _noun_camel(rng, 1) + if k < 0.3: + return ( + "export function %s(id: %s) {\n" + ' return id.startsWith("%s") ? id.slice(%s) : id;\n' + "}\n" % (fn, alias, rng.choice(_STR_WORDS), _num(rng)) + ) + if k < 0.6: + return ( + "%sexport function %s(%s, fallback = %s) {\n%s\n" + " return %s ?? fallback;\n" + "}\n" % (_maybe_comment(rng), fn, p1, _num(rng), + _body_stmts(rng), p1) + ) + if k < 0.8: + return ( + "export const %s = (a, b) => {\n" + " return a.%s === b.%s ? 0 : a.%s < b.%s ? -1 : 1;\n" + "};\n" % ((fn,) + (_noun_camel(rng, 1),) * 4) + ) + return "const %s = %s; %s\n" % ( + _uniq(rng, _const_name, used), _num(rng), _line_comment(rng)) + + return _assemble(rng, header, block, _target_len(rng)) + + +def _ts_config_default(rng): + """Config-style TS: one big `export default { ... }` object literal.""" + header = _maybe_comment(rng, 0.7) + tail = rng.random() + lines = [header + "export default {"] + n = rng.randint(4, 9) + seen = set() + for _ in range(n): + key = _uniq(rng, lambda r: _noun_camel(r, 1), seen) + k = rng.random() + if k < 0.3: + lines.append(' %s: "%s",' % (key, _str_val(rng))) + elif k < 0.5: + lines.append(" %s: %s," % (key, _num(rng))) + elif k < 0.65: + lines.append(" %s: %s," % (key, rng.choice(["true", "false"]))) + elif k < 0.85: + inner = ", ".join('"%s"' % _str_val(rng) for _ in range(rng.randint(2, 3))) + lines.append(" %s: [%s]," % (key, inner)) + else: + lines.append(" %s: {" % key) + inner_seen = set() + for _ in range(rng.randint(2, 3)): + ikey = _uniq(rng, lambda r: _noun_camel(r, 1), inner_seen) + lines.append(' %s: "%s",' % (ikey, _str_val(rng))) + lines.append(" " + _line_comment(rng)) + lines.append(" },") + if tail < 0.4: + lines.append("} satisfies Record;") + elif tail < 0.7: + lines.append("} as const;") + else: + lines[0] = header + "const config: { [key: string]: unknown } = {" + lines.append("};\n\nexport default config;") + text = "\n".join(lines) + "\n" + while len(text) < 150: + text += "\n" + _line_comment(rng) + "\n" + return text + + +def _ts_barely_typed_class(rng): + """A plain-looking class with a single typed field or return annotation.""" + cls = _pascal(rng) + field = _noun_camel(rng, 1) + header = _maybe_comment(rng, 0.5) + header += ( + "export class %s {\n" + " private %s: Map = new Map();\n" + " options;\n\n" + " constructor(options = {}) {\n" + " this.options = { ...options };\n" + " }\n" % (cls, field) + ) + used = {field, "options"} + + def block(rng): + k = rng.random() + m = _uniq(rng, _camel, used) + p1 = _noun_camel(rng, 1) + if k < 0.3: + return ( + "\n %s(%s): void {\n" + " this.%s.set(%s, (this.%s.get(%s) || 0) + 1);\n" + " }\n" % (m, p1, field, p1, field, p1) + ) + if k < 0.6: + return ( + "\n %s(%s, fallback = %s) {\n%s\n" + " return this.%s.get(%s) ?? fallback;\n" + " }\n" % (m, p1, _num(rng), _body_stmts(rng, " "), + field, p1) + ) + if k < 0.8: + return ( + "\n get %s() {\n return this.%s.size;\n }\n" % ( + _uniq(rng, lambda r: _noun_camel(r, 1), used), field) + ) + return ( + "\n %s\n %s() {\n this.%s.clear();\n }\n" % ( + _line_comment(rng), m, field) + ) + + text = _assemble(rng, header, block, max(150, _target_len(rng) - 120)) + text = text.rstrip("\n") + "\n}\n" + helper = _camel(rng) + text += "\nexport function %s() {\n return new %s();\n}\n" % (helper, cls) + return text + + +# --------------------------------------------------------------------------- +# Public API +# --------------------------------------------------------------------------- + +def synth_hard_javascript(rng): + """Return bytes of a plain-JavaScript file that leans toward TypeScript.""" + style = rng.choice([ + _js_jsdoc_module, + _js_dts_flavored, + _js_async_heavy, + _js_commonjs, + ]) + return style(rng).encode("ascii") + + +def synth_hard_typescript(rng): + """Return bytes of a TypeScript file that leans toward plain JavaScript.""" + style = rng.choice([ + _ts_sparse_types, + _ts_no_imports, + _ts_config_default, + _ts_barely_typed_class, + ]) + return style(rng).encode("ascii") + + +if __name__ == "__main__": + import random + + rng = random.Random(0) + sep = "=" * 40 + for label, fn in (("hard JavaScript", synth_hard_javascript), + ("hard TypeScript", synth_hard_typescript)): + for i in range(2): + data = fn(rng) + print(sep) + print("%s sample %d (%d bytes)" % (label, i + 1, len(data))) + print(sep) + print(data.decode("ascii")) diff --git a/scripts/hard_gen_tsx_verilog.py b/scripts/hard_gen_tsx_verilog.py new file mode 100644 index 0000000..2096a0f --- /dev/null +++ b/scripts/hard_gen_tsx_verilog.py @@ -0,0 +1,454 @@ +"""Synthesize "hard" training samples for a byte-level source-language classifier. + +Targets two known failure clusters of a small Magika-distilled model that sees +the first 4096 bytes tokenized into case-folded words, punctuation runs, and +brackets: + + * TSX React components dominated by JSX markup get misread as XML, so + synth_hard_tsx() emits markup-heavy .tsx sources with only a thin layer of + TypeScript (an import, a typed props interface, a small hook call). + * SystemVerilog with object-oriented testbench code gets misread as Dart or + C++, so synth_hard_verilog() emits class/typedef/interface-heavy .sv text + plus classic synthesizable module blocks with always_ff and <= assigns. + +Both generators draw every random decision from the caller-supplied +random.Random instance and return 200 B .. ~4 KB of pure-ASCII source bytes. +""" + +# -------------------------------------------------------------------------- +# word pools +# -------------------------------------------------------------------------- + +_UI_WORDS = [ + "hero", "panel", "card", "grid", "order", "user", "profile", "banner", + "sidebar", "modal", "badge", "avatar", "invoice", "ticket", "product", + "cart", "menu", "footer", "nav", "search", "filter", "result", + "session", "account", "report", "chart", "widget", "notice", "alert", + "detail", "summary", "signup", "login", "settings", "theme", "layout", + "preview", "gallery", "comment", "review", "wizard", "stepper", +] + +_HW_WORDS = [ + "packet", "fifo", "uart", "axi", "apb", "dma", "cache", "fetch", + "decode", "issue", "retire", "flush", "burst", "beat", "lane", + "frame", "header", "payload", "parity", "crc", "timer", "counter", + "arbiter", "bridge", "router", "buffer", "queue", "stage", "core", + "link", "spi", "ctrl", "status", "irq", "sync", "grant", "credit", + "phase", "scoreboard", "monitor", "driver", "agent", "sequencer", +] + +_FILLER_WORDS = [ + "latest", "pending", "active", "archived", "primary", "secondary", + "remote", "local", "shared", "global", "compact", "expanded", + "verified", "draft", "stable", "legacy", "custom", "default", +] + + +def _cap(w): + return w[0].upper() + w[1:] + + +def _pascal(rng, pool, n=2): + return "".join(_cap(w) for w in rng.sample(pool, n)) + + +def _camel(rng, pool, n=2): + ws = rng.sample(pool, n) + return ws[0] + "".join(_cap(w) for w in ws[1:]) + + +def _kebab(rng, pool, n=2): + return "-".join(rng.sample(pool, n)) + + +def _snake(rng, pool, n=2): + return "_".join(rng.sample(pool, n)) + + +def _phrase(rng, n): + return " ".join(rng.choice(_FILLER_WORDS + _UI_WORDS) for _ in range(n)) + + +# -------------------------------------------------------------------------- +# TSX sub-styles +# -------------------------------------------------------------------------- + +def _tsx_page(rng): + """Sub-style 1: nested page-layout component (header/nav/sections/footer).""" + comp = _pascal(rng, _UI_WORDS) + base = _kebab(rng, _UI_WORDS) + title_prop = rng.choice(["title", "heading", "caption", "label"]) + flag_prop = rng.choice(["compact", "dark", "wide", "sticky", "inverted"]) + state = rng.choice(["open", "expanded", "visible", "pinned"]) + setter = "set" + _cap(state) + + L = [] + L.append('import React, { useState } from "react";') + L.append("") + L.append("interface %sProps {" % comp) + L.append(" %s: string;" % title_prop) + L.append(" %s?: boolean;" % flag_prop) + L.append("}") + L.append("") + L.append("export default function %s({ %s, %s }: %sProps) {" % (comp, title_prop, flag_prop, comp)) + L.append(" const [%s, %s] = useState(%s);" % (state, setter, rng.choice(["false", "true"]))) + L.append(" return (") + L.append('
' % base) + L.append('
' % base) + L.append('

{%s}

' % (_kebab(rng, _UI_WORDS), title_prop)) + L.append(' ") + L.append(' ") + L.append("
") + for _ in range(rng.randint(1, 4)): + sec = _kebab(rng, _UI_WORDS) + L.append('
' % (sec, rng.choice(_UI_WORDS), rng.randint(1, 99))) + L.append("

%s

" % _cap(_phrase(rng, 2))) + L.append("

%s.

" % _cap(_phrase(rng, rng.randint(4, 9)))) + if rng.random() < 0.7: + img = rng.choice(_UI_WORDS) + L.append(' %s' + % (img, rng.randint(1, 40), img, rng.choice([320, 480, 640]), rng.choice([120, 180, 240]))) + if rng.random() < 0.5: + L.append('
') + L.append("
") + L.append('
' % base) + L.append(" %s" % _cap(_phrase(rng, 3))) + L.append(' v{%d}.{%d}' % (rng.randint(0, 9), rng.randint(0, 20))) + L.append("
") + L.append("
") + L.append(" );") + L.append("}") + return "\n".join(L) + "\n" + + +def _tsx_list(rng): + """Sub-style 2: list-rendering component driven by rows.map().""" + row_t = _pascal(rng, _UI_WORDS) + "Row" + comp = _pascal(rng, _UI_WORDS) + "List" + base = _kebab(rng, _UI_WORDS) + rows, row = rng.choice([("rows", "row"), ("items", "item"), + ("entries", "entry"), ("records", "record")]) + numf = rng.choice(["count", "total", "score", "qty"]) + strf = rng.choice(["label", "name", "title", "slug"]) + + L = [] + L.append('import React from "react";') + L.append("") + L.append("interface %s {" % row_t) + L.append(" id: number;") + L.append(" %s: string;" % strf) + L.append(" %s: number;" % numf) + L.append("}") + L.append("") + L.append("interface %sProps {" % comp) + L.append(" %s: %s[];" % (rows, row_t)) + L.append(" onSelect?: (id: number) => void;") + L.append("}") + L.append("") + L.append("export function %s({ %s, onSelect }: %sProps) {" % (comp, rows, comp)) + L.append(" const [active, setActive] = React.useState(%d);" % rng.randint(0, 9)) + L.append(" return (") + L.append('
    ' % (base, _kebab(rng, _UI_WORDS))) + L.append(" {%s.map((%s) => (" % (rows, row)) + L.append(" setActive(%s.id)}" % row) + L.append(" >") + L.append(' {%s.%s}' % (_kebab(rng, _UI_WORDS), row, strf)) + L.append(' {%s.%s}' % (rng.choice(_UI_WORDS), row, numf)) + if rng.random() < 0.75: + L.append(' ") + if rng.random() < 0.5: + L.append(' {%s.%s}' + % (row, strf, row, strf)) + L.append(" ") + L.append(" ))}") + if rng.random() < 0.6: + L.append(" {%s.length === 0 && (" % rows) + L.append('
  • %s.
  • ' % (base, _cap(_phrase(rng, 3)))) + L.append(" )}") + L.append("
") + L.append(" );") + L.append("}") + return "\n".join(L) + "\n" + + +def _tsx_form(rng): + """Sub-style 3: form component with labeled inputs and a submit handler.""" + comp = _pascal(rng, _UI_WORDS) + "Form" + base = _kebab(rng, _UI_WORDS) + field = rng.choice(["email", "name", "query", "token", "phone"]) + setter = "set" + _cap(field) + plan = rng.choice(["plan", "tier", "mode", "region"]) + + L = [] + L.append('import React, { useState } from "react";') + L.append("") + L.append("interface %sProps {" % comp) + L.append(" onSubmit: (value: string) => void;") + L.append(" placeholder?: string;") + L.append("}") + L.append("") + L.append("export const %s = ({ onSubmit, placeholder }: %sProps) => {" % (comp, comp)) + L.append(' const [%s, %s] = useState("");' % (field, setter)) + L.append(" return (") + L.append('
{ e.preventDefault(); onSubmit(%s); }}>' % (base, field)) + L.append("
") + L.append(" %s" % _cap(_phrase(rng, 2))) + L.append(' ' % (field, _cap(field))) + L.append(" %s(e.target.value)}" % setter) + L.append(" placeholder={placeholder}") + L.append(" maxLength={%d}" % rng.choice([32, 64, 128, 256])) + L.append(" required") + L.append(" />") + L.append(' ") + if rng.random() < 0.6: + L.append('