diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 7053dc1..0000000
--- a/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/coverage/
diff --git a/Complex_Alpha-Numeric_Generator.code-workspace b/Complex_Alpha-Numeric_Generator.code-workspace
new file mode 100644
index 0000000..e1bb4fe
--- /dev/null
+++ b/Complex_Alpha-Numeric_Generator.code-workspace
@@ -0,0 +1,12 @@
+{
+ "folders": [
+ {
+ "path": "."
+ }
+ ],
+ "settings": {
+ "editor.formatOnSave": true,
+ "files.autoSave": "afterDelay",
+ "editor.formatOnPaste": true
+ }
+}
\ No newline at end of file
diff --git a/Example_Microsoft_SN.png b/Example_Microsoft_SN.png
new file mode 100644
index 0000000..557238e
Binary files /dev/null and b/Example_Microsoft_SN.png differ
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..687c441
--- /dev/null
+++ b/README.md
@@ -0,0 +1,206 @@
+Below is a polished, reference‑quality **README.md** you can drop directly into a GitHub repository.
+It’s structured, logical, developer‑friendly, and explains the full CANG language‑selection system with clarity and purpose.
+
+---
+
+# **CANG — Configurable Alphanumeric Generator**
+
+CANG is a lightweight, extensible system for generating strings based on predefined *language profiles*.
+Each profile defines a **character set**, a **logical type**, and a **semantic description**, allowing developers to produce output strings that match specific formatting, security, or compatibility requirements.
+
+CANG is ideal for:
+
+- Token generation
+- File‑ID or resource‑ID creation
+- URL‑safe identifiers
+- Password or key generation
+- Systems requiring predictable, rule‑driven output formats
+
+---
+
+## 🔧 **Core Concept**
+
+CANG operates on a simple principle:
+
+> **Choose a Language → Load Its Character Set → Generate a Compatible Output String**
+
+Each *Language* is defined by:
+
+- **Language Name** — Human‑readable identifier
+- **Language Type** — Regex‑style character class
+- **Language Description** — Semantic explanation of intended use
+
+---
+
+# 📚 **Language Reference Table**
+
+| ID | Language Name | Language Type | Description |
+|----|---------------|---------------|-------------|
+| 1 | `Alphabet_Upper` | `[A-Z]` | Alphabetical → Simple: Capital letters |
+| 2 | `Alphabet_Lower` | `[a-z]` | Alphabetical → Simple: Small letters |
+| 3 | `Alphabet_Mix` | `[A-Z,a-z]` | Alphabetical → Mix: Capital and Small letters |
+| 4 | `Numeric` | `[0-9]` | Numerical → Simple |
+| 5 | `Alphabet_Upper_Num` | `[A-Z,0-9]` | Alphabetical + Numerical → Simple: Capital letters (Microsoft/Megaupload‑style) |
+| 6 | `Alphabet_Lower_Num` | `[a-z,0-9]` | Alphabetical + Numerical → Simple: Small letters |
+| 7 | `Alphabet_Mix_Num` | `[A-Z,a-z,0-9]` | Alphabetical + Numerical → Mix: Capital and Small letters |
+| 8 | `Alphabet_Mix_Num_SpecialShort` | `[A-Z,a-z,0-9,-_]` | Mix + Short Special chars (YouTube‑style) |
+| 9 | `Alphabet_Mix_Num_SpecialFull` | `[A-Z,a-z,0-9,-_]` | Mix + Full Special chars (Safe Password) |
+
+---
+
+# 🧠 **Language Selector Logic**
+
+CANG uses a simple numeric selector to load the correct language profile.
+
+### **Example Selector Map**
+
+```php
+$CANG_Language = [
+ 1 => 'Alphabet_Upper',
+ 2 => 'Alphabet_Lower',
+ 3 => 'Alphabet_Mix',
+ 4 => 'Numeric',
+ 5 => 'Alphabet_Upper_Num',
+ 6 => 'Alphabet_Lower_Num',
+ 7 => 'Alphabet_Mix_Num',
+ 8 => 'Alphabet_Mix_Num_SpecialShort',
+ 9 => 'Alphabet_Mix_Num_SpecialFull'
+];
+```
+
+### **Character Set Definitions**
+
+```php
+$CANG_Type = [
+ 1 => '[A-Z]',
+ 2 => '[a-z]',
+ 3 => '[A-Z,a-z]',
+ 4 => '[0-9]',
+ 5 => '[A-Z,0-9]',
+ 6 => '[a-z,0-9]',
+ 7 => '[A-Z,a-z,0-9]',
+ 8 => '[A-Z,a-z,0-9,-_]',
+ 9 => '[A-Z,a-z,0-9,-_]'
+];
+```
+
+### **Descriptions**
+
+```php
+$CANG_Description = [
+ 1 => 'Alphabetical -> Simple: Capital letters',
+ 2 => 'Alphabetical -> Simple: Small letters',
+ 3 => 'Alphabetical -> Mix: Capital and Small letters',
+ 4 => 'Numerical -> Simple',
+ 5 => 'Alphabetical And Numerical -> Simple: Capital letters (Microsoft/Megaupload.com)',
+ 6 => 'Alphabetical and Numerical -> Simple: Small letters',
+ 7 => 'Alphabetical and Numerical -> Mix: Capital and Small letters',
+ 8 => 'Alphabetical and Numerical -> Mix: Capital/Small letters plus Short Special chars (YouTube.com)',
+ 9 => 'Alphabetical and Numerical -> Mix: Capital/Small letters plus Full Special chars (Safe Password)'
+];
+```
+
+---
+
+# ⚙️ **How CANG Works Internally**
+
+### **1. Select a Language ID**
+
+```php
+$languageID = 7; // Alphabet_Mix_Num
+```
+
+### **2. Load the Character Set**
+
+```php
+$charset = $CANG_Type[$languageID];
+```
+
+### **3. Convert Character Class to Actual Characters**
+
+Example logic:
+
+```php
+function expandCharset($pattern) {
+ $chars = '';
+
+ if (strpos($pattern, 'A-Z') !== false) {
+ $chars .= implode('', range('A', 'Z'));
+ }
+ if (strpos($pattern, 'a-z') !== false) {
+ $chars .= implode('', range('a', 'z'));
+ }
+ if (strpos($pattern, '0-9') !== false) {
+ $chars .= implode('', range('0', '9'));
+ }
+ if (strpos($pattern, '-') !== false) {
+ $chars .= '-';
+ }
+ if (strpos($pattern, '_') !== false) {
+ $chars .= '_';
+ }
+
+ return $chars;
+}
+```
+
+### **4. Generate Output String**
+
+```php
+function CANG_Generate($charset, $length = 12) {
+ $output = '';
+ $max = strlen($charset) - 1;
+
+ for ($i = 0; $i < $length; $i++) {
+ $output .= $charset[random_int(0, $max)];
+ }
+
+ return $output;
+}
+```
+
+### **5. Full Example**
+
+```php
+$charset = expandCharset($CANG_Type[$languageID]);
+$token = CANG_Generate($charset, 16);
+
+echo $token; // Example: Ab9ZtQ3mP1xR7cD2
+```
+
+---
+
+# 🚀 **Use Cases**
+
+| Use Case | Recommended Language |
+|---------|----------------------|
+| Simple uppercase IDs | `Alphabet_Upper` |
+| Lowercase slugs | `Alphabet_Lower` |
+| Human‑friendly mixed IDs | `Alphabet_Mix` |
+| Numeric codes | `Numeric` |
+| Legacy file hosts (Microsoft/Megaupload‑style) | `Alphabet_Upper_Num` |
+| Lowercase URL tokens | `Alphabet_Lower_Num` |
+| General‑purpose tokens | `Alphabet_Mix_Num` |
+| YouTube‑style video IDs | `Alphabet_Mix_Num_SpecialShort` |
+| Secure passwords | `Alphabet_Mix_Num_SpecialFull` |
+
+---
+
+# 🧩 **Extending CANG**
+
+CANG is intentionally modular.
+To add a new language:
+
+1. Add a new entry to **Language Name**
+2. Add a matching **Language Type**
+3. Add a **Description**
+4. Ensure your charset parser supports the new pattern
+
+This design keeps CANG future‑proof and easy to evolve.
+
+---
+
+# 🏁 **Conclusion**
+
+CANG provides a clean, structured, and extensible way to generate strings with predictable rules.
+Its language‑based architecture makes it ideal for developers who value clarity, control, and compatibility across systems.
\ No newline at end of file
diff --git a/examplo.php b/examplo.php
deleted file mode 100644
index 67faa9f..0000000
--- a/examplo.php
+++ /dev/null
@@ -1,30 +0,0 @@
-A lot of sequential alphanumeric strings
";
-
-$code = $current_number;
-
-for($i=0;$i<5000;$i++){
-
- $code = anderson_makiyama_get_next_alphanumeric($code);
-
- echo $code; echo "
";
-
-}
-
-
-?>
\ No newline at end of file
diff --git a/v.0.1/SilverSoft.RunExample.php b/v.0.1/SilverSoft.RunExample.php
new file mode 100644
index 0000000..bc3002a
--- /dev/null
+++ b/v.0.1/SilverSoft.RunExample.php
@@ -0,0 +1,65 @@
+' . htmlspecialchars($msg, ENT_QUOTES | ENT_SUBSTITUTE) . '
';
+ }
+ exit(1);
+}
+
+// Get next number (safe call)
+$nextNumber = anderson_makiyama_get_next_alphanumeric($currentNumber);
+
+// Prepare output mode
+$isWeb = PHP_SAPI !== 'cli';
+$lineSep = $isWeb ? '
' : PHP_EOL;
+
+// Print header (small HTML wrapper for browser)
+if ($isWeb) {
+ echo 'Alphanumeric generator';
+ echo 'Single step
';
+ echo 'Current = ' . htmlspecialchars($currentNumber, ENT_QUOTES | ENT_SUBSTITUTE) . '
';
+ echo 'Next = ' . htmlspecialchars($nextNumber, ENT_QUOTES | ENT_SUBSTITUTE) . '
';
+ echo '
';
+} else {
+ echo "Current = {$currentNumber}{$lineSep}";
+ echo "Next = {$nextNumber}{$lineSep}";
+ echo str_repeat('-', 40) . $lineSep;
+}
+
+// Generate many sequential codes (buffered for performance)
+$count = 5000;
+$maxAllowed = 100000; // safety cap
+if ($count > $maxAllowed) {
+ $count = $maxAllowed;
+}
+
+$code = $currentNumber;
+$lines = [];
+$start = microtime(true);
+for ($i = 0; $i < $count; $i++) {
+ // If generator can throw, consider wrapping this call in try/catch
+ $code = anderson_makiyama_get_next_alphanumeric($code);
+ $lines[] = $isWeb ? htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE) : $code;
+}
+$elapsed = microtime(true) - $start;
+
+// Output buffered results
+if ($isWeb) {
+ echo 'A lot of sequential alphanumeric strings
';
+ echo implode('
', $lines);
+ echo '
';
+ echo '
Generated ' . count($lines) . ' items in ' . number_format($elapsed, 4) . 's';
+} else {
+ echo "Generated " . count($lines) . " items in " . number_format($elapsed, 4) . "s{$lineSep}";
+ echo implode($lineSep, $lines) . $lineSep;
+}
diff --git a/alphanumeric-generator.php b/v.0.1/alphanumeric-generator.php
similarity index 100%
rename from alphanumeric-generator.php
rename to v.0.1/alphanumeric-generator.php
diff --git a/readme.md b/v.0.1/readme.md
similarity index 100%
rename from readme.md
rename to v.0.1/readme.md
diff --git a/v.0.2/SilverSoft.Unique_Key_Generator.php b/v.0.2/SilverSoft.Unique_Key_Generator.php
new file mode 100644
index 0000000..ab9e339
--- /dev/null
+++ b/v.0.2/SilverSoft.Unique_Key_Generator.php
@@ -0,0 +1,148 @@
+ Time stamp
+$code_time = time();
+//Informace o tom kolik druhu klicu muze funkce poskytnout
+$code_max_type = 5;
+//Druhy klicu
+if ($default_code_type==1){
+//Sestaveni array tabulky s jednotlivimy znaky
+$characters = array_merge(range('A','Z'), range('a','z'));
+//Jmeno generovaneho klice
+$code_name = '[A-Z,a-z]';
+//Cislo generovaneho klice
+$code_number = 1;
+}
+if ($default_code_type==2){
+//Megaupload.com style
+//Sestaveni array tabulky s jednotlivimy znaky
+$characters = array_merge(range('A','Z'), range('0','9'));
+//Jmeno generovaneho klice
+$code_name = '[A-Z,0-9]';
+//Cislo generovaneho klice
+$code_number = 2;
+}
+if ($default_code_type==3){
+//Sestaveni array tabulky s jednotlivimy znaky
+$characters = array_merge(range('a','z'), range('0','9'));
+//Jmeno generovaneho klice
+$code_name = '[a-z,0-9]';
+//Cislo generovaneho klice
+$code_number = 3;
+}
+if ($default_code_type==4){
+//Sestaveni array tabulky s jednotlivimy znaky
+$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
+//Jmeno generovaneho klice
+$code_name = '[A-Z,a-z,0-9]';
+//Cislo generovaneho klice
+$code_number = 4;
+}
+if ($default_code_type>4){
+//Youtube.com style
+//Sestaveni array tabulky s jednotlivimy znaky
+$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'),array('-','_'));
+//Jmeno generovaneho klice
+$code_name = '[A-Z,a-z,0-9,-_]';
+//Cislo generovaneho klice
+$code_number = 5;
+}
+//Vypocet kolik klicu muze generator poskytnout
+$count_characters = count($characters);
+$count_range = pow($count_characters, $default_code_length);
+//Oznaceni konce ve vypoctu klicu
+$character_end = 'Z';
+$character_start = '';
+$array_chars = array_flip($characters);
+//Podminka slouzi pro detekci jestly ma funkce vygenerovat pocatecni ,nahodny nebo nasledujici klic
+ if ($default_code==false){
+//Generator nahodneho nebo pocatecniho klice
+for ($n=1;$default_code_length>=$n;$n++){
+if ($code_random){
+//Generace nahodneho klice
+$character_start .= $characters[rand(0,($count_characters-1))];
+}else{
+//Generace pocatecniho klice
+$character_start .= 'A';
+}
+}
+$code_base = $character_start;
+ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_time'=>$code_time,'code_count'=>code_count($code_base,$array_chars),'code_range'=>$count_range,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+}else{
+//Generace nasledujiciho klice
+ $chars = $characters;
+ $code_array = str_split($default_code);
+ // Starts searching for the next character capable of increasing, or different from Z
+ // Note that initiates the last character to the first
+ for($i = count($code_array)-1;$i>-1;$i--){
+ if($code_array[$i] == $character_end){
+ if($i=='0'){
+ //If equal to Z and is the first character, mental increases the length and zeroes
+ $code_array = array_fill(0,count($code_array) + 1,0);
+$code_base = implode("",$code_array);
+//Podminka hlida generaci spravneho klice, pokud je klic spravne dostanete -> 'code_message'=>'' jinak je vygenerovany klic spatne nebo uz funkce vygenerovala maximalni pocet klicu
+if ($default_code_length==strlen($code_base)){
+ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+ }elseif($default_code_length$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+ }else{
+ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+}
+ }else{
+ if($code_array[$i -1] != $character_end){
+ // If the character is different from previous Z, increment it and resets the current and subsequent
+ // If the character is above the first, also works because it increases and the other resets
+ $code_array[$i -1] = $chars[array_search($code_array[$i -1],$chars) + 1];
+ for($j = $i; $j < count($code_array); $j++){
+ $code_array[$j] = '0';
+ }
+$code_base = implode("",$code_array);
+//Podminka hlida generaci spravneho klice, pokud je klic spravne dostanete -> 'code_message'=>'' jinak je vygenerovany klic spatne nebo uz funkce vygenerovala maximalni pocet klicu
+if ($default_code_length==strlen($code_base)){
+ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+ }elseif($default_code_length$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+ }else{
+ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+}
+ }
+ }
+
+ }else{
+ // calculate the next character, or increments the current
+ $code_array[$i] = $chars[array_search($code_array[$i],$chars) + 1];
+ if($i == '0'){
+ // If the first character, meaning others Salo z
+ // That is, they reset
+ $novo_array = array_fill(0,count($code_array),0);
+ $novo_array[0] = $code_array[$i];
+ $code_array = $novo_array;
+ }
+$code_base = implode("",$code_array);
+//Podminka hlida generaci spravneho klice, pokud je klic spravne dostanete -> 'code_message'=>'' jinak je vygenerovany klic spatne nebo uz funkce vygenerovala maximalni pocet klicu
+if ($default_code_length==strlen($code_base)){
+ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+ }elseif($default_code_length$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+ }else{
+ return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>code_count($code_base,$array_chars),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
+}
+ }
+ }
+}
+
+}
+?>
diff --git a/v.0.2/unique_key_generator.php b/v.0.2/unique_key_generator.php
new file mode 100644
index 0000000..9647725
--- /dev/null
+++ b/v.0.2/unique_key_generator.php
@@ -0,0 +1,171 @@
+length = max(1, $length);
+ $this->type = min(max(1, $type), $this->maxType);
+ $this->chars = $this->buildCharset($this->type);
+ $this->indexMap = array_flip($this->chars);
+ }
+
+ private function buildCharset(int $type): array
+ {
+ return match ($type) {
+ self::TYPE_ALPHA_UPPER_NUM => array_merge(range('A', 'Z'), range('0', '9')),
+ self::TYPE_ALPHA_LOWER_NUM => array_merge(range('a', 'z'), range('0', '9')),
+ self::TYPE_ALPHA_NUM => array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9')),
+ self::TYPE_URLSAFE => array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9'), ['-', '_']),
+ default => array_merge(range('A', 'Z'), range('a', 'z')),
+ };
+ }
+
+ /**
+ * Generate a random (or deterministic all-first) code.
+ */
+ public function generateRandom(bool $secure = true, bool $useFirstChar = false): string
+ {
+ $out = '';
+ $max = count($this->chars) - 1;
+ for ($i = 0; $i < $this->length; $i++) {
+ if ($useFirstChar) {
+ $out .= $this->chars[0];
+ continue;
+ }
+ $idx = $secure ? random_int(0, $max) : mt_rand(0, $max);
+ $out .= $this->chars[$idx];
+ }
+ return $out;
+ }
+
+ /**
+ * Generate next code in sequence. Returns associative payload similar to original.
+ * Throws InvalidArgumentException on invalid input.
+ */
+ public function next(string $current): array
+ {
+ $time = time();
+ if ($current === '') {
+ throw new InvalidArgumentException('Current code must be non-empty.');
+ }
+
+ // validate characters
+ $charsCount = count($this->chars);
+ $currentArr = preg_split('//u', $current, -1, PREG_SPLIT_NO_EMPTY);
+ foreach ($currentArr as $ch) {
+ if (!isset($this->indexMap[$ch])) {
+ throw new InvalidArgumentException('Current code contains invalid character: ' . $ch);
+ }
+ }
+
+ // convert to indices
+ $indices = array_map(fn($c) => $this->indexMap[$c], $currentArr);
+
+ // increment with carry
+ $pos = count($indices) - 1;
+ $carry = 1;
+ while ($pos >= 0 && $carry) {
+ $indices[$pos] += $carry;
+ if ($indices[$pos] >= $charsCount) {
+ $indices[$pos] = 0;
+ $carry = 1;
+ $pos--;
+ } else {
+ $carry = 0;
+ }
+ }
+
+ if ($carry === 1) {
+ // overflow: increase length by 1 (consistent with original behaviour)
+ array_unshift($indices, 0);
+ }
+
+ // build code from indices
+ $newChars = array_map(fn($i) => $this->chars[$i], $indices);
+ $codeBase = implode('', $newChars);
+
+ // compute simple base-n count (may overflow native ints for huge lengths)
+ $countNumber = $this->baseNToInteger($indices, $charsCount);
+
+ // prepare payload (single place)
+ return [
+ 'code_base' => $codeBase,
+ 'code_base_md5' => md5($codeBase),
+ 'code_base_sha1' => sha1($codeBase),
+ 'code_base64_encode' => base64_encode($codeBase),
+ 'code_time' => $time,
+ 'code_count' => $countNumber,
+ 'code_range' => $this->safePowString($charsCount, $this->length),
+ 'code_message' => (strlen($codeBase) > $this->length) ? 'is_upper_or_full' : '',
+ 'code_name' => $this->charsetName(),
+ 'code_type' => $this->type,
+ 'code_max_type' => $this->maxType,
+ 'code_length' => $this->length,
+ ];
+ }
+
+ private function charsetName(): string
+ {
+ return match ($this->type) {
+ self::TYPE_ALPHA_UPPER_NUM => '[A-Z,0-9]',
+ self::TYPE_ALPHA_LOWER_NUM => '[a-z,0-9]',
+ self::TYPE_ALPHA_NUM => '[A-Z,a-z,0-9]',
+ self::TYPE_URLSAFE => '[A-Z,a-z,0-9,-_]',
+ default => '[A-Z,a-z]',
+ };
+ }
+
+ /**
+ * Convert base-n digits to integer (may return string if large).
+ */
+ private function baseNToInteger(array $digits, int $base)
+ {
+ // prefer BCMath for exact big integers when available
+ if (function_exists('bcadd')) {
+ $acc = '0';
+ foreach ($digits as $d) {
+ $acc = bcmul($acc, (string)$base);
+ $acc = bcadd($acc, (string)$d);
+ }
+ return $acc;
+ }
+
+ // fallback to native integer (may overflow)
+ $acc = 0;
+ foreach ($digits as $d) {
+ $acc = $acc * $base + $d;
+ }
+ return $acc;
+ }
+
+ private function safePowString(int $base, int $exp): string
+ {
+ if (function_exists('bcpow')) {
+ return bcpow((string)$base, (string)$exp);
+ }
+ // fallback (may be float and imprecise for large exp)
+ return (string) pow($base, $exp);
+ }
+}
+
+// Example usage:
+$g = new UniqueKeyGenerator(8, 5);
+$random = $g->generateRandom();
+$nextInfo = $g->next('aZ5sTp53x');
+var_dump($random, $nextInfo);
+
+?>
diff --git a/v.0.3/Base_CANG_Generators/CANG.php b/v.0.3/Base_CANG_Generators/CANG.php
new file mode 100644
index 0000000..5a2842f
--- /dev/null
+++ b/v.0.3/Base_CANG_Generators/CANG.php
@@ -0,0 +1,291 @@
+default_code_length = $SetLength;
+ }
+ }
+
+ public function SetType($SetType=FALSE){
+ if(is_numeric($SetType) AND $this->code_max_type>=$SetType){
+ $this->default_code_type = $SetType;
+ }
+ }
+
+ public function CodeCountRange($code_char_range=[]){
+ $count_characters = count($code_char_range);
+ if(function_exists('bcpow')){
+ return bcpow($count_characters, $this->default_code_length);
+ }else{
+ return pow($count_characters, $this->default_code_length);
+ }
+
+ }
+
+ public function CodeTypes(){
+
+ $CodeTypes[1]['code_name'] = '[A-Z]';
+ $CodeTypes[2]['code_name'] = '[a-z]';
+ $CodeTypes[3]['code_name'] = '[A-Z,a-z]';
+ $CodeTypes[4]['code_name'] = '[0-9]';
+ $CodeTypes[5]['code_name'] = '[A-Z,0-9]';
+ $CodeTypes[6]['code_name'] = '[a-z,0-9]';
+ $CodeTypes[7]['code_name'] = '[A-Z,a-z,0-9]';
+ $CodeTypes[8]['code_name'] = '[A-Z,a-z,0-9,-_]';
+
+ $CodeTypes[1]['code_description'] = 'Alphabetical -> Simple:Capital letters';
+ $CodeTypes[2]['code_description'] = 'Alphabetical -> Simple:Small letters';
+ $CodeTypes[3]['code_description'] = 'Alphabetical -> Combi:Capital and small letters';
+ $CodeTypes[4]['code_description'] = 'Numerical -> Simple';
+ $CodeTypes[5]['code_description'] = 'Alphabetical and Numerical -> Simple:Capital letters(Megaupload.com)';
+ $CodeTypes[6]['code_description'] = 'Alphabetical and Numerical -> Simple:Small letters';
+ $CodeTypes[7]['code_description'] = 'Alphabetical and Numerical -> Combi:Capital and small letters';
+ $CodeTypes[8]['code_description'] = 'Alphabetical and Numerical -> Combi:Capital and small letters plus special chars(Youtube.com)';
+
+ $CodeTypes[1]['code_generated_time'] = microtime(TRUE);
+ $CodeTypes[2]['code_generated_time'] = microtime(TRUE);
+ $CodeTypes[3]['code_generated_time'] = microtime(TRUE);
+ $CodeTypes[4]['code_generated_time'] = microtime(TRUE);
+ $CodeTypes[5]['code_generated_time'] = microtime(TRUE);
+ $CodeTypes[6]['code_generated_time'] = microtime(TRUE);
+ $CodeTypes[7]['code_generated_time'] = microtime(TRUE);
+ $CodeTypes[8]['code_generated_time'] = microtime(TRUE);
+
+ $CodeTypes[1]['code_char_range'] = range('A','Z');
+ $CodeTypes[2]['code_char_range'] = range('a','z');
+ $CodeTypes[3]['code_char_range'] = array_merge(range('A','Z'), range('a','z'));
+ $CodeTypes[4]['code_char_range'] = range(0,9);
+ $CodeTypes[5]['code_char_range'] = array_merge(range('A','Z'), range(0,9));
+ $CodeTypes[6]['code_char_range'] = array_merge(range('a','z'), range(0,9));
+ $CodeTypes[7]['code_char_range'] = array_merge(range('A','Z'), range('a','z'), range(0,9));
+ $CodeTypes[8]['code_char_range'] = array_merge(range('A','Z'), range('a','z'), range(0,9),array('-','_'));
+
+ $CodeTypes[1]['code_char_count'] = count($CodeTypes[1]['code_char_range']);
+ $CodeTypes[2]['code_char_count'] = count($CodeTypes[2]['code_char_range']);
+ $CodeTypes[3]['code_char_count'] = count($CodeTypes[3]['code_char_range']);
+ $CodeTypes[4]['code_char_count'] = count($CodeTypes[4]['code_char_range']);
+ $CodeTypes[5]['code_char_count'] = count($CodeTypes[5]['code_char_range']);
+ $CodeTypes[6]['code_char_count'] = count($CodeTypes[6]['code_char_range']);
+ $CodeTypes[7]['code_char_count'] = count($CodeTypes[7]['code_char_range']);
+ $CodeTypes[8]['code_char_count'] = count($CodeTypes[8]['code_char_range']);
+
+ $CodeTypes[1]['code_max_number'] = $this->CodeCountRange($CodeTypes[1]['code_char_range']);
+ $CodeTypes[2]['code_max_number'] = $this->CodeCountRange($CodeTypes[2]['code_char_range']);
+ $CodeTypes[3]['code_max_number'] = $this->CodeCountRange($CodeTypes[3]['code_char_range']);
+ $CodeTypes[4]['code_max_number'] = $this->CodeCountRange($CodeTypes[4]['code_char_range']);
+ $CodeTypes[5]['code_max_number'] = $this->CodeCountRange($CodeTypes[5]['code_char_range']);
+ $CodeTypes[6]['code_max_number'] = $this->CodeCountRange($CodeTypes[6]['code_char_range']);
+ $CodeTypes[7]['code_max_number'] = $this->CodeCountRange($CodeTypes[7]['code_char_range']);
+ $CodeTypes[8]['code_max_number'] = $this->CodeCountRange($CodeTypes[8]['code_char_range']);
+
+ $this->CodeType = $CodeTypes[$this->default_code_type];
+ return $CodeTypes;
+ }
+
+ public function CodeInput($CodeInput=''){
+ if(!empty($CodeInput)){
+ $this->run_default_code = FALSE;
+ $this->CodeInputOld = $CodeInput;
+ }else{
+ $this->run_random_code = FALSE;
+ }
+ }
+
+ public function Search($Value){
+ $code_char_range = $this->CodeType['code_char_range'];
+ foreach($code_char_range AS $KeyNumber=>$KeyString){
+ if("$KeyString"=="$Value"){
+ return $KeyNumber;
+ break;
+ }
+
+ }
+ }
+
+ public function CodeCreateNext(){
+
+ $code_char_range = $this->CodeType['code_char_range'];
+ $code_char_range_start = reset($code_char_range);
+ $code_char_range_end = end($code_char_range);
+
+ $code_str_split = str_split($this->CodeInputOld);
+
+ // Starts a search for the next incrementable character, ie, other than code_char_range_end
+ // Note that it starts from the last character for the first character
+ for($i = count($code_str_split)-1;$i>-1;$i--){
+ if("$code_str_split[$i]" == "$code_char_range_end"){
+ if($i==0){
+ // If it is equal to code_char_range_end and is the first character, then it increases the length and zera
+ $code_str_split = array_fill(0,count($code_str_split) + 1,"$code_char_range_start");
+ return $code_str_split;
+ }else{
+ $n = $i-1;
+ $code_str_pos = $this->Search("$code_str_split[$n]")+1;
+ if("$code_str_split[$n]" != "$code_char_range_end"){
+ // If the previous character is different from code_char_range_end, it increments it and clears the current and subsequent characters
+ // If the previous character is the first one, it also works, because it increments it and zeroes the others
+ $code_str_split[$n] = $code_char_range[$code_str_pos];
+
+ for($j = $i; $j < count($code_str_split); $j++){
+ $code_str_split[$j] = $code_char_range_start;
+ }
+ return $code_str_split;
+ }
+ }
+ }else{
+ // calculates the next character, ie, increments the current character
+ $code_str_pos = $this->Search("$code_str_split[$i]")+1;
+ $code_str_split[$i] = $code_char_range[$code_str_pos];
+ if($i == 0){
+ // If it is the first character, it means that the others are code_char_range_end
+ // That is, he zeroes them
+ $novo_array = array_fill(0,count($code_str_split),"$code_char_range_start");
+ $novo_array[0] = $code_str_split[$i];
+ $code_str_split = $novo_array;
+ }
+ return $code_str_split;
+ }
+ }
+ }
+
+ public function CodeCreate(){
+
+ $code_char_count = $this->CodeType['code_char_count'];
+ $code_char_range = $this->CodeType['code_char_range'];
+ $code_char_range_start = reset($code_char_range);
+
+ $this->code_char_base = [];
+ if($this->run_default_code){
+ for($n=1;$this->default_code_length>=$n;$n++){
+ if($this->run_random_code){
+ $this->code_char_base[] = $code_char_range[mt_rand(0,($code_char_count-1))];
+ }else{
+ $this->code_char_base[] = $code_char_range_start;
+ }
+ }
+ }else{
+ $this->code_char_base = $this->CodeCreateNext();
+ }
+ }
+
+ public function CodeCountNumber() {
+ $code_char_count = $this->CodeType['code_char_count'];
+ $code_char_range = $this->CodeType['code_char_range'];
+
+ $character_keys = array_flip($code_char_range);
+ $code_characters = $this->code_char_base;
+
+ $number = 0;
+ for ($i = 0; $i < count($code_characters); $i++) {
+ $number = $number * $code_char_count + $character_keys[$code_characters[$i]];
+ }
+ $this->code_pos_num = ($number+1);
+ }
+
+ public function CodeArray(){
+ $code_base = implode($this->code_char_base);
+ if($this->default_code_length==strlen($code_base)){
+ return array(
+ 'code_base'=>$code_base,
+ 'code_base_md5'=>md5($code_base),
+ 'code_base_sha1'=>sha1($code_base),
+ 'code_base64_encode'=>base64_encode($code_base),
+ 'code_max_number'=>$this->CodeType['code_max_number'],
+ 'code_pos_num'=>$this->code_pos_num,
+ 'code_time'=>$this->CodeType['code_generated_time'],
+ 'code_message'=>'is_acurrate',
+ 'code_name'=>$this->CodeType['code_name'],
+ 'code_description'=>$this->CodeType['code_description'],
+ 'code_type'=>$this->default_code_type,
+ 'code_max_type'=>$this->code_max_type,
+ 'code_length'=>$this->default_code_length
+ );
+ }elseif($this->default_code_length$code_base,
+ 'code_base_md5'=>md5($code_base),
+ 'code_base_sha1'=>sha1($code_base),
+ 'code_base64_encode'=>base64_encode($code_base),
+ 'code_max_number'=>$this->CodeType['code_max_number'],
+ 'code_pos_num'=>$this->code_pos_num,
+ 'code_time'=>$this->CodeType['code_generated_time'],
+ 'code_message'=>'is_upper_or_full',
+ 'code_name'=>$this->CodeType['code_name'],
+ 'code_description'=>$this->CodeType['code_description'],
+ 'code_type'=>$this->default_code_type,
+ 'code_max_type'=>$this->code_max_type,
+ 'code_length'=>$this->default_code_length
+ );
+ }else{
+ return array(
+ 'code_base'=>$code_base,
+ 'code_base_md5'=>md5($code_base),
+ 'code_base_sha1'=>sha1($code_base),
+ 'code_base64_encode'=>base64_encode($code_base),
+ 'code_max_number'=>$this->CodeType['code_max_number'],
+ 'code_pos_num'=>$this->code_pos_num,
+ 'code_time'=>$this->CodeType['code_generated_time'],
+ 'code_message'=>'is_lower',
+ 'code_name'=>$this->CodeType['code_name'],
+ 'code_description'=>$this->CodeType['code_description'],
+ 'code_type'=>$this->default_code_type,
+ 'code_max_type'=>$this->code_max_type,
+ 'code_length'=>$this->default_code_length
+ );
+ }
+ }
+
+ public function Generate_String(){
+ $this->CodeTypes();
+ $this->CodeCreate();
+ $this->CodeCountNumber();
+ return $this->CodeArray();
+ }
+
+ public function Generate_ID($GenerateID){
+ is_numeric($GenerateID) OR die('The ID must be numberic!');
+ $this->CodeTypes();
+ $code_char_count = $this->CodeType['code_char_count'];
+ $code_char_range = $this->CodeType['code_char_range'];
+
+ $one = 1;
+ if($GenerateID>$this->CodeType['code_max_number']){
+ //Perform reset
+ $code_id = ($one - $one);
+ }else{
+ $code_id = ($GenerateID - $one);
+ }
+ for($length=($this->default_code_length - $one);$length>=0;$length--){
+ if(function_exists('bcpow')){
+ $bcpow = bcpow($code_char_count, $length);
+ $possition = floor($code_id / $bcpow);
+ $code_id = $code_id - ($possition * $bcpow);
+ }else{
+ $pow = pow($code_char_count, $length);
+ $possition = floor($code_id / $pow);
+ $code_id = $code_id - ($possition * $pow);
+ }
+
+ $this->code_char_base[$length] = $code_char_range[$possition];
+ }
+ $this->CodeCountNumber();
+ return $this->CodeArray();
+ }
+}
+?>
diff --git a/v.0.3/Base_CANG_Generators/MS_G.php b/v.0.3/Base_CANG_Generators/MS_G.php
new file mode 100644
index 0000000..56ccdd0
--- /dev/null
+++ b/v.0.3/Base_CANG_Generators/MS_G.php
@@ -0,0 +1,56 @@
+SetLength(25);
+ $this->SetType(5);
+ }
+
+ public function byID($NUM_ID){
+ foreach ($this->Generate_ID($NUM_ID) AS $return_key=>$return_value){
+ if($return_key=='code_base'){
+ $new_return[$return_key] = implode('-',str_split($return_value, 5));
+ }elseif($return_key=='code_description'){
+ $new_return[$return_key] = str_replace('Megaupload','Microsoft',$return_value);
+ }else{
+ $new_return[$return_key] = $return_value;
+ }
+ }
+ return $new_return;
+ }
+
+ public function byRAND(){
+ foreach($this->Generate_String() AS $return_key=>$return_value){
+ if($return_key=='code_base'){
+ $new_return[$return_key] = implode('-',str_split($return_value, 5));
+ }elseif($return_key=='code_description'){
+ $new_return[$return_key] = str_replace('Megaupload','Microsoft',$return_value);
+ }else{
+ $new_return[$return_key] = $return_value;
+ }
+ }
+ return $new_return;
+ }
+
+ public function bySTRING($STRING=''){
+ if($STRING){
+ $Input = str_replace('-','',$STRING);
+ }else{
+ $Input = '';
+ }
+ $this->CodeInput($Input);
+ foreach($this->Generate_String() AS $return_key=>$return_value){
+ if($return_key=='code_base'){
+ $new_return[$return_key] = implode('-',str_split($return_value, 5));
+ }elseif($return_key=='code_description'){
+ $new_return[$return_key] = str_replace('Megaupload','Microsoft',$return_value);
+ }else{
+ $new_return[$return_key] = $return_value;
+ }
+ }
+ return $new_return;
+ }
+}
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Generate_ID.php b/v.0.3/Base_Examples_NoMySQL/Example_Generate_ID.php
new file mode 100644
index 0000000..bc08463
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Generate_ID.php
@@ -0,0 +1,8 @@
+SetLength(8);
+$CANG->SetType(5);
+$return = $CANG->Generate_ID(249996);//In 30 seconds you should be able to generate the key by this ID
+print_r($return);
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Generate_ID_JSON.php b/v.0.3/Base_Examples_NoMySQL/Example_Generate_ID_JSON.php
new file mode 100644
index 0000000..7f7170c
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Generate_ID_JSON.php
@@ -0,0 +1,9 @@
+SetLength(8);
+$CANG->SetType(5);
+$return = $CANG->Generate_ID(249996);//In 30 seconds you should be able to generate the key by this ID
+header("Content-type:application/json");
+echo json_encode($return,true);
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Generate_Random.php b/v.0.3/Base_Examples_NoMySQL/Example_Generate_Random.php
new file mode 100644
index 0000000..d9185db
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Generate_Random.php
@@ -0,0 +1,8 @@
+SetLength(8);
+$CANG->SetType(5);
+$return = $CANG->Generate_String();
+print_r($return);
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Generate_Random_JSON.php b/v.0.3/Base_Examples_NoMySQL/Example_Generate_Random_JSON.php
new file mode 100644
index 0000000..ba850c8
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Generate_Random_JSON.php
@@ -0,0 +1,9 @@
+SetLength(8);
+$CANG->SetType(5);
+$return = $CANG->Generate_String();
+header("Content-type:application/json");
+echo json_encode($return,true);
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Generate_String.php b/v.0.3/Base_Examples_NoMySQL/Example_Generate_String.php
new file mode 100644
index 0000000..a843dd4
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Generate_String.php
@@ -0,0 +1,11 @@
+SetLength(8);
+$CANG->SetType(5);
+$CANG->CodeInput();
+$return[1] = $CANG->Generate_String();
+$CANG->CodeInput($return[1]['code_base']);
+$return[] = $CANG->Generate_String();
+print_r($return);
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Generate_String_JSON.php b/v.0.3/Base_Examples_NoMySQL/Example_Generate_String_JSON.php
new file mode 100644
index 0000000..8050c54
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Generate_String_JSON.php
@@ -0,0 +1,12 @@
+SetLength(8);
+$CANG->SetType(5);
+$CANG->CodeInput();
+$return[1] = $CANG->Generate_String();
+$CANG->CodeInput($return[1]['code_base']);
+$return[] = $CANG->Generate_String();
+header("Content-type:application/json");
+echo json_encode($return,true);
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_ID.php b/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_ID.php
new file mode 100644
index 0000000..02f3262
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_ID.php
@@ -0,0 +1,6 @@
+byID(249996000001111333338888555578963201457);//In 30 seconds you should be able to generate the key by this ID
+print_r($return);
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_ID_JSON.php b/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_ID_JSON.php
new file mode 100644
index 0000000..55a9877
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_ID_JSON.php
@@ -0,0 +1,7 @@
+byID(249996000001111333338888555578963201457);//In 30 seconds you should be able to generate the key by this ID
+header("Content-type:application/json");
+echo json_encode($return,true);
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_Random.php b/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_Random.php
new file mode 100644
index 0000000..e38b1f0
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_Random.php
@@ -0,0 +1,6 @@
+byRAND();//In 30 seconds you should be able to generate the key by this ID
+print_r($return);
+?>
diff --git a/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_Random_JSON.php b/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_Random_JSON.php
new file mode 100644
index 0000000..d41c3a5
--- /dev/null
+++ b/v.0.3/Base_Examples_NoMySQL/Example_Microsoft_SN_Generate_Random_JSON.php
@@ -0,0 +1,7 @@
+byRAND();//In 30 seconds you should be able to generate the key by this ID
+header("Content-type:application/json");
+echo json_encode($return,true)
+?>
diff --git a/v.0.3/Example_Microsoft_SN.png b/v.0.3/Example_Microsoft_SN.png
new file mode 100644
index 0000000..557238e
Binary files /dev/null and b/v.0.3/Example_Microsoft_SN.png differ
diff --git a/v.0.3/README.md b/v.0.3/README.md
new file mode 100644
index 0000000..53579f1
--- /dev/null
+++ b/v.0.3/README.md
@@ -0,0 +1,10 @@
+# Complex_Alpha-Numeric_Generator
+Complex Alphabetic or Numeric and AlphaNumeric Generator (CANG) : Generate key string Randomly or Sequentially by the ID or the string.
+I have combined two working scripts to make this nice CANG.
+from :
+https://github.com/admiyn/sequential-alphanumeric-generator/blob/master/alphanumeric-generator.php
+and
+https://github.com/loader/kvzlib/blob/master/php/functions/alphaID.inc.php
+Just want to say a thanks to these two guys that they make me understand how to generate a key string for my generator.
+And ofcourse a one thanks belonging to users which were helping me to understand at this czech website :
+https://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=159759#12
diff --git a/v.0.4/SilverSoft.RunCommand.ComplexKeyGenerator.php b/v.0.4/SilverSoft.RunCommand.ComplexKeyGenerator.php
new file mode 100644
index 0000000..670e9ad
--- /dev/null
+++ b/v.0.4/SilverSoft.RunCommand.ComplexKeyGenerator.php
@@ -0,0 +1,173 @@
+ 'abcdefghijklmnopqrstuvwxyz',
+ 'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 'digits' => '0123456789',
+ 'special' => '!@#$%&*()-_=+[]{}<>?'
+ ];
+
+ // Secure random character from string
+ protected static function randomChar(string $chars): string
+ {
+ $max = mb_strlen($chars, '8bit') - 1;
+ return $chars[random_int(0, $max)];
+ }
+
+ // Build random string from provided charset
+ protected static function randomString(int $length, string $charset): string
+ {
+ if ($length <= 0) {
+ return '';
+ }
+ $out = '';
+ $clen = strlen($charset);
+ if ($clen === 0) {
+ throw new InvalidArgumentException('Charset must not be empty');
+ }
+ for ($i = 0; $i < $length; $i++) {
+ $out .= $charset[random_int(0, $clen - 1)];
+ }
+ return $out;
+ }
+
+ // Generate generic key (hex, base64 or custom char set)
+ public static function generateKey(int $length = 32, string $type = 'hex'): string
+ {
+ if ($length <= 0) return '';
+
+ if ($type === 'hex') {
+ // return hex string (length is number of chars)
+ $bytes = random_bytes((int)ceil($length / 2));
+ return substr(bin2hex($bytes), 0, $length);
+ }
+ if ($type === 'base64') {
+ $bytes = random_bytes($length);
+ return rtrim(strtr(base64_encode($bytes), '+/', '-_'), '=');
+ }
+ // custom: use provided type as charset
+ return self::randomString($length, $type);
+ }
+
+ // Generate username: optional prefix, random suffix; length is total length if provided
+ public static function generateUsername(string $prefix = '', int $length = 10, string $sep = '_'): string
+ {
+ $prefix = preg_replace('/[^A-Za-z0-9]/', '', $prefix);
+ $available = $length - strlen($prefix);
+ if ($available <= 0) {
+ return substr($prefix, 0, $length);
+ }
+ // small adjective + noun fallback arrays
+ $adjectives = ['quick','clever','silent','bright','brave','calm','wild','mighty'];
+ $nouns = ['fox','owl','hawk','pixel','node','byte','raven','spark'];
+ $part = $adjectives[random_int(0, count($adjectives)-1)]
+ . $nouns[random_int(0, count($nouns)-1)];
+ // append random digits to fulfill length
+ $digitsNeeded = max(0, $available - strlen($part));
+ $suffix = substr($part . self::randomString($digitsNeeded, self::$sets['digits']), 0, $available);
+ return $prefix === '' ? $suffix : ($prefix . $sep . $suffix);
+ }
+
+ // Generate URI-safe slug: groups count and each group's length
+ public static function generateUriSlug(int $groups = 3, int $groupLength = 6, string $sep = '-'): string
+ {
+ if ($groups <= 0 || $groupLength <= 0) return '';
+ $chars = strtolower(self::$sets['lower'] . self::$sets['digits']);
+ $parts = [];
+ for ($g = 0; $g < $groups; $g++) {
+ $parts[] = self::randomString($groupLength, $chars);
+ }
+ return implode($sep, $parts);
+ }
+
+ // Generate password with options: ensureMixed ensures at least one char from each requested set
+ public static function generatePassword(int $length = 16, bool $ensureMixed = true, array $includeSets = ['upper','lower','digits','special']): string
+ {
+ if ($length <= 0) return '';
+
+ // build charset
+ $charset = '';
+ $validSets = [];
+ foreach ($includeSets as $s) {
+ if (isset(self::$sets[$s])) {
+ $charset .= self::$sets[$s];
+ $validSets[] = $s;
+ }
+ }
+ if ($charset === '') {
+ $charset = self::$sets['lower'] . self::$sets['digits'];
+ $validSets = ['lower', 'digits'];
+ }
+
+ if (!$ensureMixed || count($validSets) === 1) {
+ return self::randomString($length, $charset);
+ }
+
+ // Ensure at least one char from each selected set
+ $passwordChars = [];
+ foreach ($validSets as $s) {
+ $passwordChars[] = self::randomChar(self::$sets[$s]);
+ }
+
+ // Fill remaining
+ $remaining = $length - count($passwordChars);
+ for ($i = 0; $i < $remaining; $i++) {
+ $passwordChars[] = self::randomChar($charset);
+ }
+
+ // Shuffle securely
+ $shuffled = [];
+ $len = count($passwordChars);
+ while ($len) {
+ $idx = random_int(0, $len - 1);
+ $shuffled[] = $passwordChars[$idx];
+ array_splice($passwordChars, $idx, 1);
+ $len--;
+ }
+ return implode('', $shuffled);
+ }
+
+ // Generate API version like XXXXX-XXXXX-XXXXX-XXXXX-XXXXX (uppercase letters and digits)
+ public static function generateApiVer(int $groups = 5, int $groupLength = 5, string $sep = '-'): string
+ {
+ if ($groups <= 0 || $groupLength <= 0) return '';
+ $chars = self::$sets['upper'] . self::$sets['digits'];
+ $parts = [];
+ for ($g = 0; $g < $groups; $g++) {
+ $parts[] = strtoupper(self::randomString($groupLength, $chars));
+ }
+ return implode($sep, $parts);
+ }
+
+ // Convenience: generate RFC4122 v4 UUID
+ public static function generateUuidV4(): string
+ {
+ $data = random_bytes(16);
+ // set version to 0100
+ $data[6] = chr((ord($data[6]) & 0x0f) | 0x40);
+ // set bits 6-7 to 10
+ $data[8] = chr((ord($data[8]) & 0x3f) | 0x80);
+ return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/v.0.4/SilverSoft.RunCommand.UniversalGenerator.php b/v.0.4/SilverSoft.RunCommand.UniversalGenerator.php
new file mode 100644
index 0000000..1c7493a
--- /dev/null
+++ b/v.0.4/SilverSoft.RunCommand.UniversalGenerator.php
@@ -0,0 +1,107 @@
+= 0");
+ }
+ $chars = [];
+ $v = $index;
+ while ($v > 0) {
+ $rem = $v % 26;
+ $chars[] = chr(65 + $rem);
+ $v = intdiv($v, 26);
+ }
+ while (count($chars) < $length) {
+ $chars[] = 'A';
+ }
+ $chars = array_reverse($chars);
+ $s = implode('', array_slice($chars, -1 * $length));
+ return $s;
+ }
+
+ // ApiKey: random or deterministic by index
+ public static function apiKey(?int $index = null, int $length = 8): string
+ {
+ return $index === null ? self::randomUpper($length) : self::fromIndexUpper($index, $length);
+ }
+
+ // UserName: same pattern as ApiKey (capitals)
+ public static function userName(?int $index = null, int $length = 8): string
+ {
+ return self::apiKey($index, $length);
+ }
+
+ // UploadUri: returns a path-friendly token (caps) optionally prefixed
+ public static function uploadUri(?int $index = null, int $length = 8, string $prefix = '/upload/'): string
+ {
+ $token = $index === null ? self::randomUpper($length) : self::fromIndexUpper($index, $length);
+ return rtrim($prefix, '/') . '/' . $token;
+ }
+
+ // Random password: letters (upper+lower) and digits, max length 16
+ public static function password(int $length = 16, bool $includeDigits = true): string
+ {
+ if ($length < 1) throw new InvalidArgumentException("Length must be >= 1");
+ if ($length > 16) $length = 16;
+ $chars = array_merge(
+ range('a', 'z'),
+ range('A', 'Z'),
+ $includeDigits ? range('0','9') : []
+ );
+ $out = '';
+ $max = count($chars) - 1;
+ for ($i = 0; $i < $length; $i++) {
+ $out .= $chars[random_int(0, $max)];
+ }
+ return $out;
+ }
+
+ // ProductKey: deterministic from index or random; format groups e.g. 5 groups of 5 capitals
+ public static function productKey(?int $index = null, int $groups = 5, int $groupLen = 5): string
+ {
+ $total = $groups * $groupLen;
+ if ($index === null) {
+ // random version
+ $s = self::randomUpper($total);
+ } else {
+ // deterministic: expand index across total length
+ $s = self::fromIndexUpper($index, $total);
+ }
+ $parts = [];
+ for ($i = 0; $i < $groups; $i++) {
+ $parts[] = substr($s, $i * $groupLen, $groupLen);
+ }
+ return implode('-', $parts);
+ }
+
+ // Next index
+ public static function nextIndex(int $index): int
+ {
+ if ($index < 0) throw new InvalidArgumentException("Index must be >= 0");
+ return $index + 1;
+ }
+
+ // Previous index (returns null when no previous)
+ public static function previousIndex(int $index): ?int
+ {
+ if ($index <= 0) return null;
+ return $index - 1;
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/v.0.4/SilverSoft.RunCommand.UniversalKeyGenerator.php b/v.0.4/SilverSoft.RunCommand.UniversalKeyGenerator.php
new file mode 100644
index 0000000..193c275
--- /dev/null
+++ b/v.0.4/SilverSoft.RunCommand.UniversalKeyGenerator.php
@@ -0,0 +1,256 @@
+generateRandomString(8, 'UPPERCASE');
+ }
+
+ /**
+ * Generate a random Username (8-12 characters, mixed case + numbers)
+ */
+ public function generateUsername() {
+ return $this->generateRandomString(mt_rand(8, 12), 'MIXED');
+ }
+
+ /**
+ * Generate a random Upload URI (format: /upload/XXXXXXXX)
+ */
+ public function generateUploadUri() {
+ $randomPart = $this->generateRandomString(8, 'UPPERCASE');
+ return "/upload/{$randomPart}";
+ }
+
+ /**
+ * Generate a random User Password (max 16 characters, any letters)
+ */
+ public function generateUserPassword() {
+ $length = mt_rand(8, 16);
+ $charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*';
+ return $this->generateCustomString($length, $charset);
+ }
+
+ /**
+ * Generate a Product Key (format: XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)
+ */
+ public function generateProductKey() {
+ $segments = [];
+ for ($i = 0; $i < 5; $i++) {
+ $segments[] = $this->generateRandomString(5, 'UPPERCASE');
+ }
+ return implode('-', $segments);
+ }
+
+ /**
+ * Get next API Key based on current
+ */
+ public function nextApiKey($current = null) {
+ if ($current === null && isset($this->currentState['apiKey'])) {
+ $current = $this->currentState['apiKey'];
+ }
+ $next = $this->incrementString($current ?? $this->generateApiKey(), 'UPPERCASE');
+ $this->currentState['apiKey'] = $next;
+ return $next;
+ }
+
+ /**
+ * Get previous API Key based on current
+ */
+ public function previousApiKey($current = null) {
+ if ($current === null && isset($this->currentState['apiKey'])) {
+ $current = $this->currentState['apiKey'];
+ }
+ $prev = $this->decrementString($current ?? $this->generateApiKey(), 'UPPERCASE');
+ $this->currentState['apiKey'] = $prev;
+ return $prev;
+ }
+
+ /**
+ * Get next Product Key
+ */
+ public function nextProductKey($current = null) {
+ if ($current === null && isset($this->currentState['productKey'])) {
+ $current = $this->currentState['productKey'];
+ }
+ $next = $this->incrementProductKey($current ?? $this->generateProductKey());
+ $this->currentState['productKey'] = $next;
+ return $next;
+ }
+
+ /**
+ * Get previous Product Key
+ */
+ public function previousProductKey($current = null) {
+ if ($current === null && isset($this->currentState['productKey'])) {
+ $current = $this->currentState['productKey'];
+ }
+ $prev = $this->decrementProductKey($current ?? $this->generateProductKey());
+ $this->currentState['productKey'] = $prev;
+ return $prev;
+ }
+
+ /**
+ * Helper: Generate random string of specified type
+ */
+ private function generateRandomString($length, $type = 'UPPERCASE') {
+ $charsets = [
+ 'UPPERCASE' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 'LOWERCASE' => 'abcdefghijklmnopqrstuvwxyz',
+ 'MIXED' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
+ 'NUMBERS' => '0123456789'
+ ];
+
+ $charset = $charsets[$type] ?? $charsets['MIXED'];
+ $result = '';
+ $maxIndex = strlen($charset) - 1;
+
+ for ($i = 0; $i < $length; $i++) {
+ $result .= $charset[mt_rand(0, $maxIndex)];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Helper: Generate custom string with custom charset
+ */
+ private function generateCustomString($length, $charset) {
+ $result = '';
+ $maxIndex = strlen($charset) - 1;
+
+ for ($i = 0; $i < $length; $i++) {
+ $result .= $charset[mt_rand(0, $maxIndex)];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Helper: Increment string (A->B, Z->AA)
+ */
+ private function incrementString($str, $type = 'UPPERCASE') {
+ $charset = ($type === 'UPPERCASE') ? 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' : 'abcdefghijklmnopqrstuvwxyz';
+ $result = str_split($str);
+ $carry = 1;
+
+ for ($i = count($result) - 1; $i >= 0 && $carry; $i--) {
+ $pos = strpos($charset, $result[$i]);
+ if ($pos !== false) {
+ $pos += $carry;
+ if ($pos >= strlen($charset)) {
+ $result[$i] = $charset[0];
+ $carry = 1;
+ } else {
+ $result[$i] = $charset[$pos];
+ $carry = 0;
+ }
+ }
+ }
+
+ if ($carry) {
+ array_unshift($result, $charset[0]);
+ }
+
+ return implode('', $result);
+ }
+
+ /**
+ * Helper: Decrement string (B->A, AA->Z)
+ */
+ private function decrementString($str, $type = 'UPPERCASE') {
+ $charset = ($type === 'UPPERCASE') ? 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' : 'abcdefghijklmnopqrstuvwxyz';
+ $result = str_split($str);
+ $borrow = 1;
+
+ for ($i = count($result) - 1; $i >= 0 && $borrow; $i--) {
+ $pos = strpos($charset, $result[$i]);
+ if ($pos !== false) {
+ $pos -= $borrow;
+ if ($pos < 0) {
+ $result[$i] = $charset[strlen($charset) - 1];
+ $borrow = 1;
+ } else {
+ $result[$i] = $charset[$pos];
+ $borrow = 0;
+ }
+ }
+ }
+
+ if (count($result) > 1 && $result[0] === $charset[strlen($charset) - 1]) {
+ array_shift($result);
+ }
+
+ return implode('', $result);
+ }
+
+ /**
+ * Helper: Increment Product Key
+ */
+ private function incrementProductKey($key) {
+ $segments = explode('-', $key);
+ $carry = 1;
+
+ for ($i = count($segments) - 1; $i >= 0 && $carry; $i--) {
+ $segments[$i] = $this->incrementString($segments[$i], 'UPPERCASE');
+ if ($segments[$i] !== 'A' || $segments[$i] === 'AAAAAA') {
+ $carry = 0;
+ }
+ }
+
+ return implode('-', $segments);
+ }
+
+ /**
+ * Helper: Decrement Product Key
+ */
+ private function decrementProductKey($key) {
+ $segments = explode('-', $key);
+ $borrow = 1;
+
+ for ($i = count($segments) - 1; $i >= 0 && $borrow; $i--) {
+ $prev = $segments[$i];
+ $segments[$i] = $this->decrementString($segments[$i], 'UPPERCASE');
+ if ($segments[$i] !== $prev) {
+ $borrow = 0;
+ }
+ }
+
+ return implode('-', $segments);
+ }
+
+ /**
+ * Reset current state
+ */
+ public function resetState() {
+ $this->currentState = [];
+ }
+}
+
+// Example Usage:
+if (php_sapi_name() === 'cli') {
+ $generator = new UniversalKeyGenerator();
+
+ echo "=== RANDOM GENERATION ===\n";
+ echo "API Key: " . $generator->generateApiKey() . "\n";
+ echo "Username: " . $generator->generateUsername() . "\n";
+ echo "Upload URI: " . $generator->generateUploadUri() . "\n";
+ echo "Password: " . $generator->generateUserPassword() . "\n";
+ echo "Product Key: " . $generator->generateProductKey() . "\n\n";
+
+ echo "=== SEQUENTIAL GENERATION ===\n";
+ $apiKey = $generator->generateApiKey();
+ echo "Current API Key: $apiKey\n";
+ echo "Next API Key: " . $generator->nextApiKey($apiKey) . "\n";
+ echo "Previous API Key: " . $generator->previousApiKey() . "\n\n";
+
+ $productKey = $generator->generateProductKey();
+ echo "Current Product Key: $productKey\n";
+ echo "Next Product Key: " . $generator->nextProductKey($productKey) . "\n";
+ echo "Previous Product Key: " . $generator->previousProductKey() . "\n";
+}
+?>
\ No newline at end of file
diff --git a/v.0.4/SilverSoft.ValidateTest.ComplexKeyGenerator.php b/v.0.4/SilverSoft.ValidateTest.ComplexKeyGenerator.php
new file mode 100644
index 0000000..b0d7ebd
--- /dev/null
+++ b/v.0.4/SilverSoft.ValidateTest.ComplexKeyGenerator.php
@@ -0,0 +1,52 @@
+
\ No newline at end of file
diff --git a/v.0.4/SilverSoft.ValidateTest.UniversalGenerator.php b/v.0.4/SilverSoft.ValidateTest.UniversalGenerator.php
new file mode 100644
index 0000000..7c65be0
--- /dev/null
+++ b/v.0.4/SilverSoft.ValidateTest.UniversalGenerator.php
@@ -0,0 +1,26 @@
+
\ No newline at end of file
diff --git a/v.0.4/SilverSoft.ValidateTest.UniversalKeyGenerator.php b/v.0.4/SilverSoft.ValidateTest.UniversalKeyGenerator.php
new file mode 100644
index 0000000..b68d582
--- /dev/null
+++ b/v.0.4/SilverSoft.ValidateTest.UniversalKeyGenerator.php
@@ -0,0 +1,44 @@
+generateApiKey() . "\n";
+ echo "Username: " . $generator->generateUsername() . "\n";
+ echo "Upload URI: " . $generator->generateUploadUri() . "\n";
+ echo "Password: " . $generator->generateUserPassword() . "\n";
+ echo "Product Key: " . $generator->generateProductKey() . "\n\n";
+
+ echo "=== SEQUENTIAL GENERATION ===\n";
+ $apiKey = $generator->generateApiKey();
+ echo "Current API Key: $apiKey\n";
+ echo "Next API Key: " . $generator->nextApiKey($apiKey) . "\n";
+ echo "Previous API Key: " . $generator->previousApiKey() . "\n\n";
+
+ $productKey = $generator->generateProductKey();
+ echo "Current Product Key: $productKey\n";
+ echo "Next Product Key: " . $generator->nextProductKey($productKey) . "\n";
+ echo "Previous Product Key: " . $generator->previousProductKey() . "\n";
+} else {
+ $generator = new UniversalKeyGenerator();
+ echo "=== RANDOM GENERATION ===\n";
+ echo "API Key: " . $generator->generateApiKey() . "\n";
+ echo "Username: " . $generator->generateUsername() . "\n";
+ echo "Upload URI: " . $generator->generateUploadUri() . "\n";
+ echo "Password: " . $generator->generateUserPassword() . "\n";
+ echo "Product Key: " . $generator->generateProductKey() . "\n\n";
+
+ echo "=== SEQUENTIAL GENERATION ===\n";
+ $apiKey = $generator->generateApiKey();
+ echo "Current API Key: $apiKey\n";
+ echo "Next API Key: " . $generator->nextApiKey($apiKey) . "\n";
+ echo "Previous API Key: " . $generator->previousApiKey() . "\n\n";
+
+ $productKey = $generator->generateProductKey();
+ echo "Current Product Key: $productKey\n";
+ echo "Next Product Key: " . $generator->nextProductKey($productKey) . "\n";
+ echo "Previous Product Key: " . $generator->previousProductKey() . "\n";
+}
+?>
\ No newline at end of file
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_Data/CANG_Config.php b/v.0.5.FinallVersion/Base_CANG/CANG_Data/CANG_Config.php
new file mode 100644
index 0000000..fbb2bb4
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_Data/CANG_Config.php
@@ -0,0 +1,45 @@
+>
+ */
+ public static function Build(): array
+ {
+ return [
+ 'Language_Symbol' => [
+ 'Upper' => range('A', 'Z'),
+ 'Lower' => range('a', 'z'),
+ 'Numeric' => range('0', '9'),
+ 'CharShort' => str_split('_-'),
+ 'CharLong' => str_split('#$%&+-@'),
+ ],
+ 'Language_Display' => [
+ 'Upper' => '[A-Z]',
+ 'Lower' => '[a-z]',
+ 'Numeric' => '[0-9]',
+ 'CharShort' => '[-_]',
+ 'CharLong' => '[#$%&+-@]',
+ ],
+ ];
+ }
+}
+
+/*
+Example usage:
+
+$LanguageConfig = CANG_Config::Build();
+$LanguageSymbol = $Config['Language_Symbol'];
+$LanguageDisplay = $Config['Language_Display'];
+
+
+// Quick run example when this file is executed directly.
+if (realpath((string)($_SERVER['SCRIPT_FILENAME'] ?? '')) === __FILE__) {
+ $LanguageConfig = CANG_Config::Build();
+ echo json_encode($LanguageConfig, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL;
+}
+*/
\ No newline at end of file
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_Data/CANG_Language.php b/v.0.5.FinallVersion/Base_CANG/CANG_Data/CANG_Language.php
new file mode 100644
index 0000000..b5a73f5
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_Data/CANG_Language.php
@@ -0,0 +1,186 @@
+>
+ */
+ public static function Build(): array
+ {
+ $config = CANG_Config::Build();
+
+ if (!isset($config['Language_Symbol'], $config['Language_Display'])) {
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+
+ $Language_Symbol = $config['Language_Symbol'];
+ $Language_Display = $config['Language_Display'];
+
+ return [
+ 0 => [
+ 'Language_Id' => 0,
+ 'Language_Name' => 'Alphabet_Upper',
+ 'Language_Type' => $Language_Display['Upper'],
+ 'Language_Description' => 'Alphabetical -> Simple: Capital Letters',
+ 'Language_Range' => [$Language_Symbol['Upper']],
+ ],
+ 1 => [
+ 'Language_Id' => 1,
+ 'Language_Name' => 'Alphabet_Lower',
+ 'Language_Type' => $Language_Display['Lower'],
+ 'Language_Description' => 'Alphabetical -> Simple: Small Letters',
+ 'Language_Range' => [$Language_Symbol['Lower']],
+ ],
+ 2 => [
+ 'Language_Id' => 2,
+ 'Language_Name' => 'Alphabet_Mix',
+ 'Language_Type' => [$Language_Display['Upper'], $Language_Display['Lower']],
+ 'Language_Description' => 'Alphabetical -> Mix: Capital And Small Letters',
+ 'Language_Range' => [$Language_Symbol['Upper'], $Language_Symbol['Lower']],
+ ],
+ 3 => [
+ 'Language_Id' => 3,
+ 'Language_Name' => 'Numeric',
+ 'Language_Type' => $Language_Display['Numeric'],
+ 'Language_Description' => 'Numerical -> Simple',
+ 'Language_Range' => [$Language_Symbol['Numeric']],
+ ],
+ 4 => [
+ 'Language_Id' => 4,
+ 'Language_Name' => 'Alphabet_Upper_Num',
+ 'Language_Type' => [$Language_Display['Upper'], $Language_Display['Numeric']],
+ 'Language_Description' => 'Alphabetical And Numerical -> Simple: Capital Letters (Microsoft/Megaupload.com)',
+ 'Language_Range' => [$Language_Symbol['Upper'], $Language_Symbol['Numeric']],
+ ],
+ 5 => [
+ 'Language_Id' => 5,
+ 'Language_Name' => 'Alphabet_Lower_Num',
+ 'Language_Type' => [$Language_Display['Lower'], $Language_Display['Numeric']],
+ 'Language_Description' => 'Alphabetical And Numerical -> Simple: Small Letters',
+ 'Language_Range' => [$Language_Symbol['Lower'], $Language_Symbol['Numeric']],
+ ],
+ 6 => [
+ 'Language_Id' => 6,
+ 'Language_Name' => 'Alphabet_Mix_Num',
+ 'Language_Type' => [$Language_Display['Upper'], $Language_Display['Lower'], $Language_Display['Numeric']],
+ 'Language_Description' => 'Alphabetical And Numerical -> Mix: Capital And Small Letters',
+ 'Language_Range' => [$Language_Symbol['Upper'], $Language_Symbol['Lower'], $Language_Symbol['Numeric']],
+ ],
+ 7 => [
+ 'Language_Id' => 7,
+ 'Language_Name' => 'Alphabet_Mix_Num_CharShort',
+ 'Language_Type' => [$Language_Display['Upper'], $Language_Display['Lower'], $Language_Display['Numeric'], $Language_Display['CharShort']],
+ 'Language_Description' => 'Alphabetical And Numerical -> Mix: Capital/Small Letters Plus Short Special Chars (YouTube.com)',
+ 'Language_Range' => [$Language_Symbol['Upper'], $Language_Symbol['Lower'], $Language_Symbol['Numeric'], $Language_Symbol['CharShort']],
+ ],
+ 8 => [
+ 'Language_Id' => 8,
+ 'Language_Name' => 'Alphabet_Mix_Num_CharLong',
+ 'Language_Type' => [$Language_Display['Upper'], $Language_Display['Lower'], $Language_Display['Numeric'], $Language_Display['CharLong']],
+ 'Language_Description' => 'Alphabetical And Numerical -> Mix: Capital/Small Letters Plus Long Special Chars (Safe Password)',
+ 'Language_Range' => [$Language_Symbol['Upper'], $Language_Symbol['Lower'], $Language_Symbol['Numeric'], $Language_Symbol['CharLong']],
+ ],
+ 9 => [
+ 'Language_Id' => 9,
+ 'Language_Name' => 'Alphabet_Mix_Num_CharMix',
+ 'Language_Type' => [$Language_Display['Upper'], $Language_Display['Lower'], $Language_Display['Numeric'], $Language_Display['CharShort'], $Language_Display['CharLong']],
+ 'Language_Description' => 'Alphabetical And Numerical -> Mix: Capital/Small Letters Plus Full Special Chars (Safe Password)',
+ 'Language_Range' => [$Language_Symbol['Upper'], $Language_Symbol['Lower'], $Language_Symbol['Numeric'], $Language_Symbol['CharShort'], $Language_Symbol['CharLong']],
+ ],
+ ];
+ }
+
+ /**
+ * Get one language definition by Language_Id.
+ *
+ * @return array
+ */
+ public static function ById(int $Language_Id): array
+ {
+ $Language = self::Build();
+ if (!array_key_exists($Language_Id, $Language)) {
+ throw new OutOfBoundsException('ERR_PROFILE_NOT_FOUND');
+ }
+
+ $Profile = $Language[$Language_Id];
+ $Config = CANG_Config::Build();
+
+ if (
+ !isset($Config['Language_Symbol']) || !is_array($Config['Language_Symbol']) ||
+ !isset($Config['Language_Display']) || !is_array($Config['Language_Display'])
+ ) {
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+
+ $Symbol_Map = [];
+ foreach ($Profile['Language_Range'] as $Group) {
+ $Field_Name = self::FindFieldByGroup($Group, $Config['Language_Symbol']);
+ $Symbol_Map[$Field_Name] = $Group;
+ }
+
+ $Type_List = $Profile['Language_Type'];
+ if (!is_array($Type_List)) {
+ $Type_List = [$Type_List];
+ }
+
+ $Display_Map = [];
+ foreach ($Type_List as $Display_Value) {
+ $Field_Name = self::FindFieldByDisplay($Display_Value, $Config['Language_Display']);
+ $Display_Map[$Field_Name] = $Display_Value;
+ }
+
+ $Profile['Language_Symbol'] = $Symbol_Map;
+ $Profile['Language_Display'] = $Display_Map;
+
+ return $Profile;
+ }
+
+ /**
+ * @param array $Group
+ * @param array> $Language_Symbol
+ */
+ private static function FindFieldByGroup(array $Group, array $Language_Symbol): string
+ {
+ foreach ($Language_Symbol as $Field_Name => $Symbol_Group) {
+ if ($Group === $Symbol_Group) {
+ return $Field_Name;
+ }
+ }
+
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+
+ /**
+ * @param array $Language_Display
+ */
+ private static function FindFieldByDisplay(string $Display_Value, array $Language_Display): string
+ {
+ foreach ($Language_Display as $Field_Name => $Configured_Value) {
+ if ($Display_Value === $Configured_Value) {
+ return $Field_Name;
+ }
+ }
+
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+}
+
+/*
+Example usage:
+
+$Language = CANG_Language::Build();
+$Profile = CANG_Language::ById(7);
+
+
+if (realpath((string) ($_SERVER['SCRIPT_FILENAME'] ?? '')) === __FILE__) {
+ $Language = CANG_Language::Build();
+ echo json_encode($Language, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL;
+}
+*/
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_Core.php b/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_Core.php
new file mode 100644
index 0000000..7e3c9b9
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_Core.php
@@ -0,0 +1,338 @@
+ */
+ private static array $Symbol_List = [];
+ /** @var array */
+ private static array $Symbol_Index = [];
+ private static bool $Is_Configured = false;
+
+ /**
+ * Configure core runtime with pure symbol data.
+ *
+ * @param array $Symbol_List
+ * @param array $Symbol_Index
+ */
+ public static function Setup(array $Symbol_List, array $Symbol_Index): void
+ {
+ self::$Symbol_List = array_values($Symbol_List);
+ self::$Symbol_Index = $Symbol_Index;
+ self::$Is_Configured = true;
+ }
+
+ /**
+ * Convert a code string into its numeric id using base-N positional math.
+ * - Each character is looked up in Symbol_Index.
+ * - Left-to-right fold: Id = Id * Base + Digit.
+ * - Throws if any character is not in the configured alphabet.
+ */
+ public static function ConvertTo_Id(string $Code): int
+ {
+ self::EnsureReady();
+
+ $Base = count(self::$Symbol_List);
+ $Id = 0;
+ $Length = strlen($Code);
+
+ for ($I = 0; $I < $Length; $I++) {
+ $Char = $Code[$I];
+ $Digit = self::$Symbol_Index[$Char] ?? null;
+ if ($Digit === null) {
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+ if ($Id > intdiv(PHP_INT_MAX - $Digit, $Base)) {
+ return PHP_INT_MAX;
+ }
+ $Id = ($Id * $Base) + $Digit;
+ }
+
+ return $Id;
+ }
+
+ /**
+ * Convert a numeric id into a fixed-length code string.
+ * - Repeatedly divides by Base to get digits from right to left.
+ * - Left-pads with first alphabet symbol when value has fewer digits.
+ * - Throws when Number cannot fit in the requested Length.
+ */
+ public static function ConvertTo_Code(int $Number, int $Length): string
+ {
+ self::EnsureReady();
+ self::EnsureLength($Length);
+
+ if ($Number < 0) {
+ throw new InvalidArgumentException('ERR_NUMBER_REQUIRED');
+ }
+
+ $Base = count(self::$Symbol_List);
+ $Buffer = array_fill(0, $Length, self::$Symbol_List[0]);
+ $Work = $Number;
+
+ for ($I = $Length - 1; $I >= 0; $I--) {
+ $Digit = $Work % $Base;
+ $Buffer[$I] = self::$Symbol_List[$Digit];
+ $Work = intdiv($Work, $Base);
+ }
+
+ if ($Work > 0) {
+ throw new InvalidArgumentException('ERR_NUMBER_OUT_OF_RANGE');
+ }
+
+ return implode('', $Buffer);
+ }
+
+ /**
+ * Return the first sequence value for the selected alphabet and length.
+ * Equivalent to Id(0, Length).
+ *
+ * @return array
+ */
+ public static function Beginy(int $Length): array
+ {
+ return self::Id(0, $Length);
+ }
+
+ /**
+ * Return the previous sequence value for a given code.
+ * - Resolves current Id first.
+ * - Subtracts 1 and returns the converted pair.
+ * - Throws when already at sequence start.
+ *
+ * @return array
+ */
+ public static function Previous(string $Code, int $Length): array
+ {
+ $Current = self::Current($Code, $Length);
+ $Prev_Id = (int) $Current['Id'] - 1;
+ if ($Prev_Id < 0) {
+ throw new InvalidArgumentException('ERR_SEQUENCE_START');
+ }
+
+ return self::Id($Prev_Id, $Length);
+ }
+
+ /**
+ * Return the current pair for input code.
+ * - Converts Code -> Id.
+ * - Returns both values in unified shape.
+ *
+ * @return array
+ */
+ public static function Current(string $Code, int $Length): array
+ {
+ self::EnsureLength($Length);
+
+ $Id = self::ConvertTo_Id($Code);
+
+ return [
+ 'Code' => $Code,
+ 'Id' => $Id,
+ ];
+ }
+
+ /**
+ * Return the next sequence value for a given code.
+ * - Resolves current Id first.
+ * - Adds 1 and returns the converted pair.
+ * - Throws when already at sequence end.
+ *
+ * @return array
+ */
+ public static function Next(string $Code, int $Length): array
+ {
+ $Current = self::Current($Code, $Length);
+ $Next_Id = (int) $Current['Id'] + 1;
+ if ($Next_Id > self::GetMaxNumber($Length)) {
+ throw new InvalidArgumentException('ERR_SEQUENCE_END');
+ }
+
+ return self::Id($Next_Id, $Length);
+ }
+
+ /**
+ * Return the last possible sequence value for the given length.
+ *
+ * @return array
+ */
+ public static function End(int $Length): array
+ {
+ return self::Id(self::GetMaxNumber($Length), $Length);
+ }
+
+ /**
+ * Return one random valid sequence value for the given length.
+ * - Builds random code from configured symbols.
+ * - Resolves and returns unified current pair.
+ *
+ * @return array
+ */
+ public static function Random(int $Length): array
+ {
+ self::EnsureReady();
+ self::EnsureLength($Length);
+
+ $Max = count(self::$Symbol_List) - 1;
+ $Code = '';
+ for ($I = 0; $I < $Length; $I++) {
+ $Code .= self::$Symbol_List[random_int(0, $Max)];
+ }
+
+ return self::Current($Code, $Length);
+ }
+
+ /**
+ * Return sequence pair from explicit numeric id and length.
+ *
+ * @return array
+ */
+ public static function Id(int $Number, int $Length): array
+ {
+ $Code = self::ConvertTo_Code($Number, $Length);
+ return self::Current($Code, $Length);
+ }
+
+ /**
+ * Guard that core runtime is configured with a usable symbol set.
+ */
+ private static function EnsureReady(): void
+ {
+ if (!self::$Is_Configured || count(self::$Symbol_List) < 2) {
+ throw new InvalidArgumentException('ERR_CORE_NOT_CONFIGURED');
+ }
+ }
+
+ /**
+ * Guard that requested length is valid for generation/conversion.
+ */
+ private static function EnsureLength(int $Length): void
+ {
+ if ($Length < 1) {
+ throw new InvalidArgumentException('ERR_LENGTH_REQUIRED');
+ }
+ }
+
+ /**
+ * Calculate maximum id for current Base and requested Length:
+ * Max = (Base^Length) - 1
+ */
+ private static function GetMaxNumber(int $Length): int
+ {
+ self::EnsureReady();
+ self::EnsureLength($Length);
+
+ $Base = count(self::$Symbol_List);
+ $Max = 1;
+ for ($I = 0; $I < $Length; $I++) {
+ $Max *= $Base;
+ }
+
+ return $Max - 1;
+ }
+}
+
+/*
+Runnable Example: CANG_Core Sequence Demo
+Description:
+- Configures `CANG_Core` with a small symbol set.
+- Demonstrates each sequence mode in practical order.
+- Prints one JSON object so developer can inspect each result.
+
+Step 0) Configure core once with Symbol list and Index map:
+$Symbol_List = ['A', 'B', '0', '1', '_'];
+$Symbol_Index = [
+ 'A' => 0,
+ 'B' => 1,
+ '0' => 2,
+ '1' => 3,
+ '_' => 4,
+];
+// CANG_Core::Setup($Symbol_List, $Symbol_Index);
+
+Step 1) Beginy(Length): first code of selected alphabet/length.
+$Beginy = CANG_Core::Beginy(4); // First
+
+Step 2) Next(Code, Length): move forward from current code.
+$Next_1 = CANG_Core::Next($Beginy['Code'], 4); // Second
+$Next_2 = CANG_Core::Next($Next_1['Code'], 4); // Third
+
+Step 3) Previous(Code, Length): move backward from current code.
+$Previous = CANG_Core::Previous($Next_2['Code'], 4); // Back to second
+
+Step 4) Current(Code, Length): read code + id for any current code.
+$Current = CANG_Core::Current($Next_1['Code'], 4);
+
+Step 5) End(Length): last possible code for selected alphabet/length.
+$End = CANG_Core::End(4);
+
+Step 6) Random(Length): random valid code.
+$Random = CANG_Core::Random(4);
+
+Step 7) Id(Number, Length): build code from explicit id.
+$From_Id = CANG_Core::Id(17, 4);
+*/
+
+/*
+// Run this demo only when executing this file directly.
+if (realpath((string) ($_SERVER['SCRIPT_FILENAME'] ?? '')) === __FILE__) {
+ $Symbol_List = ['A', 'B', '0', '1', '_'];
+ $Symbol_Index = [
+ 'A' => 0,
+ 'B' => 1,
+ '0' => 2,
+ '1' => 3,
+ '_' => 4,
+ ];
+
+ CANG_Core::Setup($Symbol_List, $Symbol_Index);
+
+ // 1) Beginy: generate first sequence pair from Id=0.
+ $Beginy = CANG_Core::Beginy(4);
+
+ // 2) Next: move one step forward from Beginy.
+ $Next_1 = CANG_Core::Next((string) $Beginy['Code'], 4);
+ // 2b) Next again: move one more step forward.
+ $Next_2 = CANG_Core::Next((string) $Next_1['Code'], 4);
+
+ // 3) Previous: move one step backward from Next_2.
+ $Previous = CANG_Core::Previous((string) $Next_2['Code'], 4);
+
+ // 4) Current: resolve exact Code <-> Id pair for an existing code.
+ $Current = CANG_Core::Current((string) $Next_1['Code'], 4);
+
+ // 5) End: generate final sequence pair for the same Length.
+ $End = CANG_Core::End(4);
+
+ // 6) Random: generate one random valid pair.
+ $Random = CANG_Core::Random(4);
+
+ // 7) Id: generate pair from explicit number.
+ $From_Id = CANG_Core::Id(17, 4);
+
+ $Runnable_Example_Output = [
+ 'How_To_Read' => [
+ 'Beginy' => 'First sequence pair (Id=0).',
+ 'Next_1' => 'One step after Beginy.',
+ 'Next_2' => 'Two steps after Beginy.',
+ 'Previous_From_Next_2' => 'Back one step from Next_2.',
+ 'Current' => 'Resolve current Code -> Id.',
+ 'End' => 'Last sequence pair for Length.',
+ 'Random' => 'Random valid pair for Length.',
+ 'Id_17' => 'Pair generated from Number=17.',
+ ],
+ 'Sequence' => [
+ 'Beginy' => $Beginy,
+ 'Next_1' => $Next_1,
+ 'Next_2' => $Next_2,
+ 'Previous_From_Next_2' => $Previous,
+ ],
+ 'Current' => $Current,
+ 'End' => $End,
+ 'Random' => $Random,
+ 'Id_17' => $From_Id,
+ ];
+
+ echo json_encode($Runnable_Example_Output, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL;
+}
+*/
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_DataBase.php b/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_DataBase.php
new file mode 100644
index 0000000..ac6c6c7
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_DataBase.php
@@ -0,0 +1,233 @@
+ $Options
+ */
+ public function __construct(string $DSN, string $User = '', string $Password = '', array $Options = [])
+ {
+ $Default_Options = [
+ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
+ \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
+ \PDO::ATTR_EMULATE_PREPARES => false,
+ ];
+
+ $this->PDO = new \PDO($DSN, $User, $Password, $Options + $Default_Options);
+ }
+
+ /**
+ * @param array $Data
+ */
+ public function Insert(string $Table, array $Data): int
+ {
+ if ($Data === []) {
+ throw new \InvalidArgumentException('ERR_INSERT_DATA_REQUIRED');
+ }
+
+ $Columns = array_keys($Data);
+ $Placeholders = array_map(static fn(string $Column): string => ':' . $Column, $Columns);
+
+ $SQL = sprintf(
+ 'INSERT INTO %s (%s) VALUES (%s)',
+ $Table,
+ implode(', ', $Columns),
+ implode(', ', $Placeholders)
+ );
+
+ $Statement = $this->PDO->prepare($SQL);
+ foreach ($Data as $Column => $Value) {
+ $Statement->bindValue(':' . $Column, $Value);
+ }
+ $Statement->execute();
+
+ return (int) $this->PDO->lastInsertId();
+ }
+
+ /**
+ * @param array $Where
+ * @return array>
+ */
+ public function Select(string $Table, array $Where = [], string $Columns = '*', int $Limit = 0): array
+ {
+ $SQL = sprintf('SELECT %s FROM %s', $Columns, $Table);
+ $Params = [];
+
+ if ($Where !== []) {
+ [$Where_SQL, $Params] = $this->BuildWhere($Where);
+ $SQL .= ' WHERE ' . $Where_SQL;
+ }
+
+ if ($Limit > 0) {
+ $SQL .= ' LIMIT ' . $Limit;
+ }
+
+ $Statement = $this->PDO->prepare($SQL);
+ foreach ($Params as $Key => $Value) {
+ $Statement->bindValue($Key, $Value);
+ }
+ $Statement->execute();
+
+ /** @var array> $Rows */
+ $Rows = $Statement->fetchAll();
+ return $Rows;
+ }
+
+ /**
+ * @param array $Data
+ * @param array $Where
+ */
+ public function Update(string $Table, array $Data, array $Where): int
+ {
+ if ($Data === []) {
+ throw new \InvalidArgumentException('ERR_UPDATE_DATA_REQUIRED');
+ }
+ if ($Where === []) {
+ throw new \InvalidArgumentException('ERR_WHERE_REQUIRED');
+ }
+
+ $Set_Parts = [];
+ $Params = [];
+ foreach ($Data as $Column => $Value) {
+ $Param_Key = ':set_' . $Column;
+ $Set_Parts[] = $Column . ' = ' . $Param_Key;
+ $Params[$Param_Key] = $Value;
+ }
+
+ [$Where_SQL, $Where_Params] = $this->BuildWhere($Where);
+ $Params += $Where_Params;
+
+ $SQL = sprintf(
+ 'UPDATE %s SET %s WHERE %s',
+ $Table,
+ implode(', ', $Set_Parts),
+ $Where_SQL
+ );
+
+ $Statement = $this->PDO->prepare($SQL);
+ foreach ($Params as $Key => $Value) {
+ $Statement->bindValue($Key, $Value);
+ }
+ $Statement->execute();
+
+ return $Statement->rowCount();
+ }
+
+ /**
+ * @param array $Where
+ */
+ public function Delete(string $Table, array $Where): int
+ {
+ if ($Where === []) {
+ throw new \InvalidArgumentException('ERR_WHERE_REQUIRED');
+ }
+
+ [$Where_SQL, $Params] = $this->BuildWhere($Where);
+ $SQL = sprintf('DELETE FROM %s WHERE %s', $Table, $Where_SQL);
+
+ $Statement = $this->PDO->prepare($SQL);
+ foreach ($Params as $Key => $Value) {
+ $Statement->bindValue($Key, $Value);
+ }
+ $Statement->execute();
+
+ return $Statement->rowCount();
+ }
+
+ /**
+ * Validate database existence check input/source and return check contract.
+ *
+ * Contract:
+ * - Status: CHECK_ERROR | CHECK_SUCCESS
+ * - Reason: INVALID_INPUT | VALID_INPUT | SOURCE_FAILED
+ * - Flow: FLOW_EXISTENCE_CHECK_INPUT_FAILED | FLOW_EXISTENCE_CHECK_INPUT_PASSED | FLOW_EXISTENCE_CHECK_SOURCE_FAILED
+ *
+ * @param array $Where
+ * @return array
+ */
+ public function ExistenceCheck(string $Table, array $Where): array
+ {
+ if (trim($Table) === '' || $Where === []) {
+ return [
+ 'Status' => 'CHECK_ERROR',
+ 'Reason' => 'INVALID_INPUT',
+ 'Flow' => 'FLOW_EXISTENCE_CHECK_INPUT_FAILED',
+ 'Exists' => false,
+ ];
+ }
+
+ try {
+ $Rows = $this->Select($Table, $Where, '*', 1);
+ $Exists = count($Rows) > 0;
+
+ return [
+ 'Status' => 'CHECK_SUCCESS',
+ 'Reason' => 'VALID_INPUT',
+ 'Flow' => 'FLOW_EXISTENCE_CHECK_INPUT_PASSED',
+ 'Exists' => $Exists,
+ ];
+ } catch (\Throwable $Throwable) {
+ return [
+ 'Status' => 'CHECK_ERROR',
+ 'Reason' => 'SOURCE_FAILED',
+ 'Flow' => 'FLOW_EXISTENCE_CHECK_SOURCE_FAILED',
+ 'Exists' => false,
+ 'Error_Message' => $Throwable->getMessage(),
+ ];
+ }
+ }
+
+ /**
+ * @param array $Where
+ * @return array{0:string,1:array}
+ */
+ private function BuildWhere(array $Where): array
+ {
+ $Parts = [];
+ $Params = [];
+
+ foreach ($Where as $Column => $Value) {
+ $Param_Key = ':where_' . $Column;
+ $Parts[] = $Column . ' = ' . $Param_Key;
+ $Params[$Param_Key] = $Value;
+ }
+
+ return [implode(' AND ', $Parts), $Params];
+ }
+}
+
+/*
+Simple ISUD Example (Insert, Select, Update, Delete):
+
+// 1) Create DB instance (SQLite example).
+$DB = new CANG_DataBase('sqlite:' . __DIR__ . '/Example.sqlite');
+
+// 2) Create a sample table (one-time setup).
+$PDO = new PDO('sqlite:' . __DIR__ . '/Example.sqlite');
+$PDO->exec('CREATE TABLE IF NOT EXISTS cang_codes (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ code TEXT NOT NULL,
+ type_id INTEGER NOT NULL
+)');
+
+// 3) Insert
+$New_Id = $DB->Insert('cang_codes', [
+ 'code' => 'AB12CD34',
+ 'type_id' => 7,
+]);
+
+// 4) Select
+$Rows = $DB->Select('cang_codes', ['id' => $New_Id]);
+
+// 5) Update
+$Changed = $DB->Update('cang_codes', ['code' => 'ZX98YU76'], ['id' => $New_Id]);
+
+// 6) Delete
+$Removed = $DB->Delete('cang_codes', ['id' => $New_Id]);
+
+// 7) Existence check contract (for CANG_Driver generated code verification)
+$Check = $DB->ExistenceCheck('cang_codes', ['code' => 'AB12CD34']);
+*/
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_Driver.php b/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_Driver.php
new file mode 100644
index 0000000..80ca83b
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_Driver.php
@@ -0,0 +1,367 @@
+|null */
+ private ?array $Selected_Profile = null;
+
+ public function SetLength(int $Length): self
+ {
+ if ($Length < 1) {
+ throw new InvalidArgumentException('ERR_LENGTH_REQUIRED');
+ }
+ $this->Length = $Length;
+ return $this;
+ }
+
+ public function SetType(int $Type): self
+ {
+ if ($Type < 0) {
+ throw new InvalidArgumentException('ERR_PROFILE_NOT_FOUND');
+ }
+ $this->Type = $Type;
+ $this->Selected_Profile = null;
+ return $this;
+ }
+
+ public function SetOrder(string $Order_Key): self
+ {
+ $this->Order_Key = $Order_Key;
+ $this->Selected_Profile = null;
+ return $this;
+ }
+
+ /**
+ * Join CANG_ProFile + CANG_Core.
+ * - Select profile by Type + Order.
+ * - Setup core with Symbol + Index.
+ *
+ * @return array
+ */
+ public function Load(): array
+ {
+ if ($this->Selected_Profile === null) {
+ CANG_ProFile::SetId($this->Type);
+ $Preview = CANG_ProFile::BuildOrderProfiles();
+ if (!isset($Preview['Orders'][$this->Order_Key])) {
+ $this->Order_Key = 'Order_1';
+ }
+ $this->Selected_Profile = CANG_ProFile::SelectOrder($this->Order_Key);
+ }
+
+ /** @var array $Symbol_List */
+ $Symbol_List = $this->Selected_Profile['Profile']['Symbol'];
+ /** @var array $Symbol_Index */
+ $Symbol_Index = $this->Selected_Profile['Profile']['Index'];
+ CANG_Core::Setup($Symbol_List, $Symbol_Index);
+
+ return $this->Selected_Profile;
+ }
+
+ /**
+ * Validate core internal configuration:
+ * ValidateCore(Code, Length) -> Length must equal strlen(Code)
+ *
+ * @return array
+ */
+ public function ValidateCore(string $Code, int $Length): array
+ {
+ if ($Length !== strlen($Code)) {
+ throw new InvalidArgumentException('ERR_LENGTH_MISMATCH');
+ }
+
+ $this->Load();
+ if (!$this->IsIntSpaceSafe($Length)) {
+ if (!$this->IsCodeInSelectedAlphabet($Code)) {
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+
+ return [
+ 'Ok' => true,
+ 'Status' => 'VALIDATION_PASSED_OVERFLOW_SAFE',
+ 'Description' => 'Length and alphabet are valid. Roundtrip check skipped due to integer-space limit.',
+ ];
+ }
+
+ $Current = CANG_Core::Current($Code, $Length);
+ $Check_Code = CANG_Core::ConvertTo_Code((int) $Current['Id'], $Length);
+ if ($Check_Code !== $Code) {
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+
+ return [
+ 'Ok' => true,
+ 'Status' => 'VALIDATION_PASSED',
+ 'Description' => 'Length matches code and conversion is compatible.',
+ ];
+ }
+
+ /** @return array */
+ public function Beginy(?int $Length = null): array
+ {
+ $Length = $Length ?? $this->Length;
+ $this->Load();
+ $Result = CANG_Core::Beginy($Length);
+ $Validation = $this->ValidateCore((string) $Result['Code'], $Length);
+ return $this->BuildUnifiedOutput($Result, $Length, $Validation);
+ }
+
+ /** @return array */
+ public function Previous(string $Code, ?int $Length = null): array
+ {
+ $Length = $Length ?? $this->Length;
+ $Validation = $this->ValidateCore($Code, $Length);
+ $Result = CANG_Core::Previous($Code, $Length);
+ return $this->BuildUnifiedOutput($Result, $Length, $Validation);
+ }
+
+ /** @return array */
+ public function Current(string $Code, ?int $Length = null): array
+ {
+ $Length = $Length ?? $this->Length;
+ $Validation = $this->ValidateCore($Code, $Length);
+ $Result = CANG_Core::Current($Code, $Length);
+ return $this->BuildUnifiedOutput($Result, $Length, $Validation);
+ }
+
+ /** @return array */
+ public function Next(string $Code, ?int $Length = null): array
+ {
+ $Length = $Length ?? $this->Length;
+ $Validation = $this->ValidateCore($Code, $Length);
+ $Result = CANG_Core::Next($Code, $Length);
+ return $this->BuildUnifiedOutput($Result, $Length, $Validation);
+ }
+
+ /** @return array */
+ public function End(?int $Length = null): array
+ {
+ $Length = $Length ?? $this->Length;
+ $this->Load();
+ $Result = CANG_Core::End($Length);
+ $Validation = $this->ValidateCore((string) $Result['Code'], $Length);
+ return $this->BuildUnifiedOutput($Result, $Length, $Validation);
+ }
+
+ /** @return array */
+ public function Random(?int $Length = null): array
+ {
+ $Length = $Length ?? $this->Length;
+ $this->Load();
+ $Result = CANG_Core::Random($Length);
+ $Validation = $this->ValidateCore((string) $Result['Code'], $Length);
+ return $this->BuildUnifiedOutput($Result, $Length, $Validation);
+ }
+
+ /** @return array */
+ public function Id(int $Number, ?int $Length = null): array
+ {
+ $Length = $Length ?? $this->Length;
+ $this->Load();
+ $Result = CANG_Core::Id($Number, $Length);
+ $Validation = $this->ValidateCore((string) $Result['Code'], $Length);
+ return $this->BuildUnifiedOutput($Result, $Length, $Validation);
+ }
+
+ /**
+ * Join output in Meta + Profile style.
+ *
+ * @param array $Result
+ * @param array $Validation
+ * @return array
+ */
+ private function BuildUnifiedOutput(array $Result, int $Length, array $Validation): array
+ {
+ $Code = (string) $Result['Code'];
+ $Id = (int) $Result['Id'];
+ $Support = $this->AttachCodeSupport($Result, $Length);
+ $Selected_Meta = (is_array($this->Selected_Profile) && isset($this->Selected_Profile['Meta']) && is_array($this->Selected_Profile['Meta']))
+ ? $this->Selected_Profile['Meta']
+ : [];
+
+ return [
+ 'Meta' => [
+ 'Language_Id' => $this->Type,
+ 'Selected_Order' => $this->Order_Key,
+ 'Preview_Count' => (int) ($Selected_Meta['Preview_Count'] ?? 0),
+ 'Available_Order_Id' => (array) ($Selected_Meta['Available_Order_Id'] ?? []),
+ 'Length' => $Length,
+ 'Validation_Ok' => (bool) $Validation['Ok'],
+ 'Validation_Status' => (string) $Validation['Status'],
+ 'Validation_Description' => (string) $Validation['Description'],
+ ],
+ 'Profile' => [
+ 'Code_String' => $Code,
+ 'Code_Id' => $Id,
+ 'Code_MD5' => (string) $Support['Code_md5'],
+ 'Code_SHA1' => (string) $Support['Code_sha1'],
+ 'Code_Base64_Encode' => (string) $Support['Code_base64_encode'],
+ 'Code_Time' => (int) $Support['Code_time'],
+ 'Code_Max_Id' => (int) $Support['Code_max_number'],
+ 'Code_Type' => (int) $Support['Code_type'],
+ 'Code_Max_Type' => (int) $Support['Code_max_type'],
+ 'Code_Name' => (string) $Support['Code_name'],
+ 'Code_Description' => (string) $Support['Code_description'],
+ ],
+ ];
+ }
+
+ /**
+ * Attach extra code support fields:
+ * - md5
+ * - sha1
+ * - base64_encode
+ * - timestamp (microseconds, long integer)
+ *
+ * @param array $Result
+ * @return array
+ */
+ private function AttachCodeSupport(array $Result, int $Length): array
+ {
+ $Code = (string) $Result['Code'];
+ $Selected_Meta = (is_array($this->Selected_Profile) && isset($this->Selected_Profile['Meta']) && is_array($this->Selected_Profile['Meta']))
+ ? $this->Selected_Profile['Meta']
+ : [];
+ $Result['Code_md5'] = md5($Code);
+ $Result['Code_sha1'] = sha1($Code);
+ $Result['Code_base64_encode'] = base64_encode($Code);
+ $Result['Code_time'] = (int) round(microtime(true) * 1000000);
+ $Result['Code_max_number'] = $this->GetCodeMaxNumber($Length);
+ $Result['Code_type'] = $this->Type;
+ $Result['Code_max_type'] = 9;
+ $Result['Code_name'] = (string) ($Selected_Meta['Language_Name'] ?? '');
+ $Result['Code_description'] = (string) ($Selected_Meta['Language_Description'] ?? '');
+
+ return $Result;
+ }
+
+ private function GetCodeMaxNumber(int $Length): int
+ {
+ if (!is_array($this->Selected_Profile) || !isset($this->Selected_Profile['Profile']['Symbol']) || !is_array($this->Selected_Profile['Profile']['Symbol'])) {
+ return 0;
+ }
+
+ $Base = count($this->Selected_Profile['Profile']['Symbol']);
+ if ($Base < 2 || $Length < 1) {
+ return 0;
+ }
+
+ $Max = 1;
+ for ($I = 0; $I < $Length; $I++) {
+ if ($Max > intdiv(PHP_INT_MAX, $Base)) {
+ return PHP_INT_MAX;
+ }
+ $Max *= $Base;
+ }
+
+ return $Max - 1;
+ }
+
+ private function IsIntSpaceSafe(int $Length): bool
+ {
+ if (!is_array($this->Selected_Profile) || !isset($this->Selected_Profile['Profile']['Symbol']) || !is_array($this->Selected_Profile['Profile']['Symbol'])) {
+ return false;
+ }
+
+ $Base = count($this->Selected_Profile['Profile']['Symbol']);
+ if ($Base < 2 || $Length < 1) {
+ return false;
+ }
+
+ $Max = 1;
+ for ($I = 0; $I < $Length; $I++) {
+ if ($Max > intdiv(PHP_INT_MAX, $Base)) {
+ return false;
+ }
+ $Max *= $Base;
+ }
+
+ return true;
+ }
+
+ private function IsCodeInSelectedAlphabet(string $Code): bool
+ {
+ if (!is_array($this->Selected_Profile) || !isset($this->Selected_Profile['Profile']['Index']) || !is_array($this->Selected_Profile['Profile']['Index'])) {
+ return false;
+ }
+
+ /** @var array $Index */
+ $Index = $this->Selected_Profile['Profile']['Index'];
+ $Length = strlen($Code);
+ for ($I = 0; $I < $Length; $I++) {
+ if (!array_key_exists($Code[$I], $Index)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
+
+/*
+Usage Example: CANG_Driver Methods
+
+Description:
+- SetLength(Length): set default code length for generation methods.
+- SetType(Type): select language profile id (0..9 in current language config).
+- SetOrder(Order_Key): select one generated profile order (Order_1, Order_2, ...).
+- Load(): resolve selected profile and configure CANG_Core.
+- ValidateCore(Code, Length): validate input code against internal runtime alphabet and length.
+- Beginy(Length?): get first sequence code/id for selected config.
+- Previous(Code, Length?): get previous sequence code/id.
+- Current(Code, Length?): resolve id for a given code.
+- Next(Code, Length?): get next sequence code/id.
+- End(Length?): get last sequence code/id.
+- Random(Length?): get random valid code/id.
+- Id(Number, Length?): get code/id from explicit numeric id.
+*/
+
+/*
+// Runnable example (execute this file directly)
+if (realpath((string) ($_SERVER['SCRIPT_FILENAME'] ?? '')) === __FILE__) {
+ $Driver = new CANG_Driver();
+
+ // Step 1: Runtime setup.
+ $Driver->SetLength(8); // default Length for methods when Length is omitted
+ $Driver->SetType(7); // profile id: Alphabet_Mix_Num_CharShort
+ $Driver->SetOrder('Order_1'); // selected order from generated profile permutations
+ $Selected_Profile = $Driver->Load();
+
+ // Step 2: Generate first value, then move through sequence.
+ $Beginy = $Driver->Beginy(); // first code/id
+ $Next = $Driver->Next((string) $Beginy['Profile']['Code_String']);
+ $Current = $Driver->Current((string) $Next['Profile']['Code_String']);
+ $Previous = $Driver->Previous((string) $Current['Profile']['Code_String']);
+ $End = $Driver->End();
+ $Random = $Driver->Random();
+
+ // Step 3: Generate by explicit numeric id.
+ $By_Id = $Driver->Id(12345);
+
+ // Step 4: Explicit validation example.
+ $Validation = $Driver->ValidateCore((string) $Beginy['Profile']['Code_String'], 8);
+
+ echo json_encode([
+ 'Selected_Profile' => $Selected_Profile,
+ 'Beginy' => $Beginy,
+ 'Next' => $Next,
+ 'Current' => $Current,
+ 'Previous' => $Previous,
+ 'End' => $End,
+ 'Random' => $Random,
+ 'By_Id' => $By_Id,
+ 'Validation' => $Validation,
+ ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL;
+}
+*/
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_ProFile.php b/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_ProFile.php
new file mode 100644
index 0000000..a18ed3e
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_Driver/CANG_ProFile.php
@@ -0,0 +1,325 @@
+>
+ */
+ public static function LoadConfig(): array
+ {
+ return CANG_Language::Build();
+ }
+
+ public static function SetId(int $Language_Id): void
+ {
+ if ($Language_Id < 0) {
+ throw new InvalidArgumentException('ERR_PROFILE_NOT_FOUND');
+ }
+
+ self::$Language_Id = $Language_Id;
+ self::$Preview_Profile = null;
+ self::$Selected_Profile = null;
+ }
+
+ /**
+ * Expose selected profile field names (array keys).
+ *
+ * @return array
+ */
+ public static function ExposeValueArrayNames(): array
+ {
+ if (self::$Language_Id === null) {
+ throw new InvalidArgumentException('ERR_PROFILE_NOT_FOUND');
+ }
+
+ $Profile = CANG_Language::ById(self::$Language_Id);
+ return array_keys($Profile);
+ }
+
+ /**
+ * Build all possible order profiles for Language_Range and Language_Type together.
+ *
+ * If one field exists -> fixed order.
+ * If multiple fields exist -> all permutations.
+ *
+ * @return array
+ */
+ public static function BuildOrderProfiles(): array
+ {
+ if (self::$Language_Id === null) {
+ throw new InvalidArgumentException('ERR_PROFILE_NOT_FOUND');
+ }
+
+ $Profile = CANG_Language::ById(self::$Language_Id);
+ if (
+ !isset($Profile['Language_Symbol']) || !is_array($Profile['Language_Symbol']) ||
+ !isset($Profile['Language_Display']) || !is_array($Profile['Language_Display'])
+ ) {
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+
+ $Language_Symbol = $Profile['Language_Symbol'];
+ $Language_Display = $Profile['Language_Display'];
+
+ $Field_Names = array_values(
+ array_intersect(array_keys($Language_Symbol), array_keys($Language_Display))
+ );
+
+ if (count($Field_Names) === 0) {
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+ if (count($Field_Names) > self::MAX_BASE_FIELDS) {
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+
+ $Orders = [];
+ if (count($Field_Names) === 1) {
+ $Order_Field_List = $Field_Names;
+ $Join = self::BuildJoinedRangeAndIndex([$Language_Symbol[$Order_Field_List[0]]]);
+ $Orders['Order_1'] = [
+ 'Field_Order' => $Order_Field_List,
+ 'Language_Range' => [$Language_Symbol[$Order_Field_List[0]]],
+ 'Language_Type' => [$Language_Display[$Order_Field_List[0]]],
+ 'Language_Symbol_Build' => $Join['Language_Symbol_Build'],
+ 'Language_Symbol_Index' => $Join['Language_Symbol_Index'],
+ ];
+
+ self::$Preview_Profile = [
+ 'Language_Id' => self::$Language_Id,
+ 'Order_Mode' => 'Fixed',
+ 'Order_Total' => 1,
+ 'Orders' => $Orders,
+ ];
+ self::$Selected_Profile = null;
+
+ return self::$Preview_Profile;
+ }
+
+ $Permutations = self::BuildSequentialFieldOrders($Field_Names);
+ $Order_Index = 1;
+
+ foreach ($Permutations as $Field_Order) {
+ $Ordered_Range = [];
+ $Ordered_Type = [];
+
+ foreach ($Field_Order as $Field_Name) {
+ $Ordered_Range[] = $Language_Symbol[$Field_Name];
+ $Ordered_Type[] = $Language_Display[$Field_Name];
+ }
+ $Join = self::BuildJoinedRangeAndIndex($Ordered_Range);
+
+ $Orders['Order_' . $Order_Index] = [
+ 'Field_Order' => $Field_Order,
+ 'Language_Range' => $Ordered_Range,
+ 'Language_Type' => $Ordered_Type,
+ 'Language_Symbol_Build' => $Join['Language_Symbol_Build'],
+ 'Language_Symbol_Index' => $Join['Language_Symbol_Index'],
+ ];
+ $Order_Index++;
+ }
+
+ self::$Preview_Profile = [
+ 'Language_Id' => self::$Language_Id,
+ 'Order_Mode' => 'Permutations',
+ 'Order_Total' => count($Orders),
+ 'Orders' => $Orders,
+ ];
+ self::$Selected_Profile = null;
+
+ return self::$Preview_Profile;
+ }
+
+ /**
+ * Select one order from preview and return selected profile output.
+ *
+ * @return array
+ */
+ public static function SelectOrder(string $Order_Key): array
+ {
+ if (self::$Preview_Profile === null) {
+ throw new InvalidArgumentException('ERR_PROFILE_PREVIEW_REQUIRED');
+ }
+
+ $Profiles = self::$Preview_Profile;
+ if (!isset($Profiles['Orders']) || !is_array($Profiles['Orders'])) {
+ throw new InvalidArgumentException('ERR_INVALID_ALPHABET');
+ }
+
+ $Orders = $Profiles['Orders'];
+ if (!array_key_exists($Order_Key, $Orders)) {
+ throw new InvalidArgumentException('ERR_PROFILE_NOT_FOUND');
+ }
+
+ $Selected = $Orders[$Order_Key];
+ $Language_Profile = CANG_Language::ById((int) $Profiles['Language_Id']);
+
+ self::$Selected_Profile = [
+ 'Language_Id' => $Profiles['Language_Id'],
+ 'Order_Mode' => $Profiles['Order_Mode'],
+ 'Selected_Order' => $Order_Key,
+ 'Selected_Data' => $Selected,
+ ];
+ self::$Preview_Profile = null;
+
+ return [
+ 'Meta' => [
+ 'Language_Id' => self::$Selected_Profile['Language_Id'],
+ 'Language_Name' => (string) ($Language_Profile['Language_Name'] ?? ''),
+ 'Language_Description' => (string) ($Language_Profile['Language_Description'] ?? ''),
+ 'Selected_Order' => self::$Selected_Profile['Selected_Order'],
+ 'Preview_Count' => $Profiles['Order_Total'],
+ 'Available_Order_Id' => array_keys($Orders),
+ ],
+ 'Profile' => [
+ 'Order' => $Selected['Field_Order'],
+ 'Symbol' => $Selected['Language_Symbol_Build'],
+ 'Index' => $Selected['Language_Symbol_Index'],
+ ],
+ ];
+ }
+
+ /**
+ * @param array $Fields
+ * @return array>
+ */
+ private static function BuildSequentialFieldOrders(array $Fields): array
+ {
+ $Count = count($Fields);
+ if ($Count <= 1) {
+ return [$Fields];
+ }
+
+ $Permutations = [];
+ $Indices = range(0, $Count - 1);
+
+ while (true) {
+ $Order = [];
+ foreach ($Indices as $Index) {
+ $Order[] = $Fields[$Index];
+ }
+ $Permutations[] = $Order;
+
+ if (!self::NextPermutation($Indices)) {
+ break;
+ }
+ }
+
+ return $Permutations;
+ }
+
+ /**
+ * Advance integer sequence to next lexicographic permutation.
+ *
+ * @param array $Values
+ */
+ private static function NextPermutation(array &$Values): bool
+ {
+ $N = count($Values);
+ $I = $N - 2;
+ while ($I >= 0 && $Values[$I] >= $Values[$I + 1]) {
+ $I--;
+ }
+ if ($I < 0) {
+ return false;
+ }
+
+ $J = $N - 1;
+ while ($Values[$J] <= $Values[$I]) {
+ $J--;
+ }
+
+ [$Values[$I], $Values[$J]] = [$Values[$J], $Values[$I]];
+
+ $Left = $I + 1;
+ $Right = $N - 1;
+ while ($Left < $Right) {
+ [$Values[$Left], $Values[$Right]] = [$Values[$Right], $Values[$Left]];
+ $Left++;
+ $Right--;
+ }
+
+ return true;
+ }
+
+ /**
+ * Join ordered Language_Range groups into one unique array and build index map.
+ *
+ * @param array> $Ordered_Range
+ * @return array
+ */
+ private static function BuildJoinedRangeAndIndex(array $Ordered_Range): array
+ {
+ $Joined = [];
+ $Seen = [];
+
+ foreach ($Ordered_Range as $Group) {
+ foreach ($Group as $Value) {
+ if (!isset($Seen[$Value])) {
+ $Seen[$Value] = true;
+ $Joined[] = $Value;
+ }
+ }
+ }
+
+ $Index = [];
+ foreach ($Joined as $Position => $Value) {
+ $Index[$Value] = $Position;
+ }
+
+ return [
+ 'Language_Symbol_Build' => $Joined,
+ 'Language_Symbol_Index' => $Index,
+ ];
+ }
+}
+
+/*
+Complete example:
+
+1) Select profile id
+2) Build preview orders
+3) Select one order key
+4) Get selected output
+
+CANG_ProFile::SetId(7);
+$Preview_Profiles = CANG_ProFile::BuildOrderProfiles();
+$Order_Key = 'Order_2'; //<- Here Select Number According To Maximum Allowed Id
+if (!isset($Preview_Profiles['Orders'][$Order_Key])) {
+ $Order_Key = 'Order_1'; //<- Only FallBack If Key Not Exists
+}
+$Selected_Output = CANG_ProFile::SelectOrder($Order_Key);
+
+
+if (realpath((string) ($_SERVER['SCRIPT_FILENAME'] ?? '')) === __FILE__) {
+ $Selected_Id = 9;
+ CANG_ProFile::SetId($Selected_Id);
+
+ // Step 1: Preview possible orders.
+ $Preview_Profiles = CANG_ProFile::BuildOrderProfiles();
+ //print_r($Preview_Profiles);
+ $Order_Key = 'Order_49';
+ if (!isset($Preview_Profiles['Orders'][$Order_Key])) {
+ $Order_Key = 'Order_1';
+ }
+
+ // Step 2: Select one order. Preview state is cleared after this call.
+ $Selected_Output = CANG_ProFile::SelectOrder($Order_Key);
+
+ echo json_encode([
+ 'Selected_Output' => $Selected_Output,
+ ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL;
+
+}
+*/
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_MVC/CANG_Controller.php b/v.0.5.FinallVersion/Base_CANG/CANG_MVC/CANG_Controller.php
new file mode 100644
index 0000000..e69de29
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_MVC/CANG_Module.php b/v.0.5.FinallVersion/Base_CANG/CANG_MVC/CANG_Module.php
new file mode 100644
index 0000000..e69de29
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_MVC/CANG_Viewer.php b/v.0.5.FinallVersion/Base_CANG/CANG_MVC/CANG_Viewer.php
new file mode 100644
index 0000000..e69de29
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_ID.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_ID.php
new file mode 100644
index 0000000..4e2c033
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_ID.php
@@ -0,0 +1,23 @@
+SetLength(8);
+
+// 2) Select profile id (Language_Id).
+$Driver->SetType(5);
+
+// 3) Optional: select order key when multiple profile permutations are available.
+$Driver->SetOrder('Order_1');
+
+// 4) Load selected profile into core runtime.
+$Driver->Load();
+
+// 5) Generate code by explicit numeric Id.
+$Return = $Driver->Id(249996);
+
+print_r($Return);
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_ID_JSON.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_ID_JSON.php
new file mode 100644
index 0000000..523cce5
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_ID_JSON.php
@@ -0,0 +1,24 @@
+SetLength(8);
+
+// 2) Select profile id (Language_Id).
+$Driver->SetType(5);
+
+// 3) Optional: select order key when multiple profile permutations are available.
+$Driver->SetOrder('Order_1');
+
+// 4) Load selected profile into core runtime.
+$Driver->Load();
+
+// 5) Generate code by explicit numeric Id.
+$Return = $Driver->Id(249996);
+
+header('Content-Type: application/json');
+echo json_encode($Return, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_Random.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_Random.php
new file mode 100644
index 0000000..8e58067
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_Random.php
@@ -0,0 +1,23 @@
+SetLength(8);
+
+// 2) Select profile id (Language_Id).
+$Driver->SetType(5);
+
+// 3) Optional: select order key when multiple profile permutations are available.
+$Driver->SetOrder('Order_1');
+
+// 4) Load selected profile into core runtime.
+$Driver->Load();
+
+// 5) Generate one random code.
+$Return = $Driver->Random();
+
+print_r($Return);
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_Random_JSON.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_Random_JSON.php
new file mode 100644
index 0000000..f70bfd6
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_Random_JSON.php
@@ -0,0 +1,24 @@
+SetLength(8);
+
+// 2) Select profile id (Language_Id).
+$Driver->SetType(5);
+
+// 3) Optional: select order key when multiple profile permutations are available.
+$Driver->SetOrder('Order_1');
+
+// 4) Load selected profile into core runtime.
+$Driver->Load();
+
+// 5) Generate one random code.
+$Return = $Driver->Random();
+
+header('Content-Type: application/json');
+echo json_encode($Return, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_String.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_String.php
new file mode 100644
index 0000000..4cef477
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_String.php
@@ -0,0 +1,26 @@
+SetLength(8);
+
+// 2) Select profile id (Language_Id).
+$Driver->SetType(5);
+
+// 3) Optional: select order key when multiple profile permutations are available.
+$Driver->SetOrder('Order_1');
+
+// 4) Load selected profile into core runtime.
+$Driver->Load();
+
+// 5) Generate simple string by sequence start (not random).
+$Return = $Driver->Beginy();
+
+// 6) Generate next simple string from previous output.
+$Return = $Driver->Next((string) $Return[1]['Profile']['Code_String']);
+
+print_r($Return);
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_String_JSON.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_String_JSON.php
new file mode 100644
index 0000000..e66ed2b
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Generate_String_JSON.php
@@ -0,0 +1,27 @@
+SetLength(8);
+
+// 2) Select profile id (Language_Id).
+$Driver->SetType(5);
+
+// 3) Optional: select order key when multiple profile permutations are available.
+$Driver->SetOrder('Order_1');
+
+// 4) Load selected profile into core runtime.
+$Driver->Load();
+
+// 5) Generate simple string by sequence start (not random).
+$Return = $Driver->Beginy();
+
+// 6) Generate next simple string from previous output.
+$Return = $Driver->Next((string) $Return['Profile']['Code_String']);
+
+header('Content-Type: application/json');
+echo json_encode($Return, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_ID.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_ID.php
new file mode 100644
index 0000000..a6c8022
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_ID.php
@@ -0,0 +1,26 @@
+SetLength(25);
+$Driver->SetType(4);
+$Driver->SetOrder('Order_1');
+$Driver->Load();
+
+// Generate by numeric Id.
+$Result = $Driver->Id(249996);
+
+// Format code as XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
+$Raw_Code = (string) ($Result['Profile']['Code_String'] ?? '');
+$Groups = str_split($Raw_Code, 5);
+$Formatted_Code = implode('-', $Groups);
+
+$Result['Profile']['Code_String_Formatted'] = $Formatted_Code;
+
+print_r($Result);
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_ID_JSON.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_ID_JSON.php
new file mode 100644
index 0000000..dbcc061
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_ID_JSON.php
@@ -0,0 +1,27 @@
+SetLength(25);
+$Driver->SetType(4);
+$Driver->SetOrder('Order_1');
+$Driver->Load();
+
+// Generate by numeric Id.
+$Result = $Driver->Id(249996);
+
+// Format code as XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
+$Raw_Code = (string) ($Result['Profile']['Code_String'] ?? '');
+$Groups = str_split($Raw_Code, 5);
+$Formatted_Code = implode('-', $Groups);
+
+$Result['Profile']['Code_String_Formatted'] = $Formatted_Code;
+
+header('Content-Type: application/json');
+echo json_encode($Result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_Random.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_Random.php
new file mode 100644
index 0000000..addc70e
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_Random.php
@@ -0,0 +1,26 @@
+SetLength(25);
+$Driver->SetType(4);
+$Driver->SetOrder('Order_1');
+$Driver->Load();
+
+// Generate random code.
+$Result = $Driver->Random();
+
+// Format code as XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
+$Raw_Code = (string) ($Result['Profile']['Code_String'] ?? '');
+$Groups = str_split($Raw_Code, 5);
+$Formatted_Code = implode('-', $Groups);
+
+$Result['Profile']['Code_String_Formatted'] = $Formatted_Code;
+
+print_r($Result);
diff --git a/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_Random_JSON.php b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_Random_JSON.php
new file mode 100644
index 0000000..19482a3
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG/CANG_NoMySQL_Examples/Example_Microsoft_SN_Generate_Random_JSON.php
@@ -0,0 +1,27 @@
+SetLength(25);
+$Driver->SetType(4);
+$Driver->SetOrder('Order_1');
+$Driver->Load();
+
+// Generate random code.
+$Result = $Driver->Random();
+
+// Format code as XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
+$Raw_Code = (string) ($Result['Profile']['Code_String'] ?? '');
+$Groups = str_split($Raw_Code, 5);
+$Formatted_Code = implode('-', $Groups);
+
+$Result['Profile']['Code_String_Formatted'] = $Formatted_Code;
+
+header('Content-Type: application/json');
+echo json_encode($Result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
diff --git a/v.0.5.FinallVersion/Base_CANG_CommandAI.ExternalRules.md b/v.0.5.FinallVersion/Base_CANG_CommandAI.ExternalRules.md
new file mode 100644
index 0000000..970bb1f
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG_CommandAI.ExternalRules.md
@@ -0,0 +1,431 @@
+---
+Title: CANG Project Definition (External Rewrite)
+Source: Rewrite of Base_CANG_CommandAI.md
+Status: Development Ready
+---
+
+## 1) Purpose
+CANG (Complex Alpha Numeric Generator) is a PHP utility for generating and converting alphanumeric codes.
+This document defines behavior contracts; implementation details may vary.
+Documentation style rule (shareability): use one arrow style `A -> B` for mappings/flows and sentence case for descriptive lines across all sections.
+Project description: The Complex Alpha Numeric Generator (CANG) is a PHP-based utility
+designed to produce highly customizable alphanumeric strings for authentication systems,
+token creation, unique identifiers, and data-randomization workflows.
+
+Built for developers who need both flexibility and reliability, CANG supports layered
+configuration options including character-set selection, entropy tuning, pattern
+enforcement, and optional cryptographic strengthening.
+
+CANG's architecture emphasizes modularity and clean integration. It can operate as a
+standalone function, a reusable class, or a plug-in component within larger PHP
+applications.
+
+Its deterministic configuration model ensures repeatable behavior when needed, while still
+offering strong randomness for security-sensitive contexts.
+
+Whether you are generating session keys, invitation codes, randomized filenames, or
+structured alphanumeric sequences, CANG provides a robust, developer-friendly foundation
+that adapts to a wide range of project requirements.
+
+Primary capabilities:
+- Generate and convert by mode (`Beginy`, `Previous`, `Current`, `Next`, `End`, `Random`, `Id`)
+- Return both `Code` and `Id` for conversion-aware operations
+- Use selectable language profiles (character sets)
+- Support deterministic and random workflows
+
+## 2) Config Architecture
+Core file design:
+- `CANG_Config` -> complex configuration array that defines all language fundamentals.
+- `CANG_Language` -> loads config data and prepares sortable language structures.
+- `CANG_ProFile` -> imports language definitions from `CANG_Language`, selects language/profile, and applies developer-defined order.
+- `CANG_Core` -> uses selected profile/order to run generation and conversion only.
+
+Section-to-Unit mapping:
+- `CANG_Config` -> Sections `2`, `3`, `4`, `5`
+- `CANG_Language` -> Sections `4`, `5`
+- `CANG_ProFile` -> Sections `5`, `6`
+- `CANG_Core` -> Sections `6`, `7`, `8`, `10`, `11`, `12`
+
+Core load flow:
+- `Config -> Language -> ProFile -> Core`
+
+## 3) Fundamental Config Symbols
+`Language_Symbol` definitions:
+- `Upper -> range('A','Z')`
+- `Lower -> range('a','z')`
+- `Numeric -> range('0','9')`
+- `CharShort -> str_split('_-')`
+- `CharLong -> str_split('#$%&+-@')`
+- Core Language_Symbol rule: each `Language_Symbol` name (example: `CharLong`) must be followed by a defined range.
+- Core range-constructor rule: both `range(...)` and `str_split(...)` are valid ways to create symbol ranges.
+
+Regex-safe note:
+- Applies only to true regex-processing patterns; it does not apply to `Language_Type` references or `Language_Display` values.
+
+
+## 4) Canonical Language Definitions
+Each language profile is one complete record.
+
+Strict-name scopes:
+- Core Strict_Name rule (profile record fields only): `Language_Id`, `Language_Name`, `Language_Type`, `Language_Description`, `Language_Range`.
+- Core Strict_Name rule (language config maps): `Language_Symbol`, `Language_Display`.
+- Core Strict_Name permanent rule: these exact key names are fixed and must be remembered/kept forever for compatibility.
+
+Required profile fields:
+- `Language_Id` (int)
+- `Language_Name` (string)
+- `Language_Type` (ordered `Language_Display` references)
+- `Language_Description` (string)
+- `Language_Range` (ordered symbol groups)
+
+Language display map:
+- `Language_Display['Upper'] = '[A-Z]'`
+- `Language_Display['Lower'] = '[a-z]'`
+- `Language_Display['Numeric'] = '[0-9]'`
+- `Language_Display['CharShort'] = '[-_]'`
+- `Language_Display['CharLong'] = '[#$%&+-@]'`
+- Core Language_Type value rule: every `Language_Type` item must be a `Language_Display['Field_Name']` reference.
+- Core Language_Type shape rule: input may be single reference or list of references (hybrid input allowed).
+- Core Language_Type runtime rule: always normalize to list form internally before processing.
+- Core Language_Type ordering rule: reordering applies only when normalized list has more than one item; one item is fixed-order (no-op).
+- Core Language_Type reference rule: every referenced `Language_Display['Field_Name']` key must exist in `Language_Display`.
+- Core Language_Type validation rule: regex validity/escaping is not required for `Language_Type` items because they are references, not regex patterns.
+- Core Language_Type format examples: `Language_Type: Language_Display['Upper']` or `Language_Type: [Language_Display['Upper'], Language_Display['Lower']]`.
+
+Language symbol map:
+- `Language_Symbol` is defined through `Language_Range` references as `Language_Symbol[Name]`.
+- Core Language_Range rule: `Language_Range` holds the range of symbols.
+- Core Language_Range ordering rule: ordering is possible only when `Language_Range` contains more than one key symbol name.
+- If `Language_Range` contains only one key symbol name, ordering is not applicable (no-op) and the single order is fixed.
+
+Canonical profiles:
+1. `Language_Id: 0`
+- `Language_Name: Alphabet_Upper`
+- `Language_Type: Language_Display['Upper']`
+- `Language_Description: Alphabetical -> Simple: Capital Letters`
+- `Language_Range: [Language_Symbol[Upper]]`
+
+2. `Language_Id: 1`
+- `Language_Name: Alphabet_Lower`
+- `Language_Type: Language_Display['Lower']`
+- `Language_Description: Alphabetical -> Simple: Small Letters`
+- `Language_Range: [Language_Symbol[Lower]]`
+
+3. `Language_Id: 2`
+- `Language_Name: Alphabet_Mix`
+- `Language_Type: [Language_Display['Upper'], Language_Display['Lower']]`
+- `Language_Description: Alphabetical -> Mix: Capital And Small Letters`
+- `Language_Range: [Language_Symbol[Upper], Language_Symbol[Lower]]`
+
+4. `Language_Id: 3`
+- `Language_Name: Numeric`
+- `Language_Type: Language_Display['Numeric']`
+- `Language_Description: Numerical -> Simple`
+- `Language_Range: [Language_Symbol[Numeric]]`
+
+5. `Language_Id: 4`
+- `Language_Name: Alphabet_Upper_Num`
+- `Language_Type: [Language_Display['Upper'], Language_Display['Numeric']]`
+- `Language_Description: Alphabetical And Numerical -> Simple: Capital Letters (Microsoft/Megaupload.com)`
+- `Language_Range: [Language_Symbol[Upper], Language_Symbol[Numeric]]`
+
+6. `Language_Id: 5`
+- `Language_Name: Alphabet_Lower_Num`
+- `Language_Type: [Language_Display['Lower'], Language_Display['Numeric']]`
+- `Language_Description: Alphabetical And Numerical -> Simple: Small Letters`
+- `Language_Range: [Language_Symbol[Lower], Language_Symbol[Numeric]]`
+
+7. `Language_Id: 6`
+- `Language_Name: Alphabet_Mix_Num`
+- `Language_Type: [Language_Display['Upper'], Language_Display['Lower'], Language_Display['Numeric']]`
+- `Language_Description: Alphabetical And Numerical -> Mix: Capital And Small Letters`
+- `Language_Range: [Language_Symbol[Upper], Language_Symbol[Lower], Language_Symbol[Numeric]]`
+
+8. `Language_Id: 7`
+- `Language_Name: Alphabet_Mix_Num_CharShort`
+- `Language_Type: [Language_Display['Upper'], Language_Display['Lower'], Language_Display['Numeric'], Language_Display['CharShort']]`
+- `Language_Description: Alphabetical And Numerical -> Mix: Capital/Small Letters Plus Short Special Chars (YouTube.com)`
+- `Language_Range: [Language_Symbol[Upper], Language_Symbol[Lower], Language_Symbol[Numeric], Language_Symbol[CharShort]]`
+
+9. `Language_Id: 8`
+- `Language_Name: Alphabet_Mix_Num_CharLong`
+- `Language_Type: [Language_Display['Upper'], Language_Display['Lower'], Language_Display['Numeric'], Language_Display['CharLong']]`
+- `Language_Description: Alphabetical And Numerical -> Mix: Capital/Small Letters Plus Long Special Chars (Safe Password)`
+- `Language_Range: [Language_Symbol[Upper], Language_Symbol[Lower], Language_Symbol[Numeric], Language_Symbol[CharLong]]`
+
+10. `Language_Id: 9`
+- `Language_Name: Alphabet_Mix_Num_CharMix`
+- `Language_Type: [Language_Display['Upper'], Language_Display['Lower'], Language_Display['Numeric'], Language_Display['CharShort'], Language_Display['CharLong']]`
+- `Language_Description: Alphabetical And Numerical -> Mix: Capital/Small Letters Plus Full Special Chars (Safe Password)`
+- `Language_Range: [Language_Symbol[Upper], Language_Symbol[Lower], Language_Symbol[Numeric], Language_Symbol[CharShort], Language_Symbol[CharLong]]`
+
+## 5) Language Order and Defaults
+`CANG_ProFile` must support language selection and order override.
+
+Order contract:
+- Core Language_Order directional rule: `Language_Order` is AI-directional description for selected-language mapping and reorder behavior.
+- `Language_Order(Same Values According To Selected Language_Id) -> ReOrderAble Fields By Developer/User Input`
+- Core directional-term rule: `ReOrderAble` is intentional AI directional description and must be kept as defined.
+
+Selection contract:
+- `Default_Language -> Language_Id`
+- `Default_Order` must be built only from `Language_Range` symbols of the selected `Default_Language`.
+- `CANG_ProFile` must include the selected language definition imported from `CANG_Language` and order only those available symbols.
+- Global template example (config-level): `[Language_Symbol[Upper], Language_Symbol[Lower], Language_Symbol[Numeric], Language_Symbol[CharShort], Language_Symbol[CharLong]]`.
+
+Custom order example:
+- `Default_Language -> Language_Id`
+- `Default_Order -> [Language_Symbol[CharLong], Language_Symbol[CharShort], Language_Symbol[Numeric], Language_Symbol[Lower], Language_Symbol[Upper]]` (apply only if these symbols exist in selected language definition).
+
+Compiled alphabet rule:
+- `Compiled_Alphabet` = concatenation of active `Language_Range` groups in selected order.
+- Duplicate characters must be removed while preserving first occurrence.
+- Alphabet size must be `>= 2`.
+
+## 6) Length Rules
+- `Length` is mandatory for generated code output.
+- If `Length` is missing, throw `ERR_LENGTH_REQUIRED`.
+- `Length` must be a positive integer.
+- Never accept `0`; throw `ERR_INVALID_LENGTH`.
+- Absolute minimum allowed by engine is `1`.
+- `Min_Length = 8` is a recommended default policy example, not a hard engine floor.
+- If project policy sets a higher minimum (example `8`), values below that policy minimum must throw `ERR_INVALID_CODE_LENGTH`.
+- For code-input modes, `strlen(Code)` must match `Length`; otherwise throw `ERR_LENGTH_MISMATCH`.
+
+## 7) Mode Contracts
+All modes run against one selected profile and one compiled alphabet.
+
+Mode definition order must remain (documentation/reference order only, not required runtime invocation order):
+1. `Beginy`
+2. `Previous`
+3. `Current`
+4. `Next`
+5. `End`
+6. `Random`
+7. `Id`
+
+Canonical mode names (keep as defined):
+1. Beginy
+2. Previous
+3. Current
+4. Next
+5. End
+6. Random
+7. Id
+- Core naming rule: capitalize the first letter of Variables and Methods in rules/examples.
+- Core native-function rule: native PHP functions must keep their original names/casing (example: `strlen`, `random_int`).
+- Core native-variable rule: if a native variable/constant is defined in capital letters, keep it exactly as native-defined.
+- Method names use `Beginy/Previous/Current/Next/End/Random/Id`, while validation mode tokens use `BEGINY/PREVIOUS/CURRENT/NEXT/END/RANDOM/ID`.
+- Variable style uses `Code/Id/Length/Number` and `$Code/$Id/$Length/$Number`.
+- Capitalized Variables/Methods in this document are naming conventions for readability.
+
+Unified return shape for these modes:
+- `{ Code: string, Id: int }`
+- Mini return example: `{Code:"AAAAAAAB", Id:1}`
+
+Return contracts:
+- `Beginy(Length)` -> `{Code, Id}`
+- `Previous(Code, Length)` -> `{Code, Id}`
+- `Current(Code, Length)` -> `{Code, Id}`
+- `Next(Code, Length)` -> `{Code, Id}`
+- `End(Length)` -> `{Code, Id}`
+- `Random(Length)` -> `{Code, Id}`
+- `Id(Number, Length)` -> `{Code, Id}`
+
+Quick call block:
+- `Beginy(Length)`
+- `Previous(Code, Length)`
+- `Id(Number, Length)`
+- `Random(Length)`
+
+Rules:
+- For every mode above, `Length` must be explicitly specified.
+- If missing, throw `ERR_LENGTH_REQUIRED`.
+- Core validation method rule: `ValidateCore(Length, Code, Id): {Ok: bool, Status: string, Description: string}` is moved out of `CANG_Core` and currently on hold for a separate validation file.
+- Core existence method rule: `CANG_Core` must expose `ExistenceCheck(Length, Code, Id): {Exists: bool, Status: string, Reason: string, Description: string}`.
+- Core generator helper rules:
+- `ConvertTo_Code(Id, Length): Code`
+- `ConvertTo_Id(Code, Length): Id`
+- `Generate_ByRandomCode(Length): {Code, Id}`
+- Internal loop rule for retry/fallback paths: `For (Step = 0; Step < Limit; Step++)`.
+- Canonical Id route rule (single source of truth) for public `Id(Number, Length)`:
+- `1) Map Number -> Id` and generate `{Code, Id}`.
+- `2) Pass output to `Current(Code, Length)` (validation is handled by external validator when enabled).
+- `3) Run `ExistenceCheck`.
+- Mapping example:
+- `// Method inputs: $Number, $Length`
+- `// Step 1: Apply canonical Id route step (map Number -> Id and generate {Code, Id}).`
+- `// Step 2: Pass generated output to Current(Code, Length).`
+- Pseudo-code example:
+```php
+$Output = Id($Number, $Length); // {Code, Id}
+Current($Output['Code'], $Length); // external validation (on hold) can run before/after this step
+ExistenceCheck($Length, $Output['Code'], $Output['Id']);
+```
+- Validation hold rule: `ValidateCore` is external and on hold; `CANG_Core` does not execute it.
+- External validator target behavior (on hold): check `strlen(Code) == Length` (when `Code` is provided), then validate `Code` and `Id` conversion compatibility.
+- Clean flow contract:
+- `1) Current(...)` runs core conversion flow.
+- `2) External validation (on hold)`: run before/after `Current(...)` as policy requires.
+- `3) If invalid`: throw mapped `ERR_*`.
+- `4) If valid`: return success info (or nothing).
+- `5) API layer`: catch exception and format `{Ok:false,Error,Description}`.
+- Developer success example: `{Ok:true,Status:"VALIDATION_PASSED",Description:"Inputs are valid for the selected mode."}`
+- Developer input table (public modes):
+- `BEGINY` -> required: `Length`
+- `PREVIOUS` -> required: `Length`, `Code`
+- `CURRENT` -> required: `Length`, `Code`
+- `NEXT` -> required: `Length`, `Code`
+- `END` -> required: `Length`
+- `RANDOM` -> required: `Length`
+- `ID` -> required: `Length`, `Number`
+- `Reverse` is internal-only compatibility alias helper, not a public validation mode.
+- Core reverse-usage rule: `Reverse` must not be used in canonical execution flow diagrams.
+- Core reverse-routing rule: if implemented, `Reverse` only routes to `ConvertTo_Id` or `ConvertTo_Code` based on input type; it must not define separate conversion logic.
+- `Current` does not perform reverse conversion because it represents the same input `Code` in the current sequence position.
+- `Current` must return the exact current `{Code, Id}` pair for sequencing accuracy (`Code`, `Length`, `Id`); length/input validation is handled by external validator (on hold).
+- Core `Current` rule: input `Code` is treated as current-sequence reference by default.
+- `Current` must not execute validation internally while validation is on hold outside `CANG_Core`.
+- `Current` is the reference state used to define `Previous`, `Next`, `Beginy`, and `End` sequence behavior.
+- Core conversion rule: `Id` is used for conversion at any `Sequence_OP` (directly or indirectly).
+- Core sequencing anchor rule: `Beginy` is the first output point that defines sequence start context.
+- Core Beginy rule: `Beginy` must internally produce initial `Code` from `Length`, then use that produced `Code` as the input context for `Current` and validation flow.
+- After anchor, sequencing methods use `{Code, Length}` context for progression (`Previous(Code, Length)` / `Next(Code, Length)` compatibility model).
+- Core execution reference rule for `Previous/Next` (runtime-aligned):
+- `1) (Previous(Code, Length) | Next(Code, Length)) -> Current(Code, Length)`.
+- `2) Current(Code, Length) -> ConvertTo_Id -> Sequence_OP -> ExistenceCheck`.
+- Validation is external/on hold and does not run inside `Current`.
+- Internal chaining rule: `Previous` and `Next` resolve current position first through `Current` (internally using `ConvertTo_Id` for position resolution), then adjust `Id` and generate final output through internal `ConvertTo_Code`.
+- Exact algorithm for `Previous/Next`:
+- `1) $PrevNumber = Current(Code, Length).Id - 1`, then `$PrevCode = ConvertTo_Code($PrevNumber, Length)`.
+- `2) $NextNumber = Current(Code, Length).Id + 1`, then `$NextCode = ConvertTo_Code($NextNumber, Length)`.
+- `Previous` returns `{Code:$PrevCode, Id:$PrevNumber}` and `Next` returns `{Code:$NextCode, Id:$NextNumber}` after conversion compatibility is applied.
+- Boundary rule: if `Previous` is called on the first code, throw `ERR_SEQUENCE_START`; if `Next` is called on the last code, throw `ERR_SEQUENCE_END`.
+- `Id(Number, Length)` output contract is defined by the canonical Id route rule and conversion rules above.
+- `Current` mode:
+- `Current -> ConvertTo_Id/ConvertTo_Code (core operations only)`
+- Shared sequencing block (`Beginy`, `Previous`, `Next`, `End`):
+- `Mode -> (Current -> (Sequence_OP -> ExistenceCheck))`
+- `Exists` -> deterministic fallback walk (`Backward`/`Forward`)
+- `Not Exists` -> return/commit
+- `Random` mode:
+- `Random_OP -> Current -> ExistenceCheck`
+- `Exists` -> regenerate/retry
+- `Not Exists` -> return/commit
+- `Random` must not use deterministic fallback walk.
+- `Id` mode:
+- Core Id mode flow: see canonical Id route rule defined above (single source of truth).
+- Generate by `Id:Number` mapping, then apply existence decision rules.
+- For deterministic fallback walk: step = generate candidate -> `ExistenceCheck`.
+- Stop on boundary/limit -> throw conflict error.
+- Commit safety rule: after `Exists=false`, insert/commit with unique constraint (or lock) to avoid race conditions.
+- Summary: `Random = regenerate`; deterministic modes = advance to next valid candidate, not same-input retry.
+- Core uniqueness baseline: `Runtime` tracking is a dedicated first-stage source in `ExistenceCheck` flow.
+- External uniqueness source strategy (`DB/Cache/Memory/Callback`) is supported through `ExistenceCheck(...)` source adapters after `Runtime` stage.
+- Core retry safety defaults: `Random_Max_Retries = 1000` and `Max_Random_Time_Ms = 200`.
+- Deterministic fallback safety defaults: `Deterministic_Max_Steps = 1000` and `Deterministic_Max_Time_Ms = 200`.
+- If random uniqueness cannot complete within retry/time limits (or code space is exhausted), throw `ERR_RANDOM_SPACE_EXHAUSTED`.
+- If deterministic fallback cannot complete within step/time limits (or boundary is reached with no available candidate), throw `ERR_SEQUENCE_CONFLICT`.
+- Strict range rule for `Id`: define `MaxId = (N^Length) - 1`; if `Number > MaxId`, throw `ERR_ID_OUT_OF_RANGE` and do not auto-expand `Length`.
+- All modes must support conversion compatibility between one another through `{Code, Id}`.
+
+## 8) Positioning Model (Code <-> Id)
+Use base-N conversion:
+- `N = Len(Compiled_Alphabet)`
+- Leftmost char is most significant digit.
+- Digit value = index of char in compiled alphabet.
+
+`ConvertTo_Id(Code, Length) -> Id`:
+- Parse `Code` as base-N integer.
+- Used by `Current`, `Previous`, and `Next` (and internal `Reverse` helper when needed).
+
+`ConvertTo_Code(Id, Length) -> Code`:
+- Convert integer to base-N and left-pad with first alphabet character to required `Length`.
+- Used by `Beginy`, `Previous`, `Next`, `End`, `Random`, and `Id` (and internal `Reverse` helper when needed).
+
+Example with profile where first char is `A`:
+- `AAAAAAAA` -> `0`
+- `AAAAAAAB` -> `1`
+- `AAAAAAAC` -> `2`
+
+Important:
+- These examples are valid only when compiled alphabet starts with `A` and `Length = 8`.
+
+## 9) Validation (On Hold) and Errors
+Runtime error contract:
+- Core behavior (CANG_Core): throw exceptions only for core operation errors (typed exception recommended, e.g., CANG_Exception) with stable error key.
+- Boundary behavior (API/UI layer): catch core exceptions and return only important error data: `{Ok:false,Error,Description}`.
+- `Description` must be short, human-readable, and safe (no internal stack traces or sensitive data).
+
+Validation (external file, on hold):
+- `Profile_Id` must exist.
+- Input `Code` must contain only characters from compiled alphabet.
+- `Length` must be provided for generation/conversion modes.
+- `Length` must be integer >= 1.
+- For code-input modes, `strlen(Code)` must equal `Length`.
+- If project policy minimum is enabled (example `8`), enforce that minimum.
+- `Id` must be integer >= 0.
+- For `Id(Number, Length)`, `Number` must satisfy `0 <= Number <= (N^Length)-1`; otherwise throw `ERR_ID_OUT_OF_RANGE`.
+
+Suggested error keys:
+- `ERR_PROFILE_NOT_FOUND`
+- `ERR_INVALID_ALPHABET`
+- `ERR_INVALID_CODE_CHAR`
+- `ERR_INVALID_CODE_LENGTH`
+- `ERR_INVALID_ID`
+- `ERR_ID_OUT_OF_RANGE`
+- `ERR_MODE_INPUT_REQUIRED`
+- `ERR_LENGTH_REQUIRED`
+- `ERR_INVALID_LENGTH`
+- `ERR_LENGTH_MISMATCH`
+- `ERR_SEQUENCE_START`
+- `ERR_SEQUENCE_END`
+- `ERR_SEQUENCE_CONFLICT`
+- `ERR_RANDOM_SPACE_EXHAUSTED`
+
+## 10) Determinism and Security
+- Deterministic operations: `Beginy`, `Previous`, `Current`, `Next`, `End`, `Id`.
+- Non-deterministic operation: `Random`.
+- `Random` must use cryptographically secure source in PHP (for example `random_int`).
+
+## 11) Implementation Notes
+- Keep one single source of truth for profiles (CANG_Config).
+- CANG_Language should only resolve and normalize profile data.
+- CANG_ProFile should only handle ordering/selection logic.
+- CANG_Core should only perform generation/conversion operations.
+- `ValidateCore(...)` is moved out of `CANG_Core` and is on hold for a separate validation file.
+- CANG_Core must expose ExistenceCheck(Length, Code, Id): {Exists: bool, Status: string, Reason: string, Description: string} as active core method for uniqueness checks.
+
+
+
+## 12) Core ExistenceCheck Sources
+- This section defines source strategies used by active core `ExistenceCheck(...)`.
+- Core method:
+- `ExistenceCheck(Length, Code, Id): {Exists: bool, Status: string, Reason: string, Description: string}`
+- Source priority order: `Runtime -> DB -> Cache -> Memory -> Callback`.
+- Environment mode roles:
+- `Development -> System Developer`
+- `Testing -> BenchMark Validator`
+- `Production -> DashBoard Administrator`
+- Environment behavior mapping:
+- `Development`: enabled sources -> `Runtime -> DB`; `Cache/Memory/Callback` optional; `CHECK_ERROR` in optional sources may continue with warning.
+- `Testing`: enabled sources -> `Runtime -> DB -> Memory`; `Cache/Callback` optional; `CHECK_ERROR` fails test run by default.
+- `Production`: enabled sources -> `Runtime -> DB -> Cache -> Memory -> Callback`; `DB` required; `CHECK_ERROR` from `Runtime/DB` stops flow immediately.
+- Policy rule: deterministic/random collision handling stays the same across environments; only source availability and failure strictness change.
+- Retry/error contract: `Random` retries on `Exists=true`; deterministic modes use fallback walk on `Exists=true`; throw on `CHECK_ERROR` unless policy says otherwise.
+- Mini flow snippet:
+- Sequencing modes (`Beginy`, `Previous`, `Next`, `End`): `Current -> Sequence_OP -> ExistenceCheck -> Return/Fallback`.
+- `Current`: see canonical current core-operation flow in Section `7` (validation on hold/external).
+- `Random`: `Random_OP -> Current -> ExistenceCheck -> Return/Retry`.
+- `Id`: see canonical Id route rule (single source of truth), then `Return/Decision`.
+
+Optional payload examples:
+- Success (Exists=true): `{Exists:true,Status:"CHECK_SUCCESS",Reason:"VALID_INPUT",Description:"Code already exists."}`
+- Success (Exists=false): `{Exists:false,Status:"CHECK_SUCCESS",Reason:"VALID_INPUT",Description:"Code is available."}`
+- Failure: `{Exists:false,Status:"CHECK_ERROR",Reason:"SOURCE_FAILED",Description:"Database lookup failed."}`
+
+Flow map:
+- `Status=CHECK_CONFIG + Reason=NOT_CONFIGURED -> FLOW_EXISTENCE_CHECK_INPUT_NOT_READY`
+- `Status=CHECK_ERROR + Reason=INVALID_INPUT -> FLOW_EXISTENCE_CHECK_INPUT_FAILED`
+- `Status=CHECK_SUCCESS + Reason=VALID_INPUT -> FLOW_EXISTENCE_CHECK_INPUT_PASSED`
+- `Status=CHECK_ERROR + Reason=SOURCE_FAILED -> FLOW_EXISTENCE_CHECK_SOURCE_FAILED`
diff --git a/v.0.5.FinallVersion/Base_CANG_CommandAI.md b/v.0.5.FinallVersion/Base_CANG_CommandAI.md
new file mode 100644
index 0000000..b74d9c6
--- /dev/null
+++ b/v.0.5.FinallVersion/Base_CANG_CommandAI.md
@@ -0,0 +1,193 @@
+
+---
+Project Name: Complex Alpha Numeric Generator (CANG)
+
+Project Description: 'The Complex Alpha Numeric Generator (CANG) is a PHP‑based utility designed to produce highly customizable alphanumeric strings for use in authentication systems, token creation, unique identifiers, and data‑randomization workflows. Built for developers who need both flexibility and reliability, CANG supports layered configuration options including character‑set selection, entropy tuning, pattern enforcement, and optional cryptographic strengthening. CANG’s architecture emphasizes modularity and clean integration. It can operate as a standalone function, a reusable class, or a plug‑in component within larger PHP applications. Its deterministic configuration model ensures repeatable behavior when needed, while still offering strong randomness for security‑sensitive contexts. Whether you’re generating session keys, invitation codes, randomized filenames, or structured alphanumeric sequences, CANG provides a robust, developer‑friendly foundation that adapts to a wide range of project requirements.'
+
+Project Type: PHP
+
+Project Schema: Universal
+
+Project Definition:
+
+The Fundamental Language Symbols:
+Language_Symbol : Upper -> range('A','Z')
+Language_Symbol : Lower -> range('a','z')
+Language_Symbol : Numeric -> range('0','9')
+Language_Symbol : CharShort -> str_split('_-')
+Language_Symbol : CharLong -> str_split('#$%&+-@')
+
+The Basic Language Name:
+Language_Name : Alphabet_Upper
+Language_Name : Alphabet_Lower
+Language_Name : Alphabet_Mix
+Language_Name : Numeric
+Language_Name : Alphabet_Upper_Num
+Language_Name : Alphabet_Lower_Num
+Language_Name : Alphabet_Mix_Num
+Language_Name : Alphabet_Mix_Num_CharShort
+Language_Name : Alphabet_Mix_Num_CharLong
+Language_Name : Alphabet_Mix_Num_CharMix
+
+The Basic Language Type:
+Language_Type : '[A-Z]'
+Language_Type : '[a-z]'
+Language_Type : '[A-Z]', '[a-z]'
+Language_Type : '[0-9]'
+Language_Type : '[A-Z]', '[0-9]'
+Language_Type : '[a-z]', '[0-9]'
+Language_Type : '[A-Z]', '[a-z]', '[0-9]'
+Language_Type : '[A-Z]', '[a-z]', '[0-9]', '[-_]'
+Language_Type : '[A-Z]', '[a-z]', '[0-9]', '[#$%+-@]'
+Language_Type : '[A-Z]', '[a-z]', '[0-9]', '[-_]', '[#$%+-@]'
+
+The Basic Language Description:
+Language_Description : 'Alphabetical -> Simple: Capital Letters'
+Language_Description : 'Alphabetical -> Simple: Small Letters'
+Language_Description : 'Alphabetical -> Mix: Capital And Small Letters'
+Language_Description : 'Numerical -> Simple'
+Language_Description : 'Alphabetical And Numerical -> Simple: Capital Letters (Megaupload.com)'
+Language_Description : 'Alphabetical And Numerical -> Simple: Small Letters'
+Language_Description : 'Alphabetical And Numerical -> Mix: Capital And Small Letters'
+Language_Description : 'Alphabetical And Numerical -> Mix: Capital/Small Letters Plus Short Special Chars (YouTube.com)'
+Language_Description : 'Alphabetical And Numerical -> Mix: Capital/Small Letters Plus Long Special Chars (Safe Password)'
+Language_Description : 'Alphabetical And Numerical -> Mix: Capital/Small Letters Plus Full Special Chars (Safe Password)'
+
+The Basic Language Range:
+Language_Range : Language_Symbol[Upper]
+Language_Range : Language_Symbol[Lower]
+Language_Range : Language_Symbol[Upper], Language_Symbol[Lower]
+Language_Range : Language_Symbol[Numeric]
+Language_Range : Language_Symbol[Upper], Language_Symbol[Numeric]
+Language_Range : Language_Symbol[Lower], Language_Symbol[Numeric]
+Language_Range : Language_Symbol[Upper], Language_Symbol[Lower], Language_Symbol[Numeric]
+Language_Range : Language_Symbol[Upper], Language_Symbol[Lower], Language_Symbol[Numeric], Language_Symbol[CharShort]
+Language_Range : Language_Symbol[Upper], Language_Symbol[Lower], Language_Symbol[Numeric], Language_Symbol[CharLong]
+Language_Range : Language_Symbol[Upper], Language_Symbol[Lower], Language_Symbol[Numeric], Language_Symbol[CharShort], Language_Symbol[CharLong]
+
+The Basic Language Id:
+Language_Id : 0
+Language_Id : 1
+Language_Id : 2
+Language_Id : 3
+Language_Id : 4
+Language_Id : 5
+Language_Id : 6
+Language_Id : 7
+Language_Id : 8
+Language_Id : 9
+
+---
+ToDo List:
+Config,
+Language,
+ProFile,
+CANG
+
+---
+The Design Of The Files: Config, Language, ProFile, CANG
+
+File Name: CANG_Config
+File Description: It Is A Complex Array With Architecture Of Fundamental Configuration That Is Loaded InTo Language Class.
+
+File Name: CANG_Language
+File Description: It Is A Complex Language Class That Load The Config Of The Language InTo Sortable Order That Is Loaded InTo ProFile.
+
+Set The Basic Language_Order(Language_Id, Language_Name, Language_Type, Language_Description) -> Language_Range
+
+File Name: CANG_ProFile
+File Description:It Is A Complex Language ProFile Class That Load The Language Class InTo SelectAble Order That Is Loaded InTo CANG Core.
+
+The ProFile Must Be Able To Select The Symbol, Type, Range Of The Language And Order Them Accoding To Selection.
+The Selection Of Language Is Based On Language_Id To Set Default_Language.
+The Selection Of Language_Range Must Be Able To Language Rotate As Developer/User Decide To Sort By Canonical Order Language_Range, Language_Type
+Example:
+
+Language_Range() -> If More Than One The Order Does Work
+
+Default_Language -> Language_Id
+Default_Order -> Language_Range(Upper, Lower, Numeric, CharShort, CharLong)
+
+Default_Language -> Language_Id
+Default_Order -> Language_Range(CharLong, CharShort, Numeric, Lower, Upper)
+
+
+File Name: CANG_Core
+File Description: It Is A Complex CANG Class That Load The ProFile Class InTo The Fields To Select Mode And Lenght Of The Generated Code For Next Developer/User Process.
+
+Able To Change Length:
+Minimum Length = 8
+
+Able To Select Generation Mode:
+GenerateMode : Beginning, Previous, Current, Next, End, Random, Id
+
+Example Mode Selection:
+Mode : Beginning(:NoInPut:) -> Id(:InPutNumber:)
+Mode : Previous(:InPutString:) -> Id(:InPutNumber:)
+Mode : Current(:InPutString:) -> Id(:InPutNumber:)
+Mode : Next(:InPutString:) -> Id(:InPutNumber:)
+Mode : End(:NoInPut:) -> Id(:InPutNumber:)
+Mode : Random(:NoInPut:) -> Id(:InPutNumber:)
+Mode : Id(:InPutNumber:) -> Current(:InPutString:)
+
+Able To Read Position: Id(:InPutNumber:)
+Example:
+ 'Code Generation' / 'Program Friendly' / 'Developer/User Friendly'
+AAAAAAAA = 0 -> 1
+AAAAAAAB = 1 -> 2
+AAAAAAAC = 2 -> 3
+
+
+Code Array: Old Schema
+ public function CodeArray(){
+ $code_base = implode($this->code_char_base);
+ if($this->default_code_length==strlen($code_base)){
+ return array(
+ 'code_base'=>$code_base,
+ 'code_base_md5'=>md5($code_base),
+ 'code_base_sha1'=>sha1($code_base),
+ 'code_base64_encode'=>base64_encode($code_base),
+ 'code_max_number'=>$this->CodeType['code_max_number'],
+ 'code_pos_num'=>$this->code_pos_num,
+ 'code_time'=>$this->CodeType['code_generated_time'],
+ 'code_message'=>'is_acurrate',
+ 'code_name'=>$this->CodeType['code_name'],
+ 'code_description'=>$this->CodeType['code_description'],
+ 'code_type'=>$this->default_code_type,
+ 'code_max_type'=>$this->code_max_type,
+ 'code_length'=>$this->default_code_length
+ );
+ }elseif($this->default_code_length$code_base,
+ 'code_base_md5'=>md5($code_base),
+ 'code_base_sha1'=>sha1($code_base),
+ 'code_base64_encode'=>base64_encode($code_base),
+ 'code_max_number'=>$this->CodeType['code_max_number'],
+ 'code_pos_num'=>$this->code_pos_num,
+ 'code_time'=>$this->CodeType['code_generated_time'],
+ 'code_message'=>'is_upper_or_full',
+ 'code_name'=>$this->CodeType['code_name'],
+ 'code_description'=>$this->CodeType['code_description'],
+ 'code_type'=>$this->default_code_type,
+ 'code_max_type'=>$this->code_max_type,
+ 'code_length'=>$this->default_code_length
+ );
+ }else{
+ return array(
+ 'code_base'=>$code_base,
+ 'code_base_md5'=>md5($code_base),
+ 'code_base_sha1'=>sha1($code_base),
+ 'code_base64_encode'=>base64_encode($code_base),
+ 'code_max_number'=>$this->CodeType['code_max_number'],
+ 'code_pos_num'=>$this->code_pos_num,
+ 'code_time'=>$this->CodeType['code_generated_time'],
+ 'code_message'=>'is_lower',
+ 'code_name'=>$this->CodeType['code_name'],
+ 'code_description'=>$this->CodeType['code_description'],
+ 'code_type'=>$this->default_code_type,
+ 'code_max_type'=>$this->code_max_type,
+ 'code_length'=>$this->default_code_length
+ );
+ }
+ }
\ No newline at end of file