circle-ir 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +200 -0
- package/configs/sinks/code_injection.yaml +672 -0
- package/configs/sinks/command.yaml +917 -0
- package/configs/sinks/deserialization.yaml +105 -0
- package/configs/sinks/ldap.yaml +136 -0
- package/configs/sinks/nodejs.json +629 -0
- package/configs/sinks/path.yaml +715 -0
- package/configs/sinks/python.json +501 -0
- package/configs/sinks/rust.json +339 -0
- package/configs/sinks/sql.yaml +233 -0
- package/configs/sinks/ssrf.yaml +160 -0
- package/configs/sinks/xpath.yaml +121 -0
- package/configs/sinks/xss.yaml +727 -0
- package/configs/sources/db_sources.yaml +90 -0
- package/configs/sources/env_sources.yaml +94 -0
- package/configs/sources/express.json +197 -0
- package/configs/sources/file_sources.yaml +164 -0
- package/configs/sources/http_sources.yaml +379 -0
- package/configs/sources/io_sources.yaml +519 -0
- package/configs/sources/network_sources.yaml +99 -0
- package/configs/sources/python.json +230 -0
- package/configs/sources/rust.json +286 -0
- package/configs/sources/spring.yaml +70 -0
- package/dist/analysis/advisory-db.d.ts +86 -0
- package/dist/analysis/advisory-db.js +104 -0
- package/dist/analysis/advisory-db.js.map +1 -0
- package/dist/analysis/cargo-parser.d.ts +42 -0
- package/dist/analysis/cargo-parser.js +102 -0
- package/dist/analysis/cargo-parser.js.map +1 -0
- package/dist/analysis/config-loader.d.ts +37 -0
- package/dist/analysis/config-loader.js +1561 -0
- package/dist/analysis/config-loader.js.map +1 -0
- package/dist/analysis/constant-propagation/ast-utils.d.ts +25 -0
- package/dist/analysis/constant-propagation/ast-utils.js +34 -0
- package/dist/analysis/constant-propagation/ast-utils.js.map +1 -0
- package/dist/analysis/constant-propagation/evaluator.d.ts +32 -0
- package/dist/analysis/constant-propagation/evaluator.js +296 -0
- package/dist/analysis/constant-propagation/evaluator.js.map +1 -0
- package/dist/analysis/constant-propagation/index.d.ts +62 -0
- package/dist/analysis/constant-propagation/index.js +152 -0
- package/dist/analysis/constant-propagation/index.js.map +1 -0
- package/dist/analysis/constant-propagation/patterns.d.ts +8 -0
- package/dist/analysis/constant-propagation/patterns.js +126 -0
- package/dist/analysis/constant-propagation/patterns.js.map +1 -0
- package/dist/analysis/constant-propagation/propagator.d.ts +180 -0
- package/dist/analysis/constant-propagation/propagator.js +1985 -0
- package/dist/analysis/constant-propagation/propagator.js.map +1 -0
- package/dist/analysis/constant-propagation/types.d.ts +63 -0
- package/dist/analysis/constant-propagation/types.js +5 -0
- package/dist/analysis/constant-propagation/types.js.map +1 -0
- package/dist/analysis/constant-propagation.d.ts +9 -0
- package/dist/analysis/constant-propagation.js +18 -0
- package/dist/analysis/constant-propagation.js.map +1 -0
- package/dist/analysis/dependency-scanner.d.ts +79 -0
- package/dist/analysis/dependency-scanner.js +122 -0
- package/dist/analysis/dependency-scanner.js.map +1 -0
- package/dist/analysis/dfg-verifier.d.ts +116 -0
- package/dist/analysis/dfg-verifier.js +399 -0
- package/dist/analysis/dfg-verifier.js.map +1 -0
- package/dist/analysis/findings.d.ts +11 -0
- package/dist/analysis/findings.js +228 -0
- package/dist/analysis/findings.js.map +1 -0
- package/dist/analysis/index.d.ts +16 -0
- package/dist/analysis/index.js +18 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/interprocedural.d.ts +99 -0
- package/dist/analysis/interprocedural.js +526 -0
- package/dist/analysis/interprocedural.js.map +1 -0
- package/dist/analysis/path-finder.d.ts +133 -0
- package/dist/analysis/path-finder.js +354 -0
- package/dist/analysis/path-finder.js.map +1 -0
- package/dist/analysis/rules.d.ts +75 -0
- package/dist/analysis/rules.js +332 -0
- package/dist/analysis/rules.js.map +1 -0
- package/dist/analysis/semver.d.ts +27 -0
- package/dist/analysis/semver.js +127 -0
- package/dist/analysis/semver.js.map +1 -0
- package/dist/analysis/taint-matcher.d.ts +15 -0
- package/dist/analysis/taint-matcher.js +634 -0
- package/dist/analysis/taint-matcher.js.map +1 -0
- package/dist/analysis/taint-propagation.d.ts +67 -0
- package/dist/analysis/taint-propagation.js +298 -0
- package/dist/analysis/taint-propagation.js.map +1 -0
- package/dist/analysis/unresolved.d.ts +14 -0
- package/dist/analysis/unresolved.js +202 -0
- package/dist/analysis/unresolved.js.map +1 -0
- package/dist/analyzer.d.ts +43 -0
- package/dist/analyzer.js +1010 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/browser/circle-ir.js +16576 -0
- package/dist/browser.d.ts +38 -0
- package/dist/browser.js +38 -0
- package/dist/browser.js.map +1 -0
- package/dist/core/circle-ir-core.cjs +13626 -0
- package/dist/core/circle-ir-core.d.ts +59 -0
- package/dist/core/circle-ir-core.js +13591 -0
- package/dist/core/extractors/calls.d.ts +13 -0
- package/dist/core/extractors/calls.js +1429 -0
- package/dist/core/extractors/calls.js.map +1 -0
- package/dist/core/extractors/cfg.d.ts +9 -0
- package/dist/core/extractors/cfg.js +519 -0
- package/dist/core/extractors/cfg.js.map +1 -0
- package/dist/core/extractors/dfg.d.ts +12 -0
- package/dist/core/extractors/dfg.js +1081 -0
- package/dist/core/extractors/dfg.js.map +1 -0
- package/dist/core/extractors/exports.d.ts +14 -0
- package/dist/core/extractors/exports.js +80 -0
- package/dist/core/extractors/exports.js.map +1 -0
- package/dist/core/extractors/imports.d.ts +9 -0
- package/dist/core/extractors/imports.js +739 -0
- package/dist/core/extractors/imports.js.map +1 -0
- package/dist/core/extractors/index.d.ts +10 -0
- package/dist/core/extractors/index.js +11 -0
- package/dist/core/extractors/index.js.map +1 -0
- package/dist/core/extractors/meta.d.ts +10 -0
- package/dist/core/extractors/meta.js +109 -0
- package/dist/core/extractors/meta.js.map +1 -0
- package/dist/core/extractors/types.d.ts +10 -0
- package/dist/core/extractors/types.js +1479 -0
- package/dist/core/extractors/types.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/parser.d.ts +84 -0
- package/dist/core/parser.js +250 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core-lib.d.ts +59 -0
- package/dist/core-lib.js +62 -0
- package/dist/core-lib.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/index.d.ts +11 -0
- package/dist/languages/index.js +14 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/plugins/base.d.ts +44 -0
- package/dist/languages/plugins/base.js +82 -0
- package/dist/languages/plugins/base.js.map +1 -0
- package/dist/languages/plugins/index.d.ts +14 -0
- package/dist/languages/plugins/index.js +25 -0
- package/dist/languages/plugins/index.js.map +1 -0
- package/dist/languages/plugins/java.d.ts +49 -0
- package/dist/languages/plugins/java.js +402 -0
- package/dist/languages/plugins/java.js.map +1 -0
- package/dist/languages/plugins/javascript.d.ts +48 -0
- package/dist/languages/plugins/javascript.js +445 -0
- package/dist/languages/plugins/javascript.js.map +1 -0
- package/dist/languages/plugins/python.d.ts +47 -0
- package/dist/languages/plugins/python.js +480 -0
- package/dist/languages/plugins/python.js.map +1 -0
- package/dist/languages/plugins/rust.d.ts +47 -0
- package/dist/languages/plugins/rust.js +405 -0
- package/dist/languages/plugins/rust.js.map +1 -0
- package/dist/languages/registry.d.ts +30 -0
- package/dist/languages/registry.js +80 -0
- package/dist/languages/registry.js.map +1 -0
- package/dist/languages/types.d.ts +184 -0
- package/dist/languages/types.js +8 -0
- package/dist/languages/types.js.map +1 -0
- package/dist/resolution/cross-file.d.ts +146 -0
- package/dist/resolution/cross-file.js +439 -0
- package/dist/resolution/cross-file.js.map +1 -0
- package/dist/resolution/index.d.ts +12 -0
- package/dist/resolution/index.js +10 -0
- package/dist/resolution/index.js.map +1 -0
- package/dist/resolution/symbol-table.d.ts +136 -0
- package/dist/resolution/symbol-table.js +336 -0
- package/dist/resolution/symbol-table.js.map +1 -0
- package/dist/resolution/type-hierarchy.d.ts +124 -0
- package/dist/resolution/type-hierarchy.js +515 -0
- package/dist/resolution/type-hierarchy.js.map +1 -0
- package/dist/types/config.d.ts +45 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +392 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +85 -0
- package/dist/utils/logger.js +198 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/wasm/tree-sitter-java.wasm +0 -0
- package/dist/wasm/tree-sitter-javascript.wasm +0 -0
- package/dist/wasm/tree-sitter-python.wasm +0 -0
- package/dist/wasm/tree-sitter-rust.wasm +0 -0
- package/dist/wasm/web-tree-sitter.wasm +0 -0
- package/docs/SPEC.md +1021 -0
- package/examples/browser-example.html +610 -0
- package/examples/node-example.ts +215 -0
- package/package.json +107 -0
- package/wasm/tree-sitter-java.wasm +0 -0
- package/wasm/tree-sitter-javascript.wasm +0 -0
- package/wasm/tree-sitter-python.wasm +0 -0
- package/wasm/tree-sitter-rust.wasm +0 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circle-IR 3.0 TypeScript Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* These types conform to docs/SPEC.md
|
|
5
|
+
*/
|
|
6
|
+
export type SupportedLanguage = "java" | "c" | "cpp" | "javascript" | "typescript" | "python" | "rust";
|
|
7
|
+
export interface Meta {
|
|
8
|
+
circle_ir: "3.0";
|
|
9
|
+
file: string;
|
|
10
|
+
language: SupportedLanguage;
|
|
11
|
+
loc: number;
|
|
12
|
+
hash: string;
|
|
13
|
+
package?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TypeInfo {
|
|
16
|
+
name: string;
|
|
17
|
+
kind: "class" | "interface" | "enum";
|
|
18
|
+
package: string | null;
|
|
19
|
+
extends: string | null;
|
|
20
|
+
implements: string[];
|
|
21
|
+
annotations: string[];
|
|
22
|
+
methods: MethodInfo[];
|
|
23
|
+
fields: FieldInfo[];
|
|
24
|
+
start_line: number;
|
|
25
|
+
end_line: number;
|
|
26
|
+
}
|
|
27
|
+
export interface MethodInfo {
|
|
28
|
+
name: string;
|
|
29
|
+
return_type: string | null;
|
|
30
|
+
parameters: ParameterInfo[];
|
|
31
|
+
annotations: string[];
|
|
32
|
+
modifiers: string[];
|
|
33
|
+
start_line: number;
|
|
34
|
+
end_line: number;
|
|
35
|
+
}
|
|
36
|
+
export interface ParameterInfo {
|
|
37
|
+
name: string;
|
|
38
|
+
type: string | null;
|
|
39
|
+
annotations: string[];
|
|
40
|
+
line?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface FieldInfo {
|
|
43
|
+
name: string;
|
|
44
|
+
type: string | null;
|
|
45
|
+
modifiers: string[];
|
|
46
|
+
annotations: string[];
|
|
47
|
+
}
|
|
48
|
+
export interface CallInfo {
|
|
49
|
+
method_name: string;
|
|
50
|
+
receiver: string | null;
|
|
51
|
+
receiver_type?: string | null;
|
|
52
|
+
arguments: ArgumentInfo[];
|
|
53
|
+
location: {
|
|
54
|
+
line: number;
|
|
55
|
+
column: number;
|
|
56
|
+
};
|
|
57
|
+
in_method?: string | null;
|
|
58
|
+
is_constructor?: boolean;
|
|
59
|
+
resolved?: boolean;
|
|
60
|
+
resolution?: CallResolution;
|
|
61
|
+
}
|
|
62
|
+
export interface ArgumentInfo {
|
|
63
|
+
position: number;
|
|
64
|
+
expression: string;
|
|
65
|
+
variable?: string | null;
|
|
66
|
+
literal?: string | null;
|
|
67
|
+
value?: string | null;
|
|
68
|
+
}
|
|
69
|
+
export interface CallResolution {
|
|
70
|
+
status: "resolved" | "external_method" | "interface_method" | "reflection";
|
|
71
|
+
target?: string;
|
|
72
|
+
candidates?: string[];
|
|
73
|
+
}
|
|
74
|
+
export interface CFG {
|
|
75
|
+
blocks: CFGBlock[];
|
|
76
|
+
edges: CFGEdge[];
|
|
77
|
+
}
|
|
78
|
+
export interface CFGBlock {
|
|
79
|
+
id: number;
|
|
80
|
+
type: "entry" | "exit" | "normal" | "conditional" | "loop";
|
|
81
|
+
start_line: number;
|
|
82
|
+
end_line: number;
|
|
83
|
+
}
|
|
84
|
+
export interface CFGEdge {
|
|
85
|
+
from: number;
|
|
86
|
+
to: number;
|
|
87
|
+
type: "sequential" | "true" | "false" | "exception" | "back" | "break" | "continue";
|
|
88
|
+
}
|
|
89
|
+
export interface DFG {
|
|
90
|
+
defs: DFGDef[];
|
|
91
|
+
uses: DFGUse[];
|
|
92
|
+
chains?: DFGChain[];
|
|
93
|
+
}
|
|
94
|
+
export interface DFGDef {
|
|
95
|
+
id: number;
|
|
96
|
+
variable: string;
|
|
97
|
+
line: number;
|
|
98
|
+
column?: number;
|
|
99
|
+
kind: "param" | "local" | "field" | "return";
|
|
100
|
+
expression?: string;
|
|
101
|
+
}
|
|
102
|
+
export interface DFGUse {
|
|
103
|
+
id: number;
|
|
104
|
+
variable: string;
|
|
105
|
+
line: number;
|
|
106
|
+
column?: number;
|
|
107
|
+
def_id: number | null;
|
|
108
|
+
}
|
|
109
|
+
export interface DFGChain {
|
|
110
|
+
from_def: number;
|
|
111
|
+
to_def: number;
|
|
112
|
+
via: string;
|
|
113
|
+
}
|
|
114
|
+
export interface Taint {
|
|
115
|
+
sources: TaintSource[];
|
|
116
|
+
sinks: TaintSink[];
|
|
117
|
+
sanitizers?: TaintSanitizer[];
|
|
118
|
+
flows?: TaintFlowInfo[];
|
|
119
|
+
interprocedural?: InterproceduralInfo;
|
|
120
|
+
}
|
|
121
|
+
export interface InterproceduralInfo {
|
|
122
|
+
tainted_methods: string[];
|
|
123
|
+
taint_bridges: string[];
|
|
124
|
+
method_flows: MethodTaintFlow[];
|
|
125
|
+
}
|
|
126
|
+
export interface MethodTaintFlow {
|
|
127
|
+
caller: string;
|
|
128
|
+
callee: string;
|
|
129
|
+
call_line: number;
|
|
130
|
+
tainted_args: number[];
|
|
131
|
+
returns_taint: boolean;
|
|
132
|
+
}
|
|
133
|
+
export interface TaintFlowInfo {
|
|
134
|
+
source_line: number;
|
|
135
|
+
sink_line: number;
|
|
136
|
+
source_type: SourceType;
|
|
137
|
+
sink_type: SinkType;
|
|
138
|
+
path: TaintFlowStep[];
|
|
139
|
+
confidence: number;
|
|
140
|
+
sanitized: boolean;
|
|
141
|
+
}
|
|
142
|
+
export interface TaintFlowStep {
|
|
143
|
+
variable: string;
|
|
144
|
+
line: number;
|
|
145
|
+
type: 'source' | 'assignment' | 'use' | 'return' | 'field' | 'sink';
|
|
146
|
+
}
|
|
147
|
+
export type SourceType = "http_param" | "http_body" | "http_header" | "http_cookie" | "http_path" | "http_query" | "io_input" | "env_input" | "db_input" | "network_input" | "file_input" | "config_param" | "interprocedural_param" | "plugin_param" | "constructor_field";
|
|
148
|
+
export type SinkType = "sql_injection" | "nosql_injection" | "command_injection" | "path_traversal" | "xss" | "xxe" | "deserialization" | "ldap_injection" | "xpath_injection" | "ssrf" | "open_redirect" | "code_injection" | "log_injection" | "weak_random" | "weak_hash" | "weak_crypto" | "insecure_cookie" | "trust_boundary" | "external_taint_escape";
|
|
149
|
+
export type Severity = "critical" | "high" | "medium" | "low";
|
|
150
|
+
export interface TaintSource {
|
|
151
|
+
type: SourceType;
|
|
152
|
+
location: string;
|
|
153
|
+
severity: Severity;
|
|
154
|
+
line: number;
|
|
155
|
+
confidence: number;
|
|
156
|
+
variable?: string;
|
|
157
|
+
method?: string;
|
|
158
|
+
annotation?: string;
|
|
159
|
+
}
|
|
160
|
+
export interface TaintSink {
|
|
161
|
+
type: SinkType;
|
|
162
|
+
cwe: string;
|
|
163
|
+
location: string;
|
|
164
|
+
line: number;
|
|
165
|
+
confidence: number;
|
|
166
|
+
method?: string;
|
|
167
|
+
argPositions?: number[];
|
|
168
|
+
}
|
|
169
|
+
export interface TaintSanitizer {
|
|
170
|
+
type: string;
|
|
171
|
+
method: string;
|
|
172
|
+
line: number;
|
|
173
|
+
sanitizes: SinkType[];
|
|
174
|
+
}
|
|
175
|
+
export interface ImportInfo {
|
|
176
|
+
imported_name: string;
|
|
177
|
+
from_package: string | null;
|
|
178
|
+
alias: string | null;
|
|
179
|
+
is_wildcard: boolean;
|
|
180
|
+
line_number: number | null;
|
|
181
|
+
}
|
|
182
|
+
export interface ExportInfo {
|
|
183
|
+
symbol: string;
|
|
184
|
+
kind: "class" | "interface" | "method" | "field";
|
|
185
|
+
visibility: "public" | "protected" | "package";
|
|
186
|
+
}
|
|
187
|
+
export interface UnresolvedItem {
|
|
188
|
+
type: "virtual_dispatch" | "taint_propagation" | "reflection" | "dynamic_call";
|
|
189
|
+
call_id?: number;
|
|
190
|
+
reason: string;
|
|
191
|
+
context: {
|
|
192
|
+
code: string;
|
|
193
|
+
line: number;
|
|
194
|
+
candidates?: string[];
|
|
195
|
+
};
|
|
196
|
+
llm_question: string;
|
|
197
|
+
}
|
|
198
|
+
export interface Enriched {
|
|
199
|
+
functions?: EnrichedFunction[];
|
|
200
|
+
additional_sources?: TaintSource[];
|
|
201
|
+
additional_sinks?: TaintSink[];
|
|
202
|
+
resolved_calls?: ResolvedCall[];
|
|
203
|
+
llmVerification?: LLMVerificationResult;
|
|
204
|
+
}
|
|
205
|
+
export interface LLMVerificationResult {
|
|
206
|
+
verified: LLMVerifiedVulnerability[];
|
|
207
|
+
stats?: {
|
|
208
|
+
enrichmentTimeMs?: number;
|
|
209
|
+
verificationTimeMs?: number;
|
|
210
|
+
totalTimeMs?: number;
|
|
211
|
+
sourcesFound?: number;
|
|
212
|
+
sinksFound?: number;
|
|
213
|
+
vulnerabilitiesVerified?: number;
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
export interface LLMVerifiedVulnerability {
|
|
217
|
+
sourceFile: string;
|
|
218
|
+
sourceLine: number;
|
|
219
|
+
sinkLine: number;
|
|
220
|
+
cwe: string;
|
|
221
|
+
type: string;
|
|
222
|
+
verdict: 'TRUE_POSITIVE' | 'FALSE_POSITIVE' | 'UNCERTAIN';
|
|
223
|
+
confidence: number;
|
|
224
|
+
reasoning: string;
|
|
225
|
+
exploitability: 'high' | 'medium' | 'low' | 'none';
|
|
226
|
+
attackVector?: string;
|
|
227
|
+
prerequisites?: string[];
|
|
228
|
+
}
|
|
229
|
+
export interface EnrichedFunction {
|
|
230
|
+
method_name: string;
|
|
231
|
+
role: "controller" | "service" | "repository" | "utility";
|
|
232
|
+
risk: Severity;
|
|
233
|
+
trust_boundary: "entry_point" | "internal" | "external";
|
|
234
|
+
summary: string;
|
|
235
|
+
}
|
|
236
|
+
export interface ResolvedCall {
|
|
237
|
+
call_id: number;
|
|
238
|
+
resolved_to: string;
|
|
239
|
+
confidence: number;
|
|
240
|
+
reason: string;
|
|
241
|
+
}
|
|
242
|
+
export interface Finding {
|
|
243
|
+
id: string;
|
|
244
|
+
type: SinkType;
|
|
245
|
+
cwe: string;
|
|
246
|
+
severity: Severity;
|
|
247
|
+
confidence: number;
|
|
248
|
+
source: {
|
|
249
|
+
file: string;
|
|
250
|
+
line: number;
|
|
251
|
+
code: string;
|
|
252
|
+
};
|
|
253
|
+
sink: {
|
|
254
|
+
file: string;
|
|
255
|
+
line: number;
|
|
256
|
+
code: string;
|
|
257
|
+
};
|
|
258
|
+
path?: TaintHop[];
|
|
259
|
+
exploitable: boolean;
|
|
260
|
+
explanation: string;
|
|
261
|
+
remediation: string;
|
|
262
|
+
verification: {
|
|
263
|
+
graph_path_exists: boolean;
|
|
264
|
+
llm_verified: boolean;
|
|
265
|
+
llm_confidence: number;
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
export interface TaintHop {
|
|
269
|
+
file: string;
|
|
270
|
+
method: string;
|
|
271
|
+
line: number;
|
|
272
|
+
code: string;
|
|
273
|
+
variable: string;
|
|
274
|
+
}
|
|
275
|
+
export interface ProjectMeta {
|
|
276
|
+
name: string;
|
|
277
|
+
root: string;
|
|
278
|
+
language: SupportedLanguage;
|
|
279
|
+
framework?: string;
|
|
280
|
+
framework_version?: string;
|
|
281
|
+
build_tool?: "maven" | "gradle" | "ant" | "unknown";
|
|
282
|
+
total_files: number;
|
|
283
|
+
total_loc: number;
|
|
284
|
+
analyzed_at: string;
|
|
285
|
+
}
|
|
286
|
+
export interface CrossFileCall {
|
|
287
|
+
id: string;
|
|
288
|
+
from: {
|
|
289
|
+
file: string;
|
|
290
|
+
method: string;
|
|
291
|
+
line: number;
|
|
292
|
+
};
|
|
293
|
+
to: {
|
|
294
|
+
file: string;
|
|
295
|
+
method: string;
|
|
296
|
+
line: number;
|
|
297
|
+
};
|
|
298
|
+
args_mapping: ArgMapping[];
|
|
299
|
+
resolved: boolean;
|
|
300
|
+
}
|
|
301
|
+
export interface ArgMapping {
|
|
302
|
+
caller_arg: number;
|
|
303
|
+
callee_param: number;
|
|
304
|
+
taint_propagates: boolean;
|
|
305
|
+
}
|
|
306
|
+
export interface TypeHierarchy {
|
|
307
|
+
classes: Record<string, ClassHierarchyInfo>;
|
|
308
|
+
interfaces: Record<string, InterfaceHierarchyInfo>;
|
|
309
|
+
}
|
|
310
|
+
export interface ClassHierarchyInfo {
|
|
311
|
+
file: string;
|
|
312
|
+
extends: string | null;
|
|
313
|
+
implements: string[];
|
|
314
|
+
subclasses: string[];
|
|
315
|
+
}
|
|
316
|
+
export interface InterfaceHierarchyInfo {
|
|
317
|
+
file: string;
|
|
318
|
+
extends: string[];
|
|
319
|
+
implementations: string[];
|
|
320
|
+
}
|
|
321
|
+
export interface TaintPath {
|
|
322
|
+
id: string;
|
|
323
|
+
source: {
|
|
324
|
+
file: string;
|
|
325
|
+
line: number;
|
|
326
|
+
type: SourceType;
|
|
327
|
+
code: string;
|
|
328
|
+
};
|
|
329
|
+
sink: {
|
|
330
|
+
file: string;
|
|
331
|
+
line: number;
|
|
332
|
+
type: SinkType;
|
|
333
|
+
cwe: string;
|
|
334
|
+
code: string;
|
|
335
|
+
};
|
|
336
|
+
hops: TaintHop[];
|
|
337
|
+
sanitizers_in_path: string[];
|
|
338
|
+
path_exists: boolean;
|
|
339
|
+
confidence: number;
|
|
340
|
+
}
|
|
341
|
+
export interface ProjectAnalysis {
|
|
342
|
+
meta: ProjectMeta;
|
|
343
|
+
files: FileAnalysis[];
|
|
344
|
+
type_hierarchy: TypeHierarchy;
|
|
345
|
+
cross_file_calls: CrossFileCall[];
|
|
346
|
+
taint_paths: TaintPath[];
|
|
347
|
+
findings: Finding[];
|
|
348
|
+
}
|
|
349
|
+
export interface FileAnalysis {
|
|
350
|
+
file: string;
|
|
351
|
+
analysis: CircleIR;
|
|
352
|
+
}
|
|
353
|
+
export interface CircleIR {
|
|
354
|
+
meta: Meta;
|
|
355
|
+
types: TypeInfo[];
|
|
356
|
+
calls: CallInfo[];
|
|
357
|
+
cfg: CFG;
|
|
358
|
+
dfg: DFG;
|
|
359
|
+
taint: Taint;
|
|
360
|
+
imports: ImportInfo[];
|
|
361
|
+
exports: ExportInfo[];
|
|
362
|
+
unresolved: UnresolvedItem[];
|
|
363
|
+
enriched: Enriched;
|
|
364
|
+
}
|
|
365
|
+
export interface AnalysisResponse {
|
|
366
|
+
success: boolean;
|
|
367
|
+
analysis: {
|
|
368
|
+
sources: TaintSource[];
|
|
369
|
+
sinks: TaintSink[];
|
|
370
|
+
vulnerabilities: Vulnerability[];
|
|
371
|
+
};
|
|
372
|
+
meta: {
|
|
373
|
+
parseTimeMs: number;
|
|
374
|
+
analysisTimeMs: number;
|
|
375
|
+
totalTimeMs: number;
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
export interface Vulnerability {
|
|
379
|
+
type: SinkType;
|
|
380
|
+
cwe: string;
|
|
381
|
+
severity: Severity;
|
|
382
|
+
source: {
|
|
383
|
+
line: number;
|
|
384
|
+
type: SourceType;
|
|
385
|
+
};
|
|
386
|
+
sink: {
|
|
387
|
+
line: number;
|
|
388
|
+
type: SinkType;
|
|
389
|
+
};
|
|
390
|
+
confidence: number;
|
|
391
|
+
path?: string[];
|
|
392
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized logging module using pino.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { logger } from './utils/logger.js';
|
|
6
|
+
* logger.info('Processing file', { file: 'test.java' });
|
|
7
|
+
* logger.error('Failed to parse', { error: err.message });
|
|
8
|
+
*
|
|
9
|
+
* Log Levels (in order of severity):
|
|
10
|
+
* - trace: Very detailed debugging
|
|
11
|
+
* - debug: Debugging information
|
|
12
|
+
* - info: General information (default for CLI)
|
|
13
|
+
* - warn: Warnings
|
|
14
|
+
* - error: Errors
|
|
15
|
+
* - fatal: Fatal errors
|
|
16
|
+
* - silent: No logging
|
|
17
|
+
*
|
|
18
|
+
* Configuration:
|
|
19
|
+
* - Set LOG_LEVEL env var to change level
|
|
20
|
+
* - Set LOG_FORMAT=json for JSON output (default in non-TTY)
|
|
21
|
+
* - Set LOG_FORMAT=pretty for human-readable output
|
|
22
|
+
*/
|
|
23
|
+
import pino, { Logger } from 'pino';
|
|
24
|
+
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' | 'silent';
|
|
25
|
+
export interface LoggerConfig {
|
|
26
|
+
level?: LogLevel;
|
|
27
|
+
pretty?: boolean;
|
|
28
|
+
name?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Configure the logger. Should be called early in application startup.
|
|
32
|
+
* Subsequent calls will reconfigure the logger.
|
|
33
|
+
*/
|
|
34
|
+
export declare function configureLogger(config: Partial<LoggerConfig>): void;
|
|
35
|
+
/**
|
|
36
|
+
* Set the log level dynamically
|
|
37
|
+
*/
|
|
38
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
39
|
+
/**
|
|
40
|
+
* Get the current log level
|
|
41
|
+
*/
|
|
42
|
+
export declare function getLogLevel(): LogLevel;
|
|
43
|
+
/**
|
|
44
|
+
* Create a child logger with additional context
|
|
45
|
+
*/
|
|
46
|
+
export declare function createChildLogger(bindings: Record<string, unknown>): Logger;
|
|
47
|
+
/**
|
|
48
|
+
* The main logger instance.
|
|
49
|
+
* Use this for all logging throughout the application.
|
|
50
|
+
*/
|
|
51
|
+
export declare const logger: {
|
|
52
|
+
/**
|
|
53
|
+
* Log at trace level (most verbose)
|
|
54
|
+
*/
|
|
55
|
+
trace: (msg: string, obj?: Record<string, unknown>) => void;
|
|
56
|
+
/**
|
|
57
|
+
* Log at debug level
|
|
58
|
+
*/
|
|
59
|
+
debug: (msg: string, obj?: Record<string, unknown>) => void;
|
|
60
|
+
/**
|
|
61
|
+
* Log at info level (default)
|
|
62
|
+
*/
|
|
63
|
+
info: (msg: string, obj?: Record<string, unknown>) => void;
|
|
64
|
+
/**
|
|
65
|
+
* Log at warn level
|
|
66
|
+
*/
|
|
67
|
+
warn: (msg: string, obj?: Record<string, unknown>) => void;
|
|
68
|
+
/**
|
|
69
|
+
* Log at error level
|
|
70
|
+
*/
|
|
71
|
+
error: (msg: string, obj?: Record<string, unknown>) => void;
|
|
72
|
+
/**
|
|
73
|
+
* Log at fatal level (most severe)
|
|
74
|
+
*/
|
|
75
|
+
fatal: (msg: string, obj?: Record<string, unknown>) => void;
|
|
76
|
+
/**
|
|
77
|
+
* Create a child logger with additional context
|
|
78
|
+
*/
|
|
79
|
+
child: (bindings: Record<string, unknown>) => pino.Logger;
|
|
80
|
+
/**
|
|
81
|
+
* Check if a level is enabled
|
|
82
|
+
*/
|
|
83
|
+
isLevelEnabled: (level: LogLevel) => boolean;
|
|
84
|
+
};
|
|
85
|
+
export type { Logger } from 'pino';
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized logging module using pino.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { logger } from './utils/logger.js';
|
|
6
|
+
* logger.info('Processing file', { file: 'test.java' });
|
|
7
|
+
* logger.error('Failed to parse', { error: err.message });
|
|
8
|
+
*
|
|
9
|
+
* Log Levels (in order of severity):
|
|
10
|
+
* - trace: Very detailed debugging
|
|
11
|
+
* - debug: Debugging information
|
|
12
|
+
* - info: General information (default for CLI)
|
|
13
|
+
* - warn: Warnings
|
|
14
|
+
* - error: Errors
|
|
15
|
+
* - fatal: Fatal errors
|
|
16
|
+
* - silent: No logging
|
|
17
|
+
*
|
|
18
|
+
* Configuration:
|
|
19
|
+
* - Set LOG_LEVEL env var to change level
|
|
20
|
+
* - Set LOG_FORMAT=json for JSON output (default in non-TTY)
|
|
21
|
+
* - Set LOG_FORMAT=pretty for human-readable output
|
|
22
|
+
*/
|
|
23
|
+
import pino from 'pino';
|
|
24
|
+
// Default configuration
|
|
25
|
+
const DEFAULT_CONFIG = {
|
|
26
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
27
|
+
pretty: process.env.LOG_FORMAT === 'pretty' || (process.stdout.isTTY && process.env.LOG_FORMAT !== 'json'),
|
|
28
|
+
name: 'circle-ir',
|
|
29
|
+
};
|
|
30
|
+
let currentConfig = { ...DEFAULT_CONFIG };
|
|
31
|
+
let loggerInstance = null;
|
|
32
|
+
/**
|
|
33
|
+
* Create pino logger options from config
|
|
34
|
+
*/
|
|
35
|
+
function createLoggerOptions(config) {
|
|
36
|
+
const options = {
|
|
37
|
+
name: config.name,
|
|
38
|
+
level: config.level || 'info',
|
|
39
|
+
};
|
|
40
|
+
// Add pretty printing for TTY or when explicitly requested
|
|
41
|
+
if (config.pretty) {
|
|
42
|
+
options.transport = {
|
|
43
|
+
target: 'pino-pretty',
|
|
44
|
+
options: {
|
|
45
|
+
colorize: true,
|
|
46
|
+
translateTime: 'SYS:standard',
|
|
47
|
+
ignore: 'pid,hostname',
|
|
48
|
+
messageFormat: '{msg}',
|
|
49
|
+
singleLine: true,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return options;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the singleton logger instance
|
|
57
|
+
*/
|
|
58
|
+
function getLogger() {
|
|
59
|
+
if (!loggerInstance) {
|
|
60
|
+
const options = createLoggerOptions(currentConfig);
|
|
61
|
+
// Write to stderr to avoid polluting stdout for CLI tools
|
|
62
|
+
if (options.transport) {
|
|
63
|
+
// When using transport (pino-pretty), specify destination in options
|
|
64
|
+
options.transport.options = {
|
|
65
|
+
...options.transport.options,
|
|
66
|
+
destination: 2, // stderr file descriptor
|
|
67
|
+
};
|
|
68
|
+
loggerInstance = pino(options);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
loggerInstance = pino(options, process.stderr);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return loggerInstance;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Configure the logger. Should be called early in application startup.
|
|
78
|
+
* Subsequent calls will reconfigure the logger.
|
|
79
|
+
*/
|
|
80
|
+
export function configureLogger(config) {
|
|
81
|
+
currentConfig = { ...currentConfig, ...config };
|
|
82
|
+
const options = createLoggerOptions(currentConfig);
|
|
83
|
+
// Write to stderr to avoid polluting stdout for CLI tools
|
|
84
|
+
if (options.transport) {
|
|
85
|
+
options.transport.options = {
|
|
86
|
+
...options.transport.options,
|
|
87
|
+
destination: 2, // stderr file descriptor
|
|
88
|
+
};
|
|
89
|
+
loggerInstance = pino(options);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
loggerInstance = pino(options, process.stderr);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Set the log level dynamically
|
|
97
|
+
*/
|
|
98
|
+
export function setLogLevel(level) {
|
|
99
|
+
currentConfig.level = level;
|
|
100
|
+
if (loggerInstance) {
|
|
101
|
+
loggerInstance.level = level;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the current log level
|
|
106
|
+
*/
|
|
107
|
+
export function getLogLevel() {
|
|
108
|
+
return currentConfig.level || 'info';
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a child logger with additional context
|
|
112
|
+
*/
|
|
113
|
+
export function createChildLogger(bindings) {
|
|
114
|
+
return getLogger().child(bindings);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The main logger instance.
|
|
118
|
+
* Use this for all logging throughout the application.
|
|
119
|
+
*/
|
|
120
|
+
export const logger = {
|
|
121
|
+
/**
|
|
122
|
+
* Log at trace level (most verbose)
|
|
123
|
+
*/
|
|
124
|
+
trace: (msg, obj) => {
|
|
125
|
+
if (obj) {
|
|
126
|
+
getLogger().trace(obj, msg);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
getLogger().trace(msg);
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
/**
|
|
133
|
+
* Log at debug level
|
|
134
|
+
*/
|
|
135
|
+
debug: (msg, obj) => {
|
|
136
|
+
if (obj) {
|
|
137
|
+
getLogger().debug(obj, msg);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
getLogger().debug(msg);
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
/**
|
|
144
|
+
* Log at info level (default)
|
|
145
|
+
*/
|
|
146
|
+
info: (msg, obj) => {
|
|
147
|
+
if (obj) {
|
|
148
|
+
getLogger().info(obj, msg);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
getLogger().info(msg);
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
/**
|
|
155
|
+
* Log at warn level
|
|
156
|
+
*/
|
|
157
|
+
warn: (msg, obj) => {
|
|
158
|
+
if (obj) {
|
|
159
|
+
getLogger().warn(obj, msg);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
getLogger().warn(msg);
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
/**
|
|
166
|
+
* Log at error level
|
|
167
|
+
*/
|
|
168
|
+
error: (msg, obj) => {
|
|
169
|
+
if (obj) {
|
|
170
|
+
getLogger().error(obj, msg);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
getLogger().error(msg);
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
/**
|
|
177
|
+
* Log at fatal level (most severe)
|
|
178
|
+
*/
|
|
179
|
+
fatal: (msg, obj) => {
|
|
180
|
+
if (obj) {
|
|
181
|
+
getLogger().fatal(obj, msg);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
getLogger().fatal(msg);
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
/**
|
|
188
|
+
* Create a child logger with additional context
|
|
189
|
+
*/
|
|
190
|
+
child: (bindings) => createChildLogger(bindings),
|
|
191
|
+
/**
|
|
192
|
+
* Check if a level is enabled
|
|
193
|
+
*/
|
|
194
|
+
isLevelEnabled: (level) => {
|
|
195
|
+
return getLogger().isLevelEnabled(level);
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,IAA+B,MAAM,MAAM,CAAC;AAUnD,wBAAwB;AACxB,MAAM,cAAc,GAAiB;IACnC,KAAK,EAAG,OAAO,CAAC,GAAG,CAAC,SAAsB,IAAI,MAAM;IACpD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,MAAM,CAAC;IAC1G,IAAI,EAAE,WAAW;CAClB,CAAC;AAEF,IAAI,aAAa,GAAiB,EAAE,GAAG,cAAc,EAAE,CAAC;AACxD,IAAI,cAAc,GAAkB,IAAI,CAAC;AAEzC;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAoB;IAC/C,MAAM,OAAO,GAAkB;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM;KAC9B,CAAC;IAEF,2DAA2D;IAC3D,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,SAAS,GAAG;YAClB,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,cAAc;gBAC7B,MAAM,EAAE,cAAc;gBACtB,aAAa,EAAE,OAAO;gBACtB,UAAU,EAAE,IAAI;aACjB;SACF,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS;IAChB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACnD,0DAA0D;QAC1D,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,qEAAqE;YACrE,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG;gBAC1B,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO;gBAC5B,WAAW,EAAE,CAAC,EAAE,yBAAyB;aAC1C,CAAC;YACF,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACnD,0DAA0D;IAC1D,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG;YAC1B,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO;YAC5B,WAAW,EAAE,CAAC,EAAE,yBAAyB;SAC1C,CAAC;QACF,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5B,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiC;IACjE,OAAO,SAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;;OAEG;IACH,KAAK,EAAE,CAAC,GAAW,EAAE,GAA6B,EAAE,EAAE;QACpD,IAAI,GAAG,EAAE,CAAC;YACR,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,EAAE,CAAC,GAAW,EAAE,GAA6B,EAAE,EAAE;QACpD,IAAI,GAAG,EAAE,CAAC;YACR,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,EAAE,CAAC,GAAW,EAAE,GAA6B,EAAE,EAAE;QACnD,IAAI,GAAG,EAAE,CAAC;YACR,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,EAAE,CAAC,GAAW,EAAE,GAA6B,EAAE,EAAE;QACnD,IAAI,GAAG,EAAE,CAAC;YACR,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,EAAE,CAAC,GAAW,EAAE,GAA6B,EAAE,EAAE;QACpD,IAAI,GAAG,EAAE,CAAC;YACR,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,EAAE,CAAC,GAAW,EAAE,GAA6B,EAAE,EAAE;QACpD,IAAI,GAAG,EAAE,CAAC;YACR,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,EAAE,CAAC,QAAiC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;IAEzE;;OAEG;IACH,cAAc,EAAE,CAAC,KAAe,EAAW,EAAE;QAC3C,OAAO,SAAS,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|