kpihx-lab 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,33 @@
1
+ Metadata-Version: 2.4
2
+ Name: kpihx-lab
3
+ Version: 0.2.0
4
+ Summary: KpihX scientific and AI exploration environment (rapid scripts, plotting, numerics, hardware-accelerated prototyping)
5
+ Requires-Python: >=3.12
6
+ Requires-Dist: numpy>=2.5.2
7
+ Requires-Dist: scipy>=1.18.1
8
+ Requires-Dist: matplotlib>=3.11.1
9
+ Requires-Dist: seaborn>=0.13.0
10
+ Requires-Dist: ipykernel>=7.4.0
11
+ Requires-Dist: scikit-learn>=1.9.1
12
+ Requires-Dist: kagglehub[hf-datasets,pandas-datasets,polars-datasets]>=1.0.2
13
+ Requires-Dist: polars>=2.0.0rc2
14
+ Requires-Dist: pandas>=3.0.6
15
+ Requires-Dist: typer>=0.27.2
16
+ Requires-Dist: rich>=15.0.0
17
+ Provides-Extra: cpu
18
+ Requires-Dist: torch>=2.8; extra == "cpu"
19
+ Requires-Dist: torchvision>=0.23; extra == "cpu"
20
+ Provides-Extra: xpu
21
+ Requires-Dist: torch>=2.8; extra == "xpu"
22
+ Requires-Dist: torchvision>=0.23; extra == "xpu"
23
+ Requires-Dist: transformers>=4.57; extra == "xpu"
24
+ Requires-Dist: accelerate>=1.10.1; extra == "xpu"
25
+ Requires-Dist: huggingface_hub>=0.34.4; extra == "xpu"
26
+ Requires-Dist: safetensors>=0.6.2; extra == "xpu"
27
+ Provides-Extra: cuda
28
+ Requires-Dist: torch>=2.8; extra == "cuda"
29
+ Requires-Dist: torchvision>=0.23; extra == "cuda"
30
+ Requires-Dist: transformers>=4.57; extra == "cuda"
31
+ Requires-Dist: accelerate>=1.10.1; extra == "cuda"
32
+ Requires-Dist: huggingface_hub>=0.34.4; extra == "cuda"
33
+ Requires-Dist: safetensors>=0.6.2; extra == "cuda"
@@ -0,0 +1,116 @@
1
+ [project]
2
+ name = "kpihx-lab"
3
+ version = "0.2.0"
4
+ description = "KpihX scientific and AI exploration environment (rapid scripts, plotting, numerics, hardware-accelerated prototyping)"
5
+ requires-python = ">=3.12"
6
+
7
+ # Base scientific stack. Kept deliberately small: this environment is loaded on
8
+ # every exploratory script, so it stays fast to sync and easy to reason about.
9
+ # Everything heavier is an optional profile below.
10
+ dependencies = [
11
+ "numpy>=2.5.2",
12
+ "scipy>=1.18.1",
13
+ "matplotlib>=3.11.1",
14
+ "seaborn>=0.13.0",
15
+ # In base so make kernel works on a bare sync.
16
+ "ipykernel>=7.4.0",
17
+ "scikit-learn>=1.9.1",
18
+ "kagglehub[hf-datasets,pandas-datasets,polars-datasets]>=1.0.2",
19
+ "polars>=2.0.0rc2",
20
+ "pandas>=3.0.6",
21
+ "typer>=0.27.2",
22
+ "rich>=15.0.0",
23
+ ]
24
+
25
+ # ---------------------------------------------------------------------------
26
+ # Optional profiles: hardware axes and domain axes are separate on purpose
27
+ # ---------------------------------------------------------------------------
28
+ # Hardware profiles are mutually exclusive: a machine gets exactly one torch
29
+ # backend. Domain profiles stack freely on top.
30
+ #
31
+ # Usage: bare sync = base only, plus exactly one hardware backend.
32
+ # uv sync base numerics only
33
+ # uv sync --extra cpu + CPU torch
34
+ # uv sync --extra xpu + Intel Arc (XPU) torch
35
+ # uv sync --extra cuda + NVIDIA CUDA torch
36
+ [project.optional-dependencies]
37
+ cpu = [
38
+ "torch>=2.8",
39
+ "torchvision>=0.23",
40
+ ]
41
+ xpu = [
42
+ "torch>=2.8",
43
+ "torchvision>=0.23",
44
+ "transformers>=4.57",
45
+ "accelerate>=1.10.1",
46
+ "huggingface_hub>=0.34.4",
47
+ "safetensors>=0.6.2",
48
+ ]
49
+ cuda = [
50
+ "torch>=2.8",
51
+ "torchvision>=0.23",
52
+ "transformers>=4.57",
53
+ "accelerate>=1.10.1",
54
+ "huggingface_hub>=0.34.4",
55
+ "safetensors>=0.6.2",
56
+ ]
57
+
58
+ [project.scripts]
59
+ lab = "lab.cli:app"
60
+
61
+ [tool.uv]
62
+ package = true
63
+ # On Intel Arc, this entry makes the XPU wheels rank correctly against PyPI
64
+ # during resolution. Removing it is how PyTorch silently resolves to a CUDA
65
+ # build and the model ends up on the CPU. Rationale and full doctrine:
66
+ # k-ai/references/pyproject-hardware.md, template: AI/nobg/pyproject.toml.
67
+ index-strategy = "unsafe-best-match"
68
+ prerelease = "allow"
69
+ # One accelerator backend per environment, never a mixture.
70
+ conflicts = [
71
+ [{ extra = "cpu" }, { extra = "xpu" }, { extra = "cuda" }],
72
+ ]
73
+
74
+ # ---------------------------------------------------------------------------
75
+ # PyTorch indexes
76
+ # ---------------------------------------------------------------------------
77
+ # Index flags mirror the verified k-nobg template exactly. `explicit = true`
78
+ # keeps an index out of general resolution so the base numeric workflow is
79
+ # unaffected; the XPU index is left non-explicit on purpose, that combination is
80
+ # the one measured working on this machine.
81
+ [[tool.uv.index]]
82
+ name = "pytorch-cpu"
83
+ url = "https://download.pytorch.org/whl/cpu"
84
+ explicit = true
85
+
86
+ [[tool.uv.index]]
87
+ name = "pytorch-xpu"
88
+ url = "https://download.pytorch.org/whl/xpu"
89
+
90
+ [[tool.uv.index]]
91
+ name = "pytorch-cuda"
92
+ url = "https://download.pytorch.org/whl/cu126"
93
+ explicit = true
94
+
95
+ [tool.uv.sources]
96
+ # This binding is what actually selects the accelerator.
97
+ torch = [
98
+ { index = "pytorch-cpu", extra = "cpu" },
99
+ { index = "pytorch-xpu", extra = "xpu" },
100
+ { index = "pytorch-cuda", extra = "cuda" },
101
+ ]
102
+ torchvision = [
103
+ { index = "pytorch-cpu", extra = "cpu" },
104
+ { index = "pytorch-xpu", extra = "xpu" },
105
+ { index = "pytorch-cuda", extra = "cuda" },
106
+ ]
107
+
108
+ # ---------------------------------------------------------------------------
109
+ # Development
110
+ # ---------------------------------------------------------------------------
111
+ [tool.ruff]
112
+ line-length = 100
113
+ target-version = "py312"
114
+
115
+ [tool.ruff.lint]
116
+ select = ["E", "F", "W", "I", "UP", "B", "ISC"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,33 @@
1
+ Metadata-Version: 2.4
2
+ Name: kpihx-lab
3
+ Version: 0.2.0
4
+ Summary: KpihX scientific and AI exploration environment (rapid scripts, plotting, numerics, hardware-accelerated prototyping)
5
+ Requires-Python: >=3.12
6
+ Requires-Dist: numpy>=2.5.2
7
+ Requires-Dist: scipy>=1.18.1
8
+ Requires-Dist: matplotlib>=3.11.1
9
+ Requires-Dist: seaborn>=0.13.0
10
+ Requires-Dist: ipykernel>=7.4.0
11
+ Requires-Dist: scikit-learn>=1.9.1
12
+ Requires-Dist: kagglehub[hf-datasets,pandas-datasets,polars-datasets]>=1.0.2
13
+ Requires-Dist: polars>=2.0.0rc2
14
+ Requires-Dist: pandas>=3.0.6
15
+ Requires-Dist: typer>=0.27.2
16
+ Requires-Dist: rich>=15.0.0
17
+ Provides-Extra: cpu
18
+ Requires-Dist: torch>=2.8; extra == "cpu"
19
+ Requires-Dist: torchvision>=0.23; extra == "cpu"
20
+ Provides-Extra: xpu
21
+ Requires-Dist: torch>=2.8; extra == "xpu"
22
+ Requires-Dist: torchvision>=0.23; extra == "xpu"
23
+ Requires-Dist: transformers>=4.57; extra == "xpu"
24
+ Requires-Dist: accelerate>=1.10.1; extra == "xpu"
25
+ Requires-Dist: huggingface_hub>=0.34.4; extra == "xpu"
26
+ Requires-Dist: safetensors>=0.6.2; extra == "xpu"
27
+ Provides-Extra: cuda
28
+ Requires-Dist: torch>=2.8; extra == "cuda"
29
+ Requires-Dist: torchvision>=0.23; extra == "cuda"
30
+ Requires-Dist: transformers>=4.57; extra == "cuda"
31
+ Requires-Dist: accelerate>=1.10.1; extra == "cuda"
32
+ Requires-Dist: huggingface_hub>=0.34.4; extra == "cuda"
33
+ Requires-Dist: safetensors>=0.6.2; extra == "cuda"
@@ -0,0 +1,12 @@
1
+ pyproject.toml
2
+ src/kpihx_lab.egg-info/PKG-INFO
3
+ src/kpihx_lab.egg-info/SOURCES.txt
4
+ src/kpihx_lab.egg-info/dependency_links.txt
5
+ src/kpihx_lab.egg-info/entry_points.txt
6
+ src/kpihx_lab.egg-info/requires.txt
7
+ src/kpihx_lab.egg-info/top_level.txt
8
+ src/lab/__init__.py
9
+ src/lab/ai.py
10
+ src/lab/cli.py
11
+ src/lab/kit.py
12
+ src/lab/logo.py
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ lab = lab.cli:app
@@ -0,0 +1,31 @@
1
+ numpy>=2.5.2
2
+ scipy>=1.18.1
3
+ matplotlib>=3.11.1
4
+ seaborn>=0.13.0
5
+ ipykernel>=7.4.0
6
+ scikit-learn>=1.9.1
7
+ kagglehub[hf-datasets,pandas-datasets,polars-datasets]>=1.0.2
8
+ polars>=2.0.0rc2
9
+ pandas>=3.0.6
10
+ typer>=0.27.2
11
+ rich>=15.0.0
12
+
13
+ [cpu]
14
+ torch>=2.8
15
+ torchvision>=0.23
16
+
17
+ [cuda]
18
+ torch>=2.8
19
+ torchvision>=0.23
20
+ transformers>=4.57
21
+ accelerate>=1.10.1
22
+ huggingface_hub>=0.34.4
23
+ safetensors>=0.6.2
24
+
25
+ [xpu]
26
+ torch>=2.8
27
+ torchvision>=0.23
28
+ transformers>=4.57
29
+ accelerate>=1.10.1
30
+ huggingface_hub>=0.34.4
31
+ safetensors>=0.6.2
@@ -0,0 +1,25 @@
1
+ """KπX-Labs Explore/lab core package."""
2
+
3
+ from lab.kit import Context
4
+ from lab.ai import pred_eval
5
+ from lab.logo import (
6
+ Logo,
7
+ KπX_BOLD,
8
+ KπX_COMPACT,
9
+ KπX_π_BOLD,
10
+ KπX_π_COMPACT,
11
+ π_BLOCK,
12
+ π_π,
13
+ )
14
+
15
+ __all__ = [
16
+ "Context",
17
+ "pred_eval",
18
+ "Logo",
19
+ "KπX_BOLD",
20
+ "KπX_COMPACT",
21
+ "KπX_π_BOLD",
22
+ "KπX_π_COMPACT",
23
+ "π_BLOCK",
24
+ "π_π",
25
+ ]
@@ -0,0 +1,113 @@
1
+ """KπX-Labs AI utility kit."""
2
+
3
+ from collections.abc import Sequence
4
+ from typing import Any
5
+
6
+ import matplotlib.pyplot as plt
7
+ import numpy as np
8
+ import seaborn as sns
9
+ from sklearn.metrics import (
10
+ confusion_matrix,
11
+ classification_report,
12
+ precision_recall_curve,
13
+ auc,
14
+ log_loss,
15
+ matthews_corrcoef,
16
+ average_precision_score,
17
+ )
18
+
19
+ def pred_eval(
20
+ gts,
21
+ preds,
22
+ probas,
23
+ criterion=log_loss,
24
+ display: bool = True,
25
+ plot: bool = True,
26
+ labels: Sequence | None = None,
27
+ ) -> tuple[dict[str, Any], np.ndarray | None]:
28
+ """Evaluate predictions against ground truths.
29
+
30
+ Knows nothing about the model, the split or the task: just gts, preds and
31
+ probas in, metrics and optional visuals out.
32
+
33
+ Args:
34
+ gts: Ground truth labels, shape (n_samples,).
35
+ preds: Predicted labels, shape (n_samples,), same label space as gts.
36
+ probas: Predicted probabilities of the positive class, shape (n_samples,).
37
+ criterion: Loss callable, signature criterion(gts, probas). Defaults to
38
+ sklearn.metrics.log_loss.
39
+ display: If True, print metrics and classification report.
40
+ plot: If True, draw confusion matrix and PR curve.
41
+ labels: Explicit class order. Inferred (sorted) when None.
42
+
43
+ Returns:
44
+ (results, axs).
45
+ results: dict with keys "loss", "cm", "class_report", "mcc",
46
+ "avg_pr", "pr_auc", "pr", "rec", "threshold", "labels".
47
+ axs: ndarray of 2 Axes (cm + PR) when plot=True, else None.
48
+ """
49
+ # Class order shared by the confusion matrix, the report and the axes.
50
+ # Without an explicit order, both label sets must agree before deriving it.
51
+ if labels:
52
+ labels = list(labels)
53
+ else:
54
+ classes_gts = set(gts)
55
+ classes_preds = set(preds)
56
+ if classes_gts != classes_preds:
57
+ raise ValueError(
58
+ "gts and preds must share the same classes, got "
59
+ f"{sorted(classes_gts)} for gts and {sorted(classes_preds)} for preds. "
60
+ "Pass labels= to force the class order explicitly."
61
+ )
62
+ labels = sorted(classes_gts)
63
+
64
+ # Metrics, computed unconditionally so `results` stays complete when silent.
65
+ loss = criterion(gts, probas)
66
+ cm = confusion_matrix(gts, preds, labels=labels)
67
+ class_report = classification_report(gts, preds, labels=labels, output_dict=True, zero_division=0)
68
+ mcc = matthews_corrcoef(gts, preds)
69
+ avg_pr = average_precision_score(gts, probas)
70
+ pr, rec, threshold = precision_recall_curve(gts, probas)
71
+ pr_auc = auc(rec, pr)
72
+
73
+ results = {
74
+ "loss": loss,
75
+ "cm": cm,
76
+ "class_report": class_report,
77
+ "mcc": mcc,
78
+ "avg_pr": avg_pr,
79
+ "pr_auc": pr_auc,
80
+ "pr": pr,
81
+ "rec": rec,
82
+ "threshold": threshold,
83
+ "labels": labels,
84
+ }
85
+
86
+ if display:
87
+ print("Loss:", loss)
88
+ print("MCC:", mcc)
89
+ print("AVG-PR:", avg_pr)
90
+ print("PR-AUC:", pr_auc)
91
+ print("Classification report")
92
+ print(classification_report(gts, preds, labels=labels, zero_division=0))
93
+
94
+ axs = None
95
+ if plot:
96
+ # Two panels: confusion matrix on the left, PR curve on the right.
97
+ fig, axs = plt.subplots(1, 2, figsize=(12, 5))
98
+
99
+ sns.heatmap(cm, annot=True, ax=axs[0], xticklabels=labels, yticklabels=labels)
100
+ axs[0].set_title("Confusion matrix")
101
+ axs[0].set_xlabel("Predicted label")
102
+ axs[0].set_ylabel("Ground truth")
103
+
104
+ axs[1].plot(rec, pr, label="PR curve")
105
+ axs[1].set_xlabel("recall")
106
+ axs[1].set_ylabel("precision")
107
+ axs[1].set_title("PR curve")
108
+ axs[1].legend()
109
+
110
+ plt.tight_layout()
111
+ plt.show()
112
+
113
+ return results, axs
@@ -0,0 +1,22 @@
1
+ from __future__ import annotations
2
+
3
+ import typer
4
+
5
+ from lab.kit import Context
6
+
7
+ app = typer.Typer(help="KπX-Labs CLI environment diagnostic and utilities.", no_args_is_help=True)
8
+
9
+
10
+ @app.callback()
11
+ def lab() -> None:
12
+ """KπX-Labs CLI environment diagnostic and utilities."""
13
+
14
+
15
+ @app.command()
16
+ def context() -> None:
17
+ """Print the sovereign environment context side-by-side with the KπX logo."""
18
+ Context.display()
19
+
20
+
21
+ if __name__ == "__main__":
22
+ app()
@@ -0,0 +1,82 @@
1
+ import os
2
+ import platform
3
+ import socket
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ from lab.logo import Logo
8
+
9
+
10
+ class Context:
11
+ """Runtime execution context and sovereign environment detection for KπX-Labs."""
12
+
13
+ # PEP 405 Axiom: local runtime runs in a dedicated virtualenv, cloud runtimes share the system Python
14
+ IS_LOCAL = sys.prefix != sys.base_prefix
15
+ ROOT = Path(sys.prefix).parent if IS_LOCAL else Path.cwd()
16
+
17
+ # Default ASCII banner: KπX_π_COMPACT size 8 with KπX-Labs badge
18
+ LOGO = Logo.KπX_Labs
19
+
20
+ @classmethod
21
+ def resolve(cls, *path_segments: str) -> Path:
22
+ """Resolve a path relative to the project root, irrespective of the active runtime."""
23
+ return cls.ROOT.joinpath(*path_segments)
24
+
25
+ @classmethod
26
+ def get_info(cls) -> dict[str, str]:
27
+ """Collect diagnostic and hardware specs across local and cloud environments."""
28
+ if cls.IS_LOCAL:
29
+ runtime = f"Local ({Path(sys.prefix).name})"
30
+ elif Path("/kaggle/working").exists():
31
+ runtime = "Kaggle Cloud Container"
32
+ elif Path("/content").exists():
33
+ runtime = "Google Colab Cloud"
34
+ else:
35
+ runtime = "Remote Server"
36
+
37
+ device = "CPU"
38
+ try:
39
+ import torch
40
+ if torch.cuda.is_available():
41
+ device = f"CUDA {torch.version.cuda} ({torch.cuda.get_device_name(0)})"
42
+ elif getattr(torch, "xpu", None) and torch.xpu.is_available():
43
+ device = f"Intel XPU ({torch.xpu.get_device_name(0)})"
44
+ else:
45
+ device = "CPU (torch)"
46
+ except Exception:
47
+ if Path("/proc/driver/nvidia/version").exists():
48
+ device = "Nvidia GPU present"
49
+
50
+ return {
51
+ "OS": f"{platform.system()} {platform.release()} ({platform.machine()})",
52
+ "Host": socket.gethostname(),
53
+ "Runtime": runtime,
54
+ "Python": f"{platform.python_version()} @ {sys.executable}",
55
+ "Base": str(sys.base_prefix),
56
+ "Root": str(cls.ROOT),
57
+ "Device": device,
58
+ }
59
+
60
+ @classmethod
61
+ def display(cls, logo_str: str | None = None, stream=None) -> None:
62
+ """Render the KπX Fastfetch-style banner and runtime metadata side-by-side."""
63
+ info = cls.get_info()
64
+ chosen = logo_str or cls.LOGO
65
+ raw_art = chosen.value if hasattr(chosen, "value") else str(chosen)
66
+ logo_lines = raw_art.rstrip("\n").splitlines()
67
+ items = list(info.items())
68
+ key_width = max(len(k) for k, _ in items)
69
+ logo_width = max(len(line) for line in logo_lines)
70
+
71
+ out = stream or sys.stdout
72
+ print(file=out)
73
+ total_lines = max(len(logo_lines), len(items))
74
+ for i in range(total_lines):
75
+ left = logo_lines[i] if i < len(logo_lines) else " " * logo_width
76
+ if i < len(items):
77
+ k, v = items[i]
78
+ right = f"\033[1;36m{k:<{key_width}}\033[0m : {v}"
79
+ else:
80
+ right = ""
81
+ print(f" \033[1;34m{left}\033[0m {right}", file=out)
82
+ print(file=out)
@@ -0,0 +1,785 @@
1
+ from enum import Enum
2
+
3
+
4
+ class KπX_BOLD(str, Enum):
5
+ """KπX BOLD family in solid Unicode block elements."""
6
+
7
+ # 6 lines
8
+ S6 = """\
9
+ ██▌ ▗▟█▛▘ ▝██▖ ▟█▛▘
10
+ ██▌ ▗▟█▛▘ ▄▄▄▄▄▄▄▄▄▄▄▄▖ ▜█▙ ▟█▛
11
+ ██▙▟██▘ ▝ ▐██ ██▌ ▜███▀
12
+ ██▛▀▀██▖ ▐██ ██▌ ▗▟█▜█▙
13
+ ██▌ ▝▜█▙ ▐█▛ ██▌ ▗██▘ ▀██▖
14
+ ██▌ ▀██▄ ██▌ ▜██▟ ▄█▛▘ ▝██▖"""
15
+
16
+ S6_LABS = """\
17
+ ██▌ ▗▟█▛▘ KπX-Labs ▝██▖ ▟█▛▘
18
+ ██▌ ▗▟█▛▘ ▄▄▄▄▄▄▄▄▄▄▄▄▖ ▜█▙ ▟█▛
19
+ ██▙▟██▘ ▝ ▐██ ██▌ ▜███▀
20
+ ██▛▀▀██▖ ▐██ ██▌ ▗▟█▜█▙
21
+ ██▌ ▝▜█▙ ▐█▛ ██▌ ▗██▘ ▀██▖
22
+ ██▌ ▀██▄ ██▌ ▜██▟ ▄█▛▘ ▝██▖"""
23
+
24
+ # 8 lines
25
+ S8 = """\
26
+ ███▌ ▄███▀ ▝▜██▄ ▟██▛
27
+ ███▌ ▄███▀ ▜██▙ ▟██▛
28
+ ███▌ ▄███▀ ▐████████████████▘ ▝██▙▄███▘
29
+ ███▙████▖ ▐███ ███ ▝█████▘
30
+ ████▛▀███▄ ▐███ ███ ▄█████▄
31
+ ███▌ ▜██▙▖ ▐██▌ ███ ▟██▀ ▜██▙
32
+ ███▌ ▝███▙ ▟██▌ ███▖ ▗███▘ ▀███▖
33
+ ███▌ ▜███▖ ▗███ ▀████▌ ▄██▛▘ ▝███▖"""
34
+
35
+ S8_LABS = """\
36
+ ███▌ ▄███▀ ▝▜██▄ ▟██▛
37
+ ███▌ ▄███▀ KπX-Labs ▜██▙ ▟██▛
38
+ ███▌ ▄███▀ ▐████████████████▘ ▝██▙▄███▘
39
+ ███▙████▖ ▐███ ███ ▝█████▘
40
+ ████▛▀███▄ ▐███ ███ ▄█████▄
41
+ ███▌ ▜██▙▖ ▐██▌ ███ ▟██▀ ▜██▙
42
+ ███▌ ▝███▙ ▟██▌ ███▖ ▗███▘ ▀███▖
43
+ ███▌ ▜███▖ ▗███ ▀████▌ ▄██▛▘ ▝███▖"""
44
+
45
+ # 10 lines
46
+ S10 = """\
47
+ ████ ▗▟███▛▘ ▜███▙ ▟███▛
48
+ ████ ▗▟███▛▘ ▝███▙▖ ▟███▀
49
+ ████ ▗▟███▛▘ ▗▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖ ▜███▖ ▗████▘
50
+ ████ ▄███▛▘ ▐█▀▀▜███▛▀▀▀▀▜███▛▀▀▀▘ ▀███▄███▛
51
+ ████▄█████▖ ▐███▌ ▐███▌ ▝█████▛
52
+ ██████▀████▄ ▐███▌ ▐███▌ ▟██████▖
53
+ ████▘ ▜███▙▖ ▟███ ▐███▌ ▗███▛▘▜███▄
54
+ ████ ▝▜███▙ ████ ▐███▌ ▄███▛ ▀███▙
55
+ ████ ▀████▖ ▗███▛ ▐███▙▖▄ ▟███▀ ▝████▖
56
+ ████ ▝▜███▙▖ ▟███☖ ▜█████▌ ▗████▘ ▝▜███▖"""
57
+
58
+ S10_LABS = """\
59
+ ████ ▗▟███▛▘ ▜███▙ ▟███▛
60
+ ████ ▗▟███▛▘ KπX-Labs ▝███▙▖ ▟███▀
61
+ ████ ▗▟███▛▘ ▗▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖ ▜███▖ ▗████▘
62
+ ████ ▄███▛▘ ▐█▀▀▜███▛▀▀▀▀▜███▛▀▀▀▘ ▀███▄███▛
63
+ ████▄█████▖ ▐███▌ ▐███▌ ▝█████▛
64
+ ██████▀████▄ ▐███▌ ▐███▌ ▟██████▖
65
+ ████▘ ▜███▙▖ ▟███ ▐███▌ ▗███▛▘▜███▄
66
+ ████ ▝▜███▙ ████ ▐███▌ ▄███▛ ▀███▙
67
+ ████ ▀████▖ ▗███▛ ▐███▙▖▄ ▟███▀ ▝████▖
68
+ ████ ▝▜███▙▖ ▟███☖ ▜█████▌ ▗████▘ ▝▜███▖"""
69
+
70
+ # 12 lines
71
+ S12 = """\
72
+ █████ ▗▟████▛▘ ▝████▙ ▟████▛
73
+ █████ ▗▟████▛▘ ▝▜████▖ ▟████▘
74
+ █████ ▗▟████▀▘ ▜████▖ ▗████▛▘
75
+ █████ ▗▟████▀ █████████████████████████ ▝████▙ ▄████▛
76
+ █████ ▗▟████▀ ▀▀▀▀▜████▀▀▀▀▀▀▜████▀▀▀▀▀ ▝▜████████▀
77
+ █████▟██████▖ ▐████ ▐████ ▜██████▘
78
+ ███████▛▜████▙ ▐████ ▐████ ▄███████▙▖
79
+ █████▀ ▀█████▄ ▐████ ▐████ ▟████▀▜████▖
80
+ █████ ▜████▙▖ ▟████ ▐████ ▗████▛▘ ▜████▄
81
+ █████ ▝█████▄ ████▛ ▐████▖ ▄████▛ ▀████▙
82
+ █████ ▀█████▖ ▐████▌ ▝████▙▄▄▄ ▟████▀ ▝████▙▖
83
+ █████ ▝▜████▙▖ █████ ▀███████ ▗█████▘ ▝▜████▖"""
84
+
85
+ S12_LABS = """\
86
+ █████ ▗▟████▛▘ ▝████▙ ▟████▛
87
+ █████ ▗▟████▛▘ ▝▜████▖ ▟████▘
88
+ █████ ▗▟████▀▘ KπX-Labs ▜████▖ ▗████▛▘
89
+ █████ ▗▟████▀ █████████████████████████ ▝████▙ ▄████▛
90
+ █████ ▗▟████▀ ▀▀▀▀▜████▀▀▀▀▀▀▜████▀▀▀▀▀ ▝▜████████▀
91
+ █████▟██████▖ ▐████ ▐████ ▜██████▘
92
+ ███████▛▜████▙ ▐████ ▐████ ▄███████▙▖
93
+ █████▀ ▀█████▄ ▐████ ▐████ ▟████▀▜████▖
94
+ █████ ▜████▙▖ ▟████ ▐████ ▗████▛▘ ▜████▄
95
+ █████ ▝█████▄ ████▛ ▐████▖ ▄████▛ ▀████▙
96
+ █████ ▀█████▖ ▐████▌ ▝████▙▄▄▄ ▟████▀ ▝████▙▖
97
+ █████ ▝▜████▙▖ █████ ▀███████ ▗█████▘ ▝▜████▖"""
98
+
99
+ # 16 lines
100
+ S16 = """\
101
+ ███████ ▟██████▛▘ ▜██████▖ ▟██████▘
102
+ ███████ ▟██████▛▘ ▝██████▙ ▗▟██████▘
103
+ ███████ ▗▄██████▛▘ ▝▜█████▙ ▗██████▛
104
+ ███████ ▄██████▛▘ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖ ▜██████▖ ▄██████▀
105
+ ███████ ▄██████▛▘ █████████████████████████████████▌ ▝██████▖ ▟██████▘
106
+ ███████ ▄██████▛▘ █████████████████████████████████▌ ▝▜█████▙▟█████▛▘
107
+ ███████ ▄██████▛▘ ▐█████▌ ██████▌ ▜██████████▛
108
+ ████████████████▄ ▐█████▌ ██████▌ ▐████████▌
109
+ ██████████▛███████▖ ▐█████▌ ██████▌ ▄██████████▄
110
+ ████████▀ ▝▜██████▙ ▐█████▌ ██████▌ ▟█████▛██████▙
111
+ ███████ ▝███████▄ ██████▌ ██████▌ ▗██████▛ ▝▜█████▙▖
112
+ ███████ ▜██████▙▖ ██████▘ ██████▌ ▗██████▀ ▜██████▖
113
+ ███████ ▝███████▄ ▐██████ ██████▌ ▟██████▘ ▀██████▄
114
+ ███████ ▀███████▖ ▟█████▛ ██████▙ ▗▟█████▛ ▝██████▙
115
+ ███████ ▝▜██████▙ ▗██████▌ ▐██████████ ▗██████▛ ▝▜██████▖
116
+ ███████ ▀███████▄ ▐██████ ▝▜████████▖ ▟██████▘ ▜██████▖"""
117
+
118
+ S16_LABS = """\
119
+ ███████ ▟██████▛▘ ▜██████▖ ▟██████▘
120
+ ███████ ▟██████▛▘ ▝██████▙ ▗▟██████▘
121
+ ███████ ▗▄██████▛▘ KπX-Labs ▝▜█████▙ ▗██████▛
122
+ ███████ ▄██████▛▘ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖ ▜██████▖ ▄██████▀
123
+ ███████ ▄██████▛▘ █████████████████████████████████▌ ▝██████▖ ▟██████▘
124
+ ███████ ▄██████▛▘ █████████████████████████████████▌ ▝▜█████▙▟█████▛▘
125
+ ███████ ▄██████▛▘ ▐█████▌ ██████▌ ▜██████████▛
126
+ ████████████████▄ ▐█████▌ ██████▌ ▐████████▌
127
+ ██████████▛███████▖ ▐█████▌ ██████▌ ▄██████████▄
128
+ ████████▀ ▝▜██████▙ ▐█████▌ ██████▌ ▟█████▛██████▙
129
+ ███████ ▝███████▄ ██████▌ ██████▌ ▗██████▛ ▝▜█████▙▖
130
+ ███████ ▜██████▙▖ ██████▘ ██████▌ ▗██████▀ ▜██████▖
131
+ ███████ ▝███████▄ ▐██████ ██████▌ ▟██████▘ ▀██████▄
132
+ ███████ ▀███████▖ ▟█████▛ ██████▙ ▗▟█████▛ ▝██████▙
133
+ ███████ ▝▜██████▙ ▗██████▌ ▐██████████ ▗██████▛ ▝▜██████▖
134
+ ███████ ▀███████▄ ▐██████ ▝▜████████▖ ▟██████▘ ▜██████▖"""
135
+
136
+
137
+ class KπX_COMPACT(str, Enum):
138
+ """KπX COMPACT family in condensed Unicode block elements."""
139
+
140
+ # 6 lines
141
+ S6 = """\
142
+ ██▌ ▗▟█▀ ▝██ ▟█▛
143
+ ██▌▄█▛▘ ▗▄▄▄▄▄▄▄▄▖ ▝█▙▟█▛
144
+ █████ ▝▘██▌ ██▌ ▐███
145
+ ██▛▜█▙ ██▌ ██▌ ▟███▖
146
+ ██▌ ▜█▙ ██ ██▌ ▟█▛▝██▖
147
+ ██▌ ▜█▙ ▗██ ▜██▖ ▟█▛ ▝██"""
148
+
149
+ S6_LABS = """\
150
+ ██▌ ▗▟█▀ KπX-Labs ▝██ ▟█▛
151
+ ██▌▄█▛▘ ▗▄▄▄▄▄▄▄▄▖ ▝█▙▟█▛
152
+ █████ ▝▘██▌ ██▌ ▐███
153
+ ██▛▜█▙ ██▌ ██▌ ▟███▖
154
+ ██▌ ▜█▙ ██ ██▌ ▟█▛▝██▖
155
+ ██▌ ▜█▙ ▗██ ▜██▖ ▟█▛ ▝██"""
156
+
157
+ # 8 lines
158
+ S8 = """\
159
+ ███ ▗███▘ ███ ▗██▛
160
+ ███ ▄██▛ ▝██▙ ▗██▛
161
+ ███▗▟██▘ ███████████▌ ▝██▙██▛
162
+ ██████▖ ███ ███ ▝████
163
+ ███▛▜██▖ ██▛ ███ ▐████▖
164
+ ███ ▜██▖ ██▌ ███ ▗██▛▜██▖
165
+ ███ ▜██▙ ▗██▌ ███ ▗██▛ ▜██▖
166
+ ███ ▜██▌ ▐██▘ ▝███▌ ▗██▛ ███"""
167
+
168
+ S8_LABS = """\
169
+ ███ ▗███▘ ███ ▗██▛
170
+ ███ ▄██▛ KπX-Labs ▝██▙ ▗██▛
171
+ ███▗▟██▘ ███████████▌ ▝██▙██▛
172
+ ██████▖ ███ ███ ▝████
173
+ ███▛▜██▖ ██▛ ███ ▐████▖
174
+ ███ ▜██▖ ██▌ ███ ▗██▛▜██▖
175
+ ███ ▜██▙ ▗██▌ ███ ▗██▛ ▜██▖
176
+ ███ ▜██▌ ▐██▘ ▝███▌ ▗██▛ ███"""
177
+
178
+ # 10 lines
179
+ S10 = """\
180
+ ███▌ ▗███▛ ▜███ ███▛
181
+ ███▌ ▟███▘ ▜██▙ ▟██▛
182
+ ███▌ ▗▟██▛ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▜██▙ ▟██▛
183
+ ███▌▄███▘ █▛▀███▛▀▀▜███▀▀ ▜█████▛
184
+ ███████▙ ███ ▐███ ▜████
185
+ ████▛███▙ ███ ▐███ ▗█████▖
186
+ ███▌ ▝▜██▙ ███ ▐███ ▗███▀███▖
187
+ ███▌ ▜███▖ ▐███ ▐███ ▗███▘ ▝███▖
188
+ ███▌ ▜███▖ ▐███ ▐███▄▖ ▗███▌ ▐███▖
189
+ ███▌ ▜███▖ ███▌ ▜████ ▗███▛ ▜███"""
190
+
191
+ S10_LABS = """\
192
+ ███▌ ▗███▛ ▜███ ███▛
193
+ ███▌ ▟███▘ KπX-Labs ▜██▙ ▟██▛
194
+ ███▌ ▗▟██▛ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▜██▙ ▟██▛
195
+ ███▌▄███▘ █▛▀███▛▀▀▜███▀▀ ▜█████▛
196
+ ███████▙ ███ ▐███ ▜████
197
+ ████▛███▙ ███ ▐███ ▗█████▖
198
+ ███▌ ▝▜██▙ ███ ▐███ ▗███▀███▖
199
+ ███▌ ▜███▖ ▐███ ▐███ ▗███▘ ▝███▖
200
+ ███▌ ▜███▖ ▐███ ▐███▄▖ ▗███▌ ▐███▖
201
+ ███▌ ▜███▖ ███▌ ▜████ ▗███▛ ▜███"""
202
+
203
+ # 12 lines
204
+ S12 = """\
205
+ ████ ▗████▘ ▝████ ▟███▌
206
+ ████ ▟███▛ ▝███▙ ▟███▛
207
+ ████ ▗████▀ ▝███▙ ▟███▛
208
+ ████ ▟███▛▘ ▐█████████████████▌ ▝███▙▗███▛
209
+ ████▗▟███▀ ▝▀▀▀███▛▀▀▀▜███▛▀▀▘ ▝██████▛
210
+ █████████▖ ███▌ ▐███▌ ▐█████
211
+ █████▛████▖ ███▌ ▐███▌ ▗██████▌
212
+ ████▀ ▝████▄ ███▌ ▐███▌ ████▜███▖
213
+ ████ ▝▜███▙ ▐███▌ ▐███▌ ▟███▘ ▜███▖
214
+ ████ ▜███▙ ▐███▌ ▐███▌ ▟███▘ ▝████▖
215
+ ████ ▜███▙ ████ ▝████▄▄ ▟███▘ ▝████▖
216
+ ████ ▜████ ███▛ ▀█████ ▟███▌ ▝████"""
217
+
218
+ S12_LABS = """\
219
+ ████ ▗████▘ ▝████ ▟███▌
220
+ ████ ▟███▛ ▝███▙ ▟███▛
221
+ ████ ▗████▀ KπX-Labs ▝███▙ ▟███▛
222
+ ████ ▟███▛▘ ▐█████████████████▌ ▝███▙▗███▛
223
+ ████▗▟███▀ ▝▀▀▀███▛▀▀▀▜███▛▀▀▘ ▝██████▛
224
+ █████████▖ ███▌ ▐███▌ ▐█████
225
+ █████▛████▖ ███▌ ▐███▌ ▗██████▌
226
+ ████▀ ▝████▄ ███▌ ▐███▌ ████▜███▖
227
+ ████ ▝▜███▙ ▐███▌ ▐███▌ ▟███▘ ▜███▖
228
+ ████ ▜███▙ ▐███▌ ▐███▌ ▟███▘ ▝████▖
229
+ ████ ▜███▙ ████ ▝████▄▄ ▟███▘ ▝████▖
230
+ ████ ▜████ ███▛ ▀█████ ▟███▌ ▝████"""
231
+
232
+ # 16 lines
233
+ S16 = """\
234
+ █████▌ ▄█████▀ ▜█████ ▗█████▘
235
+ █████▌ ▗▟█████▘ ▜████▙ ▗█████▘
236
+ █████▌ ▗█████▛ ▜████▙ █████▌
237
+ █████▌ ▟█████▘ ▗▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖ ▜████▙ ▟████▛
238
+ █████▌ ▗█████▛ ▐███████████████████████▌ ▜████▙ ▟████▛
239
+ █████▌ ▟█████▘ ▐███████████████████████▌ ▜█████████▛
240
+ █████▙▟████▛ ▐████ ▐████▌ ▜███████▛
241
+ ████████████▖ ▟████ ▐████▌ ███████
242
+ █████████████▄ █████ ▐████▌ ▟███████▙
243
+ ██████▀ ▝█████▙ █████ ▐████▌ ▟█████████▙
244
+ █████▌ ▝█████▙ █████ ▐████▌ ▐████▛▝█████▌
245
+ █████▌ ▝█████▙ █████ ▐████▌ ▗████▛ ▝█████▖
246
+ █████▌ ▝▜█████▖ ▐████▛ ▐████▌ ▗█████▘ ▝█████▖
247
+ █████▌ ▜█████▖ ▐████▌ ▐█████▖ ▗█████▘ ▝█████▖
248
+ █████▌ ▜█████▖ █████▘ ████████ ▗█████▘ ▝█████▖
249
+ █████▌ ▜█████▖ ▗█████ ▝▜██████▖ ▗█████▘ ▜█████"""
250
+
251
+ S16_LABS = """\
252
+ █████▌ ▄█████▀ ▜█████ ▗█████▘
253
+ █████▌ ▗▟█████▘ ▜████▙ ▗█████▘
254
+ █████▌ ▗█████▛ KπX-Labs ▜████▙ █████▌
255
+ █████▌ ▟█████▘ ▗▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖ ▜████▙ ▟████▛
256
+ █████▌ ▗█████▛ ▐███████████████████████▌ ▜████▙ ▟████▛
257
+ █████▌ ▟█████▘ ▐███████████████████████▌ ▜█████████▛
258
+ █████▙▟████▛ ▐████ ▐████▌ ▜███████▛
259
+ ████████████▖ ▟████ ▐████▌ ███████
260
+ █████████████▄ █████ ▐████▌ ▟███████▙
261
+ ██████▀ ▝█████▙ █████ ▐████▌ ▟█████████▙
262
+ █████▌ ▝█████▙ █████ ▐████▌ ▐████▛▝█████▌
263
+ █████▌ ▝█████▙ █████ ▐████▌ ▗████▛ ▝█████▖
264
+ █████▌ ▝▜█████▖ ▐████▛ ▐████▌ ▗█████▘ ▝█████▖
265
+ █████▌ ▜█████▖ ▐████▌ ▐█████▖ ▗█████▘ ▝█████▖
266
+ █████▌ ▜█████▖ █████▘ ████████ ▗█████▘ ▝█████▖
267
+ █████▌ ▜█████▖ ▗█████ ▝▜██████▖ ▗█████▘ ▜█████"""
268
+
269
+
270
+ class KπX_π_BOLD(str, Enum):
271
+ """KπX BOLD family drawn with the 'π' glyph."""
272
+
273
+ # 6 lines
274
+ S6 = """\
275
+ ππ πππ ππ πππ
276
+ ππ πππ πππππππππππ πππ πππ
277
+ ππππππ πππ ππ ππππ
278
+ πππ πππ ππ ππ πππππ
279
+ ππ πππ πππ ππ ππ πππ
280
+ ππ πππ ππ ππππ πππ ππ"""
281
+
282
+ S6_LABS = """\
283
+ ππ πππ KπX-Labs ππ πππ
284
+ ππ πππ πππππππππππ πππ πππ
285
+ ππππππ πππ ππ ππππ
286
+ πππ πππ ππ ππ πππππ
287
+ ππ πππ πππ ππ ππ πππ
288
+ ππ πππ ππ ππππ πππ ππ"""
289
+
290
+ # 8 lines
291
+ S8 = """\
292
+ πππ ππππ πππ ππππ
293
+ πππ πππ ππππ ππππ
294
+ πππ πππ ππππππππππππππππ πππ πππ
295
+ ππππππππ πππ πππ πππππ
296
+ πππππ πππ πππ πππ πππππππ
297
+ πππ ππππ πππ πππ ππππ ππππ
298
+ πππ ππππ πππ πππ πππ πππ
299
+ πππ ππππ πππ πππππ ππππ πππ"""
300
+
301
+ S8_LABS = """\
302
+ πππ ππππ πππ ππππ
303
+ πππ πππ KπX-Labs ππππ ππππ
304
+ πππ πππ ππππππππππππππππ πππ πππ
305
+ ππππππππ πππ πππ πππππ
306
+ πππππ πππ πππ πππ πππππππ
307
+ πππ ππππ πππ πππ ππππ ππππ
308
+ πππ ππππ πππ πππ πππ πππ
309
+ πππ ππππ πππ πππππ ππππ πππ"""
310
+
311
+ # 10 lines
312
+ S10 = """\
313
+ ππππ πππππ πππππ πππππ
314
+ ππππ πππππ ππππ ππππ
315
+ ππππ πππππ ππππππππππππππππππππ ππππ ππππ
316
+ ππππ πππππ ππππππππππππππππππππ πππππππππ
317
+ ππππππππππ ππππ ππππ ππππππ
318
+ ππππππππππππ ππππ ππππ πππππππ
319
+ ππππ πππππ ππππ ππππ ππππ πππππ
320
+ ππππ πππππ ππππ ππππ πππππ πππππ
321
+ ππππ πππππ ππππ ππππ ππππ ππππ
322
+ ππππ πππππ ππππ ππππππ ππππ ππππ"""
323
+
324
+ S10_LABS = """\
325
+ ππππ πππππ πππππ πππππ
326
+ ππππ πππππ KπX-Labs ππππ ππππ
327
+ ππππ πππππ ππππππππππππππππππππ ππππ ππππ
328
+ ππππ πππππ ππππππππππππππππππππ πππππππππ
329
+ ππππππππππ ππππ ππππ ππππππ
330
+ ππππππππππππ ππππ ππππ πππππππ
331
+ ππππ πππππ ππππ ππππ ππππ πππππ
332
+ ππππ πππππ ππππ ππππ πππππ πππππ
333
+ ππππ πππππ ππππ ππππ ππππ ππππ
334
+ ππππ πππππ ππππ ππππππ ππππ ππππ"""
335
+
336
+ # 12 lines
337
+ S12 = """\
338
+ πππππ ππππππ πππππ ππππππ
339
+ πππππ ππππππ πππππ πππππ
340
+ πππππ ππππππ πππππ πππππ
341
+ πππππ ππππππ πππππππππππππππππππππππππ πππππ πππππ
342
+ πππππ ππππππ π ππππππ ππππππ πππππππππ
343
+ ππππππππππππ ππππ πππππ πππππππ
344
+ ππππππππππππππ ππππ πππππ ππππππππ
345
+ πππππ πππππ πππππ πππππ πππππ πππππ
346
+ πππππ ππππππ πππππ πππππ πππππ ππππππ
347
+ πππππ ππππππ πππππ πππππ πππππ ππππππ
348
+ πππππ ππππππ ππππ πππππππ πππππ πππππ
349
+ πππππ ππππππ πππππ πππππππ πππππ πππππ"""
350
+
351
+ S12_LABS = """\
352
+ πππππ ππππππ πππππ ππππππ
353
+ πππππ ππππππ πππππ πππππ
354
+ πππππ ππππππ KπX-Labs πππππ πππππ
355
+ πππππ ππππππ πππππππππππππππππππππππππ πππππ πππππ
356
+ πππππ ππππππ π ππππππ ππππππ πππππππππ
357
+ ππππππππππππ ππππ πππππ πππππππ
358
+ ππππππππππππππ ππππ πππππ ππππππππ
359
+ πππππ πππππ πππππ πππππ πππππ πππππ
360
+ πππππ ππππππ πππππ πππππ πππππ ππππππ
361
+ πππππ ππππππ πππππ πππππ πππππ ππππππ
362
+ πππππ ππππππ ππππ πππππππ πππππ πππππ
363
+ πππππ ππππππ πππππ πππππππ πππππ πππππ"""
364
+
365
+ # 16 lines
366
+ S16 = """\
367
+ πππππππ ππππππππ πππππππ πππππππ
368
+ πππππππ ππππππππ πππππππ πππππππ
369
+ πππππππ ππππππππ πππππππ πππππππ
370
+ πππππππ ππππππππ πππππππ πππππππ
371
+ πππππππ ππππππππ ππππππππππππππππππππππππππππππππππ ππππππ πππππππ
372
+ πππππππ ππππππππ πππππππππππππππππππππππππππππππππ ππππππππππππππ
373
+ πππππππ ππππππππ πππππππ ππππππ ππππππππππππ
374
+ πππππππππππππππππ πππππππ ππππππ ππππππππππ
375
+ ππππππππππππππππππ πππππππ ππππππ ππππππππππ
376
+ πππππππππ ππππππππ πππππππ ππππππ ππππππππππππππ
377
+ πππππππ πππππππ ππππππ ππππππ πππππππ πππππππ
378
+ πππππππ ππππππππ ππππππ ππππππ ππππππ πππππππ
379
+ πππππππ ππππππππ ππππππ ππππππ πππππππ ππππππππ
380
+ πππππππ ππππππππ πππππππ πππππππ πππππππ πππππππ
381
+ πππππππ ππππππππ ππππππ πππππππππππ πππππππ πππππππ
382
+ πππππππ ππππππππ πππππππ πππππππππ πππππππ πππππππ"""
383
+
384
+ S16_LABS = """\
385
+ πππππππ ππππππππ πππππππ πππππππ
386
+ πππππππ ππππππππ πππππππ πππππππ
387
+ πππππππ ππππππππ ππππππ πππππππ
388
+ πππππππ ππππππππ KπX-Labs πππππππ πππππππ
389
+ πππππππ ππππππππ ππππππππππππππππππππππππππππππππππ ππππππ πππππππ
390
+ πππππππ ππππππππ πππππππππππππππππππππππππππππππππ ππππππππππππππ
391
+ πππππππ ππππππππ πππππππ ππππππ ππππππππππππ
392
+ πππππππππππππππππ πππππππ ππππππ ππππππππππ
393
+ ππππππππππππππππππ πππππππ ππππππ ππππππππππ
394
+ πππππππππ ππππππππ πππππππ ππππππ ππππππππππππππ
395
+ πππππππ πππππππ ππππππ ππππππ πππππππ πππππππ
396
+ πππππππ ππππππππ ππππππ ππππππ ππππππ πππππππ
397
+ πππππππ ππππππππ ππππππ ππππππ πππππππ ππππππππ
398
+ πππππππ ππππππππ πππππππ πππππππ πππππππ πππππππ
399
+ πππππππ ππππππππ ππππππ πππππππππππ πππππππ πππππππ
400
+ πππππππ ππππππππ πππππππ πππππππππ πππππππ πππππππ"""
401
+
402
+
403
+ class KπX_π_COMPACT(str, Enum):
404
+ """KπX COMPACT family rendered using the 'π' character."""
405
+
406
+ # 6 lines
407
+ S6 = """\
408
+ ππ πππ ππ πππ
409
+ ππ ππ ππππππππ πππππ
410
+ πππππ ππ ππ πππ
411
+ ππππππ ππ ππ ππππ
412
+ ππ πππ ππ ππ πππ ππ
413
+ ππ πππ ππ πππ πππ ππ"""
414
+
415
+ S6_LABS = """\
416
+ ππ πππ KπX-Labs ππ πππ
417
+ ππ ππ ππππππππ πππππ
418
+ πππππ ππ ππ πππ
419
+ ππππππ ππ ππ ππππ
420
+ ππ πππ ππ ππ πππ ππ
421
+ ππ πππ ππ πππ πππ ππ"""
422
+
423
+ # 8 lines (Default sovereign choice requested by KπX)
424
+ S8 = """\
425
+ πππ πππ πππ πππ
426
+ πππ ππππ πππ πππ
427
+ πππ πππ ππππππππππππ ππππππ
428
+ ππππππ πππ πππ ππππ
429
+ πππππππ πππ πππ πππππ
430
+ πππ πππ πππ πππ ππππππ
431
+ πππ ππππ πππ πππ πππ πππ
432
+ πππ ππππ πππ ππππ πππ πππ"""
433
+
434
+ S8_LABS = """\
435
+ πππ πππ πππ πππ
436
+ πππ ππππ KπX-Labs πππ πππ
437
+ πππ πππ ππππππππππππ ππππππ
438
+ ππππππ πππ πππ ππππ
439
+ πππππππ πππ πππ πππππ
440
+ πππ πππ πππ πππ ππππππ
441
+ πππ ππππ πππ πππ πππ πππ
442
+ πππ ππππ πππ ππππ πππ πππ"""
443
+
444
+ # 10 lines
445
+ S10 = """\
446
+ πππ ππππ ππππ ππππ
447
+ πππ ππππ ππππ ππππ
448
+ πππ ππππ ππππππππππππππ ππππ ππππ
449
+ ππππππππ πππππππππππππππ πππππππ
450
+ ππππππππ πππ ππππ πππππ
451
+ πππππππππ πππ ππππ πππππ
452
+ ππππ ππππ πππ ππππ πππππππ
453
+ πππ ππππ πππ ππππ πππ πππ
454
+ πππ ππππ ππππ πππ πππ ππππ
455
+ πππ ππππ ππππ πππππ ππππ ππππ"""
456
+
457
+ S10_LABS = """\
458
+ πππ ππππ ππππ ππππ
459
+ πππ ππππ KπX-Labs ππππ ππππ
460
+ πππ ππππ ππππππππππππππ ππππ ππππ
461
+ ππππππππ πππππππππππππππ πππππππ
462
+ ππππππππ πππ ππππ πππππ
463
+ πππππππππ πππ ππππ πππππ
464
+ ππππ ππππ πππ ππππ πππππππ
465
+ πππ ππππ πππ ππππ πππ πππ
466
+ πππ ππππ ππππ πππ πππ ππππ
467
+ πππ ππππ ππππ πππππ ππππ ππππ"""
468
+
469
+ # 12 lines
470
+ S12 = """\
471
+ ππππ ππππ ππππ πππππ
472
+ ππππ πππππ ππππ πππππ
473
+ ππππ ππππ ππππ πππππ
474
+ ππππ πππππ ππππππππππππππππππ ππππ ππππ
475
+ ππππ πππππ π ππππ πππππ πππππππ
476
+ πππππππππ ππππ ππππ ππππππ
477
+ ππππππππππ ππππ ππππ ππππππ
478
+ ππππ ππππ ππππ ππππ ππππππππ
479
+ ππππ πππππ ππππ ππππ ππππ ππππ
480
+ ππππ πππππ ππππ ππππ ππππ ππππ
481
+ ππππ πππππ ππππ ππππππ ππππ ππππ
482
+ ππππ πππππ ππππ πππππ ππππ ππππ"""
483
+
484
+ S12_LABS = """\
485
+ ππππ ππππ ππππ πππππ
486
+ ππππ πππππ ππππ πππππ
487
+ ππππ ππππ KπX-Labs ππππ πππππ
488
+ ππππ πππππ ππππππππππππππππππ ππππ ππππ
489
+ ππππ πππππ π ππππ πππππ πππππππ
490
+ πππππππππ ππππ ππππ ππππππ
491
+ ππππππππππ ππππ ππππ ππππππ
492
+ ππππ ππππ ππππ ππππ ππππππππ
493
+ ππππ πππππ ππππ ππππ ππππ ππππ
494
+ ππππ πππππ ππππ ππππ ππππ ππππ
495
+ ππππ πππππ ππππ ππππππ ππππ ππππ
496
+ ππππ πππππ ππππ πππππ ππππ ππππ"""
497
+
498
+ # 16 lines
499
+ S16 = """\
500
+ πππππ πππππππ ππππππ πππππ
501
+ πππππ ππππππ ππππππ πππππ
502
+ πππππ ππππππ ππππππ ππππππ
503
+ πππππ ππππππ ππππππ ππππππ
504
+ πππππ ππππππ ππππππππππππππππππππππππ ππππππ ππππππ
505
+ πππππ ππππππ ππππππππππππππππππππππππ πππππππππππ
506
+ ππππππππππππ πππππ πππππ πππππππππ
507
+ ππππππππππππ πππππ πππππ πππππππ
508
+ πππππππππππππ πππππ πππππ πππππππππ
509
+ πππππππ ππππππ πππππ πππππ πππππππππππ
510
+ πππππ ππππππ πππππ πππππ ππππππ πππππ
511
+ πππππ ππππππ πππππ πππππ πππππ πππππ
512
+ πππππ ππππππ πππππ πππππ πππππ πππππ
513
+ πππππ ππππππ ππππππ πππππ πππππ πππππ
514
+ πππππ ππππππ πππππ ππππππππ πππππ πππππ
515
+ πππππ ππππππ πππππ πππππππ πππππ ππππππ"""
516
+
517
+ S16_LABS = """\
518
+ πππππ πππππππ ππππππ πππππ
519
+ πππππ ππππππ ππππππ πππππ
520
+ πππππ ππππππ ππππππ ππππππ
521
+ πππππ ππππππ KπX-Labs ππππππ ππππππ
522
+ πππππ ππππππ ππππππππππππππππππππππππ ππππππ ππππππ
523
+ πππππ ππππππ ππππππππππππππππππππππππ πππππππππππ
524
+ ππππππππππππ πππππ πππππ πππππππππ
525
+ ππππππππππππ πππππ πππππ πππππππ
526
+ πππππππππππππ πππππ πππππ πππππππππ
527
+ πππππππ ππππππ πππππ πππππ πππππππππππ
528
+ πππππ ππππππ πππππ πππππ ππππππ πππππ
529
+ πππππ ππππππ πππππ πππππ πππππ πππππ
530
+ πππππ ππππππ πππππ πππππ πππππ πππππ
531
+ πππππ ππππππ ππππππ πππππ πππππ πππππ
532
+ πππππ ππππππ πππππ ππππππππ πππππ πππππ
533
+ πππππ ππππππ πππππ πππππππ πππππ ππππππ"""
534
+
535
+
536
+ class π_BLOCK(str, Enum):
537
+ """Isolated central 'π' glyph in solid Unicode block elements."""
538
+
539
+ S6 = """\
540
+ ▄▄▄▄▄▄▄▄▄▄▄▄▖
541
+ ▐██ ██▌
542
+ ▐██ ██▌
543
+ ▐█▛ ██▌
544
+ ██▌ ▜██▟ """
545
+
546
+ S6_LABS = """\
547
+ KπX-Labs
548
+ ▄▄▄▄▄▄▄▄▄▄▄▄▖
549
+ ▐██ ██▌
550
+ ▐██ ██▌
551
+ ▐█▛ ██▌
552
+ ██▌ ▜██▟ """
553
+
554
+ S8 = """\
555
+ ▐████████████████▘
556
+ ▐███ ███
557
+ ▐███ ███
558
+ ▐██▌ ███
559
+ ▟██▌ ███▖
560
+ ▗███ ▀████▌"""
561
+
562
+ S8_LABS = """\
563
+ KπX-Labs
564
+ ▐████████████████▘
565
+ ▐███ ███
566
+ ▐███ ███
567
+ ▐██▌ ███
568
+ ▟██▌ ███▖
569
+ ▗███ ▀████▌"""
570
+
571
+ S9 = """\
572
+ █████████████████████████
573
+ ▀▀▀▀▜████▀▀▀▀▀▀▜████▀▀▀▀▀
574
+ ▐████ ▐████
575
+ ▐████ ▐████
576
+ ▐████ ▐████
577
+ ▟████ ▐████
578
+ ████▛ ▐████▖
579
+ ▐████▌ ▝████▙▄▄▄
580
+ █████ ▀███████"""
581
+
582
+ S9_LABS = """\
583
+ KπX-Labs
584
+ █████████████████████████
585
+ ▀▀▀▀▜████▀▀▀▀▀▀▜████▀▀▀▀▀
586
+ ▐████ ▐████
587
+ ▐████ ▐████
588
+ ▐████ ▐████
589
+ ▟████ ▐████
590
+ ████▛ ▐████▖
591
+ ▐████▌ ▝████▙▄▄▄
592
+ █████ ▀███████"""
593
+
594
+ S12 = """\
595
+ █████████████████████████
596
+ ▀▀▀▀▜████▀▀▀▀▀▀▜████▀▀▀▀▀
597
+ ▐████ ▐████
598
+ ▐████ ▐████
599
+ ▐████ ▐████
600
+ ▟████ ▐████
601
+ ████▛ ▐████▖
602
+ ▐████▌ ▝████▙▄▄▄
603
+ █████ ▀███████
604
+ █████ ██████▌
605
+ █████ ██████ """
606
+
607
+ S12_LABS = """\
608
+ KπX-Labs
609
+ █████████████████████████
610
+ ▀▀▀▀▜████▀▀▀▀▀▀▜████▀▀▀▀▀
611
+ ▐████ ▐████
612
+ ▐████ ▐████
613
+ ▐████ ▐████
614
+ ▟████ ▐████
615
+ ████▛ ▐████▖
616
+ ▐████▌ ▝████▙▄▄▄
617
+ █████ ▀███████
618
+ █████ ██████▌
619
+ █████ ██████ """
620
+
621
+ S16 = """\
622
+ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖
623
+ █████████████████████████████████▌
624
+ █████████████████████████████████▌
625
+ ▐█████▌ ██████▌
626
+ ▐█████▌ ██████▌
627
+ ▐█████▌ ██████▌
628
+ ▐█████▌ ██████▌
629
+ ██████▌ ██████▌
630
+ ██████▘ ██████▌
631
+ ▐██████ ██████▌
632
+ ▟█████▛ ██████▙
633
+ ▗██████▌ ▐██████████
634
+ ▐██████ ▝▜████████▖
635
+ ██████▌ █████████
636
+ ██████ ████████ """
637
+
638
+ S16_LABS = """\
639
+ KπX-Labs
640
+ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖
641
+ █████████████████████████████████▌
642
+ █████████████████████████████████▌
643
+ ▐█████▌ ██████▌
644
+ ▐█████▌ ██████▌
645
+ ▐█████▌ ██████▌
646
+ ▐█████▌ ██████▌
647
+ ██████▌ ██████▌
648
+ ██████▘ ██████▌
649
+ ▐██████ ██████▌
650
+ ▟█████▛ ██████▙
651
+ ▗██████▌ ▐██████████
652
+ ▐██████ ▝▜████████▖
653
+ ██████▌ █████████
654
+ ██████ ████████ """
655
+
656
+
657
+ class π_π(str, Enum):
658
+ """Isolated central 'π' glyph rendered using the 'π' character."""
659
+
660
+ S6 = """\
661
+ πππππππππππ
662
+ πππ ππ
663
+ ππ ππ
664
+ πππ ππ
665
+ ππ ππππ """
666
+
667
+ S6_LABS = """\
668
+ KπX-Labs
669
+ πππππππππππ
670
+ πππ ππ
671
+ ππ ππ
672
+ πππ ππ
673
+ ππ ππππ """
674
+
675
+ S8 = """\
676
+ ππππππππππππππππ
677
+ πππ πππ
678
+ πππ πππ
679
+ πππ πππ
680
+ πππ πππ
681
+ πππ πππππ"""
682
+
683
+ S8_LABS = """\
684
+ KπX-Labs
685
+ ππππππππππππππππ
686
+ πππ πππ
687
+ πππ πππ
688
+ πππ πππ
689
+ πππ πππ
690
+ πππ πππππ """
691
+
692
+ S9 = """\
693
+ πππππππππππππππππππππππππ
694
+ π ππππππ ππππππ
695
+ ππππ πππππ
696
+ ππππ πππππ
697
+ πππππ πππππ
698
+ πππππ πππππ
699
+ πππππ πππππ
700
+ ππππ πππππππ
701
+ πππππ πππππππ """
702
+
703
+ S9_LABS = """\
704
+ KπX-Labs
705
+ πππππππππππππππππππππππππ
706
+ π ππππππ ππππππ
707
+ ππππ πππππ
708
+ ππππ πππππ
709
+ πππππ πππππ
710
+ πππππ πππππ
711
+ πππππ πππππ
712
+ ππππ πππππππ
713
+ πππππ πππππππ """
714
+
715
+ S12 = """\
716
+ πππππππππππππππππππππππππ
717
+ π ππππππ ππππππ
718
+ ππππ πππππ
719
+ ππππ πππππ
720
+ πππππ πππππ
721
+ πππππ πππππ
722
+ πππππ πππππ
723
+ ππππ πππππππ
724
+ πππππ πππππππ
725
+ πππππ ππππππ
726
+ πππππ πππππ """
727
+
728
+ S12_LABS = """\
729
+ KπX-Labs
730
+ πππππππππππππππππππππππππ
731
+ π ππππππ ππππππ
732
+ ππππ πππππ
733
+ ππππ πππππ
734
+ πππππ πππππ
735
+ πππππ πππππ
736
+ πππππ πππππ
737
+ ππππ πππππππ
738
+ πππππ πππππππ
739
+ πππππ ππππππ
740
+ πππππ πππππ """
741
+
742
+ S16 = """\
743
+ ππππππππππππππππππππππππππππππππππ
744
+ ππππππππππππππππππππππππππππππππππ
745
+ πππππππ ππππππ
746
+ πππππππ ππππππ
747
+ πππππππ ππππππ
748
+ πππππππ ππππππ
749
+ ππππππ ππππππ
750
+ ππππππ ππππππ
751
+ ππππππ ππππππ
752
+ πππππππ πππππππ
753
+ ππππππ πππππππππππ
754
+ ππππππ πππππππππ
755
+ ππππππ πππππππ
756
+ πππππ ππππππ
757
+ ππππ πππππ """
758
+
759
+ S16_LABS = """\
760
+ KπX-Labs
761
+ ππππππππππππππππππππππππππππππππππ
762
+ ππππππππππππππππππππππππππππππππππ
763
+ πππππππ ππππππ
764
+ πππππππ ππππππ
765
+ πππππππ ππππππ
766
+ πππππππ ππππππ
767
+ ππππππ ππππππ
768
+ ππππππ ππππππ
769
+ ππππππ ππππππ
770
+ πππππππ πππππππ
771
+ ππππππ πππππππππππ
772
+ ππππππ πππππππππ
773
+ ππππππ πππππππ
774
+ πππππ ππππππ
775
+ ππππ πππππ """
776
+
777
+
778
+ class Logo(str, Enum):
779
+ """Main selector for signature and default logo configurations."""
780
+
781
+ KπX = KπX_π_COMPACT.S8.value
782
+ KπX_Labs = KπX_π_COMPACT.S8_LABS.value
783
+
784
+ π = π_π.S8.value
785
+ π_Labs = π_π.S8_LABS.value