@postalsys/email-content 0.0.4 → 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.
- package/README.md +207 -17
- package/dist/.tsbuildinfo +1 -1
- package/dist/analyze.d.ts +55 -15
- package/dist/analyze.d.ts.map +1 -1
- package/dist/analyze.js +264 -61
- package/dist/analyze.js.map +1 -1
- package/dist/canonical/html.d.ts +21 -2
- package/dist/canonical/html.d.ts.map +1 -1
- package/dist/canonical/html.js +213 -14
- package/dist/canonical/html.js.map +1 -1
- package/dist/classify/confidence.d.ts +12 -0
- package/dist/classify/confidence.d.ts.map +1 -1
- package/dist/classify/confidence.js +54 -4
- package/dist/classify/confidence.js.map +1 -1
- package/dist/classify/reconcile.d.ts +25 -17
- package/dist/classify/reconcile.d.ts.map +1 -1
- package/dist/classify/reconcile.js +52 -20
- package/dist/classify/reconcile.js.map +1 -1
- package/dist/cli/annotate.d.ts.map +1 -1
- package/dist/cli/annotate.js +6 -3
- package/dist/cli/annotate.js.map +1 -1
- package/dist/cli/args.d.ts +14 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +48 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/benchmark.d.ts +39 -0
- package/dist/cli/benchmark.d.ts.map +1 -1
- package/dist/cli/benchmark.js +179 -66
- package/dist/cli/benchmark.js.map +1 -1
- package/dist/cli/corpus.d.ts.map +1 -1
- package/dist/cli/corpus.js +13 -8
- package/dist/cli/corpus.js.map +1 -1
- package/dist/cli/disagreements.d.ts.map +1 -1
- package/dist/cli/disagreements.js +7 -4
- package/dist/cli/disagreements.js.map +1 -1
- package/dist/cli/evaluate.d.ts.map +1 -1
- package/dist/cli/evaluate.js +34 -10
- package/dist/cli/evaluate.js.map +1 -1
- package/dist/cli/extract.d.ts.map +1 -1
- package/dist/cli/extract.js +8 -3
- package/dist/cli/extract.js.map +1 -1
- package/dist/cli/main.js +8 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/corpus/scanner.d.ts +9 -1
- package/dist/corpus/scanner.d.ts.map +1 -1
- package/dist/corpus/scanner.js +52 -13
- package/dist/corpus/scanner.js.map +1 -1
- package/dist/corpus/store.d.ts +33 -2
- package/dist/corpus/store.d.ts.map +1 -1
- package/dist/corpus/store.js +64 -4
- package/dist/corpus/store.js.map +1 -1
- package/dist/detect/patterns.d.ts +29 -0
- package/dist/detect/patterns.d.ts.map +1 -1
- package/dist/detect/patterns.js +80 -6
- package/dist/detect/patterns.js.map +1 -1
- package/dist/detect/reply-header.d.ts +14 -0
- package/dist/detect/reply-header.d.ts.map +1 -1
- package/dist/detect/reply-header.js +80 -37
- package/dist/detect/reply-header.js.map +1 -1
- package/dist/eval/oracle.d.ts +80 -0
- package/dist/eval/oracle.d.ts.map +1 -0
- package/dist/eval/oracle.js +250 -0
- package/dist/eval/oracle.js.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -56
- package/dist/index.js.map +1 -1
- package/dist/mime/model.d.ts +28 -3
- package/dist/mime/model.d.ts.map +1 -1
- package/dist/mime/model.js +41 -1
- package/dist/mime/model.js.map +1 -1
- package/dist/mime/parse.d.ts.map +1 -1
- package/dist/mime/parse.js +19 -2
- package/dist/mime/parse.js.map +1 -1
- package/dist/mime/select.d.ts +71 -0
- package/dist/mime/select.d.ts.map +1 -0
- package/dist/mime/select.js +198 -0
- package/dist/mime/select.js.map +1 -0
- package/dist/segment/html-blocks.d.ts +1 -1
- package/dist/segment/html-blocks.d.ts.map +1 -1
- package/dist/segment/html-blocks.js +77 -8
- package/dist/segment/html-blocks.js.map +1 -1
- package/dist/segment/text-blocks.d.ts.map +1 -1
- package/dist/segment/text-blocks.js +18 -1
- package/dist/segment/text-blocks.js.map +1 -1
- package/dist/segment/types.d.ts +14 -0
- package/dist/segment/types.d.ts.map +1 -1
- package/dist/types.d.ts +132 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +37 -3
- package/dist/types.js.map +1 -1
- package/dist/util/worker-pool.d.ts +21 -0
- package/dist/util/worker-pool.d.ts.map +1 -1
- package/dist/util/worker-pool.js +61 -13
- package/dist/util/worker-pool.js.map +1 -1
- package/package.json +6 -5
package/dist/analyze.d.ts
CHANGED
|
@@ -12,13 +12,52 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { type ConfidenceConfig } from './classify/confidence';
|
|
14
14
|
import { type HistoryDocument } from './match/history';
|
|
15
|
-
import { type
|
|
15
|
+
import { type ContentAnalysisResult, type Reason } from './types';
|
|
16
|
+
/**
|
|
17
|
+
* One structurally independent piece of a message body.
|
|
18
|
+
*
|
|
19
|
+
* A `multipart/mixed` message can carry several. The commonest shape in the working corpus,
|
|
20
|
+
* `multipart/mixed(alternative(P,H), P)` at 3.1 percent of 320,377 messages, is an authored body
|
|
21
|
+
* followed by a separately encoded gateway footer. They are not alternative renderings of each
|
|
22
|
+
* other, and choosing between them deletes one.
|
|
23
|
+
*
|
|
24
|
+
* `text` and `html` within one section *are* alternative renderings, and at most one of them
|
|
25
|
+
* reaches the output.
|
|
26
|
+
*/
|
|
27
|
+
export interface BodySection {
|
|
28
|
+
/** Plain text of this section, already transfer and charset decoded. */
|
|
29
|
+
text?: string | null;
|
|
30
|
+
/** HTML of this section, already transfer and charset decoded. */
|
|
31
|
+
html?: string | null;
|
|
32
|
+
/** MIME part ids, when the caller knows them, purely for traceability in the output. */
|
|
33
|
+
textPartId?: string;
|
|
34
|
+
htmlPartId?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Where the section sits. Derived internally by `extract()`; optional for external callers, who
|
|
37
|
+
* may supply at most one `primary`. Evidence only: an appended section is classified normally,
|
|
38
|
+
* because gateways append substantive text as often as they append disclaimers.
|
|
39
|
+
*/
|
|
40
|
+
role?: 'primary' | 'appended';
|
|
41
|
+
}
|
|
16
42
|
/** A message body, in whichever representations are available. */
|
|
17
43
|
export interface MessageContent {
|
|
18
44
|
/** Plain text body, already transfer and charset decoded. */
|
|
19
45
|
text?: string | null;
|
|
20
46
|
/** HTML body, already transfer and charset decoded. */
|
|
21
47
|
html?: string | null;
|
|
48
|
+
/**
|
|
49
|
+
* Ordered body sections, when the message has more than one.
|
|
50
|
+
*
|
|
51
|
+
* Array position is the canonical order; there is deliberately no second ordering field to
|
|
52
|
+
* disagree with it. Mutually exclusive with the single `text`/`html`/`textPartId`/`htmlPartId`
|
|
53
|
+
* fields above, which are sugar for exactly one section. Supplying both is rejected rather than
|
|
54
|
+
* guessed at.
|
|
55
|
+
*
|
|
56
|
+
* This is the shared path, not an `extract()` private. Building multi section composition
|
|
57
|
+
* inside `extract()` would give the raw message entry point a capability the content first one
|
|
58
|
+
* cannot express, and the two entry points must not be able to disagree about the same message.
|
|
59
|
+
*/
|
|
60
|
+
sections?: readonly BodySection[];
|
|
22
61
|
/** Subject line. Optional, and never allowed to change a label on its own. */
|
|
23
62
|
subject?: string | null;
|
|
24
63
|
/** Sender, as a display name and/or address. Used only as signature evidence. */
|
|
@@ -31,7 +70,14 @@ export interface MessageContent {
|
|
|
31
70
|
htmlPartId?: string;
|
|
32
71
|
}
|
|
33
72
|
export interface AnalyzeOptions {
|
|
34
|
-
confidence?: ConfidenceConfig
|
|
73
|
+
confidence?: Partial<ConfidenceConfig>;
|
|
74
|
+
/**
|
|
75
|
+
* Maximum characters of body content analysed, across every section. Default 8,000,000.
|
|
76
|
+
*
|
|
77
|
+
* A circuit breaker for the content first entry point, where there is no raw message to bound.
|
|
78
|
+
* Sections past the limit are not analysed and the result carries `input_limit_exceeded`.
|
|
79
|
+
*/
|
|
80
|
+
maxContentChars?: number;
|
|
35
81
|
/**
|
|
36
82
|
* Earlier messages in the thread, nearest first. Each may be raw RFC 5322 or already split
|
|
37
83
|
* content. History is optional and only ever adds evidence.
|
|
@@ -41,19 +87,13 @@ export interface AnalyzeOptions {
|
|
|
41
87
|
historyDocuments?: readonly HistoryDocument[];
|
|
42
88
|
explain?: boolean;
|
|
43
89
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
originalAvailable: true;
|
|
52
|
-
primaryRepresentation: 'text' | 'html' | 'none';
|
|
53
|
-
extractorVersion: string;
|
|
54
|
-
historyUsed: boolean;
|
|
55
|
-
/** True when the input looked like a reply, from threading headers or a subject prefix. */
|
|
56
|
-
isReply: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Result of analysing one message body.
|
|
92
|
+
*
|
|
93
|
+
* Extends the shared contract rather than restating it, so the two entry points cannot drift apart
|
|
94
|
+
* again. `extract()` used to build its own object and silently drop `isReply`.
|
|
95
|
+
*/
|
|
96
|
+
export interface AnalyzeResult extends ContentAnalysisResult {
|
|
57
97
|
diagnostics?: {
|
|
58
98
|
primaryPart: string | null;
|
|
59
99
|
blocks: {
|
package/dist/analyze.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,EAA8D,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1H,OAAO,EAAsF,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG3I,OAAO,EAAqD,KAAK,qBAAqB,EAAE,KAAK,MAAM,EAA8B,MAAM,SAAS,CAAC;AAEjJ;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IACxB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;CACjC;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC3B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAClC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxD,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAc,SAAQ,qBAAqB;IACxD,WAAW,CAAC,EAAE;QACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE;YACJ,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,EAAE,MAAM,CAAC;YACnB,OAAO,EAAE,MAAM,EAAE,CAAC;YAClB,QAAQ,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,QAAQ,EAAE,MAAM,CAAA;aAAE,EAAE,CAAC;YAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC;SACnB,EAAE,CAAC;KACP,CAAC;CACL;AAiBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAa1E;AA0ND,8EAA8E;AAC9E,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAkBxF;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmN3G"}
|
package/dist/analyze.js
CHANGED
|
@@ -15,12 +15,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.senderTokensFrom = senderTokensFrom;
|
|
16
16
|
exports.resolveHistory = resolveHistory;
|
|
17
17
|
exports.analyze = analyze;
|
|
18
|
+
const html_1 = require("./canonical/html");
|
|
19
|
+
const patterns_1 = require("./detect/patterns");
|
|
18
20
|
const html_blocks_1 = require("./segment/html-blocks");
|
|
19
21
|
const text_blocks_1 = require("./segment/text-blocks");
|
|
20
22
|
const rules_1 = require("./classify/rules");
|
|
21
23
|
const reconcile_1 = require("./classify/reconcile");
|
|
22
24
|
const confidence_1 = require("./classify/confidence");
|
|
23
25
|
const history_1 = require("./match/history");
|
|
26
|
+
const normalize_1 = require("./match/normalize");
|
|
27
|
+
const shingle_1 = require("./match/shingle");
|
|
24
28
|
const types_1 = require("./types");
|
|
25
29
|
const REPLY_SUBJECT = /^\s*(re|aw|sv|vs|vast|antw|res|odp|ответ)\s*(\[\d+\])?\s*:/i;
|
|
26
30
|
function contentChars(blocks) {
|
|
@@ -49,16 +53,20 @@ function senderTokensFrom(from) {
|
|
|
49
53
|
}
|
|
50
54
|
return [...tokens];
|
|
51
55
|
}
|
|
52
|
-
|
|
53
|
-
|
|
56
|
+
/** Confidence assigned to anything the pipeline could not classify. Never 1, never 0. */
|
|
57
|
+
const DEGRADED_CONFIDENCE = 0.5;
|
|
58
|
+
function representationInfo(blocks, representation, degraded) {
|
|
54
59
|
return {
|
|
55
60
|
representation,
|
|
56
|
-
|
|
61
|
+
blocks,
|
|
57
62
|
contentChars: contentChars(blocks),
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
// A representation that failed to segment has no evidence, so it has no anchors either.
|
|
64
|
+
hasAnchor: degraded ? false : hasAnchor(blocks),
|
|
65
|
+
degraded
|
|
60
66
|
};
|
|
61
67
|
}
|
|
68
|
+
/** Evidence that a section arrived as a later MIME sibling rather than as the message body. */
|
|
69
|
+
const APPENDED_SECTION_EVIDENCE = { id: 'mime:appended_section', kind: 'hint', strength: 0.5 };
|
|
62
70
|
/** Merge adjacent decisions carrying the same label, so the output is regions rather than lines. */
|
|
63
71
|
function toSegments(decisions, config) {
|
|
64
72
|
const segments = [];
|
|
@@ -66,7 +74,7 @@ function toSegments(decisions, config) {
|
|
|
66
74
|
const block = decision.block;
|
|
67
75
|
const previous = segments[segments.length - 1];
|
|
68
76
|
const visibility = (0, confidence_1.visibilityFor)(decision.label, decision.confidence, config);
|
|
69
|
-
if (previous && previous.type === decision.label && previous.visibility === visibility && previous.source
|
|
77
|
+
if (previous && previous.type === decision.label && previous.visibility === visibility && (0, types_1.mimePartOf)(previous.source) === block.mimePart) {
|
|
70
78
|
previous.text = previous.text ? `${previous.text}\n${block.content}` : block.content;
|
|
71
79
|
if (block.html) {
|
|
72
80
|
previous.html = (previous.html ?? '') + block.html;
|
|
@@ -91,9 +99,12 @@ function toSegments(decisions, config) {
|
|
|
91
99
|
visibility,
|
|
92
100
|
reasons: [...decision.reasons],
|
|
93
101
|
source: {
|
|
102
|
+
kind: 'mime-part',
|
|
94
103
|
mimePart: block.mimePart,
|
|
95
104
|
representation: block.representation,
|
|
96
|
-
|
|
105
|
+
// The section-local index, not the document-global one the classifier ran on. A
|
|
106
|
+
// reader following this back wants the block's position inside its own MIME part.
|
|
107
|
+
blockIndex: block.sourceIndex ?? block.index,
|
|
97
108
|
start: block.start,
|
|
98
109
|
end: block.end,
|
|
99
110
|
...(block.domPath ? { domPath: block.domPath } : {})
|
|
@@ -102,6 +113,130 @@ function toSegments(decisions, config) {
|
|
|
102
113
|
}
|
|
103
114
|
return segments.filter(segment => segment.text.trim().length > 0);
|
|
104
115
|
}
|
|
116
|
+
function trimmedOrEmpty(value) {
|
|
117
|
+
return typeof value === 'string' && value.trim() ? value : '';
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Are two adjacent sections the same content in two representations?
|
|
121
|
+
*
|
|
122
|
+
* Some clients emit `multipart/mixed(H, P)` where they meant `multipart/alternative`: 158 messages
|
|
123
|
+
* in the working corpus, most of them in that order. Structure alone cannot tell that apart from a
|
|
124
|
+
* genuine plain text sibling next to a genuine HTML one, and guessing wrong in the merging direction
|
|
125
|
+
* deletes a section. So the question is settled by content: shingle containment either way, at the
|
|
126
|
+
* same threshold history matching uses. No match means both are kept, and the cost of that is a
|
|
127
|
+
* body that appears twice rather than one that disappears.
|
|
128
|
+
*/
|
|
129
|
+
function isSameContentAlternative(a, b) {
|
|
130
|
+
const aText = trimmedOrEmpty(a.text);
|
|
131
|
+
const aHtml = trimmedOrEmpty(a.html);
|
|
132
|
+
const bText = trimmedOrEmpty(b.text);
|
|
133
|
+
const bHtml = trimmedOrEmpty(b.html);
|
|
134
|
+
let plain;
|
|
135
|
+
let markup;
|
|
136
|
+
if (aText && !aHtml && bHtml && !bText) {
|
|
137
|
+
plain = aText;
|
|
138
|
+
markup = bHtml;
|
|
139
|
+
}
|
|
140
|
+
else if (aHtml && !aText && bText && !bHtml) {
|
|
141
|
+
plain = bText;
|
|
142
|
+
markup = aHtml;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
const left = (0, shingle_1.buildShingleIndex)((0, normalize_1.normaliseForMatch)(plain));
|
|
148
|
+
const right = (0, shingle_1.buildShingleIndex)((0, normalize_1.normaliseForMatch)((0, html_1.stripTagsToText)(markup)));
|
|
149
|
+
if (!(0, shingle_1.isMatchable)(left) || !(0, shingle_1.isMatchable)(right)) {
|
|
150
|
+
// Too short to judge. Keeping both is the safe answer.
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
return (0, shingle_1.containment)(left, right).containment >= shingle_1.CONTAINMENT_THRESHOLD || (0, shingle_1.containment)(right, left).containment >= shingle_1.CONTAINMENT_THRESHOLD;
|
|
154
|
+
}
|
|
155
|
+
function mergeEquivalentSections(sections) {
|
|
156
|
+
const merged = [];
|
|
157
|
+
for (const section of sections) {
|
|
158
|
+
const previous = merged[merged.length - 1];
|
|
159
|
+
if (previous && isSameContentAlternative(previous, section)) {
|
|
160
|
+
merged[merged.length - 1] = {
|
|
161
|
+
text: previous.text ?? section.text ?? null,
|
|
162
|
+
html: previous.html ?? section.html ?? null,
|
|
163
|
+
...((previous.textPartId ?? section.textPartId) ? { textPartId: previous.textPartId ?? section.textPartId } : {}),
|
|
164
|
+
...((previous.htmlPartId ?? section.htmlPartId) ? { htmlPartId: previous.htmlPartId ?? section.htmlPartId } : {}),
|
|
165
|
+
...(previous.role ? { role: previous.role } : {})
|
|
166
|
+
};
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
merged.push(section);
|
|
170
|
+
}
|
|
171
|
+
return merged;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Resolve the caller's input into an ordered list of body sections.
|
|
175
|
+
*
|
|
176
|
+
* The single `text`/`html` pair is sugar for exactly one section, normalised here so that both
|
|
177
|
+
* entry points and both call shapes run the identical composition below.
|
|
178
|
+
*/
|
|
179
|
+
function normaliseSections(content) {
|
|
180
|
+
const hasLegacyContent = trimmedOrEmpty(content.text) !== '' || trimmedOrEmpty(content.html) !== '';
|
|
181
|
+
if (content.sections) {
|
|
182
|
+
if (hasLegacyContent) {
|
|
183
|
+
throw new types_1.ConfigurationError('sections', 'the only body input; supplying text or html alongside it is ambiguous', 'conflicting_body_input');
|
|
184
|
+
}
|
|
185
|
+
if (content.sections.filter(section => section.role === 'primary').length > 1) {
|
|
186
|
+
throw new types_1.ConfigurationError('sections', 'a list with at most one section whose role is "primary"', 'invalid_section_role');
|
|
187
|
+
}
|
|
188
|
+
return mergeEquivalentSections(content.sections.filter(section => trimmedOrEmpty(section.text) || trimmedOrEmpty(section.html)));
|
|
189
|
+
}
|
|
190
|
+
if (!hasLegacyContent) {
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
return [
|
|
194
|
+
{
|
|
195
|
+
text: content.text ?? null,
|
|
196
|
+
html: content.html ?? null,
|
|
197
|
+
...(content.textPartId ? { textPartId: content.textPartId } : {}),
|
|
198
|
+
...(content.htmlPartId ? { htmlPartId: content.htmlPartId } : {}),
|
|
199
|
+
role: 'primary'
|
|
200
|
+
}
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
/** Characters of body content analysed by default, across every section. */
|
|
204
|
+
const DEFAULT_MAX_CONTENT_CHARS = 8_000_000;
|
|
205
|
+
function validateMaxContentChars(value) {
|
|
206
|
+
if (value === undefined) {
|
|
207
|
+
return DEFAULT_MAX_CONTENT_CHARS;
|
|
208
|
+
}
|
|
209
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1) {
|
|
210
|
+
throw new types_1.ConfigurationError('maxContentChars', 'a positive safe integer');
|
|
211
|
+
}
|
|
212
|
+
return value;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Drop sections once the aggregate content budget is spent.
|
|
216
|
+
*
|
|
217
|
+
* Whole sections rather than a character cut: a half section would be classified against structure
|
|
218
|
+
* that is not there, and a confident wrong answer about truncated input is worse than an honest
|
|
219
|
+
* refusal. Everything the budget did allow through is analysed and returned in full, and the
|
|
220
|
+
* warning names the option so the caller can raise it.
|
|
221
|
+
*/
|
|
222
|
+
function limitSections(sections, maxContentChars, warnings) {
|
|
223
|
+
const kept = [];
|
|
224
|
+
let used = 0;
|
|
225
|
+
for (const section of sections) {
|
|
226
|
+
const size = (section.text?.length ?? 0) + (section.html?.length ?? 0);
|
|
227
|
+
if (kept.length && used + size > maxContentChars) {
|
|
228
|
+
warnings.push({ code: 'input_limit_exceeded', detail: `maxContentChars (${maxContentChars})` });
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
used += size;
|
|
232
|
+
kept.push(section);
|
|
233
|
+
if (used > maxContentChars) {
|
|
234
|
+
warnings.push({ code: 'input_limit_exceeded', detail: `maxContentChars (${maxContentChars})` });
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return kept;
|
|
239
|
+
}
|
|
105
240
|
/** Turn whatever the caller supplied as history into searchable documents. */
|
|
106
241
|
async function resolveHistory(options) {
|
|
107
242
|
if (options.historyDocuments?.length) {
|
|
@@ -131,26 +266,35 @@ async function resolveHistory(options) {
|
|
|
131
266
|
* segment, because showing too much is always preferable to showing nothing.
|
|
132
267
|
*/
|
|
133
268
|
async function analyze(content, options = {}) {
|
|
134
|
-
|
|
269
|
+
// Classifier assets are loaded here, outside the fail-soft block below.
|
|
270
|
+
//
|
|
271
|
+
// Detectors call `loadPatterns()` lazily, which put its "no patterns could be loaded" assertion
|
|
272
|
+
// inside the per message catch: a broken installation came back as one more degraded result
|
|
273
|
+
// among many, and every message looked like new content because nothing could be detected as
|
|
274
|
+
// history. A missing package asset is an installation defect and has to fail like one.
|
|
275
|
+
(0, patterns_1.loadPatterns)();
|
|
276
|
+
// Validated before any work. An invalid threshold is a programmer error that would otherwise
|
|
277
|
+
// repeat silently on every message, so it throws here rather than degrading a result.
|
|
278
|
+
const config = (0, confidence_1.validateConfidenceConfig)(options.confidence);
|
|
279
|
+
const maxContentChars = validateMaxContentChars(options.maxContentChars);
|
|
135
280
|
const warnings = [];
|
|
136
|
-
const
|
|
137
|
-
const html = typeof content.html === 'string' ? content.html : '';
|
|
281
|
+
const sections = limitSections(normaliseSections(content), maxContentChars, warnings);
|
|
138
282
|
const isReply = Boolean(content.inReplyTo) || (content.references?.length ?? 0) > 0 || REPLY_SUBJECT.test(content.subject ?? '');
|
|
139
283
|
const base = {
|
|
140
284
|
originalAvailable: true,
|
|
141
285
|
extractorVersion: types_1.EXTRACTOR_VERSION,
|
|
142
286
|
isReply
|
|
143
287
|
};
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
};
|
|
288
|
+
const empty = {
|
|
289
|
+
...base,
|
|
290
|
+
segments: [],
|
|
291
|
+
hiddenSegments: [],
|
|
292
|
+
overallConfidence: 1,
|
|
293
|
+
primaryRepresentation: 'none',
|
|
294
|
+
historyUsed: false
|
|
295
|
+
};
|
|
296
|
+
if (!sections.length) {
|
|
297
|
+
return { ...empty, warnings: [{ code: 'no_body_parts' }] };
|
|
154
298
|
}
|
|
155
299
|
const senderTokens = senderTokensFrom(content.from);
|
|
156
300
|
let history = [];
|
|
@@ -161,46 +305,85 @@ async function analyze(content, options = {}) {
|
|
|
161
305
|
// History is optional evidence. Failing to build it is never fatal.
|
|
162
306
|
}
|
|
163
307
|
try {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
308
|
+
// Segment every section and choose its representation, before anything is classified.
|
|
309
|
+
const segmented = [];
|
|
310
|
+
const documentBlocks = [];
|
|
311
|
+
for (const section of sections) {
|
|
312
|
+
const sectionText = typeof section.text === 'string' ? section.text : '';
|
|
313
|
+
const sectionHtml = typeof section.html === 'string' ? section.html : '';
|
|
314
|
+
let textInfo = null;
|
|
315
|
+
let htmlInfo = null;
|
|
316
|
+
if (sectionText.trim()) {
|
|
317
|
+
const blocks = (0, text_blocks_1.segmentTextBlocks)(sectionText, section.textPartId ?? 'TEXT').blocks;
|
|
318
|
+
textInfo = representationInfo(blocks, 'text', false);
|
|
319
|
+
}
|
|
320
|
+
if (sectionHtml.trim()) {
|
|
321
|
+
const htmlPartId = section.htmlPartId ?? 'HTML';
|
|
322
|
+
const result = (0, html_blocks_1.segmentHtmlBlocks)(sectionHtml, htmlPartId);
|
|
323
|
+
if (result.degraded) {
|
|
324
|
+
warnings.push({ code: 'html_parse_error', mimePart: htmlPartId });
|
|
325
|
+
}
|
|
326
|
+
htmlInfo = representationInfo(result.blocks, 'html', result.degraded);
|
|
176
327
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
primaryBlocks = segmented.blocks;
|
|
328
|
+
if (!textInfo && !htmlInfo) {
|
|
329
|
+
continue;
|
|
180
330
|
}
|
|
331
|
+
const choice = (0, reconcile_1.pickPrimary)(textInfo, htmlInfo);
|
|
332
|
+
const start = documentBlocks.length;
|
|
333
|
+
for (const block of choice.primary.blocks) {
|
|
334
|
+
// Section-local index preserved for traceability; the array position becomes the
|
|
335
|
+
// decision index, which is what the classifier indexes its own arrays with.
|
|
336
|
+
block.sourceIndex = block.index;
|
|
337
|
+
block.index = documentBlocks.length;
|
|
338
|
+
if (section.role === 'appended') {
|
|
339
|
+
block.evidence.push(APPENDED_SECTION_EVIDENCE);
|
|
340
|
+
}
|
|
341
|
+
documentBlocks.push(block);
|
|
342
|
+
}
|
|
343
|
+
segmented.push({ choice, role: section.role ?? 'primary', start, end: documentBlocks.length });
|
|
181
344
|
}
|
|
182
|
-
if (!
|
|
183
|
-
return {
|
|
184
|
-
...base,
|
|
185
|
-
segments: [],
|
|
186
|
-
hiddenSegments: [],
|
|
187
|
-
overallConfidence: 1,
|
|
188
|
-
warnings: [...warnings, { code: 'no_body_parts' }],
|
|
189
|
-
primaryRepresentation: 'none',
|
|
190
|
-
historyUsed: false
|
|
191
|
-
};
|
|
345
|
+
if (!documentBlocks.length) {
|
|
346
|
+
return { ...empty, warnings: [...warnings, { code: 'no_body_parts' }] };
|
|
192
347
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
348
|
+
// Positional features are document-global, so that an appended gateway footer cannot stop
|
|
349
|
+
// the primary section's signature from being the last thing the sender wrote.
|
|
350
|
+
for (const block of documentBlocks) {
|
|
351
|
+
block.features.indexFromEnd = documentBlocks.length - 1 - block.index;
|
|
196
352
|
}
|
|
197
|
-
|
|
198
|
-
|
|
353
|
+
const matches = history.length ? (0, history_1.matchBlocks)(documentBlocks, history) : [];
|
|
354
|
+
const decisions = (0, rules_1.classifyBlocks)(documentBlocks, { config, historyMatchedIndices: (0, history_1.matchedIndices)(matches), senderTokens });
|
|
355
|
+
for (const section of segmented) {
|
|
356
|
+
const slice = decisions.slice(section.start, section.end);
|
|
357
|
+
if (section.choice.primary.degraded) {
|
|
358
|
+
// A degraded parse has lost exactly the structure the visibility rules depend on,
|
|
359
|
+
// so its decisions are replaced rather than trusted. Letting reply-header, quote
|
|
360
|
+
// region and footer reasoning act on its flattened projection would let it infer
|
|
361
|
+
// hidden regions from evidence it no longer has.
|
|
362
|
+
for (const decision of slice) {
|
|
363
|
+
decision.label = 'UNKNOWN';
|
|
364
|
+
decision.confidence = DEGRADED_CONFIDENCE;
|
|
365
|
+
decision.reasons = ['degraded_to_unknown'];
|
|
366
|
+
}
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
const secondary = section.choice.secondary;
|
|
370
|
+
const secondaryDecisions = secondary
|
|
371
|
+
? (0, rules_1.classifyBlocks)(secondary.blocks, { config, historyMatchedIndices: (0, history_1.matchedIndices)((0, history_1.matchBlocks)(secondary.blocks, history)), senderTokens })
|
|
372
|
+
: null;
|
|
373
|
+
(0, reconcile_1.reconcileSection)(section.choice.primary.representation, slice, secondaryDecisions);
|
|
199
374
|
}
|
|
200
|
-
const decisions = (0, reconcile_1.reconcile)(outcome);
|
|
201
375
|
const segments = toSegments(decisions, config);
|
|
376
|
+
const primary = segmented[0].choice.primary;
|
|
377
|
+
if (!segments.length) {
|
|
378
|
+
// A body part existed and yielded nothing a reader would have seen: scripts, styles,
|
|
379
|
+
// comments, a tracking pixel, or markup that could not be parsed. An empty result with
|
|
380
|
+
// no explanation is indistinguishable from content loss, so name the case. Additive,
|
|
381
|
+
// and never a substitute for returning content that does exist.
|
|
382
|
+
warnings.push({ code: 'no_visible_body_text', mimePart: decisions[0]?.block.mimePart ?? primary.representation.toUpperCase() });
|
|
383
|
+
}
|
|
202
384
|
const visible = segments.filter(segment => segment.visibility !== 'hide');
|
|
203
385
|
const hidden = segments.filter(segment => segment.visibility === 'hide');
|
|
386
|
+
const anyDegraded = segmented.some(section => section.choice.primary.degraded);
|
|
204
387
|
// Invariant: a message with body text always yields something visible.
|
|
205
388
|
const bodyHasText = decisions.some(decision => decision.block.content.trim().length > 0);
|
|
206
389
|
if (bodyHasText && !visible.length) {
|
|
@@ -214,26 +397,39 @@ async function analyze(content, options = {}) {
|
|
|
214
397
|
...base,
|
|
215
398
|
segments,
|
|
216
399
|
hiddenSegments: [],
|
|
217
|
-
overallConfidence:
|
|
400
|
+
overallConfidence: DEGRADED_CONFIDENCE,
|
|
218
401
|
warnings,
|
|
219
|
-
primaryRepresentation:
|
|
402
|
+
primaryRepresentation: primary.representation,
|
|
220
403
|
historyUsed: history.length > 0,
|
|
221
|
-
...(options.explain ? { diagnostics: buildDiagnostics(
|
|
404
|
+
...(options.explain ? { diagnostics: buildDiagnostics(documentBlocks, decisions) } : {})
|
|
222
405
|
};
|
|
223
406
|
}
|
|
224
407
|
return {
|
|
225
408
|
...base,
|
|
226
409
|
segments: visible,
|
|
227
410
|
hiddenSegments: hidden,
|
|
228
|
-
|
|
411
|
+
// A degraded section never reports full confidence, including when its projection was
|
|
412
|
+
// empty and there is nothing to report confidence about. Claiming 1 for a body the
|
|
413
|
+
// pipeline could not read would be the most misleading number in the result.
|
|
414
|
+
overallConfidence: anyDegraded ? Math.min(DEGRADED_CONFIDENCE, (0, confidence_1.overallConfidence)(segments)) : (0, confidence_1.overallConfidence)(segments),
|
|
229
415
|
warnings,
|
|
230
|
-
primaryRepresentation:
|
|
416
|
+
primaryRepresentation: primary.representation,
|
|
231
417
|
historyUsed: history.length > 0,
|
|
232
|
-
...(options.explain ? { diagnostics: buildDiagnostics(
|
|
418
|
+
...(options.explain ? { diagnostics: buildDiagnostics(documentBlocks, decisions) } : {})
|
|
233
419
|
};
|
|
234
420
|
}
|
|
235
421
|
catch (err) {
|
|
236
|
-
|
|
422
|
+
// Whatever went wrong, the caller still gets their content back, whole and visible.
|
|
423
|
+
//
|
|
424
|
+
// The source reference names the representation and part the surviving text actually came
|
|
425
|
+
// from. It used to be hardcoded to `TEXT`/`text` even when the content was HTML, which is a
|
|
426
|
+
// traceability bug of the same family as losing the content outright: a reviewer following
|
|
427
|
+
// it lands on a part that never held this text.
|
|
428
|
+
const first = sections[0];
|
|
429
|
+
const text = typeof first?.text === 'string' ? first.text : '';
|
|
430
|
+
const html = typeof first?.html === 'string' ? first.html : '';
|
|
431
|
+
const fromText = Boolean(text.trim());
|
|
432
|
+
const fallback = fromText ? text : html;
|
|
237
433
|
return {
|
|
238
434
|
...base,
|
|
239
435
|
segments: fallback.trim()
|
|
@@ -241,15 +437,22 @@ async function analyze(content, options = {}) {
|
|
|
241
437
|
{
|
|
242
438
|
type: 'UNKNOWN',
|
|
243
439
|
text: fallback,
|
|
244
|
-
confidence:
|
|
440
|
+
confidence: DEGRADED_CONFIDENCE,
|
|
245
441
|
visibility: 'show',
|
|
246
442
|
reasons: ['degraded_to_unknown'],
|
|
247
|
-
source: {
|
|
443
|
+
source: {
|
|
444
|
+
kind: 'mime-part',
|
|
445
|
+
mimePart: (fromText ? first?.textPartId : first?.htmlPartId) ?? (fromText ? 'TEXT' : 'HTML'),
|
|
446
|
+
representation: fromText ? 'text' : 'html',
|
|
447
|
+
blockIndex: 0,
|
|
448
|
+
start: 0,
|
|
449
|
+
end: fallback.length
|
|
450
|
+
}
|
|
248
451
|
}
|
|
249
452
|
]
|
|
250
453
|
: [],
|
|
251
454
|
hiddenSegments: [],
|
|
252
|
-
overallConfidence:
|
|
455
|
+
overallConfidence: DEGRADED_CONFIDENCE,
|
|
253
456
|
warnings: [...warnings, { code: 'extraction_degraded', detail: err instanceof Error ? err.message.slice(0, 200) : 'unknown' }],
|
|
254
457
|
primaryRepresentation: 'none',
|
|
255
458
|
historyUsed: history.length > 0
|
package/dist/analyze.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AAuIH,4CAaC;AA2ND,wCAkBC;AAQD,0BAmNC;AA1lBD,2CAAmD;AACnD,gDAAiD;AACjD,uDAA0D;AAC1D,uDAA0D;AAE1D,4CAAkD;AAClD,oDAAkH;AAClH,sDAA0H;AAC1H,6CAA2I;AAC3I,iDAAsD;AACtD,6CAAqG;AACrG,mCAAiJ;AAqGjJ,MAAM,aAAa,GAAG,6DAA6D,CAAC;AAEpF,SAAS,YAAY,CAAC,MAAwB;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,SAAS,CAAC,MAAwB;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACvB,KAAK,CAAC,QAAQ,CAAC,IAAI,CACf,QAAQ,CAAC,EAAE,CACP,QAAQ,CAAC,IAAI,KAAK,cAAc,IAAI,QAAQ,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,iBAAiB,IAAI,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,CACnJ,CACJ,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,IAA+B;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,EAAE,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,GAAG,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACxG,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACvB,CAAC;AAED,yFAAyF;AACzF,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,SAAS,kBAAkB,CAAC,MAAe,EAAE,cAA+B,EAAE,QAAiB;IAC3F,OAAO;QACH,cAAc;QACd,MAAM;QACN,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC;QAClC,wFAAwF;QACxF,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;QAC/C,QAAQ;KACX,CAAC;AACN,CAAC;AAED,+FAA+F;AAC/F,MAAM,yBAAyB,GAAa,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAgBzG,oGAAoG;AACpG,SAAS,UAAU,CAAC,SAA4C,EAAE,MAAwB;IACtF,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAA,0BAAa,EAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAE9E,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,IAAI,IAAA,kBAAU,EAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvI,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;YACrF,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;YACvD,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;YAChC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YACzE,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;YACL,CAAC;YACD,SAAS;QACb,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,SAAS;QACb,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ,CAAC,KAAK;YACpB,IAAI,EAAE,KAAK,CAAC,OAAO;YACnB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,UAAU;YACV,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC9B,MAAM,EAAE;gBACJ,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,gFAAgF;gBAChF,kFAAkF;gBAClF,UAAU,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK;gBAC5C,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD;SACJ,CAAC,CAAC;IACP,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,cAAc,CAAC,KAAgC;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,wBAAwB,CAAC,CAAc,EAAE,CAAc;IAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,KAAa,CAAC;IAClB,IAAI,MAAc,CAAC;IACnB,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACrC,KAAK,GAAG,KAAK,CAAC;QACd,MAAM,GAAG,KAAK,CAAC;IACnB,CAAC;SAAM,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5C,KAAK,GAAG,KAAK,CAAC;QACd,MAAM,GAAG,KAAK,CAAC;IACnB,CAAC;SAAM,CAAC;QACJ,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,IAAA,2BAAiB,EAAC,IAAA,6BAAiB,EAAC,KAAK,CAAC,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAA,2BAAiB,EAAC,IAAA,6BAAiB,EAAC,IAAA,sBAAe,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,IAAA,qBAAW,EAAC,IAAI,CAAC,IAAI,CAAC,IAAA,qBAAW,EAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,uDAAuD;QACvD,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,IAAA,qBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC,WAAW,IAAI,+BAAqB,IAAI,IAAA,qBAAW,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC,WAAW,IAAI,+BAAqB,CAAC;AAC1I,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgC;IAC7D,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,QAAQ,IAAI,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;gBACxB,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI;gBAC3C,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI;gBAC3C,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjH,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjH,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD,CAAC;YACF,SAAS;QACb,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,OAAuB;IAC9C,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAEpG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,IAAI,gBAAgB,EAAE,CAAC;YACnB,MAAM,IAAI,0BAAkB,CAAC,UAAU,EAAE,uEAAuE,EAAE,wBAAwB,CAAC,CAAC;QAChJ,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,0BAAkB,CAAC,UAAU,EAAE,yDAAyD,EAAE,sBAAsB,CAAC,CAAC;QAChI,CAAC;QACD,OAAO,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrI,CAAC;IAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO;QACH;YACI,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,IAAI,EAAE,SAAS;SAClB;KACJ,CAAC;AACN,CAAC;AAED,4EAA4E;AAC5E,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAE5C,SAAS,uBAAuB,CAAC,KAAyB;IACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,yBAAyB,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,0BAAkB,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,QAAgC,EAAE,eAAuB,EAAE,QAAmB;IACjG,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QACvE,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,IAAI,GAAG,eAAe,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,oBAAoB,eAAe,GAAG,EAAE,CAAC,CAAC;YAChG,MAAM;QACV,CAAC;QACD,IAAI,IAAI,IAAI,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,oBAAoB,eAAe,GAAG,EAAE,CAAC,CAAC;YAChG,MAAM;QACV,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,8EAA8E;AACvE,KAAK,UAAU,cAAc,CAAC,OAAuB;IACxD,IAAI,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,GAAI,OAAO,CAAC,OAAyD,CAAC,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC;YACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,SAAS,CAAC,IAAI,CAAC,MAAM,IAAA,8BAAoB,EAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9E,CAAC;iBAAM,IAAI,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,IAAI,CAAC,IAAA,yCAA+B,EAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/G,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,uDAAuD;QAC3D,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,OAAO,CAAC,OAAuB,EAAE,UAA0B,EAAE;IAC/E,wEAAwE;IACxE,EAAE;IACF,gGAAgG;IAChG,4FAA4F;IAC5F,6FAA6F;IAC7F,uFAAuF;IACvF,IAAA,uBAAY,GAAE,CAAC;IAEf,6FAA6F;IAC7F,sFAAsF;IACtF,MAAM,MAAM,GAAG,IAAA,qCAAwB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,uBAAuB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,MAAM,QAAQ,GAAG,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAEjI,MAAM,IAAI,GAAG;QACT,iBAAiB,EAAE,IAAa;QAChC,gBAAgB,EAAE,yBAAiB;QACnC,OAAO;KACV,CAAC;IAEF,MAAM,KAAK,GAAG;QACV,GAAG,IAAI;QACP,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,EAAE;QAClB,iBAAiB,EAAE,CAAC;QACpB,qBAAqB,EAAE,MAAe;QACtC,WAAW,EAAE,KAAK;KACrB,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,OAAO,GAAsB,EAAE,CAAC;IACpC,IAAI,CAAC;QACD,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACL,oEAAoE;IACxE,CAAC;IAED,IAAI,CAAC;QACD,sFAAsF;QACtF,MAAM,SAAS,GAAuB,EAAE,CAAC;QACzC,MAAM,cAAc,GAAY,EAAE,CAAC;QAEnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,WAAW,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAEzE,IAAI,QAAQ,GAA8B,IAAI,CAAC;YAC/C,IAAI,QAAQ,GAA8B,IAAI,CAAC;YAE/C,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,IAAA,+BAAiB,EAAC,WAAW,EAAE,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC,MAAM,CAAC;gBACnF,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;gBAChD,MAAM,MAAM,GAAG,IAAA,+BAAiB,EAAC,WAAW,EAAE,UAAU,CAAC,CAAC;gBAC1D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;gBACtE,CAAC;gBACD,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACzB,SAAS;YACb,CAAC;YAED,MAAM,MAAM,GAAG,IAAA,uBAAW,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC;YACpC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxC,iFAAiF;gBACjF,4EAA4E;gBAC5E,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC;gBAChC,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC;gBACpC,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC9B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBACnD,CAAC;gBACD,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QACnG,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;QAC5E,CAAC;QAED,0FAA0F;QAC1F,8EAA8E;QAC9E,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,KAAK,CAAC,QAAQ,CAAC,YAAY,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1E,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAA,qBAAW,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,SAAS,GAAG,IAAA,sBAAc,EAAC,cAAc,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAA,wBAAc,EAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QAE3H,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAClC,kFAAkF;gBAClF,iFAAiF;gBACjF,iFAAiF;gBACjF,iDAAiD;gBACjD,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;oBAC3B,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC;oBAC3B,QAAQ,CAAC,UAAU,GAAG,mBAAmB,CAAC;oBAC1C,QAAQ,CAAC,OAAO,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBAC/C,CAAC;gBACD,SAAS;YACb,CAAC;YACD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;YAC3C,MAAM,kBAAkB,GAAG,SAAS;gBAChC,CAAC,CAAC,IAAA,sBAAc,EAAC,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAA,wBAAc,EAAC,IAAA,qBAAW,EAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;gBAC3I,CAAC,CAAC,IAAI,CAAC;YACX,IAAA,4BAAgB,EAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAI,SAAS,CAAC,CAAC,CAAsB,CAAC,MAAM,CAAC,OAAO,CAAC;QAElE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnB,qFAAqF;YACrF,uFAAuF;YACvF,qFAAqF;YACrF,gEAAgE;YAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACpI,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE/E,uEAAuE;QACvE,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzF,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,4CAA4C,EAAE,CAAC,CAAC;YACrG,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC7B,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;gBAC5B,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;gBACzB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAChD,CAAC;YACD,OAAO;gBACH,GAAG,IAAI;gBACP,QAAQ;gBACR,cAAc,EAAE,EAAE;gBAClB,iBAAiB,EAAE,mBAAmB;gBACtC,QAAQ;gBACR,qBAAqB,EAAE,OAAO,CAAC,cAAc;gBAC7C,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;gBAC/B,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3F,CAAC;QACN,CAAC;QAED,OAAO;YACH,GAAG,IAAI;YACP,QAAQ,EAAE,OAAO;YACjB,cAAc,EAAE,MAAM;YACtB,sFAAsF;YACtF,mFAAmF;YACnF,6EAA6E;YAC7E,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAA,8BAAiB,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,8BAAiB,EAAC,QAAQ,CAAC;YACzH,QAAQ;YACR,qBAAqB,EAAE,OAAO,CAAC,cAAc;YAC7C,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3F,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,oFAAoF;QACpF,EAAE;QACF,0FAA0F;QAC1F,4FAA4F;QAC5F,2FAA2F;QAC3F,gDAAgD;QAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,OAAO;YACH,GAAG,IAAI;YACP,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;gBACrB,CAAC,CAAC;oBACI;wBACI,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,mBAAmB;wBAC/B,UAAU,EAAE,MAAM;wBAClB,OAAO,EAAE,CAAC,qBAAqB,CAAC;wBAChC,MAAM,EAAE;4BACJ,IAAI,EAAE,WAAW;4BACjB,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;4BAC5F,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;4BAC1C,UAAU,EAAE,CAAC;4BACb,KAAK,EAAE,CAAC;4BACR,GAAG,EAAE,QAAQ,CAAC,MAAM;yBACvB;qBACJ;iBACJ;gBACH,CAAC,CAAC,EAAE;YACR,cAAc,EAAE,EAAE;YAClB,iBAAiB,EAAE,mBAAmB;YACtC,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YAC9H,qBAAqB,EAAE,MAAM;YAC7B,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;SAClC,CAAC;IACN,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAwB,EAAE,SAA4C;IAC5F,OAAO;QACH,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,IAAI;QACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK;YAC3B,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;YACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1G,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,QAA8C;YACvE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAChD,CAAC,CAAC;KACN,CAAC;AACN,CAAC"}
|
package/dist/canonical/html.d.ts
CHANGED
|
@@ -7,14 +7,33 @@
|
|
|
7
7
|
* hints this module looks for are literal class and id names, so a scan over the source is both
|
|
8
8
|
* cheaper and more faithful than a DOM query, which would silently normalise malformed markup.
|
|
9
9
|
*/
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Decode HTML entities. Unknown entities are left as written rather than dropped.
|
|
12
|
+
*
|
|
13
|
+
* Both alternatives are length bounded so the pass stays linear on hostile input: a numeric
|
|
14
|
+
* reference longer than twelve digits cannot name a code point, and an unbounded `+` there would
|
|
15
|
+
* backtrack across the whole run of digits that follows an unterminated `&#`.
|
|
16
|
+
*/
|
|
11
17
|
export declare function decodeEntities(input: string): string;
|
|
12
18
|
/**
|
|
13
19
|
* Cheap text projection of an HTML body.
|
|
14
20
|
*
|
|
15
21
|
* Good enough for language estimation, marker detection and length statistics. It is not a
|
|
16
22
|
* replacement for the extraction pipeline's DOM walk, and it deliberately keeps blank lines so that
|
|
17
|
-
* paragraph structure survives.
|
|
23
|
+
* paragraph structure survives. It is emphatically **not** a sanitiser: it produces a non executing
|
|
24
|
+
* textual view, and says nothing about whether the source markup is safe to render.
|
|
25
|
+
*
|
|
26
|
+
* Written as a character scanner rather than a chain of regular expressions because the obvious
|
|
27
|
+
* `/<[^>]*>/g` form is quadratic on unmatched `<`: every one of them rescans to end of input looking
|
|
28
|
+
* for a closing delimiter that is not there. Measured at 5.8 seconds on 128k `<` characters, and
|
|
29
|
+
* doubling the input quadrupled it. This is the projection the malformed HTML fallback uses, so it
|
|
30
|
+
* is reached by exactly the input that triggers the quadratic case.
|
|
31
|
+
*
|
|
32
|
+
* Every code unit is visited a constant number of times. A construct that never closes is charged
|
|
33
|
+
* to the input it covers: the scanned window is emitted as visible text and the cursor moves past
|
|
34
|
+
* it, rather than resuming one character later and reading the same suffix again. Emitting it keeps
|
|
35
|
+
* the projection on the safe side of the project's asymmetry, and matches what the previous regular
|
|
36
|
+
* expression did with an unterminated trailing tag.
|
|
18
37
|
*/
|
|
19
38
|
export declare function stripTagsToText(html: string): string;
|
|
20
39
|
/** Structural hints found in an HTML body, keyed by the id used in html-clients.json. */
|