@ottolab/extraction 0.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.
@@ -0,0 +1,73 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { extractFromCsv } from '../src/llm-extractor.js';
3
+
4
+ describe('extractFromCsv', () => {
5
+ it('should parse simple CSV with standard headers', () => {
6
+ const csv = `Total Cholesterol,LDL,HDL,Triglycerides,HbA1c
7
+ 200,120,55,130,5.4`;
8
+
9
+ const result = extractFromCsv(csv);
10
+ expect(result.total_cholesterol).toBe(200);
11
+ expect(result.ldl_c).toBe(120);
12
+ expect(result.hdl).toBe(55);
13
+ expect(result.triglycerides).toBe(130);
14
+ expect(result.hba1c).toBe(5.4);
15
+ });
16
+
17
+ it('should normalize common header aliases', () => {
18
+ const csv = `LDL-C,HDL-C,A1C,Glucose,SGPT
19
+ 110,58,5.2,92,25`;
20
+
21
+ const result = extractFromCsv(csv);
22
+ expect(result.ldl_c).toBe(110);
23
+ expect(result.hdl).toBe(58);
24
+ expect(result.hba1c).toBe(5.2);
25
+ expect(result.fasting_glucose).toBe(92);
26
+ expect(result.alt).toBe(25);
27
+ });
28
+
29
+ it('should handle empty values', () => {
30
+ const csv = `Total Cholesterol,LDL,HDL
31
+ 200,,55`;
32
+
33
+ const result = extractFromCsv(csv);
34
+ expect(result.total_cholesterol).toBe(200);
35
+ expect(result.hdl).toBe(55);
36
+ expect(result.ldl_c).toBeUndefined();
37
+ });
38
+
39
+ it('should throw on single-line CSV (no data row)', () => {
40
+ expect(() => extractFromCsv('Total Cholesterol,LDL,HDL')).toThrow(
41
+ 'at least a header row and a data row',
42
+ );
43
+ });
44
+
45
+ it('should handle case-insensitive headers', () => {
46
+ const csv = `CREATININE,BUN,eGFR
47
+ 0.9,15,95`;
48
+
49
+ const result = extractFromCsv(csv);
50
+ expect(result.creatinine).toBe(0.9);
51
+ expect(result.bun).toBe(15);
52
+ expect(result.egfr).toBe(95);
53
+ });
54
+
55
+ it('should preserve non-numeric values as strings', () => {
56
+ const csv = `Albumin,Notes
57
+ 4.2,Normal`;
58
+
59
+ const result = extractFromCsv(csv);
60
+ expect(result.albumin).toBe(4.2);
61
+ expect(result.notes).toBe('Normal');
62
+ });
63
+
64
+ it('should handle whitespace in headers and values', () => {
65
+ const csv = ` Total Cholesterol , LDL , HDL
66
+ 200 , 120 , 55 `;
67
+
68
+ const result = extractFromCsv(csv);
69
+ expect(result.total_cholesterol).toBe(200);
70
+ expect(result.ldl_c).toBe(120);
71
+ expect(result.hdl).toBe(55);
72
+ });
73
+ });
@@ -0,0 +1,243 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { validateExtraction, CLINICAL_RANGES, BIOMARKER_MAP } from '../src/validator.js';
3
+ import type { RawBiomarkers } from '../src/llm-extractor.js';
4
+
5
+ describe('CLINICAL_RANGES', () => {
6
+ it('should have ranges for all mapped biomarkers', () => {
7
+ for (const key of Object.keys(BIOMARKER_MAP)) {
8
+ expect(CLINICAL_RANGES[key]).toBeDefined();
9
+ }
10
+ });
11
+
12
+ it('should have low < high for all ranges', () => {
13
+ for (const [key, [low, high]] of Object.entries(CLINICAL_RANGES)) {
14
+ expect(low).toBeLessThan(high);
15
+ expect(low).toBeTypeOf('number');
16
+ expect(high).toBeTypeOf('number');
17
+ // Verify key exists
18
+ expect(key).toBeTruthy();
19
+ }
20
+ });
21
+ });
22
+
23
+ describe('validateExtraction', () => {
24
+ it('should accept valid biomarkers within range', () => {
25
+ const raw: RawBiomarkers = {
26
+ total_cholesterol: 200,
27
+ ldl_c: 120,
28
+ hdl: 55,
29
+ triglycerides: 130,
30
+ hba1c: 5.4,
31
+ fasting_glucose: 95,
32
+ creatinine: 0.9,
33
+ albumin: 4.2,
34
+ };
35
+
36
+ const result = validateExtraction(raw);
37
+ expect(result.accepted).toBe(8);
38
+ expect(result.rejected).toBe(0);
39
+ expect(result.biomarkers.totalCholesterol?.value).toBe(200);
40
+ expect(result.biomarkers.ldlC?.value).toBe(120);
41
+ expect(result.biomarkers.hdl?.value).toBe(55);
42
+ expect(result.biomarkers.albumin?.value).toBe(4.2);
43
+ });
44
+
45
+ it('should reject values outside clinical ranges', () => {
46
+ const raw: RawBiomarkers = {
47
+ total_cholesterol: 9999, // way too high
48
+ hdl: -5, // negative
49
+ hba1c: 5.4, // valid
50
+ };
51
+
52
+ const result = validateExtraction(raw);
53
+ expect(result.accepted).toBe(1); // only hba1c
54
+ expect(result.rejected).toBe(2);
55
+ expect(result.biomarkers.hba1c?.value).toBe(5.4);
56
+ expect(result.biomarkers.totalCholesterol).toBeUndefined();
57
+ expect(result.biomarkers.hdl).toBeUndefined();
58
+ });
59
+
60
+ it('should skip null and undefined values', () => {
61
+ const raw: RawBiomarkers = {
62
+ total_cholesterol: null,
63
+ ldl_c: 100,
64
+ hdl: null,
65
+ };
66
+
67
+ const result = validateExtraction(raw);
68
+ expect(result.accepted).toBe(1);
69
+ expect(result.biomarkers.ldlC?.value).toBe(100);
70
+ });
71
+
72
+ it('should skip string values (qualitative results)', () => {
73
+ const raw: RawBiomarkers = {
74
+ total_cholesterol: 200,
75
+ some_qualitative: 'Negative',
76
+ };
77
+
78
+ const result = validateExtraction(raw);
79
+ expect(result.accepted).toBe(1);
80
+ expect(result.rejected).toBe(0);
81
+ });
82
+
83
+ it('should skip gender field', () => {
84
+ const raw: RawBiomarkers = {
85
+ gender: 'm',
86
+ total_cholesterol: 200,
87
+ };
88
+
89
+ const result = validateExtraction(raw);
90
+ expect(result.accepted).toBe(1);
91
+ });
92
+
93
+ it('should reject non-finite numbers', () => {
94
+ const raw: RawBiomarkers = {
95
+ total_cholesterol: NaN,
96
+ ldl_c: Infinity,
97
+ hdl: 55,
98
+ };
99
+
100
+ const result = validateExtraction(raw);
101
+ expect(result.accepted).toBe(1);
102
+ expect(result.rejected).toBe(2);
103
+ });
104
+
105
+ it('should map to correct BiomarkerSet fields', () => {
106
+ const raw: RawBiomarkers = {
107
+ hs_crp: 1.5,
108
+ vitamin_d: 45,
109
+ lymphocyte_percent: 30,
110
+ bilirubin_total: 0.8,
111
+ };
112
+
113
+ const result = validateExtraction(raw);
114
+ expect(result.biomarkers.hsCrp?.value).toBe(1.5);
115
+ expect(result.biomarkers.hsCrp?.unit).toBe('mg/L');
116
+ expect(result.biomarkers.vitaminD?.value).toBe(45);
117
+ expect(result.biomarkers.lymphocytePercent?.value).toBe(30);
118
+ expect(result.biomarkers.bilirubinTotal?.value).toBe(0.8);
119
+ });
120
+
121
+ it('should include unit and name in BiomarkerValue', () => {
122
+ const raw: RawBiomarkers = { alt: 25 };
123
+ const result = validateExtraction(raw);
124
+ expect(result.biomarkers.alt).toEqual({
125
+ name: 'ALT',
126
+ value: 25,
127
+ unit: 'U/L',
128
+ });
129
+ });
130
+
131
+ it('should record rejections with reasons', () => {
132
+ const raw: RawBiomarkers = {
133
+ total_cholesterol: 9999,
134
+ };
135
+
136
+ const result = validateExtraction(raw);
137
+ expect(result.rejections.length).toBe(1);
138
+ expect(result.rejections[0].key).toBe('total_cholesterol');
139
+ expect(result.rejections[0].reason).toContain('outside clinical range');
140
+ });
141
+
142
+ it('should compute reasonable confidence for good extraction', () => {
143
+ const raw: RawBiomarkers = {
144
+ total_cholesterol: 200,
145
+ ldl_c: 120,
146
+ hdl: 55,
147
+ triglycerides: 130,
148
+ hba1c: 5.4,
149
+ fasting_glucose: 95,
150
+ creatinine: 0.9,
151
+ albumin: 4.2,
152
+ alt: 25,
153
+ ast: 22,
154
+ wbc: 7.0,
155
+ hemoglobin: 14.5,
156
+ platelets: 250,
157
+ mcv: 90,
158
+ rdw: 13,
159
+ };
160
+
161
+ const result = validateExtraction(raw);
162
+ expect(result.confidence).toBeGreaterThan(0.7);
163
+ });
164
+
165
+ it('should return 0 confidence for empty extraction', () => {
166
+ const result = validateExtraction({});
167
+ expect(result.confidence).toBe(0);
168
+ expect(result.accepted).toBe(0);
169
+ });
170
+
171
+ it('should reduce confidence when HDL > total cholesterol', () => {
172
+ const consistent: RawBiomarkers = {
173
+ total_cholesterol: 200,
174
+ hdl: 55,
175
+ ldl_c: 120,
176
+ hba1c: 5.4,
177
+ creatinine: 0.9,
178
+ };
179
+ const inconsistent: RawBiomarkers = {
180
+ total_cholesterol: 100,
181
+ hdl: 150, // impossible: HDL > total
182
+ ldl_c: 120,
183
+ hba1c: 5.4,
184
+ creatinine: 0.9,
185
+ };
186
+
187
+ const c1 = validateExtraction(consistent).confidence;
188
+ // HDL=150 is within range [5,150] so it passes range check but fails consistency
189
+ // However total_cholesterol=100 makes HDL > total
190
+ const c2 = validateExtraction(inconsistent).confidence;
191
+ expect(c2).toBeLessThan(c1);
192
+ });
193
+
194
+ it('should handle all target biomarkers', () => {
195
+ const raw: RawBiomarkers = {
196
+ weight_kg: 75,
197
+ height_cm: 175,
198
+ bmi: 24.5,
199
+ body_fat_percent: 18,
200
+ systolic_bp: 120,
201
+ diastolic_bp: 75,
202
+ heart_rate: 68,
203
+ total_cholesterol: 195,
204
+ ldl_c: 110,
205
+ hdl: 58,
206
+ triglycerides: 120,
207
+ apoB: 85,
208
+ hba1c: 5.3,
209
+ fasting_glucose: 88,
210
+ fasting_insulin: 5.5,
211
+ uric_acid: 5.2,
212
+ creatinine: 0.95,
213
+ bun: 15,
214
+ egfr: 95,
215
+ alt: 22,
216
+ ast: 20,
217
+ alp: 70,
218
+ ggt: 25,
219
+ bilirubin_total: 0.7,
220
+ albumin: 4.3,
221
+ hs_crp: 0.8,
222
+ esr: 8,
223
+ cortisol: 12,
224
+ testosterone: 550,
225
+ estradiol: 25,
226
+ tsh: 1.8,
227
+ wbc: 6.5,
228
+ rbc: 4.8,
229
+ hemoglobin: 14.8,
230
+ hematocrit: 44,
231
+ platelets: 240,
232
+ mcv: 88,
233
+ rdw: 12.8,
234
+ lymphocyte_percent: 32,
235
+ vitamin_d: 48,
236
+ };
237
+
238
+ const result = validateExtraction(raw);
239
+ expect(result.accepted).toBe(40);
240
+ expect(result.rejected).toBe(0);
241
+ expect(result.confidence).toBeGreaterThan(0.8);
242
+ });
243
+ });
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@ottolab/extraction",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "repository": "https://github.com/hokev/Otto",
6
+ "publishConfig": { "access": "public" },
7
+ "type": "module",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "source": "./src/index.ts"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsc --build",
19
+ "lint": "eslint src/",
20
+ "test": "vitest run"
21
+ },
22
+ "dependencies": {
23
+ "@ottolab/shared": "*"
24
+ },
25
+ "devDependencies": {
26
+ "vitest": "^3.0.0"
27
+ }
28
+ }
package/src/index.ts ADDED
@@ -0,0 +1,69 @@
1
+ import type { ExtractionResult, ExtendedLLMProvider } from '@ottolab/shared';
2
+ import { detectLab } from './lab-detector.js';
3
+ import { extractFromPdf, extractFromCsv } from './llm-extractor.js';
4
+ import { validateExtraction } from './validator.js';
5
+
6
+ export interface ParseInput {
7
+ /** Base64-encoded PDF data */
8
+ pdf?: string;
9
+ /** Raw CSV text */
10
+ csv?: string;
11
+ }
12
+
13
+ /**
14
+ * Main extraction pipeline.
15
+ *
16
+ * PDF flow:
17
+ * 1. Lab Detection (LLM classify → Quest | LabCorp | international | unknown)
18
+ * 2. Structured Extraction (LLM multimodal + lab-specific few-shot)
19
+ * 3. Validation (clinical range checks, cross-biomarker consistency, confidence)
20
+ *
21
+ * CSV flow:
22
+ * 1. Column parsing + header normalization
23
+ * 2. Validation
24
+ */
25
+ export async function runExtractionPipeline(
26
+ input: ParseInput,
27
+ provider?: ExtendedLLMProvider,
28
+ ): Promise<ExtractionResult> {
29
+ if (input.pdf) {
30
+ if (!provider) throw new Error('LLM provider required for PDF extraction');
31
+
32
+ // Step 1: Detect lab source
33
+ const detection = await detectLab(input.pdf, provider);
34
+
35
+ // Step 2: Extract biomarkers with lab-specific prompt
36
+ const raw = await extractFromPdf(input.pdf, detection.lab, provider);
37
+
38
+ // Step 3: Validate and transform
39
+ const validation = validateExtraction(raw);
40
+
41
+ return {
42
+ biomarkers: validation.biomarkers,
43
+ sourceLab: detection.lab,
44
+ sourceLanguage: detection.language,
45
+ confidence: validation.confidence,
46
+ };
47
+ }
48
+
49
+ if (input.csv) {
50
+ // CSV extraction (no LLM needed)
51
+ const raw = extractFromCsv(input.csv);
52
+ const validation = validateExtraction(raw);
53
+
54
+ return {
55
+ biomarkers: validation.biomarkers,
56
+ sourceLab: 'unknown',
57
+ sourceLanguage: 'en',
58
+ confidence: validation.confidence,
59
+ };
60
+ }
61
+
62
+ throw new Error('Either pdf (base64) or csv text must be provided');
63
+ }
64
+
65
+ export { detectLab } from './lab-detector.js';
66
+ export { extractFromPdf, extractFromCsv } from './llm-extractor.js';
67
+ export { validateExtraction } from './validator.js';
68
+ export type { RawBiomarkers } from './llm-extractor.js';
69
+ export type { ValidationResult } from './validator.js';
@@ -0,0 +1,60 @@
1
+ import type { SourceLab, ExtendedLLMProvider } from '@ottolab/shared';
2
+ import { LAB_DETECTION_PROMPT } from './prompts/base.js';
3
+
4
+ export interface LabDetectionResult {
5
+ lab: SourceLab;
6
+ language: string;
7
+ confidence: number;
8
+ }
9
+
10
+ /**
11
+ * Detect the source laboratory from a PDF using LLM classification.
12
+ * Sends the first page(s) to the LLM to identify Quest, LabCorp, etc.
13
+ */
14
+ export async function detectLab(
15
+ pdfBase64: string,
16
+ provider: ExtendedLLMProvider,
17
+ ): Promise<LabDetectionResult> {
18
+ try {
19
+ const response = await provider.chatMultimodal(
20
+ [
21
+ { type: 'document', data: pdfBase64, mimeType: 'application/pdf' },
22
+ { type: 'text', text: LAB_DETECTION_PROMPT },
23
+ ],
24
+ { temperature: 0, maxTokens: 256, responseFormat: 'json' },
25
+ );
26
+
27
+ const parsed = parseJsonResponse<LabDetectionResult>(response);
28
+
29
+ // Validate lab value
30
+ const validLabs: SourceLab[] = ['quest', 'labcorp', 'international', 'unknown'];
31
+ if (!validLabs.includes(parsed.lab)) {
32
+ parsed.lab = 'unknown';
33
+ }
34
+
35
+ return {
36
+ lab: parsed.lab,
37
+ language: parsed.language || 'en',
38
+ confidence: Math.min(Math.max(parsed.confidence || 0, 0), 1),
39
+ };
40
+ } catch {
41
+ return { lab: 'unknown', language: 'en', confidence: 0 };
42
+ }
43
+ }
44
+
45
+ function parseJsonResponse<T>(text: string): T {
46
+ // Strip markdown code fences if present
47
+ let cleaned = text.trim();
48
+ if (cleaned.startsWith('```')) {
49
+ cleaned = cleaned.replace(/^```(?:json)?\s*/, '').replace(/\s*```$/, '');
50
+ }
51
+
52
+ // Find JSON object boundaries
53
+ const start = cleaned.indexOf('{');
54
+ const end = cleaned.lastIndexOf('}');
55
+ if (start === -1 || end === -1) {
56
+ throw new Error('No JSON object found in response');
57
+ }
58
+
59
+ return JSON.parse(cleaned.slice(start, end + 1)) as T;
60
+ }
@@ -0,0 +1,157 @@
1
+ import type { SourceLab, ExtendedLLMProvider } from '@ottolab/shared';
2
+ import { BASE_EXTRACTION_PROMPT } from './prompts/base.js';
3
+ import { QUEST_EXTRACTION_PROMPT } from './prompts/quest.js';
4
+ import { LABCORP_EXTRACTION_PROMPT } from './prompts/labcorp.js';
5
+
6
+ /** Raw extraction output — flat key/value from LLM. */
7
+ export type RawBiomarkers = Record<string, number | string | null>;
8
+
9
+ /**
10
+ * Select the appropriate extraction prompt based on detected lab.
11
+ */
12
+ function getPromptForLab(lab: SourceLab): string {
13
+ switch (lab) {
14
+ case 'quest':
15
+ return QUEST_EXTRACTION_PROMPT;
16
+ case 'labcorp':
17
+ return LABCORP_EXTRACTION_PROMPT;
18
+ default:
19
+ return BASE_EXTRACTION_PROMPT;
20
+ }
21
+ }
22
+
23
+ /**
24
+ * Extract biomarkers from a PDF using multimodal LLM.
25
+ *
26
+ * Sends the full PDF as base64 inline data with a lab-specific prompt.
27
+ * Returns raw key/value pairs (not yet validated or normalized).
28
+ */
29
+ export async function extractFromPdf(
30
+ pdfBase64: string,
31
+ lab: SourceLab,
32
+ provider: ExtendedLLMProvider,
33
+ ): Promise<RawBiomarkers> {
34
+ const prompt = getPromptForLab(lab);
35
+
36
+ const response = await provider.chatMultimodal(
37
+ [
38
+ { type: 'document', data: pdfBase64, mimeType: 'application/pdf' },
39
+ { type: 'text', text: prompt },
40
+ ],
41
+ { temperature: 0, maxTokens: 4096, responseFormat: 'json' },
42
+ );
43
+
44
+ return parseExtractionResponse(response);
45
+ }
46
+
47
+ /**
48
+ * Extract biomarkers from CSV text.
49
+ *
50
+ * Expects a simple CSV with header row containing biomarker names
51
+ * and a single data row with values.
52
+ */
53
+ export function extractFromCsv(csvText: string): RawBiomarkers {
54
+ const lines = csvText.trim().split('\n');
55
+ if (lines.length < 2) {
56
+ throw new Error('CSV must have at least a header row and a data row');
57
+ }
58
+
59
+ const headers = lines[0].split(',').map((h) => h.trim().toLowerCase());
60
+ const values = lines[1].split(',').map((v) => v.trim());
61
+
62
+ const result: RawBiomarkers = {};
63
+ for (let i = 0; i < headers.length; i++) {
64
+ const key = normalizeHeaderName(headers[i]);
65
+ const raw = values[i];
66
+ if (!key || !raw || raw === '') continue;
67
+
68
+ const num = parseFloat(raw);
69
+ result[key] = Number.isNaN(num) ? raw : num;
70
+ }
71
+
72
+ return result;
73
+ }
74
+
75
+ /**
76
+ * Normalize CSV header names to our canonical biomarker keys.
77
+ */
78
+ function normalizeHeaderName(header: string): string {
79
+ const mappings: Record<string, string> = {
80
+ 'total cholesterol': 'total_cholesterol',
81
+ cholesterol: 'total_cholesterol',
82
+ 'ldl-c': 'ldl_c',
83
+ ldl: 'ldl_c',
84
+ 'hdl-c': 'hdl',
85
+ hdl: 'hdl',
86
+ triglycerides: 'triglycerides',
87
+ tg: 'triglycerides',
88
+ hba1c: 'hba1c',
89
+ a1c: 'hba1c',
90
+ glucose: 'fasting_glucose',
91
+ 'fasting glucose': 'fasting_glucose',
92
+ insulin: 'fasting_insulin',
93
+ 'fasting insulin': 'fasting_insulin',
94
+ 'uric acid': 'uric_acid',
95
+ creatinine: 'creatinine',
96
+ bun: 'bun',
97
+ egfr: 'egfr',
98
+ alt: 'alt',
99
+ sgpt: 'alt',
100
+ ast: 'ast',
101
+ sgot: 'ast',
102
+ alp: 'alp',
103
+ ggt: 'ggt',
104
+ bilirubin: 'bilirubin_total',
105
+ albumin: 'albumin',
106
+ 'hs-crp': 'hs_crp',
107
+ crp: 'hs_crp',
108
+ esr: 'esr',
109
+ cortisol: 'cortisol',
110
+ testosterone: 'testosterone',
111
+ estradiol: 'estradiol',
112
+ tsh: 'tsh',
113
+ wbc: 'wbc',
114
+ rbc: 'rbc',
115
+ hemoglobin: 'hemoglobin',
116
+ hgb: 'hemoglobin',
117
+ hematocrit: 'hematocrit',
118
+ hct: 'hematocrit',
119
+ platelets: 'platelets',
120
+ plt: 'platelets',
121
+ mcv: 'mcv',
122
+ rdw: 'rdw',
123
+ 'lymphocyte %': 'lymphocyte_percent',
124
+ lymphocytes: 'lymphocyte_percent',
125
+ 'vitamin d': 'vitamin_d',
126
+ '25-oh vitamin d': 'vitamin_d',
127
+ weight: 'weight_kg',
128
+ height: 'height_cm',
129
+ bmi: 'bmi',
130
+ 'body fat': 'body_fat_percent',
131
+ 'systolic bp': 'systolic_bp',
132
+ 'diastolic bp': 'diastolic_bp',
133
+ 'heart rate': 'heart_rate',
134
+ apob: 'apoB',
135
+ 'apo b': 'apoB',
136
+ };
137
+
138
+ return mappings[header] ?? header.replace(/[\s-]+/g, '_').toLowerCase();
139
+ }
140
+
141
+ function parseExtractionResponse(text: string): RawBiomarkers {
142
+ let cleaned = text.trim();
143
+
144
+ // Strip markdown code fences
145
+ if (cleaned.startsWith('```')) {
146
+ cleaned = cleaned.replace(/^```(?:json)?\s*/, '').replace(/\s*```$/, '');
147
+ }
148
+
149
+ // Find JSON object
150
+ const start = cleaned.indexOf('{');
151
+ const end = cleaned.lastIndexOf('}');
152
+ if (start === -1 || end === -1) {
153
+ throw new Error('No JSON object found in LLM extraction response');
154
+ }
155
+
156
+ return JSON.parse(cleaned.slice(start, end + 1)) as RawBiomarkers;
157
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Base extraction prompt — universal lab report parser.
3
+ *
4
+ * Used when lab source is unknown or for international labs.
5
+ * Instructs the LLM to extract structured biomarkers from any lab PDF.
6
+ */
7
+ export const BASE_EXTRACTION_PROMPT = `You are a clinical laboratory data extraction system. Extract ALL biomarker values from this lab report into a structured JSON object.
8
+
9
+ ## Output Format
10
+
11
+ Return ONLY a raw JSON object (no markdown, no explanation, no code fences). The JSON must have this exact structure:
12
+
13
+ {
14
+ "gender": "m" or "f" or null,
15
+ "weight_kg": <number or null>,
16
+ "height_cm": <number or null>,
17
+ "bmi": <number or null>,
18
+ "body_fat_percent": <number or null>,
19
+ "systolic_bp": <number or null>,
20
+ "diastolic_bp": <number or null>,
21
+ "heart_rate": <number or null>,
22
+ "total_cholesterol": <mg/dL>,
23
+ "ldl_c": <mg/dL>,
24
+ "hdl": <mg/dL>,
25
+ "triglycerides": <mg/dL>,
26
+ "apoB": <mg/dL>,
27
+ "hba1c": <%>,
28
+ "fasting_glucose": <mg/dL>,
29
+ "fasting_insulin": <uIU/mL>,
30
+ "uric_acid": <mg/dL>,
31
+ "creatinine": <mg/dL>,
32
+ "bun": <mg/dL>,
33
+ "egfr": <mL/min/1.73m2>,
34
+ "alt": <U/L>,
35
+ "ast": <U/L>,
36
+ "alp": <U/L>,
37
+ "ggt": <U/L>,
38
+ "bilirubin_total": <mg/dL>,
39
+ "albumin": <g/dL>,
40
+ "hs_crp": <mg/L>,
41
+ "esr": <mm/hr>,
42
+ "cortisol": <ug/dL>,
43
+ "testosterone": <ng/dL>,
44
+ "estradiol": <pg/mL>,
45
+ "tsh": <mIU/L>,
46
+ "wbc": <10^3/uL>,
47
+ "rbc": <10^6/uL>,
48
+ "hemoglobin": <g/dL>,
49
+ "hematocrit": <%>,
50
+ "platelets": <10^3/uL>,
51
+ "mcv": <fL>,
52
+ "rdw": <%>,
53
+ "lymphocyte_percent": <%>,
54
+ "vitamin_d": <ng/mL>
55
+ }
56
+
57
+ ## Critical Instructions
58
+
59
+ 1. Read EVERY page of the report. Parse ALL table rows, not just the first page.
60
+ 2. Use null for any value not found in the report.
61
+ 3. The report may be bilingual (e.g., Chinese/English, Spanish/English). Parse BOTH languages.
62
+ 4. For reference ranges, DO NOT include them in the output — only extract actual values.
63
+
64
+ ## Unit Conversions — apply these BEFORE outputting:
65
+
66
+ - Cholesterol (Total, LDL, HDL): if mmol/L → multiply by 38.67 to get mg/dL
67
+ - Triglycerides: if mmol/L → multiply by 88.57 to get mg/dL
68
+ - Glucose: if mmol/L → multiply by 18.016 to get mg/dL
69
+ - Creatinine: if µmol/L → divide by 88.4 to get mg/dL
70
+ - Uric Acid: if µmol/L → divide by 59.48 to get mg/dL
71
+ - Albumin: if g/L → divide by 10 to get g/dL
72
+ - BUN: if mmol/L → multiply by 2.801 to get mg/dL
73
+ - hs-CRP: if mg/dL → multiply by 10 to get mg/L
74
+ - Bilirubin: if µmol/L → divide by 17.1 to get mg/dL
75
+ - Hemoglobin: if g/L → divide by 10 to get g/dL
76
+ - Vitamin D: if nmol/L → divide by 2.496 to get ng/mL
77
+
78
+ Return ONLY the JSON object.`;
79
+
80
+ /**
81
+ * Lab detection prompt — classify the source laboratory.
82
+ */
83
+ export const LAB_DETECTION_PROMPT = `Analyze this lab report and classify its source. Return ONLY a JSON object:
84
+
85
+ {
86
+ "lab": "quest" | "labcorp" | "international" | "unknown",
87
+ "language": "<ISO 639-1 code, e.g., en, zh, es>",
88
+ "confidence": <0.0 to 1.0>
89
+ }
90
+
91
+ Classification rules:
92
+ - "quest": Quest Diagnostics reports — look for Quest logo, "Quest Diagnostics", QuestAssureD
93
+ - "labcorp": LabCorp reports — look for LabCorp logo, "Laboratory Corporation of America"
94
+ - "international": Non-US labs, reports in languages other than English, SI units throughout
95
+ - "unknown": Cannot determine with confidence
96
+
97
+ Return ONLY the JSON object.`;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * LabCorp-specific extraction prompt.
3
+ *
4
+ * LabCorp reports:
5
+ * - Dense tabular format, sometimes multi-column
6
+ * - Results in US conventional units
7
+ * - Flag column: H, L, *, or blank for normal
8
+ * - Often includes calculated values (LDL calc, eGFR, HOMA-IR)
9
+ * - NMR LipoProfile may have particle numbers (not standard lipid panel)
10
+ */
11
+ export const LABCORP_EXTRACTION_PROMPT = `You are a clinical laboratory data extraction system specialized in LabCorp reports.
12
+
13
+ ## LabCorp Report Format Notes
14
+ - Results are in US conventional units (mg/dL, g/dL, U/L) — use values as-is
15
+ - Dense tabular layout, sometimes multi-column per page
16
+ - Flags: H = high, L = low, * = critical
17
+ - May include NMR LipoProfile — extract standard lipid values, not particle counts
18
+ - eGFR and calculated LDL are often included as separate line items
19
+ - CBC may show both relative (%) and absolute counts
20
+
21
+ ## Output Format
22
+
23
+ Return ONLY a raw JSON object (no markdown, no code fences):
24
+
25
+ {
26
+ "gender": "m" or "f" or null,
27
+ "weight_kg": <number or null>,
28
+ "height_cm": <number or null>,
29
+ "bmi": <number or null>,
30
+ "total_cholesterol": <mg/dL>,
31
+ "ldl_c": <mg/dL>,
32
+ "hdl": <mg/dL>,
33
+ "triglycerides": <mg/dL>,
34
+ "apoB": <mg/dL>,
35
+ "hba1c": <%>,
36
+ "fasting_glucose": <mg/dL>,
37
+ "fasting_insulin": <uIU/mL>,
38
+ "uric_acid": <mg/dL>,
39
+ "creatinine": <mg/dL>,
40
+ "bun": <mg/dL>,
41
+ "egfr": <mL/min/1.73m2>,
42
+ "alt": <U/L>,
43
+ "ast": <U/L>,
44
+ "alp": <U/L>,
45
+ "ggt": <U/L>,
46
+ "bilirubin_total": <mg/dL>,
47
+ "albumin": <g/dL>,
48
+ "hs_crp": <mg/L>,
49
+ "esr": <mm/hr>,
50
+ "cortisol": <ug/dL>,
51
+ "testosterone": <ng/dL>,
52
+ "estradiol": <pg/mL>,
53
+ "tsh": <mIU/L>,
54
+ "wbc": <10^3/uL>,
55
+ "rbc": <10^6/uL>,
56
+ "hemoglobin": <g/dL>,
57
+ "hematocrit": <%>,
58
+ "platelets": <10^3/uL>,
59
+ "mcv": <fL>,
60
+ "rdw": <%>,
61
+ "lymphocyte_percent": <%>,
62
+ "vitamin_d": <ng/mL>
63
+ }
64
+
65
+ Read EVERY page. Use null for values not found. Return ONLY the JSON.`;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Quest Diagnostics-specific extraction prompt.
3
+ *
4
+ * Quest reports have a distinctive format:
5
+ * - Tabular layout with Test Name | Result | Flag | Reference Range
6
+ * - Results in US conventional units (mg/dL, g/dL, U/L)
7
+ * - Flags: H (high), L (low), * (critical)
8
+ * - Multi-page with patient demographics on page 1
9
+ */
10
+ export const QUEST_EXTRACTION_PROMPT = `You are a clinical laboratory data extraction system specialized in Quest Diagnostics reports.
11
+
12
+ ## Quest Report Format Notes
13
+ - Results are in US conventional units (mg/dL, g/dL, U/L) — use values as-is
14
+ - Table columns: Test Name | Result | Flag | Reference Range
15
+ - Flags: H = high, L = low, * = critical, A = abnormal
16
+ - CBC differential may show both absolute counts and percentages
17
+ - eGFR is often calculated and shown separately
18
+
19
+ ## Output Format
20
+
21
+ Return ONLY a raw JSON object (no markdown, no code fences):
22
+
23
+ {
24
+ "gender": "m" or "f" or null,
25
+ "weight_kg": <number or null>,
26
+ "height_cm": <number or null>,
27
+ "bmi": <number or null>,
28
+ "total_cholesterol": <mg/dL>,
29
+ "ldl_c": <mg/dL>,
30
+ "hdl": <mg/dL>,
31
+ "triglycerides": <mg/dL>,
32
+ "apoB": <mg/dL>,
33
+ "hba1c": <%>,
34
+ "fasting_glucose": <mg/dL>,
35
+ "fasting_insulin": <uIU/mL>,
36
+ "uric_acid": <mg/dL>,
37
+ "creatinine": <mg/dL>,
38
+ "bun": <mg/dL>,
39
+ "egfr": <mL/min/1.73m2>,
40
+ "alt": <U/L>,
41
+ "ast": <U/L>,
42
+ "alp": <U/L>,
43
+ "ggt": <U/L>,
44
+ "bilirubin_total": <mg/dL>,
45
+ "albumin": <g/dL>,
46
+ "hs_crp": <mg/L>,
47
+ "esr": <mm/hr>,
48
+ "cortisol": <ug/dL>,
49
+ "testosterone": <ng/dL>,
50
+ "estradiol": <pg/mL>,
51
+ "tsh": <mIU/L>,
52
+ "wbc": <10^3/uL>,
53
+ "rbc": <10^6/uL>,
54
+ "hemoglobin": <g/dL>,
55
+ "hematocrit": <%>,
56
+ "platelets": <10^3/uL>,
57
+ "mcv": <fL>,
58
+ "rdw": <%>,
59
+ "lymphocyte_percent": <%>,
60
+ "vitamin_d": <ng/mL>
61
+ }
62
+
63
+ Read EVERY page. Use null for values not found. Return ONLY the JSON.`;
@@ -0,0 +1,218 @@
1
+ import type { BiomarkerValue, BiomarkerSet } from '@ottolab/shared';
2
+ import type { RawBiomarkers } from './llm-extractor.js';
3
+
4
+ /**
5
+ * Clinical ranges for validation — generous bounds to avoid false rejections.
6
+ * Values outside these ranges are likely extraction errors.
7
+ */
8
+ const CLINICAL_RANGES: Record<string, [number, number]> = {
9
+ weight_kg: [20, 300],
10
+ height_cm: [100, 250],
11
+ bmi: [10, 60],
12
+ body_fat_percent: [2, 60],
13
+ systolic_bp: [60, 250],
14
+ diastolic_bp: [30, 150],
15
+ heart_rate: [30, 220],
16
+ total_cholesterol: [50, 500],
17
+ ldl_c: [10, 400],
18
+ hdl: [5, 150],
19
+ triglycerides: [10, 2000],
20
+ apoB: [10, 300],
21
+ hba1c: [3, 15],
22
+ fasting_glucose: [30, 500],
23
+ fasting_insulin: [0.5, 300],
24
+ uric_acid: [0.5, 20],
25
+ creatinine: [0.1, 15],
26
+ bun: [2, 100],
27
+ egfr: [5, 150],
28
+ alt: [1, 2000],
29
+ ast: [1, 2000],
30
+ alp: [10, 1000],
31
+ ggt: [1, 2000],
32
+ bilirubin_total: [0.05, 30],
33
+ albumin: [1, 6],
34
+ hs_crp: [0.01, 300],
35
+ esr: [0, 140],
36
+ cortisol: [0.5, 60],
37
+ testosterone: [1, 2000],
38
+ estradiol: [1, 5000],
39
+ tsh: [0.01, 100],
40
+ wbc: [1, 50],
41
+ rbc: [1, 10],
42
+ hemoglobin: [3, 25],
43
+ hematocrit: [15, 65],
44
+ platelets: [10, 1000],
45
+ mcv: [50, 130],
46
+ rdw: [9, 25],
47
+ lymphocyte_percent: [2, 70],
48
+ vitamin_d: [3, 200],
49
+ };
50
+
51
+ /**
52
+ * Map from raw extraction keys to BiomarkerSet field names and display metadata.
53
+ */
54
+ const BIOMARKER_MAP: Record<string, { field: keyof BiomarkerSet; name: string; unit: string }> = {
55
+ weight_kg: { field: 'weight', name: 'Weight', unit: 'kg' },
56
+ height_cm: { field: 'height', name: 'Height', unit: 'cm' },
57
+ bmi: { field: 'bmi', name: 'BMI', unit: 'kg/m2' },
58
+ body_fat_percent: { field: 'bodyFatPercent', name: 'Body Fat', unit: '%' },
59
+ systolic_bp: { field: 'bloodPressureSystolic', name: 'Systolic BP', unit: 'mmHg' },
60
+ diastolic_bp: { field: 'bloodPressureDiastolic', name: 'Diastolic BP', unit: 'mmHg' },
61
+ heart_rate: { field: 'heartRate', name: 'Heart Rate', unit: 'bpm' },
62
+ total_cholesterol: { field: 'totalCholesterol', name: 'Total Cholesterol', unit: 'mg/dL' },
63
+ ldl_c: { field: 'ldlC', name: 'LDL-C', unit: 'mg/dL' },
64
+ hdl: { field: 'hdl', name: 'HDL', unit: 'mg/dL' },
65
+ triglycerides: { field: 'triglycerides', name: 'Triglycerides', unit: 'mg/dL' },
66
+ apoB: { field: 'apoB', name: 'ApoB', unit: 'mg/dL' },
67
+ hba1c: { field: 'hba1c', name: 'HbA1c', unit: '%' },
68
+ fasting_glucose: { field: 'fastingGlucose', name: 'Fasting Glucose', unit: 'mg/dL' },
69
+ fasting_insulin: { field: 'fastingInsulin', name: 'Fasting Insulin', unit: 'uIU/mL' },
70
+ uric_acid: { field: 'uricAcid', name: 'Uric Acid', unit: 'mg/dL' },
71
+ creatinine: { field: 'creatinine', name: 'Creatinine', unit: 'mg/dL' },
72
+ bun: { field: 'bun', name: 'BUN', unit: 'mg/dL' },
73
+ egfr: { field: 'egfr', name: 'eGFR', unit: 'mL/min/1.73m2' },
74
+ alt: { field: 'alt', name: 'ALT', unit: 'U/L' },
75
+ ast: { field: 'ast', name: 'AST', unit: 'U/L' },
76
+ alp: { field: 'alp', name: 'ALP', unit: 'U/L' },
77
+ ggt: { field: 'ggt', name: 'GGT', unit: 'U/L' },
78
+ bilirubin_total: { field: 'bilirubinTotal', name: 'Bilirubin (Total)', unit: 'mg/dL' },
79
+ albumin: { field: 'albumin', name: 'Albumin', unit: 'g/dL' },
80
+ hs_crp: { field: 'hsCrp', name: 'hs-CRP', unit: 'mg/L' },
81
+ esr: { field: 'esr', name: 'ESR', unit: 'mm/hr' },
82
+ cortisol: { field: 'cortisol', name: 'Cortisol', unit: 'ug/dL' },
83
+ testosterone: { field: 'testosterone', name: 'Testosterone', unit: 'ng/dL' },
84
+ estradiol: { field: 'estradiol', name: 'Estradiol', unit: 'pg/mL' },
85
+ tsh: { field: 'tsh', name: 'TSH', unit: 'mIU/L' },
86
+ wbc: { field: 'wbc', name: 'WBC', unit: '10^3/uL' },
87
+ rbc: { field: 'rbc', name: 'RBC', unit: '10^6/uL' },
88
+ hemoglobin: { field: 'hemoglobin', name: 'Hemoglobin', unit: 'g/dL' },
89
+ hematocrit: { field: 'hematocrit', name: 'Hematocrit', unit: '%' },
90
+ platelets: { field: 'platelets', name: 'Platelets', unit: '10^3/uL' },
91
+ mcv: { field: 'mcv', name: 'MCV', unit: 'fL' },
92
+ rdw: { field: 'rdw', name: 'RDW', unit: '%' },
93
+ lymphocyte_percent: { field: 'lymphocytePercent', name: 'Lymphocyte %', unit: '%' },
94
+ vitamin_d: { field: 'vitaminD', name: 'Vitamin D', unit: 'ng/mL' },
95
+ };
96
+
97
+ export interface ValidationResult {
98
+ biomarkers: BiomarkerSet;
99
+ accepted: number;
100
+ rejected: number;
101
+ confidence: number;
102
+ rejections: { key: string; value: unknown; reason: string }[];
103
+ }
104
+
105
+ /**
106
+ * Validate and transform raw LLM extraction output to typed BiomarkerSet.
107
+ *
108
+ * Steps:
109
+ * 1. Filter nulls/undefined
110
+ * 2. Type-check numeric values
111
+ * 3. Range-check against generous clinical bounds
112
+ * 4. Map to BiomarkerSet fields
113
+ * 5. Compute extraction confidence score
114
+ */
115
+ export function validateExtraction(raw: RawBiomarkers): ValidationResult {
116
+ const biomarkers: BiomarkerSet = {};
117
+ const rejections: { key: string; value: unknown; reason: string }[] = [];
118
+ let accepted = 0;
119
+ let rejected = 0;
120
+
121
+ for (const [key, value] of Object.entries(raw)) {
122
+ // Skip gender and non-biomarker fields
123
+ if (key === 'gender') continue;
124
+
125
+ // Skip null/undefined
126
+ if (value === null || value === undefined) continue;
127
+
128
+ // Skip string values (qualitative results like "Negative")
129
+ if (typeof value === 'string') continue;
130
+
131
+ // Must be a number at this point
132
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
133
+ rejections.push({ key, value, reason: 'not a finite number' });
134
+ rejected++;
135
+ continue;
136
+ }
137
+
138
+ // Check clinical ranges
139
+ const range = CLINICAL_RANGES[key];
140
+ if (range && (value < range[0] || value > range[1])) {
141
+ rejections.push({
142
+ key,
143
+ value,
144
+ reason: `outside clinical range [${range[0]}, ${range[1]}]`,
145
+ });
146
+ rejected++;
147
+ continue;
148
+ }
149
+
150
+ // Map to BiomarkerSet
151
+ const mapping = BIOMARKER_MAP[key];
152
+ if (!mapping) continue; // skip unknown keys
153
+
154
+ const biomarkerValue: BiomarkerValue = {
155
+ name: mapping.name,
156
+ value,
157
+ unit: mapping.unit,
158
+ };
159
+
160
+ (biomarkers as Record<string, BiomarkerValue>)[mapping.field] = biomarkerValue;
161
+ accepted++;
162
+ }
163
+
164
+ // Confidence based on yield ratio and cross-checks
165
+ const confidence = computeConfidence(biomarkers, accepted, rejected);
166
+
167
+ return { biomarkers, accepted, rejected, confidence, rejections };
168
+ }
169
+
170
+ /**
171
+ * Compute extraction confidence score (0-1).
172
+ *
173
+ * Factors:
174
+ * - Yield: how many biomarkers were successfully extracted
175
+ * - Rejection rate: high rejections lower confidence
176
+ * - Cross-biomarker consistency checks
177
+ */
178
+ function computeConfidence(biomarkers: BiomarkerSet, accepted: number, rejected: number): number {
179
+ if (accepted === 0) return 0;
180
+
181
+ // Base confidence from yield (diminishing returns above 15 markers)
182
+ const yieldScore = Math.min(accepted / 15, 1.0);
183
+
184
+ // Penalty for rejections
185
+ const total = accepted + rejected;
186
+ const rejectionPenalty = total > 0 ? rejected / total : 0;
187
+
188
+ // Cross-biomarker consistency checks
189
+ let consistencyScore = 1.0;
190
+
191
+ // Check: if both ALT and AST exist, AST should generally be ≤ 2×ALT in healthy
192
+ if (biomarkers.alt && biomarkers.ast) {
193
+ if (biomarkers.ast.value > biomarkers.alt.value * 5) {
194
+ consistencyScore -= 0.1;
195
+ }
196
+ }
197
+
198
+ // Check: HDL should be less than total cholesterol
199
+ if (biomarkers.hdl && biomarkers.totalCholesterol) {
200
+ if (biomarkers.hdl.value > biomarkers.totalCholesterol.value) {
201
+ consistencyScore -= 0.15;
202
+ }
203
+ }
204
+
205
+ // Check: LDL should be less than total cholesterol
206
+ if (biomarkers.ldlC && biomarkers.totalCholesterol) {
207
+ if (biomarkers.ldlC.value > biomarkers.totalCholesterol.value) {
208
+ consistencyScore -= 0.15;
209
+ }
210
+ }
211
+
212
+ const raw =
213
+ yieldScore * 0.5 + (1 - rejectionPenalty) * 0.25 + Math.max(consistencyScore, 0) * 0.25;
214
+ return Math.round(Math.min(Math.max(raw, 0), 1) * 100) / 100;
215
+ }
216
+
217
+ // Export for testing
218
+ export { CLINICAL_RANGES, BIOMARKER_MAP };
package/tsconfig.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "composite": true,
5
+ "outDir": "dist",
6
+ "rootDir": "src"
7
+ },
8
+ "include": ["src"],
9
+ "references": [{ "path": "../shared" }]
10
+ }
@@ -0,0 +1 @@
1
+ {"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/typescript/lib/lib.es2022.full.d.ts","../shared/dist/types/user.d.ts","../shared/dist/types/biomarkers.d.ts","../shared/dist/types/lab-report.d.ts","../shared/dist/types/recommendation.d.ts","../shared/dist/types/simulation.d.ts","../shared/dist/types/messaging.d.ts","../shared/dist/types/llm.d.ts","../shared/dist/constants/unit-conversions.d.ts","../shared/dist/constants/biomarker-ranges.d.ts","../shared/dist/constants/drug-data.d.ts","../shared/dist/index.d.ts","./src/prompts/base.ts","./src/lab-detector.ts","./src/prompts/quest.ts","./src/prompts/labcorp.ts","./src/llm-extractor.ts","./src/validator.ts","./src/index.ts","../../node_modules/@types/deep-eql/index.d.ts","../../node_modules/assertion-error/index.d.ts","../../node_modules/@types/chai/index.d.ts","../../node_modules/@types/d3-array/index.d.ts","../../node_modules/@types/d3-color/index.d.ts","../../node_modules/@types/d3-ease/index.d.ts","../../node_modules/@types/d3-interpolate/index.d.ts","../../node_modules/@types/d3-path/index.d.ts","../../node_modules/@types/d3-time/index.d.ts","../../node_modules/@types/d3-scale/index.d.ts","../../node_modules/@types/d3-shape/index.d.ts","../../node_modules/@types/d3-timer/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/blob.d.ts","../../node_modules/@types/node/web-globals/console.d.ts","../../node_modules/@types/node/web-globals/crypto.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/encoding.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/utility.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client-stats.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/round-robin-pool.d.ts","../../node_modules/undici-types/h2c-client.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-call-history.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/snapshot-agent.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/importmeta.d.ts","../../node_modules/@types/node/web-globals/messaging.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/performance.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/@types/node/web-globals/timers.d.ts","../../node_modules/@types/node/web-globals/url.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/inspector/promises.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/path/posix.d.ts","../../node_modules/@types/node/path/win32.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/quic.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/test/reporters.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/util/types.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/use-sync-external-store/index.d.ts"],"fileIdsList":[[84,85,100,163,171,175,178,180,181,182,194],[100,163,171,175,178,180,181,182,194],[88,100,163,171,175,178,180,181,182,194],[92,100,163,171,175,178,180,181,182,194],[91,100,163,171,175,178,180,181,182,194],[100,160,161,163,171,175,178,180,181,182,194],[100,162,163,171,175,178,180,181,182,194],[163,171,175,178,180,181,182,194],[100,163,171,175,178,180,181,182,194,202],[100,163,164,169,171,174,175,178,180,181,182,184,194,199,211],[100,163,164,165,171,174,175,178,180,181,182,194],[100,163,166,171,175,178,180,181,182,194,212],[100,163,167,168,171,175,178,180,181,182,185,194],[100,163,168,171,175,178,180,181,182,194,199,208],[100,163,169,171,174,175,178,180,181,182,184,194],[100,162,163,170,171,175,178,180,181,182,194],[100,163,171,172,175,178,180,181,182,194],[100,163,171,173,174,175,178,180,181,182,194],[100,162,163,171,174,175,178,180,181,182,194],[100,163,171,174,175,176,178,180,181,182,194,199,211],[100,163,171,174,175,176,178,180,181,182,194,199,202],[100,150,163,171,174,175,177,178,180,181,182,184,194,199,211],[100,163,171,174,175,177,178,180,181,182,184,194,199,208,211],[100,163,171,175,177,178,179,180,181,182,194,199,208,211],[98,99,100,101,102,103,104,105,106,107,108,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218],[100,163,171,174,175,178,180,181,182,194],[100,163,171,175,178,180,182,194],[100,163,171,175,178,180,181,182,183,194,211],[100,163,171,174,175,178,180,181,182,184,194,199],[100,163,171,175,178,180,181,182,185,194],[100,163,171,175,178,180,181,182,186,194],[100,163,171,174,175,178,180,181,182,189,194],[100,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218],[100,163,171,175,178,180,181,182,191,194],[100,163,171,175,178,180,181,182,192,194],[100,163,168,171,175,178,180,181,182,184,194,202],[100,163,171,174,175,178,180,181,182,194,195],[100,163,171,175,178,180,181,182,194,196,212,215],[100,163,171,174,175,178,180,181,182,194,199,201,202],[100,163,171,175,178,180,181,182,194,200,202],[100,163,171,175,178,180,181,182,194,202,212],[100,163,171,175,178,180,181,182,194,203],[100,160,163,171,175,178,180,181,182,194,199,205,211],[100,163,171,175,178,180,181,182,194,199,204],[100,163,171,174,175,178,180,181,182,194,206,207],[100,163,171,175,178,180,181,182,194,206,207],[100,163,168,171,175,178,180,181,182,184,194,199,208],[100,163,171,175,178,180,181,182,194,209],[100,163,171,175,178,180,181,182,184,194,210],[100,163,171,175,177,178,180,181,182,192,194,211],[100,163,171,175,178,180,181,182,194,212,213],[100,163,168,171,175,178,180,181,182,194,213],[100,163,171,175,178,180,181,182,194,199,214],[100,163,171,175,178,180,181,182,183,194,215],[100,163,171,175,178,180,181,182,194,216],[100,163,166,171,175,178,180,181,182,194],[100,163,168,171,175,178,180,181,182,194],[100,163,171,175,178,180,181,182,194,212],[100,150,163,171,175,178,180,181,182,194],[100,163,171,175,178,180,181,182,194,211],[100,163,171,175,178,180,181,182,194,217],[100,163,171,175,178,180,181,182,189,194],[100,163,171,175,178,180,181,182,194,207],[100,150,163,171,174,175,176,178,180,181,182,189,194,199,202,211,214,215,217],[100,163,171,175,178,180,181,182,194,199,218],[100,163,171,175,178,180,181,182,194,222],[100,163,171,175,178,180,181,182,194,220,221],[100,115,118,121,122,163,171,175,178,180,181,182,194,211],[100,118,163,171,175,178,180,181,182,194,199,211],[100,118,122,163,171,175,178,180,181,182,194,211],[100,163,171,175,178,180,181,182,194,199],[100,112,163,171,175,178,180,181,182,194],[100,116,163,171,175,178,180,181,182,194],[100,114,115,118,163,171,175,178,180,181,182,194,211],[100,163,171,175,178,180,181,182,184,194,208],[100,163,171,175,178,180,181,182,194,219],[100,112,163,171,175,178,180,181,182,194,219],[100,114,118,163,171,175,178,180,181,182,184,194,211],[100,109,110,111,113,117,163,171,174,175,178,180,181,182,194,199,211],[100,118,127,135,163,171,175,178,180,181,182,194],[100,110,116,163,171,175,178,180,181,182,194],[100,118,144,145,163,171,175,178,180,181,182,194],[100,110,113,118,163,171,175,178,180,181,182,194,202,211,219],[100,118,163,171,175,178,180,181,182,194],[100,114,118,163,171,175,178,180,181,182,194,211],[100,109,163,171,175,178,180,181,182,194],[100,112,113,114,116,117,118,119,120,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,147,148,149,163,171,175,178,180,181,182,194],[100,118,137,140,163,171,175,178,180,181,182,194],[100,118,127,128,129,163,171,175,178,180,181,182,194],[100,116,118,128,130,163,171,175,178,180,181,182,194],[100,117,163,171,175,178,180,181,182,194],[100,110,112,118,163,171,175,178,180,181,182,194],[100,118,122,128,130,163,171,175,178,180,181,182,194],[100,122,163,171,175,178,180,181,182,194],[100,116,118,121,163,171,175,178,180,181,182,194,211],[100,110,114,118,127,163,171,175,178,180,181,182,194],[100,118,137,163,171,175,178,180,181,182,194],[100,130,163,171,175,178,180,181,182,194],[100,112,118,144,163,171,175,178,180,181,182,194,202,217,219],[76,78,81,82,100,163,171,175,178,180,181,182,194],[76,77,100,163,171,175,178,180,181,182,194],[76,77,79,80,100,163,171,175,178,180,181,182,194],[76,81,100,163,171,175,178,180,181,182,194],[66,67,68,69,70,71,72,73,74,75,100,163,171,175,178,180,181,182,194],[67,100,163,171,175,178,180,181,182,194],[66,100,163,171,175,178,180,181,182,194]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cbad9a1ba4453443026ed38e4b8be018abb26565fa7c944376463ad9df07c41","impliedFormat":1},"e7ef705b4bd6c328a5b128f57756a5732a7e408c08c64dd9daa7e4c7150bdc12","cc5e99ca897b1846e1a522e41a035cbe73aba89e23ec8e71a370d8e593fb7a4a","6d85f9d69a6e2354e4a0e2e01dd63a80aeb06a6eed8e415fa68e67f21d322173","94e1a05011cfe86775b1cc53900853f0d9588c67b3b826a64c62f68157c71e9b","5250ec149c9546bd0b6542a30d90462c51afc9478adee8cfa4b3a29c70326766","f81b798608be049389fd2a65039655814651cae78916669b547c57ae60717698","e0c40f5f19287706f42fffca4cd03e8f164fb013d4de906d5e861d3d298b01bf","e45e2d87300759192c84ce18d67c7f3b08e2fb4ffe0a8654d20b83cb20865a83","2ed4b8d280c84342b549254421e3015190fffb6cc872c7b226c96e6024b8d3fb","e823245a8a70b8b9f44f626240144d7d83b84bb55325345e5402a11fbfede6bc","49bd0ec0c52a3fe2c065d1d0fc777f256ecbbf51858e45315c651f47c7a40f35",{"version":"d7049d481acb7d06fe56e09073784736729a1295d53066f45702e823696199f4","signature":"d668c5cb96b8109d4e4f1932da9688e413c03217e5f1be336d5a961dcd7eb296"},{"version":"144cc2037a669dc028ad90d11c72f96ff647313579563bee4b98d860ed537e1c","signature":"b5f0abb176f6c496e5064c62bb784f91cc4dca71d2d3b34747b45e9343c9ddcc"},{"version":"5349b4093235cf998d584d490d75da5b6cadbb26125a9cd8e3400b012418f51e","signature":"47295d9657a3c323114d5d1381cc6cfaf84b4abcc0b60e76fbf6b47a198b6550"},{"version":"a50940e48ae4b4b1dbca5060ab1a011fdc01861fb0f8f913628f3a1d5e43feed","signature":"3da587790d50f74f587b292acfc9c13c0ca1249fadb3186ee55d9bb31e6732dc"},{"version":"64e12367f1961af28a9c317a600d2e946dbe7220ba56670f8921f1e7e6217a26","signature":"97350291d7c49ccd19e36941d0224816be50e24f988e05d7d094856aae595cb1"},{"version":"bbcff1149228965a34827ed97efe84f01dfc8a61288f989d78378ace0a515e5b","signature":"5f18d55df86b7411454360ac846da3fbe5c5dd5efef9e69d91328b01dad10c11"},{"version":"3d6cd7fafae96f4e399614ca413ae953c515d5dae90bba44a97d178443224826","signature":"03103bf6727ca2ed2d7365cf2eac5e93378201be5df4f1552ad6aab4cf176145"},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"b1538a92b9bae8d230267210c5db38c2eb6bdb352128a3ce3aa8c6acf9fc9622","impliedFormat":1},{"version":"6fc1a4f64372593767a9b7b774e9b3b92bf04e8785c3f9ea98973aa9f4bbe490","impliedFormat":1},{"version":"ff09b6fbdcf74d8af4e131b8866925c5e18d225540b9b19ce9485ca93e574d84","impliedFormat":1},{"version":"d5895252efa27a50f134a9b580aa61f7def5ab73d0a8071f9b5bf9a317c01c2d","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805","impliedFormat":1},{"version":"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a","impliedFormat":1},{"version":"9b048390bcffe88c023a4cd742a720b41d4cd7df83bc9270e6f2339bf38de278","affectsGlobalScope":true,"impliedFormat":1},{"version":"1f366bde16e0513fa7b64f87f86689c4d36efd85afce7eb24753e9c99b91c319","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"24371e69a38fc33e268d4a8716dbcda430d6c2c414a99ff9669239c4b8f40dea","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"c63b9ada8c72f95aac5db92aea07e5e87ec810353cdf63b2d78f49a58662cf6c","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"237ba5ac2a95702a114a309e39c53a5bddff5f6333b325db9764df9b34f3502b","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"1d024184fb57c58c5c91823f9d10b4915a4867b7934e89115fd0d861a9df27c8","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f96a48183254c00d24575401f1a761b4ce4927d927407e7862a83e06ce5d6964","impliedFormat":1},{"version":"cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","impliedFormat":1},{"version":"f83fb2b1338afbb3f9d733c7d6e8b135826c41b0518867df0c0ace18ae1aa270","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"757227c8b345c57d76f7f0e3bbad7a91ffca23f1b2547cbed9e10025816c9cb7","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"9451a46a89ed209e2e08329e6cac59f89356eae79a7230f916d8cc38725407c7","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"e236b5eba291f51bdf32c231673e6cab81b5410850e61f51a7a524dddadc0f95","impliedFormat":1},{"version":"cf9717ebf9dd23f5f1e55e00545df1edc40ac8a671a034974fb4ff5dfbfaacc4","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"f64deb26664af64dc274637343bde8d82f930c77af05a412c7d310b77207a448","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"bce309f4d9b67c18d4eeff5bba6cf3e67b2b0aead9f03f75d6060c553974d7ba","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"fde38b23ab057617351c1676047d3317f651b1a6d207084e41c056ed158a77f9","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"c3877fef8a43cd434f9728f25a97575b0eb73d92f38b5c87c840daccc3e21d97","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"1dbd83860e7634f9c236647f45dbc5d3c4f9eba8827d87209d6e9826fdf4dbd5","impliedFormat":1},{"version":"41ef7992c555671a8fe54db302788adefa191ded810a50329b79d20a6772d14c","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"b37f83e7deea729aa9ce5593f78905afb45b7532fdff63041d374f60059e7852","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"7fa8d75d229eeaee235a801758d9c694e94405013fe77d5d1dd8e3201fc414f1","impliedFormat":1}],"root":[[77,83]],"options":{"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":7,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9},"referencedMap":[[86,1],[87,2],[88,2],[89,2],[90,3],[91,2],[93,4],[94,5],[92,2],[95,2],[84,2],[96,2],[97,2],[160,6],[161,6],[162,7],[100,8],[163,9],[164,10],[165,11],[98,2],[166,12],[167,13],[168,14],[169,15],[170,16],[171,17],[172,17],[173,18],[174,19],[175,20],[176,21],[101,2],[99,2],[177,22],[178,23],[179,24],[219,25],[180,26],[181,27],[182,26],[183,28],[184,29],[185,30],[186,31],[187,31],[188,31],[189,32],[190,33],[191,34],[192,35],[193,36],[194,37],[195,37],[196,38],[197,2],[198,2],[199,39],[200,40],[201,39],[202,41],[203,42],[204,43],[205,44],[206,45],[207,46],[208,47],[209,48],[210,49],[211,50],[212,51],[213,52],[214,53],[215,54],[216,55],[102,26],[103,2],[104,56],[105,57],[106,2],[107,58],[108,2],[151,59],[152,60],[153,61],[154,61],[155,62],[156,2],[157,9],[158,63],[159,60],[217,64],[218,65],[223,66],[220,2],[222,67],[224,2],[85,2],[221,2],[63,2],[64,2],[12,2],[10,2],[11,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[65,2],[57,2],[58,2],[60,2],[59,2],[1,2],[61,2],[62,2],[14,2],[13,2],[127,68],[139,69],[124,70],[140,71],[149,72],[115,73],[116,74],[114,75],[148,76],[143,77],[147,78],[118,79],[136,80],[117,81],[146,82],[112,83],[113,77],[119,84],[120,2],[126,85],[123,84],[110,86],[150,87],[141,88],[130,89],[129,84],[131,90],[134,91],[128,92],[132,93],[144,76],[121,94],[122,95],[135,96],[111,71],[138,97],[137,84],[125,95],[133,98],[142,2],[109,2],[145,99],[83,100],[78,101],[81,102],[77,2],[80,2],[79,2],[82,103],[74,2],[75,2],[73,2],[76,104],[67,2],[68,105],[72,2],[71,106],[69,2],[70,105],[66,2]],"latestChangedDtsFile":"./dist/index.d.ts","version":"5.9.3"}