diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d0957a8e..1998a0802 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,38 @@ follow semantic versioning; release dates are ISO 8601. ### Public API +- **A DOCX export raises a line Word sets low into the space above it, where both editors keep + it.** Both editors stand an exact line's baseline four fifths of the way down it whatever the + face — measured on the fifteen faces the templates use and JetBrains Mono, 8 to 36pt — and the + page sets it the face's ascent below the line's top. The text was moved to the page's baseline by + its position, which counts in half points and was left alone under half a point: by its position + alone Helvetica's lines, which the page seats 0.78 of the way down, stood 0.12 to 0.38pt low in + Word. And LibreOffice moves raised text further than it is raised, by the face's height over its + em — Spectral's 1.53 times, Poppins' 1.49, Volkhov's 1.31 (measured) — so Spectral's 24pt line, + raised 4pt, stood 2.4pt high there (measured). + - A line Word sets low by a tenth of a point or more is moved up into the space written above + it, written to the twip, and that space is owed below it, so what follows stays where it was. + Both editors keep a paragraph's space above as written. What the space cannot give is left to + the position where the whole difference calls for one, as is a line Word sets high: moved + down, it would take its room out of the space below it, which is not known when it is written. + - A column's later layer, which measures the space to itself from the page, takes back the raise + of the line above it. + - Not a line pair's shared line, which moved would move its other half; not a line in an + overlay — a band, a layer stack, a shape container, a canvas, a text box — whose writers + measure what follows them from the page; not a line cut to fit, a container's stacked lines or + one held to its pictures; not a paragraph the layout moves to a new page, whose space above + Word drops there, or breaks over one, whose lines on the next page the space above does not + move; and not into the space above a panel's first line that its top border takes. + + In the DOCX fidelity corpus 27 documents stand nearer the page in Word, the sum of the medians + 1.65pt nearer — `letter-blue_banner`'s median line from 0.39pt to 0.18pt, `cv-modern_professional`'s + from 0.32pt to 0.18pt — and 21 in LibreOffice on Windows, `cv-modern_professional`'s from 0.28pt + to 0.04pt. Two move a step of Word's grid further: `invoice-luma_studio`'s company lines, raised + where the page sets them, now show their block standing 0.2 to 0.3pt high (median 0.13pt to + 0.14pt), + and `letter-panel`'s median from 0.14pt to 0.16pt; in LibreOffice two medians move 0.01pt. The + report names nothing more. + - **A DOCX export no longer stands what follows a width anchor, or a paragraph Word sets taller, lower than the page.** Both reached past the block in Word, and neither was taken out of the space below or named. Each now hangs below its block, as a line held to its icon does: the diff --git a/assets/readme/examples/word-export-companion.docx b/assets/readme/examples/word-export-companion.docx index d1c8545af..944d2de0e 100644 Binary files a/assets/readme/examples/word-export-companion.docx and b/assets/readme/examples/word-export-companion.docx differ diff --git a/docs/architecture/backend-capability-matrix.md b/docs/architecture/backend-capability-matrix.md index 35ac09ef4..d285452c3 100644 --- a/docs/architecture/backend-capability-matrix.md +++ b/docs/architecture/backend-capability-matrix.md @@ -63,7 +63,7 @@ Payload records live in `core` under | Capability (payload) | PDF (fixed) | PPTX (fixed) | DOCX (semantic) | |---|---|---|---| -| Paragraph — pre-wrapped lines, runs, alignment (`ParagraphFragmentPayload`) | ✅ `PdfParagraphFragmentRenderHandler` | ✅ `PptxParagraphFragmentRenderHandler` (one absolute, wrap-disabled frame per measured line) | ⚠️ semantic paragraphs (`DocxSemanticBackend`) — each run keeps its own style, falling back to the paragraph's when it has none; a centred or right-aligned left-to-right line of its own, of text alone and untracked, that Word sets a point or more wider or narrower at its half-point size has its letters spaced by the difference (`w:spacing`) and its room reckoned from the page's width; a `linkTarget` becomes a `w:hyperlink`, with a relationship for an address or `w:anchor` for one of the document's own anchors, and a run's own link wins over the paragraph's; a paragraph seated off its baseline (`TextVerticalAlign`) has its runs raised or lowered in the line (`w:position`) by the PDF backend's own correction (`ParagraphSeating`), one shift for the paragraph where the page seats each line by its own; Word and LibreOffice stand an exact line's baseline four fifths of the way down it whatever the face, where the page sets it the face's ascent down, so a paragraph whose face puts the two half a point or more apart — Spectral's, not Lato's — has its text moved to the page's baseline in the same position, matched at its middle line (not yet a list item's or a table text cell's; a picture among it moves with it in Word and stays on its own baseline in LibreOffice); lines a container stacks over one another tighter than their face each end halfway between their letters and the next line's (Word draws an exact line's text on screen only inside the line; its PDF export does not cut it), and the last layer of a shape container on one page, where its line runs past the foot, ends at the foot or below its letters; letters two lines share are split halfway so the page does not move, and a stack that holds a picture keeps its lines' own heights; a `bulletOffset` of spaces becomes the paragraph's indent (`w:ind` left, hanging or first line, by `indentStrategy`) in the flow and in cells, not yet over the flow, in an overlay's left-and-right pair, as a badge's initials or in a header or footer; one with letters in it is not written, its wrapped lines still set after the spaces that cover it; an auto-sized paragraph's text that takes its style is written at the size the page fits it to, read off the laid-out lines, a run with a style of its own keeping it, on every path that writes a paragraph — at its style's size where the lines do not tell the fitted size (no lines read, lines in sizes that do not say which is the paragraph's, or one paragraph added at more than one place); a paragraph a session reads as markdown — the default, unless `markdown(false)` — is written as the page sets it, read through the page's own parser, one run a piece in the face, family, colour, tracking and size the page's laid-out lines hold (an auto-sized one's read at the size the page fits it to, a heading at its multiple of it), its marks dropped, wherever the lines hold the pieces' letters so; where they are not read, or hold other letters or none (text the parser reads into nothing, which the page sets as nothing), as authored, its marks as letters; a `bookmark(...)` is Word's `HeadingN`, which Word's outline lists by the text of its Word paragraph — an overlay's pair's whole line, one level for both sides — at no level past the ninth. Outside a header or footer, the paragraph's report note (`ParagraphNode`) names each of these where it moves or renames something: the prefix's letters, and the room a path that writes no prefix leaves out where it moves a line; the size an auto-sized paragraph's text is written at, where the size the page fits it to is not measured; the marks of a paragraph the page read as markdown and the file holds as letters, where its laid-out lines hold fewer of them than its text, not measured where its lines are not read; a markdown heading written taller than the line the page sets it in, which Word cuts on screen; an outline title that is not the text Word lists, a level past the ninth that shares it with another, and the right side's entry where the left holds the line's level | +| Paragraph — pre-wrapped lines, runs, alignment (`ParagraphFragmentPayload`) | ✅ `PdfParagraphFragmentRenderHandler` | ✅ `PptxParagraphFragmentRenderHandler` (one absolute, wrap-disabled frame per measured line) | ⚠️ semantic paragraphs (`DocxSemanticBackend`) — each run keeps its own style, falling back to the paragraph's when it has none; a centred or right-aligned left-to-right line of its own, of text alone and untracked, that Word sets a point or more wider or narrower at its half-point size has its letters spaced by the difference (`w:spacing`) and its room reckoned from the page's width; a `linkTarget` becomes a `w:hyperlink`, with a relationship for an address or `w:anchor` for one of the document's own anchors, and a run's own link wins over the paragraph's; a paragraph seated off its baseline (`TextVerticalAlign`) has its runs raised or lowered in the line (`w:position`) by the PDF backend's own correction (`ParagraphSeating`), one shift for the paragraph where the page seats each line by its own; Word and LibreOffice stand an exact line's baseline four fifths of the way down it whatever the face, where the page sets it the face's ascent down, matched at a paragraph's middle line: a line of its own Word sets a tenth of a point or more low is moved up into the space written above it and that space owed below it, in the flow and in cells, not in an overlay, a paragraph the layout moves to a new page or breaks over one, nor the space a panel's top border takes above its first line; what that space cannot give, and a line Word sets high, is moved in the same position where the two are half a point or more apart — Spectral's, not Lato's — which LibreOffice moves further by the face's height over its em (not yet a list item's or a table text cell's; a picture among it moves with it in Word and stays on its own baseline in LibreOffice); lines a container stacks over one another tighter than their face each end halfway between their letters and the next line's (Word draws an exact line's text on screen only inside the line; its PDF export does not cut it), and the last layer of a shape container on one page, where its line runs past the foot, ends at the foot or below its letters; letters two lines share are split halfway so the page does not move, and a stack that holds a picture keeps its lines' own heights; a `bulletOffset` of spaces becomes the paragraph's indent (`w:ind` left, hanging or first line, by `indentStrategy`) in the flow and in cells, not yet over the flow, in an overlay's left-and-right pair, as a badge's initials or in a header or footer; one with letters in it is not written, its wrapped lines still set after the spaces that cover it; an auto-sized paragraph's text that takes its style is written at the size the page fits it to, read off the laid-out lines, a run with a style of its own keeping it, on every path that writes a paragraph — at its style's size where the lines do not tell the fitted size (no lines read, lines in sizes that do not say which is the paragraph's, or one paragraph added at more than one place); a paragraph a session reads as markdown — the default, unless `markdown(false)` — is written as the page sets it, read through the page's own parser, one run a piece in the face, family, colour, tracking and size the page's laid-out lines hold (an auto-sized one's read at the size the page fits it to, a heading at its multiple of it), its marks dropped, wherever the lines hold the pieces' letters so; where they are not read, or hold other letters or none (text the parser reads into nothing, which the page sets as nothing), as authored, its marks as letters; a `bookmark(...)` is Word's `HeadingN`, which Word's outline lists by the text of its Word paragraph — an overlay's pair's whole line, one level for both sides — at no level past the ninth. Outside a header or footer, the paragraph's report note (`ParagraphNode`) names each of these where it moves or renames something: the prefix's letters, and the room a path that writes no prefix leaves out where it moves a line; the size an auto-sized paragraph's text is written at, where the size the page fits it to is not measured; the marks of a paragraph the page read as markdown and the file holds as letters, where its laid-out lines hold fewer of them than its text, not measured where its lines are not read; a markdown heading written taller than the line the page sets it in, which Word cuts on screen; an outline title that is not the text Word lists, a level past the ninth that shares it with another, and the right side's entry where the left holds the line's level | | List hanging indent — a marker column and a content column (`ListBuilder.hangingIndent(true)`, `markerGap(...)`) | ✅ marker and content emitted as separate `ParagraphFragmentPayload` fragments at the resolved `markerX` / `contentX` | ✅ the same fragments — the fixed-layout pipeline resolves the geometry before either backend sees it | ⚠️ the top level only. `DocxSemanticBackend` exports a list as a real Word list — `numbering.xml`, `w:numPr` per item, the level carrying the marker — or, with rich items or a drawn marker, as paragraphs; content and nesting are unaffected. With the flag, the top level's marker column is the layout's — the marker's width and `markerGap`, the text and its wrapped lines where the page sets them — where the gap covers what Word may set the marker wider: a picture at its written size, its edges included, or text in the page's face (embedded, or a standard one Word sets in the same widths) grown to its half-point size, half a point clear. A Word list's level then indents and hangs by that column; a list of paragraphs writes the marker, a tab to a stop there, and hangs the item there. Word places content at absolute indents and has no relative-advance primitive, so without the layout's measure the gap could not be honoured; a Word list without the flag that the layout placed and that does not nest takes the page's column too, the spaces the page sets its wrapped lines after, its marker followed by a space (`w:suff`) and an item that wraps measured at Word's half-point size; a list that nests items, a list built as a tree of items (laid out flattened), and a marker the gap does not clear keep the stated column (180 twips, plus 120 per nesting level) — except, in a list of paragraphs, a nested rich item with no marker, which stands where the layout set its text, its measure weighed at Word's half-point sizes, where the layout's items are matched to the list's; a list that nests only such items sets its top level at the page's column too. The report counts, on the list, the items that stand at a stated column, a space past their marker or two spaces a level in, and names a centred or right-aligned list written flush left, a lineSpacing not written where the layout's items are not the list's own and one wraps (in a list composed in a table cell, its wrapping not measured), a continuationIndent not written where an item of a markerless list or a tree of items without the flag wraps or its wrapping is not measured, the rows the page draws as a marker alone for blank items of a flagged list, which are not written, and what items the page reads as markdown lose. An item of plain text the page reads as markdown — the default, unless `markdown(false)` — is written as the page sets it, matched to the lines the page laid it out in and read as the page lays it out (a flat item after the marker the page sets before it; a flagged item as its text alone; an item of a list built as a tree of items without the flag after the indent and marker the page reads with it), one run a piece in the face, family, colour, tracking and size those lines hold, Word or the file drawing the marker where it did (Word draws a tree's bullets regular, as the parser sets the marker it reads), the font table shipping the faces the page sets the pieces in; it is written as authored, its marks as letters, where its list's items are not matched one by one to the layout's (no layout, composed in a table cell, an item run onto the next page, a flagged list with a blank item), where its lines hold other letters, where the parser reads a tree's marker as markdown with the item (`*a*`), and where the parser reads it into nothing, and named where the page drops a mark from it or sets none of its text — not where it changes only its face or letters no mark is made of (`1.`); a markdown heading written taller than its item's line is named | | Inline code/badge chips (`InlineBackground` on text spans) | ✅ `PdfParagraphFragmentRenderHandler` | ✅ `PptxParagraphFragmentRenderHandler` | ⚠️ `DocxSemanticBackend` — the fill becomes the run's own `w:shd`, in a paragraph and in a list item alike, so a badge still reads as a badge. What Word has no way to say is the shape: shading covers the glyph box, so the corner radius and the padding above and below the letters are not in the file, and the export records them. The padding beside the letters is written as the room it takes (`spaceAfterTheLastLetter`): character spacing after the chip's last letter, shaded with it, and after the letter before the chip, unshaded. A chip opening its line or following a picture has no letter before it, so its left padding is not in the file; no space is written after right-to-left letters or after a symbol or emoji. The export records, chip by chip, how each side was written. LibreOffice sets no spacing after a line's last letter, so it does not apply the right padding of a chip that ends a line. A `w:shd` fill is opaque, so a translucent chip is flattened first against what Word paints underneath it — the paragraph's shading, the cell's, or else the colour the page paints under the paragraph, a page background included — so the chip agrees with the file it is in and shows the colour the PDF shows. It stops being translucent, and that is recorded with the rest | | Inline images (`ParagraphImageSpan`) | ✅ `PdfParagraphFragmentRenderHandler` | ✅ `PptxParagraphFragmentRenderHandler` | ✅ `DocxSemanticBackend.writeInlinePicture` (a picture in its own run where it sits among the words, at its size, inside the run's or the paragraph's link; raised or lowered by `w:position` to where the page's alignment and `baselineOffset` put it, from the layout's measure of the paragraph's first line — in a list, the list's text on a line as tall as the item's own tallest picture; LibreOffice ignores `w:position` on a picture and stands it on the baseline, so a picture the export draws itself (icon, emoji, shape) that the page raises carries the rise as transparent rows and needs no `w:position`, while one the page lowers stands in LibreOffice higher than on the page by as much as the page lowers it — up to the text's descent for a centred icon as tall as its line; the editor clips a picture to an exact line height, so a paragraph holding a picture that leaves its text — past the ascent or the descent, in Word's placement or on the baseline — has its lines written at least the height the picture reaches, grown by the editor rather than clipped, every line of the paragraph since Word has one line height for it, and each as tall as the editor's font makes it — for 14pt text about 2.5pt taller than the page's in LibreOffice; a picture inside its text in both editors keeps the exact height; a paragraph of one line of text in a Word paragraph of its own, with room above for its pictures' reach, keeps an exact line at the page's height of it, the pictures set in it where the page puts them in Word and what their ink reaches past it taken from the gaps around it, and in LibreOffice a lowered picture there stands higher and loses what passes the line's top; its description is the text it stands for or empty) | diff --git a/docs/recipes/docx-export.md b/docs/recipes/docx-export.md index 7e4eec2a1..889c37d69 100644 --- a/docs/recipes/docx-export.md +++ b/docs/recipes/docx-export.md @@ -185,7 +185,7 @@ it cannot work out for itself: | What | Where it lands | |---|---| -| Line height | `w:spacing w:lineRule="exact"` on every paragraph, cells and list items included — the height the engine measured, not a multiple Word would measure again against a substituted font. Word has one height for a paragraph's lines: it is the tallest line's text, or, where the page sets lines of different heights further apart than that, the page's mean distance between their baselines, with what a paragraph on one page then falls short of the page owed below it, and what it passes the page by — written at its tallest line, a wrapped line after a large first one, which the page sets at its own height — hung below it, as a line held to its icon is: the space below takes it, and what it cannot take is named (`space above`) (not yet a list item's, or text set over the flow; measured: `CompactMono`'s sidebar, whose skills are two lines a paragraph and each written 0.12pt taller than the page, ended a point low in Word). Lines rounded up to the twip, over enough of them, hang the same way; what rounding takes from a paragraph written at its tallest line is not owed (measured: owed, it stood `ModernInvoice`'s lines lower in Word). A tenth of a point or less is left either way: Word sets lines on a grid of its own, 0.12pt apart (measured). In a paragraph of more than one line on one page, the spaces a `bulletOffset` sets before a line, written as an indent, do not count towards that line's text. A paragraph of lines as tall as their text, on one page, opening a table cell takes the gap above its first line from the cell's top padding, no more than steps its lines the page's distance apart — not in a row beside a merged cell or a cell opening with a table, whose margin Word would set the whole row at, nor in a panel. One with no room above it for the gap (opening a column, or a cell padded less) shares the gaps out over all its lines, so its lines stand a little closer than on the page. A paragraph the layout did not measure — one in a composed table cell — is left to the editor, and a line holding a picture above its text is written "at least" that height — except a paragraph of one line of text with room above for its pictures' reach, held exact at the page's height (see "Inline pictures"); in both the paragraph mark is set in the text's size and face, since the mark counts towards the last line's height. A line holding pictures and no text, where they fill the page's line, has its mark and its pictures' runs set at a point instead, so Word makes the line as tall as the pictures and no taller: in the paragraph's own size the mark's depth went under the picture (measured: `SlateOrange`'s skills, a 12.4pt icon beside each label, stood 0.2pt taller each in Word). A smaller picture in a line the page sets at its font's height keeps its mark, and so does a line holding a letter, a break, a tab, a field or a link's text. A paragraph's own line of drawn shapes and no text written at least their reach, which Word grows to the pictures and the transparent frame each keeps around its ink, has that frame taken from the space above the line and above what follows, where it passes the height written: the ink stands where the page draws it, and what follows where the page sets it. Both editors stand the baseline of an exact line four fifths of the way down it whatever the face (measured in Word and LibreOffice), and the page sets it the face's ascent below the line's top: where the two are half a point or more apart — a face with a deep descent, as Spectral's is — a paragraph's text is raised or lowered to the page's baseline by `w:position`, matched at its middle line; a list item's and a table text cell's are not yet. A picture among such text moves with it in Word; LibreOffice keeps a picture on its own baseline, where it stood before. Lines a container stacks tighter than their face — a title's lines a pitch apart — each end halfway between their letters and the next line's, since Word draws an exact line's text on screen only inside the line, and the last layer of a shape container, where its line runs past the foot, ends at the foot or below its letters | +| Line height | `w:spacing w:lineRule="exact"` on every paragraph, cells and list items included — the height the engine measured, not a multiple Word would measure again against a substituted font. Word has one height for a paragraph's lines: it is the tallest line's text, or, where the page sets lines of different heights further apart than that, the page's mean distance between their baselines, with what a paragraph on one page then falls short of the page owed below it, and what it passes the page by — written at its tallest line, a wrapped line after a large first one, which the page sets at its own height — hung below it, as a line held to its icon is: the space below takes it, and what it cannot take is named (`space above`) (not yet a list item's, or text set over the flow; measured: `CompactMono`'s sidebar, whose skills are two lines a paragraph and each written 0.12pt taller than the page, ended a point low in Word). Lines rounded up to the twip, over enough of them, hang the same way; what rounding takes from a paragraph written at its tallest line is not owed (measured: owed, it stood `ModernInvoice`'s lines lower in Word). A tenth of a point or less is left either way: Word sets lines on a grid of its own, 0.12pt apart (measured). In a paragraph of more than one line on one page, the spaces a `bulletOffset` sets before a line, written as an indent, do not count towards that line's text. A paragraph of lines as tall as their text, on one page, opening a table cell takes the gap above its first line from the cell's top padding, no more than steps its lines the page's distance apart — not in a row beside a merged cell or a cell opening with a table, whose margin Word would set the whole row at, nor in a panel. One with no room above it for the gap (opening a column, or a cell padded less) shares the gaps out over all its lines, so its lines stand a little closer than on the page. A paragraph the layout did not measure — one in a composed table cell — is left to the editor, and a line holding a picture above its text is written "at least" that height — except a paragraph of one line of text with room above for its pictures' reach, held exact at the page's height (see "Inline pictures"); in both the paragraph mark is set in the text's size and face, since the mark counts towards the last line's height. A line holding pictures and no text, where they fill the page's line, has its mark and its pictures' runs set at a point instead, so Word makes the line as tall as the pictures and no taller: in the paragraph's own size the mark's depth went under the picture (measured: `SlateOrange`'s skills, a 12.4pt icon beside each label, stood 0.2pt taller each in Word). A smaller picture in a line the page sets at its font's height keeps its mark, and so does a line holding a letter, a break, a tab, a field or a link's text. A paragraph's own line of drawn shapes and no text written at least their reach, which Word grows to the pictures and the transparent frame each keeps around its ink, has that frame taken from the space above the line and above what follows, where it passes the height written: the ink stands where the page draws it, and what follows where the page sets it. Both editors stand the baseline of an exact line four fifths of the way down it whatever the face (measured in Word and LibreOffice on the fifteen faces the templates use and JetBrains Mono, 8 to 36pt), and the page sets it the face's ascent below the line's top, matched at a paragraph's middle line. A line Word sets lower than the page by a tenth of a point or more is moved up into the space written above it, written to the twip, and that space is owed below it, so what follows stays where it was; both editors keep a paragraph's space above as written (by its position alone, Helvetica's lines, which the page seats 0.78 of the way down, stood 0.12 to 0.38pt low in Word). A column's later layer, which measures the space to itself from the page, takes back the raise of the line above it. Not a line pair's shared line, which moved would move its other half; not a line in an overlay — a band, a layer stack, a shape container, a canvas, a text box — whose writers measure what follows them from the page; not a line cut to fit, a container's stacked lines or one held to its pictures; not a paragraph the layout moves to a new page, whose space above Word drops there, or breaks over one; and not into the space above a panel's first line that its top border takes. What that space cannot give, and a line Word sets higher than the page — moved down, it would take its room out of the space below it, not known when it is written — is raised or lowered to the page's baseline by `w:position` where the whole difference is half a point or more, a face with a deep descent, as Spectral's is. A list item's and a table text cell's lines are not seated yet. LibreOffice moves text by `w:position` further than it is raised, by the face's height over its em — Spectral's 1.53 times, Poppins' 1.49, Volkhov's 1.31 (measured) — so a line raised by its position stands where the page sets it in Word only: Spectral's 24pt line, raised 4pt, stood 2.4pt high in LibreOffice. A picture among such text moves with it in Word; LibreOffice keeps a picture on its own baseline, where it stood before. Lines a container stacks tighter than their face — a title's lines a pitch apart — each end halfway between their letters and the next line's, since Word draws an exact line's text on screen only inside the line, and the last layer of a shape container, where its line runs past the foot, ends at the foot or below its letters | | Table columns | the resolved cell widths as `w:gridCol`, with `w:tblLayout` fixed so Word does not re-fit them | | Row columns | where the layout placed each child, with the row's gap and padding folded into the neighbouring column and taken back out as that cell's margin — in a painted row's panel the padding is the panel cell's margins instead, and the columns are without it. A column sized to its content (`DocumentRowColumn.auto()`) gets a point more, taken from the row's weight columns so the row keeps its width, for the reason a table's does: the editor's substitute font would wrap it — a table of contents' labels broke mid-word ("Intr" / "o") in LibreOffice without it. A row with no auto column, no weight column, or no stated columns (weights, an even split) is written as placed | diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv index 94db40d87..c481308bf 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv @@ -1,5 +1,5 @@ # libreoffice build 420(Build:2) on linux — document, line, drift below the page (pt), drift right of the page (pt), letters -cv-blue_banner 0:8f1010120ed6 0.42 1.90 jordanrivera +cv-blue_banner 0:8f1010120ed6 0.02 1.90 jordanrivera cv-blue_banner 0:8d7a2cca3060 -0.20 0.14 +442055551000|jordan.rivera@exam cv-blue_banner 0:b944906ed84c -0.20 -0.38 professionalsummary cv-blue_banner 0:8d6758a29c08 -0.51 0.10 platformengineerwith10+yearsbuil @@ -67,16 +67,16 @@ cv-boxed_sections 0:26671c309eb9 0.27 0.10 •distribution:mavencentral,sonat cv-boxed_sections 0:68bf0109c6f8 0.28 6.18 education cv-boxed_sections 0:0ad1957d6bab 0.28 0.10 msccomputerscience cv-boxed_sections 0:3fa772117260 0.24 -0.76 2019-2021 -cv-boxed_sections 0:47ce0218bbea 0.27 0.10 universityofmanchester -cv-boxed_sections 0:2ffe115b06e5 0.28 0.10 distinction.thesis:composablelay +cv-boxed_sections 0:47ce0218bbea 0.07 0.10 universityofmanchester +cv-boxed_sections 0:2ffe115b06e5 0.08 0.10 distinction.thesis:composablelay cv-boxed_sections 0:b6749d0b616b 0.31 0.10 bscsoftwareengineering cv-boxed_sections 0:30f9262640a0 0.28 -0.76 2015-2019 -cv-boxed_sections 0:89ad9656f393 0.30 0.10 imperialcollegelondon -cv-boxed_sections 0:baa173b4a82e 0.32 0.10 first-classhonours.specialisatio +cv-boxed_sections 0:89ad9656f393 0.10 0.10 imperialcollegelondon +cv-boxed_sections 0:baa173b4a82e 0.12 0.10 first-classhonours.specialisatio cv-boxed_sections 0:6d3d5673c39f 0.35 0.10 oraclejavacertification cv-boxed_sections 0:d40b22f00acb 0.31 -0.76 2023-2024 -cv-boxed_sections 0:2669e1f6d55c 0.34 0.10 professionaltrack -cv-boxed_sections 0:3857373829c1 0.35 0.10 java17platformdeep-dive:records, +cv-boxed_sections 0:2669e1f6d55c 0.14 0.10 professionaltrack +cv-boxed_sections 0:3857373829c1 0.15 0.10 java17platformdeep-dive:records, cv-boxed_sections 0:2577c0f557b2 0.37 6.18 projects cv-boxed_sections 0:b2b029995203 0.34 0.10 •graphcompose(java21,pdfbox,mave cv-boxed_sections 0:67593a76ef70 0.04 0.11 declarativejavapdflayoutengine.s @@ -91,26 +91,26 @@ cv-boxed_sections 0:e7e62230eb1f 0.38 0.11 editorial-magazinedocumenttoolki cv-boxed_sections 0:c2f296ef30a3 0.40 6.46 professionalexperience cv-boxed_sections 0:a76f47480818 0.39 0.10 seniorplatformengineer cv-boxed_sections 0:060300b18051 0.36 0.01 2024-present -cv-boxed_sections 0:f890faef907f 0.38 0.10 northwindsystems +cv-boxed_sections 0:f890faef907f 0.18 0.10 northwindsystems cv-boxed_sections 1:49faf14f1f56 -0.13 0.10 ledthereusabledocument-generatio cv-boxed_sections 1:6bd3f168e89e -0.13 0.10 maintenancetimeby70%byretiringpe cv-boxed_sections 1:daf65306b3b6 0.20 0.10 softwareengineer cv-boxed_sections 1:e7cc1822c6dc 0.17 -0.76 2021-2024 -cv-boxed_sections 1:998c1a985022 0.19 0.10 brightleaflabs +cv-boxed_sections 1:998c1a985022 -0.01 0.10 brightleaflabs cv-boxed_sections 1:e55664011cda -0.09 0.10 builtbackendservicesandproductio cv-boxed_sections 1:e80236b6d2b1 -0.09 0.10 itexttoacustomlayoutengine,elimi cv-boxed_sections 1:41bb54fbae8d 0.24 0.10 backendengineer cv-boxed_sections 1:3fa772117260 0.21 -0.76 2019-2021 -cv-boxed_sections 1:ef148f221e31 0.23 0.10 helixprintco +cv-boxed_sections 1:ef148f221e31 0.03 0.10 helixprintco cv-boxed_sections 1:9d31a6bfbc69 -0.05 0.10 maintainedahigh-volumeinvoice-pr cv-boxed_sections 1:03af8a628309 -0.05 0.10 change. cv-boxed_sections 1:676dfdd56ad2 0.27 6.49 additionalinformation -cv-boxed_sections 1:f20997652453 0.24 0.10 languages:english(fluent),german -cv-boxed_sections 1:ec9d3622395e 0.24 0.10 workeligibility:eligibletoworkin -cv-boxed_sections 1:dd20ae01c3cf 0.25 0.10 opensource:maintainerofgraphcomp -cv-boxed_sections 1:33c35e9d236d 0.25 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-centered_headline 0:8f1010120ed6 -0.50 2.39 jordanrivera -cv-centered_headline 0:87ca614d0eab -0.18 1.36 professionaltitle +cv-boxed_sections 1:f20997652453 0.04 0.10 languages:english(fluent),german +cv-boxed_sections 1:ec9d3622395e 0.04 0.10 workeligibility:eligibletoworkin +cv-boxed_sections 1:dd20ae01c3cf 0.05 0.10 opensource:maintainerofgraphcomp +cv-boxed_sections 1:33c35e9d236d 0.05 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-centered_headline 0:8f1010120ed6 -0.05 2.39 jordanrivera +cv-centered_headline 0:87ca614d0eab -0.03 1.36 professionaltitle cv-centered_headline 0:8d7a2cca3060 -0.23 0.28 +442055551000|jordan.rivera@exam cv-centered_headline 0:b944906ed84c -0.28 0.10 professionalsummary cv-centered_headline 0:f43d42692f27 0.06 0.10 platformengineerwith10+yearsbuil @@ -249,62 +249,62 @@ cv-charcoal_gold 0:058521fbf0d1 0.17 0.00 innovatechsystems cv-charcoal_gold 0:3def82282260 0.10 -0.71 technicaltools cv-charcoal_gold 0:eb04bd42c7fb 0.16 -1.19 microsoft365|jira|confluence|asa cv-classic_serif 0:8f1010120ed6 -0.15 2.60 jordanrivera -cv-classic_serif 0:8d7a2cca3060 0.19 -0.52 +442055551000|jordan.rivera@exam +cv-classic_serif 0:8d7a2cca3060 -0.01 -0.52 +442055551000|jordan.rivera@exam cv-classic_serif 0:3c69d6bb4892 0.24 20.27 professionalprofile -cv-classic_serif 0:32c1cf49a2fe 0.39 0.10 skills -cv-classic_serif 0:873a24d153c8 0.36 0.10 languages:java21,kotlin,groovy,p -cv-classic_serif 0:05e907ef2b18 0.34 0.10 document&print:pdfbox,apachepoi( -cv-classic_serif 0:76656a8a6621 0.31 0.10 layoutengines:customdsldesign,se -cv-classic_serif 0:1cd141fef347 0.29 0.10 build&infrastructure:maven,gradl -cv-classic_serif 0:181ddda7f959 0.26 0.10 testing:junit5,assertj,pdfbox-ba -cv-classic_serif 0:c40c656d9558 0.24 0.10 distribution:mavencentral,sonaty -cv-classic_serif 0:53e5e7c5a884 0.25 0.10 experience +cv-classic_serif 0:32c1cf49a2fe 0.19 0.10 skills +cv-classic_serif 0:873a24d153c8 0.21 0.10 languages:java21,kotlin,groovy,p +cv-classic_serif 0:05e907ef2b18 0.19 0.10 document&print:pdfbox,apachepoi( +cv-classic_serif 0:76656a8a6621 0.16 0.10 layoutengines:customdsldesign,se +cv-classic_serif 0:1cd141fef347 0.14 0.10 build&infrastructure:maven,gradl +cv-classic_serif 0:181ddda7f959 0.11 0.10 testing:junit5,assertj,pdfbox-ba +cv-classic_serif 0:c40c656d9558 0.09 0.10 distribution:mavencentral,sonaty +cv-classic_serif 0:53e5e7c5a884 0.05 0.10 experience cv-classic_serif 0:a76f47480818 0.26 0.10 seniorplatformengineer cv-classic_serif 0:060300b18051 0.23 0.26 2024-present -cv-classic_serif 0:f890faef907f 0.24 0.10 northwindsystems +cv-classic_serif 0:f890faef907f 0.04 0.10 northwindsystems cv-classic_serif 0:49faf14f1f56 0.01 0.10 ledthereusabledocument-generatio cv-classic_serif 0:6bd3f168e89e 0.00 0.10 maintenancetimeby70%byretiringpe cv-classic_serif 0:daf65306b3b6 0.28 0.10 softwareengineer cv-classic_serif 0:e7cc1822c6dc 0.25 1.12 2021-2024 -cv-classic_serif 0:998c1a985022 0.26 0.10 brightleaflabs +cv-classic_serif 0:998c1a985022 0.06 0.10 brightleaflabs cv-classic_serif 0:e55664011cda 0.03 0.10 builtbackendservicesandproductio cv-classic_serif 0:e80236b6d2b1 0.02 0.10 itexttoacustomlayoutengine,elimi cv-classic_serif 0:41bb54fbae8d 0.29 0.10 backendengineer cv-classic_serif 0:3fa772117260 0.26 1.12 2019-2021 cv-classic_serif 0:3fa772117260#1 0.28 1.12 2019-2021 -cv-classic_serif 0:ef148f221e31 0.27 0.10 helixprintco +cv-classic_serif 0:ef148f221e31 0.07 0.10 helixprintco cv-classic_serif 0:9d31a6bfbc69 0.04 0.10 maintainedahigh-volumeinvoice-pr cv-classic_serif 0:03af8a628309 0.03 0.10 change. -cv-classic_serif 0:2577c0f557b2 0.30 0.10 projects -cv-classic_serif 0:0f2c67872251 0.31 0.10 graphcompose(java21,pdfbox,maven +cv-classic_serif 0:2577c0f557b2 0.10 0.10 projects +cv-classic_serif 0:0f2c67872251 0.11 0.10 graphcompose(java21,pdfbox,maven cv-classic_serif 0:67593a76ef70 0.04 0.10 declarativejavapdflayoutengine.s cv-classic_serif 0:b9292cbd1454 0.03 0.10 pipelinesforhiringtoolsandbillin -cv-classic_serif 0:d73d02174dc9 0.30 0.10 templatestudio(kotlin,composedes -cv-classic_serif 0:836e76daecbf 0.28 0.10 internaltoolforevaluatingcv,prop -cv-classic_serif 0:542ec793b5b1 0.30 0.10 layoutlint(java21,javaparser,spo -cv-classic_serif 0:dc31b6a18325 0.28 0.10 staticanalyserthatflagsfragileau -cv-classic_serif 0:ee180ea1e0a5 0.30 0.10 chromeforge(java,graphcompose,pa -cv-classic_serif 0:e7e62230eb1f 0.28 0.10 editorial-magazinedocumenttoolki -cv-classic_serif 0:68bf0109c6f8 0.30 0.10 education +cv-classic_serif 0:d73d02174dc9 0.10 0.10 templatestudio(kotlin,composedes +cv-classic_serif 0:836e76daecbf 0.08 0.10 internaltoolforevaluatingcv,prop +cv-classic_serif 0:542ec793b5b1 0.10 0.10 layoutlint(java21,javaparser,spo +cv-classic_serif 0:dc31b6a18325 0.08 0.10 staticanalyserthatflagsfragileau +cv-classic_serif 0:ee180ea1e0a5 0.10 0.10 chromeforge(java,graphcompose,pa +cv-classic_serif 0:e7e62230eb1f 0.08 0.10 editorial-magazinedocumenttoolki +cv-classic_serif 0:68bf0109c6f8 0.10 0.10 education cv-classic_serif 0:0ad1957d6bab 0.31 0.10 msccomputerscience -cv-classic_serif 0:47ce0218bbea 0.29 0.10 universityofmanchester -cv-classic_serif 0:2ffe115b06e5 0.31 0.10 distinction.thesis:composablelay +cv-classic_serif 0:47ce0218bbea 0.09 0.10 universityofmanchester +cv-classic_serif 0:2ffe115b06e5 0.11 0.10 distinction.thesis:composablelay cv-classic_serif 0:b6749d0b616b 0.33 0.10 bscsoftwareengineering cv-classic_serif 0:30f9262640a0 0.30 1.12 2015-2019 cv-classic_serif 1:89ad9656f393 0.16 0.10 imperialcollegelondon -cv-classic_serif 1:baa173b4a82e 0.18 0.10 first-classhonours.specialisatio +cv-classic_serif 1:baa173b4a82e -0.02 0.10 first-classhonours.specialisatio cv-classic_serif 1:6d3d5673c39f 0.20 0.10 oraclejavacertification cv-classic_serif 1:d40b22f00acb 0.17 1.12 2023-2024 -cv-classic_serif 1:2669e1f6d55c 0.18 0.10 professionaltrack -cv-classic_serif 1:3857373829c1 0.20 0.10 java17platformdeep-dive:records, -cv-classic_serif 1:7b476727faf3 0.23 0.10 additional -cv-classic_serif 1:f20997652453 0.19 0.10 languages:english(fluent),german -cv-classic_serif 1:ec9d3622395e 0.17 0.10 workeligibility:eligibletoworkin -cv-classic_serif 1:dd20ae01c3cf 0.14 0.10 opensource:maintainerofgraphcomp -cv-classic_serif 1:33c35e9d236d 0.12 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-classic_serif 1:2669e1f6d55c -0.02 0.10 professionaltrack +cv-classic_serif 1:3857373829c1 0.00 0.10 java17platformdeep-dive:records, +cv-classic_serif 1:7b476727faf3 0.03 0.10 additional +cv-classic_serif 1:f20997652453 0.04 0.10 languages:english(fluent),german +cv-classic_serif 1:ec9d3622395e 0.02 0.10 workeligibility:eligibletoworkin +cv-classic_serif 1:dd20ae01c3cf -0.01 0.10 opensource:maintainerofgraphcomp +cv-classic_serif 1:33c35e9d236d -0.03 0.10 speaking:jvmsummit2024,devoxxuk2 cv-compact_mono 0:8f1010120ed6 0.31 0.10 jordanrivera cv-compact_mono 0:f9e4560bd641 -0.24 0.10 london,uk/+442055551000/jordan.r -cv-compact_mono 0:32c1cf49a2fe 0.24 0.10 skills +cv-compact_mono 0:32c1cf49a2fe 0.14 0.10 skills cv-compact_mono 0:551282493299 -0.11 0.10 languagesjava21,kotlin,groovy,py cv-compact_mono 0:8f5cfd05d621 -0.32 0.10 document&printpdfbox,apachepoi cv-compact_mono 0:148ff6990529 -0.21 0.10 (docx/xlsx),itext,postscript @@ -316,14 +316,14 @@ cv-compact_mono 0:d4ac2ee01f81 -0.26 0.10 testingjunit5,assertj,pdfbox-bas cv-compact_mono 0:b04e6ebfb02b -0.15 0.10 diff,layout-graphsnapshots cv-compact_mono 0:93c9f742ef14 -0.24 0.10 distributionmavencentral,sonatyp cv-compact_mono 0:8f21bd149ad7 -0.13 0.10 gpgsigning,jitpack -cv-compact_mono 0:68bf0109c6f8 0.33 0.10 education +cv-compact_mono 0:68bf0109c6f8 0.23 0.10 education cv-compact_mono 0:9ad8d9ef1711 -0.17 0.10 msccomputerscience/universityof cv-compact_mono 0:594f6dd11e20 -0.10 0.10 manchester/2019-2021 cv-compact_mono 0:387dc0387824 -0.17 0.10 bscsoftwareengineering/imperialc cv-compact_mono 0:453806946a88 -0.10 0.10 london/2015-2019 cv-compact_mono 0:7816e7a28b71 -0.17 0.10 oraclejavacertification/professi cv-compact_mono 0:d40b22f00acb 0.05 0.10 2023-2024 -cv-compact_mono 0:7b476727faf3 0.31 0.10 additional +cv-compact_mono 0:7b476727faf3 0.21 0.10 additional cv-compact_mono 0:ecc25e73b19b -0.20 0.10 languages:english(fluent),german cv-compact_mono 0:ac7f0ee6a49e -0.19 0.10 (intermediate),spanish(basic) cv-compact_mono 0:970ca9d789c2 -0.18 0.10 workeligibility:eligibletoworkin @@ -332,12 +332,12 @@ cv-compact_mono 0:8051a4b5e34f -0.16 0.10 opensource:maintainerofgraphcomp cv-compact_mono 0:08c2e869a75b -0.15 0.10 regularcontributortopdfboxissuet cv-compact_mono 0:12dcd1343975 -0.14 0.10 speaking:jvmsummit2024,devoxxuk2 cv-compact_mono 0:3aea7f90f8ed -0.13 0.10 —bothondeclarativedocumentlayout -cv-compact_mono 0:1900eab6c028 0.24 0.09 profile +cv-compact_mono 0:1900eab6c028 0.14 0.09 profile cv-compact_mono 0:3828b9718a0d -0.35 0.09 platformengineerwith10+yearsbuil cv-compact_mono 0:f6b5e93ccadd -0.34 0.09 engines,anddeveloper-facingtempl cv-compact_mono 0:927ef106776a -0.33 0.09 semanticauthoringdsls,andturning cv-compact_mono 0:330fcb75ed52 -0.32 0.09 librariesthatscale. -cv-compact_mono 0:53e5e7c5a884 0.31 0.09 experience +cv-compact_mono 0:53e5e7c5a884 0.21 0.09 experience cv-compact_mono 0:c9efb118bfda -0.04 0.09 seniorplatformengineer,northwind cv-compact_mono 0:64c4b52dceb1 -0.24 0.09 ledthereusabledocument-generatio cv-compact_mono 0:1f193cd1d987 -0.22 0.09 productteams.reducedtemplatemain @@ -349,7 +349,7 @@ cv-compact_mono 0:b78a9a72ca9a -0.15 0.09 andcuttingp99renderlatencyfrom1. cv-compact_mono 0:9f5d87c00954 0.06 0.09 backendengineer,helixprintco|201 cv-compact_mono 0:a485c37fe7ea -0.14 0.09 maintainedahigh-volumeinvoice-pr cv-compact_mono 0:5a136b6b9d8c -0.12 0.09 testharnessthatgatedeverytemplat -cv-compact_mono 0:d94eccbb1fbe 0.49 0.09 selectedprojects +cv-compact_mono 0:d94eccbb1fbe 0.39 0.09 selectedprojects cv-compact_mono 0:0059a3aac61e -0.06 0.09 graphcompose(java21,pdfbox,maven cv-compact_mono 0:18b7f8c840e4 -0.03 0.09 dsl,slot-basedtemplates,snapshot cv-compact_mono 0:d36f78e88fe0 0.01 0.09 forhiringtoolsandbillingsystems. @@ -360,15 +360,15 @@ cv-compact_mono 0:ab89138286bb 0.10 0.09 layoutlint(java21,javaparser,spo cv-compact_mono 0:2c506ce69aa6 0.13 0.09 nestedrows,untypedoffsets,implic cv-compact_mono 0:6793d28e9783 0.14 0.09 chromeforge(java,graphcompose,pa cv-compact_mono 0:e3cfea265b3b 0.17 0.09 graphcompose:cinematiccovers,pul -cv-editorial_blue 0:8f1010120ed6 0.45 0.12 jordanrivera -cv-editorial_blue 0:2d58f0cadc2d 0.22 0.13 platformengineer -cv-editorial_blue 0:1b28eb6a9a2e 0.14 0.13 +442055551000-london,uk -cv-editorial_blue 0:8817bf9310b6 0.11 0.11 jordan.rivera@example.com|linked -cv-editorial_blue 0:3c69d6bb4892 0.15 0.10 professionalprofile +cv-editorial_blue 0:8f1010120ed6 -0.05 0.12 jordanrivera +cv-editorial_blue 0:2d58f0cadc2d 0.02 0.13 platformengineer +cv-editorial_blue 0:1b28eb6a9a2e -0.06 0.13 +442055551000-london,uk +cv-editorial_blue 0:8817bf9310b6 -0.09 0.11 jordan.rivera@example.com|linked +cv-editorial_blue 0:3c69d6bb4892 -0.05 0.10 professionalprofile cv-editorial_blue 0:80cc87fdc4c4 -0.22 0.10 platformengineerwith10+yearsbuil cv-editorial_blue 0:c323ef4c385f -0.22 0.10 systems.specialisedinhigh-throug cv-editorial_blue 0:3ff1933dba9a -0.21 0.10 typed,snapshot-testedlibrariesth -cv-editorial_blue 0:32c1cf49a2fe 0.14 0.10 skills +cv-editorial_blue 0:32c1cf49a2fe -0.06 0.10 skills cv-editorial_blue 0:8447174c8fff 0.09 0.35 •java21 cv-editorial_blue 0:4797e5b5555b 0.09 0.33 •kotlin cv-editorial_blue 0:44408890ac29 0.09 0.36 •groovy @@ -401,47 +401,47 @@ cv-editorial_blue 0:7ea255c76189 0.06 0.34 •mavencentral cv-editorial_blue 0:4e484fca00bb 0.06 0.35 •sonatypeossrh cv-editorial_blue 0:feaf5883619f 0.06 0.33 •gpgsigning cv-editorial_blue 0:11f34b7449a4 0.06 0.34 •semanticversioningdiscipline -cv-editorial_blue 0:68bf0109c6f8 0.08 0.10 education -cv-editorial_blue 0:78cdd0bfd1ce 0.04 0.10 msccomputerscience2019-2021 -cv-editorial_blue 0:47ce0218bbea 0.04 0.10 universityofmanchester -cv-editorial_blue 0:2ffe115b06e5 0.04 0.10 distinction.thesis:composablelay -cv-editorial_blue 0:c5947a492ce6 0.03 0.10 bscsoftwareengineering2015-2019 -cv-editorial_blue 0:89ad9656f393 0.03 0.10 imperialcollegelondon -cv-editorial_blue 0:baa173b4a82e 0.03 0.10 first-classhonours.specialisatio -cv-editorial_blue 0:83766950a9ce 0.02 0.10 oraclejavacertification2023-2024 -cv-editorial_blue 0:2669e1f6d55c 0.02 0.10 professionaltrack -cv-editorial_blue 0:3857373829c1 0.02 0.10 java17platformdeep-dive:records, -cv-editorial_blue 0:2577c0f557b2 0.02 0.10 projects -cv-editorial_blue 0:0f2c67872251 -0.02 0.10 graphcompose(java21,pdfbox,maven +cv-editorial_blue 0:68bf0109c6f8 -0.12 0.10 education +cv-editorial_blue 0:78cdd0bfd1ce -0.21 0.10 msccomputerscience2019-2021 +cv-editorial_blue 0:47ce0218bbea -0.16 0.10 universityofmanchester +cv-editorial_blue 0:2ffe115b06e5 -0.16 0.10 distinction.thesis:composablelay +cv-editorial_blue 0:c5947a492ce6 -0.22 0.10 bscsoftwareengineering2015-2019 +cv-editorial_blue 0:89ad9656f393 -0.17 0.10 imperialcollegelondon +cv-editorial_blue 0:baa173b4a82e -0.17 0.10 first-classhonours.specialisatio +cv-editorial_blue 0:83766950a9ce -0.23 0.10 oraclejavacertification2023-2024 +cv-editorial_blue 0:2669e1f6d55c -0.18 0.10 professionaltrack +cv-editorial_blue 0:3857373829c1 -0.18 0.10 java17platformdeep-dive:records, +cv-editorial_blue 0:2577c0f557b2 -0.18 0.10 projects +cv-editorial_blue 0:0f2c67872251 -0.27 0.10 graphcompose(java21,pdfbox,maven cv-editorial_blue 0:cf13c8a0c3d0 -0.31 0.10 declarativejavapdflayoutengine.s cv-editorial_blue 0:cfef54184ea6 -0.30 0.10 proposalpipelinesforhiringtoolsa -cv-editorial_blue 0:d73d02174dc9 -0.01 0.10 templatestudio(kotlin,composedes +cv-editorial_blue 0:d73d02174dc9 -0.26 0.10 templatestudio(kotlin,composedes cv-editorial_blue 0:7127a108c33c -0.30 0.10 internaltoolforevaluatingcv,prop cv-editorial_blue 0:6b844249c695 -0.30 0.10 freezing. -cv-editorial_blue 0:542ec793b5b1 -0.01 0.10 layoutlint(java21,javaparser,spo +cv-editorial_blue 0:542ec793b5b1 -0.26 0.10 layoutlint(java21,javaparser,spo cv-editorial_blue 0:7488006d7864 -0.30 0.10 staticanalyserthatflagsfragileau cv-editorial_blue 0:c4d0c415b4f8 -0.29 0.10 production. -cv-editorial_blue 0:ee180ea1e0a5 0.00 0.10 chromeforge(java,graphcompose,pa -cv-editorial_blue 0:e7e62230eb1f 0.01 0.10 editorial-magazinedocumenttoolki -cv-editorial_blue 0:53e5e7c5a884 0.01 0.10 experience -cv-editorial_blue 0:1b72d3ce3e11 -0.01 0.10 seniorplatformengineer2024-prese -cv-editorial_blue 0:f890faef907f -0.04 0.10 northwindsystems +cv-editorial_blue 0:ee180ea1e0a5 -0.25 0.10 chromeforge(java,graphcompose,pa +cv-editorial_blue 0:e7e62230eb1f -0.19 0.10 editorial-magazinedocumenttoolki +cv-editorial_blue 0:53e5e7c5a884 -0.19 0.10 experience +cv-editorial_blue 0:1b72d3ce3e11 -0.21 0.10 seniorplatformengineer2024-prese +cv-editorial_blue 0:f890faef907f -0.24 0.10 northwindsystems cv-editorial_blue 0:1af5650959fe -0.33 0.10 ledthereusabledocument-generatio cv-editorial_blue 0:27c01c228bd8 -0.33 0.10 templatemaintenancetimeby70%byre -cv-editorial_blue 0:1a7fe8433bff -0.02 0.10 softwareengineer2021-2024 -cv-editorial_blue 0:998c1a985022 -0.05 0.10 brightleaflabs +cv-editorial_blue 0:1a7fe8433bff -0.22 0.10 softwareengineer2021-2024 +cv-editorial_blue 0:998c1a985022 -0.25 0.10 brightleaflabs cv-editorial_blue 0:e86691b0219f -0.34 0.10 builtbackendservicesandproductio cv-editorial_blue 0:4ec57434564a -0.34 0.10 migrationfromitexttoacustomlayou -cv-editorial_blue 0:2427b23ddf4e -0.03 0.10 backendengineer2019-2021 +cv-editorial_blue 0:2427b23ddf4e -0.23 0.10 backendengineer2019-2021 cv-editorial_blue 1:ef148f221e31 0.20 0.10 helixprintco cv-editorial_blue 1:f811fbee6901 -0.09 0.10 maintainedahigh-volumeinvoice-pr cv-editorial_blue 1:cbfca5b2a6d7 -0.09 0.10 templatechange. -cv-editorial_blue 1:7b476727faf3 0.22 0.10 additional -cv-editorial_blue 1:f20997652453 0.19 0.10 languages:english(fluent),german -cv-editorial_blue 1:ec9d3622395e 0.20 0.10 workeligibility:eligibletoworkin -cv-editorial_blue 1:dd20ae01c3cf 0.20 0.10 opensource:maintainerofgraphcomp -cv-editorial_blue 1:33c35e9d236d 0.21 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-editorial_blue 1:0b516aa076e0 0.18 0.13 referencesavailableuponrequest. +cv-editorial_blue 1:7b476727faf3 0.02 0.10 additional +cv-editorial_blue 1:f20997652453 -0.01 0.10 languages:english(fluent),german +cv-editorial_blue 1:ec9d3622395e 0.00 0.10 workeligibility:eligibletoworkin +cv-editorial_blue 1:dd20ae01c3cf 0.00 0.10 opensource:maintainerofgraphcomp +cv-editorial_blue 1:33c35e9d236d 0.01 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-editorial_blue 1:0b516aa076e0 0.03 0.13 referencesavailableuponrequest. cv-engineering_resume 0:8f1010120ed6 0.15 15.10 jordanrivera cv-engineering_resume 0:2d58f0cadc2d -0.25 15.10 platformengineer cv-engineering_resume 0:fbeea547d99e -0.21 15.31 london,uk @@ -502,18 +502,18 @@ cv-engineering_resume 0:e3cfea265b3b -0.31 0.05 graphcompose:cinematiccovers,pul cv-executive 0:8f1010120ed6 -0.50 0.10 jordanrivera cv-executive 0:89ff05847e96 -0.28 0.10 london,uk|+442055551000 cv-executive 0:8817bf9310b6 -0.30 0.10 jordan.rivera@example.com|linked -cv-executive 0:b944906ed84c -0.01 0.10 professionalsummary +cv-executive 0:b944906ed84c 0.04 0.10 professionalsummary cv-executive 0:6fbdc8b79878 0.08 0.10 platformengineerwith10+yearsbuil cv-executive 0:c2be183b1c5f 0.08 0.10 templatesystems.specialisedinhig cv-executive 0:7f92a9c9efc9 0.08 0.10 scriptsintotyped,snapshot-tested -cv-executive 0:5f94c50dc5bf -0.03 0.10 technicalskills +cv-executive 0:5f94c50dc5bf 0.02 0.10 technicalskills cv-executive 0:eea537278f83 -0.24 0.10 •languages:java21,kotlin,groovy, cv-executive 0:9c2cd7231a53 -0.24 0.10 •document&print:pdfbox,apachepoi cv-executive 0:7bf8639ec5d3 -0.24 0.10 •layoutengines:customdsldesign,s cv-executive 0:8e66776d28d7 -0.24 0.10 •build&infrastructure:maven,grad cv-executive 0:1ed4fc7d7768 -0.24 0.10 •testing:junit5,assertj,pdfbox-b cv-executive 0:26671c309eb9 -0.24 0.10 •distribution:mavencentral,sonat -cv-executive 0:68bf0109c6f8 -0.05 0.10 education +cv-executive 0:68bf0109c6f8 0.00 0.10 education cv-executive 0:0ad1957d6bab -0.26 0.10 msccomputerscience cv-executive 0:3fa772117260 -0.26 0.19 2019-2021 cv-executive 0:47ce0218bbea -0.26 0.10 universityofmanchester @@ -526,7 +526,7 @@ cv-executive 0:6d3d5673c39f -0.26 0.10 oraclejavacertification cv-executive 0:d40b22f00acb -0.26 0.19 2023-2024 cv-executive 0:2669e1f6d55c -0.26 0.10 professionaltrack cv-executive 0:3857373829c1 -0.26 0.10 java17platformdeep-dive:records, -cv-executive 0:2577c0f557b2 -0.07 0.10 projects +cv-executive 0:2577c0f557b2 -0.02 0.10 projects cv-executive 0:b2b029995203 -0.28 0.10 •graphcompose(java21,pdfbox,mave cv-executive 0:cf13c8a0c3d0 -0.53 0.12 declarativejavapdflayoutengine.s cv-executive 0:cfef54184ea6 -0.53 0.12 proposalpipelinesforhiringtoolsa @@ -538,7 +538,7 @@ cv-executive 0:f5fa2add7746 -0.53 0.12 staticanalyserthatflagsfragileau cv-executive 0:9f5414016bd1 -0.53 0.12 toproduction. cv-executive 0:fb1927f88597 -0.28 0.10 •chromeforge(java,graphcompose,p cv-executive 0:e7e62230eb1f -0.28 0.12 editorial-magazinedocumenttoolki -cv-executive 0:c2f296ef30a3 -0.09 0.10 professionalexperience +cv-executive 0:c2f296ef30a3 -0.04 0.10 professionalexperience cv-executive 0:a76f47480818 -0.30 0.10 seniorplatformengineer cv-executive 0:060300b18051 -0.30 0.17 2024-present cv-executive 0:f890faef907f -0.30 0.10 northwindsystems @@ -554,7 +554,7 @@ cv-executive 1:3fa772117260 -0.28 0.19 2019-2021 cv-executive 1:ef148f221e31 -0.28 0.10 helixprintco cv-executive 1:f811fbee6901 0.02 0.10 maintainedahigh-volumeinvoice-pr cv-executive 1:cbfca5b2a6d7 0.02 0.10 templatechange. -cv-executive 1:676dfdd56ad2 -0.09 0.10 additionalinformation +cv-executive 1:676dfdd56ad2 -0.04 0.10 additionalinformation cv-executive 1:f20997652453 -0.30 0.10 languages:english(fluent),german cv-executive 1:ec9d3622395e -0.30 0.10 workeligibility:eligibletoworkin cv-executive 1:dd20ae01c3cf -0.30 0.10 opensource:maintainerofgraphcomp @@ -659,16 +659,16 @@ cv-minimal_underlined 0:26671c309eb9 0.38 0.10 •distribution:mavencentral,sona cv-minimal_underlined 0:68bf0109c6f8 0.41 0.10 education cv-minimal_underlined 0:0ad1957d6bab 0.47 0.10 msccomputerscience cv-minimal_underlined 0:3fa772117260 0.43 -0.76 2019-2021 -cv-minimal_underlined 0:47ce0218bbea 0.46 0.10 universityofmanchester -cv-minimal_underlined 0:2ffe115b06e5 0.47 0.10 distinction.thesis:composablelay +cv-minimal_underlined 0:47ce0218bbea 0.26 0.10 universityofmanchester +cv-minimal_underlined 0:2ffe115b06e5 0.27 0.10 distinction.thesis:composablelay cv-minimal_underlined 0:b6749d0b616b 0.50 0.10 bscsoftwareengineering cv-minimal_underlined 0:30f9262640a0 0.47 -0.76 2015-2019 -cv-minimal_underlined 0:89ad9656f393 0.49 0.10 imperialcollegelondon -cv-minimal_underlined 0:baa173b4a82e 0.51 0.10 first-classhonours.specialisatio +cv-minimal_underlined 0:89ad9656f393 0.29 0.10 imperialcollegelondon +cv-minimal_underlined 0:baa173b4a82e 0.31 0.10 first-classhonours.specialisatio cv-minimal_underlined 0:6d3d5673c39f 0.54 0.10 oraclejavacertification cv-minimal_underlined 0:d40b22f00acb 0.50 -0.76 2023-2024 -cv-minimal_underlined 0:2669e1f6d55c 0.53 0.10 professionaltrack -cv-minimal_underlined 0:3857373829c1 0.54 0.10 java17platformdeep-dive:records, +cv-minimal_underlined 0:2669e1f6d55c 0.33 0.10 professionaltrack +cv-minimal_underlined 0:3857373829c1 0.34 0.10 java17platformdeep-dive:records, cv-minimal_underlined 0:2577c0f557b2 0.57 0.10 projects cv-minimal_underlined 0:b2b029995203 0.61 0.10 •graphcompose(java21,pdfbox,mave cv-minimal_underlined 0:67593a76ef70 0.31 0.11 declarativejavapdflayoutengine.s @@ -684,110 +684,110 @@ cv-minimal_underlined 0:e7e62230eb1f 0.66 0.11 editorial-magazinedocumenttoolki cv-minimal_underlined 0:c2f296ef30a3 0.69 0.10 professionalexperience cv-minimal_underlined 0:a76f47480818 0.75 0.10 seniorplatformengineer cv-minimal_underlined 0:060300b18051 0.71 0.01 2024-present -cv-minimal_underlined 0:f890faef907f 0.74 0.10 northwindsystems +cv-minimal_underlined 0:f890faef907f 0.54 0.10 northwindsystems cv-minimal_underlined 1:49faf14f1f56 -0.13 0.10 ledthereusabledocument-generatio cv-minimal_underlined 1:6bd3f168e89e -0.13 0.10 maintenancetimeby70%byretiringpe cv-minimal_underlined 1:daf65306b3b6 0.20 0.10 softwareengineer cv-minimal_underlined 1:e7cc1822c6dc 0.17 -0.76 2021-2024 -cv-minimal_underlined 1:998c1a985022 0.19 0.10 brightleaflabs +cv-minimal_underlined 1:998c1a985022 -0.01 0.10 brightleaflabs cv-minimal_underlined 1:e55664011cda -0.09 0.10 builtbackendservicesandproductio cv-minimal_underlined 1:e80236b6d2b1 -0.09 0.10 itexttoacustomlayoutengine,elimi cv-minimal_underlined 1:41bb54fbae8d 0.24 0.10 backendengineer cv-minimal_underlined 1:3fa772117260 0.21 -0.76 2019-2021 -cv-minimal_underlined 1:ef148f221e31 0.23 0.10 helixprintco +cv-minimal_underlined 1:ef148f221e31 0.03 0.10 helixprintco cv-minimal_underlined 1:9d31a6bfbc69 -0.05 0.10 maintainedahigh-volumeinvoice-pr cv-minimal_underlined 1:03af8a628309 -0.05 0.10 change. cv-minimal_underlined 1:676dfdd56ad2 0.28 0.10 additionalinformation -cv-minimal_underlined 1:f20997652453 0.32 0.10 languages:english(fluent),german -cv-minimal_underlined 1:ec9d3622395e 0.32 0.10 workeligibility:eligibletoworkin -cv-minimal_underlined 1:dd20ae01c3cf 0.33 0.10 opensource:maintainerofgraphcomp -cv-minimal_underlined 1:33c35e9d236d 0.33 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-minimal_underlined 1:f20997652453 0.12 0.10 languages:english(fluent),german +cv-minimal_underlined 1:ec9d3622395e 0.12 0.10 workeligibility:eligibletoworkin +cv-minimal_underlined 1:dd20ae01c3cf 0.13 0.10 opensource:maintainerofgraphcomp +cv-minimal_underlined 1:33c35e9d236d 0.13 0.10 speaking:jvmsummit2024,devoxxuk2 cv-mint_editorial 0:8f1010120ed6 -1.30 2.33 jordanrivera -cv-mint_editorial 0:2d58f0cadc2d -0.27 0.12 platformengineer +cv-mint_editorial 0:2d58f0cadc2d -0.02 0.12 platformengineer cv-mint_editorial 0:093e7d5fdbaa -0.71 0.10 contact cv-mint_editorial 0:89674e6f130e -0.07 0.68 +442055551000 cv-mint_editorial 0:e0f850305ded -0.07 0.68 jordan.rivera@example.com cv-mint_editorial 0:fbeea547d99e -0.07 0.68 london,uk cv-mint_editorial 0:84308bea4540 -0.07 0.68 linkedin cv-mint_editorial 0:c0b0109d9439 -0.07 0.68 github -cv-mint_editorial 0:68bf0109c6f8 -0.71 0.10 education -cv-mint_editorial 0:0ad1957d6bab -0.16 0.10 msccomputerscience -cv-mint_editorial 0:47ce0218bbea -0.28 0.10 universityofmanchester -cv-mint_editorial 0:3fa772117260 -0.29 0.10 2019-2021 -cv-mint_editorial 0:5993c29826a9 -0.18 0.10 bscsoftware -cv-mint_editorial 0:8c85b6639e62 -0.18 0.10 engineering -cv-mint_editorial 0:89ad9656f393 -0.30 0.10 imperialcollegelondon -cv-mint_editorial 0:30f9262640a0 -0.31 0.10 2015-2019 -cv-mint_editorial 0:95c2a0cf9777 -0.20 0.10 oraclejava -cv-mint_editorial 0:b00a6c108553 -0.20 0.10 certification -cv-mint_editorial 0:2669e1f6d55c -0.32 0.10 professionaltrack -cv-mint_editorial 0:d40b22f00acb -0.33 0.10 2023-2024 +cv-mint_editorial 0:68bf0109c6f8 -0.01 0.10 education +cv-mint_editorial 0:0ad1957d6bab -0.01 0.10 msccomputerscience +cv-mint_editorial 0:47ce0218bbea -0.03 0.10 universityofmanchester +cv-mint_editorial 0:3fa772117260 -0.04 0.10 2019-2021 +cv-mint_editorial 0:5993c29826a9 -0.03 0.10 bscsoftware +cv-mint_editorial 0:8c85b6639e62 -0.03 0.10 engineering +cv-mint_editorial 0:89ad9656f393 -0.05 0.10 imperialcollegelondon +cv-mint_editorial 0:30f9262640a0 -0.06 0.10 2015-2019 +cv-mint_editorial 0:95c2a0cf9777 -0.05 0.10 oraclejava +cv-mint_editorial 0:b00a6c108553 -0.05 0.10 certification +cv-mint_editorial 0:2669e1f6d55c -0.07 0.10 professionaltrack +cv-mint_editorial 0:d40b22f00acb -0.08 0.10 2023-2024 cv-mint_editorial 0:1900eab6c028 -0.71 0.07 profile -cv-mint_editorial 0:924e8fc8d04f 0.29 0.07 platformengineerwith10+yearsbuil -cv-mint_editorial 0:df58bf5ac853 0.29 0.07 pipelines,layoutengines,anddevel -cv-mint_editorial 0:bedc997db3d0 0.29 0.07 inhigh-throughputpdfrendering,se -cv-mint_editorial 0:3be7f615205f 0.29 0.07 production-opsscriptsintotyped,s -cv-mint_editorial 0:53e5e7c5a884 -0.71 0.07 experience -cv-mint_editorial 0:a76f47480818 -0.16 0.07 seniorplatformengineer -cv-mint_editorial 0:d492f2d34b81 -0.28 0.07 northwindsystems|2024-present -cv-mint_editorial 0:11a63b6a756a 0.28 0.07 ledthereusabledocument-generatio -cv-mint_editorial 0:e9ddcca2381b 0.28 0.07 reportingflowsacross8productteam -cv-mint_editorial 0:8e7a066998f5 0.28 0.07 by70%byretiringper-teampdfscript -cv-mint_editorial 0:daf65306b3b6 -0.17 0.07 softwareengineer -cv-mint_editorial 0:14aeb7d88f36 -0.29 0.07 brightleaflabs|2021-2024 -cv-mint_editorial 0:78c890058374 0.27 0.07 builtbackendservicesandproductio -cv-mint_editorial 0:798b575aa9c2 0.27 0.07 processing2m+documentspermonth.d -cv-mint_editorial 0:337c2b00cc88 0.27 0.07 customlayoutengine,eliminatingli -cv-mint_editorial 0:cbec16fb4c22 0.27 0.07 from1.4sto380ms. +cv-mint_editorial 0:924e8fc8d04f -0.01 0.07 platformengineerwith10+yearsbuil +cv-mint_editorial 0:df58bf5ac853 -0.01 0.07 pipelines,layoutengines,anddevel +cv-mint_editorial 0:bedc997db3d0 -0.01 0.07 inhigh-throughputpdfrendering,se +cv-mint_editorial 0:3be7f615205f -0.01 0.07 production-opsscriptsintotyped,s +cv-mint_editorial 0:53e5e7c5a884 -0.01 0.07 experience +cv-mint_editorial 0:a76f47480818 -0.01 0.07 seniorplatformengineer +cv-mint_editorial 0:d492f2d34b81 -0.03 0.07 northwindsystems|2024-present +cv-mint_editorial 0:11a63b6a756a -0.02 0.07 ledthereusabledocument-generatio +cv-mint_editorial 0:e9ddcca2381b -0.02 0.07 reportingflowsacross8productteam +cv-mint_editorial 0:8e7a066998f5 -0.02 0.07 by70%byretiringper-teampdfscript +cv-mint_editorial 0:daf65306b3b6 -0.02 0.07 softwareengineer +cv-mint_editorial 0:14aeb7d88f36 -0.04 0.07 brightleaflabs|2021-2024 +cv-mint_editorial 0:78c890058374 -0.03 0.07 builtbackendservicesandproductio +cv-mint_editorial 0:798b575aa9c2 -0.03 0.07 processing2m+documentspermonth.d +cv-mint_editorial 0:337c2b00cc88 -0.03 0.07 customlayoutengine,eliminatingli +cv-mint_editorial 0:cbec16fb4c22 -0.03 0.07 from1.4sto380ms. cv-mint_editorial 1:2b3bcb2b7d1d -0.60 0.10 expertise -cv-mint_editorial 1:6cb574fa10b6 -0.05 0.10 languages -cv-mint_editorial 1:f2197dc148f6 -0.05 0.10 document&print -cv-mint_editorial 1:634db137981a -0.05 0.10 layoutengines -cv-mint_editorial 1:86c328e816c6 -0.05 0.10 build&infrastructure -cv-mint_editorial 1:cf80cd8aed48 -0.05 0.10 testing -cv-mint_editorial 1:933548450302 -0.05 0.10 distribution -cv-mint_editorial 1:32c1cf49a2fe -0.60 0.10 skills -cv-mint_editorial 1:d5680c2e2769 -0.05 0.10 java21 -cv-mint_editorial 1:19a67c2a5369 -0.05 0.10 kotlin -cv-mint_editorial 1:95bfacd3a466 -0.05 0.10 groovy -cv-mint_editorial 1:11a4a60b518b -0.05 0.10 python -cv-mint_editorial 1:4ec7c53222c8 -0.05 0.10 sql -cv-mint_editorial 1:57529f20c3ad -0.05 0.10 pdfbox -cv-mint_editorial 1:3e860f41a5ea -0.60 0.10 social +cv-mint_editorial 1:6cb574fa10b6 0.10 0.10 languages +cv-mint_editorial 1:f2197dc148f6 0.10 0.10 document&print +cv-mint_editorial 1:634db137981a 0.10 0.10 layoutengines +cv-mint_editorial 1:86c328e816c6 0.10 0.10 build&infrastructure +cv-mint_editorial 1:cf80cd8aed48 0.10 0.10 testing +cv-mint_editorial 1:933548450302 0.10 0.10 distribution +cv-mint_editorial 1:32c1cf49a2fe 0.10 0.10 skills +cv-mint_editorial 1:d5680c2e2769 0.10 0.10 java21 +cv-mint_editorial 1:19a67c2a5369 0.10 0.10 kotlin +cv-mint_editorial 1:95bfacd3a466 0.10 0.10 groovy +cv-mint_editorial 1:11a4a60b518b 0.10 0.10 python +cv-mint_editorial 1:4ec7c53222c8 0.10 0.10 sql +cv-mint_editorial 1:57529f20c3ad 0.10 0.10 pdfbox +cv-mint_editorial 1:3e860f41a5ea 0.10 0.10 social cv-mint_editorial 1:84308bea4540 -0.30 0.59 linkedin cv-mint_editorial 1:c0b0109d9439 -0.30 0.59 github cv-mint_editorial 1:53e5e7c5a884 -0.60 0.07 experience -cv-mint_editorial 1:41bb54fbae8d -0.05 0.07 backendengineer -cv-mint_editorial 1:43aab7d19dc6 -0.17 0.07 helixprintco|2019-2021 -cv-mint_editorial 1:d9af05f99661 0.39 0.07 maintainedahigh-volumeinvoice-pr -cv-mint_editorial 1:1081945512b1 0.39 0.07 authoredthecompliancetestharness +cv-mint_editorial 1:41bb54fbae8d 0.10 0.07 backendengineer +cv-mint_editorial 1:43aab7d19dc6 0.08 0.07 helixprintco|2019-2021 +cv-mint_editorial 1:d9af05f99661 0.09 0.07 maintainedahigh-volumeinvoice-pr +cv-mint_editorial 1:1081945512b1 0.09 0.07 authoredthecompliancetestharness cv-modern_professional 0:8f1010120ed6 0.00 0.16 jordanrivera cv-modern_professional 0:89ff05847e96 0.14 0.16 london,uk|+442055551000 cv-modern_professional 0:8817bf9310b6 0.11 0.10 jordan.rivera@example.com|linked -cv-modern_professional 0:b944906ed84c 0.36 0.10 professionalsummary +cv-modern_professional 0:b944906ed84c -0.04 0.10 professionalsummary cv-modern_professional 0:6fbdc8b79878 -0.07 0.10 platformengineerwith10+yearsbuil -cv-modern_professional 0:5f94c50dc5bf 0.36 0.10 technicalskills +cv-modern_professional 0:5f94c50dc5bf -0.04 0.10 technicalskills cv-modern_professional 0:eea537278f83 0.23 0.10 •languages:java21,kotlin,groovy, cv-modern_professional 0:9c2cd7231a53 0.23 0.10 •document&print:pdfbox,apachepoi cv-modern_professional 0:7bf8639ec5d3 0.23 0.10 •layoutengines:customdsldesign,s cv-modern_professional 0:8e66776d28d7 0.23 0.10 •build&infrastructure:maven,grad cv-modern_professional 0:1ed4fc7d7768 0.23 0.10 •testing:junit5,assertj,pdfbox-b cv-modern_professional 0:26671c309eb9 0.23 0.10 •distribution:mavencentral,sonat -cv-modern_professional 0:68bf0109c6f8 0.37 0.10 education +cv-modern_professional 0:68bf0109c6f8 -0.03 0.10 education cv-modern_professional 0:0ad1957d6bab 0.23 0.10 msccomputerscience cv-modern_professional 0:3fa772117260 0.24 0.18 2019-2021 cv-modern_professional 0:3fa772117260#1 0.25 0.18 2019-2021 -cv-modern_professional 0:47ce0218bbea 0.18 0.10 universityofmanchester -cv-modern_professional 0:2ffe115b06e5 0.24 0.10 distinction.thesis:composablelay +cv-modern_professional 0:47ce0218bbea -0.02 0.10 universityofmanchester +cv-modern_professional 0:2ffe115b06e5 0.04 0.10 distinction.thesis:composablelay cv-modern_professional 0:b6749d0b616b 0.23 0.10 bscsoftwareengineering cv-modern_professional 0:30f9262640a0 0.24 0.18 2015-2019 -cv-modern_professional 0:89ad9656f393 0.18 0.10 imperialcollegelondon -cv-modern_professional 0:baa173b4a82e 0.24 0.10 first-classhonours.specialisatio +cv-modern_professional 0:89ad9656f393 -0.02 0.10 imperialcollegelondon +cv-modern_professional 0:baa173b4a82e 0.04 0.10 first-classhonours.specialisatio cv-modern_professional 0:6d3d5673c39f 0.23 0.10 oraclejavacertification cv-modern_professional 0:d40b22f00acb 0.24 0.18 2023-2024 -cv-modern_professional 0:2669e1f6d55c 0.18 0.10 professionaltrack -cv-modern_professional 0:3857373829c1 0.24 0.10 java17platformdeep-dive:records, -cv-modern_professional 0:2577c0f557b2 0.37 0.10 projects +cv-modern_professional 0:2669e1f6d55c -0.02 0.10 professionaltrack +cv-modern_professional 0:3857373829c1 0.04 0.10 java17platformdeep-dive:records, +cv-modern_professional 0:2577c0f557b2 -0.03 0.10 projects cv-modern_professional 0:b2b029995203 0.24 0.10 •graphcompose(java21,pdfbox,mave cv-modern_professional 0:dd39d2ff3520 -0.06 0.10 declarativejavapdflayoutengine.s cv-modern_professional 0:9ecaa6df6d41 -0.06 0.10 invoice/proposalpipelinesforhiri @@ -800,26 +800,26 @@ cv-modern_professional 0:7b985a1d2b08 -0.06 0.10 shiptoproduction. cv-modern_professional 0:fb1927f88597 0.24 0.10 •chromeforge(java,graphcompose,p cv-modern_professional 0:cda7db6c6ea6 -0.06 0.10 editorial-magazinedocumenttoolki cv-modern_professional 0:fe63fe18585a -0.06 0.10 callouts. -cv-modern_professional 0:c2f296ef30a3 0.38 0.10 professionalexperience +cv-modern_professional 0:c2f296ef30a3 -0.02 0.10 professionalexperience cv-modern_professional 0:a76f47480818 0.24 0.10 seniorplatformengineer cv-modern_professional 0:060300b18051 0.25 0.15 2024-present -cv-modern_professional 0:f890faef907f 0.19 0.10 northwindsystems +cv-modern_professional 0:f890faef907f -0.01 0.10 northwindsystems cv-modern_professional 0:a6525dacbac7 -0.05 0.10 ledthereusabledocument-generatio cv-modern_professional 0:15e3905f4890 -0.05 0.10 reducedtemplatemaintenancetimeby cv-modern_professional 0:daf65306b3b6 0.24 0.10 softwareengineer cv-modern_professional 0:e7cc1822c6dc 0.25 0.18 2021-2024 -cv-modern_professional 0:998c1a985022 0.19 0.10 brightleaflabs +cv-modern_professional 0:998c1a985022 -0.01 0.10 brightleaflabs cv-modern_professional 0:e86691b0219f -0.05 0.10 builtbackendservicesandproductio cv-modern_professional 0:4ec57434564a -0.05 0.10 migrationfromitexttoacustomlayou cv-modern_professional 0:41bb54fbae8d 0.24 0.10 backendengineer -cv-modern_professional 0:ef148f221e31 0.19 0.10 helixprintco +cv-modern_professional 0:ef148f221e31 -0.01 0.10 helixprintco cv-modern_professional 0:a32c7f2401d9 -0.05 0.10 maintainedahigh-volumeinvoice-pr cv-modern_professional 0:7068c1d7034b -0.05 0.10 everytemplatechange. cv-modern_professional 1:676dfdd56ad2 0.36 0.10 additionalinformation -cv-modern_professional 1:f20997652453 0.23 0.10 languages:english(fluent),german -cv-modern_professional 1:ec9d3622395e 0.23 0.10 workeligibility:eligibletoworkin -cv-modern_professional 1:dd20ae01c3cf 0.23 0.10 opensource:maintainerofgraphcomp -cv-modern_professional 1:33c35e9d236d 0.23 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-modern_professional 1:f20997652453 0.03 0.10 languages:english(fluent),german +cv-modern_professional 1:ec9d3622395e 0.03 0.10 workeligibility:eligibletoworkin +cv-modern_professional 1:dd20ae01c3cf 0.03 0.10 opensource:maintainerofgraphcomp +cv-modern_professional 1:33c35e9d236d 0.03 0.10 speaking:jvmsummit2024,devoxxuk2 cv-monogram_sidebar 0:093e7d5fdbaa -0.25 0.81 contact cv-monogram_sidebar 0:89674e6f130e -0.10 -0.33 +442055551000 cv-monogram_sidebar 0:e0f850305ded -0.08 0.06 jordan.rivera@example.com @@ -841,8 +841,8 @@ cv-monogram_sidebar 0:11a4a60b518b 0.28 -0.08 python cv-monogram_sidebar 0:4ec7c53222c8 0.30 0.00 sql cv-monogram_sidebar 0:57529f20c3ad 0.32 -0.10 pdfbox cv-monogram_sidebar 0:1814aacb6d5a 0.34 0.02 apachepoi(docx/xlsx) -cv-monogram_sidebar 0:136c67657614 -0.38 2.80 jordan -cv-monogram_sidebar 0:8ba35ebe3d5c -0.37 2.83 rivera +cv-monogram_sidebar 0:136c67657614 0.02 2.80 jordan +cv-monogram_sidebar 0:8ba35ebe3d5c 0.03 2.83 rivera cv-monogram_sidebar 0:2d58f0cadc2d -0.19 0.11 platformengineer cv-monogram_sidebar 0:b944906ed84c -0.25 0.06 professionalsummary cv-monogram_sidebar 0:e9b75496bfb4 -0.47 0.06 platformengineerwith10+yearsbuil @@ -1105,15 +1105,15 @@ cv-orange_ops 0:0945b35c95a8 0.69 0.02 systems:sapewm,manhattanwms,micr cv-orange_ops 0:44aaa523dc2c 0.69 0.02 languages:english(native) cv-orange_ops 0:724cc536a24c 0.70 0.02 drivinglicence:fullukdrivinglice cv-orange_ops 0:9f0e43069d3f 0.71 0.02 interests:strengthtraining,motor -cv-panel 0:8f1010120ed6 -0.75 8.57 jordanrivera +cv-panel 0:8f1010120ed6 0.00 8.57 jordanrivera cv-panel 0:2d58f0cadc2d -0.23 8.27 platformengineer cv-panel 0:89ff05847e96 -0.16 8.54 london,uk|+442055551000 cv-panel 0:8817bf9310b6 -0.14 8.55 jordan.rivera@example.com|linked -cv-panel 0:1900eab6c028 0.19 8.35 profile +cv-panel 0:1900eab6c028 0.24 8.35 profile cv-panel 0:80cc87fdc4c4 -0.23 8.35 platformengineerwith10+yearsbuil cv-panel 0:c323ef4c385f -0.21 8.35 systems.specialisedinhigh-throug cv-panel 0:3ff1933dba9a -0.19 8.35 typed,snapshot-testedlibrariesth -cv-panel 0:32c1cf49a2fe 0.39 0.15 skills +cv-panel 0:32c1cf49a2fe 0.44 0.15 skills cv-panel 0:eea537278f83 0.17 0.15 •languages:java21,kotlin,groovy, cv-panel 0:7e941e729572 -0.01 0.15 •document&print:pdfbox,apachepoi cv-panel 0:9e3166ce2413 0.01 0.15 itext,postscript,icccolourprofil @@ -1123,7 +1123,7 @@ cv-panel 0:f5f76d479ec8 0.07 0.15 •build&infrastructure:maven,grad cv-panel 0:656a2a3e57e0 0.09 0.15 jitpack,docker,jmhbenchmarking cv-panel 0:9a6921f79b7d 0.15 0.15 •distribution:mavencentral,sonat cv-panel 0:77a74982066f 0.17 0.15 jitpack,semanticversioningdiscip -cv-panel 0:68bf0109c6f8 0.75 0.15 education +cv-panel 0:68bf0109c6f8 0.80 0.15 education cv-panel 0:871923f4f0f2 0.53 0.15 msccomputerscience-2019-2021 cv-panel 0:47ce0218bbea 0.55 0.15 universityofmanchester cv-panel 0:51e1ec7daa5a 0.35 0.15 distinction.thesis:composablelay @@ -1136,7 +1136,7 @@ cv-panel 0:8971b01c36bb 0.65 0.15 oraclejavacertification-2023-202 cv-panel 0:2669e1f6d55c 0.67 0.15 professionaltrack cv-panel 0:4f17e3d7d6f4 0.47 0.15 java17platformdeep-dive:records, cv-panel 0:9e6154a3b625 0.49 0.15 matching,virtualthreads. -cv-panel 0:7b476727faf3 1.07 0.15 additional +cv-panel 0:7b476727faf3 1.12 0.15 additional cv-panel 0:3f88eb4c530c 0.65 0.15 languages:english(fluent),german cv-panel 0:5d276fee8c17 0.67 0.15 (basic) cv-panel 0:ec9d3622395e 0.89 0.15 workeligibility:eligibletoworkin @@ -1144,7 +1144,7 @@ cv-panel 0:d05b8b335e96 0.71 0.15 opensource:maintainerofgraphcomp cv-panel 0:2f3b4176123d 0.73 0.15 contributortopdfboxissuetriage. cv-panel 0:1ae173b42166 0.75 0.15 speaking:jvmsummit2024,devoxxuk2 cv-panel 0:309255ca6a36 0.77 0.15 declarativedocumentlayout. -cv-panel 0:53e5e7c5a884 0.39 0.16 experience +cv-panel 0:53e5e7c5a884 0.44 0.16 experience cv-panel 0:99b44abc1b3e 0.17 0.16 seniorplatformengineer-2024-pres cv-panel 0:f890faef907f 0.19 0.16 northwindsystems cv-panel 0:e32ca827bfd5 -0.01 0.16 ledthereusabledocument-generatio @@ -1163,7 +1163,7 @@ cv-panel 0:ef148f221e31 0.31 0.16 helixprintco cv-panel 0:09cc06a649eb 0.11 0.16 maintainedahigh-volumeinvoice-pr cv-panel 0:090e2184c17b 0.13 0.16 pdfs/year)andauthoredthecomplian cv-panel 0:6f071fdf7529 0.15 0.16 gatedeverytemplatechange. -cv-panel 0:2577c0f557b2 0.73 0.16 projects +cv-panel 0:2577c0f557b2 0.78 0.16 projects cv-panel 0:b2b029995203 0.51 0.16 •graphcompose(java21,pdfbox,mave cv-panel 0:81c8132f9792 0.39 0.16 systems.(opensource) cv-panel 0:753f46e4e01b 0.41 0.16 •templatestudio(kotlin,composede @@ -1538,34 +1538,34 @@ cv-teal_pulse 0:de15ca9e3d9f 0.08 0.07 polish(conversational) cv-teal_pulse 0:b035d3696f4e -0.22 0.07 righttowork:unitedkingdom cv-teal_pulse 0:cfa1d6dd779c -0.22 0.07 availability:1monthnotice cv-teal_pulse 0:b9b8965717b3 -0.23 1.62 compassionatecare.clinicalexcell -cv-terracotta_rail 0:920a88ef5818 0.35 0.12 oliver.bennett@email.com -cv-terracotta_rail 0:a8acc3a90a7b 0.35 0.12 +447700900123 -cv-terracotta_rail 0:e8c463a6c54d 0.35 0.12 bristol,unitedkingdom -cv-terracotta_rail 0:84308bea4540 0.35 0.12 linkedin +cv-terracotta_rail 0:920a88ef5818 0.05 0.12 oliver.bennett@email.com +cv-terracotta_rail 0:a8acc3a90a7b 0.05 0.12 +447700900123 +cv-terracotta_rail 0:e8c463a6c54d 0.05 0.12 bristol,unitedkingdom +cv-terracotta_rail 0:84308bea4540 0.05 0.12 linkedin cv-terracotta_rail 0:32c1cf49a2fe -0.21 0.10 skills -cv-terracotta_rail 0:4e1fe6feb1d5 0.37 0.12 architecturaldesign -cv-terracotta_rail 0:4b1ce58ed984 0.37 0.12 conceptdevelopment -cv-terracotta_rail 0:e8386273ac51 0.37 0.12 planningapplications -cv-terracotta_rail 0:09033be5db1b 0.37 0.12 technicaldrawings -cv-terracotta_rail 0:de4e9e607840 0.37 0.12 revit -cv-terracotta_rail 0:de4e9e607840#1 0.35 0.52 revit -cv-terracotta_rail 0:50f08e64c5a6 0.37 0.12 autocad -cv-terracotta_rail 0:50f08e64c5a6#1 0.35 0.52 autocad -cv-terracotta_rail 0:af7c811cbfce 0.37 0.12 bimcoordination -cv-terracotta_rail 0:531b7caeda92 0.37 0.12 designpresentations -cv-terracotta_rail 0:bfcd894f9698 0.37 0.12 projectdelivery -cv-terracotta_rail 0:9a1192ab93d0 0.37 0.12 stakeholdermanagement -cv-terracotta_rail 0:48fe07df4f1c 0.37 0.12 sustainabledesign -cv-terracotta_rail 0:95626582af55 0.37 0.12 buildingregulations +cv-terracotta_rail 0:4e1fe6feb1d5 0.07 0.12 architecturaldesign +cv-terracotta_rail 0:4b1ce58ed984 0.07 0.12 conceptdevelopment +cv-terracotta_rail 0:e8386273ac51 0.07 0.12 planningapplications +cv-terracotta_rail 0:09033be5db1b 0.07 0.12 technicaldrawings +cv-terracotta_rail 0:de4e9e607840 0.07 0.12 revit +cv-terracotta_rail 0:de4e9e607840#1 0.05 0.52 revit +cv-terracotta_rail 0:50f08e64c5a6 0.07 0.12 autocad +cv-terracotta_rail 0:50f08e64c5a6#1 0.05 0.52 autocad +cv-terracotta_rail 0:af7c811cbfce 0.07 0.12 bimcoordination +cv-terracotta_rail 0:531b7caeda92 0.07 0.12 designpresentations +cv-terracotta_rail 0:bfcd894f9698 0.07 0.12 projectdelivery +cv-terracotta_rail 0:9a1192ab93d0 0.07 0.12 stakeholdermanagement +cv-terracotta_rail 0:48fe07df4f1c 0.07 0.12 sustainabledesign +cv-terracotta_rail 0:95626582af55 0.07 0.12 buildingregulations cv-terracotta_rail 0:35390f5453e8 -0.18 0.10 software -cv-terracotta_rail 0:2d5d6ea604fd 0.35 0.52 rhino -cv-terracotta_rail 0:5971b0dc0625 0.35 0.52 sketchup -cv-terracotta_rail 0:e9d09d8ff5bb 0.35 0.52 adobeindesign -cv-terracotta_rail 0:3f4a09b92ccf 0.35 0.52 photoshop -cv-terracotta_rail 0:3abe8752b2c0 0.35 0.52 microsoftoffice +cv-terracotta_rail 0:2d5d6ea604fd 0.05 0.52 rhino +cv-terracotta_rail 0:5971b0dc0625 0.05 0.52 sketchup +cv-terracotta_rail 0:e9d09d8ff5bb 0.05 0.52 adobeindesign +cv-terracotta_rail 0:3f4a09b92ccf 0.05 0.52 photoshop +cv-terracotta_rail 0:3abe8752b2c0 0.05 0.52 microsoftoffice cv-terracotta_rail 0:e831beb04c00 -0.21 0.10 certifications -cv-terracotta_rail 0:3ad949ee8543 0.32 0.52 arbregisteredarchitect -cv-terracotta_rail 0:fa807066704f 0.32 0.52 ribacharteredmember +cv-terracotta_rail 0:3ad949ee8543 0.02 0.52 arbregisteredarchitect +cv-terracotta_rail 0:fa807066704f 0.02 0.52 ribacharteredmember cv-terracotta_rail 0:676dfdd56ad2 -0.24 0.10 additionalinformation cv-terracotta_rail 0:705ab1a9cb61 -0.22 0.07 languages: cv-terracotta_rail 0:9ee0e2dddc94 -0.24 0.07 english(native), @@ -1806,16 +1806,16 @@ cv-violet_grid 0:e35242c809c8 -1.51 0.02 portuguese cv-violet_grid 0:c5d1de4964d6 -1.51 -0.03 conversational cv-violet_grid 0:1de4fede4f63 -1.26 22.41 idesignwithempathy,iteratewithpu invoice-classic 0:c26c22b94338 0.49 0.10 graphcomposestudio -invoice-classic 0:c26c22b94338#1 0.25 0.06 graphcomposestudio -invoice-classic 0:2a08ce5567fb 0.35 0.10 18layoutstreet +invoice-classic 0:c26c22b94338#1 0.05 0.06 graphcomposestudio +invoice-classic 0:2a08ce5567fb 0.15 0.10 18layoutstreet invoice-classic 0:2a08ce5567fb#1 -0.02 0.06 18layoutstreet invoice-classic 0:52d6e3de4fa0 0.10 0.06 invoice -invoice-classic 0:38e9951985e4 0.32 0.06 gc-2026-041 -invoice-classic 0:20fe884effee 0.32 0.06 issued02apr2026 +invoice-classic 0:38e9951985e4 0.12 0.06 gc-2026-041 +invoice-classic 0:20fe884effee 0.12 0.06 issued02apr2026 invoice-classic 0:57a66d21eb1b 0.30 16.10 totaldue -invoice-classic 0:30d85a94548c 0.37 16.10 invoicegc-2026-041issued02apr202 +invoice-classic 0:30d85a94548c 0.07 16.10 invoicegc-2026-041issued02apr202 invoice-classic 0:aeba3a7b3598 0.28 0.10 billto -invoice-classic 0:f890faef907f 0.25 0.10 northwindsystems +invoice-classic 0:f890faef907f 0.05 0.10 northwindsystems invoice-classic 0:1b405eb431ca -0.02 0.10 attn:financeteam invoice-classic 0:91eefd794f79 -0.05 0.10 410marketavenue invoice-classic 0:00a97da4e243 -0.07 0.10 manchester,uk @@ -1860,18 +1860,18 @@ invoice-classic 0:434cc906ae90 0.12 0.09 billing@graphcompose.devfor invoice-classic 0:8822ea375315 0.12 0.09 remittancedetails. invoice-classic 0:1a7b5c840e25 0.12 0.06 •latepaymentsmaydelayadditional invoice-classic 0:1631a06d245f 0.12 0.09 templatecustomizationwork. -invoice-classic 0:e3337beaa171 0.10 0.10 thankyouforchoosinggraphcomposef +invoice-classic 0:e3337beaa171 -0.10 0.10 thankyouforchoosinggraphcomposef invoice-classic_long 0:c26c22b94338 0.49 0.10 graphcomposestudio -invoice-classic_long 0:c26c22b94338#1 0.25 0.06 graphcomposestudio -invoice-classic_long 0:2a08ce5567fb 0.35 0.10 18layoutstreet +invoice-classic_long 0:c26c22b94338#1 0.05 0.06 graphcomposestudio +invoice-classic_long 0:2a08ce5567fb 0.15 0.10 18layoutstreet invoice-classic_long 0:2a08ce5567fb#1 -0.02 0.06 18layoutstreet invoice-classic_long 0:52d6e3de4fa0 0.10 0.06 invoice -invoice-classic_long 0:3594d2085950 0.32 0.06 gc-2026-042 -invoice-classic_long 0:25851a973edd 0.32 0.06 issued04may2026 +invoice-classic_long 0:3594d2085950 0.12 0.06 gc-2026-042 +invoice-classic_long 0:25851a973edd 0.12 0.06 issued04may2026 invoice-classic_long 0:57a66d21eb1b 0.30 16.10 totaldue -invoice-classic_long 0:9eea1e05ff47 0.37 16.10 invoicegc-2026-042issued04may202 +invoice-classic_long 0:9eea1e05ff47 0.07 16.10 invoicegc-2026-042issued04may202 invoice-classic_long 0:aeba3a7b3598 0.28 0.10 billto -invoice-classic_long 0:f890faef907f 0.25 0.10 northwindsystems +invoice-classic_long 0:f890faef907f 0.05 0.10 northwindsystems invoice-classic_long 0:1b405eb431ca -0.02 0.10 attn:financeteam invoice-classic_long 0:91eefd794f79 -0.05 0.10 410marketavenue invoice-classic_long 0:00a97da4e243 -0.07 0.10 manchester,uk @@ -2026,7 +2026,7 @@ invoice-classic_long 1:24274f39b50b 0.22 0.06 •paymentduewithin14calendardays. invoice-classic_long 1:c438440ba377 0.22 0.06 •banktransferpreferred;contact invoice-classic_long 1:434cc906ae90 0.22 0.09 billing@graphcompose.devfor invoice-classic_long 1:8822ea375315 0.22 0.09 remittancedetails. -invoice-classic_long 1:e3337beaa171 0.20 0.10 thankyouforchoosinggraphcomposef +invoice-classic_long 1:e3337beaa171 0.00 0.10 thankyouforchoosinggraphcomposef invoice-consulting 0:d44ceaea97d1 0.27 0.10 level8,1collinsstreet invoice-consulting 0:78a0bb33347f 0.29 0.10 melbournevic3000australia invoice-consulting 0:3b45ab243edb 0.51 0.10 +61398765432 @@ -2045,16 +2045,16 @@ invoice-consulting 0:28447bbc85e1 -0.19 0.06 digitalstrategyengagement invoice-consulting 0:d7523d00af19 -0.53 0.07 ponumber: invoice-consulting 0:80a06a9ef12d -0.19 0.06 po-7892 invoice-consulting 0:aef9b6cb1bcd -0.06 0.10 billedto -invoice-consulting 0:3fc5213307f9 -0.10 0.10 greenfieldindustriesltd. -invoice-consulting 0:37d614eaf852 -0.09 0.10 accountspayabledepartment -invoice-consulting 0:c438c5ffc681 -0.08 0.10 12innovationdrive -invoice-consulting 0:89f5b4615dc3 -0.07 0.10 melbournevic3000 -invoice-consulting 0:c585f1decb98 -0.06 0.10 australia -invoice-consulting 0:4438ad217dea -0.05 0.10 email:ap@greenfield.com.au +invoice-consulting 0:3fc5213307f9 0.10 0.10 greenfieldindustriesltd. +invoice-consulting 0:37d614eaf852 0.11 0.10 accountspayabledepartment +invoice-consulting 0:c438c5ffc681 0.12 0.10 12innovationdrive +invoice-consulting 0:89f5b4615dc3 0.13 0.10 melbournevic3000 +invoice-consulting 0:c585f1decb98 0.14 0.10 australia +invoice-consulting 0:4438ad217dea 0.15 0.10 email:ap@greenfield.com.au invoice-consulting 0:cfebda697822 -0.06 0.10 invoicesummary -invoice-consulting 0:5656f37a9311 0.40 0.10 professionalservicesrenderedinac -invoice-consulting 0:a918299ac844 0.41 0.10 statementofworkfortheperiod -invoice-consulting 0:3fa8489d9aac -0.08 0.10 1may2025–25may2025. +invoice-consulting 0:5656f37a9311 0.15 0.10 professionalservicesrenderedinac +invoice-consulting 0:a918299ac844 0.16 0.10 statementofworkfortheperiod +invoice-consulting 0:3fa8489d9aac 0.12 0.10 1may2025–25may2025. invoice-consulting 0:c9046f7a37ad 0.67 -0.15 description invoice-consulting 0:b28225a1247c 0.67 -0.22 serviceperiod invoice-consulting 0:32e8369a9c4f 0.67 0.25 qty @@ -2110,12 +2110,12 @@ invoice-consulting 0:83a417f0862b 0.96 0.10 123-456 invoice-consulting 0:6b4894c28363 0.96 0.10 accountnumber: invoice-consulting 0:ef797c8118f0 0.96 0.10 12345678 invoice-consulting 0:c608665436db 0.96 0.10 reference: -invoice-consulting 0:010450dee1ff 0.97 0.10 pleaseensuretheinvoicenumberisin +invoice-consulting 0:010450dee1ff 0.47 0.10 pleaseensuretheinvoicenumberisin invoice-consulting 0:ab5aa97074c4 0.31 0.12 notes -invoice-consulting 0:7c6ab37d83ef 0.27 0.12 thankyouforyourbusiness. -invoice-consulting 0:4a699e29a3bb 0.78 0.12 ifyouhaveanyquestionsregardingth -invoice-consulting 0:c766251af1f4 0.79 0.12 contactusataccounts@northpoint.c -invoice-consulting 0:3d32fa219332 0.80 0.12 +61398765432. +invoice-consulting 0:7c6ab37d83ef 0.47 0.12 thankyouforyourbusiness. +invoice-consulting 0:4a699e29a3bb 0.48 0.12 ifyouhaveanyquestionsregardingth +invoice-consulting 0:c766251af1f4 0.49 0.12 contactusataccounts@northpoint.c +invoice-consulting 0:3d32fa219332 0.50 0.12 +61398765432. invoice-consulting 0:a6f6e2ddab6d 0.92 0.12 paymentisduewithin30daysfromthei invoice-consulting 0:55ee5fe62c33 0.01 0.13 northpointconsultingptyltd|abn12 invoice-consulting 0:bdbada284e80 0.01 0.09 page1/1 @@ -2136,16 +2136,16 @@ invoice-consulting_long 0:28447bbc85e1 -0.19 0.06 digitalstrategyengagement invoice-consulting_long 0:d7523d00af19 -0.53 0.07 ponumber: invoice-consulting_long 0:80a06a9ef12d -0.19 0.06 po-7892 invoice-consulting_long 0:aef9b6cb1bcd -0.06 0.10 billedto -invoice-consulting_long 0:3fc5213307f9 -0.10 0.10 greenfieldindustriesltd. -invoice-consulting_long 0:37d614eaf852 -0.09 0.10 accountspayabledepartment -invoice-consulting_long 0:c438c5ffc681 -0.08 0.10 12innovationdrive -invoice-consulting_long 0:89f5b4615dc3 -0.07 0.10 melbournevic3000 -invoice-consulting_long 0:c585f1decb98 -0.06 0.10 australia -invoice-consulting_long 0:4438ad217dea -0.05 0.10 email:ap@greenfield.com.au +invoice-consulting_long 0:3fc5213307f9 0.10 0.10 greenfieldindustriesltd. +invoice-consulting_long 0:37d614eaf852 0.11 0.10 accountspayabledepartment +invoice-consulting_long 0:c438c5ffc681 0.12 0.10 12innovationdrive +invoice-consulting_long 0:89f5b4615dc3 0.13 0.10 melbournevic3000 +invoice-consulting_long 0:c585f1decb98 0.14 0.10 australia +invoice-consulting_long 0:4438ad217dea 0.15 0.10 email:ap@greenfield.com.au invoice-consulting_long 0:cfebda697822 -0.06 0.10 invoicesummary -invoice-consulting_long 0:5656f37a9311 0.40 0.10 professionalservicesrenderedinac -invoice-consulting_long 0:a918299ac844 0.41 0.10 statementofworkfortheperiod -invoice-consulting_long 0:3fa8489d9aac -0.08 0.10 1may2025–25may2025. +invoice-consulting_long 0:5656f37a9311 0.15 0.10 professionalservicesrenderedinac +invoice-consulting_long 0:a918299ac844 0.16 0.10 statementofworkfortheperiod +invoice-consulting_long 0:3fa8489d9aac 0.12 0.10 1may2025–25may2025. invoice-consulting_long 0:c9046f7a37ad 0.67 -0.15 description invoice-consulting_long 0:b28225a1247c 0.67 -0.22 serviceperiod invoice-consulting_long 0:32e8369a9c4f 0.67 0.25 qty @@ -2346,12 +2346,12 @@ invoice-consulting_long 1:6b4894c28363 0.79 0.10 accountnumber: invoice-consulting_long 1:ef797c8118f0 0.79 0.10 12345678 invoice-consulting_long 1:c608665436db 0.79 0.10 reference: invoice-consulting_long 1:7d66eb3c1070 0.79 0.10 inv-2025-0478 -invoice-consulting_long 1:010450dee1ff 0.80 0.10 pleaseensuretheinvoicenumberisin +invoice-consulting_long 1:010450dee1ff 0.30 0.10 pleaseensuretheinvoicenumberisin invoice-consulting_long 1:ab5aa97074c4 0.14 0.12 notes -invoice-consulting_long 1:7c6ab37d83ef 0.10 0.12 thankyouforyourbusiness. -invoice-consulting_long 1:4a699e29a3bb 0.61 0.12 ifyouhaveanyquestionsregardingth -invoice-consulting_long 1:c766251af1f4 0.62 0.12 contactusataccounts@northpoint.c -invoice-consulting_long 1:3d32fa219332 0.63 0.12 +61398765432. +invoice-consulting_long 1:7c6ab37d83ef 0.30 0.12 thankyouforyourbusiness. +invoice-consulting_long 1:4a699e29a3bb 0.31 0.12 ifyouhaveanyquestionsregardingth +invoice-consulting_long 1:c766251af1f4 0.32 0.12 contactusataccounts@northpoint.c +invoice-consulting_long 1:3d32fa219332 0.33 0.12 +61398765432. invoice-consulting_long 1:a6f6e2ddab6d 0.75 0.12 paymentisduewithin30daysfromthei invoice-consulting_long 1:55ee5fe62c33 0.01 0.13 northpointconsultingptyltd|abn12 invoice-consulting_long 1:1bed6052d9b3 0.01 0.09 page2/2 @@ -2368,7 +2368,7 @@ invoice-luma_studio 0:2474519f77a9#2 -0.22 -0.01 unitedkingdom invoice-luma_studio 0:89b5eccb38ff 0.12 0.09 +44(0)2079460832 invoice-luma_studio 0:ea8232890494 0.07 0.09 hello@lumaandco.studio invoice-luma_studio 0:374d89493adc 0.03 0.09 www.lumaandco.studio -invoice-luma_studio 0:be3e8b44676d -0.05 0.09 companyno.12578934|vatno.3694567 +invoice-luma_studio 0:be3e8b44676d -0.25 0.09 companyno.12578934|vatno.3694567 invoice-luma_studio 0:52d6e3de4fa0 -10.79 0.02 invoice invoice-luma_studio 0:6bb089477e20 0.12 0.02 invoiceno. invoice-luma_studio 0:4435610d8a9f 0.19 0.01 inv-2024-0587 @@ -2438,7 +2438,7 @@ invoice-luma_studio 0:eeb53247f32c -0.56 0.08 ofluma&co.studiountilpayment invoice-luma_studio 0:9eef22d7d34e -0.61 0.08 hasbeenreceivedinfull. invoice-luma_studio 0:3c7ade679fdf -0.07 0.00 paymentdetails invoice-luma_studio 0:b1819c9cd5bf -0.34 0.00 pleasemakepaymentbybanktransfert -invoice-luma_studio 0:8c1e4a24f6a8 -0.10 0.00 luma&co.studioltd +invoice-luma_studio 0:8c1e4a24f6a8 -0.30 0.00 luma&co.studioltd invoice-luma_studio 0:4381dc2ab142 -0.14 0.00 bank invoice-luma_studio 0:447827e26127 -0.14 0.00 starlingbank invoice-luma_studio 0:10aeacde20ff -0.14 0.00 sortcode @@ -2465,7 +2465,7 @@ invoice-luma_studio_long 0:2474519f77a9#2 -0.22 -0.01 unitedkingdom invoice-luma_studio_long 0:89b5eccb38ff 0.12 0.09 +44(0)2079460832 invoice-luma_studio_long 0:ea8232890494 0.07 0.09 hello@lumaandco.studio invoice-luma_studio_long 0:374d89493adc 0.03 0.09 www.lumaandco.studio -invoice-luma_studio_long 0:be3e8b44676d -0.05 0.09 companyno.12578934|vatno.3694567 +invoice-luma_studio_long 0:be3e8b44676d -0.25 0.09 companyno.12578934|vatno.3694567 invoice-luma_studio_long 0:52d6e3de4fa0 -10.79 0.02 invoice invoice-luma_studio_long 0:6bb089477e20 0.12 0.02 invoiceno. invoice-luma_studio_long 0:4435610d8a9f 0.19 0.01 inv-2024-0587 @@ -2630,7 +2630,7 @@ invoice-luma_studio_long 2:eeb53247f32c -0.33 0.08 ofluma&co.studiountilpayment invoice-luma_studio_long 2:9eef22d7d34e -0.37 0.08 hasbeenreceivedinfull. invoice-luma_studio_long 2:3c7ade679fdf 0.17 0.00 paymentdetails invoice-luma_studio_long 2:b1819c9cd5bf -0.10 0.00 pleasemakepaymentbybanktransfert -invoice-luma_studio_long 2:8c1e4a24f6a8 0.14 0.00 luma&co.studioltd +invoice-luma_studio_long 2:8c1e4a24f6a8 -0.06 0.00 luma&co.studioltd invoice-luma_studio_long 2:4381dc2ab142 0.10 0.00 bank invoice-luma_studio_long 2:447827e26127 0.10 0.00 starlingbank invoice-luma_studio_long 2:10aeacde20ff 0.10 0.00 sortcode @@ -2838,9 +2838,9 @@ invoice-metered 0:e28672d64882 -0.04 0.12 northwindcloudservicesltd.isasub invoice-metered 0:985e43c2de34 -0.04 0.12 120riversideway,bristol,bs16qt,u invoice-metered 0:7b14b8d2c5c4 -0.04 0.16 page1of1 invoice-modern 0:52d6e3de4fa0 0.00 16.10 invoice -invoice-modern 0:30d85a94548c 0.30 16.10 invoicegc-2026-041issued02apr202 +invoice-modern 0:30d85a94548c 0.00 16.10 invoicegc-2026-041issued02apr202 invoice-modern 0:75857a458999 0.20 0.10 from -invoice-modern 0:c26c22b94338 0.18 0.10 graphcomposestudio +invoice-modern 0:c26c22b94338 -0.02 0.10 graphcomposestudio invoice-modern 0:2a08ce5567fb -0.10 0.10 18layoutstreet invoice-modern 0:fbeea547d99e -0.12 0.10 london,uk invoice-modern 0:faf1569a98e9 -0.15 0.10 ec1a4gc @@ -2848,7 +2848,7 @@ invoice-modern 0:befc6e9b5c24 -0.17 0.10 billing@graphcompose.dev invoice-modern 0:89674e6f130e -0.20 0.10 +442055551000 invoice-modern 0:a2b2e7d2906f -0.22 0.10 taxidgb-99887766 invoice-modern 0:aeba3a7b3598 0.20 0.11 billto -invoice-modern 0:f890faef907f 0.18 0.11 northwindsystems +invoice-modern 0:f890faef907f -0.02 0.11 northwindsystems invoice-modern 0:1b405eb431ca -0.10 0.11 attn:financeteam invoice-modern 0:91eefd794f79 -0.12 0.11 410marketavenue invoice-modern 0:00a97da4e243 -0.15 0.11 manchester,uk @@ -2890,19 +2890,19 @@ invoice-modern 0:434cc906ae90 0.02 0.14 billing@graphcompose.devfor invoice-modern 0:8822ea375315 0.02 0.14 remittancedetails. invoice-modern 0:1a7b5c840e25 0.02 0.11 •latepaymentsmaydelayadditional invoice-modern 0:1631a06d245f 0.02 0.14 templatecustomizationwork. -invoice-modern 0:e3337beaa171 0.00 0.10 thankyouforchoosinggraphcomposef +invoice-modern 0:e3337beaa171 -0.20 0.10 thankyouforchoosinggraphcomposef invoice-modern_long 0:52d6e3de4fa0 0.00 16.10 invoice -invoice-modern_long 0:61a964e78950 0.30 16.10 invoicegc-2026-042issued04may202 -invoice-modern_long 0:62a2fed3d6e0 0.30 16.10 pending +invoice-modern_long 0:61a964e78950 0.00 16.10 invoicegc-2026-042issued04may202 +invoice-modern_long 0:62a2fed3d6e0 0.00 16.10 pending invoice-modern_long 0:75857a458999 0.20 0.10 from -invoice-modern_long 0:c26c22b94338 0.18 0.10 graphcomposestudio +invoice-modern_long 0:c26c22b94338 -0.02 0.10 graphcomposestudio invoice-modern_long 0:2a08ce5567fb -0.10 0.10 18layoutstreet invoice-modern_long 0:fbeea547d99e -0.12 0.10 london,uk invoice-modern_long 0:faf1569a98e9 -0.15 0.10 ec1a4gc invoice-modern_long 0:befc6e9b5c24 -0.17 0.10 billing@graphcompose.dev invoice-modern_long 0:89674e6f130e -0.20 0.10 +442055551000 invoice-modern_long 0:aeba3a7b3598 0.20 0.11 billto -invoice-modern_long 0:f890faef907f 0.18 0.11 northwindsystems +invoice-modern_long 0:f890faef907f -0.02 0.11 northwindsystems invoice-modern_long 0:1b405eb431ca -0.10 0.11 attn:financeteam invoice-modern_long 0:91eefd794f79 -0.12 0.11 410marketavenue invoice-modern_long 0:00a97da4e243 -0.15 0.11 manchester,uk @@ -3052,7 +3052,7 @@ invoice-modern_long 1:24274f39b50b 0.22 0.11 •paymentduewithin14calendardays. invoice-modern_long 1:c438440ba377 0.22 0.11 •banktransferpreferred;contact invoice-modern_long 1:434cc906ae90 0.22 0.14 billing@graphcompose.devfor invoice-modern_long 1:8822ea375315 0.22 0.14 remittancedetails. -invoice-modern_long 1:e3337beaa171 0.20 0.10 thankyouforchoosinggraphcomposef +invoice-modern_long 1:e3337beaa171 0.00 0.10 thankyouforchoosinggraphcomposef invoice-obsidian 0:07f15cde5b18 0.14 0.09 kestrel invoice-obsidian 0:52d6e3de4fa0 0.12 0.09 invoice invoice-obsidian 0:5d1d1b79af09 0.02 0.09 invoicenumber @@ -3349,20 +3349,20 @@ invoice-platform 0:d5ef7c1f9830 -1.31 0.11 thankyouforrunningonauroracloud. invoice-platform 0:6a88f440b84e -1.31 0.11 manageyouraccountataurora.exampl invoice-platform 0:cf0a1e1dc87b -1.39 0.45 500harbourstreet,vancouver,bcv6c invoice-platform 0:7b14b8d2c5c4 0.02 0.44 page1of1 -invoice-subscription 0:435df6fdbffd 0.05 0.12 halstead +invoice-subscription 0:435df6fdbffd 0.00 0.12 halstead invoice-subscription 0:52d6e3de4fa0 0.02 -0.40 invoice -invoice-subscription 0:0a36c1665b7e 0.28 0.12 halsteadsoftwareltd. -invoice-subscription 0:6bc2056359b7 0.20 0.12 18chandlerrow -invoice-subscription 0:776a7e9eb92a 0.22 0.12 leedsls14qt -invoice-subscription 0:2474519f77a9 0.24 0.12 unitedkingdom -invoice-subscription 0:2474519f77a9#1 0.45 0.12 unitedkingdom -invoice-subscription 0:2474519f77a9#2 0.45 0.07 unitedkingdom +invoice-subscription 0:0a36c1665b7e -0.02 0.12 halsteadsoftwareltd. +invoice-subscription 0:6bc2056359b7 -0.05 0.12 18chandlerrow +invoice-subscription 0:776a7e9eb92a -0.03 0.12 leedsls14qt +invoice-subscription 0:2474519f77a9 -0.01 0.12 unitedkingdom +invoice-subscription 0:2474519f77a9#1 0.20 0.12 unitedkingdom +invoice-subscription 0:2474519f77a9#2 0.20 0.07 unitedkingdom invoice-subscription 0:bfdec553b85a 0.24 0.12 billing@halstead.example invoice-subscription 0:78acb3cb907b 0.27 0.12 www.halstead.example invoice-subscription 0:f1c030eb4329 0.29 0.12 vatnogb418227603 invoice-subscription 0:77ead61b5875 0.29 0.09 invoiceno invoice-subscription 0:0b0c0ee24de8 0.26 0.69 hs-inv-2026-0417 -invoice-subscription 0:0b0c0ee24de8#1 0.63 0.88 hs-inv-2026-0417 +invoice-subscription 0:0b0c0ee24de8#1 0.38 0.88 hs-inv-2026-0417 invoice-subscription 0:8feaf8016bab 0.34 0.09 issuedate invoice-subscription 0:4d49cb78b810 0.32 0.62 27august2026 invoice-subscription 0:ac10f8c16320 0.39 0.09 duedate @@ -3372,15 +3372,15 @@ invoice-subscription 0:56a2e019b8aa 0.42 0.38 14days invoice-subscription 0:466e5b9cd57f 0.50 0.09 currency invoice-subscription 0:54f8e1b3fe44 0.47 0.31 gbp invoice-subscription 0:aeba3a7b3598 0.51 0.12 billto -invoice-subscription 0:7bfc2b791f41 0.39 0.12 northlineconsultingltd -invoice-subscription 0:7bfc2b791f41#1 0.39 0.07 northlineconsultingltd -invoice-subscription 0:bcb7024f74fe 0.40 0.12 attn:sarahmitchell -invoice-subscription 0:13dd937d2fe6 0.42 0.12 21jubileeway -invoice-subscription 0:f9bab6a0b45b 0.43 0.12 londonse13ss +invoice-subscription 0:7bfc2b791f41 0.14 0.12 northlineconsultingltd +invoice-subscription 0:7bfc2b791f41#1 0.14 0.07 northlineconsultingltd +invoice-subscription 0:bcb7024f74fe 0.15 0.12 attn:sarahmitchell +invoice-subscription 0:13dd937d2fe6 0.17 0.12 21jubileeway +invoice-subscription 0:f9bab6a0b45b 0.18 0.12 londonse13ss invoice-subscription 0:725a8f5062e7 0.51 0.07 shipto -invoice-subscription 0:254289ce0191 0.40 0.07 thefoundry,2ndfloor -invoice-subscription 0:84db1f48facb 0.42 0.07 17-19greatsuffolkstreet -invoice-subscription 0:e7a5f0717d99 0.43 0.07 londonse10ns +invoice-subscription 0:254289ce0191 0.15 0.07 thefoundry,2ndfloor +invoice-subscription 0:84db1f48facb 0.17 0.07 17-19greatsuffolkstreet +invoice-subscription 0:e7a5f0717d99 0.18 0.07 londonse10ns invoice-subscription 0:c9046f7a37ad 0.54 0.12 description invoice-subscription 0:32e8369a9c4f 0.54 0.13 qty invoice-subscription 0:d1062d072acd 0.54 0.06 unitprice @@ -3416,19 +3416,19 @@ invoice-subscription 0:14edcfc20351 0.62 0.44 £189.40 invoice-subscription 0:57a66d21eb1b 0.67 0.11 totaldue invoice-subscription 0:cf1b68cc49ef 0.74 0.89 £1,136.40 invoice-subscription 0:3c7ade679fdf 0.79 0.12 paymentdetails -invoice-subscription 0:56ed021beb35 0.67 0.49 beneficiary -invoice-subscription 0:0b85f3c8ed04 0.63 0.33 halsteadsoftwareltd -invoice-subscription 0:4381dc2ab142 0.67 0.72 bank -invoice-subscription 0:6d50b2dd724f 0.63 0.84 northgatebank -invoice-subscription 0:10aeacde20ff 0.67 0.83 sortcode -invoice-subscription 0:b19b1415ef9b 0.63 0.94 40-05-30 -invoice-subscription 0:f92a9c925024 0.67 0.94 accountnumber -invoice-subscription 0:ef797c8118f0 0.63 0.97 12345678 -invoice-subscription 0:52367a6622b1 0.67 0.86 reference -invoice-subscription 0:04f7247e8e99 0.67 0.12 pleaseincludetheinvoicenumberast +invoice-subscription 0:56ed021beb35 0.42 0.49 beneficiary +invoice-subscription 0:0b85f3c8ed04 0.38 0.33 halsteadsoftwareltd +invoice-subscription 0:4381dc2ab142 0.42 0.72 bank +invoice-subscription 0:6d50b2dd724f 0.38 0.84 northgatebank +invoice-subscription 0:10aeacde20ff 0.42 0.83 sortcode +invoice-subscription 0:b19b1415ef9b 0.38 0.94 40-05-30 +invoice-subscription 0:f92a9c925024 0.42 0.94 accountnumber +invoice-subscription 0:ef797c8118f0 0.38 0.97 12345678 +invoice-subscription 0:52367a6622b1 0.42 0.86 reference +invoice-subscription 0:04f7247e8e99 0.42 0.12 pleaseincludetheinvoicenumberast invoice-subscription 0:7c6ab37d83ef 0.71 23.79 thankyouforyourbusiness. -invoice-subscription 0:354ffeb2bbc3 0.67 23.79 paymentisdueby10september2026.if -invoice-subscription 0:7f7d98088133 0.68 23.79 foranyqueries,pleasecontactbilli +invoice-subscription 0:354ffeb2bbc3 0.42 23.79 paymentisdueby10september2026.if +invoice-subscription 0:7f7d98088133 0.43 23.79 foranyqueries,pleasecontactbilli invoice-subscription 0:7b14b8d2c5c4 0.00 0.09 page1of1 invoice-workspace 0:07f15cde5b18 0.15 0.11 kestrel invoice-workspace 0:07f15cde5b18#1 -0.54 0.11 kestrel @@ -3520,7 +3520,7 @@ invoice-workspace 0:18e82fbd48a3 -0.84 0.12 questionsaboutthisinvoice?reachu invoice-workspace 0:3c72ba0e1eb8 -0.97 0.06 500howardstreet,6thfloor,sanfran invoice-workspace 0:9e2917e23527 -0.98 -0.12 kestrel.example invoice-workspace 0:7b14b8d2c5c4 -0.05 -0.13 page1of1 -letter-blue_banner 0:8f1010120ed6 0.42 1.90 jordanrivera +letter-blue_banner 0:8f1010120ed6 0.02 1.90 jordanrivera letter-blue_banner 0:8f1010120ed6#1 -0.02 0.10 jordanrivera letter-blue_banner 0:8d7a2cca3060 -0.20 0.14 +442055551000|jordan.rivera@exam letter-blue_banner 0:bef81b541365 -0.21 0.10 dearhiringteamatnorthwindsystems @@ -3531,18 +3531,18 @@ letter-blue_banner 0:eae27893a255 -0.42 0.10 therestoftheteam. letter-blue_banner 0:a71e98216baa -0.08 0.10 iwouldwelcometheopportunitytobri letter-blue_banner 0:80a6a628ad52 -0.05 0.10 sincerely, letter-boxed_sections 0:8f1010120ed6 0.46 2.20 jordanrivera -letter-boxed_sections 0:8f1010120ed6#1 0.33 0.10 jordanrivera +letter-boxed_sections 0:8f1010120ed6#1 0.13 0.10 jordanrivera letter-boxed_sections 0:8d7a2cca3060 0.23 0.12 +442055551000|jordan.rivera@exam -letter-boxed_sections 0:bef81b541365 0.29 0.10 dearhiringteamatnorthwindsystems +letter-boxed_sections 0:bef81b541365 0.09 0.10 dearhiringteamatnorthwindsystems letter-boxed_sections 0:ab54410ead82 -0.01 0.10 iamexcitedtosharemyinterestinthe letter-boxed_sections 0:9185168d2cf8 0.00 0.10 document-generationsystemsthatba letter-boxed_sections 0:5fb2802723b6 0.00 0.10 ienjoytranslatingfuzzyworkflowre letter-boxed_sections 0:dab2d688b7ab 0.01 0.10 adoptioneasierfortherestofthetea -letter-boxed_sections 0:a71e98216baa 0.31 0.10 iwouldwelcometheopportunitytobri -letter-boxed_sections 0:80a6a628ad52 0.32 0.10 sincerely, -letter-centered_headline 0:8f1010120ed6 -0.50 2.39 jordanrivera +letter-boxed_sections 0:a71e98216baa 0.11 0.10 iwouldwelcometheopportunitytobri +letter-boxed_sections 0:80a6a628ad52 0.12 0.10 sincerely, +letter-centered_headline 0:8f1010120ed6 -0.05 2.39 jordanrivera letter-centered_headline 0:8f1010120ed6#1 -0.06 0.10 jordanrivera -letter-centered_headline 0:2d58f0cadc2d -0.18 1.40 platformengineer +letter-centered_headline 0:2d58f0cadc2d -0.03 1.40 platformengineer letter-centered_headline 0:8d7a2cca3060 -0.23 0.28 +442055551000|jordan.rivera@exam letter-centered_headline 0:bef81b541365 -0.25 0.10 dearhiringteamatnorthwindsystems letter-centered_headline 0:ab54410ead82 0.09 0.10 iamexcitedtosharemyinterestinthe @@ -3552,15 +3552,15 @@ letter-centered_headline 0:dab2d688b7ab 0.14 0.10 adoptioneasierfortherestofthet letter-centered_headline 0:a71e98216baa -0.12 0.10 iwouldwelcometheopportunitytobri letter-centered_headline 0:80a6a628ad52 -0.09 0.10 sincerely, letter-classic_serif 0:8f1010120ed6 -0.15 2.60 jordanrivera -letter-classic_serif 0:8f1010120ed6#1 0.02 0.10 jordanrivera -letter-classic_serif 0:8d7a2cca3060 0.19 -0.52 +442055551000|jordan.rivera@exam -letter-classic_serif 0:bef81b541365 0.20 0.10 dearhiringteamatnorthwindsystems +letter-classic_serif 0:8f1010120ed6#1 -0.13 0.10 jordanrivera +letter-classic_serif 0:8d7a2cca3060 -0.01 -0.52 +442055551000|jordan.rivera@exam +letter-classic_serif 0:bef81b541365 0.05 0.10 dearhiringteamatnorthwindsystems letter-classic_serif 0:ab54410ead82 -0.08 0.10 iamexcitedtosharemyinterestinthe letter-classic_serif 0:9185168d2cf8 -0.10 0.10 document-generationsystemsthatba letter-classic_serif 0:a463bced3db2 -0.13 0.10 ienjoytranslatingfuzzyworkflowre letter-classic_serif 0:dd474e249222 -0.15 0.10 makeadoptioneasierfortherestofth -letter-classic_serif 0:a71e98216baa 0.07 0.10 iwouldwelcometheopportunitytobri -letter-classic_serif 0:80a6a628ad52 0.05 0.10 sincerely, +letter-classic_serif 0:a71e98216baa -0.08 0.10 iwouldwelcometheopportunitytobri +letter-classic_serif 0:80a6a628ad52 -0.10 0.10 sincerely, letter-compact_mono 0:8f1010120ed6 0.31 16.10 jordanrivera letter-compact_mono 0:8f1010120ed6#1 -0.13 0.10 jordanrivera letter-compact_mono 0:f9e4560bd641 -0.24 16.10 london,uk/+442055551000/jordan.r @@ -3569,18 +3569,18 @@ letter-compact_mono 0:1382a6e37675 -0.35 0.10 ienjoytranslatingfuzzyworkflowre letter-compact_mono 0:d8e633770b49 -0.38 0.10 easierfortherestoftheteam. letter-compact_mono 0:a71e98216baa -0.13 0.10 iwouldwelcometheopportunitytobri letter-compact_mono 0:80a6a628ad52 -0.12 0.10 sincerely, -letter-editorial_blue 0:8f1010120ed6 0.45 0.12 jordanrivera -letter-editorial_blue 0:8f1010120ed6#1 0.16 0.10 jordanrivera -letter-editorial_blue 0:2d58f0cadc2d 0.22 0.13 platformengineer -letter-editorial_blue 0:1b28eb6a9a2e 0.14 0.13 +442055551000-london,uk -letter-editorial_blue 0:8817bf9310b6 0.11 0.11 jordan.rivera@example.com|linked -letter-editorial_blue 0:bef81b541365 0.13 0.10 dearhiringteamatnorthwindsystems +letter-editorial_blue 0:8f1010120ed6 -0.05 0.12 jordanrivera +letter-editorial_blue 0:8f1010120ed6#1 -0.04 0.10 jordanrivera +letter-editorial_blue 0:2d58f0cadc2d 0.02 0.13 platformengineer +letter-editorial_blue 0:1b28eb6a9a2e -0.06 0.13 +442055551000-london,uk +letter-editorial_blue 0:8817bf9310b6 -0.09 0.11 jordan.rivera@example.com|linked +letter-editorial_blue 0:bef81b541365 -0.07 0.10 dearhiringteamatnorthwindsystems letter-editorial_blue 0:ab54410ead82 -0.16 0.10 iamexcitedtosharemyinterestinthe letter-editorial_blue 0:9185168d2cf8 -0.16 0.10 document-generationsystemsthatba letter-editorial_blue 0:0c42fe9f3491 -0.15 0.10 ienjoytranslatingfuzzyworkflowre letter-editorial_blue 0:dda41d31bb3c -0.15 0.10 thatmakeadoptioneasierfortherest -letter-editorial_blue 0:a71e98216baa 0.16 0.10 iwouldwelcometheopportunitytobri -letter-editorial_blue 0:80a6a628ad52 0.16 0.10 sincerely, +letter-editorial_blue 0:a71e98216baa -0.04 0.10 iwouldwelcometheopportunitytobri +letter-editorial_blue 0:80a6a628ad52 -0.04 0.10 sincerely, letter-engineering_resume 0:8f1010120ed6 0.15 15.10 jordanrivera letter-engineering_resume 0:8f1010120ed6#1 -0.16 0.10 jordanrivera letter-engineering_resume 0:2d58f0cadc2d -0.25 15.10 platformengineer @@ -3609,29 +3609,29 @@ letter-executive 0:7c5a9817c868 0.18 0.10 iwouldwelcometheopportunitytobri letter-executive 0:4012eb4b05db 0.18 0.10 group. letter-executive 0:80a6a628ad52 -0.10 0.10 sincerely, letter-mint-editorial-letter 0:8f1010120ed6 -1.30 2.33 jordanrivera -letter-mint-editorial-letter 0:8f1010120ed6#1 -0.16 0.10 jordanrivera -letter-mint-editorial-letter 0:2d58f0cadc2d -0.27 0.12 platformengineer -letter-mint-editorial-letter 0:bef81b541365 -0.16 0.10 dearhiringteamatnorthwindsystems -letter-mint-editorial-letter 0:ab54410ead82 0.29 0.10 iamexcitedtosharemyinterestinthe -letter-mint-editorial-letter 0:9185168d2cf8 0.29 0.10 document-generationsystemsthatba -letter-mint-editorial-letter 0:a463bced3db2 0.29 0.10 ienjoytranslatingfuzzyworkflowre -letter-mint-editorial-letter 0:dd474e249222 0.29 0.10 makeadoptioneasierfortherestofth -letter-mint-editorial-letter 0:a71e98216baa -0.16 0.10 iwouldwelcometheopportunitytobri -letter-mint-editorial-letter 0:80a6a628ad52 -0.16 0.10 sincerely, +letter-mint-editorial-letter 0:8f1010120ed6#1 -0.01 0.10 jordanrivera +letter-mint-editorial-letter 0:2d58f0cadc2d -0.02 0.12 platformengineer +letter-mint-editorial-letter 0:bef81b541365 -0.01 0.10 dearhiringteamatnorthwindsystems +letter-mint-editorial-letter 0:ab54410ead82 -0.01 0.10 iamexcitedtosharemyinterestinthe +letter-mint-editorial-letter 0:9185168d2cf8 -0.01 0.10 document-generationsystemsthatba +letter-mint-editorial-letter 0:a463bced3db2 -0.01 0.10 ienjoytranslatingfuzzyworkflowre +letter-mint-editorial-letter 0:dd474e249222 -0.01 0.10 makeadoptioneasierfortherestofth +letter-mint-editorial-letter 0:a71e98216baa -0.01 0.10 iwouldwelcometheopportunitytobri +letter-mint-editorial-letter 0:80a6a628ad52 -0.01 0.10 sincerely, letter-modern_professional 0:8f1010120ed6 0.00 0.16 jordanrivera -letter-modern_professional 0:8f1010120ed6#1 0.22 0.10 jordanrivera +letter-modern_professional 0:8f1010120ed6#1 0.02 0.10 jordanrivera letter-modern_professional 0:89ff05847e96 0.14 0.16 london,uk|+442055551000 letter-modern_professional 0:8817bf9310b6 0.11 0.10 jordan.rivera@example.com|linked -letter-modern_professional 0:bef81b541365 0.22 0.10 dearhiringteamatnorthwindsystems +letter-modern_professional 0:bef81b541365 0.02 0.10 dearhiringteamatnorthwindsystems letter-modern_professional 0:c65db8c80e17 -0.08 0.10 iamexcitedtosharemyinterestinthe letter-modern_professional 0:c8d01ef84078 -0.08 0.10 reusabledocument-generationsyste letter-modern_professional 0:2e5ddee14dbc -0.08 0.10 ienjoytranslatingfuzzyworkflowre letter-modern_professional 0:906501a5e847 -0.08 0.10 examplesthatmakeadoptioneasierfo letter-modern_professional 0:7c5a9817c868 -0.08 0.10 iwouldwelcometheopportunitytobri letter-modern_professional 0:4012eb4b05db -0.08 0.10 group. -letter-modern_professional 0:80a6a628ad52 0.22 0.10 sincerely, -letter-monogram_sidebar 0:136c67657614 -0.38 2.82 jordan -letter-monogram_sidebar 0:8ba35ebe3d5c -0.37 2.85 rivera +letter-modern_professional 0:80a6a628ad52 0.02 0.10 sincerely, +letter-monogram_sidebar 0:136c67657614 0.02 2.82 jordan +letter-monogram_sidebar 0:8ba35ebe3d5c 0.03 2.85 rivera letter-monogram_sidebar 0:2d58f0cadc2d -0.19 0.13 platformengineer letter-monogram_sidebar 0:8d7a2cca3060 -0.17 0.24 +442055551000|jordan.rivera@exam letter-monogram_sidebar 0:bef81b541365 -0.23 0.10 dearhiringteamatnorthwindsystems @@ -3657,7 +3657,7 @@ letter-nordic_clean 0:26e89af4523d -0.38 0.10 ienjoytranslatingfuzzyworkflowre letter-nordic_clean 0:27c5581ffbbc -0.39 0.10 restoftheteam. letter-nordic_clean 0:a71e98216baa -0.14 0.10 iwouldwelcometheopportunitytobri letter-nordic_clean 0:80a6a628ad52 -0.14 0.10 sincerely, -letter-panel 0:8f1010120ed6 -0.75 8.57 jordanrivera +letter-panel 0:8f1010120ed6 0.00 8.57 jordanrivera letter-panel 0:8f1010120ed6#1 0.06 0.10 jordanrivera letter-panel 0:2d58f0cadc2d -0.23 8.27 platformengineer letter-panel 0:89ff05847e96 -0.16 8.54 london,uk|+442055551000 @@ -3670,7 +3670,7 @@ letter-panel 0:dda41d31bb3c -0.21 0.10 thatmakeadoptioneasierfortherest letter-panel 0:7c5a9817c868 -0.19 0.10 iwouldwelcometheopportunitytobri letter-panel 0:4012eb4b05db -0.17 0.10 group. letter-panel 0:80a6a628ad52 0.05 0.10 sincerely, -letter-sidebar_portrait 0:8f1010120ed6 -0.73 0.14 jordanrivera +letter-sidebar_portrait 0:8f1010120ed6 -0.03 0.14 jordanrivera letter-sidebar_portrait 0:8f1010120ed6#1 -0.13 0.10 jordanrivera letter-sidebar_portrait 0:2d58f0cadc2d -0.23 0.49 platformengineer letter-sidebar_portrait 0:8d7a2cca3060 -0.22 0.48 +442055551000|jordan.rivera@exam @@ -3714,7 +3714,7 @@ proposal-editorial 0:d28f860aec04 0.57 0.10 ourprocessblendsstrategicthinkin proposal-editorial 0:53fcd88ebb00 0.57 0.10 cohesivebrandsystemandamodern,co proposal-editorial 0:95bad9757a67 0.57 0.10 outcomewillbeaclear,confidentpre proposal-editorial 0:8863e2b998da 0.57 0.10 improvesengagement,andsupportsyo -proposal-editorial 0:f16c2c2f1999 -0.92 0.10 projectgoals +proposal-editorial 0:f16c2c2f1999 0.23 0.10 projectgoals proposal-editorial 0:c008ab0ba85f 0.16 0.10 projectduration proposal-editorial 0:5a6b4bf425f2 -0.05 0.10 6weeks proposal-editorial 0:7aa73e5c14d3 0.23 0.10 startwindow @@ -3736,7 +3736,7 @@ proposal-editorial 0:04b5995c746f -0.25 0.06 touchpoints. proposal-editorial 0:b45d848fe1b6 1.75 0.07 buildascalabledigital proposal-editorial 0:e8228bfeba0e 0.75 0.07 foundationforfuture proposal-editorial 0:1fa35c7a1402 -0.25 0.07 growth. -proposal-editorial 0:bc981abcdf59 -0.73 0.10 scopeofwork +proposal-editorial 0:bc981abcdf59 0.42 0.10 scopeofwork proposal-editorial 0:28450edd9a4f 0.35 0.05 discovery&research proposal-editorial 0:ce9012b74aa2 0.60 0.08 stakeholderinterviews,brandaudit proposal-editorial 0:730c3e278933 0.32 0.08 audienceinsightstoinformstrategy @@ -3753,7 +3753,7 @@ proposal-editorial 0:8c7703bb6fb7 0.71 0.05 launchsupport proposal-editorial 0:34f9fe468474 0.96 0.08 developerhandoff,qasupport,train proposal-editorial 0:2b4cf15f6f16 0.68 0.08 toensureasmoothlaunch. proposal-editorial 0:026890c58de9 0.01 0.10 northlinestudio|northlinestudio. -proposal-editorial 1:e35c32bb5ed8 -46.41 0.10 deliverables +proposal-editorial 1:e35c32bb5ed8 -45.26 0.10 deliverables proposal-editorial 1:23eb79a19b39 -45.38 0.60 brandstrategysummary proposal-editorial 1:aaa2a6073d69 -45.38 0.60 refinedlogosuite&brandguidelines proposal-editorial 1:d626f7532564 -45.38 0.60 color,typography&designsystem @@ -3764,7 +3764,7 @@ proposal-editorial 1:d524c1a0811d -45.28 0.10 mobile proposal-editorial 1:8b712e7e93bf -45.40 0.58 contentstrategy&pagetemplates proposal-editorial 1:e9bf06d9b130 -45.40 0.58 developer-readyassets&specificat proposal-editorial 1:e93e7ba95ceb -45.40 0.58 launchchecklist&trainingsession -proposal-editorial 1:94d192b3a326 -46.32 0.10 timeline +proposal-editorial 1:94d192b3a326 -45.17 0.10 timeline proposal-editorial 1:02195b8e9896 -45.21 0.45 phase proposal-editorial 1:c51faa148557 -45.21 0.42 focus proposal-editorial 1:caa79af4db67 -45.21 0.44 duration @@ -3817,9 +3817,9 @@ proposal-editorial 1:832db31f5c9a -44.97 0.62 includestworoundsofrevisionsper proposal-editorial 1:5130aeada3db -44.97 0.14 majordeliverable. proposal-editorial 1:ffce6ed7e6e5 -44.99 0.62 finalfilesandhandoffdeliveredupo proposal-editorial 1:566f68df6dd8 -44.99 0.14 finalpayment. -proposal-editorial 1:06ebb5670fa8 -45.31 0.62 ownershipofallfinaldeliverables -proposal-editorial 1:deda6d86d965 -44.96 0.14 transferstoasterahealthco.after -proposal-editorial 1:aaa7d3e9affb -45.38 0.14 fullpaymentisreceived. +proposal-editorial 1:06ebb5670fa8 -45.26 0.62 ownershipofallfinaldeliverables +proposal-editorial 1:deda6d86d965 -44.91 0.14 transferstoasterahealthco.after +proposal-editorial 1:aaa7d3e9affb -45.33 0.14 fullpaymentisreceived. proposal-editorial 1:c1514c6cdad1 -45.29 9.50 acceptance proposal-editorial 1:893663b06769 -44.26 9.50 bysigningbelow,youagreetothescop proposal-editorial 1:df16232de5b9 -44.27 9.50 acceptedby: @@ -3897,26 +3897,26 @@ proposal-indigo 0:732bcbb66cec 0.68 0.05 kestrelpaymentsltd proposal-indigo 0:3898e7b5f79b 0.71 0.05 7harbourcircus,canarywharf,londo proposal-indigo 0:29208032c874 0.72 0.05 kestrel.example/business|busines proposal-modern 0:ecd1378bc9dc 0.00 16.10 proposal -proposal-modern 0:f592a683c61d 0.27 16.10 documentplatformconsolidation -proposal-modern 0:bbe07492ee1f 0.32 16.10 proposalgc-p-2026-014prepared02a +proposal-modern 0:f592a683c61d -0.03 16.10 documentplatformconsolidation +proposal-modern 0:bbe07492ee1f 0.02 16.10 proposalgc-p-2026-014prepared02a proposal-modern 0:566835ed7fba 0.23 12.35 executivesummary -proposal-modern 0:7ccf0e6c59fa 0.20 12.35 aphasedengagementtoretireper-tea +proposal-modern 0:7ccf0e6c59fa 0.00 12.35 aphasedengagementtoretireper-tea proposal-modern 0:75857a458999 0.18 0.10 from -proposal-modern 0:c26c22b94338 0.15 0.10 graphcomposestudio +proposal-modern 0:c26c22b94338 -0.05 0.10 graphcomposestudio proposal-modern 0:2a08ce5567fb -0.12 0.10 18layoutstreet proposal-modern 0:fbeea547d99e -0.15 0.10 london,uk proposal-modern 0:3c8401edb4cc -0.17 0.10 hello@graphcompose.dev proposal-modern 0:89674e6f130e -0.20 0.10 +442055551000 proposal-modern 0:213a61c7aeb6 -0.22 0.10 graphcompose.dev -proposal-modern 0:f890faef907f 0.15 0.11 northwindsystems +proposal-modern 0:f890faef907f -0.05 0.11 northwindsystems proposal-modern 0:577a7fcdaa02 -0.12 0.11 attn:procurement proposal-modern 0:91eefd794f79 -0.15 0.11 410marketavenue proposal-modern 0:3daace874084 -0.17 0.11 procurement@northwind.example -proposal-modern 0:5f161c914988 0.19 0.10 scope -proposal-modern 0:9e580657f485 0.03 0.10 discovery,architecture,andarefer -proposal-modern 0:cec9111de36d 0.19 0.10 approach -proposal-modern 0:3215ea3be6d9 0.03 0.10 iterativedeliverywithweeklycheck -proposal-modern 0:94d192b3a326 0.19 0.10 timeline +proposal-modern 0:5f161c914988 -0.21 0.10 scope +proposal-modern 0:9e580657f485 -0.17 0.10 discovery,architecture,andarefer +proposal-modern 0:cec9111de36d -0.21 0.10 approach +proposal-modern 0:3215ea3be6d9 -0.17 0.10 iterativedeliverywithweeklycheck +proposal-modern 0:94d192b3a326 -0.21 0.10 timeline proposal-modern 0:02195b8e9896 0.03 0.40 phase proposal-modern 0:caa79af4db67 0.03 0.35 duration proposal-modern 0:41ffd8b76afc 0.03 0.35 details @@ -3928,7 +3928,7 @@ proposal-modern 0:44575cf5b285 0.10 0.40 build proposal-modern 0:44575cf5b285#1 0.10 0.40 build proposal-modern 0:5a6b4bf425f2 0.10 0.35 6weeks proposal-modern 0:7a802048127d 0.10 0.35 engine+templatemigration -proposal-modern 0:f9b21c4bda58 0.19 0.10 investment +proposal-modern 0:f9b21c4bda58 -0.21 0.10 investment proposal-modern 0:4a33eacd5fa6 0.03 0.40 item proposal-modern 0:c9046f7a37ad 0.03 0.35 description proposal-modern 0:cf38d95c9c6b 0.03 1.42 amount @@ -3936,10 +3936,10 @@ proposal-modern 0:fe9b6b4f133b 0.10 0.35 workshops+auditgbp6,000 proposal-modern 0:62e788ae3916 0.10 0.35 engine+templatesgbp24,000 proposal-modern 0:11239872d178 0.00 0.40 total proposal-modern 0:1c3065490625 0.00 1.42 gbp30,000 -proposal-modern 0:63feb7230a5d 0.17 0.10 acceptanceterms +proposal-modern 0:63feb7230a5d -0.23 0.10 acceptanceterms proposal-modern 0:35046a9f5675 0.10 9.60 •50%onsignature,50%ondelivery. proposal-modern 0:f03c1877ea2b 0.10 9.60 •validfor30daysfromthepreparedda -proposal-modern 0:90572e911376 0.02 0.10 thankyouforconsideringgraphcompo +proposal-modern 0:90572e911376 -0.18 0.10 thankyouforconsideringgraphcompo proposal-northline 0:5205c2a261bc -0.44 0.05 northline proposal-northline 0:da0daaba4b15 -0.44 0.05 studio proposal-northline 0:ecd1378bc9dc -0.38 1.93 proposal @@ -4063,9 +4063,9 @@ proposal-northline 1:832db31f5c9a 0.03 0.57 includestworoundsofrevisionsper proposal-northline 1:5130aeada3db 0.05 0.09 majordeliverable. proposal-northline 1:ffce6ed7e6e5 0.03 0.57 finalfilesandhandoffdeliveredupo proposal-northline 1:566f68df6dd8 0.05 0.09 finalpayment. -proposal-northline 1:06ebb5670fa8 0.33 0.57 ownershipofallfinaldeliverables -proposal-northline 1:5312201597c1 0.70 0.09 transferstoasterahealthco.afterf -proposal-northline 1:d31e8d77a816 0.30 0.09 paymentisreceived. +proposal-northline 1:06ebb5670fa8 -0.12 0.57 ownershipofallfinaldeliverables +proposal-northline 1:5312201597c1 0.25 0.09 transferstoasterahealthco.afterf +proposal-northline 1:d31e8d77a816 -0.15 0.09 paymentisreceived. proposal-northline 1:c1514c6cdad1 0.41 11.46 acceptance proposal-northline 1:893663b06769 0.73 11.45 bysigningbelow,youagreetothescop proposal-northline 1:df16232de5b9 0.72 11.45 acceptedby: @@ -4074,31 +4074,31 @@ proposal-northline 1:c74c9cd82f13 0.72 11.42 date: proposal-northline 1:026890c58de9 0.01 0.10 northlinestudio|northlinestudio. receipt-modern 0:2b019b5b46da 0.31 0.10 northwindpay receipt-modern 0:a3c304a23bb1 0.30 0.16 transferconfirmation -receipt-modern 0:e885a92f5bb7 0.18 -0.02 generatedon09august2026 -receipt-modern 0:c288dd6df716 0.19 -0.20 referencenwp-4821-0067 +receipt-modern 0:e885a92f5bb7 -0.02 -0.02 generatedon09august2026 +receipt-modern 0:c288dd6df716 -0.01 -0.20 referencenwp-4821-0067 receipt-modern 0:9de2a2d7cd7a 0.18 17.60 amountcollected receipt-modern 0:465691680b99 0.03 17.60 £66.62 receipt-modern 0:465691680b99#1 0.29 -0.90 £66.62 receipt-modern 0:465691680b99#2 0.29 -0.90 £66.62 -receipt-modern 0:4260e5ae365d 0.20 17.60 directdebitcollectedbyharbourfin +receipt-modern 0:4260e5ae365d 0.00 17.60 directdebitcollectedbyharbourfin receipt-modern 0:4ddb3e96801a 0.18 26.66 completed -receipt-modern 0:a22e6dacae05 0.24 17.69 valuedate07jul2026 -receipt-modern 0:53becbb168d1 0.24 17.68 operationdate07jul2026 -receipt-modern 0:b311cb4017a4 0.24 17.65 schemebacsdirectdebit +receipt-modern 0:a22e6dacae05 0.04 17.69 valuedate07jul2026 +receipt-modern 0:53becbb168d1 0.04 17.68 operationdate07jul2026 +receipt-modern 0:b311cb4017a4 0.04 17.65 schemebacsdirectdebit receipt-modern 0:1bd90283f7fe 0.18 16.10 paidfrom -receipt-modern 0:0293c2cdfa58 0.23 16.10 alexsample +receipt-modern 0:0293c2cdfa58 -0.02 16.10 alexsample receipt-modern 0:85d2c9e53e92 -0.03 16.10 12exampleway receipt-modern 0:db3b3fcfe2d1 -0.02 16.10 brentfordtw00aa receipt-modern 0:2474519f77a9 -0.01 16.10 unitedkingdom -receipt-modern 0:a3570420c75d 0.29 16.10 account••••4396 -receipt-modern 0:d2f5582b8015 0.29 16.10 sortcode00-00-00 +receipt-modern 0:a3570420c75d 0.09 16.10 account••••4396 +receipt-modern 0:d2f5582b8015 0.09 16.10 sortcode00-00-00 receipt-modern 0:c4ab31d8c668 0.18 16.06 paidto -receipt-modern 0:c032ca75a3a7 0.23 16.06 harbourfinanceltd +receipt-modern 0:c032ca75a3a7 -0.02 16.06 harbourfinanceltd receipt-modern 0:995c51cebabe -0.02 16.06 1samplequay receipt-modern 0:f05e0b2f4fe3 -0.01 16.06 manchesterm00aa -receipt-modern 0:597533badf94 0.29 16.06 account••••5604 -receipt-modern 0:a5938b687682 0.29 16.06 sortcode00-00-11 -receipt-modern 0:5434155c0fda 0.23 0.10 transferdetails +receipt-modern 0:597533badf94 0.09 16.06 account••••5604 +receipt-modern 0:a5938b687682 0.09 16.06 sortcode00-00-11 +receipt-modern 0:5434155c0fda 0.03 0.10 transferdetails receipt-modern 0:a4d7978db2aa 0.29 0.10 mandatereference receipt-modern 0:0123b9cf310f 0.29 -0.95 mnd-0110-8054-5652 receipt-modern 0:3840804e6235 0.29 0.10 transactionid @@ -4107,22 +4107,22 @@ receipt-modern 0:2cbaa23e0a56 0.29 0.10 paymentscheme receipt-modern 0:1477cb720a28 0.29 -0.94 bacsdirectdebit receipt-modern 0:1fa78044a7da 0.29 0.10 statementdescription receipt-modern 0:b77918146dd3 0.29 -0.92 harbourfin4821 -receipt-modern 0:c72294b34f1a 0.23 0.10 amountbreakdown +receipt-modern 0:c72294b34f1a 0.03 0.10 amountbreakdown receipt-modern 0:cf38d95c9c6b 0.29 0.10 amount receipt-modern 0:dc40efafaeb3 0.29 0.10 transferfee receipt-modern 0:3a82ba6903c6 0.29 -0.86 £0.00 receipt-modern 0:1cdd81427c35 0.29 0.10 exchangerate receipt-modern 0:0311534a9954 0.29 -0.91 1.00gbp/gbp receipt-modern 0:c1dc9f641ca3 0.29 0.10 totaldebited -receipt-modern 0:de149c2431a2 0.23 0.10 paymentprogress +receipt-modern 0:de149c2431a2 0.03 0.10 paymentprogress receipt-modern 0:4568e72e6bfd 0.29 0.06 instructed -receipt-modern 0:c5f62da028cc 0.25 0.06 07jul2026,08:12bst·collectionreq +receipt-modern 0:c5f62da028cc 0.05 0.06 07jul2026,08:12bst·collectionreq receipt-modern 0:788d0109e065 0.30 0.06 inclearing -receipt-modern 0:7cb44e46733a 0.26 0.06 08jul2026,09:00bst·three-working +receipt-modern 0:7cb44e46733a 0.06 0.06 08jul2026,09:00bst·three-working receipt-modern 0:d31e014808ec 0.31 0.06 settled -receipt-modern 0:06cb75439693 0.27 0.06 09jul2026,06:30bst·fundsdebiteda -receipt-modern 0:ab5aa97074c4 0.26 0.10 notes -receipt-modern 0:a8da22f90eac 0.31 0.10 keepthisconfirmationforyourrecor +receipt-modern 0:06cb75439693 0.07 0.06 09jul2026,06:30bst·fundsdebiteda +receipt-modern 0:ab5aa97074c4 0.06 0.10 notes +receipt-modern 0:a8da22f90eac 0.06 0.10 keepthisconfirmationforyourrecor receipt-modern 0:59941ac03c12 0.29 0.05 scantocheckthisconfirmationagain receipt-modern 0:868e2517782a 0.03 0.05 support+442000000000 receipt-modern 0:94d25770d489 0.03 0.05 help@northwind-pay.example diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv index 939b8b05f..d8ff8cfd9 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-linux.tsv @@ -1,19 +1,19 @@ # libreoffice build 420(Build:2) on linux document engine_pages editor_pages lines matched median p90 over2 cv-blue_banner 2 2 54 52 0.13 0.45 0 -cv-boxed_sections 2 2 58 58 0.26 0.37 0 -cv-centered_headline 2 2 58 56 0.14 0.32 0 +cv-boxed_sections 2 2 58 58 0.23 0.36 0 +cv-centered_headline 2 2 58 56 0.13 0.31 0 cv-charcoal_gold 1 1 85 83 0.17 0.24 0 -cv-classic_serif 2 2 57 54 0.26 0.31 0 -cv-compact_mono 1 1 58 58 0.17 0.32 0 -cv-editorial_blue 2 2 82 82 0.08 0.30 0 +cv-classic_serif 2 2 57 54 0.10 0.28 0 +cv-compact_mono 1 1 58 58 0.17 0.31 0 +cv-editorial_blue 2 2 82 82 0.09 0.30 0 cv-engineering_resume 1 1 57 57 0.26 0.38 0 cv-executive 2 2 60 60 0.26 0.50 0 cv-midnight_navy 1 1 86 84 0.28 0.87 0 -cv-minimal_underlined 2 2 59 59 0.35 0.64 0 -cv-mint_editorial 2 2 59 59 0.27 0.60 0 -cv-modern_professional 2 2 61 59 0.23 0.25 0 -cv-monogram_sidebar 1 1 53 50 0.22 0.44 0 +cv-minimal_underlined 2 2 59 59 0.33 0.62 0 +cv-mint_editorial 2 2 59 59 0.07 0.30 0 +cv-modern_professional 2 2 61 59 0.06 0.24 0 +cv-monogram_sidebar 1 1 53 50 0.20 0.44 0 cv-navy_sidebar 1 1 71 71 0.20 0.45 0 cv-nordic_clean 1 1 63 58 0.25 0.43 0 cv-orange_ops 1 1 108 106 0.18 0.38 0 @@ -26,39 +26,39 @@ cv-teal_pulse 1 1 57 57 0.22 0.63 0 cv-terracotta_rail 1 1 102 102 0.44 0.94 0 cv-timeline_minimal 2 2 89 87 0.45 0.49 0 cv-violet_grid 1 1 80 78 0.26 0.54 0 -invoice-classic 1 1 56 56 0.12 0.30 0 -invoice-classic_long 2 2 166 166 0.20 0.27 0 -invoice-consulting 1 1 92 92 0.67 0.96 0 +invoice-classic 1 1 56 56 0.12 0.17 0 +invoice-classic_long 2 2 166 166 0.17 0.27 0 +invoice-consulting 1 1 92 92 0.65 0.96 0 invoice-consulting_long 2 2 236 236 0.69 1.04 0 invoice-luma_studio 1 1 97 97 0.12 0.52 2 -invoice-luma_studio_long 3 3 192 192 0.20 0.41 2 +invoice-luma_studio_long 3 3 192 192 0.21 0.41 2 invoice-merchant 1 1 94 94 0.73 1.91 5 invoice-metered 1 1 99 99 0.91 9.98 48 invoice-modern 1 1 54 54 0.07 0.20 0 -invoice-modern_long 2 2 162 162 0.20 0.27 0 +invoice-modern_long 2 2 162 162 0.18 0.27 0 invoice-obsidian 1 1 81 81 0.27 3.05 15 invoice-payments 1 1 104 104 0.32 5.63 45 invoice-platform 1 1 111 111 0.42 0.52 0 -invoice-subscription 1 1 81 81 0.54 0.67 0 +invoice-subscription 1 1 81 81 0.42 0.62 0 invoice-workspace 1 1 90 90 0.28 0.67 0 -letter-blue_banner 1 1 10 10 0.42 0.46 0 -letter-boxed_sections 1 1 10 10 0.29 0.33 0 -letter-centered_headline 1 1 11 11 0.13 0.25 0 -letter-classic_serif 1 1 10 10 0.13 0.19 0 +letter-blue_banner 1 1 10 10 0.21 0.46 0 +letter-boxed_sections 1 1 10 10 0.11 0.23 0 +letter-centered_headline 1 1 11 11 0.10 0.23 0 +letter-classic_serif 1 1 10 10 0.10 0.15 0 letter-compact_mono 1 1 10 8 0.24 0.35 0 -letter-editorial_blue 1 1 12 12 0.16 0.22 0 +letter-editorial_blue 1 1 12 12 0.07 0.16 0 letter-engineering_resume 1 1 15 15 0.19 0.41 0 letter-executive 1 1 12 12 0.18 0.30 0 -letter-mint-editorial-letter 1 1 10 10 0.29 0.29 0 -letter-modern_professional 1 1 12 12 0.08 0.22 0 -letter-monogram_sidebar 1 1 12 12 0.23 0.37 0 +letter-mint-editorial-letter 1 1 10 10 0.01 0.02 0 +letter-modern_professional 1 1 12 12 0.08 0.11 0 +letter-monogram_sidebar 1 1 12 12 0.17 0.23 0 letter-nordic_clean 1 1 15 15 0.16 0.38 0 -letter-panel 1 1 13 13 0.19 0.27 0 -letter-sidebar_portrait 1 1 12 12 0.43 0.51 0 +letter-panel 1 1 13 13 0.17 0.25 0 +letter-sidebar_portrait 1 1 12 12 0.41 0.49 0 letter-timeline_minimal 1 1 15 15 0.33 0.53 0 -proposal-editorial 2 2 132 129 44.49 45.38 72 +proposal-editorial 2 2 132 129 44.49 45.29 72 proposal-indigo 1 1 72 70 0.26 0.65 0 -proposal-modern 1 1 44 44 0.10 0.20 0 -proposal-northline 2 2 132 132 0.27 0.67 0 -receipt-modern 1 1 57 57 0.26 0.29 0 +proposal-modern 1 1 44 44 0.10 0.21 0 +proposal-northline 2 2 132 132 0.27 0.59 0 +receipt-modern 1 1 57 57 0.09 0.29 0 rota-cobalt 1 1 154 151 0.23 0.79 0 diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv index e3c6e035c..6c71bb5f5 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-windows-lines.tsv @@ -1,5 +1,5 @@ # libreoffice build bce0998afefd on windows — document, line, drift below the page (pt), drift right of the page (pt), letters -cv-blue_banner 0:8f1010120ed6 0.42 1.95 jordanrivera +cv-blue_banner 0:8f1010120ed6 0.02 1.95 jordanrivera cv-blue_banner 0:8d7a2cca3060 -0.20 0.24 +442055551000|jordan.rivera@exam cv-blue_banner 0:b944906ed84c -0.20 -0.38 professionalsummary cv-blue_banner 0:8d6758a29c08 -0.51 0.10 platformengineerwith10+yearsbuil @@ -67,16 +67,16 @@ cv-boxed_sections 0:26671c309eb9 0.27 0.10 •distribution:mavencentral,sonat cv-boxed_sections 0:68bf0109c6f8 0.28 1.23 education cv-boxed_sections 0:0ad1957d6bab 0.28 0.10 msccomputerscience cv-boxed_sections 0:3fa772117260 0.24 -0.76 2019-2021 -cv-boxed_sections 0:47ce0218bbea 0.27 0.10 universityofmanchester -cv-boxed_sections 0:2ffe115b06e5 0.28 0.10 distinction.thesis:composablelay +cv-boxed_sections 0:47ce0218bbea 0.07 0.10 universityofmanchester +cv-boxed_sections 0:2ffe115b06e5 0.08 0.10 distinction.thesis:composablelay cv-boxed_sections 0:b6749d0b616b 0.31 0.10 bscsoftwareengineering cv-boxed_sections 0:30f9262640a0 0.28 -0.76 2015-2019 -cv-boxed_sections 0:89ad9656f393 0.30 0.10 imperialcollegelondon -cv-boxed_sections 0:baa173b4a82e 0.32 0.10 first-classhonours.specialisatio +cv-boxed_sections 0:89ad9656f393 0.10 0.10 imperialcollegelondon +cv-boxed_sections 0:baa173b4a82e 0.12 0.10 first-classhonours.specialisatio cv-boxed_sections 0:6d3d5673c39f 0.35 0.10 oraclejavacertification cv-boxed_sections 0:d40b22f00acb 0.31 -0.76 2023-2024 -cv-boxed_sections 0:2669e1f6d55c 0.34 0.10 professionaltrack -cv-boxed_sections 0:3857373829c1 0.35 0.10 java17platformdeep-dive:records, +cv-boxed_sections 0:2669e1f6d55c 0.14 0.10 professionaltrack +cv-boxed_sections 0:3857373829c1 0.15 0.10 java17platformdeep-dive:records, cv-boxed_sections 0:2577c0f557b2 0.37 1.18 projects cv-boxed_sections 0:b2b029995203 0.34 0.10 •graphcompose(java21,pdfbox,mave cv-boxed_sections 0:67593a76ef70 0.04 0.11 declarativejavapdflayoutengine.s @@ -91,26 +91,26 @@ cv-boxed_sections 0:e7e62230eb1f 0.38 0.11 editorial-magazinedocumenttoolki cv-boxed_sections 0:c2f296ef30a3 0.40 1.51 professionalexperience cv-boxed_sections 0:a76f47480818 0.39 0.10 seniorplatformengineer cv-boxed_sections 0:060300b18051 0.36 0.01 2024-present -cv-boxed_sections 0:f890faef907f 0.38 0.10 northwindsystems +cv-boxed_sections 0:f890faef907f 0.18 0.10 northwindsystems cv-boxed_sections 1:49faf14f1f56 -0.13 0.10 ledthereusabledocument-generatio cv-boxed_sections 1:6bd3f168e89e -0.13 0.10 maintenancetimeby70%byretiringpe cv-boxed_sections 1:daf65306b3b6 0.20 0.10 softwareengineer cv-boxed_sections 1:e7cc1822c6dc 0.17 -0.76 2021-2024 -cv-boxed_sections 1:998c1a985022 0.19 0.10 brightleaflabs +cv-boxed_sections 1:998c1a985022 -0.01 0.10 brightleaflabs cv-boxed_sections 1:e55664011cda -0.09 0.10 builtbackendservicesandproductio cv-boxed_sections 1:e80236b6d2b1 -0.09 0.10 itexttoacustomlayoutengine,elimi cv-boxed_sections 1:41bb54fbae8d 0.24 0.10 backendengineer cv-boxed_sections 1:3fa772117260 0.21 -0.76 2019-2021 -cv-boxed_sections 1:ef148f221e31 0.23 0.10 helixprintco +cv-boxed_sections 1:ef148f221e31 0.03 0.10 helixprintco cv-boxed_sections 1:9d31a6bfbc69 -0.05 0.10 maintainedahigh-volumeinvoice-pr cv-boxed_sections 1:03af8a628309 -0.05 0.10 change. cv-boxed_sections 1:676dfdd56ad2 0.27 1.49 additionalinformation -cv-boxed_sections 1:f20997652453 0.24 0.10 languages:english(fluent),german -cv-boxed_sections 1:ec9d3622395e 0.24 0.10 workeligibility:eligibletoworkin -cv-boxed_sections 1:dd20ae01c3cf 0.25 0.10 opensource:maintainerofgraphcomp -cv-boxed_sections 1:33c35e9d236d 0.25 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-centered_headline 0:8f1010120ed6 -0.50 2.44 jordanrivera -cv-centered_headline 0:87ca614d0eab -0.18 1.41 professionaltitle +cv-boxed_sections 1:f20997652453 0.04 0.10 languages:english(fluent),german +cv-boxed_sections 1:ec9d3622395e 0.04 0.10 workeligibility:eligibletoworkin +cv-boxed_sections 1:dd20ae01c3cf 0.05 0.10 opensource:maintainerofgraphcomp +cv-boxed_sections 1:33c35e9d236d 0.05 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-centered_headline 0:8f1010120ed6 -0.05 2.44 jordanrivera +cv-centered_headline 0:87ca614d0eab -0.03 1.41 professionaltitle cv-centered_headline 0:8d7a2cca3060 -0.23 0.48 +442055551000|jordan.rivera@exam cv-centered_headline 0:b944906ed84c -0.28 0.10 professionalsummary cv-centered_headline 0:f43d42692f27 0.06 0.10 platformengineerwith10+yearsbuil @@ -249,62 +249,62 @@ cv-charcoal_gold 0:058521fbf0d1 0.17 0.00 innovatechsystems cv-charcoal_gold 0:3def82282260 0.10 -0.71 technicaltools cv-charcoal_gold 0:eb04bd42c7fb 0.16 -0.94 microsoft365|jira|confluence|asa cv-classic_serif 0:8f1010120ed6 -0.15 2.65 jordanrivera -cv-classic_serif 0:8d7a2cca3060 0.19 -0.42 +442055551000|jordan.rivera@exam +cv-classic_serif 0:8d7a2cca3060 -0.01 -0.42 +442055551000|jordan.rivera@exam cv-classic_serif 0:3c69d6bb4892 0.24 2.27 professionalprofile -cv-classic_serif 0:32c1cf49a2fe 0.39 0.10 skills -cv-classic_serif 0:873a24d153c8 0.36 0.10 languages:java21,kotlin,groovy,p -cv-classic_serif 0:05e907ef2b18 0.34 0.10 document&print:pdfbox,apachepoi( -cv-classic_serif 0:76656a8a6621 0.31 0.10 layoutengines:customdsldesign,se -cv-classic_serif 0:1cd141fef347 0.29 0.10 build&infrastructure:maven,gradl -cv-classic_serif 0:181ddda7f959 0.26 0.10 testing:junit5,assertj,pdfbox-ba -cv-classic_serif 0:c40c656d9558 0.24 0.10 distribution:mavencentral,sonaty -cv-classic_serif 0:53e5e7c5a884 0.25 0.10 experience +cv-classic_serif 0:32c1cf49a2fe 0.19 0.10 skills +cv-classic_serif 0:873a24d153c8 0.21 0.10 languages:java21,kotlin,groovy,p +cv-classic_serif 0:05e907ef2b18 0.19 0.10 document&print:pdfbox,apachepoi( +cv-classic_serif 0:76656a8a6621 0.16 0.10 layoutengines:customdsldesign,se +cv-classic_serif 0:1cd141fef347 0.14 0.10 build&infrastructure:maven,gradl +cv-classic_serif 0:181ddda7f959 0.11 0.10 testing:junit5,assertj,pdfbox-ba +cv-classic_serif 0:c40c656d9558 0.09 0.10 distribution:mavencentral,sonaty +cv-classic_serif 0:53e5e7c5a884 0.05 0.10 experience cv-classic_serif 0:a76f47480818 0.26 0.10 seniorplatformengineer cv-classic_serif 0:060300b18051 0.23 0.31 2024-present -cv-classic_serif 0:f890faef907f 0.24 0.10 northwindsystems +cv-classic_serif 0:f890faef907f 0.04 0.10 northwindsystems cv-classic_serif 0:49faf14f1f56 0.01 0.10 ledthereusabledocument-generatio cv-classic_serif 0:6bd3f168e89e 0.00 0.10 maintenancetimeby70%byretiringpe cv-classic_serif 0:daf65306b3b6 0.28 0.10 softwareengineer cv-classic_serif 0:e7cc1822c6dc 0.25 1.12 2021-2024 -cv-classic_serif 0:998c1a985022 0.26 0.10 brightleaflabs +cv-classic_serif 0:998c1a985022 0.06 0.10 brightleaflabs cv-classic_serif 0:e55664011cda 0.03 0.10 builtbackendservicesandproductio cv-classic_serif 0:e80236b6d2b1 0.02 0.10 itexttoacustomlayoutengine,elimi cv-classic_serif 0:41bb54fbae8d 0.29 0.10 backendengineer cv-classic_serif 0:3fa772117260 0.26 1.12 2019-2021 cv-classic_serif 0:3fa772117260#1 0.28 1.12 2019-2021 -cv-classic_serif 0:ef148f221e31 0.27 0.10 helixprintco +cv-classic_serif 0:ef148f221e31 0.07 0.10 helixprintco cv-classic_serif 0:9d31a6bfbc69 0.04 0.10 maintainedahigh-volumeinvoice-pr cv-classic_serif 0:03af8a628309 0.03 0.10 change. -cv-classic_serif 0:2577c0f557b2 0.30 0.10 projects -cv-classic_serif 0:0f2c67872251 0.31 0.10 graphcompose(java21,pdfbox,maven +cv-classic_serif 0:2577c0f557b2 0.10 0.10 projects +cv-classic_serif 0:0f2c67872251 0.11 0.10 graphcompose(java21,pdfbox,maven cv-classic_serif 0:67593a76ef70 0.04 0.10 declarativejavapdflayoutengine.s cv-classic_serif 0:b9292cbd1454 0.03 0.10 pipelinesforhiringtoolsandbillin -cv-classic_serif 0:d73d02174dc9 0.30 0.10 templatestudio(kotlin,composedes -cv-classic_serif 0:836e76daecbf 0.28 0.10 internaltoolforevaluatingcv,prop -cv-classic_serif 0:542ec793b5b1 0.30 0.10 layoutlint(java21,javaparser,spo -cv-classic_serif 0:dc31b6a18325 0.28 0.10 staticanalyserthatflagsfragileau -cv-classic_serif 0:ee180ea1e0a5 0.30 0.10 chromeforge(java,graphcompose,pa -cv-classic_serif 0:e7e62230eb1f 0.28 0.10 editorial-magazinedocumenttoolki -cv-classic_serif 0:68bf0109c6f8 0.30 0.10 education +cv-classic_serif 0:d73d02174dc9 0.10 0.10 templatestudio(kotlin,composedes +cv-classic_serif 0:836e76daecbf 0.08 0.10 internaltoolforevaluatingcv,prop +cv-classic_serif 0:542ec793b5b1 0.10 0.10 layoutlint(java21,javaparser,spo +cv-classic_serif 0:dc31b6a18325 0.08 0.10 staticanalyserthatflagsfragileau +cv-classic_serif 0:ee180ea1e0a5 0.10 0.10 chromeforge(java,graphcompose,pa +cv-classic_serif 0:e7e62230eb1f 0.08 0.10 editorial-magazinedocumenttoolki +cv-classic_serif 0:68bf0109c6f8 0.10 0.10 education cv-classic_serif 0:0ad1957d6bab 0.31 0.10 msccomputerscience -cv-classic_serif 0:47ce0218bbea 0.29 0.10 universityofmanchester -cv-classic_serif 0:2ffe115b06e5 0.31 0.10 distinction.thesis:composablelay +cv-classic_serif 0:47ce0218bbea 0.09 0.10 universityofmanchester +cv-classic_serif 0:2ffe115b06e5 0.11 0.10 distinction.thesis:composablelay cv-classic_serif 0:b6749d0b616b 0.33 0.10 bscsoftwareengineering cv-classic_serif 0:30f9262640a0 0.30 1.12 2015-2019 cv-classic_serif 1:89ad9656f393 0.16 0.10 imperialcollegelondon -cv-classic_serif 1:baa173b4a82e 0.18 0.10 first-classhonours.specialisatio +cv-classic_serif 1:baa173b4a82e -0.02 0.10 first-classhonours.specialisatio cv-classic_serif 1:6d3d5673c39f 0.20 0.10 oraclejavacertification cv-classic_serif 1:d40b22f00acb 0.17 1.12 2023-2024 -cv-classic_serif 1:2669e1f6d55c 0.18 0.10 professionaltrack -cv-classic_serif 1:3857373829c1 0.20 0.10 java17platformdeep-dive:records, -cv-classic_serif 1:7b476727faf3 0.23 0.10 additional -cv-classic_serif 1:f20997652453 0.19 0.10 languages:english(fluent),german -cv-classic_serif 1:ec9d3622395e 0.17 0.10 workeligibility:eligibletoworkin -cv-classic_serif 1:dd20ae01c3cf 0.14 0.10 opensource:maintainerofgraphcomp -cv-classic_serif 1:33c35e9d236d 0.12 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-classic_serif 1:2669e1f6d55c -0.02 0.10 professionaltrack +cv-classic_serif 1:3857373829c1 0.00 0.10 java17platformdeep-dive:records, +cv-classic_serif 1:7b476727faf3 0.03 0.10 additional +cv-classic_serif 1:f20997652453 0.04 0.10 languages:english(fluent),german +cv-classic_serif 1:ec9d3622395e 0.02 0.10 workeligibility:eligibletoworkin +cv-classic_serif 1:dd20ae01c3cf -0.01 0.10 opensource:maintainerofgraphcomp +cv-classic_serif 1:33c35e9d236d -0.03 0.10 speaking:jvmsummit2024,devoxxuk2 cv-compact_mono 0:8f1010120ed6 0.31 0.10 jordanrivera cv-compact_mono 0:f9e4560bd641 -0.24 0.10 london,uk/+442055551000/jordan.r -cv-compact_mono 0:32c1cf49a2fe 0.24 0.10 skills +cv-compact_mono 0:32c1cf49a2fe 0.14 0.10 skills cv-compact_mono 0:551282493299 -0.11 0.10 languagesjava21,kotlin,groovy,py cv-compact_mono 0:8f5cfd05d621 -0.32 0.10 document&printpdfbox,apachepoi cv-compact_mono 0:148ff6990529 -0.21 0.10 (docx/xlsx),itext,postscript @@ -316,14 +316,14 @@ cv-compact_mono 0:d4ac2ee01f81 -0.26 0.10 testingjunit5,assertj,pdfbox-bas cv-compact_mono 0:b04e6ebfb02b -0.15 0.10 diff,layout-graphsnapshots cv-compact_mono 0:93c9f742ef14 -0.24 0.10 distributionmavencentral,sonatyp cv-compact_mono 0:8f21bd149ad7 -0.13 0.10 gpgsigning,jitpack -cv-compact_mono 0:68bf0109c6f8 0.33 0.10 education +cv-compact_mono 0:68bf0109c6f8 0.23 0.10 education cv-compact_mono 0:9ad8d9ef1711 -0.17 0.10 msccomputerscience/universityof cv-compact_mono 0:594f6dd11e20 -0.10 0.10 manchester/2019-2021 cv-compact_mono 0:387dc0387824 -0.17 0.10 bscsoftwareengineering/imperialc cv-compact_mono 0:453806946a88 -0.10 0.10 london/2015-2019 cv-compact_mono 0:7816e7a28b71 -0.17 0.10 oraclejavacertification/professi cv-compact_mono 0:d40b22f00acb 0.05 0.10 2023-2024 -cv-compact_mono 0:7b476727faf3 0.31 0.10 additional +cv-compact_mono 0:7b476727faf3 0.21 0.10 additional cv-compact_mono 0:ecc25e73b19b -0.20 0.10 languages:english(fluent),german cv-compact_mono 0:ac7f0ee6a49e -0.19 0.10 (intermediate),spanish(basic) cv-compact_mono 0:970ca9d789c2 -0.18 0.10 workeligibility:eligibletoworkin @@ -332,12 +332,12 @@ cv-compact_mono 0:8051a4b5e34f -0.16 0.10 opensource:maintainerofgraphcomp cv-compact_mono 0:08c2e869a75b -0.15 0.10 regularcontributortopdfboxissuet cv-compact_mono 0:12dcd1343975 -0.14 0.10 speaking:jvmsummit2024,devoxxuk2 cv-compact_mono 0:3aea7f90f8ed -0.13 0.10 —bothondeclarativedocumentlayout -cv-compact_mono 0:1900eab6c028 0.24 0.09 profile +cv-compact_mono 0:1900eab6c028 0.14 0.09 profile cv-compact_mono 0:3828b9718a0d -0.35 0.09 platformengineerwith10+yearsbuil cv-compact_mono 0:f6b5e93ccadd -0.34 0.09 engines,anddeveloper-facingtempl cv-compact_mono 0:927ef106776a -0.33 0.09 semanticauthoringdsls,andturning cv-compact_mono 0:330fcb75ed52 -0.32 0.09 librariesthatscale. -cv-compact_mono 0:53e5e7c5a884 0.31 0.09 experience +cv-compact_mono 0:53e5e7c5a884 0.21 0.09 experience cv-compact_mono 0:c9efb118bfda -0.04 0.09 seniorplatformengineer,northwind cv-compact_mono 0:64c4b52dceb1 -0.24 0.09 ledthereusabledocument-generatio cv-compact_mono 0:1f193cd1d987 -0.22 0.09 productteams.reducedtemplatemain @@ -349,7 +349,7 @@ cv-compact_mono 0:b78a9a72ca9a -0.15 0.09 andcuttingp99renderlatencyfrom1. cv-compact_mono 0:9f5d87c00954 0.06 0.09 backendengineer,helixprintco|201 cv-compact_mono 0:a485c37fe7ea -0.14 0.09 maintainedahigh-volumeinvoice-pr cv-compact_mono 0:5a136b6b9d8c -0.12 0.09 testharnessthatgatedeverytemplat -cv-compact_mono 0:d94eccbb1fbe 0.49 0.09 selectedprojects +cv-compact_mono 0:d94eccbb1fbe 0.39 0.09 selectedprojects cv-compact_mono 0:0059a3aac61e -0.06 0.09 graphcompose(java21,pdfbox,maven cv-compact_mono 0:18b7f8c840e4 -0.03 0.09 dsl,slot-basedtemplates,snapshot cv-compact_mono 0:d36f78e88fe0 0.01 0.09 forhiringtoolsandbillingsystems. @@ -360,15 +360,15 @@ cv-compact_mono 0:ab89138286bb 0.10 0.09 layoutlint(java21,javaparser,spo cv-compact_mono 0:2c506ce69aa6 0.13 0.09 nestedrows,untypedoffsets,implic cv-compact_mono 0:6793d28e9783 0.14 0.09 chromeforge(java,graphcompose,pa cv-compact_mono 0:e3cfea265b3b 0.17 0.09 graphcompose:cinematiccovers,pul -cv-editorial_blue 0:8f1010120ed6 0.45 0.12 jordanrivera -cv-editorial_blue 0:2d58f0cadc2d 0.22 0.13 platformengineer -cv-editorial_blue 0:1b28eb6a9a2e 0.14 0.13 +442055551000-london,uk -cv-editorial_blue 0:8817bf9310b6 0.11 0.21 jordan.rivera@example.com|linked -cv-editorial_blue 0:3c69d6bb4892 0.15 0.10 professionalprofile +cv-editorial_blue 0:8f1010120ed6 -0.05 0.12 jordanrivera +cv-editorial_blue 0:2d58f0cadc2d 0.02 0.13 platformengineer +cv-editorial_blue 0:1b28eb6a9a2e -0.06 0.13 +442055551000-london,uk +cv-editorial_blue 0:8817bf9310b6 -0.09 0.21 jordan.rivera@example.com|linked +cv-editorial_blue 0:3c69d6bb4892 -0.05 0.10 professionalprofile cv-editorial_blue 0:80cc87fdc4c4 -0.22 0.10 platformengineerwith10+yearsbuil cv-editorial_blue 0:c323ef4c385f -0.22 0.10 systems.specialisedinhigh-throug cv-editorial_blue 0:3ff1933dba9a -0.21 0.10 typed,snapshot-testedlibrariesth -cv-editorial_blue 0:32c1cf49a2fe 0.14 0.10 skills +cv-editorial_blue 0:32c1cf49a2fe -0.06 0.10 skills cv-editorial_blue 0:8447174c8fff 0.09 -0.15 •java21 cv-editorial_blue 0:4797e5b5555b 0.09 -0.17 •kotlin cv-editorial_blue 0:44408890ac29 0.09 -0.14 •groovy @@ -401,47 +401,47 @@ cv-editorial_blue 0:7ea255c76189 0.06 -0.16 •mavencentral cv-editorial_blue 0:4e484fca00bb 0.06 -0.15 •sonatypeossrh cv-editorial_blue 0:feaf5883619f 0.06 -0.17 •gpgsigning cv-editorial_blue 0:11f34b7449a4 0.06 -0.16 •semanticversioningdiscipline -cv-editorial_blue 0:68bf0109c6f8 0.08 0.10 education -cv-editorial_blue 0:78cdd0bfd1ce 0.04 0.10 msccomputerscience2019-2021 -cv-editorial_blue 0:47ce0218bbea 0.04 0.10 universityofmanchester -cv-editorial_blue 0:2ffe115b06e5 0.04 0.10 distinction.thesis:composablelay -cv-editorial_blue 0:c5947a492ce6 0.03 0.10 bscsoftwareengineering2015-2019 -cv-editorial_blue 0:89ad9656f393 0.03 0.10 imperialcollegelondon -cv-editorial_blue 0:baa173b4a82e 0.03 0.10 first-classhonours.specialisatio -cv-editorial_blue 0:83766950a9ce 0.02 0.10 oraclejavacertification2023-2024 -cv-editorial_blue 0:2669e1f6d55c 0.02 0.10 professionaltrack -cv-editorial_blue 0:3857373829c1 0.02 0.10 java17platformdeep-dive:records, -cv-editorial_blue 0:2577c0f557b2 0.02 0.10 projects -cv-editorial_blue 0:0f2c67872251 -0.02 0.10 graphcompose(java21,pdfbox,maven +cv-editorial_blue 0:68bf0109c6f8 -0.12 0.10 education +cv-editorial_blue 0:78cdd0bfd1ce -0.21 0.10 msccomputerscience2019-2021 +cv-editorial_blue 0:47ce0218bbea -0.16 0.10 universityofmanchester +cv-editorial_blue 0:2ffe115b06e5 -0.16 0.10 distinction.thesis:composablelay +cv-editorial_blue 0:c5947a492ce6 -0.22 0.10 bscsoftwareengineering2015-2019 +cv-editorial_blue 0:89ad9656f393 -0.17 0.10 imperialcollegelondon +cv-editorial_blue 0:baa173b4a82e -0.17 0.10 first-classhonours.specialisatio +cv-editorial_blue 0:83766950a9ce -0.23 0.10 oraclejavacertification2023-2024 +cv-editorial_blue 0:2669e1f6d55c -0.18 0.10 professionaltrack +cv-editorial_blue 0:3857373829c1 -0.18 0.10 java17platformdeep-dive:records, +cv-editorial_blue 0:2577c0f557b2 -0.18 0.10 projects +cv-editorial_blue 0:0f2c67872251 -0.27 0.10 graphcompose(java21,pdfbox,maven cv-editorial_blue 0:cf13c8a0c3d0 -0.31 0.10 declarativejavapdflayoutengine.s cv-editorial_blue 0:cfef54184ea6 -0.30 0.10 proposalpipelinesforhiringtoolsa -cv-editorial_blue 0:d73d02174dc9 -0.01 0.10 templatestudio(kotlin,composedes +cv-editorial_blue 0:d73d02174dc9 -0.26 0.10 templatestudio(kotlin,composedes cv-editorial_blue 0:7127a108c33c -0.30 0.10 internaltoolforevaluatingcv,prop cv-editorial_blue 0:6b844249c695 -0.30 0.10 freezing. -cv-editorial_blue 0:542ec793b5b1 -0.01 0.10 layoutlint(java21,javaparser,spo +cv-editorial_blue 0:542ec793b5b1 -0.26 0.10 layoutlint(java21,javaparser,spo cv-editorial_blue 0:7488006d7864 -0.30 0.10 staticanalyserthatflagsfragileau cv-editorial_blue 0:c4d0c415b4f8 -0.29 0.10 production. -cv-editorial_blue 0:ee180ea1e0a5 0.00 0.10 chromeforge(java,graphcompose,pa -cv-editorial_blue 0:e7e62230eb1f 0.01 0.10 editorial-magazinedocumenttoolki -cv-editorial_blue 0:53e5e7c5a884 0.01 0.10 experience -cv-editorial_blue 0:1b72d3ce3e11 -0.01 0.10 seniorplatformengineer2024-prese -cv-editorial_blue 0:f890faef907f -0.04 0.10 northwindsystems +cv-editorial_blue 0:ee180ea1e0a5 -0.25 0.10 chromeforge(java,graphcompose,pa +cv-editorial_blue 0:e7e62230eb1f -0.19 0.10 editorial-magazinedocumenttoolki +cv-editorial_blue 0:53e5e7c5a884 -0.19 0.10 experience +cv-editorial_blue 0:1b72d3ce3e11 -0.21 0.10 seniorplatformengineer2024-prese +cv-editorial_blue 0:f890faef907f -0.24 0.10 northwindsystems cv-editorial_blue 0:1af5650959fe -0.33 0.10 ledthereusabledocument-generatio cv-editorial_blue 0:27c01c228bd8 -0.33 0.10 templatemaintenancetimeby70%byre -cv-editorial_blue 0:1a7fe8433bff -0.02 0.10 softwareengineer2021-2024 -cv-editorial_blue 0:998c1a985022 -0.05 0.10 brightleaflabs +cv-editorial_blue 0:1a7fe8433bff -0.22 0.10 softwareengineer2021-2024 +cv-editorial_blue 0:998c1a985022 -0.25 0.10 brightleaflabs cv-editorial_blue 0:e86691b0219f -0.34 0.10 builtbackendservicesandproductio cv-editorial_blue 0:4ec57434564a -0.34 0.10 migrationfromitexttoacustomlayou -cv-editorial_blue 0:2427b23ddf4e -0.03 0.10 backendengineer2019-2021 +cv-editorial_blue 0:2427b23ddf4e -0.23 0.10 backendengineer2019-2021 cv-editorial_blue 1:ef148f221e31 0.20 0.10 helixprintco cv-editorial_blue 1:f811fbee6901 -0.09 0.10 maintainedahigh-volumeinvoice-pr cv-editorial_blue 1:cbfca5b2a6d7 -0.09 0.10 templatechange. -cv-editorial_blue 1:7b476727faf3 0.22 0.10 additional -cv-editorial_blue 1:f20997652453 0.19 0.10 languages:english(fluent),german -cv-editorial_blue 1:ec9d3622395e 0.20 0.10 workeligibility:eligibletoworkin -cv-editorial_blue 1:dd20ae01c3cf 0.20 0.10 opensource:maintainerofgraphcomp -cv-editorial_blue 1:33c35e9d236d 0.21 0.10 speaking:jvmsummit2024,devoxxuk2 -cv-editorial_blue 1:0b516aa076e0 0.18 0.13 referencesavailableuponrequest. +cv-editorial_blue 1:7b476727faf3 0.02 0.10 additional +cv-editorial_blue 1:f20997652453 -0.01 0.10 languages:english(fluent),german +cv-editorial_blue 1:ec9d3622395e 0.00 0.10 workeligibility:eligibletoworkin +cv-editorial_blue 1:dd20ae01c3cf 0.00 0.10 opensource:maintainerofgraphcomp +cv-editorial_blue 1:33c35e9d236d 0.01 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-editorial_blue 1:0b516aa076e0 0.03 0.13 referencesavailableuponrequest. cv-engineering_resume 0:8f1010120ed6 0.15 0.10 jordanrivera cv-engineering_resume 0:2d58f0cadc2d -0.25 0.10 platformengineer cv-engineering_resume 0:fbeea547d99e -0.21 0.36 london,uk @@ -502,18 +502,18 @@ cv-engineering_resume 0:e3cfea265b3b -0.31 0.05 graphcompose:cinematiccovers,pul cv-executive 0:8f1010120ed6 -0.50 0.10 jordanrivera cv-executive 0:89ff05847e96 -0.28 0.10 london,uk|+442055551000 cv-executive 0:8817bf9310b6 -0.30 0.10 jordan.rivera@example.com|linked -cv-executive 0:b944906ed84c -0.01 0.10 professionalsummary +cv-executive 0:b944906ed84c 0.04 0.10 professionalsummary cv-executive 0:6fbdc8b79878 0.08 0.10 platformengineerwith10+yearsbuil cv-executive 0:c2be183b1c5f 0.08 0.10 templatesystems.specialisedinhig cv-executive 0:7f92a9c9efc9 0.08 0.10 scriptsintotyped,snapshot-tested -cv-executive 0:5f94c50dc5bf -0.03 0.10 technicalskills +cv-executive 0:5f94c50dc5bf 0.02 0.10 technicalskills cv-executive 0:eea537278f83 -0.24 0.10 •languages:java21,kotlin,groovy, cv-executive 0:9c2cd7231a53 -0.24 0.10 •document&print:pdfbox,apachepoi cv-executive 0:7bf8639ec5d3 -0.24 0.10 •layoutengines:customdsldesign,s cv-executive 0:8e66776d28d7 -0.24 0.10 •build&infrastructure:maven,grad cv-executive 0:1ed4fc7d7768 -0.24 0.10 •testing:junit5,assertj,pdfbox-b cv-executive 0:26671c309eb9 -0.24 0.10 •distribution:mavencentral,sonat -cv-executive 0:68bf0109c6f8 -0.05 0.10 education +cv-executive 0:68bf0109c6f8 0.00 0.10 education cv-executive 0:0ad1957d6bab -0.26 0.10 msccomputerscience cv-executive 0:3fa772117260 -0.26 0.19 2019-2021 cv-executive 0:47ce0218bbea -0.26 0.10 universityofmanchester @@ -526,7 +526,7 @@ cv-executive 0:6d3d5673c39f -0.26 0.10 oraclejavacertification cv-executive 0:d40b22f00acb -0.26 0.19 2023-2024 cv-executive 0:2669e1f6d55c -0.26 0.10 professionaltrack cv-executive 0:3857373829c1 -0.26 0.10 java17platformdeep-dive:records, -cv-executive 0:2577c0f557b2 -0.07 0.10 projects +cv-executive 0:2577c0f557b2 -0.02 0.10 projects cv-executive 0:b2b029995203 -0.28 0.10 •graphcompose(java21,pdfbox,mave cv-executive 0:cf13c8a0c3d0 -0.53 0.12 declarativejavapdflayoutengine.s cv-executive 0:cfef54184ea6 -0.53 0.12 proposalpipelinesforhiringtoolsa @@ -538,7 +538,7 @@ cv-executive 0:f5fa2add7746 -0.53 0.12 staticanalyserthatflagsfragileau cv-executive 0:9f5414016bd1 -0.53 0.12 toproduction. cv-executive 0:fb1927f88597 -0.28 0.10 •chromeforge(java,graphcompose,p cv-executive 0:e7e62230eb1f -0.28 0.12 editorial-magazinedocumenttoolki -cv-executive 0:c2f296ef30a3 -0.09 0.10 professionalexperience +cv-executive 0:c2f296ef30a3 -0.04 0.10 professionalexperience cv-executive 0:a76f47480818 -0.30 0.10 seniorplatformengineer cv-executive 0:060300b18051 -0.30 0.22 2024-present cv-executive 0:f890faef907f -0.30 0.10 northwindsystems @@ -554,7 +554,7 @@ cv-executive 1:3fa772117260 -0.28 0.19 2019-2021 cv-executive 1:ef148f221e31 -0.28 0.10 helixprintco cv-executive 1:f811fbee6901 0.02 0.10 maintainedahigh-volumeinvoice-pr cv-executive 1:cbfca5b2a6d7 0.02 0.10 templatechange. -cv-executive 1:676dfdd56ad2 -0.09 0.10 additionalinformation +cv-executive 1:676dfdd56ad2 -0.04 0.10 additionalinformation cv-executive 1:f20997652453 -0.30 0.10 languages:english(fluent),german cv-executive 1:ec9d3622395e -0.30 0.10 workeligibility:eligibletoworkin cv-executive 1:dd20ae01c3cf -0.30 0.10 opensource:maintainerofgraphcomp @@ -659,16 +659,16 @@ cv-minimal_underlined 0:26671c309eb9 0.38 0.10 •distribution:mavencentral,sona cv-minimal_underlined 0:68bf0109c6f8 0.41 0.10 education cv-minimal_underlined 0:0ad1957d6bab 0.47 0.10 msccomputerscience cv-minimal_underlined 0:3fa772117260 0.43 -0.76 2019-2021 -cv-minimal_underlined 0:47ce0218bbea 0.46 0.10 universityofmanchester -cv-minimal_underlined 0:2ffe115b06e5 0.47 0.10 distinction.thesis:composablelay +cv-minimal_underlined 0:47ce0218bbea 0.26 0.10 universityofmanchester +cv-minimal_underlined 0:2ffe115b06e5 0.27 0.10 distinction.thesis:composablelay cv-minimal_underlined 0:b6749d0b616b 0.50 0.10 bscsoftwareengineering cv-minimal_underlined 0:30f9262640a0 0.47 -0.76 2015-2019 -cv-minimal_underlined 0:89ad9656f393 0.49 0.10 imperialcollegelondon -cv-minimal_underlined 0:baa173b4a82e 0.51 0.10 first-classhonours.specialisatio +cv-minimal_underlined 0:89ad9656f393 0.29 0.10 imperialcollegelondon +cv-minimal_underlined 0:baa173b4a82e 0.31 0.10 first-classhonours.specialisatio cv-minimal_underlined 0:6d3d5673c39f 0.54 0.10 oraclejavacertification cv-minimal_underlined 0:d40b22f00acb 0.50 -0.76 2023-2024 -cv-minimal_underlined 0:2669e1f6d55c 0.53 0.10 professionaltrack -cv-minimal_underlined 0:3857373829c1 0.54 0.10 java17platformdeep-dive:records, +cv-minimal_underlined 0:2669e1f6d55c 0.33 0.10 professionaltrack +cv-minimal_underlined 0:3857373829c1 0.34 0.10 java17platformdeep-dive:records, cv-minimal_underlined 0:2577c0f557b2 0.57 0.10 projects cv-minimal_underlined 0:b2b029995203 0.61 0.10 •graphcompose(java21,pdfbox,mave cv-minimal_underlined 0:67593a76ef70 0.31 0.11 declarativejavapdflayoutengine.s @@ -684,110 +684,110 @@ cv-minimal_underlined 0:e7e62230eb1f 0.66 0.11 editorial-magazinedocumenttoolki cv-minimal_underlined 0:c2f296ef30a3 0.69 0.10 professionalexperience cv-minimal_underlined 0:a76f47480818 0.75 0.10 seniorplatformengineer cv-minimal_underlined 0:060300b18051 0.71 0.01 2024-present -cv-minimal_underlined 0:f890faef907f 0.74 0.10 northwindsystems +cv-minimal_underlined 0:f890faef907f 0.54 0.10 northwindsystems cv-minimal_underlined 1:49faf14f1f56 -0.13 0.10 ledthereusabledocument-generatio cv-minimal_underlined 1:6bd3f168e89e -0.13 0.10 maintenancetimeby70%byretiringpe cv-minimal_underlined 1:daf65306b3b6 0.20 0.10 softwareengineer cv-minimal_underlined 1:e7cc1822c6dc 0.17 -0.76 2021-2024 -cv-minimal_underlined 1:998c1a985022 0.19 0.10 brightleaflabs +cv-minimal_underlined 1:998c1a985022 -0.01 0.10 brightleaflabs cv-minimal_underlined 1:e55664011cda -0.09 0.10 builtbackendservicesandproductio cv-minimal_underlined 1:e80236b6d2b1 -0.09 0.10 itexttoacustomlayoutengine,elimi cv-minimal_underlined 1:41bb54fbae8d 0.24 0.10 backendengineer cv-minimal_underlined 1:3fa772117260 0.21 -0.76 2019-2021 -cv-minimal_underlined 1:ef148f221e31 0.23 0.10 helixprintco +cv-minimal_underlined 1:ef148f221e31 0.03 0.10 helixprintco cv-minimal_underlined 1:9d31a6bfbc69 -0.05 0.10 maintainedahigh-volumeinvoice-pr cv-minimal_underlined 1:03af8a628309 -0.05 0.10 change. cv-minimal_underlined 1:676dfdd56ad2 0.28 0.10 additionalinformation -cv-minimal_underlined 1:f20997652453 0.32 0.10 languages:english(fluent),german -cv-minimal_underlined 1:ec9d3622395e 0.32 0.10 workeligibility:eligibletoworkin -cv-minimal_underlined 1:dd20ae01c3cf 0.33 0.10 opensource:maintainerofgraphcomp -cv-minimal_underlined 1:33c35e9d236d 0.33 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-minimal_underlined 1:f20997652453 0.12 0.10 languages:english(fluent),german +cv-minimal_underlined 1:ec9d3622395e 0.12 0.10 workeligibility:eligibletoworkin +cv-minimal_underlined 1:dd20ae01c3cf 0.13 0.10 opensource:maintainerofgraphcomp +cv-minimal_underlined 1:33c35e9d236d 0.13 0.10 speaking:jvmsummit2024,devoxxuk2 cv-mint_editorial 0:8f1010120ed6 -1.30 2.33 jordanrivera -cv-mint_editorial 0:2d58f0cadc2d -0.27 0.12 platformengineer +cv-mint_editorial 0:2d58f0cadc2d -0.02 0.12 platformengineer cv-mint_editorial 0:093e7d5fdbaa -0.71 0.10 contact cv-mint_editorial 0:89674e6f130e -0.07 0.68 +442055551000 cv-mint_editorial 0:e0f850305ded -0.07 0.68 jordan.rivera@example.com cv-mint_editorial 0:fbeea547d99e -0.07 0.68 london,uk cv-mint_editorial 0:84308bea4540 -0.07 0.68 linkedin cv-mint_editorial 0:c0b0109d9439 -0.07 0.68 github -cv-mint_editorial 0:68bf0109c6f8 -0.71 0.10 education -cv-mint_editorial 0:0ad1957d6bab -0.16 0.10 msccomputerscience -cv-mint_editorial 0:47ce0218bbea -0.28 0.10 universityofmanchester -cv-mint_editorial 0:3fa772117260 -0.29 0.10 2019-2021 -cv-mint_editorial 0:5993c29826a9 -0.18 0.10 bscsoftware -cv-mint_editorial 0:8c85b6639e62 -0.18 0.10 engineering -cv-mint_editorial 0:89ad9656f393 -0.30 0.10 imperialcollegelondon -cv-mint_editorial 0:30f9262640a0 -0.31 0.10 2015-2019 -cv-mint_editorial 0:95c2a0cf9777 -0.20 0.10 oraclejava -cv-mint_editorial 0:b00a6c108553 -0.20 0.10 certification -cv-mint_editorial 0:2669e1f6d55c -0.32 0.10 professionaltrack -cv-mint_editorial 0:d40b22f00acb -0.33 0.10 2023-2024 +cv-mint_editorial 0:68bf0109c6f8 -0.01 0.10 education +cv-mint_editorial 0:0ad1957d6bab -0.01 0.10 msccomputerscience +cv-mint_editorial 0:47ce0218bbea -0.03 0.10 universityofmanchester +cv-mint_editorial 0:3fa772117260 -0.04 0.10 2019-2021 +cv-mint_editorial 0:5993c29826a9 -0.03 0.10 bscsoftware +cv-mint_editorial 0:8c85b6639e62 -0.03 0.10 engineering +cv-mint_editorial 0:89ad9656f393 -0.05 0.10 imperialcollegelondon +cv-mint_editorial 0:30f9262640a0 -0.06 0.10 2015-2019 +cv-mint_editorial 0:95c2a0cf9777 -0.05 0.10 oraclejava +cv-mint_editorial 0:b00a6c108553 -0.05 0.10 certification +cv-mint_editorial 0:2669e1f6d55c -0.07 0.10 professionaltrack +cv-mint_editorial 0:d40b22f00acb -0.08 0.10 2023-2024 cv-mint_editorial 0:1900eab6c028 -0.71 0.07 profile -cv-mint_editorial 0:924e8fc8d04f 0.29 0.07 platformengineerwith10+yearsbuil -cv-mint_editorial 0:df58bf5ac853 0.29 0.07 pipelines,layoutengines,anddevel -cv-mint_editorial 0:bedc997db3d0 0.29 0.07 inhigh-throughputpdfrendering,se -cv-mint_editorial 0:3be7f615205f 0.29 0.07 production-opsscriptsintotyped,s -cv-mint_editorial 0:53e5e7c5a884 -0.71 0.07 experience -cv-mint_editorial 0:a76f47480818 -0.16 0.07 seniorplatformengineer -cv-mint_editorial 0:d492f2d34b81 -0.28 0.07 northwindsystems|2024-present -cv-mint_editorial 0:11a63b6a756a 0.28 0.07 ledthereusabledocument-generatio -cv-mint_editorial 0:e9ddcca2381b 0.28 0.07 reportingflowsacross8productteam -cv-mint_editorial 0:8e7a066998f5 0.28 0.07 by70%byretiringper-teampdfscript -cv-mint_editorial 0:daf65306b3b6 -0.17 0.07 softwareengineer -cv-mint_editorial 0:14aeb7d88f36 -0.29 0.07 brightleaflabs|2021-2024 -cv-mint_editorial 0:78c890058374 0.27 0.07 builtbackendservicesandproductio -cv-mint_editorial 0:798b575aa9c2 0.27 0.07 processing2m+documentspermonth.d -cv-mint_editorial 0:337c2b00cc88 0.27 0.07 customlayoutengine,eliminatingli -cv-mint_editorial 0:cbec16fb4c22 0.27 0.07 from1.4sto380ms. +cv-mint_editorial 0:924e8fc8d04f -0.01 0.07 platformengineerwith10+yearsbuil +cv-mint_editorial 0:df58bf5ac853 -0.01 0.07 pipelines,layoutengines,anddevel +cv-mint_editorial 0:bedc997db3d0 -0.01 0.07 inhigh-throughputpdfrendering,se +cv-mint_editorial 0:3be7f615205f -0.01 0.07 production-opsscriptsintotyped,s +cv-mint_editorial 0:53e5e7c5a884 -0.01 0.07 experience +cv-mint_editorial 0:a76f47480818 -0.01 0.07 seniorplatformengineer +cv-mint_editorial 0:d492f2d34b81 -0.03 0.07 northwindsystems|2024-present +cv-mint_editorial 0:11a63b6a756a -0.02 0.07 ledthereusabledocument-generatio +cv-mint_editorial 0:e9ddcca2381b -0.02 0.07 reportingflowsacross8productteam +cv-mint_editorial 0:8e7a066998f5 -0.02 0.07 by70%byretiringper-teampdfscript +cv-mint_editorial 0:daf65306b3b6 -0.02 0.07 softwareengineer +cv-mint_editorial 0:14aeb7d88f36 -0.04 0.07 brightleaflabs|2021-2024 +cv-mint_editorial 0:78c890058374 -0.03 0.07 builtbackendservicesandproductio +cv-mint_editorial 0:798b575aa9c2 -0.03 0.07 processing2m+documentspermonth.d +cv-mint_editorial 0:337c2b00cc88 -0.03 0.07 customlayoutengine,eliminatingli +cv-mint_editorial 0:cbec16fb4c22 -0.03 0.07 from1.4sto380ms. cv-mint_editorial 1:2b3bcb2b7d1d -0.60 0.10 expertise -cv-mint_editorial 1:6cb574fa10b6 -0.05 0.10 languages -cv-mint_editorial 1:f2197dc148f6 -0.05 0.10 document&print -cv-mint_editorial 1:634db137981a -0.05 0.10 layoutengines -cv-mint_editorial 1:86c328e816c6 -0.05 0.10 build&infrastructure -cv-mint_editorial 1:cf80cd8aed48 -0.05 0.10 testing -cv-mint_editorial 1:933548450302 -0.05 0.10 distribution -cv-mint_editorial 1:32c1cf49a2fe -0.60 0.10 skills -cv-mint_editorial 1:d5680c2e2769 -0.05 0.10 java21 -cv-mint_editorial 1:19a67c2a5369 -0.05 0.10 kotlin -cv-mint_editorial 1:95bfacd3a466 -0.05 0.10 groovy -cv-mint_editorial 1:11a4a60b518b -0.05 0.10 python -cv-mint_editorial 1:4ec7c53222c8 -0.05 0.10 sql -cv-mint_editorial 1:57529f20c3ad -0.05 0.10 pdfbox -cv-mint_editorial 1:3e860f41a5ea -0.60 0.10 social +cv-mint_editorial 1:6cb574fa10b6 0.10 0.10 languages +cv-mint_editorial 1:f2197dc148f6 0.10 0.10 document&print +cv-mint_editorial 1:634db137981a 0.10 0.10 layoutengines +cv-mint_editorial 1:86c328e816c6 0.10 0.10 build&infrastructure +cv-mint_editorial 1:cf80cd8aed48 0.10 0.10 testing +cv-mint_editorial 1:933548450302 0.10 0.10 distribution +cv-mint_editorial 1:32c1cf49a2fe 0.10 0.10 skills +cv-mint_editorial 1:d5680c2e2769 0.10 0.10 java21 +cv-mint_editorial 1:19a67c2a5369 0.10 0.10 kotlin +cv-mint_editorial 1:95bfacd3a466 0.10 0.10 groovy +cv-mint_editorial 1:11a4a60b518b 0.10 0.10 python +cv-mint_editorial 1:4ec7c53222c8 0.10 0.10 sql +cv-mint_editorial 1:57529f20c3ad 0.10 0.10 pdfbox +cv-mint_editorial 1:3e860f41a5ea 0.10 0.10 social cv-mint_editorial 1:84308bea4540 -0.30 0.55 linkedin cv-mint_editorial 1:c0b0109d9439 -0.30 0.55 github cv-mint_editorial 1:53e5e7c5a884 -0.60 0.07 experience -cv-mint_editorial 1:41bb54fbae8d -0.05 0.07 backendengineer -cv-mint_editorial 1:43aab7d19dc6 -0.17 0.07 helixprintco|2019-2021 -cv-mint_editorial 1:d9af05f99661 0.39 0.07 maintainedahigh-volumeinvoice-pr -cv-mint_editorial 1:1081945512b1 0.39 0.07 authoredthecompliancetestharness +cv-mint_editorial 1:41bb54fbae8d 0.10 0.07 backendengineer +cv-mint_editorial 1:43aab7d19dc6 0.08 0.07 helixprintco|2019-2021 +cv-mint_editorial 1:d9af05f99661 0.09 0.07 maintainedahigh-volumeinvoice-pr +cv-mint_editorial 1:1081945512b1 0.09 0.07 authoredthecompliancetestharness cv-modern_professional 0:8f1010120ed6 0.00 0.21 jordanrivera cv-modern_professional 0:89ff05847e96 0.14 0.26 london,uk|+442055551000 cv-modern_professional 0:8817bf9310b6 0.11 0.30 jordan.rivera@example.com|linked -cv-modern_professional 0:b944906ed84c 0.41 0.10 professionalsummary +cv-modern_professional 0:b944906ed84c 0.01 0.10 professionalsummary cv-modern_professional 0:6fbdc8b79878 -0.02 0.10 platformengineerwith10+yearsbuil -cv-modern_professional 0:5f94c50dc5bf 0.41 0.10 technicalskills +cv-modern_professional 0:5f94c50dc5bf 0.01 0.10 technicalskills cv-modern_professional 0:eea537278f83 0.28 0.10 •languages:java21,kotlin,groovy, cv-modern_professional 0:9c2cd7231a53 0.28 0.10 •document&print:pdfbox,apachepoi cv-modern_professional 0:7bf8639ec5d3 0.28 0.10 •layoutengines:customdsldesign,s cv-modern_professional 0:8e66776d28d7 0.28 0.10 •build&infrastructure:maven,grad cv-modern_professional 0:1ed4fc7d7768 0.28 0.10 •testing:junit5,assertj,pdfbox-b cv-modern_professional 0:26671c309eb9 0.28 0.10 •distribution:mavencentral,sonat -cv-modern_professional 0:68bf0109c6f8 0.42 0.10 education +cv-modern_professional 0:68bf0109c6f8 0.02 0.10 education cv-modern_professional 0:0ad1957d6bab 0.28 0.10 msccomputerscience cv-modern_professional 0:3fa772117260 0.29 0.18 2019-2021 cv-modern_professional 0:3fa772117260#1 0.30 0.18 2019-2021 -cv-modern_professional 0:47ce0218bbea 0.23 0.10 universityofmanchester -cv-modern_professional 0:2ffe115b06e5 0.29 0.10 distinction.thesis:composablelay +cv-modern_professional 0:47ce0218bbea 0.03 0.10 universityofmanchester +cv-modern_professional 0:2ffe115b06e5 0.09 0.10 distinction.thesis:composablelay cv-modern_professional 0:b6749d0b616b 0.28 0.10 bscsoftwareengineering cv-modern_professional 0:30f9262640a0 0.29 0.18 2015-2019 -cv-modern_professional 0:89ad9656f393 0.23 0.10 imperialcollegelondon -cv-modern_professional 0:baa173b4a82e 0.29 0.10 first-classhonours.specialisatio +cv-modern_professional 0:89ad9656f393 0.03 0.10 imperialcollegelondon +cv-modern_professional 0:baa173b4a82e 0.09 0.10 first-classhonours.specialisatio cv-modern_professional 0:6d3d5673c39f 0.28 0.10 oraclejavacertification cv-modern_professional 0:d40b22f00acb 0.29 0.18 2023-2024 -cv-modern_professional 0:2669e1f6d55c 0.23 0.10 professionaltrack -cv-modern_professional 0:3857373829c1 0.29 0.10 java17platformdeep-dive:records, -cv-modern_professional 0:2577c0f557b2 0.42 0.10 projects +cv-modern_professional 0:2669e1f6d55c 0.03 0.10 professionaltrack +cv-modern_professional 0:3857373829c1 0.09 0.10 java17platformdeep-dive:records, +cv-modern_professional 0:2577c0f557b2 0.02 0.10 projects cv-modern_professional 0:b2b029995203 0.29 0.10 •graphcompose(java21,pdfbox,mave cv-modern_professional 0:dd39d2ff3520 -0.01 0.10 declarativejavapdflayoutengine.s cv-modern_professional 0:9ecaa6df6d41 -0.01 0.10 invoice/proposalpipelinesforhiri @@ -800,26 +800,26 @@ cv-modern_professional 0:7b985a1d2b08 -0.01 0.10 shiptoproduction. cv-modern_professional 0:fb1927f88597 0.29 0.10 •chromeforge(java,graphcompose,p cv-modern_professional 0:cda7db6c6ea6 -0.01 0.10 editorial-magazinedocumenttoolki cv-modern_professional 0:fe63fe18585a -0.01 0.10 callouts. -cv-modern_professional 0:c2f296ef30a3 0.43 0.10 professionalexperience +cv-modern_professional 0:c2f296ef30a3 0.03 0.10 professionalexperience cv-modern_professional 0:a76f47480818 0.29 0.10 seniorplatformengineer cv-modern_professional 0:060300b18051 0.30 0.20 2024-present -cv-modern_professional 0:f890faef907f 0.24 0.10 northwindsystems +cv-modern_professional 0:f890faef907f 0.04 0.10 northwindsystems cv-modern_professional 0:a6525dacbac7 0.00 0.10 ledthereusabledocument-generatio cv-modern_professional 0:15e3905f4890 0.00 0.10 reducedtemplatemaintenancetimeby cv-modern_professional 0:daf65306b3b6 0.29 0.10 softwareengineer cv-modern_professional 0:e7cc1822c6dc 0.30 0.18 2021-2024 -cv-modern_professional 0:998c1a985022 0.24 0.10 brightleaflabs +cv-modern_professional 0:998c1a985022 0.04 0.10 brightleaflabs cv-modern_professional 0:e86691b0219f 0.00 0.10 builtbackendservicesandproductio cv-modern_professional 0:4ec57434564a 0.00 0.10 migrationfromitexttoacustomlayou cv-modern_professional 0:41bb54fbae8d 0.29 0.10 backendengineer -cv-modern_professional 0:ef148f221e31 0.24 0.10 helixprintco +cv-modern_professional 0:ef148f221e31 0.04 0.10 helixprintco cv-modern_professional 0:a32c7f2401d9 0.00 0.10 maintainedahigh-volumeinvoice-pr cv-modern_professional 0:7068c1d7034b 0.00 0.10 everytemplatechange. cv-modern_professional 1:676dfdd56ad2 0.36 0.10 additionalinformation -cv-modern_professional 1:f20997652453 0.23 0.10 languages:english(fluent),german -cv-modern_professional 1:ec9d3622395e 0.23 0.10 workeligibility:eligibletoworkin -cv-modern_professional 1:dd20ae01c3cf 0.23 0.10 opensource:maintainerofgraphcomp -cv-modern_professional 1:33c35e9d236d 0.23 0.10 speaking:jvmsummit2024,devoxxuk2 +cv-modern_professional 1:f20997652453 0.03 0.10 languages:english(fluent),german +cv-modern_professional 1:ec9d3622395e 0.03 0.10 workeligibility:eligibletoworkin +cv-modern_professional 1:dd20ae01c3cf 0.03 0.10 opensource:maintainerofgraphcomp +cv-modern_professional 1:33c35e9d236d 0.03 0.10 speaking:jvmsummit2024,devoxxuk2 cv-monogram_sidebar 0:093e7d5fdbaa -0.25 0.81 contact cv-monogram_sidebar 0:89674e6f130e -0.10 -0.33 +442055551000 cv-monogram_sidebar 0:e0f850305ded -0.08 0.06 jordan.rivera@example.com @@ -841,8 +841,8 @@ cv-monogram_sidebar 0:11a4a60b518b 0.28 -0.03 python cv-monogram_sidebar 0:4ec7c53222c8 0.30 0.00 sql cv-monogram_sidebar 0:57529f20c3ad 0.32 -0.05 pdfbox cv-monogram_sidebar 0:1814aacb6d5a 0.34 0.02 apachepoi(docx/xlsx) -cv-monogram_sidebar 0:136c67657614 -0.38 2.80 jordan -cv-monogram_sidebar 0:8ba35ebe3d5c -0.37 2.83 rivera +cv-monogram_sidebar 0:136c67657614 0.02 2.80 jordan +cv-monogram_sidebar 0:8ba35ebe3d5c 0.03 2.83 rivera cv-monogram_sidebar 0:2d58f0cadc2d -0.19 0.11 platformengineer cv-monogram_sidebar 0:b944906ed84c -0.25 0.06 professionalsummary cv-monogram_sidebar 0:e9b75496bfb4 -0.47 0.06 platformengineerwith10+yearsbuil @@ -1004,15 +1004,15 @@ cv-orange_ops 0:a8acc3a90a7b 77.92 -0.03 +447700900123 cv-orange_ops 0:e6da1125d5d5 77.92 -0.42 marcus.bennett@email.com cv-orange_ops 0:6a3bd39f358d 77.92 -0.78 birmingham,westmidlands,uk cv-orange_ops 0:84308bea4540 77.92 -1.07 linkedin -cv-panel 0:8f1010120ed6 -0.75 0.32 jordanrivera +cv-panel 0:8f1010120ed6 0.00 0.32 jordanrivera cv-panel 0:2d58f0cadc2d -0.23 0.07 platformengineer cv-panel 0:89ff05847e96 -0.16 0.29 london,uk|+442055551000 cv-panel 0:8817bf9310b6 -0.14 0.35 jordan.rivera@example.com|linked -cv-panel 0:1900eab6c028 0.19 0.10 profile +cv-panel 0:1900eab6c028 0.24 0.10 profile cv-panel 0:80cc87fdc4c4 -0.23 0.10 platformengineerwith10+yearsbuil cv-panel 0:c323ef4c385f -0.21 0.10 systems.specialisedinhigh-throug cv-panel 0:3ff1933dba9a -0.19 0.10 typed,snapshot-testedlibrariesth -cv-panel 0:32c1cf49a2fe 0.39 0.15 skills +cv-panel 0:32c1cf49a2fe 0.44 0.15 skills cv-panel 0:eea537278f83 0.17 0.15 •languages:java21,kotlin,groovy, cv-panel 0:7e941e729572 -0.01 0.15 •document&print:pdfbox,apachepoi cv-panel 0:9e3166ce2413 0.01 0.15 itext,postscript,icccolourprofil @@ -1022,7 +1022,7 @@ cv-panel 0:f5f76d479ec8 0.07 0.15 •build&infrastructure:maven,grad cv-panel 0:656a2a3e57e0 0.09 0.15 jitpack,docker,jmhbenchmarking cv-panel 0:9a6921f79b7d 0.15 0.15 •distribution:mavencentral,sonat cv-panel 0:77a74982066f 0.17 0.15 jitpack,semanticversioningdiscip -cv-panel 0:68bf0109c6f8 0.75 0.15 education +cv-panel 0:68bf0109c6f8 0.80 0.15 education cv-panel 0:871923f4f0f2 0.53 0.15 msccomputerscience-2019-2021 cv-panel 0:47ce0218bbea 0.55 0.15 universityofmanchester cv-panel 0:51e1ec7daa5a 0.35 0.15 distinction.thesis:composablelay @@ -1035,7 +1035,7 @@ cv-panel 0:8971b01c36bb 0.65 0.15 oraclejavacertification-2023-202 cv-panel 0:2669e1f6d55c 0.67 0.15 professionaltrack cv-panel 0:4f17e3d7d6f4 0.47 0.15 java17platformdeep-dive:records, cv-panel 0:9e6154a3b625 0.49 0.15 matching,virtualthreads. -cv-panel 0:7b476727faf3 1.07 0.15 additional +cv-panel 0:7b476727faf3 1.12 0.15 additional cv-panel 0:3f88eb4c530c 0.65 0.15 languages:english(fluent),german cv-panel 0:5d276fee8c17 0.67 0.15 (basic) cv-panel 0:ec9d3622395e 0.89 0.15 workeligibility:eligibletoworkin @@ -1043,7 +1043,7 @@ cv-panel 0:d05b8b335e96 0.71 0.15 opensource:maintainerofgraphcomp cv-panel 0:2f3b4176123d 0.73 0.15 contributortopdfboxissuetriage. cv-panel 0:1ae173b42166 0.75 0.15 speaking:jvmsummit2024,devoxxuk2 cv-panel 0:309255ca6a36 0.77 0.15 declarativedocumentlayout. -cv-panel 0:53e5e7c5a884 0.39 0.16 experience +cv-panel 0:53e5e7c5a884 0.44 0.16 experience cv-panel 0:99b44abc1b3e 0.17 0.16 seniorplatformengineer-2024-pres cv-panel 0:f890faef907f 0.19 0.16 northwindsystems cv-panel 0:e32ca827bfd5 -0.01 0.16 ledthereusabledocument-generatio @@ -1062,7 +1062,7 @@ cv-panel 0:ef148f221e31 0.31 0.16 helixprintco cv-panel 0:09cc06a649eb 0.11 0.16 maintainedahigh-volumeinvoice-pr cv-panel 0:090e2184c17b 0.13 0.16 pdfs/year)andauthoredthecomplian cv-panel 0:6f071fdf7529 0.15 0.16 gatedeverytemplatechange. -cv-panel 0:2577c0f557b2 0.73 0.16 projects +cv-panel 0:2577c0f557b2 0.78 0.16 projects cv-panel 0:b2b029995203 0.51 0.16 •graphcompose(java21,pdfbox,mave cv-panel 0:81c8132f9792 0.39 0.16 systems.(opensource) cv-panel 0:753f46e4e01b 0.41 0.16 •templatestudio(kotlin,composede @@ -1437,34 +1437,34 @@ cv-teal_pulse 0:de15ca9e3d9f 0.08 0.07 polish(conversational) cv-teal_pulse 0:b035d3696f4e -0.22 0.07 righttowork:unitedkingdom cv-teal_pulse 0:cfa1d6dd779c -0.22 0.07 availability:1monthnotice cv-teal_pulse 0:b9b8965717b3 -0.23 1.62 compassionatecare.clinicalexcell -cv-terracotta_rail 0:920a88ef5818 0.35 0.07 oliver.bennett@email.com -cv-terracotta_rail 0:a8acc3a90a7b 0.35 0.07 +447700900123 -cv-terracotta_rail 0:e8c463a6c54d 0.35 0.07 bristol,unitedkingdom -cv-terracotta_rail 0:84308bea4540 0.35 0.07 linkedin +cv-terracotta_rail 0:920a88ef5818 0.05 0.07 oliver.bennett@email.com +cv-terracotta_rail 0:a8acc3a90a7b 0.05 0.07 +447700900123 +cv-terracotta_rail 0:e8c463a6c54d 0.05 0.07 bristol,unitedkingdom +cv-terracotta_rail 0:84308bea4540 0.05 0.07 linkedin cv-terracotta_rail 0:32c1cf49a2fe -0.21 0.10 skills -cv-terracotta_rail 0:4e1fe6feb1d5 0.37 0.07 architecturaldesign -cv-terracotta_rail 0:4b1ce58ed984 0.37 0.07 conceptdevelopment -cv-terracotta_rail 0:e8386273ac51 0.37 0.07 planningapplications -cv-terracotta_rail 0:09033be5db1b 0.37 0.07 technicaldrawings -cv-terracotta_rail 0:de4e9e607840 0.37 0.07 revit -cv-terracotta_rail 0:de4e9e607840#1 0.35 0.47 revit -cv-terracotta_rail 0:50f08e64c5a6 0.37 0.07 autocad -cv-terracotta_rail 0:50f08e64c5a6#1 0.35 0.47 autocad -cv-terracotta_rail 0:af7c811cbfce 0.37 0.07 bimcoordination -cv-terracotta_rail 0:531b7caeda92 0.37 0.07 designpresentations -cv-terracotta_rail 0:bfcd894f9698 0.37 0.07 projectdelivery -cv-terracotta_rail 0:9a1192ab93d0 0.37 0.07 stakeholdermanagement -cv-terracotta_rail 0:48fe07df4f1c 0.37 0.07 sustainabledesign -cv-terracotta_rail 0:95626582af55 0.37 0.07 buildingregulations +cv-terracotta_rail 0:4e1fe6feb1d5 0.07 0.07 architecturaldesign +cv-terracotta_rail 0:4b1ce58ed984 0.07 0.07 conceptdevelopment +cv-terracotta_rail 0:e8386273ac51 0.07 0.07 planningapplications +cv-terracotta_rail 0:09033be5db1b 0.07 0.07 technicaldrawings +cv-terracotta_rail 0:de4e9e607840 0.07 0.07 revit +cv-terracotta_rail 0:de4e9e607840#1 0.05 0.47 revit +cv-terracotta_rail 0:50f08e64c5a6 0.07 0.07 autocad +cv-terracotta_rail 0:50f08e64c5a6#1 0.05 0.47 autocad +cv-terracotta_rail 0:af7c811cbfce 0.07 0.07 bimcoordination +cv-terracotta_rail 0:531b7caeda92 0.07 0.07 designpresentations +cv-terracotta_rail 0:bfcd894f9698 0.07 0.07 projectdelivery +cv-terracotta_rail 0:9a1192ab93d0 0.07 0.07 stakeholdermanagement +cv-terracotta_rail 0:48fe07df4f1c 0.07 0.07 sustainabledesign +cv-terracotta_rail 0:95626582af55 0.07 0.07 buildingregulations cv-terracotta_rail 0:35390f5453e8 -0.18 0.10 software -cv-terracotta_rail 0:2d5d6ea604fd 0.35 0.47 rhino -cv-terracotta_rail 0:5971b0dc0625 0.35 0.47 sketchup -cv-terracotta_rail 0:e9d09d8ff5bb 0.35 0.47 adobeindesign -cv-terracotta_rail 0:3f4a09b92ccf 0.35 0.47 photoshop -cv-terracotta_rail 0:3abe8752b2c0 0.35 0.47 microsoftoffice +cv-terracotta_rail 0:2d5d6ea604fd 0.05 0.47 rhino +cv-terracotta_rail 0:5971b0dc0625 0.05 0.47 sketchup +cv-terracotta_rail 0:e9d09d8ff5bb 0.05 0.47 adobeindesign +cv-terracotta_rail 0:3f4a09b92ccf 0.05 0.47 photoshop +cv-terracotta_rail 0:3abe8752b2c0 0.05 0.47 microsoftoffice cv-terracotta_rail 0:e831beb04c00 -0.21 0.10 certifications -cv-terracotta_rail 0:3ad949ee8543 0.32 0.47 arbregisteredarchitect -cv-terracotta_rail 0:fa807066704f 0.32 0.47 ribacharteredmember +cv-terracotta_rail 0:3ad949ee8543 0.02 0.47 arbregisteredarchitect +cv-terracotta_rail 0:fa807066704f 0.02 0.47 ribacharteredmember cv-terracotta_rail 0:676dfdd56ad2 -0.24 0.10 additionalinformation cv-terracotta_rail 0:705ab1a9cb61 -0.22 0.07 languages: cv-terracotta_rail 0:9ee0e2dddc94 -0.24 0.07 english(native), @@ -1705,16 +1705,16 @@ cv-violet_grid 0:e35242c809c8 -1.51 0.02 portuguese cv-violet_grid 0:c5d1de4964d6 -1.51 -0.03 conversational cv-violet_grid 0:1de4fede4f63 -1.26 -0.17 idesignwithempathy,iteratewithpu invoice-classic 0:c26c22b94338 0.49 0.10 graphcomposestudio -invoice-classic 0:c26c22b94338#1 0.30 0.06 graphcomposestudio -invoice-classic 0:2a08ce5567fb 0.35 0.10 18layoutstreet +invoice-classic 0:c26c22b94338#1 0.10 0.06 graphcomposestudio +invoice-classic 0:2a08ce5567fb 0.15 0.10 18layoutstreet invoice-classic 0:2a08ce5567fb#1 0.03 0.06 18layoutstreet invoice-classic 0:52d6e3de4fa0 0.10 0.06 invoice -invoice-classic 0:38e9951985e4 0.32 0.06 gc-2026-041 -invoice-classic 0:20fe884effee 0.32 0.06 issued02apr2026 +invoice-classic 0:38e9951985e4 0.12 0.06 gc-2026-041 +invoice-classic 0:20fe884effee 0.12 0.06 issued02apr2026 invoice-classic 0:57a66d21eb1b 0.30 0.10 totaldue -invoice-classic 0:30d85a94548c 0.37 0.10 invoicegc-2026-041issued02apr202 +invoice-classic 0:30d85a94548c 0.07 0.10 invoicegc-2026-041issued02apr202 invoice-classic 0:aeba3a7b3598 0.33 0.10 billto -invoice-classic 0:f890faef907f 0.30 0.10 northwindsystems +invoice-classic 0:f890faef907f 0.10 0.10 northwindsystems invoice-classic 0:1b405eb431ca 0.03 0.10 attn:financeteam invoice-classic 0:91eefd794f79 0.00 0.10 410marketavenue invoice-classic 0:00a97da4e243 -0.02 0.10 manchester,uk @@ -1759,18 +1759,18 @@ invoice-classic 0:434cc906ae90 0.17 0.09 billing@graphcompose.devfor invoice-classic 0:8822ea375315 0.17 0.09 remittancedetails. invoice-classic 0:1a7b5c840e25 0.17 0.06 •latepaymentsmaydelayadditional invoice-classic 0:1631a06d245f 0.17 0.09 templatecustomizationwork. -invoice-classic 0:e3337beaa171 0.15 0.10 thankyouforchoosinggraphcomposef +invoice-classic 0:e3337beaa171 -0.05 0.10 thankyouforchoosinggraphcomposef invoice-classic_long 0:c26c22b94338 0.49 0.10 graphcomposestudio -invoice-classic_long 0:c26c22b94338#1 0.30 0.06 graphcomposestudio -invoice-classic_long 0:2a08ce5567fb 0.35 0.10 18layoutstreet +invoice-classic_long 0:c26c22b94338#1 0.10 0.06 graphcomposestudio +invoice-classic_long 0:2a08ce5567fb 0.15 0.10 18layoutstreet invoice-classic_long 0:2a08ce5567fb#1 0.03 0.06 18layoutstreet invoice-classic_long 0:52d6e3de4fa0 0.10 0.06 invoice -invoice-classic_long 0:3594d2085950 0.32 0.06 gc-2026-042 -invoice-classic_long 0:25851a973edd 0.32 0.06 issued04may2026 +invoice-classic_long 0:3594d2085950 0.12 0.06 gc-2026-042 +invoice-classic_long 0:25851a973edd 0.12 0.06 issued04may2026 invoice-classic_long 0:57a66d21eb1b 0.30 0.10 totaldue -invoice-classic_long 0:9eea1e05ff47 0.37 0.10 invoicegc-2026-042issued04may202 +invoice-classic_long 0:9eea1e05ff47 0.07 0.10 invoicegc-2026-042issued04may202 invoice-classic_long 0:aeba3a7b3598 0.33 0.10 billto -invoice-classic_long 0:f890faef907f 0.30 0.10 northwindsystems +invoice-classic_long 0:f890faef907f 0.10 0.10 northwindsystems invoice-classic_long 0:1b405eb431ca 0.03 0.10 attn:financeteam invoice-classic_long 0:91eefd794f79 0.00 0.10 410marketavenue invoice-classic_long 0:00a97da4e243 -0.02 0.10 manchester,uk @@ -1925,7 +1925,7 @@ invoice-classic_long 1:24274f39b50b 0.22 0.06 •paymentduewithin14calendardays. invoice-classic_long 1:c438440ba377 0.22 0.06 •banktransferpreferred;contact invoice-classic_long 1:434cc906ae90 0.22 0.09 billing@graphcompose.devfor invoice-classic_long 1:8822ea375315 0.22 0.09 remittancedetails. -invoice-classic_long 1:e3337beaa171 0.20 0.10 thankyouforchoosinggraphcomposef +invoice-classic_long 1:e3337beaa171 0.00 0.10 thankyouforchoosinggraphcomposef invoice-consulting 0:d44ceaea97d1 0.27 0.10 level8,1collinsstreet invoice-consulting 0:78a0bb33347f 0.29 0.10 melbournevic3000australia invoice-consulting 0:3b45ab243edb 0.51 0.10 +61398765432 @@ -1944,16 +1944,16 @@ invoice-consulting 0:28447bbc85e1 -0.19 0.06 digitalstrategyengagement invoice-consulting 0:d7523d00af19 -0.53 0.07 ponumber: invoice-consulting 0:80a06a9ef12d -0.19 0.06 po-7892 invoice-consulting 0:aef9b6cb1bcd -0.06 0.10 billedto -invoice-consulting 0:3fc5213307f9 -0.10 0.10 greenfieldindustriesltd. -invoice-consulting 0:37d614eaf852 -0.09 0.10 accountspayabledepartment -invoice-consulting 0:c438c5ffc681 -0.08 0.10 12innovationdrive -invoice-consulting 0:89f5b4615dc3 -0.07 0.10 melbournevic3000 -invoice-consulting 0:c585f1decb98 -0.06 0.10 australia -invoice-consulting 0:4438ad217dea -0.05 0.10 email:ap@greenfield.com.au +invoice-consulting 0:3fc5213307f9 0.10 0.10 greenfieldindustriesltd. +invoice-consulting 0:37d614eaf852 0.11 0.10 accountspayabledepartment +invoice-consulting 0:c438c5ffc681 0.12 0.10 12innovationdrive +invoice-consulting 0:89f5b4615dc3 0.13 0.10 melbournevic3000 +invoice-consulting 0:c585f1decb98 0.14 0.10 australia +invoice-consulting 0:4438ad217dea 0.15 0.10 email:ap@greenfield.com.au invoice-consulting 0:cfebda697822 -0.06 0.10 invoicesummary -invoice-consulting 0:5656f37a9311 0.40 0.10 professionalservicesrenderedinac -invoice-consulting 0:a918299ac844 0.41 0.10 statementofworkfortheperiod -invoice-consulting 0:3fa8489d9aac -0.08 0.10 1may2025–25may2025. +invoice-consulting 0:5656f37a9311 0.15 0.10 professionalservicesrenderedinac +invoice-consulting 0:a918299ac844 0.16 0.10 statementofworkfortheperiod +invoice-consulting 0:3fa8489d9aac 0.12 0.10 1may2025–25may2025. invoice-consulting 0:c9046f7a37ad 0.67 -0.70 description invoice-consulting 0:b28225a1247c 0.67 -0.82 serviceperiod invoice-consulting 0:32e8369a9c4f 0.67 -0.35 qty @@ -2009,12 +2009,12 @@ invoice-consulting 0:83a417f0862b 1.01 0.10 123-456 invoice-consulting 0:6b4894c28363 1.01 0.10 accountnumber: invoice-consulting 0:ef797c8118f0 1.01 0.10 12345678 invoice-consulting 0:c608665436db 1.01 0.10 reference: -invoice-consulting 0:010450dee1ff 1.02 0.10 pleaseensuretheinvoicenumberisin +invoice-consulting 0:010450dee1ff 0.52 0.10 pleaseensuretheinvoicenumberisin invoice-consulting 0:ab5aa97074c4 0.36 0.12 notes -invoice-consulting 0:7c6ab37d83ef 0.32 0.12 thankyouforyourbusiness. -invoice-consulting 0:4a699e29a3bb 0.83 0.12 ifyouhaveanyquestionsregardingth -invoice-consulting 0:c766251af1f4 0.84 0.12 contactusataccounts@northpoint.c -invoice-consulting 0:3d32fa219332 0.85 0.12 +61398765432. +invoice-consulting 0:7c6ab37d83ef 0.52 0.12 thankyouforyourbusiness. +invoice-consulting 0:4a699e29a3bb 0.53 0.12 ifyouhaveanyquestionsregardingth +invoice-consulting 0:c766251af1f4 0.54 0.12 contactusataccounts@northpoint.c +invoice-consulting 0:3d32fa219332 0.55 0.12 +61398765432. invoice-consulting 0:a6f6e2ddab6d 0.97 0.12 paymentisduewithin30daysfromthei invoice-consulting 0:55ee5fe62c33 0.01 0.13 northpointconsultingptyltd|abn12 invoice-consulting 0:bdbada284e80 0.01 0.29 page1/1 @@ -2035,16 +2035,16 @@ invoice-consulting_long 0:28447bbc85e1 -0.19 0.06 digitalstrategyengagement invoice-consulting_long 0:d7523d00af19 -0.53 0.07 ponumber: invoice-consulting_long 0:80a06a9ef12d -0.19 0.06 po-7892 invoice-consulting_long 0:aef9b6cb1bcd -0.06 0.10 billedto -invoice-consulting_long 0:3fc5213307f9 -0.10 0.10 greenfieldindustriesltd. -invoice-consulting_long 0:37d614eaf852 -0.09 0.10 accountspayabledepartment -invoice-consulting_long 0:c438c5ffc681 -0.08 0.10 12innovationdrive -invoice-consulting_long 0:89f5b4615dc3 -0.07 0.10 melbournevic3000 -invoice-consulting_long 0:c585f1decb98 -0.06 0.10 australia -invoice-consulting_long 0:4438ad217dea -0.05 0.10 email:ap@greenfield.com.au +invoice-consulting_long 0:3fc5213307f9 0.10 0.10 greenfieldindustriesltd. +invoice-consulting_long 0:37d614eaf852 0.11 0.10 accountspayabledepartment +invoice-consulting_long 0:c438c5ffc681 0.12 0.10 12innovationdrive +invoice-consulting_long 0:89f5b4615dc3 0.13 0.10 melbournevic3000 +invoice-consulting_long 0:c585f1decb98 0.14 0.10 australia +invoice-consulting_long 0:4438ad217dea 0.15 0.10 email:ap@greenfield.com.au invoice-consulting_long 0:cfebda697822 -0.06 0.10 invoicesummary -invoice-consulting_long 0:5656f37a9311 0.40 0.10 professionalservicesrenderedinac -invoice-consulting_long 0:a918299ac844 0.41 0.10 statementofworkfortheperiod -invoice-consulting_long 0:3fa8489d9aac -0.08 0.10 1may2025–25may2025. +invoice-consulting_long 0:5656f37a9311 0.15 0.10 professionalservicesrenderedinac +invoice-consulting_long 0:a918299ac844 0.16 0.10 statementofworkfortheperiod +invoice-consulting_long 0:3fa8489d9aac 0.12 0.10 1may2025–25may2025. invoice-consulting_long 0:c9046f7a37ad 0.67 -0.70 description invoice-consulting_long 0:b28225a1247c 0.67 -0.82 serviceperiod invoice-consulting_long 0:32e8369a9c4f 0.67 -0.35 qty @@ -2245,12 +2245,12 @@ invoice-consulting_long 1:6b4894c28363 0.84 0.10 accountnumber: invoice-consulting_long 1:ef797c8118f0 0.84 0.10 12345678 invoice-consulting_long 1:c608665436db 0.84 0.10 reference: invoice-consulting_long 1:7d66eb3c1070 0.84 0.10 inv-2025-0478 -invoice-consulting_long 1:010450dee1ff 0.85 0.10 pleaseensuretheinvoicenumberisin +invoice-consulting_long 1:010450dee1ff 0.35 0.10 pleaseensuretheinvoicenumberisin invoice-consulting_long 1:ab5aa97074c4 0.19 0.12 notes -invoice-consulting_long 1:7c6ab37d83ef 0.15 0.12 thankyouforyourbusiness. -invoice-consulting_long 1:4a699e29a3bb 0.66 0.12 ifyouhaveanyquestionsregardingth -invoice-consulting_long 1:c766251af1f4 0.67 0.12 contactusataccounts@northpoint.c -invoice-consulting_long 1:3d32fa219332 0.68 0.12 +61398765432. +invoice-consulting_long 1:7c6ab37d83ef 0.35 0.12 thankyouforyourbusiness. +invoice-consulting_long 1:4a699e29a3bb 0.36 0.12 ifyouhaveanyquestionsregardingth +invoice-consulting_long 1:c766251af1f4 0.37 0.12 contactusataccounts@northpoint.c +invoice-consulting_long 1:3d32fa219332 0.38 0.12 +61398765432. invoice-consulting_long 1:a6f6e2ddab6d 0.80 0.12 paymentisduewithin30daysfromthei invoice-consulting_long 1:55ee5fe62c33 0.01 0.13 northpointconsultingptyltd|abn12 invoice-consulting_long 1:1bed6052d9b3 0.01 0.29 page2/2 @@ -2267,7 +2267,7 @@ invoice-luma_studio 0:2474519f77a9#2 -0.22 -0.01 unitedkingdom invoice-luma_studio 0:89b5eccb38ff 0.12 0.09 +44(0)2079460832 invoice-luma_studio 0:ea8232890494 0.07 0.09 hello@lumaandco.studio invoice-luma_studio 0:374d89493adc 0.03 0.09 www.lumaandco.studio -invoice-luma_studio 0:be3e8b44676d -0.05 0.09 companyno.12578934|vatno.3694567 +invoice-luma_studio 0:be3e8b44676d -0.25 0.09 companyno.12578934|vatno.3694567 invoice-luma_studio 0:52d6e3de4fa0 -10.79 0.02 invoice invoice-luma_studio 0:6bb089477e20 0.12 0.02 invoiceno. invoice-luma_studio 0:4435610d8a9f 0.19 0.01 inv-2024-0587 @@ -2337,7 +2337,7 @@ invoice-luma_studio 0:eeb53247f32c -0.56 0.08 ofluma&co.studiountilpayment invoice-luma_studio 0:9eef22d7d34e -0.61 0.08 hasbeenreceivedinfull. invoice-luma_studio 0:3c7ade679fdf -0.07 0.00 paymentdetails invoice-luma_studio 0:b1819c9cd5bf -0.34 0.00 pleasemakepaymentbybanktransfert -invoice-luma_studio 0:8c1e4a24f6a8 -0.10 0.00 luma&co.studioltd +invoice-luma_studio 0:8c1e4a24f6a8 -0.30 0.00 luma&co.studioltd invoice-luma_studio 0:4381dc2ab142 -0.14 0.00 bank invoice-luma_studio 0:447827e26127 -0.14 0.00 starlingbank invoice-luma_studio 0:10aeacde20ff -0.14 0.00 sortcode @@ -2364,7 +2364,7 @@ invoice-luma_studio_long 0:2474519f77a9#2 -0.22 -0.01 unitedkingdom invoice-luma_studio_long 0:89b5eccb38ff 0.12 0.09 +44(0)2079460832 invoice-luma_studio_long 0:ea8232890494 0.07 0.09 hello@lumaandco.studio invoice-luma_studio_long 0:374d89493adc 0.03 0.09 www.lumaandco.studio -invoice-luma_studio_long 0:be3e8b44676d -0.05 0.09 companyno.12578934|vatno.3694567 +invoice-luma_studio_long 0:be3e8b44676d -0.25 0.09 companyno.12578934|vatno.3694567 invoice-luma_studio_long 0:52d6e3de4fa0 -10.79 0.02 invoice invoice-luma_studio_long 0:6bb089477e20 0.12 0.02 invoiceno. invoice-luma_studio_long 0:4435610d8a9f 0.19 0.01 inv-2024-0587 @@ -2529,7 +2529,7 @@ invoice-luma_studio_long 2:eeb53247f32c -0.33 0.08 ofluma&co.studiountilpayment invoice-luma_studio_long 2:9eef22d7d34e -0.37 0.08 hasbeenreceivedinfull. invoice-luma_studio_long 2:3c7ade679fdf 0.17 0.00 paymentdetails invoice-luma_studio_long 2:b1819c9cd5bf -0.10 0.00 pleasemakepaymentbybanktransfert -invoice-luma_studio_long 2:8c1e4a24f6a8 0.14 0.00 luma&co.studioltd +invoice-luma_studio_long 2:8c1e4a24f6a8 -0.06 0.00 luma&co.studioltd invoice-luma_studio_long 2:4381dc2ab142 0.10 0.00 bank invoice-luma_studio_long 2:447827e26127 0.10 0.00 starlingbank invoice-luma_studio_long 2:10aeacde20ff 0.10 0.00 sortcode @@ -2733,9 +2733,9 @@ invoice-metered 0:e28672d64882 -0.04 0.12 northwindcloudservicesltd.isasub invoice-metered 0:985e43c2de34 -0.04 0.12 120riversideway,bristol,bs16qt,u invoice-metered 0:7b14b8d2c5c4 -0.04 0.16 page1of1 invoice-modern 0:52d6e3de4fa0 0.00 0.10 invoice -invoice-modern 0:30d85a94548c 0.30 0.10 invoicegc-2026-041issued02apr202 +invoice-modern 0:30d85a94548c 0.00 0.10 invoicegc-2026-041issued02apr202 invoice-modern 0:75857a458999 0.20 0.10 from -invoice-modern 0:c26c22b94338 0.18 0.10 graphcomposestudio +invoice-modern 0:c26c22b94338 -0.02 0.10 graphcomposestudio invoice-modern 0:2a08ce5567fb -0.10 0.10 18layoutstreet invoice-modern 0:fbeea547d99e -0.12 0.10 london,uk invoice-modern 0:faf1569a98e9 -0.15 0.10 ec1a4gc @@ -2743,7 +2743,7 @@ invoice-modern 0:befc6e9b5c24 -0.17 0.10 billing@graphcompose.dev invoice-modern 0:89674e6f130e -0.20 0.10 +442055551000 invoice-modern 0:a2b2e7d2906f -0.22 0.10 taxidgb-99887766 invoice-modern 0:aeba3a7b3598 0.20 0.11 billto -invoice-modern 0:f890faef907f 0.18 0.11 northwindsystems +invoice-modern 0:f890faef907f -0.02 0.11 northwindsystems invoice-modern 0:1b405eb431ca -0.10 0.11 attn:financeteam invoice-modern 0:91eefd794f79 -0.12 0.11 410marketavenue invoice-modern 0:00a97da4e243 -0.15 0.11 manchester,uk @@ -2785,19 +2785,19 @@ invoice-modern 0:434cc906ae90 0.02 0.14 billing@graphcompose.devfor invoice-modern 0:8822ea375315 0.02 0.14 remittancedetails. invoice-modern 0:1a7b5c840e25 0.02 0.11 •latepaymentsmaydelayadditional invoice-modern 0:1631a06d245f 0.02 0.14 templatecustomizationwork. -invoice-modern 0:e3337beaa171 0.00 0.10 thankyouforchoosinggraphcomposef +invoice-modern 0:e3337beaa171 -0.20 0.10 thankyouforchoosinggraphcomposef invoice-modern_long 0:52d6e3de4fa0 0.00 0.10 invoice -invoice-modern_long 0:61a964e78950 0.30 0.10 invoicegc-2026-042issued04may202 -invoice-modern_long 0:62a2fed3d6e0 0.30 0.10 pending +invoice-modern_long 0:61a964e78950 0.00 0.10 invoicegc-2026-042issued04may202 +invoice-modern_long 0:62a2fed3d6e0 0.00 0.10 pending invoice-modern_long 0:75857a458999 0.20 0.10 from -invoice-modern_long 0:c26c22b94338 0.18 0.10 graphcomposestudio +invoice-modern_long 0:c26c22b94338 -0.02 0.10 graphcomposestudio invoice-modern_long 0:2a08ce5567fb -0.10 0.10 18layoutstreet invoice-modern_long 0:fbeea547d99e -0.12 0.10 london,uk invoice-modern_long 0:faf1569a98e9 -0.15 0.10 ec1a4gc invoice-modern_long 0:befc6e9b5c24 -0.17 0.10 billing@graphcompose.dev invoice-modern_long 0:89674e6f130e -0.20 0.10 +442055551000 invoice-modern_long 0:aeba3a7b3598 0.20 0.11 billto -invoice-modern_long 0:f890faef907f 0.18 0.11 northwindsystems +invoice-modern_long 0:f890faef907f -0.02 0.11 northwindsystems invoice-modern_long 0:1b405eb431ca -0.10 0.11 attn:financeteam invoice-modern_long 0:91eefd794f79 -0.12 0.11 410marketavenue invoice-modern_long 0:00a97da4e243 -0.15 0.11 manchester,uk @@ -2947,7 +2947,7 @@ invoice-modern_long 1:24274f39b50b 0.22 0.11 •paymentduewithin14calendardays. invoice-modern_long 1:c438440ba377 0.22 0.11 •banktransferpreferred;contact invoice-modern_long 1:434cc906ae90 0.22 0.14 billing@graphcompose.devfor invoice-modern_long 1:8822ea375315 0.22 0.14 remittancedetails. -invoice-modern_long 1:e3337beaa171 0.20 0.10 thankyouforchoosinggraphcomposef +invoice-modern_long 1:e3337beaa171 0.00 0.10 thankyouforchoosinggraphcomposef invoice-obsidian 0:07f15cde5b18 0.14 0.09 kestrel invoice-obsidian 0:52d6e3de4fa0 0.12 0.09 invoice invoice-obsidian 0:5d1d1b79af09 0.02 0.09 invoicenumber @@ -3244,20 +3244,20 @@ invoice-platform 0:d5ef7c1f9830 -0.46 0.11 thankyouforrunningonauroracloud. invoice-platform 0:6a88f440b84e -0.46 0.11 manageyouraccountataurora.exampl invoice-platform 0:cf0a1e1dc87b -0.54 0.45 500harbourstreet,vancouver,bcv6c invoice-platform 0:7b14b8d2c5c4 0.02 0.49 page1of1 -invoice-subscription 0:435df6fdbffd 0.05 0.12 halstead +invoice-subscription 0:435df6fdbffd 0.00 0.12 halstead invoice-subscription 0:52d6e3de4fa0 0.02 -0.35 invoice -invoice-subscription 0:0a36c1665b7e 0.28 0.12 halsteadsoftwareltd. -invoice-subscription 0:6bc2056359b7 0.20 0.12 18chandlerrow -invoice-subscription 0:776a7e9eb92a 0.22 0.12 leedsls14qt -invoice-subscription 0:2474519f77a9 0.24 0.12 unitedkingdom -invoice-subscription 0:2474519f77a9#1 0.45 0.12 unitedkingdom -invoice-subscription 0:2474519f77a9#2 0.45 0.07 unitedkingdom +invoice-subscription 0:0a36c1665b7e -0.02 0.12 halsteadsoftwareltd. +invoice-subscription 0:6bc2056359b7 -0.05 0.12 18chandlerrow +invoice-subscription 0:776a7e9eb92a -0.03 0.12 leedsls14qt +invoice-subscription 0:2474519f77a9 -0.01 0.12 unitedkingdom +invoice-subscription 0:2474519f77a9#1 0.20 0.12 unitedkingdom +invoice-subscription 0:2474519f77a9#2 0.20 0.07 unitedkingdom invoice-subscription 0:bfdec553b85a 0.24 0.12 billing@halstead.example invoice-subscription 0:78acb3cb907b 0.27 0.12 www.halstead.example invoice-subscription 0:f1c030eb4329 0.29 0.12 vatnogb418227603 invoice-subscription 0:77ead61b5875 0.29 0.09 invoiceno invoice-subscription 0:0b0c0ee24de8 0.26 0.74 hs-inv-2026-0417 -invoice-subscription 0:0b0c0ee24de8#1 0.63 0.88 hs-inv-2026-0417 +invoice-subscription 0:0b0c0ee24de8#1 0.38 0.88 hs-inv-2026-0417 invoice-subscription 0:8feaf8016bab 0.34 0.09 issuedate invoice-subscription 0:4d49cb78b810 0.32 0.62 27august2026 invoice-subscription 0:ac10f8c16320 0.39 0.09 duedate @@ -3267,15 +3267,15 @@ invoice-subscription 0:56a2e019b8aa 0.42 0.43 14days invoice-subscription 0:466e5b9cd57f 0.50 0.09 currency invoice-subscription 0:54f8e1b3fe44 0.47 0.31 gbp invoice-subscription 0:aeba3a7b3598 0.51 0.12 billto -invoice-subscription 0:7bfc2b791f41 0.39 0.12 northlineconsultingltd -invoice-subscription 0:7bfc2b791f41#1 0.39 0.07 northlineconsultingltd -invoice-subscription 0:bcb7024f74fe 0.40 0.12 attn:sarahmitchell -invoice-subscription 0:13dd937d2fe6 0.42 0.12 21jubileeway -invoice-subscription 0:f9bab6a0b45b 0.43 0.12 londonse13ss +invoice-subscription 0:7bfc2b791f41 0.14 0.12 northlineconsultingltd +invoice-subscription 0:7bfc2b791f41#1 0.14 0.07 northlineconsultingltd +invoice-subscription 0:bcb7024f74fe 0.15 0.12 attn:sarahmitchell +invoice-subscription 0:13dd937d2fe6 0.17 0.12 21jubileeway +invoice-subscription 0:f9bab6a0b45b 0.18 0.12 londonse13ss invoice-subscription 0:725a8f5062e7 0.51 0.07 shipto -invoice-subscription 0:254289ce0191 0.40 0.07 thefoundry,2ndfloor -invoice-subscription 0:84db1f48facb 0.42 0.07 17-19greatsuffolkstreet -invoice-subscription 0:e7a5f0717d99 0.43 0.07 londonse10ns +invoice-subscription 0:254289ce0191 0.15 0.07 thefoundry,2ndfloor +invoice-subscription 0:84db1f48facb 0.17 0.07 17-19greatsuffolkstreet +invoice-subscription 0:e7a5f0717d99 0.18 0.07 londonse10ns invoice-subscription 0:c9046f7a37ad 0.54 0.12 description invoice-subscription 0:32e8369a9c4f 0.54 0.13 qty invoice-subscription 0:d1062d072acd 0.54 0.06 unitprice @@ -3311,19 +3311,19 @@ invoice-subscription 0:14edcfc20351 0.62 0.44 £189.40 invoice-subscription 0:57a66d21eb1b 0.67 0.11 totaldue invoice-subscription 0:cf1b68cc49ef 0.74 0.94 £1,136.40 invoice-subscription 0:3c7ade679fdf 0.79 0.12 paymentdetails -invoice-subscription 0:56ed021beb35 0.67 0.54 beneficiary -invoice-subscription 0:0b85f3c8ed04 0.63 0.33 halsteadsoftwareltd -invoice-subscription 0:4381dc2ab142 0.67 0.77 bank -invoice-subscription 0:6d50b2dd724f 0.63 0.84 northgatebank -invoice-subscription 0:10aeacde20ff 0.67 0.83 sortcode -invoice-subscription 0:b19b1415ef9b 0.63 0.99 40-05-30 -invoice-subscription 0:f92a9c925024 0.67 0.94 accountnumber -invoice-subscription 0:ef797c8118f0 0.63 0.97 12345678 -invoice-subscription 0:52367a6622b1 0.67 0.86 reference -invoice-subscription 0:04f7247e8e99 0.67 0.12 pleaseincludetheinvoicenumberast +invoice-subscription 0:56ed021beb35 0.42 0.54 beneficiary +invoice-subscription 0:0b85f3c8ed04 0.38 0.33 halsteadsoftwareltd +invoice-subscription 0:4381dc2ab142 0.42 0.77 bank +invoice-subscription 0:6d50b2dd724f 0.38 0.84 northgatebank +invoice-subscription 0:10aeacde20ff 0.42 0.83 sortcode +invoice-subscription 0:b19b1415ef9b 0.38 0.99 40-05-30 +invoice-subscription 0:f92a9c925024 0.42 0.94 accountnumber +invoice-subscription 0:ef797c8118f0 0.38 0.97 12345678 +invoice-subscription 0:52367a6622b1 0.42 0.86 reference +invoice-subscription 0:04f7247e8e99 0.42 0.12 pleaseincludetheinvoicenumberast invoice-subscription 0:7c6ab37d83ef 0.71 0.09 thankyouforyourbusiness. -invoice-subscription 0:354ffeb2bbc3 0.67 0.09 paymentisdueby10september2026.if -invoice-subscription 0:7f7d98088133 0.68 0.09 foranyqueries,pleasecontactbilli +invoice-subscription 0:354ffeb2bbc3 0.42 0.09 paymentisdueby10september2026.if +invoice-subscription 0:7f7d98088133 0.43 0.09 foranyqueries,pleasecontactbilli invoice-subscription 0:7b14b8d2c5c4 0.00 0.19 page1of1 invoice-workspace 0:07f15cde5b18 0.15 0.11 kestrel invoice-workspace 0:07f15cde5b18#1 -0.04 0.11 kestrel @@ -3415,7 +3415,7 @@ invoice-workspace 0:18e82fbd48a3 -0.34 0.12 questionsaboutthisinvoice?reachu invoice-workspace 0:3c72ba0e1eb8 -0.47 0.06 500howardstreet,6thfloor,sanfran invoice-workspace 0:9e2917e23527 -0.48 -0.12 kestrel.example invoice-workspace 0:7b14b8d2c5c4 -0.05 -0.03 page1of1 -letter-blue_banner 0:8f1010120ed6 0.42 1.95 jordanrivera +letter-blue_banner 0:8f1010120ed6 0.02 1.95 jordanrivera letter-blue_banner 0:8f1010120ed6#1 -0.02 0.10 jordanrivera letter-blue_banner 0:8d7a2cca3060 -0.20 0.24 +442055551000|jordan.rivera@exam letter-blue_banner 0:bef81b541365 -0.21 0.10 dearhiringteamatnorthwindsystems @@ -3426,18 +3426,18 @@ letter-blue_banner 0:eae27893a255 -0.42 0.10 therestoftheteam. letter-blue_banner 0:a71e98216baa -0.08 0.10 iwouldwelcometheopportunitytobri letter-blue_banner 0:80a6a628ad52 -0.05 0.10 sincerely, letter-boxed_sections 0:8f1010120ed6 0.46 2.20 jordanrivera -letter-boxed_sections 0:8f1010120ed6#1 0.33 0.10 jordanrivera +letter-boxed_sections 0:8f1010120ed6#1 0.13 0.10 jordanrivera letter-boxed_sections 0:8d7a2cca3060 0.23 0.22 +442055551000|jordan.rivera@exam -letter-boxed_sections 0:bef81b541365 0.29 0.10 dearhiringteamatnorthwindsystems +letter-boxed_sections 0:bef81b541365 0.09 0.10 dearhiringteamatnorthwindsystems letter-boxed_sections 0:ab54410ead82 -0.01 0.10 iamexcitedtosharemyinterestinthe letter-boxed_sections 0:9185168d2cf8 0.00 0.10 document-generationsystemsthatba letter-boxed_sections 0:5fb2802723b6 0.00 0.10 ienjoytranslatingfuzzyworkflowre letter-boxed_sections 0:dab2d688b7ab 0.01 0.10 adoptioneasierfortherestofthetea -letter-boxed_sections 0:a71e98216baa 0.31 0.10 iwouldwelcometheopportunitytobri -letter-boxed_sections 0:80a6a628ad52 0.32 0.10 sincerely, -letter-centered_headline 0:8f1010120ed6 -0.50 2.44 jordanrivera +letter-boxed_sections 0:a71e98216baa 0.11 0.10 iwouldwelcometheopportunitytobri +letter-boxed_sections 0:80a6a628ad52 0.12 0.10 sincerely, +letter-centered_headline 0:8f1010120ed6 -0.05 2.44 jordanrivera letter-centered_headline 0:8f1010120ed6#1 -0.06 0.10 jordanrivera -letter-centered_headline 0:2d58f0cadc2d -0.18 1.40 platformengineer +letter-centered_headline 0:2d58f0cadc2d -0.03 1.40 platformengineer letter-centered_headline 0:8d7a2cca3060 -0.23 0.48 +442055551000|jordan.rivera@exam letter-centered_headline 0:bef81b541365 -0.25 0.10 dearhiringteamatnorthwindsystems letter-centered_headline 0:ab54410ead82 0.09 0.10 iamexcitedtosharemyinterestinthe @@ -3447,15 +3447,15 @@ letter-centered_headline 0:dab2d688b7ab 0.14 0.10 adoptioneasierfortherestofthet letter-centered_headline 0:a71e98216baa -0.12 0.10 iwouldwelcometheopportunitytobri letter-centered_headline 0:80a6a628ad52 -0.09 0.10 sincerely, letter-classic_serif 0:8f1010120ed6 -0.15 2.65 jordanrivera -letter-classic_serif 0:8f1010120ed6#1 0.02 0.10 jordanrivera -letter-classic_serif 0:8d7a2cca3060 0.19 -0.42 +442055551000|jordan.rivera@exam -letter-classic_serif 0:bef81b541365 0.20 0.10 dearhiringteamatnorthwindsystems +letter-classic_serif 0:8f1010120ed6#1 -0.13 0.10 jordanrivera +letter-classic_serif 0:8d7a2cca3060 -0.01 -0.42 +442055551000|jordan.rivera@exam +letter-classic_serif 0:bef81b541365 0.05 0.10 dearhiringteamatnorthwindsystems letter-classic_serif 0:ab54410ead82 -0.08 0.10 iamexcitedtosharemyinterestinthe letter-classic_serif 0:9185168d2cf8 -0.10 0.10 document-generationsystemsthatba letter-classic_serif 0:a463bced3db2 -0.13 0.10 ienjoytranslatingfuzzyworkflowre letter-classic_serif 0:dd474e249222 -0.15 0.10 makeadoptioneasierfortherestofth -letter-classic_serif 0:a71e98216baa 0.07 0.10 iwouldwelcometheopportunitytobri -letter-classic_serif 0:80a6a628ad52 0.05 0.10 sincerely, +letter-classic_serif 0:a71e98216baa -0.08 0.10 iwouldwelcometheopportunitytobri +letter-classic_serif 0:80a6a628ad52 -0.10 0.10 sincerely, letter-compact_mono 0:8f1010120ed6 0.31 0.10 jordanrivera letter-compact_mono 0:8f1010120ed6#1 -0.13 0.10 jordanrivera letter-compact_mono 0:f9e4560bd641 -0.24 0.10 london,uk/+442055551000/jordan.r @@ -3464,18 +3464,18 @@ letter-compact_mono 0:1382a6e37675 -0.35 0.10 ienjoytranslatingfuzzyworkflowre letter-compact_mono 0:d8e633770b49 -0.38 0.10 easierfortherestoftheteam. letter-compact_mono 0:a71e98216baa -0.13 0.10 iwouldwelcometheopportunitytobri letter-compact_mono 0:80a6a628ad52 -0.12 0.10 sincerely, -letter-editorial_blue 0:8f1010120ed6 0.45 0.12 jordanrivera -letter-editorial_blue 0:8f1010120ed6#1 0.16 0.10 jordanrivera -letter-editorial_blue 0:2d58f0cadc2d 0.22 0.13 platformengineer -letter-editorial_blue 0:1b28eb6a9a2e 0.14 0.13 +442055551000-london,uk -letter-editorial_blue 0:8817bf9310b6 0.11 0.21 jordan.rivera@example.com|linked -letter-editorial_blue 0:bef81b541365 0.13 0.10 dearhiringteamatnorthwindsystems +letter-editorial_blue 0:8f1010120ed6 -0.05 0.12 jordanrivera +letter-editorial_blue 0:8f1010120ed6#1 -0.04 0.10 jordanrivera +letter-editorial_blue 0:2d58f0cadc2d 0.02 0.13 platformengineer +letter-editorial_blue 0:1b28eb6a9a2e -0.06 0.13 +442055551000-london,uk +letter-editorial_blue 0:8817bf9310b6 -0.09 0.21 jordan.rivera@example.com|linked +letter-editorial_blue 0:bef81b541365 -0.07 0.10 dearhiringteamatnorthwindsystems letter-editorial_blue 0:ab54410ead82 -0.16 0.10 iamexcitedtosharemyinterestinthe letter-editorial_blue 0:9185168d2cf8 -0.16 0.10 document-generationsystemsthatba letter-editorial_blue 0:0c42fe9f3491 -0.15 0.10 ienjoytranslatingfuzzyworkflowre letter-editorial_blue 0:dda41d31bb3c -0.15 0.10 thatmakeadoptioneasierfortherest -letter-editorial_blue 0:a71e98216baa 0.16 0.10 iwouldwelcometheopportunitytobri -letter-editorial_blue 0:80a6a628ad52 0.16 0.10 sincerely, +letter-editorial_blue 0:a71e98216baa -0.04 0.10 iwouldwelcometheopportunitytobri +letter-editorial_blue 0:80a6a628ad52 -0.04 0.10 sincerely, letter-engineering_resume 0:8f1010120ed6 0.15 0.10 jordanrivera letter-engineering_resume 0:8f1010120ed6#1 -0.16 0.10 jordanrivera letter-engineering_resume 0:2d58f0cadc2d -0.25 0.10 platformengineer @@ -3504,29 +3504,29 @@ letter-executive 0:7c5a9817c868 0.18 0.10 iwouldwelcometheopportunitytobri letter-executive 0:4012eb4b05db 0.18 0.10 group. letter-executive 0:80a6a628ad52 -0.10 0.10 sincerely, letter-mint-editorial-letter 0:8f1010120ed6 -1.30 2.33 jordanrivera -letter-mint-editorial-letter 0:8f1010120ed6#1 -0.16 0.10 jordanrivera -letter-mint-editorial-letter 0:2d58f0cadc2d -0.27 0.12 platformengineer -letter-mint-editorial-letter 0:bef81b541365 -0.16 0.10 dearhiringteamatnorthwindsystems -letter-mint-editorial-letter 0:ab54410ead82 0.29 0.10 iamexcitedtosharemyinterestinthe -letter-mint-editorial-letter 0:9185168d2cf8 0.29 0.10 document-generationsystemsthatba -letter-mint-editorial-letter 0:a463bced3db2 0.29 0.10 ienjoytranslatingfuzzyworkflowre -letter-mint-editorial-letter 0:dd474e249222 0.29 0.10 makeadoptioneasierfortherestofth -letter-mint-editorial-letter 0:a71e98216baa -0.16 0.10 iwouldwelcometheopportunitytobri -letter-mint-editorial-letter 0:80a6a628ad52 -0.16 0.10 sincerely, +letter-mint-editorial-letter 0:8f1010120ed6#1 -0.01 0.10 jordanrivera +letter-mint-editorial-letter 0:2d58f0cadc2d -0.02 0.12 platformengineer +letter-mint-editorial-letter 0:bef81b541365 -0.01 0.10 dearhiringteamatnorthwindsystems +letter-mint-editorial-letter 0:ab54410ead82 -0.01 0.10 iamexcitedtosharemyinterestinthe +letter-mint-editorial-letter 0:9185168d2cf8 -0.01 0.10 document-generationsystemsthatba +letter-mint-editorial-letter 0:a463bced3db2 -0.01 0.10 ienjoytranslatingfuzzyworkflowre +letter-mint-editorial-letter 0:dd474e249222 -0.01 0.10 makeadoptioneasierfortherestofth +letter-mint-editorial-letter 0:a71e98216baa -0.01 0.10 iwouldwelcometheopportunitytobri +letter-mint-editorial-letter 0:80a6a628ad52 -0.01 0.10 sincerely, letter-modern_professional 0:8f1010120ed6 0.00 0.21 jordanrivera -letter-modern_professional 0:8f1010120ed6#1 0.27 0.10 jordanrivera +letter-modern_professional 0:8f1010120ed6#1 0.07 0.10 jordanrivera letter-modern_professional 0:89ff05847e96 0.14 0.26 london,uk|+442055551000 letter-modern_professional 0:8817bf9310b6 0.11 0.30 jordan.rivera@example.com|linked -letter-modern_professional 0:bef81b541365 0.27 0.10 dearhiringteamatnorthwindsystems +letter-modern_professional 0:bef81b541365 0.07 0.10 dearhiringteamatnorthwindsystems letter-modern_professional 0:c65db8c80e17 -0.03 0.10 iamexcitedtosharemyinterestinthe letter-modern_professional 0:c8d01ef84078 -0.03 0.10 reusabledocument-generationsyste letter-modern_professional 0:2e5ddee14dbc -0.03 0.10 ienjoytranslatingfuzzyworkflowre letter-modern_professional 0:906501a5e847 -0.03 0.10 examplesthatmakeadoptioneasierfo letter-modern_professional 0:7c5a9817c868 -0.03 0.10 iwouldwelcometheopportunitytobri letter-modern_professional 0:4012eb4b05db -0.03 0.10 group. -letter-modern_professional 0:80a6a628ad52 0.27 0.10 sincerely, -letter-monogram_sidebar 0:136c67657614 -0.38 2.82 jordan -letter-monogram_sidebar 0:8ba35ebe3d5c -0.37 2.85 rivera +letter-modern_professional 0:80a6a628ad52 0.07 0.10 sincerely, +letter-monogram_sidebar 0:136c67657614 0.02 2.82 jordan +letter-monogram_sidebar 0:8ba35ebe3d5c 0.03 2.85 rivera letter-monogram_sidebar 0:2d58f0cadc2d -0.19 0.13 platformengineer letter-monogram_sidebar 0:8d7a2cca3060 -0.17 0.39 +442055551000|jordan.rivera@exam letter-monogram_sidebar 0:bef81b541365 -0.23 0.10 dearhiringteamatnorthwindsystems @@ -3552,7 +3552,7 @@ letter-nordic_clean 0:26e89af4523d -0.38 0.10 ienjoytranslatingfuzzyworkflowre letter-nordic_clean 0:27c5581ffbbc -0.39 0.10 restoftheteam. letter-nordic_clean 0:a71e98216baa -0.14 0.10 iwouldwelcometheopportunitytobri letter-nordic_clean 0:80a6a628ad52 -0.14 0.10 sincerely, -letter-panel 0:8f1010120ed6 -0.75 0.32 jordanrivera +letter-panel 0:8f1010120ed6 0.00 0.32 jordanrivera letter-panel 0:8f1010120ed6#1 0.06 0.10 jordanrivera letter-panel 0:2d58f0cadc2d -0.23 0.07 platformengineer letter-panel 0:89ff05847e96 -0.16 0.29 london,uk|+442055551000 @@ -3565,7 +3565,7 @@ letter-panel 0:dda41d31bb3c -0.21 0.10 thatmakeadoptioneasierfortherest letter-panel 0:7c5a9817c868 -0.19 0.10 iwouldwelcometheopportunitytobri letter-panel 0:4012eb4b05db -0.17 0.10 group. letter-panel 0:80a6a628ad52 0.05 0.10 sincerely, -letter-sidebar_portrait 0:8f1010120ed6 -0.73 0.14 jordanrivera +letter-sidebar_portrait 0:8f1010120ed6 -0.03 0.14 jordanrivera letter-sidebar_portrait 0:8f1010120ed6#1 -0.13 0.10 jordanrivera letter-sidebar_portrait 0:2d58f0cadc2d -0.23 0.49 platformengineer letter-sidebar_portrait 0:8d7a2cca3060 -0.22 0.58 +442055551000|jordan.rivera@exam @@ -3609,7 +3609,7 @@ proposal-editorial 0:d28f860aec04 0.57 0.10 ourprocessblendsstrategicthinkin proposal-editorial 0:53fcd88ebb00 0.57 0.10 cohesivebrandsystemandamodern,co proposal-editorial 0:95bad9757a67 0.57 0.10 outcomewillbeaclear,confidentpre proposal-editorial 0:8863e2b998da 0.57 0.10 improvesengagement,andsupportsyo -proposal-editorial 0:f16c2c2f1999 -0.92 0.10 projectgoals +proposal-editorial 0:f16c2c2f1999 0.23 0.10 projectgoals proposal-editorial 0:c008ab0ba85f 0.16 0.10 projectduration proposal-editorial 0:5a6b4bf425f2 -0.05 0.10 6weeks proposal-editorial 0:7aa73e5c14d3 0.23 0.10 startwindow @@ -3631,7 +3631,7 @@ proposal-editorial 0:04b5995c746f -0.25 0.06 touchpoints. proposal-editorial 0:b45d848fe1b6 1.75 0.07 buildascalabledigital proposal-editorial 0:e8228bfeba0e 0.75 0.07 foundationforfuture proposal-editorial 0:1fa35c7a1402 -0.25 0.07 growth. -proposal-editorial 0:bc981abcdf59 -0.73 0.10 scopeofwork +proposal-editorial 0:bc981abcdf59 0.42 0.10 scopeofwork proposal-editorial 0:28450edd9a4f 0.35 0.05 discovery&research proposal-editorial 0:ce9012b74aa2 0.60 0.08 stakeholderinterviews,brandaudit proposal-editorial 0:730c3e278933 0.32 0.08 audienceinsightstoinformstrategy @@ -3648,7 +3648,7 @@ proposal-editorial 0:8c7703bb6fb7 0.71 0.05 launchsupport proposal-editorial 0:34f9fe468474 0.96 0.08 developerhandoff,qasupport,train proposal-editorial 0:2b4cf15f6f16 0.68 0.08 toensureasmoothlaunch. proposal-editorial 0:026890c58de9 0.01 0.10 northlinestudio|northlinestudio. -proposal-editorial 1:e35c32bb5ed8 -46.41 0.10 deliverables +proposal-editorial 1:e35c32bb5ed8 -45.26 0.10 deliverables proposal-editorial 1:23eb79a19b39 -45.38 0.57 brandstrategysummary proposal-editorial 1:aaa2a6073d69 -45.38 0.57 refinedlogosuite&brandguidelines proposal-editorial 1:d626f7532564 -45.38 0.57 color,typography&designsystem @@ -3659,7 +3659,7 @@ proposal-editorial 1:d524c1a0811d -45.28 0.10 mobile proposal-editorial 1:8b712e7e93bf -45.40 0.55 contentstrategy&pagetemplates proposal-editorial 1:e9bf06d9b130 -45.40 0.55 developer-readyassets&specificat proposal-editorial 1:e93e7ba95ceb -45.40 0.55 launchchecklist&trainingsession -proposal-editorial 1:94d192b3a326 -46.32 0.10 timeline +proposal-editorial 1:94d192b3a326 -45.17 0.10 timeline proposal-editorial 1:02195b8e9896 -45.21 -0.25 phase proposal-editorial 1:c51faa148557 -45.21 -0.28 focus proposal-editorial 1:caa79af4db67 -45.21 -0.26 duration @@ -3712,9 +3712,9 @@ proposal-editorial 1:832db31f5c9a -44.97 0.59 includestworoundsofrevisionsper proposal-editorial 1:5130aeada3db -44.97 0.14 majordeliverable. proposal-editorial 1:ffce6ed7e6e5 -44.99 0.59 finalfilesandhandoffdeliveredupo proposal-editorial 1:566f68df6dd8 -44.99 0.14 finalpayment. -proposal-editorial 1:06ebb5670fa8 -45.31 0.59 ownershipofallfinaldeliverables -proposal-editorial 1:deda6d86d965 -44.96 0.14 transferstoasterahealthco.after -proposal-editorial 1:aaa7d3e9affb -45.38 0.14 fullpaymentisreceived. +proposal-editorial 1:06ebb5670fa8 -45.26 0.59 ownershipofallfinaldeliverables +proposal-editorial 1:deda6d86d965 -44.91 0.14 transferstoasterahealthco.after +proposal-editorial 1:aaa7d3e9affb -45.33 0.14 fullpaymentisreceived. proposal-editorial 1:c1514c6cdad1 -45.29 0.10 acceptance proposal-editorial 1:893663b06769 -44.26 0.10 bysigningbelow,youagreetothescop proposal-editorial 1:df16232de5b9 -44.27 0.10 acceptedby: @@ -3792,26 +3792,26 @@ proposal-indigo 0:732bcbb66cec 0.68 0.05 kestrelpaymentsltd proposal-indigo 0:3898e7b5f79b 0.71 0.05 7harbourcircus,canarywharf,londo proposal-indigo 0:29208032c874 0.72 0.05 kestrel.example/business|busines proposal-modern 0:ecd1378bc9dc 0.00 0.10 proposal -proposal-modern 0:f592a683c61d 0.27 0.10 documentplatformconsolidation -proposal-modern 0:bbe07492ee1f 0.32 0.10 proposalgc-p-2026-014prepared02a +proposal-modern 0:f592a683c61d -0.03 0.10 documentplatformconsolidation +proposal-modern 0:bbe07492ee1f 0.02 0.10 proposalgc-p-2026-014prepared02a proposal-modern 0:566835ed7fba 0.23 0.10 executivesummary -proposal-modern 0:7ccf0e6c59fa 0.20 0.10 aphasedengagementtoretireper-tea +proposal-modern 0:7ccf0e6c59fa 0.00 0.10 aphasedengagementtoretireper-tea proposal-modern 0:75857a458999 0.23 0.10 from -proposal-modern 0:c26c22b94338 0.20 0.10 graphcomposestudio +proposal-modern 0:c26c22b94338 0.00 0.10 graphcomposestudio proposal-modern 0:2a08ce5567fb -0.07 0.10 18layoutstreet proposal-modern 0:fbeea547d99e -0.10 0.10 london,uk proposal-modern 0:3c8401edb4cc -0.12 0.10 hello@graphcompose.dev proposal-modern 0:89674e6f130e -0.15 0.10 +442055551000 proposal-modern 0:213a61c7aeb6 -0.17 0.10 graphcompose.dev -proposal-modern 0:f890faef907f 0.20 0.11 northwindsystems +proposal-modern 0:f890faef907f 0.00 0.11 northwindsystems proposal-modern 0:577a7fcdaa02 -0.07 0.11 attn:procurement proposal-modern 0:91eefd794f79 -0.10 0.11 410marketavenue proposal-modern 0:3daace874084 -0.12 0.11 procurement@northwind.example -proposal-modern 0:5f161c914988 0.24 0.10 scope -proposal-modern 0:9e580657f485 0.08 0.10 discovery,architecture,andarefer -proposal-modern 0:cec9111de36d 0.24 0.10 approach -proposal-modern 0:3215ea3be6d9 0.08 0.10 iterativedeliverywithweeklycheck -proposal-modern 0:94d192b3a326 0.24 0.10 timeline +proposal-modern 0:5f161c914988 -0.16 0.10 scope +proposal-modern 0:9e580657f485 -0.12 0.10 discovery,architecture,andarefer +proposal-modern 0:cec9111de36d -0.16 0.10 approach +proposal-modern 0:3215ea3be6d9 -0.12 0.10 iterativedeliverywithweeklycheck +proposal-modern 0:94d192b3a326 -0.16 0.10 timeline proposal-modern 0:02195b8e9896 0.08 -0.20 phase proposal-modern 0:caa79af4db67 0.08 -0.25 duration proposal-modern 0:41ffd8b76afc 0.08 -0.25 details @@ -3823,7 +3823,7 @@ proposal-modern 0:44575cf5b285 0.15 -0.20 build proposal-modern 0:44575cf5b285#1 0.15 -0.20 build proposal-modern 0:5a6b4bf425f2 0.15 -0.25 6weeks proposal-modern 0:7a802048127d 0.15 -0.25 engine+templatemigration -proposal-modern 0:f9b21c4bda58 0.24 0.10 investment +proposal-modern 0:f9b21c4bda58 -0.16 0.10 investment proposal-modern 0:4a33eacd5fa6 0.08 -0.20 item proposal-modern 0:c9046f7a37ad 0.08 -0.25 description proposal-modern 0:cf38d95c9c6b 0.08 0.82 amount @@ -3831,10 +3831,10 @@ proposal-modern 0:fe9b6b4f133b 0.15 -0.25 workshops+auditgbp6,000 proposal-modern 0:62e788ae3916 0.15 -0.25 engine+templatesgbp24,000 proposal-modern 0:11239872d178 0.05 -0.20 total proposal-modern 0:1c3065490625 0.05 0.82 gbp30,000 -proposal-modern 0:63feb7230a5d 0.22 0.10 acceptanceterms +proposal-modern 0:63feb7230a5d -0.18 0.10 acceptanceterms proposal-modern 0:35046a9f5675 0.15 0.10 •50%onsignature,50%ondelivery. proposal-modern 0:f03c1877ea2b 0.15 0.10 •validfor30daysfromthepreparedda -proposal-modern 0:90572e911376 0.07 0.10 thankyouforconsideringgraphcompo +proposal-modern 0:90572e911376 -0.13 0.10 thankyouforconsideringgraphcompo proposal-northline 0:5205c2a261bc -0.44 0.05 northline proposal-northline 0:da0daaba4b15 -0.44 0.05 studio proposal-northline 0:ecd1378bc9dc -0.38 1.98 proposal @@ -3958,9 +3958,9 @@ proposal-northline 1:832db31f5c9a 0.03 0.54 includestworoundsofrevisionsper proposal-northline 1:5130aeada3db 0.05 0.09 majordeliverable. proposal-northline 1:ffce6ed7e6e5 0.03 0.54 finalfilesandhandoffdeliveredupo proposal-northline 1:566f68df6dd8 0.05 0.09 finalpayment. -proposal-northline 1:06ebb5670fa8 0.33 0.54 ownershipofallfinaldeliverables -proposal-northline 1:5312201597c1 0.70 0.09 transferstoasterahealthco.afterf -proposal-northline 1:d31e8d77a816 0.30 0.09 paymentisreceived. +proposal-northline 1:06ebb5670fa8 -0.12 0.54 ownershipofallfinaldeliverables +proposal-northline 1:5312201597c1 0.25 0.09 transferstoasterahealthco.afterf +proposal-northline 1:d31e8d77a816 -0.15 0.09 paymentisreceived. proposal-northline 1:c1514c6cdad1 0.41 0.11 acceptance proposal-northline 1:893663b06769 0.73 0.10 bysigningbelow,youagreetothescop proposal-northline 1:df16232de5b9 0.72 0.10 acceptedby: @@ -3969,31 +3969,31 @@ proposal-northline 1:c74c9cd82f13 0.72 0.07 date: proposal-northline 1:026890c58de9 0.01 0.10 northlinestudio|northlinestudio. receipt-modern 0:2b019b5b46da 0.31 0.10 northwindpay receipt-modern 0:a3c304a23bb1 0.30 0.21 transferconfirmation -receipt-modern 0:e885a92f5bb7 0.18 0.03 generatedon09august2026 -receipt-modern 0:c288dd6df716 0.19 -0.20 referencenwp-4821-0067 +receipt-modern 0:e885a92f5bb7 -0.02 0.03 generatedon09august2026 +receipt-modern 0:c288dd6df716 -0.01 -0.20 referencenwp-4821-0067 receipt-modern 0:9de2a2d7cd7a 0.18 0.10 amountcollected receipt-modern 0:465691680b99 0.03 0.10 £66.62 receipt-modern 0:465691680b99#1 0.29 -0.90 £66.62 receipt-modern 0:465691680b99#2 0.29 -0.90 £66.62 -receipt-modern 0:4260e5ae365d 0.20 0.10 directdebitcollectedbyharbourfin +receipt-modern 0:4260e5ae365d 0.00 0.10 directdebitcollectedbyharbourfin receipt-modern 0:4ddb3e96801a 0.18 9.26 completed -receipt-modern 0:a22e6dacae05 0.24 0.19 valuedate07jul2026 -receipt-modern 0:53becbb168d1 0.24 0.18 operationdate07jul2026 -receipt-modern 0:b311cb4017a4 0.24 0.25 schemebacsdirectdebit +receipt-modern 0:a22e6dacae05 0.04 0.19 valuedate07jul2026 +receipt-modern 0:53becbb168d1 0.04 0.18 operationdate07jul2026 +receipt-modern 0:b311cb4017a4 0.04 0.25 schemebacsdirectdebit receipt-modern 0:1bd90283f7fe 0.18 0.10 paidfrom -receipt-modern 0:0293c2cdfa58 0.23 0.10 alexsample +receipt-modern 0:0293c2cdfa58 -0.02 0.10 alexsample receipt-modern 0:85d2c9e53e92 -0.03 0.10 12exampleway receipt-modern 0:db3b3fcfe2d1 -0.02 0.10 brentfordtw00aa receipt-modern 0:2474519f77a9 -0.01 0.10 unitedkingdom -receipt-modern 0:a3570420c75d 0.29 0.10 account••••4396 -receipt-modern 0:d2f5582b8015 0.29 0.10 sortcode00-00-00 +receipt-modern 0:a3570420c75d 0.09 0.10 account••••4396 +receipt-modern 0:d2f5582b8015 0.09 0.10 sortcode00-00-00 receipt-modern 0:c4ab31d8c668 0.18 0.06 paidto -receipt-modern 0:c032ca75a3a7 0.23 0.06 harbourfinanceltd +receipt-modern 0:c032ca75a3a7 -0.02 0.06 harbourfinanceltd receipt-modern 0:995c51cebabe -0.02 0.06 1samplequay receipt-modern 0:f05e0b2f4fe3 -0.01 0.06 manchesterm00aa -receipt-modern 0:597533badf94 0.29 0.06 account••••5604 -receipt-modern 0:a5938b687682 0.29 0.06 sortcode00-00-11 -receipt-modern 0:5434155c0fda 0.23 0.10 transferdetails +receipt-modern 0:597533badf94 0.09 0.06 account••••5604 +receipt-modern 0:a5938b687682 0.09 0.06 sortcode00-00-11 +receipt-modern 0:5434155c0fda 0.03 0.10 transferdetails receipt-modern 0:a4d7978db2aa 0.29 0.10 mandatereference receipt-modern 0:0123b9cf310f 0.29 -0.95 mnd-0110-8054-5652 receipt-modern 0:3840804e6235 0.29 0.10 transactionid @@ -4002,22 +4002,22 @@ receipt-modern 0:2cbaa23e0a56 0.29 0.10 paymentscheme receipt-modern 0:1477cb720a28 0.29 -0.94 bacsdirectdebit receipt-modern 0:1fa78044a7da 0.29 0.10 statementdescription receipt-modern 0:b77918146dd3 0.29 -0.92 harbourfin4821 -receipt-modern 0:c72294b34f1a 0.23 0.10 amountbreakdown +receipt-modern 0:c72294b34f1a 0.03 0.10 amountbreakdown receipt-modern 0:cf38d95c9c6b 0.29 0.10 amount receipt-modern 0:dc40efafaeb3 0.29 0.10 transferfee receipt-modern 0:3a82ba6903c6 0.29 -0.86 £0.00 receipt-modern 0:1cdd81427c35 0.29 0.10 exchangerate receipt-modern 0:0311534a9954 0.29 -0.91 1.00gbp/gbp receipt-modern 0:c1dc9f641ca3 0.29 0.10 totaldebited -receipt-modern 0:de149c2431a2 0.23 0.10 paymentprogress +receipt-modern 0:de149c2431a2 0.03 0.10 paymentprogress receipt-modern 0:4568e72e6bfd 0.29 0.06 instructed -receipt-modern 0:c5f62da028cc 0.25 0.06 07jul2026,08:12bst·collectionreq +receipt-modern 0:c5f62da028cc 0.05 0.06 07jul2026,08:12bst·collectionreq receipt-modern 0:788d0109e065 0.30 0.06 inclearing -receipt-modern 0:7cb44e46733a 0.26 0.06 08jul2026,09:00bst·three-working +receipt-modern 0:7cb44e46733a 0.06 0.06 08jul2026,09:00bst·three-working receipt-modern 0:d31e014808ec 0.31 0.06 settled -receipt-modern 0:06cb75439693 0.27 0.06 09jul2026,06:30bst·fundsdebiteda -receipt-modern 0:ab5aa97074c4 0.26 0.10 notes -receipt-modern 0:a8da22f90eac 0.31 0.10 keepthisconfirmationforyourrecor +receipt-modern 0:06cb75439693 0.07 0.06 09jul2026,06:30bst·fundsdebiteda +receipt-modern 0:ab5aa97074c4 0.06 0.10 notes +receipt-modern 0:a8da22f90eac 0.06 0.10 keepthisconfirmationforyourrecor receipt-modern 0:59941ac03c12 0.29 0.05 scantocheckthisconfirmationagain receipt-modern 0:868e2517782a 0.03 0.05 support+442000000000 receipt-modern 0:94d25770d489 0.03 0.05 help@northwind-pay.example diff --git a/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv b/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv index b4a81c146..deabfd67a 100644 --- a/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv +++ b/qa/src/test/resources/docx-fidelity/libreoffice-windows.tsv @@ -1,19 +1,19 @@ # libreoffice build bce0998afefd on windows document engine_pages editor_pages lines matched median p90 over2 cv-blue_banner 2 2 54 52 0.13 0.45 0 -cv-boxed_sections 2 2 58 58 0.26 0.37 0 -cv-centered_headline 2 2 58 56 0.14 0.32 0 +cv-boxed_sections 2 2 58 58 0.23 0.36 0 +cv-centered_headline 2 2 58 56 0.13 0.31 0 cv-charcoal_gold 1 1 85 83 0.17 0.24 0 -cv-classic_serif 2 2 57 54 0.26 0.31 0 -cv-compact_mono 1 1 58 58 0.17 0.32 0 -cv-editorial_blue 2 2 82 82 0.08 0.30 0 +cv-classic_serif 2 2 57 54 0.10 0.28 0 +cv-compact_mono 1 1 58 58 0.17 0.31 0 +cv-editorial_blue 2 2 82 82 0.09 0.30 0 cv-engineering_resume 1 1 57 57 0.26 0.38 0 cv-executive 2 2 60 60 0.26 0.50 0 cv-midnight_navy 1 1 86 84 0.28 0.87 0 -cv-minimal_underlined 2 2 59 59 0.35 0.64 0 -cv-mint_editorial 2 2 59 59 0.27 0.60 0 -cv-modern_professional 2 2 61 59 0.28 0.30 0 -cv-monogram_sidebar 1 1 53 50 0.22 0.44 0 +cv-minimal_underlined 2 2 59 59 0.33 0.62 0 +cv-mint_editorial 2 2 59 59 0.07 0.30 0 +cv-modern_professional 2 2 61 59 0.04 0.29 0 +cv-monogram_sidebar 1 1 53 50 0.20 0.44 0 cv-navy_sidebar 1 1 71 71 0.20 0.45 0 cv-nordic_clean 1 1 63 58 0.21 0.38 0 cv-orange_ops 1 2 108 5 77.92 77.92 5 @@ -26,39 +26,39 @@ cv-teal_pulse 1 1 57 57 0.22 0.64 0 cv-terracotta_rail 1 1 102 102 0.44 0.94 0 cv-timeline_minimal 2 2 89 87 0.45 0.49 0 cv-violet_grid 1 1 80 78 0.26 0.54 0 -invoice-classic 1 1 56 56 0.17 0.32 0 +invoice-classic 1 1 56 56 0.17 0.22 0 invoice-classic_long 2 2 166 166 0.22 0.27 0 -invoice-consulting 1 1 92 92 0.67 1.01 0 +invoice-consulting 1 1 92 92 0.65 1.01 0 invoice-consulting_long 2 2 236 236 0.69 1.04 0 invoice-luma_studio 1 1 97 97 0.12 0.52 2 -invoice-luma_studio_long 3 3 192 192 0.20 0.41 2 +invoice-luma_studio_long 3 3 192 192 0.21 0.41 2 invoice-merchant 1 2 94 90 0.10 0.18 0 invoice-metered 1 1 99 99 0.05 0.68 0 invoice-modern 1 1 54 54 0.07 0.20 0 -invoice-modern_long 2 2 162 162 0.20 0.27 0 +invoice-modern_long 2 2 162 162 0.18 0.27 0 invoice-obsidian 1 1 81 81 0.34 1.19 0 invoice-payments 1 1 104 104 0.09 0.23 0 invoice-platform 1 1 111 111 0.27 0.43 0 -invoice-subscription 1 1 81 81 0.54 0.67 0 +invoice-subscription 1 1 81 81 0.42 0.62 0 invoice-workspace 1 1 90 90 0.21 0.43 0 -letter-blue_banner 1 1 10 10 0.42 0.46 0 -letter-boxed_sections 1 1 10 10 0.29 0.33 0 -letter-centered_headline 1 1 11 11 0.13 0.25 0 -letter-classic_serif 1 1 10 10 0.13 0.19 0 +letter-blue_banner 1 1 10 10 0.21 0.46 0 +letter-boxed_sections 1 1 10 10 0.11 0.23 0 +letter-centered_headline 1 1 11 11 0.10 0.23 0 +letter-classic_serif 1 1 10 10 0.10 0.15 0 letter-compact_mono 1 1 10 8 0.24 0.35 0 -letter-editorial_blue 1 1 12 12 0.16 0.22 0 +letter-editorial_blue 1 1 12 12 0.07 0.16 0 letter-engineering_resume 1 1 15 15 0.19 0.41 0 letter-executive 1 1 12 12 0.18 0.30 0 -letter-mint-editorial-letter 1 1 10 10 0.29 0.29 0 -letter-modern_professional 1 1 12 12 0.03 0.27 0 -letter-monogram_sidebar 1 1 12 12 0.23 0.37 0 +letter-mint-editorial-letter 1 1 10 10 0.01 0.02 0 +letter-modern_professional 1 1 12 12 0.03 0.11 0 +letter-monogram_sidebar 1 1 12 12 0.17 0.23 0 letter-nordic_clean 1 1 15 15 0.16 0.38 0 -letter-panel 1 1 13 13 0.19 0.27 0 -letter-sidebar_portrait 1 1 12 12 0.43 0.51 0 +letter-panel 1 1 13 13 0.17 0.25 0 +letter-sidebar_portrait 1 1 12 12 0.41 0.49 0 letter-timeline_minimal 1 1 15 15 0.33 0.53 0 -proposal-editorial 2 2 132 129 44.49 45.38 72 +proposal-editorial 2 2 132 129 44.49 45.29 72 proposal-indigo 1 1 72 70 0.27 0.65 0 -proposal-modern 1 1 44 44 0.15 0.24 0 -proposal-northline 2 2 132 132 0.27 0.67 0 -receipt-modern 1 1 57 57 0.26 0.29 0 +proposal-modern 1 1 44 44 0.13 0.16 0 +proposal-northline 2 2 132 132 0.27 0.59 0 +receipt-modern 1 1 57 57 0.09 0.29 0 rota-cobalt 1 1 154 151 0.23 0.84 0 diff --git a/qa/src/test/resources/docx-fidelity/word-windows-lines.tsv b/qa/src/test/resources/docx-fidelity/word-windows-lines.tsv index 2a7b8e859..ca276c7a2 100644 --- a/qa/src/test/resources/docx-fidelity/word-windows-lines.tsv +++ b/qa/src/test/resources/docx-fidelity/word-windows-lines.tsv @@ -1,5 +1,5 @@ # word 16.0 (16.0.20430) on windows — document, line, drift below the page (pt), drift right of the page (pt), letters -cv-blue_banner 0:8f1010120ed6 0.46 -0.08 jordanrivera +cv-blue_banner 0:8f1010120ed6 -0.02 -0.08 jordanrivera cv-blue_banner 0:8d7a2cca3060 -0.24 -0.07 +442055551000|jordan.rivera@exam cv-blue_banner 0:b944906ed84c -0.21 -1.21 professionalsummary cv-blue_banner 0:8d6758a29c08 -0.52 -0.08 platformengineerwith10+yearsbuil @@ -67,16 +67,16 @@ cv-boxed_sections 0:26671c309eb9 0.28 -0.08 •distribution:mavencentral,sonat cv-boxed_sections 0:68bf0109c6f8 0.41 0.29 education cv-boxed_sections 0:0ad1957d6bab 0.43 0.04 msccomputerscience cv-boxed_sections 0:3fa772117260 0.36 -0.87 2019-2021 -cv-boxed_sections 0:47ce0218bbea 0.31 -0.08 universityofmanchester -cv-boxed_sections 0:2ffe115b06e5 0.37 -0.08 distinction.thesis:composablelay +cv-boxed_sections 0:47ce0218bbea 0.07 -0.08 universityofmanchester +cv-boxed_sections 0:2ffe115b06e5 0.13 -0.08 distinction.thesis:composablelay cv-boxed_sections 0:b6749d0b616b 0.39 0.04 bscsoftwareengineering cv-boxed_sections 0:30f9262640a0 0.33 -0.87 2015-2019 -cv-boxed_sections 0:89ad9656f393 0.29 -0.08 imperialcollegelondon -cv-boxed_sections 0:baa173b4a82e 0.35 -0.08 first-classhonours.specialisatio +cv-boxed_sections 0:89ad9656f393 0.17 -0.08 imperialcollegelondon +cv-boxed_sections 0:baa173b4a82e 0.23 -0.08 first-classhonours.specialisatio cv-boxed_sections 0:6d3d5673c39f 0.50 0.04 oraclejavacertification cv-boxed_sections 0:d40b22f00acb 0.43 -0.87 2023-2024 -cv-boxed_sections 0:2669e1f6d55c 0.38 -0.08 professionaltrack -cv-boxed_sections 0:3857373829c1 0.44 -0.08 java17platformdeep-dive:records, +cv-boxed_sections 0:2669e1f6d55c 0.14 -0.08 professionaltrack +cv-boxed_sections 0:3857373829c1 0.20 -0.08 java17platformdeep-dive:records, cv-boxed_sections 0:2577c0f557b2 0.45 0.15 projects cv-boxed_sections 0:b2b029995203 0.40 -0.08 •graphcompose(java21,pdfbox,mave cv-boxed_sections 0:67593a76ef70 0.13 -0.06 declarativejavapdflayoutengine.s @@ -91,26 +91,26 @@ cv-boxed_sections 0:e7e62230eb1f 0.40 -0.06 editorial-magazinedocumenttoolki cv-boxed_sections 0:c2f296ef30a3 0.52 0.54 professionalexperience cv-boxed_sections 0:a76f47480818 0.54 0.04 seniorplatformengineer cv-boxed_sections 0:060300b18051 0.47 0.07 2024-present -cv-boxed_sections 0:f890faef907f 0.44 -0.08 northwindsystems +cv-boxed_sections 0:f890faef907f 0.32 -0.08 northwindsystems cv-boxed_sections 1:49faf14f1f56 -0.06 -0.08 ledthereusabledocument-generatio cv-boxed_sections 1:6bd3f168e89e -0.01 -0.08 maintenancetimeby70%byretiringpe cv-boxed_sections 1:daf65306b3b6 0.25 0.04 softwareengineer cv-boxed_sections 1:e7cc1822c6dc 0.19 -0.87 2021-2024 -cv-boxed_sections 1:998c1a985022 0.15 -0.08 brightleaflabs +cv-boxed_sections 1:998c1a985022 0.03 -0.08 brightleaflabs cv-boxed_sections 1:e55664011cda -0.03 -0.08 builtbackendservicesandproductio cv-boxed_sections 1:e80236b6d2b1 0.02 -0.08 itexttoacustomlayoutengine,elimi cv-boxed_sections 1:41bb54fbae8d 0.28 0.04 backendengineer cv-boxed_sections 1:3fa772117260 0.34 -0.87 2019-2021 -cv-boxed_sections 1:ef148f221e31 0.16 -0.08 helixprintco +cv-boxed_sections 1:ef148f221e31 0.04 -0.08 helixprintco cv-boxed_sections 1:9d31a6bfbc69 0.10 -0.08 maintainedahigh-volumeinvoice-pr cv-boxed_sections 1:03af8a628309 0.03 -0.08 change. cv-boxed_sections 1:676dfdd56ad2 0.28 0.55 additionalinformation -cv-boxed_sections 1:f20997652453 0.23 -0.08 languages:english(fluent),german -cv-boxed_sections 1:ec9d3622395e 0.27 -0.08 workeligibility:eligibletoworkin -cv-boxed_sections 1:dd20ae01c3cf 0.27 -0.08 opensource:maintainerofgraphcomp -cv-boxed_sections 1:33c35e9d236d 0.28 -0.08 speaking:jvmsummit2024,devoxxuk2 -cv-centered_headline 0:8f1010120ed6 0.12 0.10 jordanrivera -cv-centered_headline 0:87ca614d0eab 0.09 0.41 professionaltitle +cv-boxed_sections 1:f20997652453 0.11 -0.08 languages:english(fluent),german +cv-boxed_sections 1:ec9d3622395e 0.15 -0.08 workeligibility:eligibletoworkin +cv-boxed_sections 1:dd20ae01c3cf 0.15 -0.08 opensource:maintainerofgraphcomp +cv-boxed_sections 1:33c35e9d236d 0.16 -0.08 speaking:jvmsummit2024,devoxxuk2 +cv-centered_headline 0:8f1010120ed6 0.00 0.10 jordanrivera +cv-centered_headline 0:87ca614d0eab -0.03 0.41 professionaltitle cv-centered_headline 0:8d7a2cca3060 -0.29 0.60 +442055551000|jordan.rivera@exam cv-centered_headline 0:b944906ed84c -0.20 -0.04 professionalsummary cv-centered_headline 0:f43d42692f27 -0.09 -0.04 platformengineerwith10+yearsbuil @@ -249,64 +249,64 @@ cv-charcoal_gold 0:058521fbf0d1 0.20 0.03 innovatechsystems cv-charcoal_gold 0:3def82282260 0.16 -0.72 technicaltools cv-charcoal_gold 0:eb04bd42c7fb 0.22 -1.03 microsoft365|jira|confluence|asa cv-classic_serif 0:8f1010120ed6 0.19 0.09 jordanrivera -cv-classic_serif 0:8d7a2cca3060 0.27 -0.53 +442055551000|jordan.rivera@exam +cv-classic_serif 0:8d7a2cca3060 0.15 -0.53 +442055551000|jordan.rivera@exam cv-classic_serif 0:3c69d6bb4892 0.28 1.37 professionalprofile -cv-classic_serif 0:32c1cf49a2fe 0.43 0.04 skills -cv-classic_serif 0:873a24d153c8 0.37 0.04 languages:java21,kotlin,groovy,p -cv-classic_serif 0:05e907ef2b18 0.29 0.04 document&print:pdfbox,apachepoi( -cv-classic_serif 0:76656a8a6621 0.32 0.04 layoutengines:customdsldesign,se -cv-classic_serif 0:1cd141fef347 0.24 0.04 build&infrastructure:maven,gradl -cv-classic_serif 0:181ddda7f959 0.30 0.04 testing:junit5,assertj,pdfbox-ba -cv-classic_serif 0:c40c656d9558 0.22 0.04 distribution:mavencentral,sonaty -cv-classic_serif 0:53e5e7c5a884 0.40 0.04 experience +cv-classic_serif 0:32c1cf49a2fe 0.31 0.04 skills +cv-classic_serif 0:873a24d153c8 0.25 0.04 languages:java21,kotlin,groovy,p +cv-classic_serif 0:05e907ef2b18 0.17 0.04 document&print:pdfbox,apachepoi( +cv-classic_serif 0:76656a8a6621 0.08 0.04 layoutengines:customdsldesign,se +cv-classic_serif 0:1cd141fef347 0.12 0.04 build&infrastructure:maven,gradl +cv-classic_serif 0:181ddda7f959 0.06 0.04 testing:junit5,assertj,pdfbox-ba +cv-classic_serif 0:c40c656d9558 0.10 0.04 distribution:mavencentral,sonaty +cv-classic_serif 0:53e5e7c5a884 0.16 0.04 experience cv-classic_serif 0:a76f47480818 0.37 0.04 seniorplatformengineer cv-classic_serif 0:060300b18051 0.29 0.07 2024-present -cv-classic_serif 0:f890faef907f 0.30 0.04 northwindsystems +cv-classic_serif 0:f890faef907f 0.18 0.04 northwindsystems cv-classic_serif 0:49faf14f1f56 -0.01 0.04 ledthereusabledocument-generatio cv-classic_serif 0:6bd3f168e89e 0.06 0.04 maintenancetimeby70%byretiringpe cv-classic_serif 0:daf65306b3b6 0.39 0.04 softwareengineer cv-classic_serif 0:e7cc1822c6dc 0.31 1.06 2021-2024 -cv-classic_serif 0:998c1a985022 0.32 0.04 brightleaflabs +cv-classic_serif 0:998c1a985022 0.20 0.04 brightleaflabs cv-classic_serif 0:e55664011cda 0.00 0.04 builtbackendservicesandproductio cv-classic_serif 0:e80236b6d2b1 0.09 0.04 itexttoacustomlayoutengine,elimi cv-classic_serif 0:41bb54fbae8d 0.42 0.04 backendengineer cv-classic_serif 0:3fa772117260 0.34 1.06 2019-2021 cv-classic_serif 0:3fa772117260#1 0.43 1.06 2019-2021 -cv-classic_serif 0:ef148f221e31 0.35 0.04 helixprintco +cv-classic_serif 0:ef148f221e31 0.23 0.04 helixprintco cv-classic_serif 0:9d31a6bfbc69 0.04 0.04 maintainedahigh-volumeinvoice-pr cv-classic_serif 0:03af8a628309 0.11 0.04 change. -cv-classic_serif 0:2577c0f557b2 0.47 0.04 projects -cv-classic_serif 0:0f2c67872251 0.40 0.04 graphcompose(java21,pdfbox,maven -cv-classic_serif 0:67593a76ef70 -0.01 0.04 declarativejavapdflayoutengine.s +cv-classic_serif 0:2577c0f557b2 0.23 0.04 projects +cv-classic_serif 0:0f2c67872251 0.16 0.04 graphcompose(java21,pdfbox,maven +cv-classic_serif 0:67593a76ef70 0.11 0.04 declarativejavapdflayoutengine.s cv-classic_serif 0:b9292cbd1454 0.18 0.04 pipelinesforhiringtoolsandbillin -cv-classic_serif 0:d73d02174dc9 0.34 0.04 templatestudio(kotlin,composedes -cv-classic_serif 0:836e76daecbf 0.44 0.04 internaltoolforevaluatingcv,prop -cv-classic_serif 0:542ec793b5b1 0.36 0.04 layoutlint(java21,javaparser,spo -cv-classic_serif 0:dc31b6a18325 0.43 0.04 staticanalyserthatflagsfragileau -cv-classic_serif 0:ee180ea1e0a5 0.35 0.04 chromeforge(java,graphcompose,pa -cv-classic_serif 0:e7e62230eb1f 0.42 0.04 editorial-magazinedocumenttoolki -cv-classic_serif 0:68bf0109c6f8 0.42 0.04 education +cv-classic_serif 0:d73d02174dc9 0.22 0.04 templatestudio(kotlin,composedes +cv-classic_serif 0:836e76daecbf 0.20 0.04 internaltoolforevaluatingcv,prop +cv-classic_serif 0:542ec793b5b1 0.24 0.04 layoutlint(java21,javaparser,spo +cv-classic_serif 0:dc31b6a18325 0.19 0.04 staticanalyserthatflagsfragileau +cv-classic_serif 0:ee180ea1e0a5 0.23 0.04 chromeforge(java,graphcompose,pa +cv-classic_serif 0:e7e62230eb1f 0.18 0.04 editorial-magazinedocumenttoolki +cv-classic_serif 0:68bf0109c6f8 0.30 0.04 education cv-classic_serif 0:0ad1957d6bab 0.51 0.04 msccomputerscience -cv-classic_serif 0:47ce0218bbea 0.44 0.04 universityofmanchester -cv-classic_serif 0:2ffe115b06e5 0.49 0.04 distinction.thesis:composablelay +cv-classic_serif 0:47ce0218bbea 0.20 0.04 universityofmanchester +cv-classic_serif 0:2ffe115b06e5 0.25 0.04 distinction.thesis:composablelay cv-classic_serif 0:b6749d0b616b 0.47 0.04 bscsoftwareengineering cv-classic_serif 0:30f9262640a0 0.51 1.06 2015-2019 cv-classic_serif 1:89ad9656f393 0.24 0.04 imperialcollegelondon -cv-classic_serif 1:baa173b4a82e 0.29 0.04 first-classhonours.specialisatio +cv-classic_serif 1:baa173b4a82e 0.05 0.04 first-classhonours.specialisatio cv-classic_serif 1:6d3d5673c39f 0.25 0.04 oraclejavacertification cv-classic_serif 1:d40b22f00acb 0.17 1.06 2023-2024 -cv-classic_serif 1:2669e1f6d55c 0.32 0.04 professionaltrack -cv-classic_serif 1:3857373829c1 0.25 0.04 java17platformdeep-dive:records, -cv-classic_serif 1:7b476727faf3 0.26 0.04 additional -cv-classic_serif 1:f20997652453 0.15 0.04 languages:english(fluent),german -cv-classic_serif 1:ec9d3622395e 0.23 0.04 workeligibility:eligibletoworkin -cv-classic_serif 1:dd20ae01c3cf 0.18 0.04 opensource:maintainerofgraphcomp -cv-classic_serif 1:33c35e9d236d 0.14 0.04 speaking:jvmsummit2024,devoxxuk2 +cv-classic_serif 1:2669e1f6d55c 0.08 0.04 professionaltrack +cv-classic_serif 1:3857373829c1 0.13 0.04 java17platformdeep-dive:records, +cv-classic_serif 1:7b476727faf3 0.14 0.04 additional +cv-classic_serif 1:f20997652453 0.03 0.04 languages:english(fluent),german +cv-classic_serif 1:ec9d3622395e -0.01 0.04 workeligibility:eligibletoworkin +cv-classic_serif 1:dd20ae01c3cf 0.06 0.04 opensource:maintainerofgraphcomp +cv-classic_serif 1:33c35e9d236d 0.02 0.04 speaking:jvmsummit2024,devoxxuk2 cv-compact_mono 0:8f1010120ed6 0.39 0.00 jordanrivera cv-compact_mono 0:f9e4560bd641 -0.26 0.00 london,uk/+442055551000/jordan.r -cv-compact_mono 0:32c1cf49a2fe 0.31 -0.04 skills +cv-compact_mono 0:32c1cf49a2fe 0.19 -0.04 skills cv-compact_mono 0:551282493299 -0.10 -0.04 languagesjava21,kotlin,groovy,py -cv-compact_mono 0:8f5cfd05d621 -0.36 -0.04 document&printpdfbox,apachepoi +cv-compact_mono 0:8f5cfd05d621 -0.24 -0.04 document&printpdfbox,apachepoi cv-compact_mono 0:148ff6990529 -0.22 -0.04 (docx/xlsx),itext,postscript cv-compact_mono 0:862bd50bcc32 -0.34 -0.04 layoutenginescustomdsldesign,sem cv-compact_mono 0:ec4f3e745260 -0.20 -0.04 layouttrees,pagination,snapshott @@ -316,14 +316,14 @@ cv-compact_mono 0:d4ac2ee01f81 -0.30 -0.04 testingjunit5,assertj,pdfbox-bas cv-compact_mono 0:b04e6ebfb02b -0.16 -0.04 diff,layout-graphsnapshots cv-compact_mono 0:93c9f742ef14 -0.28 -0.04 distributionmavencentral,sonatyp cv-compact_mono 0:8f21bd149ad7 -0.11 -0.04 gpgsigning,jitpack -cv-compact_mono 0:68bf0109c6f8 0.46 -0.04 education +cv-compact_mono 0:68bf0109c6f8 0.34 -0.04 education cv-compact_mono 0:9ad8d9ef1711 -0.14 -0.04 msccomputerscience/universityof cv-compact_mono 0:594f6dd11e20 -0.04 -0.04 manchester/2019-2021 cv-compact_mono 0:387dc0387824 -0.16 -0.04 bscsoftwareengineering/imperialc cv-compact_mono 0:453806946a88 -0.06 -0.04 london/2015-2019 cv-compact_mono 0:7816e7a28b71 -0.18 -0.04 oraclejavacertification/professi cv-compact_mono 0:d40b22f00acb 0.07 -0.04 2023-2024 -cv-compact_mono 0:7b476727faf3 0.38 -0.04 additional +cv-compact_mono 0:7b476727faf3 0.26 -0.04 additional cv-compact_mono 0:ecc25e73b19b -0.17 -0.04 languages:english(fluent),german cv-compact_mono 0:ac7f0ee6a49e -0.14 -0.04 (intermediate),spanish(basic) cv-compact_mono 0:970ca9d789c2 -0.10 -0.04 workeligibility:eligibletoworkin @@ -332,12 +332,12 @@ cv-compact_mono 0:8051a4b5e34f -0.01 -0.04 opensource:maintainerofgraphcomp cv-compact_mono 0:08c2e869a75b -0.10 -0.04 regularcontributortopdfboxissuet cv-compact_mono 0:12dcd1343975 -0.06 -0.04 speaking:jvmsummit2024,devoxxuk2 cv-compact_mono 0:3aea7f90f8ed -0.03 -0.04 —bothondeclarativedocumentlayout -cv-compact_mono 0:1900eab6c028 0.27 0.06 profile -cv-compact_mono 0:3828b9718a0d -0.40 0.06 platformengineerwith10+yearsbuil +cv-compact_mono 0:1900eab6c028 0.15 0.06 profile +cv-compact_mono 0:3828b9718a0d -0.28 0.06 platformengineerwith10+yearsbuil cv-compact_mono 0:f6b5e93ccadd -0.32 0.06 engines,anddeveloper-facingtempl cv-compact_mono 0:927ef106776a -0.36 0.06 semanticauthoringdsls,andturning cv-compact_mono 0:330fcb75ed52 -0.28 0.06 librariesthatscale. -cv-compact_mono 0:53e5e7c5a884 0.45 0.06 experience +cv-compact_mono 0:53e5e7c5a884 0.33 0.06 experience cv-compact_mono 0:c9efb118bfda 0.07 0.06 seniorplatformengineer,northwind cv-compact_mono 0:64c4b52dceb1 -0.24 0.06 ledthereusabledocument-generatio cv-compact_mono 0:1f193cd1d987 -0.24 0.06 productteams.reducedtemplatemain @@ -349,9 +349,9 @@ cv-compact_mono 0:b78a9a72ca9a -0.15 0.06 andcuttingp99renderlatencyfrom1. cv-compact_mono 0:9f5d87c00954 0.10 0.06 backendengineer,helixprintco|201 cv-compact_mono 0:a485c37fe7ea -0.09 0.06 maintainedahigh-volumeinvoice-pr cv-compact_mono 0:5a136b6b9d8c -0.09 0.06 testharnessthatgatedeverytemplat -cv-compact_mono 0:d94eccbb1fbe 0.66 0.06 selectedprojects -cv-compact_mono 0:0059a3aac61e -0.08 0.06 graphcompose(java21,pdfbox,maven -cv-compact_mono 0:18b7f8c840e4 -0.07 0.06 dsl,slot-basedtemplates,snapshot +cv-compact_mono 0:d94eccbb1fbe 0.54 0.06 selectedprojects +cv-compact_mono 0:0059a3aac61e 0.04 0.06 graphcompose(java21,pdfbox,maven +cv-compact_mono 0:18b7f8c840e4 0.05 0.06 dsl,slot-basedtemplates,snapshot cv-compact_mono 0:d36f78e88fe0 0.07 0.06 forhiringtoolsandbillingsystems. cv-compact_mono 0:55e119878845 0.10 0.06 templatestudio(kotlin,composedes cv-compact_mono 0:c7b83853442b 0.11 0.06 proposal,andinvoiceoutputacross1 @@ -360,15 +360,15 @@ cv-compact_mono 0:ab89138286bb 0.14 0.06 layoutlint(java21,javaparser,spo cv-compact_mono 0:2c506ce69aa6 0.15 0.06 nestedrows,untypedoffsets,implic cv-compact_mono 0:6793d28e9783 0.16 0.06 chromeforge(java,graphcompose,pa cv-compact_mono 0:e3cfea265b3b 0.17 0.06 graphcompose:cinematiccovers,pul -cv-editorial_blue 0:8f1010120ed6 0.40 -0.01 jordanrivera -cv-editorial_blue 0:2d58f0cadc2d 0.31 -0.05 platformengineer -cv-editorial_blue 0:1b28eb6a9a2e 0.18 -0.02 +442055551000-london,uk -cv-editorial_blue 0:8817bf9310b6 0.15 -0.05 jordan.rivera@example.com|linked -cv-editorial_blue 0:3c69d6bb4892 0.23 -0.04 professionalprofile +cv-editorial_blue 0:8f1010120ed6 -0.08 -0.01 jordanrivera +cv-editorial_blue 0:2d58f0cadc2d 0.07 -0.05 platformengineer +cv-editorial_blue 0:1b28eb6a9a2e -0.06 -0.02 +442055551000-london,uk +cv-editorial_blue 0:8817bf9310b6 -0.11 -0.05 jordan.rivera@example.com|linked +cv-editorial_blue 0:3c69d6bb4892 -0.01 -0.04 professionalprofile cv-editorial_blue 0:80cc87fdc4c4 -0.15 -0.04 platformengineerwith10+yearsbuil cv-editorial_blue 0:c323ef4c385f -0.13 -0.04 systems.specialisedinhigh-throug cv-editorial_blue 0:3ff1933dba9a -0.10 -0.04 typed,snapshot-testedlibrariesth -cv-editorial_blue 0:32c1cf49a2fe 0.21 -0.04 skills +cv-editorial_blue 0:32c1cf49a2fe -0.03 -0.04 skills cv-editorial_blue 0:8447174c8fff 0.16 -0.04 •java21 cv-editorial_blue 0:4797e5b5555b 0.16 0.05 •kotlin cv-editorial_blue 0:44408890ac29 0.16 0.03 •groovy @@ -401,47 +401,47 @@ cv-editorial_blue 0:7ea255c76189 0.10 0.03 •mavencentral cv-editorial_blue 0:4e484fca00bb 0.11 -0.04 •sonatypeossrh cv-editorial_blue 0:feaf5883619f 0.11 0.05 •gpgsigning cv-editorial_blue 0:11f34b7449a4 0.11 0.03 •semanticversioningdiscipline -cv-editorial_blue 0:68bf0109c6f8 0.19 -0.04 education -cv-editorial_blue 0:78cdd0bfd1ce 0.14 -0.04 msccomputerscience2019-2021 -cv-editorial_blue 0:47ce0218bbea 0.14 -0.04 universityofmanchester -cv-editorial_blue 0:2ffe115b06e5 0.13 -0.04 distinction.thesis:composablelay -cv-editorial_blue 0:c5947a492ce6 0.21 -0.04 bscsoftwareengineering2015-2019 -cv-editorial_blue 0:89ad9656f393 0.09 -0.04 imperialcollegelondon -cv-editorial_blue 0:baa173b4a82e 0.08 -0.04 first-classhonours.specialisatio -cv-editorial_blue 0:83766950a9ce 0.18 -0.04 oraclejavacertification2023-2024 -cv-editorial_blue 0:2669e1f6d55c 0.06 -0.04 professionaltrack -cv-editorial_blue 0:3857373829c1 0.05 -0.04 java17platformdeep-dive:records, -cv-editorial_blue 0:2577c0f557b2 0.12 -0.04 projects -cv-editorial_blue 0:0f2c67872251 0.07 -0.04 graphcompose(java21,pdfbox,maven -cv-editorial_blue 0:cf13c8a0c3d0 -0.35 -0.04 declarativejavapdflayoutengine.s +cv-editorial_blue 0:68bf0109c6f8 -0.05 -0.04 education +cv-editorial_blue 0:78cdd0bfd1ce -0.10 -0.04 msccomputerscience2019-2021 +cv-editorial_blue 0:47ce0218bbea -0.10 -0.04 universityofmanchester +cv-editorial_blue 0:2ffe115b06e5 -0.11 -0.04 distinction.thesis:composablelay +cv-editorial_blue 0:c5947a492ce6 -0.15 -0.04 bscsoftwareengineering2015-2019 +cv-editorial_blue 0:89ad9656f393 -0.15 -0.04 imperialcollegelondon +cv-editorial_blue 0:baa173b4a82e -0.16 -0.04 first-classhonours.specialisatio +cv-editorial_blue 0:83766950a9ce -0.06 -0.04 oraclejavacertification2023-2024 +cv-editorial_blue 0:2669e1f6d55c -0.06 -0.04 professionaltrack +cv-editorial_blue 0:3857373829c1 -0.07 -0.04 java17platformdeep-dive:records, +cv-editorial_blue 0:2577c0f557b2 -0.12 -0.04 projects +cv-editorial_blue 0:0f2c67872251 -0.17 -0.04 graphcompose(java21,pdfbox,maven +cv-editorial_blue 0:cf13c8a0c3d0 -0.23 -0.04 declarativejavapdflayoutengine.s cv-editorial_blue 0:cfef54184ea6 -0.17 -0.04 proposalpipelinesforhiringtoolsa -cv-editorial_blue 0:d73d02174dc9 0.15 -0.04 templatestudio(kotlin,composedes +cv-editorial_blue 0:d73d02174dc9 -0.09 -0.04 templatestudio(kotlin,composedes cv-editorial_blue 0:7127a108c33c -0.27 -0.04 internaltoolforevaluatingcv,prop cv-editorial_blue 0:6b844249c695 -0.22 -0.04 freezing. -cv-editorial_blue 0:542ec793b5b1 0.10 -0.04 layoutlint(java21,javaparser,spo -cv-editorial_blue 0:7488006d7864 -0.29 -0.04 staticanalyserthatflagsfragileau +cv-editorial_blue 0:542ec793b5b1 -0.14 -0.04 layoutlint(java21,javaparser,spo +cv-editorial_blue 0:7488006d7864 -0.17 -0.04 staticanalyserthatflagsfragileau cv-editorial_blue 0:c4d0c415b4f8 -0.23 -0.04 production. -cv-editorial_blue 0:ee180ea1e0a5 0.21 -0.04 chromeforge(java,graphcompose,pa -cv-editorial_blue 0:e7e62230eb1f 0.15 -0.04 editorial-magazinedocumenttoolki -cv-editorial_blue 0:53e5e7c5a884 0.10 -0.04 experience -cv-editorial_blue 0:1b72d3ce3e11 0.01 -0.04 seniorplatformengineer2024-prese -cv-editorial_blue 0:f890faef907f 0.14 -0.04 northwindsystems +cv-editorial_blue 0:ee180ea1e0a5 -0.03 -0.04 chromeforge(java,graphcompose,pa +cv-editorial_blue 0:e7e62230eb1f 0.03 -0.04 editorial-magazinedocumenttoolki +cv-editorial_blue 0:53e5e7c5a884 -0.14 -0.04 experience +cv-editorial_blue 0:1b72d3ce3e11 -0.11 -0.04 seniorplatformengineer2024-prese +cv-editorial_blue 0:f890faef907f -0.10 -0.04 northwindsystems cv-editorial_blue 0:1af5650959fe -0.27 -0.04 ledthereusabledocument-generatio cv-editorial_blue 0:27c01c228bd8 -0.27 -0.04 templatemaintenancetimeby70%byre -cv-editorial_blue 0:1a7fe8433bff 0.12 -0.04 softwareengineer2021-2024 -cv-editorial_blue 0:998c1a985022 0.14 -0.04 brightleaflabs +cv-editorial_blue 0:1a7fe8433bff -0.12 -0.04 softwareengineer2021-2024 +cv-editorial_blue 0:998c1a985022 -0.10 -0.04 brightleaflabs cv-editorial_blue 0:e86691b0219f -0.28 -0.04 builtbackendservicesandproductio cv-editorial_blue 0:4ec57434564a -0.27 -0.04 migrationfromitexttoacustomlayou -cv-editorial_blue 0:2427b23ddf4e 0.15 -0.04 backendengineer2019-2021 +cv-editorial_blue 0:2427b23ddf4e -0.09 -0.04 backendengineer2019-2021 cv-editorial_blue 1:ef148f221e31 0.21 -0.04 helixprintco cv-editorial_blue 1:f811fbee6901 -0.20 -0.04 maintainedahigh-volumeinvoice-pr cv-editorial_blue 1:cbfca5b2a6d7 -0.08 -0.04 templatechange. -cv-editorial_blue 1:7b476727faf3 0.26 -0.04 additional -cv-editorial_blue 1:f20997652453 0.23 -0.04 languages:english(fluent),german -cv-editorial_blue 1:ec9d3622395e 0.18 -0.04 workeligibility:eligibletoworkin -cv-editorial_blue 1:dd20ae01c3cf 0.24 -0.04 opensource:maintainerofgraphcomp -cv-editorial_blue 1:33c35e9d236d 0.19 -0.04 speaking:jvmsummit2024,devoxxuk2 -cv-editorial_blue 1:0b516aa076e0 0.17 -0.04 referencesavailableuponrequest. +cv-editorial_blue 1:7b476727faf3 0.02 -0.04 additional +cv-editorial_blue 1:f20997652453 -0.01 -0.04 languages:english(fluent),german +cv-editorial_blue 1:ec9d3622395e 0.06 -0.04 workeligibility:eligibletoworkin +cv-editorial_blue 1:dd20ae01c3cf 0.00 -0.04 opensource:maintainerofgraphcomp +cv-editorial_blue 1:33c35e9d236d 0.07 -0.04 speaking:jvmsummit2024,devoxxuk2 +cv-editorial_blue 1:0b516aa076e0 0.05 -0.04 referencesavailableuponrequest. cv-engineering_resume 0:8f1010120ed6 -0.02 0.04 jordanrivera cv-engineering_resume 0:2d58f0cadc2d -0.18 0.04 platformengineer cv-engineering_resume 0:fbeea547d99e -0.15 0.15 london,uk @@ -502,18 +502,18 @@ cv-engineering_resume 0:e3cfea265b3b -0.30 0.01 graphcompose:cinematiccovers,pul cv-executive 0:8f1010120ed6 0.08 -0.04 jordanrivera cv-executive 0:89ff05847e96 -0.30 -0.04 london,uk|+442055551000 cv-executive 0:8817bf9310b6 -0.32 -0.04 jordan.rivera@example.com|linked -cv-executive 0:b944906ed84c 0.38 -0.04 professionalsummary +cv-executive 0:b944906ed84c 0.14 -0.04 professionalsummary cv-executive 0:6fbdc8b79878 0.06 -0.04 platformengineerwith10+yearsbuil cv-executive 0:c2be183b1c5f 0.01 -0.04 templatesystems.specialisedinhig cv-executive 0:7f92a9c9efc9 -0.04 -0.04 scriptsintotyped,snapshot-tested -cv-executive 0:5f94c50dc5bf 0.36 -0.04 technicalskills +cv-executive 0:5f94c50dc5bf 0.12 -0.04 technicalskills cv-executive 0:eea537278f83 -0.20 -0.04 •languages:java21,kotlin,groovy, cv-executive 0:9c2cd7231a53 -0.16 -0.04 •document&print:pdfbox,apachepoi cv-executive 0:7bf8639ec5d3 -0.21 -0.04 •layoutengines:customdsldesign,s cv-executive 0:8e66776d28d7 -0.17 -0.04 •build&infrastructure:maven,grad cv-executive 0:1ed4fc7d7768 -0.13 -0.04 •testing:junit5,assertj,pdfbox-b cv-executive 0:26671c309eb9 -0.21 -0.04 •distribution:mavencentral,sonat -cv-executive 0:68bf0109c6f8 0.43 -0.04 education +cv-executive 0:68bf0109c6f8 0.07 -0.04 education cv-executive 0:0ad1957d6bab -0.17 -0.04 msccomputerscience cv-executive 0:3fa772117260 -0.17 0.04 2019-2021 cv-executive 0:47ce0218bbea -0.15 -0.04 universityofmanchester @@ -526,7 +526,7 @@ cv-executive 0:6d3d5673c39f -0.19 -0.04 oraclejavacertification cv-executive 0:d40b22f00acb -0.19 0.04 2023-2024 cv-executive 0:2669e1f6d55c -0.17 -0.04 professionaltrack cv-executive 0:3857373829c1 -0.15 -0.04 java17platformdeep-dive:records, -cv-executive 0:2577c0f557b2 0.37 -0.04 projects +cv-executive 0:2577c0f557b2 0.13 -0.04 projects cv-executive 0:b2b029995203 -0.19 -0.04 •graphcompose(java21,pdfbox,mave cv-executive 0:cf13c8a0c3d0 -0.43 0.00 declarativejavapdflayoutengine.s cv-executive 0:cfef54184ea6 -0.48 0.00 proposalpipelinesforhiringtoolsa @@ -538,7 +538,7 @@ cv-executive 0:f5fa2add7746 -0.42 0.00 staticanalyserthatflagsfragileau cv-executive 0:9f5414016bd1 -0.47 0.00 toproduction. cv-executive 0:fb1927f88597 -0.19 -0.04 •chromeforge(java,graphcompose,p cv-executive 0:e7e62230eb1f -0.19 0.00 editorial-magazinedocumenttoolki -cv-executive 0:c2f296ef30a3 0.45 -0.04 professionalexperience +cv-executive 0:c2f296ef30a3 0.09 -0.04 professionalexperience cv-executive 0:a76f47480818 -0.15 -0.04 seniorplatformengineer cv-executive 0:060300b18051 -0.15 0.06 2024-present cv-executive 0:f890faef907f -0.14 -0.04 northwindsystems @@ -554,8 +554,8 @@ cv-executive 1:3fa772117260 -0.29 0.04 2019-2021 cv-executive 1:ef148f221e31 -0.27 -0.04 helixprintco cv-executive 1:f811fbee6901 -0.01 -0.04 maintainedahigh-volumeinvoice-pr cv-executive 1:cbfca5b2a6d7 -0.06 -0.04 templatechange. -cv-executive 1:676dfdd56ad2 0.22 -0.04 additionalinformation -cv-executive 1:f20997652453 -0.22 -0.04 languages:english(fluent),german +cv-executive 1:676dfdd56ad2 -0.02 -0.04 additionalinformation +cv-executive 1:f20997652453 -0.34 -0.04 languages:english(fluent),german cv-executive 1:ec9d3622395e -0.30 -0.04 workeligibility:eligibletoworkin cv-executive 1:dd20ae01c3cf -0.26 -0.04 opensource:maintainerofgraphcomp cv-executive 1:33c35e9d236d -0.22 -0.04 speaking:jvmsummit2024,devoxxuk2 @@ -659,16 +659,16 @@ cv-minimal_underlined 0:26671c309eb9 0.42 0.00 •distribution:mavencentral,sona cv-minimal_underlined 0:68bf0109c6f8 0.53 0.04 education cv-minimal_underlined 0:0ad1957d6bab 0.54 0.00 msccomputerscience cv-minimal_underlined 0:3fa772117260 0.59 -0.95 2019-2021 -cv-minimal_underlined 0:47ce0218bbea 0.42 0.00 universityofmanchester -cv-minimal_underlined 0:2ffe115b06e5 0.48 0.00 distinction.thesis:composablelay +cv-minimal_underlined 0:47ce0218bbea 0.30 0.00 universityofmanchester +cv-minimal_underlined 0:2ffe115b06e5 0.36 0.00 distinction.thesis:composablelay cv-minimal_underlined 0:b6749d0b616b 0.62 0.00 bscsoftwareengineering cv-minimal_underlined 0:30f9262640a0 0.56 -0.95 2015-2019 -cv-minimal_underlined 0:89ad9656f393 0.50 0.00 imperialcollegelondon -cv-minimal_underlined 0:baa173b4a82e 0.58 0.00 first-classhonours.specialisatio +cv-minimal_underlined 0:89ad9656f393 0.26 0.00 imperialcollegelondon +cv-minimal_underlined 0:baa173b4a82e 0.34 0.00 first-classhonours.specialisatio cv-minimal_underlined 0:6d3d5673c39f 0.61 0.00 oraclejavacertification cv-minimal_underlined 0:d40b22f00acb 0.66 -0.95 2023-2024 -cv-minimal_underlined 0:2669e1f6d55c 0.49 0.00 professionaltrack -cv-minimal_underlined 0:3857373829c1 0.67 0.00 java17platformdeep-dive:records, +cv-minimal_underlined 0:2669e1f6d55c 0.37 0.00 professionaltrack +cv-minimal_underlined 0:3857373829c1 0.43 0.00 java17platformdeep-dive:records, cv-minimal_underlined 0:2577c0f557b2 0.65 0.04 projects cv-minimal_underlined 0:b2b029995203 0.60 0.00 •graphcompose(java21,pdfbox,mave cv-minimal_underlined 0:67593a76ef70 0.45 0.02 declarativejavapdflayoutengine.s @@ -684,24 +684,24 @@ cv-minimal_underlined 0:e7e62230eb1f 0.88 0.02 editorial-magazinedocumenttoolki cv-minimal_underlined 0:c2f296ef30a3 0.86 0.04 professionalexperience cv-minimal_underlined 0:a76f47480818 0.87 0.00 seniorplatformengineer cv-minimal_underlined 0:060300b18051 0.81 -0.01 2024-present -cv-minimal_underlined 0:f890faef907f 0.78 0.00 northwindsystems +cv-minimal_underlined 0:f890faef907f 0.66 0.00 northwindsystems cv-minimal_underlined 1:49faf14f1f56 -0.10 0.00 ledthereusabledocument-generatio cv-minimal_underlined 1:6bd3f168e89e -0.05 0.00 maintenancetimeby70%byretiringpe cv-minimal_underlined 1:daf65306b3b6 0.21 0.00 softwareengineer cv-minimal_underlined 1:e7cc1822c6dc 0.27 -0.95 2021-2024 -cv-minimal_underlined 1:998c1a985022 0.11 0.00 brightleaflabs +cv-minimal_underlined 1:998c1a985022 -0.01 0.00 brightleaflabs cv-minimal_underlined 1:e55664011cda 0.05 0.00 builtbackendservicesandproductio cv-minimal_underlined 1:e80236b6d2b1 -0.02 0.00 itexttoacustomlayoutengine,elimi cv-minimal_underlined 1:41bb54fbae8d 0.36 0.00 backendengineer cv-minimal_underlined 1:3fa772117260 0.30 -0.95 2019-2021 -cv-minimal_underlined 1:ef148f221e31 0.24 0.00 helixprintco +cv-minimal_underlined 1:ef148f221e31 0.00 0.00 helixprintco cv-minimal_underlined 1:9d31a6bfbc69 0.06 0.00 maintainedahigh-volumeinvoice-pr cv-minimal_underlined 1:03af8a628309 0.11 0.00 change. cv-minimal_underlined 1:676dfdd56ad2 0.33 0.04 additionalinformation -cv-minimal_underlined 1:f20997652453 0.28 0.00 languages:english(fluent),german -cv-minimal_underlined 1:ec9d3622395e 0.44 0.00 workeligibility:eligibletoworkin -cv-minimal_underlined 1:dd20ae01c3cf 0.44 0.00 opensource:maintainerofgraphcomp -cv-minimal_underlined 1:33c35e9d236d 0.45 0.00 speaking:jvmsummit2024,devoxxuk2 +cv-minimal_underlined 1:f20997652453 0.16 0.00 languages:english(fluent),german +cv-minimal_underlined 1:ec9d3622395e 0.20 0.00 workeligibility:eligibletoworkin +cv-minimal_underlined 1:dd20ae01c3cf 0.20 0.00 opensource:maintainerofgraphcomp +cv-minimal_underlined 1:33c35e9d236d 0.21 0.00 speaking:jvmsummit2024,devoxxuk2 cv-mint_editorial 0:8f1010120ed6 -0.18 -0.16 jordanrivera cv-mint_editorial 0:2d58f0cadc2d 0.01 -0.68 platformengineer cv-mint_editorial 0:093e7d5fdbaa -0.13 0.00 contact @@ -710,35 +710,35 @@ cv-mint_editorial 0:e0f850305ded 0.21 0.62 jordan.rivera@example.com cv-mint_editorial 0:fbeea547d99e 0.21 0.62 london,uk cv-mint_editorial 0:84308bea4540 0.24 0.62 linkedin cv-mint_editorial 0:c0b0109d9439 0.24 0.62 github -cv-mint_editorial 0:68bf0109c6f8 -0.18 0.00 education +cv-mint_editorial 0:68bf0109c6f8 0.06 0.00 education cv-mint_editorial 0:0ad1957d6bab 0.05 0.00 msccomputerscience cv-mint_editorial 0:47ce0218bbea 0.08 0.00 universityofmanchester cv-mint_editorial 0:3fa772117260 0.08 0.00 2019-2021 -cv-mint_editorial 0:5993c29826a9 0.07 0.00 bscsoftware -cv-mint_editorial 0:8c85b6639e62 0.15 0.00 engineering +cv-mint_editorial 0:5993c29826a9 -0.05 0.00 bscsoftware +cv-mint_editorial 0:8c85b6639e62 0.03 0.00 engineering cv-mint_editorial 0:89ad9656f393 0.06 0.00 imperialcollegelondon cv-mint_editorial 0:30f9262640a0 0.06 0.00 2015-2019 cv-mint_editorial 0:95c2a0cf9777 0.03 0.00 oraclejava cv-mint_editorial 0:b00a6c108553 0.11 0.00 certification -cv-mint_editorial 0:2669e1f6d55c 0.14 0.00 professionaltrack -cv-mint_editorial 0:d40b22f00acb 0.14 0.00 2023-2024 +cv-mint_editorial 0:2669e1f6d55c 0.02 0.00 professionaltrack +cv-mint_editorial 0:d40b22f00acb 0.02 0.00 2023-2024 cv-mint_editorial 0:1900eab6c028 -0.13 0.07 profile -cv-mint_editorial 0:924e8fc8d04f 0.22 0.07 platformengineerwith10+yearsbuil -cv-mint_editorial 0:df58bf5ac853 0.32 0.07 pipelines,layoutengines,anddevel -cv-mint_editorial 0:bedc997db3d0 0.30 0.07 inhigh-throughputpdfrendering,se -cv-mint_editorial 0:3be7f615205f 0.28 0.07 production-opsscriptsintotyped,s -cv-mint_editorial 0:53e5e7c5a884 -0.16 0.07 experience -cv-mint_editorial 0:a76f47480818 0.07 0.07 seniorplatformengineer -cv-mint_editorial 0:d492f2d34b81 0.10 0.07 northwindsystems|2024-present -cv-mint_editorial 0:11a63b6a756a 0.31 0.07 ledthereusabledocument-generatio -cv-mint_editorial 0:e9ddcca2381b 0.29 0.07 reportingflowsacross8productteam -cv-mint_editorial 0:8e7a066998f5 0.27 0.07 by70%byretiringper-teampdfscript +cv-mint_editorial 0:924e8fc8d04f -0.02 0.07 platformengineerwith10+yearsbuil +cv-mint_editorial 0:df58bf5ac853 -0.04 0.07 pipelines,layoutengines,anddevel +cv-mint_editorial 0:bedc997db3d0 -0.06 0.07 inhigh-throughputpdfrendering,se +cv-mint_editorial 0:3be7f615205f -0.08 0.07 production-opsscriptsintotyped,s +cv-mint_editorial 0:53e5e7c5a884 -0.04 0.07 experience +cv-mint_editorial 0:a76f47480818 -0.05 0.07 seniorplatformengineer +cv-mint_editorial 0:d492f2d34b81 -0.02 0.07 northwindsystems|2024-present +cv-mint_editorial 0:11a63b6a756a -0.05 0.07 ledthereusabledocument-generatio +cv-mint_editorial 0:e9ddcca2381b -0.07 0.07 reportingflowsacross8productteam +cv-mint_editorial 0:8e7a066998f5 0.03 0.07 by70%byretiringper-teampdfscript cv-mint_editorial 0:daf65306b3b6 -0.01 0.07 softwareengineer -cv-mint_editorial 0:14aeb7d88f36 0.14 0.07 brightleaflabs|2021-2024 -cv-mint_editorial 0:78c890058374 0.37 0.07 builtbackendservicesandproductio -cv-mint_editorial 0:798b575aa9c2 0.35 0.07 processing2m+documentspermonth.d -cv-mint_editorial 0:337c2b00cc88 0.33 0.07 customlayoutengine,eliminatingli -cv-mint_editorial 0:cbec16fb4c22 0.31 0.07 from1.4sto380ms. +cv-mint_editorial 0:14aeb7d88f36 0.02 0.07 brightleaflabs|2021-2024 +cv-mint_editorial 0:78c890058374 0.01 0.07 builtbackendservicesandproductio +cv-mint_editorial 0:798b575aa9c2 -0.01 0.07 processing2m+documentspermonth.d +cv-mint_editorial 0:337c2b00cc88 -0.03 0.07 customlayoutengine,eliminatingli +cv-mint_editorial 0:cbec16fb4c22 -0.05 0.07 from1.4sto380ms. cv-mint_editorial 1:2b3bcb2b7d1d -0.03 0.00 expertise cv-mint_editorial 1:6cb574fa10b6 0.10 0.00 languages cv-mint_editorial 1:f2197dc148f6 0.10 0.00 document&print @@ -746,49 +746,49 @@ cv-mint_editorial 1:634db137981a 0.10 0.00 layoutengines cv-mint_editorial 1:86c328e816c6 0.10 0.00 build&infrastructure cv-mint_editorial 1:cf80cd8aed48 0.13 0.00 testing cv-mint_editorial 1:933548450302 0.13 0.00 distribution -cv-mint_editorial 1:32c1cf49a2fe -0.18 0.00 skills +cv-mint_editorial 1:32c1cf49a2fe 0.18 0.00 skills cv-mint_editorial 1:d5680c2e2769 0.17 0.00 java21 cv-mint_editorial 1:19a67c2a5369 0.08 0.00 kotlin cv-mint_editorial 1:95bfacd3a466 0.13 0.00 groovy cv-mint_editorial 1:11a4a60b518b 0.16 0.00 python cv-mint_editorial 1:4ec7c53222c8 0.19 0.00 sql cv-mint_editorial 1:57529f20c3ad 0.10 0.00 pdfbox -cv-mint_editorial 1:3e860f41a5ea -0.03 0.00 social +cv-mint_editorial 1:3e860f41a5ea 0.21 0.00 social cv-mint_editorial 1:84308bea4540 0.04 0.38 linkedin cv-mint_editorial 1:c0b0109d9439 0.00 0.38 github cv-mint_editorial 1:53e5e7c5a884 -0.03 0.07 experience cv-mint_editorial 1:41bb54fbae8d 0.10 0.07 backendengineer cv-mint_editorial 1:43aab7d19dc6 0.13 0.07 helixprintco|2019-2021 -cv-mint_editorial 1:d9af05f99661 0.34 0.07 maintainedahigh-volumeinvoice-pr -cv-mint_editorial 1:1081945512b1 0.32 0.07 authoredthecompliancetestharness +cv-mint_editorial 1:d9af05f99661 0.10 0.07 maintainedahigh-volumeinvoice-pr +cv-mint_editorial 1:1081945512b1 0.08 0.07 authoredthecompliancetestharness cv-modern_professional 0:8f1010120ed6 0.18 0.13 jordanrivera cv-modern_professional 0:89ff05847e96 0.12 0.03 london,uk|+442055551000 cv-modern_professional 0:8817bf9310b6 0.07 0.13 jordan.rivera@example.com|linked -cv-modern_professional 0:b944906ed84c 0.38 0.00 professionalsummary -cv-modern_professional 0:6fbdc8b79878 -0.12 0.00 platformengineerwith10+yearsbuil -cv-modern_professional 0:5f94c50dc5bf 0.47 0.00 technicalskills +cv-modern_professional 0:b944906ed84c 0.02 0.00 professionalsummary +cv-modern_professional 0:6fbdc8b79878 -0.01 0.00 platformengineerwith10+yearsbuil +cv-modern_professional 0:5f94c50dc5bf -0.01 0.00 technicalskills cv-modern_professional 0:eea537278f83 0.33 0.00 •languages:java21,kotlin,groovy, cv-modern_professional 0:9c2cd7231a53 0.36 0.00 •document&print:pdfbox,apachepoi cv-modern_professional 0:7bf8639ec5d3 0.39 0.00 •layoutengines:customdsldesign,s cv-modern_professional 0:8e66776d28d7 0.30 0.00 •build&infrastructure:maven,grad cv-modern_professional 0:1ed4fc7d7768 0.33 0.00 •testing:junit5,assertj,pdfbox-b cv-modern_professional 0:26671c309eb9 0.36 0.00 •distribution:mavencentral,sonat -cv-modern_professional 0:68bf0109c6f8 0.47 0.00 education +cv-modern_professional 0:68bf0109c6f8 0.11 0.00 education cv-modern_professional 0:0ad1957d6bab 0.41 0.00 msccomputerscience cv-modern_professional 0:3fa772117260 0.40 0.07 2019-2021 cv-modern_professional 0:3fa772117260#1 0.41 0.07 2019-2021 -cv-modern_professional 0:47ce0218bbea 0.29 0.00 universityofmanchester -cv-modern_professional 0:2ffe115b06e5 0.42 0.00 distinction.thesis:composablelay +cv-modern_professional 0:47ce0218bbea 0.05 0.00 universityofmanchester +cv-modern_professional 0:2ffe115b06e5 0.18 0.00 distinction.thesis:composablelay cv-modern_professional 0:b6749d0b616b 0.32 0.00 bscsoftwareengineering cv-modern_professional 0:30f9262640a0 0.43 0.07 2015-2019 -cv-modern_professional 0:89ad9656f393 0.20 0.00 imperialcollegelondon -cv-modern_professional 0:baa173b4a82e 0.33 0.00 first-classhonours.specialisatio +cv-modern_professional 0:89ad9656f393 0.08 0.00 imperialcollegelondon +cv-modern_professional 0:baa173b4a82e 0.21 0.00 first-classhonours.specialisatio cv-modern_professional 0:6d3d5673c39f 0.35 0.00 oraclejavacertification cv-modern_professional 0:d40b22f00acb 0.35 0.07 2023-2024 -cv-modern_professional 0:2669e1f6d55c 0.23 0.00 professionaltrack -cv-modern_professional 0:3857373829c1 0.36 0.00 java17platformdeep-dive:records, -cv-modern_professional 0:2577c0f557b2 0.46 0.00 projects -cv-modern_professional 0:b2b029995203 0.32 0.00 •graphcompose(java21,pdfbox,mave +cv-modern_professional 0:2669e1f6d55c 0.11 0.00 professionaltrack +cv-modern_professional 0:3857373829c1 0.24 0.00 java17platformdeep-dive:records, +cv-modern_professional 0:2577c0f557b2 0.10 0.00 projects +cv-modern_professional 0:b2b029995203 0.44 0.00 •graphcompose(java21,pdfbox,mave cv-modern_professional 0:dd39d2ff3520 0.07 0.00 declarativejavapdflayoutengine.s cv-modern_professional 0:9ecaa6df6d41 0.15 0.00 invoice/proposalpipelinesforhiri cv-modern_professional 0:1b50bb81df5a 0.44 0.00 •templatestudio(kotlin,composede @@ -800,26 +800,26 @@ cv-modern_professional 0:7b985a1d2b08 0.15 0.00 shiptoproduction. cv-modern_professional 0:fb1927f88597 0.44 0.00 •chromeforge(java,graphcompose,p cv-modern_professional 0:cda7db6c6ea6 0.07 0.00 editorial-magazinedocumenttoolki cv-modern_professional 0:fe63fe18585a 0.15 0.00 callouts. -cv-modern_professional 0:c2f296ef30a3 0.50 0.00 professionalexperience +cv-modern_professional 0:c2f296ef30a3 0.14 0.00 professionalexperience cv-modern_professional 0:a76f47480818 0.44 0.00 seniorplatformengineer cv-modern_professional 0:060300b18051 0.43 0.17 2024-present -cv-modern_professional 0:f890faef907f 0.32 0.00 northwindsystems +cv-modern_professional 0:f890faef907f 0.20 0.00 northwindsystems cv-modern_professional 0:a6525dacbac7 0.09 0.00 ledthereusabledocument-generatio cv-modern_professional 0:15e3905f4890 0.17 0.00 reducedtemplatemaintenancetimeby cv-modern_professional 0:daf65306b3b6 0.43 0.00 softwareengineer cv-modern_professional 0:e7cc1822c6dc 0.42 0.07 2021-2024 -cv-modern_professional 0:998c1a985022 0.31 0.00 brightleaflabs +cv-modern_professional 0:998c1a985022 0.19 0.00 brightleaflabs cv-modern_professional 0:e86691b0219f 0.09 0.00 builtbackendservicesandproductio cv-modern_professional 0:4ec57434564a 0.16 0.00 migrationfromitexttoacustomlayou cv-modern_professional 0:41bb54fbae8d 0.41 0.00 backendengineer -cv-modern_professional 0:ef148f221e31 0.30 0.00 helixprintco +cv-modern_professional 0:ef148f221e31 0.18 0.00 helixprintco cv-modern_professional 0:a32c7f2401d9 0.07 0.00 maintainedahigh-volumeinvoice-pr cv-modern_professional 0:7068c1d7034b 0.17 0.00 everytemplatechange. cv-modern_professional 1:676dfdd56ad2 0.39 0.00 additionalinformation -cv-modern_professional 1:f20997652453 0.24 0.00 languages:english(fluent),german -cv-modern_professional 1:ec9d3622395e 0.27 0.00 workeligibility:eligibletoworkin -cv-modern_professional 1:dd20ae01c3cf 0.32 0.00 opensource:maintainerofgraphcomp -cv-modern_professional 1:33c35e9d236d 0.35 0.00 speaking:jvmsummit2024,devoxxuk2 +cv-modern_professional 1:f20997652453 0.12 0.00 languages:english(fluent),german +cv-modern_professional 1:ec9d3622395e 0.03 0.00 workeligibility:eligibletoworkin +cv-modern_professional 1:dd20ae01c3cf 0.08 0.00 opensource:maintainerofgraphcomp +cv-modern_professional 1:33c35e9d236d 0.11 0.00 speaking:jvmsummit2024,devoxxuk2 cv-monogram_sidebar 0:093e7d5fdbaa -0.24 -0.04 contact cv-monogram_sidebar 0:89674e6f130e -0.09 -0.38 +442055551000 cv-monogram_sidebar 0:e0f850305ded 0.03 -0.01 jordan.rivera@example.com @@ -841,8 +841,8 @@ cv-monogram_sidebar 0:11a4a60b518b 0.39 -0.11 python cv-monogram_sidebar 0:4ec7c53222c8 0.39 -0.12 sql cv-monogram_sidebar 0:57529f20c3ad 0.39 -0.13 pdfbox cv-monogram_sidebar 0:1814aacb6d5a 0.42 -0.04 apachepoi(docx/xlsx) -cv-monogram_sidebar 0:136c67657614 0.24 0.06 jordan -cv-monogram_sidebar 0:8ba35ebe3d5c 0.19 0.12 rivera +cv-monogram_sidebar 0:136c67657614 0.00 0.06 jordan +cv-monogram_sidebar 0:8ba35ebe3d5c 0.07 0.12 rivera cv-monogram_sidebar 0:2d58f0cadc2d -0.19 -0.69 platformengineer cv-monogram_sidebar 0:b944906ed84c -0.21 0.05 professionalsummary cv-monogram_sidebar 0:e9b75496bfb4 -0.49 0.05 platformengineerwith10+yearsbuil @@ -1104,14 +1104,14 @@ cv-orange_ops 0:44aaa523dc2c 0.80 -0.02 languages:english(native) cv-orange_ops 0:724cc536a24c 0.84 -0.02 drivinglicence:fullukdrivinglice cv-orange_ops 0:9f0e43069d3f 0.86 -0.02 interests:strengthtraining,motor cv-panel 0:8f1010120ed6 0.06 0.25 jordanrivera -cv-panel 0:2d58f0cadc2d -0.16 -0.05 platformengineer +cv-panel 0:2d58f0cadc2d -0.28 -0.05 platformengineer cv-panel 0:89ff05847e96 -0.16 0.30 london,uk|+442055551000 cv-panel 0:8817bf9310b6 -0.20 0.36 jordan.rivera@example.com|linked -cv-panel 0:1900eab6c028 0.50 0.04 profile +cv-panel 0:1900eab6c028 0.38 0.04 profile cv-panel 0:80cc87fdc4c4 -0.26 0.04 platformengineerwith10+yearsbuil cv-panel 0:c323ef4c385f -0.26 0.04 systems.specialisedinhigh-throug cv-panel 0:3ff1933dba9a -0.26 0.04 typed,snapshot-testedlibrariesth -cv-panel 0:32c1cf49a2fe 0.70 0.04 skills +cv-panel 0:32c1cf49a2fe 0.58 0.04 skills cv-panel 0:eea537278f83 0.18 0.04 •languages:java21,kotlin,groovy, cv-panel 0:7e941e729572 0.05 0.04 •document&print:pdfbox,apachepoi cv-panel 0:9e3166ce2413 0.05 0.04 itext,postscript,icccolourprofil @@ -1121,7 +1121,7 @@ cv-panel 0:f5f76d479ec8 0.09 0.04 •build&infrastructure:maven,grad cv-panel 0:656a2a3e57e0 0.09 0.04 jitpack,docker,jmhbenchmarking cv-panel 0:9a6921f79b7d 0.13 0.04 •distribution:mavencentral,sonat cv-panel 0:77a74982066f 0.13 0.04 jitpack,semanticversioningdiscip -cv-panel 0:68bf0109c6f8 1.09 0.04 education +cv-panel 0:68bf0109c6f8 0.97 0.04 education cv-panel 0:871923f4f0f2 0.63 0.04 msccomputerscience-2019-2021 cv-panel 0:47ce0218bbea 0.67 0.04 universityofmanchester cv-panel 0:51e1ec7daa5a 0.35 0.04 distinction.thesis:composablelay @@ -1134,7 +1134,7 @@ cv-panel 0:8971b01c36bb 0.75 0.04 oraclejavacertification-2023-202 cv-panel 0:2669e1f6d55c 0.79 0.04 professionaltrack cv-panel 0:4f17e3d7d6f4 0.47 0.04 java17platformdeep-dive:records, cv-panel 0:9e6154a3b625 0.47 0.04 matching,virtualthreads. -cv-panel 0:7b476727faf3 1.46 0.04 additional +cv-panel 0:7b476727faf3 1.34 0.04 additional cv-panel 0:3f88eb4c530c 0.70 0.04 languages:english(fluent),german cv-panel 0:5d276fee8c17 0.70 0.04 (basic) cv-panel 0:ec9d3622395e 1.02 0.04 workeligibility:eligibletoworkin @@ -1142,7 +1142,7 @@ cv-panel 0:d05b8b335e96 0.74 0.04 opensource:maintainerofgraphcomp cv-panel 0:2f3b4176123d 0.74 0.04 contributortopdfboxissuetriage. cv-panel 0:1ae173b42166 0.82 0.04 speaking:jvmsummit2024,devoxxuk2 cv-panel 0:309255ca6a36 0.82 0.04 declarativedocumentlayout. -cv-panel 0:53e5e7c5a884 0.70 0.05 experience +cv-panel 0:53e5e7c5a884 0.58 0.05 experience cv-panel 0:99b44abc1b3e 0.22 0.05 seniorplatformengineer-2024-pres cv-panel 0:f890faef907f 0.29 0.05 northwindsystems cv-panel 0:e32ca827bfd5 -0.03 0.05 ledthereusabledocument-generatio @@ -1161,7 +1161,7 @@ cv-panel 0:ef148f221e31 0.43 0.05 helixprintco cv-panel 0:09cc06a649eb 0.11 0.05 maintainedahigh-volumeinvoice-pr cv-panel 0:090e2184c17b 0.11 0.05 pdfs/year)andauthoredthecomplian cv-panel 0:6f071fdf7529 0.23 0.05 gatedeverytemplatechange. -cv-panel 0:2577c0f557b2 1.07 0.05 projects +cv-panel 0:2577c0f557b2 0.95 0.05 projects cv-panel 0:b2b029995203 0.55 0.05 •graphcompose(java21,pdfbox,mave cv-panel 0:81c8132f9792 0.43 0.07 systems.(opensource) cv-panel 0:753f46e4e01b 0.46 0.05 •templatestudio(kotlin,composede @@ -1535,34 +1535,34 @@ cv-teal_pulse 0:de15ca9e3d9f -0.02 0.14 polish(conversational) cv-teal_pulse 0:b035d3696f4e 0.02 0.14 righttowork:unitedkingdom cv-teal_pulse 0:cfa1d6dd779c -0.06 0.14 availability:1monthnotice cv-teal_pulse 0:b9b8965717b3 -0.15 0.44 compassionatecare.clinicalexcell -cv-terracotta_rail 0:920a88ef5818 0.31 0.14 oliver.bennett@email.com -cv-terracotta_rail 0:a8acc3a90a7b 0.26 0.14 +447700900123 -cv-terracotta_rail 0:e8c463a6c54d 0.33 0.14 bristol,unitedkingdom -cv-terracotta_rail 0:84308bea4540 0.28 0.14 linkedin +cv-terracotta_rail 0:920a88ef5818 0.07 0.14 oliver.bennett@email.com +cv-terracotta_rail 0:a8acc3a90a7b 0.02 0.14 +447700900123 +cv-terracotta_rail 0:e8c463a6c54d -0.03 0.14 bristol,unitedkingdom +cv-terracotta_rail 0:84308bea4540 -0.08 0.14 linkedin cv-terracotta_rail 0:32c1cf49a2fe -0.26 0.04 skills -cv-terracotta_rail 0:4e1fe6feb1d5 0.30 0.10 architecturaldesign -cv-terracotta_rail 0:4b1ce58ed984 0.31 0.10 conceptdevelopment -cv-terracotta_rail 0:e8386273ac51 0.32 -0.02 planningapplications -cv-terracotta_rail 0:09033be5db1b 0.33 0.10 technicaldrawings -cv-terracotta_rail 0:de4e9e607840 0.37 -0.02 revit -cv-terracotta_rail 0:de4e9e607840#1 0.33 0.42 revit -cv-terracotta_rail 0:50f08e64c5a6 0.38 0.10 autocad -cv-terracotta_rail 0:50f08e64c5a6#1 0.36 0.42 autocad -cv-terracotta_rail 0:af7c811cbfce 0.39 0.10 bimcoordination -cv-terracotta_rail 0:531b7caeda92 0.40 0.10 designpresentations -cv-terracotta_rail 0:bfcd894f9698 0.41 -0.02 projectdelivery -cv-terracotta_rail 0:9a1192ab93d0 0.42 -0.02 stakeholdermanagement -cv-terracotta_rail 0:48fe07df4f1c 0.43 -0.02 sustainabledesign -cv-terracotta_rail 0:95626582af55 0.32 0.10 buildingregulations +cv-terracotta_rail 0:4e1fe6feb1d5 -0.06 0.10 architecturaldesign +cv-terracotta_rail 0:4b1ce58ed984 0.07 0.10 conceptdevelopment +cv-terracotta_rail 0:e8386273ac51 0.08 -0.02 planningapplications +cv-terracotta_rail 0:09033be5db1b 0.09 0.10 technicaldrawings +cv-terracotta_rail 0:de4e9e607840 0.13 -0.02 revit +cv-terracotta_rail 0:de4e9e607840#1 -0.03 0.42 revit +cv-terracotta_rail 0:50f08e64c5a6 0.02 0.10 autocad +cv-terracotta_rail 0:50f08e64c5a6#1 0.12 0.42 autocad +cv-terracotta_rail 0:af7c811cbfce 0.03 0.10 bimcoordination +cv-terracotta_rail 0:531b7caeda92 0.04 0.10 designpresentations +cv-terracotta_rail 0:bfcd894f9698 0.05 -0.02 projectdelivery +cv-terracotta_rail 0:9a1192ab93d0 0.06 -0.02 stakeholdermanagement +cv-terracotta_rail 0:48fe07df4f1c 0.07 -0.02 sustainabledesign +cv-terracotta_rail 0:95626582af55 0.08 0.10 buildingregulations cv-terracotta_rail 0:35390f5453e8 -0.15 0.04 software -cv-terracotta_rail 0:2d5d6ea604fd 0.37 0.42 rhino -cv-terracotta_rail 0:5971b0dc0625 0.38 0.42 sketchup -cv-terracotta_rail 0:e9d09d8ff5bb 0.39 0.42 adobeindesign -cv-terracotta_rail 0:3f4a09b92ccf 0.40 0.42 photoshop -cv-terracotta_rail 0:3abe8752b2c0 0.41 0.42 microsoftoffice +cv-terracotta_rail 0:2d5d6ea604fd 0.13 0.42 rhino +cv-terracotta_rail 0:5971b0dc0625 0.02 0.42 sketchup +cv-terracotta_rail 0:e9d09d8ff5bb 0.03 0.42 adobeindesign +cv-terracotta_rail 0:3f4a09b92ccf 0.04 0.42 photoshop +cv-terracotta_rail 0:3abe8752b2c0 0.05 0.42 microsoftoffice cv-terracotta_rail 0:e831beb04c00 -0.19 0.04 certifications -cv-terracotta_rail 0:3ad949ee8543 0.29 0.42 arbregisteredarchitect -cv-terracotta_rail 0:fa807066704f 0.30 0.42 ribacharteredmember +cv-terracotta_rail 0:3ad949ee8543 0.05 0.42 arbregisteredarchitect +cv-terracotta_rail 0:fa807066704f 0.06 0.42 ribacharteredmember cv-terracotta_rail 0:676dfdd56ad2 -0.15 0.04 additionalinformation cv-terracotta_rail 0:705ab1a9cb61 -0.13 0.06 languages: cv-terracotta_rail 0:9ee0e2dddc94 -0.19 0.06 english(native), @@ -1803,16 +1803,16 @@ cv-violet_grid 0:e35242c809c8 -1.45 0.04 portuguese cv-violet_grid 0:c5d1de4964d6 -1.32 0.08 conversational cv-violet_grid 0:1de4fede4f63 -1.21 -0.38 idesignwithempathy,iteratewithpu invoice-classic 0:c26c22b94338 0.51 0.00 graphcomposestudio -invoice-classic 0:c26c22b94338#1 0.34 0.01 graphcomposestudio -invoice-classic 0:2a08ce5567fb 0.41 0.00 18layoutstreet +invoice-classic 0:c26c22b94338#1 0.10 0.01 graphcomposestudio +invoice-classic 0:2a08ce5567fb 0.17 0.00 18layoutstreet invoice-classic 0:2a08ce5567fb#1 0.05 0.01 18layoutstreet invoice-classic 0:52d6e3de4fa0 0.30 0.01 invoice -invoice-classic 0:38e9951985e4 0.32 0.01 gc-2026-041 -invoice-classic 0:20fe884effee 0.35 0.01 issued02apr2026 +invoice-classic 0:38e9951985e4 0.20 0.01 gc-2026-041 +invoice-classic 0:20fe884effee 0.23 0.01 issued02apr2026 invoice-classic 0:57a66d21eb1b 0.36 0.04 totaldue -invoice-classic 0:30d85a94548c 0.39 0.04 invoicegc-2026-041issued02apr202 +invoice-classic 0:30d85a94548c 0.03 0.04 invoicegc-2026-041issued02apr202 invoice-classic 0:aeba3a7b3598 0.40 0.00 billto -invoice-classic 0:f890faef907f 0.34 0.00 northwindsystems +invoice-classic 0:f890faef907f 0.10 0.00 northwindsystems invoice-classic 0:1b405eb431ca 0.05 0.00 attn:financeteam invoice-classic 0:91eefd794f79 -0.03 0.00 410marketavenue invoice-classic 0:00a97da4e243 0.02 0.00 manchester,uk @@ -1857,18 +1857,18 @@ invoice-classic 0:434cc906ae90 0.26 0.04 billing@graphcompose.devfor invoice-classic 0:8822ea375315 0.15 0.04 remittancedetails. invoice-classic 0:1a7b5c840e25 0.16 0.07 •latepaymentsmaydelayadditional invoice-classic 0:1631a06d245f 0.17 0.04 templatecustomizationwork. -invoice-classic 0:e3337beaa171 0.28 0.00 thankyouforchoosinggraphcomposef +invoice-classic 0:e3337beaa171 0.04 0.00 thankyouforchoosinggraphcomposef invoice-classic_long 0:c26c22b94338 0.51 0.00 graphcomposestudio -invoice-classic_long 0:c26c22b94338#1 0.34 0.01 graphcomposestudio -invoice-classic_long 0:2a08ce5567fb 0.41 0.00 18layoutstreet +invoice-classic_long 0:c26c22b94338#1 0.10 0.01 graphcomposestudio +invoice-classic_long 0:2a08ce5567fb 0.17 0.00 18layoutstreet invoice-classic_long 0:2a08ce5567fb#1 0.05 0.01 18layoutstreet invoice-classic_long 0:52d6e3de4fa0 0.30 0.01 invoice -invoice-classic_long 0:3594d2085950 0.32 0.01 gc-2026-042 -invoice-classic_long 0:25851a973edd 0.35 0.01 issued04may2026 +invoice-classic_long 0:3594d2085950 0.20 0.01 gc-2026-042 +invoice-classic_long 0:25851a973edd 0.23 0.01 issued04may2026 invoice-classic_long 0:57a66d21eb1b 0.36 0.04 totaldue -invoice-classic_long 0:9eea1e05ff47 0.39 0.04 invoicegc-2026-042issued04may202 +invoice-classic_long 0:9eea1e05ff47 0.03 0.04 invoicegc-2026-042issued04may202 invoice-classic_long 0:aeba3a7b3598 0.40 0.00 billto -invoice-classic_long 0:f890faef907f 0.34 0.00 northwindsystems +invoice-classic_long 0:f890faef907f 0.10 0.00 northwindsystems invoice-classic_long 0:1b405eb431ca 0.05 0.00 attn:financeteam invoice-classic_long 0:91eefd794f79 -0.03 0.00 410marketavenue invoice-classic_long 0:00a97da4e243 0.02 0.00 manchester,uk @@ -2023,7 +2023,7 @@ invoice-classic_long 1:24274f39b50b 0.30 0.07 •paymentduewithin14calendardays. invoice-classic_long 1:c438440ba377 0.31 0.07 •banktransferpreferred;contact invoice-classic_long 1:434cc906ae90 0.32 0.04 billing@graphcompose.devfor invoice-classic_long 1:8822ea375315 0.33 0.04 remittancedetails. -invoice-classic_long 1:e3337beaa171 0.29 0.00 thankyouforchoosinggraphcomposef +invoice-classic_long 1:e3337beaa171 0.17 0.00 thankyouforchoosinggraphcomposef invoice-consulting 0:d44ceaea97d1 0.26 0.02 level8,1collinsstreet invoice-consulting 0:78a0bb33347f 0.33 0.02 melbournevic3000australia invoice-consulting 0:3b45ab243edb 0.51 0.02 +61398765432 @@ -2042,15 +2042,15 @@ invoice-consulting 0:28447bbc85e1 0.00 0.09 digitalstrategyengagement invoice-consulting 0:d7523d00af19 -0.02 0.08 ponumber: invoice-consulting 0:80a06a9ef12d 0.20 0.09 po-7892 invoice-consulting 0:aef9b6cb1bcd 0.24 -0.02 billedto -invoice-consulting 0:3fc5213307f9 0.16 -0.02 greenfieldindustriesltd. +invoice-consulting 0:3fc5213307f9 0.04 -0.02 greenfieldindustriesltd. invoice-consulting 0:37d614eaf852 0.14 -0.02 accountspayabledepartment invoice-consulting 0:c438c5ffc681 0.12 -0.02 12innovationdrive invoice-consulting 0:89f5b4615dc3 0.16 -0.02 melbournevic3000 invoice-consulting 0:c585f1decb98 0.20 -0.02 australia invoice-consulting 0:4438ad217dea 0.25 -0.02 email:ap@greenfield.com.au invoice-consulting 0:cfebda697822 0.24 0.17 invoicesummary -invoice-consulting 0:5656f37a9311 0.44 0.17 professionalservicesrenderedinac -invoice-consulting 0:a918299ac844 0.45 0.17 statementofworkfortheperiod +invoice-consulting 0:5656f37a9311 0.20 0.17 professionalservicesrenderedinac +invoice-consulting 0:a918299ac844 0.21 0.17 statementofworkfortheperiod invoice-consulting 0:3fa8489d9aac 0.21 0.17 1may2025–25may2025. invoice-consulting 0:c9046f7a37ad 0.74 -0.54 description invoice-consulting 0:b28225a1247c 0.74 -0.56 serviceperiod @@ -2107,13 +2107,13 @@ invoice-consulting 0:83a417f0862b 1.05 0.04 123-456 invoice-consulting 0:6b4894c28363 1.05 -0.04 accountnumber: invoice-consulting 0:ef797c8118f0 1.05 0.04 12345678 invoice-consulting 0:c608665436db 1.05 -0.04 reference: -invoice-consulting 0:010450dee1ff 1.08 -0.02 pleaseensuretheinvoicenumberisin +invoice-consulting 0:010450dee1ff 0.60 -0.02 pleaseensuretheinvoicenumberisin invoice-consulting 0:ab5aa97074c4 0.61 0.10 notes invoice-consulting 0:7c6ab37d83ef 0.53 0.10 thankyouforyourbusiness. -invoice-consulting 0:4a699e29a3bb 0.81 0.10 ifyouhaveanyquestionsregardingth -invoice-consulting 0:c766251af1f4 0.75 0.10 contactusataccounts@northpoint.c -invoice-consulting 0:3d32fa219332 0.84 0.10 +61398765432. -invoice-consulting 0:a6f6e2ddab6d 1.00 0.10 paymentisduewithin30daysfromthei +invoice-consulting 0:4a699e29a3bb 0.45 0.10 ifyouhaveanyquestionsregardingth +invoice-consulting 0:c766251af1f4 0.51 0.10 contactusataccounts@northpoint.c +invoice-consulting 0:3d32fa219332 0.60 0.10 +61398765432. +invoice-consulting 0:a6f6e2ddab6d 1.12 0.10 paymentisduewithin30daysfromthei invoice-consulting 0:55ee5fe62c33 0.15 0.06 northpointconsultingptyltd|abn12 invoice-consulting 0:bdbada284e80 0.15 0.16 page1/1 invoice-consulting_long 0:d44ceaea97d1 0.26 0.02 level8,1collinsstreet @@ -2133,15 +2133,15 @@ invoice-consulting_long 0:28447bbc85e1 0.00 0.09 digitalstrategyengagement invoice-consulting_long 0:d7523d00af19 -0.02 0.08 ponumber: invoice-consulting_long 0:80a06a9ef12d 0.20 0.09 po-7892 invoice-consulting_long 0:aef9b6cb1bcd 0.24 -0.02 billedto -invoice-consulting_long 0:3fc5213307f9 0.16 -0.02 greenfieldindustriesltd. +invoice-consulting_long 0:3fc5213307f9 0.04 -0.02 greenfieldindustriesltd. invoice-consulting_long 0:37d614eaf852 0.14 -0.02 accountspayabledepartment invoice-consulting_long 0:c438c5ffc681 0.12 -0.02 12innovationdrive invoice-consulting_long 0:89f5b4615dc3 0.16 -0.02 melbournevic3000 invoice-consulting_long 0:c585f1decb98 0.20 -0.02 australia invoice-consulting_long 0:4438ad217dea 0.25 -0.02 email:ap@greenfield.com.au invoice-consulting_long 0:cfebda697822 0.24 0.17 invoicesummary -invoice-consulting_long 0:5656f37a9311 0.44 0.17 professionalservicesrenderedinac -invoice-consulting_long 0:a918299ac844 0.45 0.17 statementofworkfortheperiod +invoice-consulting_long 0:5656f37a9311 0.20 0.17 professionalservicesrenderedinac +invoice-consulting_long 0:a918299ac844 0.21 0.17 statementofworkfortheperiod invoice-consulting_long 0:3fa8489d9aac 0.21 0.17 1may2025–25may2025. invoice-consulting_long 0:c9046f7a37ad 0.74 -0.54 description invoice-consulting_long 0:b28225a1247c 0.74 -0.56 serviceperiod @@ -2343,13 +2343,13 @@ invoice-consulting_long 1:6b4894c28363 0.92 -0.04 accountnumber: invoice-consulting_long 1:ef797c8118f0 0.92 0.04 12345678 invoice-consulting_long 1:c608665436db 0.92 -0.04 reference: invoice-consulting_long 1:7d66eb3c1070 0.92 0.04 inv-2025-0478 -invoice-consulting_long 1:010450dee1ff 0.95 -0.02 pleaseensuretheinvoicenumberisin +invoice-consulting_long 1:010450dee1ff 0.47 -0.02 pleaseensuretheinvoicenumberisin invoice-consulting_long 1:ab5aa97074c4 0.63 0.10 notes invoice-consulting_long 1:7c6ab37d83ef 0.43 0.10 thankyouforyourbusiness. -invoice-consulting_long 1:4a699e29a3bb 0.71 0.10 ifyouhaveanyquestionsregardingth -invoice-consulting_long 1:c766251af1f4 0.77 0.10 contactusataccounts@northpoint.c -invoice-consulting_long 1:3d32fa219332 0.71 0.10 +61398765432. -invoice-consulting_long 1:a6f6e2ddab6d 0.87 0.10 paymentisduewithin30daysfromthei +invoice-consulting_long 1:4a699e29a3bb 0.47 0.10 ifyouhaveanyquestionsregardingth +invoice-consulting_long 1:c766251af1f4 0.41 0.10 contactusataccounts@northpoint.c +invoice-consulting_long 1:3d32fa219332 0.47 0.10 +61398765432. +invoice-consulting_long 1:a6f6e2ddab6d 0.99 0.10 paymentisduewithin30daysfromthei invoice-consulting_long 1:55ee5fe62c33 0.15 0.06 northpointconsultingptyltd|abn12 invoice-consulting_long 1:1bed6052d9b3 0.15 0.16 page2/2 invoice-luma_studio 0:ac5742bfd7c4 -0.23 -0.05 &co. @@ -2365,7 +2365,7 @@ invoice-luma_studio 0:2474519f77a9#2 -0.21 -0.01 unitedkingdom invoice-luma_studio 0:89b5eccb38ff 0.14 0.01 +44(0)2079460832 invoice-luma_studio 0:ea8232890494 0.14 0.01 hello@lumaandco.studio invoice-luma_studio 0:374d89493adc 0.03 0.01 www.lumaandco.studio -invoice-luma_studio 0:be3e8b44676d -0.13 0.01 companyno.12578934|vatno.3694567 +invoice-luma_studio 0:be3e8b44676d -0.25 0.01 companyno.12578934|vatno.3694567 invoice-luma_studio 0:52d6e3de4fa0 -0.23 0.07 invoice invoice-luma_studio 0:6bb089477e20 0.28 0.07 invoiceno. invoice-luma_studio 0:4435610d8a9f 0.28 0.11 inv-2024-0587 @@ -2435,7 +2435,7 @@ invoice-luma_studio 0:eeb53247f32c -0.53 0.08 ofluma&co.studiountilpayment invoice-luma_studio 0:9eef22d7d34e -0.60 0.08 hasbeenreceivedinfull. invoice-luma_studio 0:3c7ade679fdf 0.03 0.05 paymentdetails invoice-luma_studio 0:b1819c9cd5bf -0.29 0.05 pleasemakepaymentbybanktransfert -invoice-luma_studio 0:8c1e4a24f6a8 0.07 0.05 luma&co.studioltd +invoice-luma_studio 0:8c1e4a24f6a8 -0.17 0.05 luma&co.studioltd invoice-luma_studio 0:4381dc2ab142 -0.03 0.05 bank invoice-luma_studio 0:447827e26127 -0.03 0.12 starlingbank invoice-luma_studio 0:10aeacde20ff -0.03 0.05 sortcode @@ -2462,7 +2462,7 @@ invoice-luma_studio_long 0:2474519f77a9#2 -0.21 -0.01 unitedkingdom invoice-luma_studio_long 0:89b5eccb38ff 0.14 0.01 +44(0)2079460832 invoice-luma_studio_long 0:ea8232890494 0.14 0.01 hello@lumaandco.studio invoice-luma_studio_long 0:374d89493adc 0.03 0.01 www.lumaandco.studio -invoice-luma_studio_long 0:be3e8b44676d -0.13 0.01 companyno.12578934|vatno.3694567 +invoice-luma_studio_long 0:be3e8b44676d -0.25 0.01 companyno.12578934|vatno.3694567 invoice-luma_studio_long 0:52d6e3de4fa0 -0.23 0.07 invoice invoice-luma_studio_long 0:6bb089477e20 0.28 0.07 invoiceno. invoice-luma_studio_long 0:4435610d8a9f 0.28 0.11 inv-2024-0587 @@ -2627,7 +2627,7 @@ invoice-luma_studio_long 2:eeb53247f32c -0.41 0.08 ofluma&co.studiountilpayment invoice-luma_studio_long 2:9eef22d7d34e -0.36 0.08 hasbeenreceivedinfull. invoice-luma_studio_long 2:3c7ade679fdf 0.25 0.05 paymentdetails invoice-luma_studio_long 2:b1819c9cd5bf -0.05 0.05 pleasemakepaymentbybanktransfert -invoice-luma_studio_long 2:8c1e4a24f6a8 0.18 0.05 luma&co.studioltd +invoice-luma_studio_long 2:8c1e4a24f6a8 -0.06 0.05 luma&co.studioltd invoice-luma_studio_long 2:4381dc2ab142 0.09 0.05 bank invoice-luma_studio_long 2:447827e26127 0.09 0.12 starlingbank invoice-luma_studio_long 2:10aeacde20ff 0.09 0.05 sortcode @@ -2835,9 +2835,9 @@ invoice-metered 0:e28672d64882 0.05 0.01 northwindcloudservicesltd.isasub invoice-metered 0:985e43c2de34 0.01 0.01 120riversideway,bristol,bs16qt,u invoice-metered 0:7b14b8d2c5c4 0.11 0.11 page1of1 invoice-modern 0:52d6e3de4fa0 0.18 0.00 invoice -invoice-modern 0:30d85a94548c 0.31 0.00 invoicegc-2026-041issued02apr202 +invoice-modern 0:30d85a94548c -0.05 0.00 invoicegc-2026-041issued02apr202 invoice-modern 0:75857a458999 0.27 -0.04 from -invoice-modern 0:c26c22b94338 0.22 -0.04 graphcomposestudio +invoice-modern 0:c26c22b94338 -0.02 -0.04 graphcomposestudio invoice-modern 0:2a08ce5567fb -0.08 -0.04 18layoutstreet invoice-modern 0:fbeea547d99e -0.15 -0.04 london,uk invoice-modern 0:faf1569a98e9 -0.11 -0.04 ec1a4gc @@ -2845,7 +2845,7 @@ invoice-modern 0:befc6e9b5c24 -0.18 -0.04 billing@graphcompose.dev invoice-modern 0:89674e6f130e -0.26 -0.04 +442055551000 invoice-modern 0:a2b2e7d2906f -0.21 -0.04 taxidgb-99887766 invoice-modern 0:aeba3a7b3598 0.27 0.01 billto -invoice-modern 0:f890faef907f 0.22 0.01 northwindsystems +invoice-modern 0:f890faef907f -0.02 0.01 northwindsystems invoice-modern 0:1b405eb431ca -0.08 0.01 attn:financeteam invoice-modern 0:91eefd794f79 -0.15 0.01 410marketavenue invoice-modern 0:00a97da4e243 -0.11 0.01 manchester,uk @@ -2887,19 +2887,19 @@ invoice-modern 0:434cc906ae90 0.02 0.04 billing@graphcompose.devfor invoice-modern 0:8822ea375315 0.03 0.04 remittancedetails. invoice-modern 0:1a7b5c840e25 0.04 0.07 •latepaymentsmaydelayadditional invoice-modern 0:1631a06d245f 0.05 0.04 templatecustomizationwork. -invoice-modern 0:e3337beaa171 0.09 -0.04 thankyouforchoosinggraphcomposef +invoice-modern 0:e3337beaa171 -0.15 -0.04 thankyouforchoosinggraphcomposef invoice-modern_long 0:52d6e3de4fa0 0.18 0.00 invoice -invoice-modern_long 0:61a964e78950 0.31 0.00 invoicegc-2026-042issued04may202 -invoice-modern_long 0:62a2fed3d6e0 0.32 0.00 pending +invoice-modern_long 0:61a964e78950 -0.05 0.00 invoicegc-2026-042issued04may202 +invoice-modern_long 0:62a2fed3d6e0 -0.04 0.00 pending invoice-modern_long 0:75857a458999 0.28 -0.04 from -invoice-modern_long 0:c26c22b94338 0.23 -0.04 graphcomposestudio +invoice-modern_long 0:c26c22b94338 -0.01 -0.04 graphcomposestudio invoice-modern_long 0:2a08ce5567fb -0.07 -0.04 18layoutstreet invoice-modern_long 0:fbeea547d99e -0.14 -0.04 london,uk invoice-modern_long 0:faf1569a98e9 -0.22 -0.04 ec1a4gc invoice-modern_long 0:befc6e9b5c24 -0.17 -0.04 billing@graphcompose.dev invoice-modern_long 0:89674e6f130e -0.25 -0.04 +442055551000 invoice-modern_long 0:aeba3a7b3598 0.28 0.01 billto -invoice-modern_long 0:f890faef907f 0.23 0.01 northwindsystems +invoice-modern_long 0:f890faef907f -0.01 0.01 northwindsystems invoice-modern_long 0:1b405eb431ca -0.07 0.01 attn:financeteam invoice-modern_long 0:91eefd794f79 -0.14 0.01 410marketavenue invoice-modern_long 0:00a97da4e243 -0.22 0.01 manchester,uk @@ -3049,7 +3049,7 @@ invoice-modern_long 1:24274f39b50b 0.26 0.07 •paymentduewithin14calendardays. invoice-modern_long 1:c438440ba377 0.27 0.07 •banktransferpreferred;contact invoice-modern_long 1:434cc906ae90 0.28 0.04 billing@graphcompose.devfor invoice-modern_long 1:8822ea375315 0.29 0.04 remittancedetails. -invoice-modern_long 1:e3337beaa171 0.33 -0.04 thankyouforchoosinggraphcomposef +invoice-modern_long 1:e3337beaa171 0.09 -0.04 thankyouforchoosinggraphcomposef invoice-obsidian 0:07f15cde5b18 0.11 -0.04 kestrel invoice-obsidian 0:52d6e3de4fa0 0.15 -0.04 invoice invoice-obsidian 0:5d1d1b79af09 -0.01 0.11 invoicenumber @@ -3348,18 +3348,18 @@ invoice-platform 0:cf0a1e1dc87b -0.47 0.37 500harbourstreet,vancouver,bcv6c invoice-platform 0:7b14b8d2c5c4 0.11 0.38 page1of1 invoice-subscription 0:435df6fdbffd 0.18 0.04 halstead invoice-subscription 0:52d6e3de4fa0 0.16 -0.43 invoice -invoice-subscription 0:0a36c1665b7e 0.31 0.04 halsteadsoftwareltd. -invoice-subscription 0:6bc2056359b7 0.30 0.04 18chandlerrow -invoice-subscription 0:776a7e9eb92a 0.31 0.04 leedsls14qt -invoice-subscription 0:2474519f77a9 0.31 0.04 unitedkingdom -invoice-subscription 0:2474519f77a9#1 0.57 0.04 unitedkingdom -invoice-subscription 0:2474519f77a9#2 0.57 0.12 unitedkingdom +invoice-subscription 0:0a36c1665b7e 0.07 0.04 halsteadsoftwareltd. +invoice-subscription 0:6bc2056359b7 0.06 0.04 18chandlerrow +invoice-subscription 0:776a7e9eb92a 0.07 0.04 leedsls14qt +invoice-subscription 0:2474519f77a9 0.07 0.04 unitedkingdom +invoice-subscription 0:2474519f77a9#1 0.33 0.04 unitedkingdom +invoice-subscription 0:2474519f77a9#2 0.33 0.12 unitedkingdom invoice-subscription 0:bfdec553b85a 0.32 0.04 billing@halstead.example invoice-subscription 0:78acb3cb907b 0.32 0.04 www.halstead.example invoice-subscription 0:f1c030eb4329 0.43 0.04 vatnogb418227603 invoice-subscription 0:77ead61b5875 0.37 0.06 invoiceno invoice-subscription 0:0b0c0ee24de8 0.34 0.68 hs-inv-2026-0417 -invoice-subscription 0:0b0c0ee24de8#1 0.80 1.48 hs-inv-2026-0417 +invoice-subscription 0:0b0c0ee24de8#1 0.56 1.48 hs-inv-2026-0417 invoice-subscription 0:8feaf8016bab 0.32 0.06 issuedate invoice-subscription 0:4d49cb78b810 0.41 0.60 27august2026 invoice-subscription 0:ac10f8c16320 0.39 0.06 duedate @@ -3369,15 +3369,15 @@ invoice-subscription 0:56a2e019b8aa 0.44 0.36 14days invoice-subscription 0:466e5b9cd57f 0.54 0.06 currency invoice-subscription 0:54f8e1b3fe44 0.51 0.24 gbp invoice-subscription 0:aeba3a7b3598 0.59 0.04 billto -invoice-subscription 0:7bfc2b791f41 0.42 0.04 northlineconsultingltd -invoice-subscription 0:7bfc2b791f41#1 0.42 0.12 northlineconsultingltd -invoice-subscription 0:bcb7024f74fe 0.55 0.04 attn:sarahmitchell -invoice-subscription 0:13dd937d2fe6 0.56 0.04 21jubileeway -invoice-subscription 0:f9bab6a0b45b 0.56 0.04 londonse13ss +invoice-subscription 0:7bfc2b791f41 0.18 0.04 northlineconsultingltd +invoice-subscription 0:7bfc2b791f41#1 0.18 0.12 northlineconsultingltd +invoice-subscription 0:bcb7024f74fe 0.31 0.04 attn:sarahmitchell +invoice-subscription 0:13dd937d2fe6 0.32 0.04 21jubileeway +invoice-subscription 0:f9bab6a0b45b 0.32 0.04 londonse13ss invoice-subscription 0:725a8f5062e7 0.59 0.12 shipto -invoice-subscription 0:254289ce0191 0.55 0.12 thefoundry,2ndfloor -invoice-subscription 0:84db1f48facb 0.56 0.12 17-19greatsuffolkstreet -invoice-subscription 0:e7a5f0717d99 0.56 0.12 londonse10ns +invoice-subscription 0:254289ce0191 0.31 0.12 thefoundry,2ndfloor +invoice-subscription 0:84db1f48facb 0.32 0.12 17-19greatsuffolkstreet +invoice-subscription 0:e7a5f0717d99 0.32 0.12 londonse10ns invoice-subscription 0:c9046f7a37ad 0.60 0.06 description invoice-subscription 0:32e8369a9c4f 0.60 0.04 qty invoice-subscription 0:d1062d072acd 0.60 0.01 unitprice @@ -3413,19 +3413,19 @@ invoice-subscription 0:14edcfc20351 0.77 0.35 £189.40 invoice-subscription 0:57a66d21eb1b 0.74 0.12 totaldue invoice-subscription 0:cf1b68cc49ef 0.95 0.80 £1,136.40 invoice-subscription 0:3c7ade679fdf 0.97 0.04 paymentdetails -invoice-subscription 0:56ed021beb35 0.86 0.19 beneficiary -invoice-subscription 0:0b85f3c8ed04 0.80 0.20 halsteadsoftwareltd -invoice-subscription 0:4381dc2ab142 0.86 0.77 bank -invoice-subscription 0:6d50b2dd724f 0.80 0.94 northgatebank -invoice-subscription 0:10aeacde20ff 0.86 1.06 sortcode -invoice-subscription 0:b19b1415ef9b 0.80 1.16 40-05-30 -invoice-subscription 0:f92a9c925024 0.86 1.23 accountnumber -invoice-subscription 0:ef797c8118f0 0.80 1.23 12345678 -invoice-subscription 0:52367a6622b1 0.86 1.43 reference -invoice-subscription 0:04f7247e8e99 0.74 0.04 pleaseincludetheinvoicenumberast +invoice-subscription 0:56ed021beb35 0.50 0.19 beneficiary +invoice-subscription 0:0b85f3c8ed04 0.56 0.20 halsteadsoftwareltd +invoice-subscription 0:4381dc2ab142 0.50 0.77 bank +invoice-subscription 0:6d50b2dd724f 0.56 0.94 northgatebank +invoice-subscription 0:10aeacde20ff 0.50 1.06 sortcode +invoice-subscription 0:b19b1415ef9b 0.56 1.16 40-05-30 +invoice-subscription 0:f92a9c925024 0.50 1.23 accountnumber +invoice-subscription 0:ef797c8118f0 0.56 1.23 12345678 +invoice-subscription 0:52367a6622b1 0.50 1.43 reference +invoice-subscription 0:04f7247e8e99 0.50 0.04 pleaseincludetheinvoicenumberast invoice-subscription 0:7c6ab37d83ef 0.89 0.01 thankyouforyourbusiness. -invoice-subscription 0:354ffeb2bbc3 0.79 0.01 paymentisdueby10september2026.if -invoice-subscription 0:7f7d98088133 0.81 0.01 foranyqueries,pleasecontactbilli +invoice-subscription 0:354ffeb2bbc3 0.55 0.01 paymentisdueby10september2026.if +invoice-subscription 0:7f7d98088133 0.69 0.01 foranyqueries,pleasecontactbilli invoice-subscription 0:7b14b8d2c5c4 0.09 0.04 page1of1 invoice-workspace 0:07f15cde5b18 -0.12 0.05 kestrel invoice-workspace 0:07f15cde5b18#1 -0.14 0.05 kestrel @@ -3517,7 +3517,7 @@ invoice-workspace 0:18e82fbd48a3 -0.31 -0.01 questionsaboutthisinvoice?reachu invoice-workspace 0:3c72ba0e1eb8 -0.32 0.06 500howardstreet,6thfloor,sanfran invoice-workspace 0:9e2917e23527 -0.31 -0.10 kestrel.example invoice-workspace 0:7b14b8d2c5c4 0.08 -0.16 page1of1 -letter-blue_banner 0:8f1010120ed6 0.50 0.04 jordanrivera +letter-blue_banner 0:8f1010120ed6 0.02 0.04 jordanrivera letter-blue_banner 0:8f1010120ed6#1 0.08 0.00 jordanrivera letter-blue_banner 0:8d7a2cca3060 -0.18 0.05 +442055551000|jordan.rivera@exam letter-blue_banner 0:bef81b541365 -0.14 0.00 dearhiringteamatnorthwindsystems @@ -3528,18 +3528,18 @@ letter-blue_banner 0:eae27893a255 -0.39 0.00 therestoftheteam. letter-blue_banner 0:a71e98216baa -0.05 0.00 iwouldwelcometheopportunitytobri letter-blue_banner 0:80a6a628ad52 -0.08 0.00 sincerely, letter-boxed_sections 0:8f1010120ed6 0.58 0.22 jordanrivera -letter-boxed_sections 0:8f1010120ed6#1 0.37 0.00 jordanrivera +letter-boxed_sections 0:8f1010120ed6#1 0.13 0.00 jordanrivera letter-boxed_sections 0:8d7a2cca3060 0.26 0.07 +442055551000|jordan.rivera@exam -letter-boxed_sections 0:bef81b541365 0.25 0.00 dearhiringteamatnorthwindsystems +letter-boxed_sections 0:bef81b541365 0.13 0.00 dearhiringteamatnorthwindsystems letter-boxed_sections 0:ab54410ead82 0.07 0.00 iamexcitedtosharemyinterestinthe letter-boxed_sections 0:9185168d2cf8 0.11 0.00 document-generationsystemsthatba letter-boxed_sections 0:5fb2802723b6 0.05 0.00 ienjoytranslatingfuzzyworkflowre letter-boxed_sections 0:dab2d688b7ab 0.09 0.00 adoptioneasierfortherestofthetea -letter-boxed_sections 0:a71e98216baa 0.39 0.00 iwouldwelcometheopportunitytobri -letter-boxed_sections 0:80a6a628ad52 0.32 0.00 sincerely, -letter-centered_headline 0:8f1010120ed6 0.16 0.10 jordanrivera +letter-boxed_sections 0:a71e98216baa 0.15 0.00 iwouldwelcometheopportunitytobri +letter-boxed_sections 0:80a6a628ad52 0.20 0.00 sincerely, +letter-centered_headline 0:8f1010120ed6 0.04 0.10 jordanrivera letter-centered_headline 0:8f1010120ed6#1 0.00 0.00 jordanrivera -letter-centered_headline 0:2d58f0cadc2d 0.15 0.49 platformengineer +letter-centered_headline 0:2d58f0cadc2d 0.03 0.49 platformengineer letter-centered_headline 0:8d7a2cca3060 -0.25 0.72 +442055551000|jordan.rivera@exam letter-centered_headline 0:bef81b541365 -0.19 0.00 dearhiringteamatnorthwindsystems letter-centered_headline 0:ab54410ead82 -0.02 0.00 iamexcitedtosharemyinterestinthe @@ -3549,15 +3549,15 @@ letter-centered_headline 0:dab2d688b7ab 0.00 0.00 adoptioneasierfortherestofthet letter-centered_headline 0:a71e98216baa -0.07 0.00 iwouldwelcometheopportunitytobri letter-centered_headline 0:80a6a628ad52 0.00 0.00 sincerely, letter-classic_serif 0:8f1010120ed6 0.15 0.09 jordanrivera -letter-classic_serif 0:8f1010120ed6#1 0.03 0.00 jordanrivera -letter-classic_serif 0:8d7a2cca3060 0.25 -0.65 +442055551000|jordan.rivera@exam -letter-classic_serif 0:bef81b541365 0.17 0.00 dearhiringteamatnorthwindsystems +letter-classic_serif 0:8f1010120ed6#1 -0.09 0.00 jordanrivera +letter-classic_serif 0:8d7a2cca3060 0.01 -0.65 +442055551000|jordan.rivera@exam +letter-classic_serif 0:bef81b541365 0.05 0.00 dearhiringteamatnorthwindsystems letter-classic_serif 0:ab54410ead82 -0.09 0.00 iamexcitedtosharemyinterestinthe letter-classic_serif 0:9185168d2cf8 -0.16 0.00 document-generationsystemsthatba letter-classic_serif 0:a463bced3db2 -0.06 0.00 ienjoytranslatingfuzzyworkflowre letter-classic_serif 0:dd474e249222 -0.13 0.00 makeadoptioneasierfortherestofth -letter-classic_serif 0:a71e98216baa 0.09 0.00 iwouldwelcometheopportunitytobri -letter-classic_serif 0:80a6a628ad52 0.08 0.00 sincerely, +letter-classic_serif 0:a71e98216baa -0.03 0.00 iwouldwelcometheopportunitytobri +letter-classic_serif 0:80a6a628ad52 -0.04 0.00 sincerely, letter-compact_mono 0:8f1010120ed6 0.37 -0.02 jordanrivera letter-compact_mono 0:8f1010120ed6#1 -0.04 0.00 jordanrivera letter-compact_mono 0:f9e4560bd641 -0.28 -0.02 london,uk/+442055551000/jordan.r @@ -3566,18 +3566,18 @@ letter-compact_mono 0:1382a6e37675 -0.35 0.00 ienjoytranslatingfuzzyworkflowre letter-compact_mono 0:d8e633770b49 -0.31 0.00 easierfortherestoftheteam. letter-compact_mono 0:a71e98216baa -0.12 0.00 iwouldwelcometheopportunitytobri letter-compact_mono 0:80a6a628ad52 -0.16 0.00 sincerely, -letter-editorial_blue 0:8f1010120ed6 0.44 -0.01 jordanrivera -letter-editorial_blue 0:8f1010120ed6#1 0.22 0.00 jordanrivera -letter-editorial_blue 0:2d58f0cadc2d 0.23 0.07 platformengineer -letter-editorial_blue 0:1b28eb6a9a2e 0.12 -0.02 +442055551000-london,uk -letter-editorial_blue 0:8817bf9310b6 0.19 0.07 jordan.rivera@example.com|linked -letter-editorial_blue 0:bef81b541365 0.26 0.00 dearhiringteamatnorthwindsystems +letter-editorial_blue 0:8f1010120ed6 -0.04 -0.01 jordanrivera +letter-editorial_blue 0:8f1010120ed6#1 0.10 0.00 jordanrivera +letter-editorial_blue 0:2d58f0cadc2d 0.11 0.07 platformengineer +letter-editorial_blue 0:1b28eb6a9a2e 0.00 -0.02 +442055551000-london,uk +letter-editorial_blue 0:8817bf9310b6 -0.05 0.07 jordan.rivera@example.com|linked +letter-editorial_blue 0:bef81b541365 0.02 0.00 dearhiringteamatnorthwindsystems letter-editorial_blue 0:ab54410ead82 -0.14 0.00 iamexcitedtosharemyinterestinthe letter-editorial_blue 0:9185168d2cf8 -0.09 0.00 document-generationsystemsthatba letter-editorial_blue 0:0c42fe9f3491 -0.13 0.00 ienjoytranslatingfuzzyworkflowre letter-editorial_blue 0:dda41d31bb3c -0.08 0.00 thatmakeadoptioneasierfortherest -letter-editorial_blue 0:a71e98216baa 0.24 0.00 iwouldwelcometheopportunitytobri -letter-editorial_blue 0:80a6a628ad52 0.19 0.00 sincerely, +letter-editorial_blue 0:a71e98216baa 0.00 0.00 iwouldwelcometheopportunitytobri +letter-editorial_blue 0:80a6a628ad52 -0.05 0.00 sincerely, letter-engineering_resume 0:8f1010120ed6 -0.04 0.02 jordanrivera letter-engineering_resume 0:8f1010120ed6#1 -0.04 0.00 jordanrivera letter-engineering_resume 0:2d58f0cadc2d -0.20 0.02 platformengineer @@ -3606,31 +3606,31 @@ letter-executive 0:7c5a9817c868 0.12 0.00 iwouldwelcometheopportunitytobri letter-executive 0:4012eb4b05db 0.07 0.00 group. letter-executive 0:80a6a628ad52 -0.02 0.00 sincerely, letter-mint-editorial-letter 0:8f1010120ed6 -0.18 -0.16 jordanrivera -letter-mint-editorial-letter 0:8f1010120ed6#1 0.09 0.00 jordanrivera +letter-mint-editorial-letter 0:8f1010120ed6#1 -0.03 0.00 jordanrivera letter-mint-editorial-letter 0:2d58f0cadc2d 0.01 -0.68 platformengineer -letter-mint-editorial-letter 0:bef81b541365 0.06 0.00 dearhiringteamatnorthwindsystems -letter-mint-editorial-letter 0:ab54410ead82 0.34 0.00 iamexcitedtosharemyinterestinthe -letter-mint-editorial-letter 0:9185168d2cf8 0.32 0.00 document-generationsystemsthatba -letter-mint-editorial-letter 0:a463bced3db2 0.24 0.00 ienjoytranslatingfuzzyworkflowre -letter-mint-editorial-letter 0:dd474e249222 0.22 0.00 makeadoptioneasierfortherestofth +letter-mint-editorial-letter 0:bef81b541365 -0.06 0.00 dearhiringteamatnorthwindsystems +letter-mint-editorial-letter 0:ab54410ead82 -0.02 0.00 iamexcitedtosharemyinterestinthe +letter-mint-editorial-letter 0:9185168d2cf8 -0.04 0.00 document-generationsystemsthatba +letter-mint-editorial-letter 0:a463bced3db2 0.00 0.00 ienjoytranslatingfuzzyworkflowre +letter-mint-editorial-letter 0:dd474e249222 -0.02 0.00 makeadoptioneasierfortherestofth letter-mint-editorial-letter 0:a71e98216baa 0.02 0.00 iwouldwelcometheopportunitytobri -letter-mint-editorial-letter 0:80a6a628ad52 0.09 0.00 sincerely, +letter-mint-editorial-letter 0:80a6a628ad52 -0.03 0.00 sincerely, letter-modern_professional 0:8f1010120ed6 0.18 0.13 jordanrivera -letter-modern_professional 0:8f1010120ed6#1 0.24 0.00 jordanrivera +letter-modern_professional 0:8f1010120ed6#1 0.12 0.00 jordanrivera letter-modern_professional 0:89ff05847e96 0.14 0.00 london,uk|+442055551000 letter-modern_professional 0:8817bf9310b6 0.09 0.13 jordan.rivera@example.com|linked -letter-modern_professional 0:bef81b541365 0.29 0.00 dearhiringteamatnorthwindsystems -letter-modern_professional 0:c65db8c80e17 -0.10 0.00 iamexcitedtosharemyinterestinthe +letter-modern_professional 0:bef81b541365 0.05 0.00 dearhiringteamatnorthwindsystems +letter-modern_professional 0:c65db8c80e17 0.02 0.00 iamexcitedtosharemyinterestinthe letter-modern_professional 0:c8d01ef84078 0.10 0.00 reusabledocument-generationsyste letter-modern_professional 0:2e5ddee14dbc -0.05 0.00 ienjoytranslatingfuzzyworkflowre letter-modern_professional 0:906501a5e847 0.03 0.00 examplesthatmakeadoptioneasierfo letter-modern_professional 0:7c5a9817c868 0.00 0.00 iwouldwelcometheopportunitytobri letter-modern_professional 0:4012eb4b05db 0.08 0.00 group. -letter-modern_professional 0:80a6a628ad52 0.29 0.00 sincerely, -letter-monogram_sidebar 0:136c67657614 0.18 0.06 jordan -letter-monogram_sidebar 0:8ba35ebe3d5c 0.22 0.12 rivera +letter-modern_professional 0:80a6a628ad52 0.17 0.00 sincerely, +letter-monogram_sidebar 0:136c67657614 0.06 0.06 jordan +letter-monogram_sidebar 0:8ba35ebe3d5c 0.10 0.12 rivera letter-monogram_sidebar 0:2d58f0cadc2d -0.20 -0.69 platformengineer -letter-monogram_sidebar 0:8d7a2cca3060 -0.08 0.35 +442055551000|jordan.rivera@exam +letter-monogram_sidebar 0:8d7a2cca3060 -0.20 0.35 +442055551000|jordan.rivera@exam letter-monogram_sidebar 0:bef81b541365 -0.10 0.00 dearhiringteamatnorthwindsystems letter-monogram_sidebar 0:ab54410ead82 0.05 0.00 iamexcitedtosharemyinterestinthe letter-monogram_sidebar 0:9185168d2cf8 0.02 0.00 document-generationsystemsthatba @@ -3656,7 +3656,7 @@ letter-nordic_clean 0:a71e98216baa -0.10 0.00 iwouldwelcometheopportunitytobri letter-nordic_clean 0:80a6a628ad52 -0.11 0.00 sincerely, letter-panel 0:8f1010120ed6 0.06 0.25 jordanrivera letter-panel 0:8f1010120ed6#1 0.09 0.00 jordanrivera -letter-panel 0:2d58f0cadc2d -0.14 -0.05 platformengineer +letter-panel 0:2d58f0cadc2d -0.26 -0.05 platformengineer letter-panel 0:89ff05847e96 -0.16 0.30 london,uk|+442055551000 letter-panel 0:8817bf9310b6 -0.20 0.36 jordan.rivera@example.com|linked letter-panel 0:bef81b541365 -0.06 0.00 dearhiringteamatnorthwindsystems @@ -3667,9 +3667,9 @@ letter-panel 0:dda41d31bb3c -0.28 0.00 thatmakeadoptioneasierfortherest letter-panel 0:7c5a9817c868 -0.12 0.00 iwouldwelcometheopportunitytobri letter-panel 0:4012eb4b05db -0.12 0.00 group. letter-panel 0:80a6a628ad52 0.13 0.00 sincerely, -letter-sidebar_portrait 0:8f1010120ed6 0.04 -0.01 jordanrivera +letter-sidebar_portrait 0:8f1010120ed6 -0.08 -0.01 jordanrivera letter-sidebar_portrait 0:8f1010120ed6#1 -0.11 0.00 jordanrivera -letter-sidebar_portrait 0:2d58f0cadc2d -0.19 -0.33 platformengineer +letter-sidebar_portrait 0:2d58f0cadc2d -0.31 -0.33 platformengineer letter-sidebar_portrait 0:8d7a2cca3060 -0.29 0.72 +442055551000|jordan.rivera@exam letter-sidebar_portrait 0:bef81b541365 -0.29 0.00 dearhiringteamatnorthwindsystems letter-sidebar_portrait 0:ab54410ead82 -0.52 0.00 iamexcitedtosharemyinterestinthe @@ -3711,7 +3711,7 @@ proposal-editorial 0:d28f860aec04 0.43 0.00 ourprocessblendsstrategicthinkin proposal-editorial 0:53fcd88ebb00 0.38 0.00 cohesivebrandsystemandamodern,co proposal-editorial 0:95bad9757a67 0.33 0.00 outcomewillbeaclear,confidentpre proposal-editorial 0:8863e2b998da 0.40 0.00 improvesengagement,andsupportsyo -proposal-editorial 0:f16c2c2f1999 0.49 0.00 projectgoals +proposal-editorial 0:f16c2c2f1999 0.37 0.00 projectgoals proposal-editorial 0:c008ab0ba85f 0.17 0.08 projectduration proposal-editorial 0:5a6b4bf425f2 -0.01 0.08 6weeks proposal-editorial 0:7aa73e5c14d3 0.31 0.08 startwindow @@ -3733,7 +3733,7 @@ proposal-editorial 0:04b5995c746f -0.08 0.20 touchpoints. proposal-editorial 0:b45d848fe1b6 1.94 0.36 buildascalabledigital proposal-editorial 0:e8228bfeba0e 0.93 0.36 foundationforfuture proposal-editorial 0:1fa35c7a1402 -0.08 0.36 growth. -proposal-editorial 0:bc981abcdf59 0.70 0.00 scopeofwork +proposal-editorial 0:bc981abcdf59 0.58 0.00 scopeofwork proposal-editorial 0:28450edd9a4f 0.41 -0.02 discovery&research proposal-editorial 0:ce9012b74aa2 0.74 0.04 stakeholderinterviews,brandaudit proposal-editorial 0:730c3e278933 0.53 0.04 audienceinsightstoinformstrategy @@ -3753,7 +3753,7 @@ proposal-editorial 0:026890c58de9 0.12 0.00 northlinestudio|northlinestudio. proposal-editorial 1:5205c2a261bc 0.41 0.02 northline proposal-editorial 1:da0daaba4b15 0.32 0.02 studio proposal-editorial 1:ecd1378bc9dc -0.18 -1.05 proposal -proposal-editorial 1:e35c32bb5ed8 0.38 0.00 deliverables +proposal-editorial 1:e35c32bb5ed8 0.26 0.00 deliverables proposal-editorial 1:23eb79a19b39 0.14 0.36 brandstrategysummary proposal-editorial 1:aaa2a6073d69 0.10 0.36 refinedlogosuite&brandguidelines proposal-editorial 1:d626f7532564 0.06 0.48 color,typography&designsystem @@ -3764,7 +3764,7 @@ proposal-editorial 1:d524c1a0811d 0.17 -0.01 mobile proposal-editorial 1:8b712e7e93bf 0.08 0.51 contentstrategy&pagetemplates proposal-editorial 1:e9bf06d9b130 0.04 0.39 developer-readyassets&specificat proposal-editorial 1:e93e7ba95ceb 0.12 0.39 launchchecklist&trainingsession -proposal-editorial 1:94d192b3a326 0.47 0.00 timeline +proposal-editorial 1:94d192b3a326 0.35 0.00 timeline proposal-editorial 1:02195b8e9896 0.38 -0.04 phase proposal-editorial 1:c51faa148557 0.38 0.07 focus proposal-editorial 1:caa79af4db67 0.38 0.07 duration @@ -3816,7 +3816,7 @@ proposal-editorial 1:5414e5671cbd 0.61 0.08 projectandschedulethekick-off. proposal-editorial 1:832db31f5c9a 0.64 0.48 includestworoundsofrevisionsper proposal-editorial 1:5130aeada3db 0.67 0.08 majordeliverable. proposal-editorial 1:06ebb5670fa8 0.40 0.60 ownershipofallfinaldeliverables -proposal-editorial 1:deda6d86d965 0.79 0.08 transferstoasterahealthco.after +proposal-editorial 1:deda6d86d965 0.67 0.08 transferstoasterahealthco.after proposal-editorial 1:aaa7d3e9affb 0.32 0.08 fullpaymentisreceived. proposal-editorial 1:c1514c6cdad1 1.66 0.00 acceptance proposal-editorial 1:893663b06769 1.30 0.00 bysigningbelow,youagreetothescop @@ -3895,26 +3895,26 @@ proposal-indigo 0:732bcbb66cec 0.83 -0.01 kestrelpaymentsltd proposal-indigo 0:3898e7b5f79b 0.78 -0.01 7harbourcircus,canarywharf,londo proposal-indigo 0:29208032c874 0.77 -0.01 kestrel.example/business|busines proposal-modern 0:ecd1378bc9dc 0.18 0.00 proposal -proposal-modern 0:f592a683c61d 0.31 0.00 documentplatformconsolidation -proposal-modern 0:bbe07492ee1f 0.28 0.00 proposalgc-p-2026-014prepared02a +proposal-modern 0:f592a683c61d 0.05 0.00 documentplatformconsolidation +proposal-modern 0:bbe07492ee1f 0.04 0.00 proposalgc-p-2026-014prepared02a proposal-modern 0:566835ed7fba 0.25 -0.04 executivesummary -proposal-modern 0:7ccf0e6c59fa 0.23 -0.04 aphasedengagementtoretireper-tea +proposal-modern 0:7ccf0e6c59fa 0.11 -0.04 aphasedengagementtoretireper-tea proposal-modern 0:75857a458999 0.30 -0.04 from -proposal-modern 0:c26c22b94338 0.24 -0.04 graphcomposestudio +proposal-modern 0:c26c22b94338 0.00 -0.04 graphcomposestudio proposal-modern 0:2a08ce5567fb -0.05 -0.04 18layoutstreet proposal-modern 0:fbeea547d99e -0.13 -0.04 london,uk proposal-modern 0:3c8401edb4cc -0.08 -0.04 hello@graphcompose.dev proposal-modern 0:89674e6f130e -0.13 -0.04 +442055551000 proposal-modern 0:213a61c7aeb6 -0.20 -0.04 graphcompose.dev -proposal-modern 0:f890faef907f 0.24 0.01 northwindsystems +proposal-modern 0:f890faef907f 0.00 0.01 northwindsystems proposal-modern 0:577a7fcdaa02 -0.05 0.01 attn:procurement proposal-modern 0:91eefd794f79 -0.13 0.01 410marketavenue proposal-modern 0:3daace874084 -0.08 0.01 procurement@northwind.example -proposal-modern 0:5f161c914988 0.31 -0.04 scope -proposal-modern 0:9e580657f485 0.10 -0.04 discovery,architecture,andarefer -proposal-modern 0:cec9111de36d 0.25 -0.04 approach -proposal-modern 0:3215ea3be6d9 0.16 -0.04 iterativedeliverywithweeklycheck -proposal-modern 0:94d192b3a326 0.31 -0.04 timeline +proposal-modern 0:5f161c914988 -0.05 -0.04 scope +proposal-modern 0:9e580657f485 -0.02 -0.04 discovery,architecture,andarefer +proposal-modern 0:cec9111de36d -0.11 -0.04 approach +proposal-modern 0:3215ea3be6d9 -0.08 -0.04 iterativedeliverywithweeklycheck +proposal-modern 0:94d192b3a326 -0.05 -0.04 timeline proposal-modern 0:02195b8e9896 0.14 0.00 phase proposal-modern 0:caa79af4db67 0.14 0.06 duration proposal-modern 0:41ffd8b76afc 0.14 0.01 details @@ -3926,7 +3926,7 @@ proposal-modern 0:44575cf5b285 0.24 0.04 build proposal-modern 0:44575cf5b285#1 0.24 0.04 build proposal-modern 0:5a6b4bf425f2 0.24 -0.02 6weeks proposal-modern 0:7a802048127d 0.24 0.05 engine+templatemigration -proposal-modern 0:f9b21c4bda58 0.33 -0.04 investment +proposal-modern 0:f9b21c4bda58 -0.03 -0.04 investment proposal-modern 0:4a33eacd5fa6 0.16 0.00 item proposal-modern 0:c9046f7a37ad 0.16 0.06 description proposal-modern 0:cf38d95c9c6b 0.16 1.12 amount @@ -3934,10 +3934,10 @@ proposal-modern 0:fe9b6b4f133b 0.19 -0.02 workshops+auditgbp6,000 proposal-modern 0:62e788ae3916 0.24 -0.02 engine+templatesgbp24,000 proposal-modern 0:11239872d178 0.12 0.00 total proposal-modern 0:1c3065490625 0.12 1.12 gbp30,000 -proposal-modern 0:63feb7230a5d 0.35 -0.04 acceptanceterms +proposal-modern 0:63feb7230a5d -0.01 -0.04 acceptanceterms proposal-modern 0:35046a9f5675 0.26 0.00 •50%onsignature,50%ondelivery. proposal-modern 0:f03c1877ea2b 0.27 0.00 •validfor30daysfromthepreparedda -proposal-modern 0:90572e911376 0.19 -0.04 thankyouforconsideringgraphcompo +proposal-modern 0:90572e911376 0.07 -0.04 thankyouforconsideringgraphcompo proposal-northline 0:5205c2a261bc -0.43 0.04 northline proposal-northline 0:da0daaba4b15 -0.43 0.04 studio proposal-northline 0:ecd1378bc9dc -0.34 0.21 proposal @@ -4061,9 +4061,9 @@ proposal-northline 1:832db31f5c9a 0.05 0.50 includestworoundsofrevisionsper proposal-northline 1:5130aeada3db 0.10 0.10 majordeliverable. proposal-northline 1:ffce6ed7e6e5 0.09 0.50 finalfilesandhandoffdeliveredupo proposal-northline 1:566f68df6dd8 0.14 0.10 finalpayment. -proposal-northline 1:06ebb5670fa8 0.49 0.62 ownershipofallfinaldeliverables -proposal-northline 1:5312201597c1 0.78 0.10 transferstoasterahealthco.afterf -proposal-northline 1:d31e8d77a816 0.30 0.10 paymentisreceived. +proposal-northline 1:06ebb5670fa8 0.01 0.62 ownershipofallfinaldeliverables +proposal-northline 1:5312201597c1 0.30 0.10 transferstoasterahealthco.afterf +proposal-northline 1:d31e8d77a816 -0.06 0.10 paymentisreceived. proposal-northline 1:c1514c6cdad1 0.61 0.12 acceptance proposal-northline 1:893663b06769 0.88 0.04 bysigningbelow,youagreetothescop proposal-northline 1:df16232de5b9 0.86 0.04 acceptedby: @@ -4072,31 +4072,31 @@ proposal-northline 1:c74c9cd82f13 0.86 0.09 date: proposal-northline 1:026890c58de9 0.10 0.00 northlinestudio|northlinestudio. receipt-modern 0:2b019b5b46da 0.29 -0.04 northwindpay receipt-modern 0:a3c304a23bb1 0.23 0.00 transferconfirmation -receipt-modern 0:e885a92f5bb7 0.17 0.01 generatedon09august2026 -receipt-modern 0:c288dd6df716 0.11 -0.08 referencenwp-4821-0067 +receipt-modern 0:e885a92f5bb7 -0.07 0.01 generatedon09august2026 +receipt-modern 0:c288dd6df716 -0.01 -0.08 referencenwp-4821-0067 receipt-modern 0:9de2a2d7cd7a 0.21 0.04 amountcollected -receipt-modern 0:465691680b99 0.17 0.04 £66.62 +receipt-modern 0:465691680b99 0.05 0.04 £66.62 receipt-modern 0:465691680b99#1 0.35 -0.92 £66.62 receipt-modern 0:465691680b99#2 0.34 -0.92 £66.62 -receipt-modern 0:4260e5ae365d 0.24 0.04 directdebitcollectedbyharbourfin +receipt-modern 0:4260e5ae365d 0.00 0.04 directdebitcollectedbyharbourfin receipt-modern 0:4ddb3e96801a 0.21 0.16 completed -receipt-modern 0:a22e6dacae05 0.29 0.05 valuedate07jul2026 -receipt-modern 0:53becbb168d1 0.32 0.12 operationdate07jul2026 -receipt-modern 0:b311cb4017a4 0.35 0.03 schemebacsdirectdebit +receipt-modern 0:a22e6dacae05 0.05 0.05 valuedate07jul2026 +receipt-modern 0:53becbb168d1 0.08 0.12 operationdate07jul2026 +receipt-modern 0:b311cb4017a4 0.11 0.03 schemebacsdirectdebit receipt-modern 0:1bd90283f7fe 0.22 0.04 paidfrom -receipt-modern 0:0293c2cdfa58 0.23 0.04 alexsample +receipt-modern 0:0293c2cdfa58 -0.01 0.04 alexsample receipt-modern 0:85d2c9e53e92 0.00 0.04 12exampleway receipt-modern 0:db3b3fcfe2d1 -0.01 0.04 brentfordtw00aa receipt-modern 0:2474519f77a9 -0.02 0.04 unitedkingdom -receipt-modern 0:a3570420c75d 0.41 0.04 account••••4396 -receipt-modern 0:d2f5582b8015 0.44 0.04 sortcode00-00-00 +receipt-modern 0:a3570420c75d 0.17 0.04 account••••4396 +receipt-modern 0:d2f5582b8015 0.20 0.04 sortcode00-00-00 receipt-modern 0:c4ab31d8c668 0.27 0.10 paidto -receipt-modern 0:c032ca75a3a7 0.28 0.10 harbourfinanceltd +receipt-modern 0:c032ca75a3a7 0.04 0.10 harbourfinanceltd receipt-modern 0:995c51cebabe -0.06 0.10 1samplequay receipt-modern 0:f05e0b2f4fe3 -0.07 0.10 manchesterm00aa -receipt-modern 0:597533badf94 0.35 0.10 account••••5604 -receipt-modern 0:a5938b687682 0.38 0.10 sortcode00-00-11 -receipt-modern 0:5434155c0fda 0.35 -0.04 transferdetails +receipt-modern 0:597533badf94 0.11 0.10 account••••5604 +receipt-modern 0:a5938b687682 0.26 0.10 sortcode00-00-11 +receipt-modern 0:5434155c0fda 0.11 -0.04 transferdetails receipt-modern 0:a4d7978db2aa 0.35 -0.04 mandatereference receipt-modern 0:0123b9cf310f 0.35 -0.90 mnd-0110-8054-5652 receipt-modern 0:3840804e6235 0.42 -0.04 transactionid @@ -4105,22 +4105,22 @@ receipt-modern 0:2cbaa23e0a56 0.37 -0.04 paymentscheme receipt-modern 0:1477cb720a28 0.37 -0.94 bacsdirectdebit receipt-modern 0:1fa78044a7da 0.32 -0.04 statementdescription receipt-modern 0:b77918146dd3 0.32 -0.83 harbourfin4821 -receipt-modern 0:c72294b34f1a 0.47 -0.04 amountbreakdown +receipt-modern 0:c72294b34f1a 0.23 -0.04 amountbreakdown receipt-modern 0:cf38d95c9c6b 0.35 -0.04 amount receipt-modern 0:dc40efafaeb3 0.44 -0.04 transferfee receipt-modern 0:3a82ba6903c6 0.44 -0.84 £0.00 receipt-modern 0:1cdd81427c35 0.39 -0.04 exchangerate receipt-modern 0:0311534a9954 0.39 -0.80 1.00gbp/gbp receipt-modern 0:c1dc9f641ca3 0.34 -0.04 totaldebited -receipt-modern 0:de149c2431a2 0.37 -0.04 paymentprogress +receipt-modern 0:de149c2431a2 0.25 -0.04 paymentprogress receipt-modern 0:4568e72e6bfd 0.45 0.04 instructed -receipt-modern 0:c5f62da028cc 0.26 0.04 07jul2026,08:12bst·collectionreq +receipt-modern 0:c5f62da028cc 0.14 0.04 07jul2026,08:12bst·collectionreq receipt-modern 0:788d0109e065 0.38 0.04 inclearing -receipt-modern 0:7cb44e46733a 0.31 0.04 08jul2026,09:00bst·three-working +receipt-modern 0:7cb44e46733a 0.07 0.04 08jul2026,09:00bst·three-working receipt-modern 0:d31e014808ec 0.43 0.04 settled -receipt-modern 0:06cb75439693 0.36 0.04 09jul2026,06:30bst·fundsdebiteda -receipt-modern 0:ab5aa97074c4 0.44 -0.04 notes -receipt-modern 0:a8da22f90eac 0.33 -0.04 keepthisconfirmationforyourrecor +receipt-modern 0:06cb75439693 0.12 0.04 09jul2026,06:30bst·fundsdebiteda +receipt-modern 0:ab5aa97074c4 0.20 -0.04 notes +receipt-modern 0:a8da22f90eac 0.09 -0.04 keepthisconfirmationforyourrecor receipt-modern 0:59941ac03c12 0.39 0.02 scantocheckthisconfirmationagain receipt-modern 0:868e2517782a 0.06 0.02 support+442000000000 receipt-modern 0:94d25770d489 0.07 0.02 help@northwind-pay.example diff --git a/qa/src/test/resources/docx-fidelity/word-windows.tsv b/qa/src/test/resources/docx-fidelity/word-windows.tsv index 6cda589cd..8e436d8cb 100644 --- a/qa/src/test/resources/docx-fidelity/word-windows.tsv +++ b/qa/src/test/resources/docx-fidelity/word-windows.tsv @@ -1,64 +1,64 @@ # word 16.0 (16.0.20430) on windows document engine_pages editor_pages lines matched median p90 over2 -cv-blue_banner 2 2 54 52 0.12 0.46 0 -cv-boxed_sections 2 2 58 58 0.28 0.45 0 +cv-blue_banner 2 2 54 52 0.11 0.35 0 +cv-boxed_sections 2 2 58 58 0.24 0.45 0 cv-centered_headline 2 2 58 56 0.11 0.26 0 cv-charcoal_gold 1 1 85 83 0.18 0.27 0 -cv-classic_serif 2 2 57 54 0.31 0.44 0 -cv-compact_mono 1 1 58 58 0.16 0.36 0 -cv-editorial_blue 2 2 82 82 0.14 0.27 0 +cv-classic_serif 2 2 57 54 0.19 0.39 0 +cv-compact_mono 1 1 58 58 0.15 0.32 0 +cv-editorial_blue 2 2 82 82 0.10 0.21 0 cv-engineering_resume 1 1 57 57 0.22 0.34 0 -cv-executive 2 2 60 60 0.21 0.43 0 +cv-executive 2 2 60 60 0.19 0.34 0 cv-midnight_navy 1 1 86 84 0.22 0.82 0 -cv-minimal_underlined 2 2 59 59 0.44 0.70 0 -cv-mint_editorial 2 2 59 59 0.13 0.31 0 -cv-modern_professional 2 2 61 59 0.32 0.44 0 -cv-monogram_sidebar 1 1 53 50 0.20 0.39 0 +cv-minimal_underlined 2 2 59 59 0.38 0.70 0 +cv-mint_editorial 2 2 59 59 0.08 0.19 0 +cv-modern_professional 2 2 61 59 0.18 0.43 0 +cv-monogram_sidebar 1 1 53 50 0.19 0.39 0 cv-navy_sidebar 1 1 71 69 0.13 0.36 0 cv-nordic_clean 1 1 63 58 0.16 0.35 0 cv-orange_ops 1 1 108 106 0.22 0.47 0 -cv-panel 1 1 79 74 0.46 0.82 0 +cv-panel 1 1 79 74 0.43 0.82 0 cv-professional_sidebar 1 1 68 64 0.30 0.49 0 cv-serif_headline 1 1 103 103 0.50 1.03 0 cv-sidebar_portrait 1 1 49 49 0.15 0.29 0 cv-slate_orange 1 1 87 85 0.40 1.17 0 cv-teal_pulse 1 1 57 57 0.11 0.38 0 -cv-terracotta_rail 1 1 102 102 0.42 0.87 0 +cv-terracotta_rail 1 1 102 102 0.36 0.87 0 cv-timeline_minimal 2 2 89 87 0.36 0.47 0 cv-violet_grid 1 1 80 78 0.23 0.42 0 -invoice-classic 1 1 56 56 0.22 0.36 0 -invoice-classic_long 2 2 166 166 0.27 0.34 0 -invoice-consulting 1 1 92 92 0.70 1.02 0 -invoice-consulting_long 2 2 236 236 0.74 0.97 0 -invoice-luma_studio 1 1 97 97 0.13 0.42 0 +invoice-classic 1 1 56 56 0.19 0.30 0 +invoice-classic_long 2 2 166 166 0.26 0.33 0 +invoice-consulting 1 1 92 92 0.61 1.02 0 +invoice-consulting_long 2 2 236 236 0.74 0.99 0 +invoice-luma_studio 1 1 97 97 0.14 0.42 0 invoice-luma_studio_long 3 3 192 192 0.22 0.38 0 invoice-merchant 1 1 94 94 0.13 0.25 0 invoice-metered 1 1 99 99 0.14 0.57 0 -invoice-modern 1 1 54 54 0.09 0.22 0 -invoice-modern_long 2 2 162 162 0.23 0.31 0 +invoice-modern 1 1 54 54 0.08 0.21 0 +invoice-modern_long 2 2 162 162 0.22 0.31 0 invoice-obsidian 1 1 81 81 0.28 0.76 0 invoice-payments 1 1 104 104 0.09 0.20 0 invoice-platform 1 1 111 111 0.19 0.41 0 -invoice-subscription 1 1 81 81 0.61 0.86 0 +invoice-subscription 1 1 81 81 0.56 0.72 0 invoice-workspace 1 1 90 90 0.14 0.32 0 -letter-blue_banner 1 1 10 10 0.39 0.50 0 -letter-boxed_sections 1 1 10 10 0.26 0.39 0 +letter-blue_banner 1 1 10 10 0.18 0.41 0 +letter-boxed_sections 1 1 10 10 0.13 0.26 0 letter-centered_headline 1 1 11 11 0.03 0.19 0 -letter-classic_serif 1 1 10 10 0.13 0.17 0 +letter-classic_serif 1 1 10 10 0.09 0.15 0 letter-compact_mono 1 1 10 8 0.28 0.35 0 -letter-editorial_blue 1 1 12 12 0.19 0.26 0 +letter-editorial_blue 1 1 12 12 0.08 0.13 0 letter-engineering_resume 1 1 15 15 0.13 0.31 0 letter-executive 1 1 12 12 0.12 0.24 0 -letter-mint-editorial-letter 1 1 10 10 0.18 0.32 0 -letter-modern_professional 1 1 12 12 0.10 0.29 0 -letter-monogram_sidebar 1 1 12 12 0.14 0.20 0 +letter-mint-editorial-letter 1 1 10 10 0.03 0.06 0 +letter-modern_professional 1 1 12 12 0.09 0.17 0 +letter-monogram_sidebar 1 1 12 12 0.10 0.20 0 letter-nordic_clean 1 1 15 15 0.16 0.35 0 -letter-panel 1 1 13 13 0.14 0.29 0 +letter-panel 1 1 13 13 0.16 0.29 0 letter-sidebar_portrait 1 1 12 12 0.41 0.52 0 letter-timeline_minimal 1 1 15 15 0.29 0.53 0 proposal-editorial 2 2 132 130 0.57 1.08 0 proposal-indigo 1 1 72 70 0.40 0.62 0 -proposal-modern 1 1 44 44 0.19 0.31 0 -proposal-northline 2 2 132 132 0.27 0.71 0 -receipt-modern 1 1 57 57 0.33 0.43 0 +proposal-modern 1 1 44 44 0.14 0.24 0 +proposal-northline 2 2 132 132 0.27 0.67 0 +receipt-modern 1 1 57 57 0.21 0.39 0 rota-cobalt 1 1 154 154 0.32 0.99 0 diff --git a/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxSemanticBackend.java b/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxSemanticBackend.java index 0037d9c6f..586582108 100644 --- a/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxSemanticBackend.java +++ b/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxSemanticBackend.java @@ -188,6 +188,12 @@ public final class DocxSemanticBackend implements SemanticBackend { private static final double POINT_TO_TWIP = 20.0; /** The least difference between Word's baseline and the page's that is moved: one half point. */ private static final double LEAST_BASELINE_SHIFT_POINTS = 0.5; + /** + * The least raise a line is moved by in the space written above it, in points: Word sets + * lines on a grid of its own, 0.12pt apart (measured), and a twip less of space moves a line + * a step or nothing. + */ + private static final double LEAST_RAISE_INTO_THE_SPACE_ABOVE = 0.1; /** How a drawing the page paints is anchored, as the report says it (see DocxDrawingAnchors). */ private static final String ANCHORED_BESIDE_ITS_TEXT = "anchored in the paragraph whose text it stands " + "beside, so it moves with that text when the text above is edited, or to the page where it " @@ -218,6 +224,13 @@ public final class DocxSemanticBackend implements SemanticBackend { // places them (zonePlacement), not by the lines the body lays a node out in, which the same // node also placed in the body would otherwise lend them. private boolean writingAZoneLine; + // The paragraph written last that the layout moves to a new page: Word drops the space above + // it there (holdAParagraphsTopEdgeOnItsPage), so its line is not moved up into that space. + private ParagraphNode paragraphOpeningItsPage; + // How far the line raised last was moved up into the space above it, in points, and how many + // blocks had been written when it was (raiseOwedByTheLastLine). + private double lastRaise; + private long blocksAtTheLastRaise = -1; // The text bands whose translucent separator is already reported this export: a band is // written into each kind of header or footer Word is given. private final java.util.Set separatorsReported = @@ -384,6 +397,9 @@ public final class DocxSemanticBackend implements SemanticBackend { private String badgeText; // The cell of the panel being written, painted or framed; null outside a panel. private XWPFTableCell panelCell; + // How much of the space above the first paragraph of panelCell its top border takes, in twips + // (writePanelPiece): no room to raise that paragraph's line into (raiseIntoTheSpaceAbove). + private long panelsFirstLineKeeps; // The text style the document is mostly written in, promoted to Word's Normal style. // Null until an export computes it, and when the graph carries no text at all. private DocumentTextStyle documentDefaultStyle; @@ -778,6 +794,10 @@ private byte[] write(List sections, Path outputFile) throws Exc insetRight = 0; cellHang = 0; cellTextShift = 0; + paragraphOpeningItsPage = null; + panelsFirstLineKeeps = 0; + lastRaise = 0; + blocksAtTheLastRaise = -1; nextDrawingId = 100_000; anchors.reset(); writing = null; @@ -5370,12 +5390,18 @@ private void writePanelPiece(XWPFDocument document, DocumentNode node, Container if (first && last) { cutTheLabelToItsOutline(node, borders, cell); } + // What of the top border's reach the padding cannot take comes out of the space above the + // first paragraph (takeTheTopBorderInside, below): that much of it is no room to raise a + // line into. + long outerKeptAbove = panelsFirstLineKeeps; + panelsFirstLineKeeps = Math.max(0, toTwips(topNotTaken) - cellMargin(cell, true)); try { writeInCell(cell, content); } finally { surfaceBehind = outerSurface; currentCellWidth = outerCellWidth; panelCell = outerPanelCell; + panelsFirstLineKeeps = outerKeptAbove; } if (cell.getParagraphs().isEmpty()) { // A panel with nothing Word can hold inside is its padding tall on the page, not a @@ -7062,6 +7088,8 @@ private void owePendingSpacingAfter(double points) { /** Writes the owed space onto the paragraph that owes it, for want of a later one. */ private void flushSpacingAfter() { + // What a raised line owed below it is paid with it (raiseOwedByTheLastLine). + blocksAtTheLastRaise = -1; // A pull out of the paragraph above comes out of what it owes below, as the page sums them. double owed = pendingSpacingAfter - pullBelow; if (owed > 0 && lastBodyParagraph != null) { @@ -7874,6 +7902,7 @@ private void writeParagraph(XWPFDocument document, ParagraphNode node) { } if (currentCell == null && overlayDepth == 0 && startsAPageOfItsOwn(node)) { holdAParagraphsTopEdgeOnItsPage(document, node); + paragraphOpeningItsPage = node; } // Its own sides hold its text in, as a container's do: SerifHeadline's summary stops at // the column divider through its right margin, and without it ran the page's width in @@ -9179,7 +9208,7 @@ private void writeParagraphRuns(XWPFParagraph para, ParagraphNode node, boolean takeThePicturesEdgesFromAround(para, pictures); } } - seatInTheLine(para, node, runsBefore, lineTopAbove + heldAbove, cutToTheInk); + seatInTheLine(para, node, runsBefore, lineTopAbove + heldAbove, cutToTheInk, ownLine); } /** @@ -9314,21 +9343,25 @@ private boolean holdsText(ParagraphNode node) { * is raised as a part of its zone's line ({@link #zonePlacement}).

* *

The baseline the page seats off is not where Word puts it either (see - * {@link #shiftToThePagesBaseline}), and the two moves are one position.

+ * {@link #shiftToThePagesBaseline}): what of that the space above does not take and the + * page's seat are one position.

* * @param runsBefore how many runs the Word paragraph held before this one's were written * @param lineTopAbove how far above the page's first line of the paragraph the Word line * starts, in points * @param heldExact whether the line was held to its pictures' reach * ({@link #holdPicturesInTheLine}), and so is seated however little + * @param ownLine whether the Word paragraph is this paragraph's alone — not a line pair's, + * a stack's or a text box's — and so its line may move for it */ private void seatInTheLine(XWPFParagraph para, ParagraphNode node, int runsBefore, double lineTopAbove, - boolean heldExact) { + boolean heldExact, boolean ownLine) { if (writingAZoneLine) { return; } - raiseRunsFrom(para, runsBefore, Math.round( - (seatShift(node) + shiftToThePagesBaseline(para, node, lineTopAbove, heldExact)) * HALF_POINTS_PER_POINT)); + boolean ownsItsLine = ownLine && runsBefore == 0; + raiseRunsFrom(para, runsBefore, Math.round((seatShift(node) + + shiftToThePagesBaseline(para, node, lineTopAbove, heldExact, ownsItsLine)) * HALF_POINTS_PER_POINT)); } /** @@ -9410,17 +9443,24 @@ private double seatShift(ParagraphNode node) { * gap between lines included, at the paragraph's middle line: where the space above could not * give up a whole gap, Word's lines step a little closer than the page's, and the error is * shared by the first and last. 0 for a paragraph not written at an exact height: Word - * then seats it by its own measure of the face. A difference under - * {@link #LEAST_BASELINE_SHIFT_POINTS} — a quarter point for a line of Lato body text — is - * left as Word sets it: the position counts in half points, and every line of body text - * moved by one would win a quarter point at most.

+ * then seats it by its own measure of the face.

+ * + *

A line of its own Word sets low is raised first by moving it up into the space written + * above it, where that space can take it ({@link #raiseIntoTheSpaceAbove}). What that space + * cannot give, and a line set + * high, is left to the text's position, which counts in half points: a line whose difference + * is under {@link #LEAST_BASELINE_SHIFT_POINTS} — a quarter point for a line of Lato body text + * — keeps no position, as every line of body text moved by one would win a quarter point at + * most.

* * @param lineTopAbove how far above the page's first line the Word line starts, in points * @param heldExact whether the line was cut to its pictures' reach, and so is seated * however little + * @param ownsItsLine whether the Word paragraph holds this paragraph's text alone, and so + * its line can move for it */ private double shiftToThePagesBaseline(XWPFParagraph para, ParagraphNode node, double lineTopAbove, - boolean heldExact) { + boolean heldExact, boolean ownsItsLine) { CTPPr properties = para.getCTP().getPPr(); if (properties == null || !properties.isSetSpacing()) { return 0; @@ -9446,12 +9486,95 @@ private double shiftToThePagesBaseline(XWPFParagraph para, ParagraphNode node, d // to fit its letters where the page sets them, and is seated however little; so // is one cut to its pictures' reach, whose ink stands at its edges. boolean cutToFit = lineTopAbove != 0 || stackedLineHeights.containsKey(node) || heldExact; - return Math.abs(shift) < LEAST_BASELINE_SHIFT_POINTS && !cutToFit ? 0 : shift; + // The position is moved as before where the whole shift called for it, whatever + // the space above took off it: a line 0.6pt low with 0.2pt above it is left a tenth + // off by its position, not four tenths. + boolean moved = Math.abs(shift) >= LEAST_BASELINE_SHIFT_POINTS || cutToFit; + if (ownsItsLine && !cutToFit) { + shift -= raiseIntoTheSpaceAbove(para, node, spacing, shift); + } + return moved ? shift : 0; } } return 0; } + /** + * Raises a paragraph's line by moving it up into the space written above it, by as much of + * {@code raise} as that space holds, and owes as much below the paragraph: the line moves, + * what follows stays. + * + *

A text's position is no way to move it a quarter point. It counts in half points, so a + * line a quarter point low — Helvetica's lines, which the page seats 0.78 of the way down, + * stood 0.12 to 0.38pt low in Word at 8 to 18pt — is moved a half point or not at all. And + * LibreOffice moves raised text further than it is raised, by the face's height over its em: + * Spectral's 1.53 times, Poppins' 1.49, Volkhov's 1.31 (measured), so Spectral's 24pt line, + * raised 4pt, stood 2.4pt high there. Both editors keep a paragraph's space above as written, + * Word on its own 0.12pt grid, and stand an exact line's baseline four fifths of the way down + * it ({@link DocxTextBands#BASELINE_SHARE}): a line moved up that space stands where the page + * sets it in both.

+ * + *

Only a raise: a line moved down takes its room out of the space below it, which is not + * known until what follows is written, and what that space could not take would stand all of + * it lower. Only a line of its own, as its caller raises: not a line pair's, a container's + * stacked lines, a text box's, nor one cut to its pictures. Only a paragraph in the flow or in + * a cell, where the space owed below it is the space above what follows: a band, a layer + * stack, a shape container, a canvas and the text laid over the flow — the overlays — measure + * what follows them from the page ({@link #writeOverlayBand}), and the space a line owed + * inside them would be lost. A column's later layer measures the space to itself from the + * page too, and takes back the raise of the line above it ({@link #raiseOwedByTheLastLine}). + * Not a paragraph the layout moves to a new page: Word drops its space above there + * ({@link #holdAParagraphsTopEdgeOnItsPage}), and what the line owed would stand all below it + * lower. Not a paragraph the layout breaks over a page: its lines on the next page start at + * that page's top, where the space above moves none of them, and what it owed would stand + * what follows them lower. Not the space above a panel's first paragraph that the panel's top + * border takes ({@link #takeTheTopBorderInside}): raised into it, the line would give it back + * and the panel grow by what it owed. Less than {@link #LEAST_RAISE_INTO_THE_SPACE_ABOVE} is + * not moved.

+ * + * @param para the Word paragraph + * @param node the paragraph it is written for + * @param spacing the paragraph's spacing, its space above already written + * @param raise how far Word sets the line below the page's, in points + * @return how far the line was raised, in points + */ + private double raiseIntoTheSpaceAbove(XWPFParagraph para, ParagraphNode node, CTSpacing spacing, + double raise) { + // A band and the text laid over the flow are overlays too (writeOverlayBand, writeOverTheFlow). + if (!(raise >= LEAST_RAISE_INTO_THE_SPACE_ABOVE) || overlayDepth > 0 + || node == paragraphOpeningItsPage || !layout.onOnePage(node)) { + return 0; + } + long room = twipsOf(spacing.isSetBefore() ? spacing.getBefore() : null) + - (opensThePanel(para) ? panelsFirstLineKeeps : 0); + long raised = Math.min(room, Math.round(raise * POINT_TO_TWIP)); + if (raised < Math.round(LEAST_RAISE_INTO_THE_SPACE_ABOVE * POINT_TO_TWIP)) { + return 0; + } + spacing.setBefore(BigInteger.valueOf(twipsOf(spacing.getBefore()) - raised)); + owePendingSpacingAfter(raised / POINT_TO_TWIP); + lastRaise = raised / POINT_TO_TWIP; + blocksAtTheLastRaise = blocksWritten; + return raised / POINT_TO_TWIP; + } + + /** Whether a paragraph is the first thing written in the panel's cell being written. */ + private boolean opensThePanel(XWPFParagraph para) { + return panelCell != null && currentCell == panelCell && !panelCell.getBodyElements().isEmpty() + && panelCell.getBodyElements().get(0) instanceof XWPFParagraph first + && first.getCTP() == para.getCTP(); + } + + /** + * What the line written last owes below it for its raise into the space above it + * ({@link #raiseIntoTheSpaceAbove}), in points, while no block has been written after it: a + * column's later layer measures the space to itself from the page and drops what the layers + * above owe, and the line above it was set that much higher than the page sets it. + */ + private double raiseOwedByTheLastLine() { + return blocksWritten == blocksAtTheLastRaise ? lastRaise : 0; + } + /** * Sets a run's letters closer by the room the shapes beside it take past their boxes. * @@ -12748,10 +12871,12 @@ private void writeLayerColumns(XWPFDocument document, carriedSpacingBefore += node.margin().top() + node.padding().top(); } else { // What the layers above still owe below themselves is space - // the page does not have: the gap to this one is the page's. + // the page does not have: the gap to this one is the page's, + // from a last line set as high as it was raised. + double raised = raiseOwedByTheLastLine(); pendingSpacingAfter = 0; pullBelow = 0; - resumeSpacing = plan.resume(node); + resumeSpacing = plan.resume(node) + raised; } // A column layer is written as what it holds, never dispatched itself: // no bookmark goes round it, though bookmarkedAnchorsIn counts one. @@ -12772,6 +12897,11 @@ < availableWidth() - EDITOR_COLUMN_SLACK_POINTS - 0.5) { } reportWrittenWithout(node, "written as a column of its layer stack", columnLost); writeChildren(document, node.children(), spacingOf(node)); + if (layer > 0 && blocksWritten == blocksBefore && !holdsMovedContent(node)) { + // A later layer that wrote nothing leaves the line above it raised: + // what that line owes below it is still owed in the cell. + pendingSpacingAfter += raiseOwedByTheLastLine(); + } if (layer > 0 && blocksWritten == blocksBefore && holdsMovedContent(node)) { // A layer that wrote nothing — its content all written in an // earlier layer's stand-ins — owes nothing of its own: what the diff --git a/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxTextBands.java b/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxTextBands.java index f707380bd..204ddcc93 100644 --- a/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxTextBands.java +++ b/render-docx/src/main/java/com/demcha/compose/document/backend/semantic/docx/DocxTextBands.java @@ -33,8 +33,10 @@ final class DocxTextBands { * Where both editors stand the baseline in an exact line, as a share of the line from its * top. Measured, it is four fifths of the line whatever the face and size: Spectral, Lato * and Arial at 10 to 46pt, in lines 12 to 100pt tall, within 0.1pt of it in Word and on it in - * LibreOffice. A band's line is placed by it here, and a paragraph's text is moved from it to - * the page's baseline ({@code DocxSemanticBackend#shiftToThePagesBaseline}). + * LibreOffice; and again on the fifteen faces the templates use and JetBrains Mono at 8 to + * 36pt, within 0.04pt of it in Word in median, and in the lines of the DOCX fidelity corpus, + * read off Word's own line tops. A band's line is placed by it here, and a paragraph's text is + * moved from it to the page's baseline ({@code DocxSemanticBackend#shiftToThePagesBaseline}). */ static final double BASELINE_SHARE = 0.8; diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxAdjacentTablesTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxAdjacentTablesTest.java index 5a0aa03eb..0dbe93a63 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxAdjacentTablesTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxAdjacentTablesTest.java @@ -97,9 +97,10 @@ void spaceOwedBelowATableGoesBelowItNotAboveIt() throws Exception { XWPFParagraph title = document.getParagraphs().get(0); var spacing = title.getCTP().getPPr().getSpacing(); - assertThat(spacing == null || !spacing.isSetAfter()) - .as("the card's bottom padding is below its table, not between its title and the table") - .isTrue(); + assertThat(spacing != null && spacing.isSetAfter() ? DocxTwips.of(spacing.getAfter()) : 0) + .as("the card's bottom padding is below its table, not between its title and the table:" + + " only what the title's line owes below it for its raise") + .isEqualTo(DocxExports.DEFAULT_LINE_RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxBaselineSeatTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxBaselineSeatTest.java index 4c813abd3..d615df590 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxBaselineSeatTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxBaselineSeatTest.java @@ -1,6 +1,10 @@ package com.demcha.compose.document.backend.semantic.docx; +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.layout.payloads.ParagraphFragmentPayload; +import com.demcha.compose.document.layout.payloads.ParagraphLine; import com.demcha.compose.document.dsl.ShapeContainerBuilder; import com.demcha.compose.document.node.LayerAlign; import com.demcha.compose.document.style.ClipPolicy; @@ -12,6 +16,8 @@ import org.junit.jupiter.api.Test; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.within; @@ -28,6 +34,12 @@ class DocxBaselineSeatTest { private static final double SPECTRAL_ASCENT = 1.059; /** Spectral's own line, in ems: its ascent and 463 units of descent. */ private static final double SPECTRAL_LINE = 1.522; + /** Lato's ascent, in ems: 1974 of 2000 units. */ + private static final double LATO_ASCENT = 0.987; + /** Poppins' ascent, in ems: 1050 of 1000 units. */ + private static final double POPPINS_ASCENT = 1.05; + /** Gothic A1's ascent, in ems: 798 of 1000 units, its own line one em. */ + private static final double GOTHIC_A1_ASCENT = 0.798; private static DocumentTextStyle spectral(double size) { return DocumentTextStyle.builder().fontName(FontName.SPECTRAL).size(size).build(); @@ -112,19 +124,274 @@ void theHalfOfALinePairSetLowerIsSeatedFromTheLinesTop() throws Exception { @Test void linesThatTookTheirGapFromTheSpaceAboveAreSeatedFromTheHigherTop() throws Exception { // Two lines 10pt apart under 20pt of space: Word's lines take their gaps from above and - // start 10pt above the page's first line. + // start 10pt above the page's first line, and are raised into the 10pt left above them. try (XWPFDocument document = DocxExports.withLayout(240, 600, 20, page -> page .addParagraph(p -> p.text("First line of it and second line of it").textStyle(spectral(20)) .lineSpacing(10).margin(new DocumentInsets(20, 0, 0, 0))))) { XWPFParagraph text = paragraph(document, "First line of it and second line of it"); double line = line(text); + double raise = 0.8 * line - 10 - SPECTRAL_ASCENT * 20; assertThat(line).as("the premise: two lines, each its gap taller").isGreaterThan(40); - assertThat(position(text)).isCloseTo((int) Math.round((0.8 * line - 10 - SPECTRAL_ASCENT * 20) * 2), - within(1)); + assertThat(raise).as("the premise: Word's baseline is the lower, by less than the space left") + .isBetween(0.5, 10.0); + assertThat(before(text)).isCloseTo(Math.round((10 - raise) * 20), within(1L)); + assertThat(position(text)).isZero(); + } + } + + @Test + void aLineWordSetsLowIsRaisedIntoTheSpaceAboveItAndOwesItBelow() throws Exception { + // 20pt above a 30pt Spectral title: Word's baseline stands nearly 5pt below the page's. + // The line moves up that much of the space, to the twip, where its position would move + // it in half points, and LibreOffice that half again; Lato under it, which Word sets high + // and so is never moved down, stands where the page does all the same. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addParagraph(p -> p.text("Lead").textStyle(lato(10))) + .addParagraph(p -> p.text("Title").textStyle(spectral(30)).margin(DocumentInsets.top(20))) + .addParagraph(p -> p.text("Body").textStyle(lato(10))))) { + XWPFParagraph title = paragraph(document, "Title"); + double raise = 0.8 * line(title) - SPECTRAL_ASCENT * 30; + + assertThat(raise).as("the premise: Word's baseline is the lower, by less than the space") + .isBetween(1.0, 20.0); + assertThat(before(title)).isCloseTo(Math.round((20 - raise) * 20), within(1L)); + assertThat(position(title)).as("nothing left to its position").isZero(); + assertThat(before(paragraph(document, "Body"))).as("what the title owes below it") + .isCloseTo(Math.round(raise * 20), within(1L)); + assertThat(position(paragraph(document, "Body"))).isZero(); + } + } + + @Test + void whatTheSpaceAboveCannotGiveIsLeftToThePosition() throws Exception { + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addParagraph(p -> p.text("Lead").textStyle(lato(10))) + .addParagraph(p -> p.text("Title").textStyle(spectral(30)).margin(DocumentInsets.top(2))) + .addParagraph(p -> p.text("Body").textStyle(lato(10))))) { + XWPFParagraph title = paragraph(document, "Title"); + double raise = 0.8 * line(title) - SPECTRAL_ASCENT * 30; + + assertThat(before(title)).as("all of the 2pt").isZero(); + assertThat(position(title)).isCloseTo((int) Math.round((raise - 2) * 2), within(1)); + assertThat(before(paragraph(document, "Body"))).as("the 2pt the line took").isEqualTo(40); + } + } + + @Test + void whatTheSpaceAboveLeavesOfAShiftOverHalfAPointKeepsItsPosition() throws Exception { + // Poppins at 10pt stands 0.7pt low in Word: under 0.4pt of space the line takes the 0.4pt, + // and the 0.3pt left is still moved by its position, a half point, not left 0.3pt low. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addParagraph(p -> p.text("Lead").textStyle(lato(10))) + .addParagraph(p -> p.text("Low").textStyle(DocumentTextStyle.builder().fontName(FontName.POPPINS) + .size(10).build()).margin(DocumentInsets.top(0.4))))) { + XWPFParagraph low = paragraph(document, "Low"); + double raise = 0.8 * line(low) - POPPINS_ASCENT * 10; + + assertThat(raise).as("the premise: over half a point, and the space under it").isBetween(0.5, 0.9); + assertThat(before(low)).isZero(); + assertThat(position(low)).isEqualTo((int) Math.round((raise - 0.4) * 2)).isPositive(); } } + @Test + void aParagraphTheLayoutBreaksOverAPageKeepsTheSpaceAboveIt() throws Exception { + // Its lines on the next page start at that page's top: the space above moves none of them. + String text = "A title long enough to run onto a second line and a third one"; + try (DocumentSession session = GraphCompose.document().pageSize(400, 600).margin(DocumentInsets.of(20)).create()) { + session.pageFlow(page -> page.spacer(1, 500) + .addParagraph(p -> p.name("Broken").text(text).textStyle(spectral(30)).margin(DocumentInsets.top(10)))); + var placed = session.layoutGraph().nodes().stream() + .filter(node -> "Broken".equals(node.semanticName())).findFirst().orElseThrow(); + try (XWPFDocument document = new XWPFDocument( + new java.io.ByteArrayInputStream(session.export(new DocxSemanticBackend())))) { + XWPFParagraph broken = paragraph(document, text); + + assertThat(placed.endPage()).as("the premise: broken over a page").isGreaterThan(placed.startPage()); + assertThat(before(broken)).as("the spacer's height past its hairline, and its own 10pt, whole") + .isEqualTo(Math.round((500 - 0.1 + 10) * 20)); + assertThat(position(broken)).as("raised by its position, on both pages").isPositive(); + } + } + } + + @Test + void aRaiseUnderATenthOfAPointLeavesTheSpaceAboveAsWritten() throws Exception { + // Gothic A1's page seat is within a few hundredths of Word's four fifths: Word sets lines + // on a grid 0.12pt apart, and a twip less of space would move the line a step or nothing. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addParagraph(p -> p.text("Lead").textStyle(lato(10))) + .addParagraph(p -> p.text("Even").textStyle(DocumentTextStyle.builder().fontName(FontName.GOTHIC_A1) + .size(14).build()).margin(DocumentInsets.top(10))))) { + XWPFParagraph even = paragraph(document, "Even"); + double raise = 0.8 * line(even) - GOTHIC_A1_ASCENT * 14; + + assertThat(raise).as("the premise: Word's baseline lower by a twip and more, under a tenth") + .isBetween(0.025, 0.1); + assertThat(before(even)).isEqualTo(200); + } + } + + @Test + void aLineWordSetsHighKeepsTheSpaceAboveIt() throws Exception { + // Lato's ascent is 0.82 of its line: at 24pt Word's baseline stands 0.65pt above the + // page's. Moved down into the space above, the line would take that from the space + // below it, not known yet; it is lowered by its position, the space as written. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addParagraph(p -> p.text("Lead").textStyle(lato(10))) + .addParagraph(p -> p.text("Heading").textStyle(lato(24)).margin(DocumentInsets.top(10))))) { + XWPFParagraph heading = paragraph(document, "Heading"); + double raise = 0.8 * line(heading) - LATO_ASCENT * 24; + + assertThat(raise).as("the premise: Word's baseline is the higher, by more than half a point") + .isLessThan(-0.5); + assertThat(before(heading)).isEqualTo(200); + assertThat(position(heading)).isEqualTo((int) Math.round(raise * 2)); + } + } + + @Test + void aLinePairKeepsTheSpaceAboveTheLineItsHalvesShare() throws Exception { + // A 30pt value, the line's first and tallest text, beside a 12pt label share one Word + // line: the value's raise moved into the space above would move the label with it. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addParagraph(p -> p.text("Above").textStyle(lato(10)).margin(DocumentInsets.bottom(20))) + .add(new ShapeContainerBuilder().name("Row").rectangle(360, 60) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .position(new ParagraphBuilder().name("Value").text("Value").textStyle(spectral(30)).build(), + 0, 0, LayerAlign.CENTER_LEFT) + .position(new ParagraphBuilder().name("Label").text("Label").textStyle(spectral(12)).build(), + 0, 0, LayerAlign.CENTER_RIGHT) + .build()))) { + XWPFParagraph pair = document.getParagraphs().stream() + .filter(paragraph -> paragraph.getText().contains("Value")).findFirst().orElseThrow(); + CTR value = pair.getRuns().stream().filter(run -> run.text().contains("Value")).findFirst() + .orElseThrow().getCTR(); + + double raise = 0.8 * line(pair) - SPECTRAL_ASCENT * 30; + + assertThat(pair.getText()).as("the premise: one line").contains("Label"); + assertThat(before(pair)).as("the premise: room above the line to move it into").isGreaterThan(400); + assertThat(positionOf(value)).as("the value raised by its own position, the line where it stood") + .isCloseTo((int) Math.round(raise * 2), within(1)); + } + } + + @Test + void aLineInALayerStackKeepsTheSpaceAboveIt() throws Exception { + // A stack measures what follows it from the page: a raise owed below a line inside it + // would not reach what follows. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addParagraph(p -> p.text("Above").textStyle(lato(10))) + .addLayerStack(stack -> stack.name("Stack") + .back(new com.demcha.compose.document.dsl.ShapeBuilder().name("Backdrop").size(200, 80).build()) + .layer(new ParagraphBuilder().name("Title").text("Title").textStyle(spectral(30)) + .margin(DocumentInsets.top(20)).build(), LayerAlign.TOP_LEFT)))) { + XWPFParagraph title = paragraph(document, "Title"); + double raise = 0.8 * line(title) - SPECTRAL_ASCENT * 30; + + assertThat(raise).as("the premise: Word's baseline is the lower").isGreaterThan(1); + assertThat(position(title)).as("raised by its position").isCloseTo((int) Math.round(raise * 2), within(1)); + } + } + + @Test + void theLastLineOfACellOwesItsRaiseInsideTheCell() throws Exception { + // A column's last paragraph raised into the space above it owes that space below it, in + // its cell: the cell is as tall as before, and nothing below the row moves. + try (XWPFDocument document = DocxExports.withLayout(400, 600, 20, page -> page + .addParagraph(p -> p.text("Lead").textStyle(lato(10))) + .addRow(row -> row + .addParagraph(p -> p.text("Left").textStyle(spectral(30)).margin(DocumentInsets.top(20))) + .addParagraph(p -> p.text("Right").textStyle(lato(10)))) + .addParagraph(p -> p.text("Below").textStyle(lato(10))))) { + List cell = document.getTables().get(0).getRow(0).getCell(0).getParagraphs(); + XWPFParagraph left = cell.get(cell.size() - 1); + double raise = 0.8 * line(left) - SPECTRAL_ASCENT * 30; + + assertThat(left.getText()).as("the premise: the column's last paragraph").isEqualTo("Left"); + + assertThat(before(left)).isCloseTo(Math.round((20 - raise) * 20), within(1L)); + assertThat(after(left)).isCloseTo(Math.round(raise * 20), within(1L)); + assertThat(position(left)).isZero(); + assertThat(before(paragraph(document, "Below"))).as("nothing of the raise below the row").isZero(); + } + } + + @Test + void aPanelsFirstLineLeavesItsTopBorderTheSpaceAboveIt() throws Exception { + // A 2pt top border on a card with no padding reaches 2pt past the card into its content, + // and the 1pt above its first line takes what it can of that. Raised into the same 1pt, + // the line would give it back, the card grow by what the line owed, and the note say + // more than the line stands off. + java.util.concurrent.atomic.AtomicReference report = + new java.util.concurrent.atomic.AtomicReference<>(); + try (DocumentSession session = GraphCompose.document().pageSize(400, 600).margin(DocumentInsets.of(20)).create()) { + session.pageFlow(page -> page.addParagraph("Before") + .addSection("Card", card -> card.fillColor(com.demcha.compose.document.style.DocumentColor.rgb(238, 243, 249)) + .borders(com.demcha.compose.document.style.DocumentBorders.top( + com.demcha.compose.document.style.DocumentStroke.of( + com.demcha.compose.document.style.DocumentColor.rgb(26, 86, 148), 2))) + .addParagraph(p -> p.text("Inside").margin(DocumentInsets.top(1)))) + .addParagraph("After")); + try (XWPFDocument document = new XWPFDocument( + new java.io.ByteArrayInputStream(session.export(new DocxSemanticBackend(report::set))))) { + XWPFParagraph inside = document.getTables().get(0).getRow(0).getCell(0).getParagraphs().get(0); + + assertThat(inside.getText()).isEqualTo("Inside"); + assertThat(before(inside)).as("all of it given to the border").isZero(); + assertThat(after(inside)).as("nothing owed for a raise").isZero(); + assertThat(report.get().bySubject().get("SectionNode")).singleElement() + .satisfies(note -> assertThat(note.detail()).startsWith("its content stands 1pt lower")); + } + } + } + + @Test + void aLineOfTheDefaultTextIsRaisedByWhatTheSpacingTestsAllowFor() throws Exception { + assertThat(raiseOf(DocumentTextStyle.DEFAULT)).isEqualTo(DocxExports.DEFAULT_LINE_RAISE); + assertThat(raiseOf(DocumentTextStyle.DEFAULT.withSize(7))).isEqualTo(DocxExports.SMALL_LINE_RAISE); + } + + /** + * How far Word stands a line of {@code style} below the page, in twips: four fifths of the + * line it is written at, against the page's baseline in its laid-out line. + */ + private static long raiseOf(DocumentTextStyle style) throws Exception { + try (DocumentSession session = GraphCompose.document().pageSize(400, 600).margin(DocumentInsets.of(20)).create()) { + session.pageFlow(page -> page.addParagraph(p -> p.text("Line").textStyle(style))); + ParagraphLine line = session.layoutGraph().fragments().stream() + .map(fragment -> fragment.payload()) + .filter(ParagraphFragmentPayload.class::isInstance) + .map(payload -> ((ParagraphFragmentPayload) payload).lines().get(0)) + .findFirst() + .orElseThrow(); + try (XWPFDocument document = new XWPFDocument( + new java.io.ByteArrayInputStream(session.export(new DocxSemanticBackend())))) { + double written = line(paragraph(document, "Line")); + double pageSeat = line.lineHeight() - line.baselineOffsetFromBottom(); + return Math.round((0.8 * written - pageSeat) * 20); + } + } + } + + private static DocumentTextStyle lato(double size) { + return DocumentTextStyle.builder().fontName(FontName.LATO).size(size).build(); + } + + private static long before(XWPFParagraph paragraph) { + var properties = paragraph.getCTP().getPPr(); + return properties == null || !properties.isSetSpacing() || !properties.getSpacing().isSetBefore() ? 0 + : DocxTwips.of(properties.getSpacing().getBefore()); + } + + private static long after(XWPFParagraph paragraph) { + var properties = paragraph.getCTP().getPPr(); + return properties == null || !properties.isSetSpacing() || !properties.getSpacing().isSetAfter() ? 0 + : DocxTwips.of(properties.getSpacing().getAfter()); + } + @Test void linesWhoseGapIsSharedOutAreSeatedAtTheMiddleOne() throws Exception { // Two lines 10pt apart with no space above to give: Word's lines are each 5pt taller diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxCanvasRoomTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxCanvasRoomTest.java index f6d9a31d0..1dc573ec9 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxCanvasRoomTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxCanvasRoomTest.java @@ -57,6 +57,12 @@ class DocxCanvasRoomTest { private static final DocumentColor INK = DocumentColor.rgb(26, 86, 148); + /** + * What a line of the default text in the flow is raised into the space above it, in points + * ({@link DocxExports#DEFAULT_LINE_RAISE}): the gap Word writes above it is that much less + * than the page's. + */ + private static final double RAISE = DocxExports.DEFAULT_LINE_RAISE / 20.0; @Test void whatFollowsACanvasStartsBelowItsRoomNotBelowWhatItWrites() throws Exception { @@ -66,7 +72,7 @@ void whatFollowsACanvasStartsBelowItsRoomNotBelowWhatItWrites() throws Exception assertThat(gapInWord(exported.document(), "Caption", "Below")) .as("the canvas's room under its caption") - .isCloseTo(gapOnThePage(exported.layout(), "Caption", "Below"), within(0.1)) + .isCloseTo(gapOnThePage(exported.layout(), "Caption", "Below") - RAISE, within(0.1)) .isGreaterThan(80); assertThat(exported.report().bySubject()).doesNotContainKey("CanvasLayerNode"); } @@ -84,7 +90,7 @@ void aCanvasWithPaddingAndMarginHoldsItsWholeBox() throws Exception { assertThat(gapInWord(exported.document(), "Above", "Caption")).as("its top margin and padding") .isCloseTo(gapOnThePage(exported.layout(), "Above", "Caption"), within(0.1)); assertThat(gapInWord(exported.document(), "Caption", "Below")).as("its room, padding and margin below") - .isCloseTo(gapOnThePage(exported.layout(), "Caption", "Below"), within(0.1)); + .isCloseTo(gapOnThePage(exported.layout(), "Caption", "Below") - RAISE, within(0.1)); } @Test @@ -96,8 +102,8 @@ void aCanvasThatOnlyDrawsHoldsItsWholeRoom() throws Exception { .add(paragraph("Below"))); assertThat(gapInWord(exported.document(), "Above", "Below")) - .isCloseTo(gapOnThePage(exported.layout(), "Above", "Below"), within(0.1)) - .isCloseTo(80, within(0.1)); + .isCloseTo(gapOnThePage(exported.layout(), "Above", "Below") - RAISE, within(0.1)) + .isCloseTo(80 - RAISE, within(0.1)); assertThat(exported.report().bySubject()).doesNotContainKey("CanvasLayerNode"); } @@ -112,7 +118,7 @@ void aCanvasThatOnlyDrawsHoldsItsBoxOnceWhatItDrawsInHasEdgesToo() throws Except .add(paragraph("Below"))); assertThat(gapInWord(exported.document(), "Above", "Below")) - .isCloseTo(gapOnThePage(exported.layout(), "Above", "Below"), within(0.1)); + .isCloseTo(gapOnThePage(exported.layout(), "Above", "Below") - RAISE, within(0.1)); } @Test @@ -130,7 +136,7 @@ void aCanvasInAStackOfOneLayerHoldsItsRoomInTheFlow() throws Exception { .add(paragraph("Caption")).build(), LayerAlign.TOP_LEFT))); assertThat(gapInWord(writing.document(), "Caption", "Below")) - .isCloseTo(gapOnThePage(writing.layout(), "Caption", "Below"), within(0.1)) + .isCloseTo(gapOnThePage(writing.layout(), "Caption", "Below") - RAISE, within(0.1)) .isGreaterThan(40); assertThat(gapInWord(drawing.document(), "Above", "Caption")).as("the canvas only draws, the caption under it") .isCloseTo(gapOnThePage(drawing.layout(), "Above", "Caption"), within(0.1)) @@ -200,7 +206,7 @@ void aCanvasThatOnlyDrawsEndingAShapeContainersLayerHoldsItsRoomThere() throws E .add(paragraph("Below"))); assertThat(gapInWord(exported.document(), "Title", "Below")) - .isCloseTo(gapOnThePage(exported.layout(), "Title", "Below"), within(0.1)) + .isCloseTo(gapOnThePage(exported.layout(), "Title", "Below") - RAISE, within(0.1)) .isGreaterThan(100); } @@ -280,7 +286,7 @@ void aCanvasThatOnlyDrawsOpeningALaterLayerOfAColumnHoldsItsRoom() throws Except .add(paragraph("Below"))); assertThat(gapInWord(exported.document(), "Heading", "Caption")) - .isCloseTo(gapOnThePage(exported.layout(), "Heading", "Caption"), within(0.1)) + .isCloseTo(gapOnThePage(exported.layout(), "Heading", "Caption") - RAISE, within(0.1)) .isGreaterThan(40); } @@ -314,7 +320,7 @@ void aCanvasThatOnlyDrawsInsideAnotherCanvasHoldsNoRoomOfItsOwn() throws Excepti assertThat(before(caption) + lineOf(caption) + gapInWord(exported.document(), "Caption", "Below")) .as("the outer canvas's height, its caption written at its corner") - .isCloseTo(placed(exported.layout(), "Outer").placementHeight(), within(0.1)); + .isCloseTo(placed(exported.layout(), "Outer").placementHeight() - RAISE, within(0.1)); assertThat(detailOf(exported.report())).isEqualTo("written as its contents; what it writes is written " + "from its corner, one block after another, not where it places it"); } @@ -364,9 +370,9 @@ void aCanvasThatOnlyDrawsInsideWhatIsHeldWholeHoldsNoRoomOfItsOwn() throws Excep .add(paragraph("Below"))); assertThat(gapInWord(inACanvas.document(), "Above", "Below")).as("the outer canvas's room") - .isCloseTo(gapOnThePage(inACanvas.layout(), "Above", "Below"), within(0.1)); + .isCloseTo(gapOnThePage(inACanvas.layout(), "Above", "Below") - RAISE, within(0.1)); assertThat(gapInWord(inAStack.document(), "Above", "Below")).as("the stack's room") - .isCloseTo(gapOnThePage(inAStack.layout(), "Above", "Below"), within(0.1)); + .isCloseTo(gapOnThePage(inAStack.layout(), "Above", "Below") - RAISE, within(0.1)); } @Test diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerPaintTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerPaintTest.java index 8711114cf..91d5946e6 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerPaintTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerPaintTest.java @@ -303,7 +303,8 @@ void theCardsTopAndBottomMarginAreTheSpaceAroundTheTable() throws Exception { assertThat(DocxTwips.of(lead.getCTP().getPPr().getSpacing().getAfter())) .as("Word has no space above a table, so the paragraph before it holds it") .isEqualTo(9 * 20L); - assertThat(DocxTwips.of(after.getCTP().getPPr().getSpacing().getBefore())).isEqualTo(9 * 20L); + assertThat(DocxTwips.of(after.getCTP().getPPr().getSpacing().getBefore())) + .isEqualTo(9 * 20L - DocxExports.DEFAULT_LINE_RAISE); CTPPr properties = after.getCTP().getPPr(); assertThat(properties.isSetShd()).as("the paint ends where the card ends").isFalse(); } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerSpacingTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerSpacingTest.java index f0009b039..965f5090d 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerSpacingTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxContainerSpacingTest.java @@ -33,6 +33,8 @@ class DocxContainerSpacingTest { private static final long NINE_POINTS = 9 * 20L; + /** What a line of the default text is raised into the space above it, and owes below. */ + private static final long RAISE = DocxExports.DEFAULT_LINE_RAISE; @Test void aSectionsSpacingStandsBetweenEachTwoOfItsChildren() throws Exception { @@ -47,8 +49,9 @@ void aSectionsSpacingStandsBetweenEachTwoOfItsChildren() throws Exception { assertThat(paragraphs).extracting(XWPFParagraph::getText) .containsExactly("Contact", "Skills", "Languages"); assertThat(before(paragraphs.get(0))).as("nothing above the first child").isZero(); - assertThat(before(paragraphs.get(1))).isEqualTo(NINE_POINTS); - assertThat(before(paragraphs.get(2))).isEqualTo(NINE_POINTS); + assertThat(before(paragraphs.get(1))).isEqualTo(NINE_POINTS - RAISE); + assertThat(before(paragraphs.get(2))).as("raised as far as the line above it was") + .isEqualTo(NINE_POINTS); } } @@ -78,7 +81,7 @@ void aPanelsSpacingStandsBetweenTheChildrenInItsCell() throws Exception { List paragraphs = written(cell.getParagraphs()); assertThat(paragraphs).extracting(XWPFParagraph::getText).containsExactly("First", "Second"); - assertThat(before(paragraphs.get(1))).isEqualTo(NINE_POINTS); + assertThat(before(paragraphs.get(1))).isEqualTo(NINE_POINTS - RAISE); } } @@ -95,7 +98,7 @@ void aPageBreakTakesNoSpacingBeforeItAndTheNextPageStartsItsSpacingDown() throws List paragraphs = written(document.getParagraphs()); assertThat(after(paragraphs.get(0))).isZero(); - assertThat(before(paragraphs.get(1))).isEqualTo(NINE_POINTS); + assertThat(before(paragraphs.get(1))).isEqualTo(NINE_POINTS - RAISE); } } @@ -117,7 +120,7 @@ void aSpacerIsItsHeightAndNotALineOfTextAsWell() throws Exception { assertThat(spacing.getLineRule().toString()).isEqualTo("exact"); assertThat(DocxTwips.of(spacing.getLine())).as("a tenth of a point").isEqualTo(2L); assertThat(DocxTwips.of(spacing.getLine()) + before(all.get(2))) - .as("the hairline and the space above the next entry, the spacer's height").isEqualTo(90L); + .as("the hairline and the space above the next entry, the spacer's height").isEqualTo(90L - RAISE); } } @@ -137,7 +140,7 @@ void theSpaceBelowASpacerOfNoHeightTakesItsHairline() throws Exception { assertThat(spacer.getText()).isEmpty(); assertThat(before(spacer) + DocxTwips.of(spacer.getCTP().getPPr().getSpacing().getLine()) + before(all.get(2))) .as("the section's spacing either side of the spacer, its hairline included") - .isEqualTo(2 * NINE_POINTS); + .isEqualTo(2 * NINE_POINTS - RAISE); } } @@ -157,7 +160,7 @@ void theSpaceUnderACardsOpeningSpacerOfNoHeightTakesItsHairline() throws Excepti assertThat(cell.getParagraphs()).extracting(XWPFParagraph::getText).containsExactly("", "Title"); assertThat(DocxTwips.of(spacer.getCTP().getPPr().getSpacing().getLine()) + before(cell.getParagraphs().get(1))) - .as("the card's spacing under the anchor, its hairline included").isEqualTo(NINE_POINTS); + .as("the card's spacing under the anchor, its hairline included").isEqualTo(NINE_POINTS - RAISE); } } @@ -214,7 +217,7 @@ void aSpacerUnderATableInACellIsTheTablesCloserAndItsHeightOnce() throws Excepti assertThat(content.get(content.indexOf(spacer) - 1)).as("right under the table") .isInstanceOf(XWPFTable.class); assertThat(DocxTwips.of(spacer.getCTP().getPPr().getSpacing().getLine()) + after(spacer) + before(after)) - .as("the hairline and the space below it, the spacer's height").isEqualTo(200L); + .as("the hairline and the space below it, the spacer's height").isEqualTo(200L - RAISE); } } @@ -273,7 +276,7 @@ void aShapeContainersEdgesAreSpaceAroundWhatItHolds() throws Exception { // The row stands at the top of the 20pt outline, which holds 7.05pt more under it. assertThat(before(paragraph(document, "Java"))) .as("the outline under its row, its bottom padding and margin, above the paragraph after it") - .isEqualTo(8 * 20L + Math.round(7.05 * 20)); + .isEqualTo(8 * 20L + Math.round(7.05 * 20) - RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxDrawingsTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxDrawingsTest.java index f2ed0d175..7bbe1c53c 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxDrawingsTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxDrawingsTest.java @@ -180,9 +180,10 @@ void aTitleBesideItsBadgeStandsWhereThePageCentresItInTheHeader() throws Excepti .isCloseTo(Math.round((above.placementY() - title.placementY() - title.placementHeight()) * 20), org.assertj.core.data.Offset.offset(2L)); assertThat(twipsAfter(document, "EXPERIENCE") + twipsBefore(document, "Below")) - .as("from the title past the header's foot to the line below, as on the page") - .isCloseTo(Math.round((title.placementY() - below.placementY() - below.placementHeight()) * 20), - org.assertj.core.data.Offset.offset(3L)); + .as("from the title past the header's foot to the line below, as on the page, less that" + + " line's raise into it") + .isCloseTo(Math.round((title.placementY() - below.placementY() - below.placementHeight()) * 20) + - DocxExports.DEFAULT_LINE_RAISE, org.assertj.core.data.Offset.offset(3L)); assertThat(header.placementHeight()).isEqualTo(40); } } @@ -217,9 +218,10 @@ void aBadgeAloneInTheFlowKeepsItsPlaceWithItsGlyphDrawnOverIt() throws Exception assertThat(document.getDocument().xmlText()).doesNotContain(" 0 ? ((Number) text.getCTR().getRPr().getPositionArray(0).getVal()).intValue() : 0; + // The line below is raised into the space above it, and that is no reach of the icon's. return new Between(pageLine, DocxTwips.of(iconed.getLine()) / 20.0, 3 - DocxTwips.of(iconed.getBefore()) / 20.0, - 3 - (after.isSetBefore() ? DocxTwips.of(after.getBefore()) : 0) / 20.0, textPosition); + 3 - ((after.isSetBefore() ? DocxTwips.of(after.getBefore()) : 0) + DocxExports.SMALL_LINE_RAISE) / 20.0, + textPosition); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLayerColumnsTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLayerColumnsTest.java index df43c505c..ee2b568e8 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLayerColumnsTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLayerColumnsTest.java @@ -35,6 +35,8 @@ class DocxLayerColumnsTest { private static final double MARGIN = 20; private static final double SIDEBAR = 120; private static final double MAIN = PAGE_WIDTH - 2 * MARGIN - SIDEBAR; + /** What a line of the default text in a column is raised into the space above it. */ + private static final long RAISE = DocxExports.DEFAULT_LINE_RAISE; /** A paragraph long enough to fill its column, so the stack is as wide as the page's. */ private static final String LONG = "Led the delivery of a document platform across three teams, " + "from the first prototype to the release that replaced the old reporting stack."; @@ -64,6 +66,97 @@ void sideBySideLayersAreTheCellsOfOneRow() throws Exception { } } + @Test + void aLaterLayerStandsBelowTheLineAboveItAsFarAsThatLineWasRaised() throws Exception { + // The first layer's line, Spectral under 20pt of space, is moved up into that space and + // owes as much below it. The later layer measures the gap to itself from the page, where + // that line stood lower, so it takes the raise back with the gap. + com.demcha.compose.document.style.DocumentTextStyle spectral = com.demcha.compose.document.style + .DocumentTextStyle.builder().fontName(com.demcha.compose.font.FontName.SPECTRAL).size(30).build(); + com.demcha.compose.document.style.DocumentTextStyle lato = com.demcha.compose.document.style + .DocumentTextStyle.builder().fontName(com.demcha.compose.font.FontName.LATO).size(10).build(); + try (Export export = export(stack -> stack + .layer(column("TitleLayer", SIDEBAR, 0, top -> top.addParagraph(p -> p.name("Title").text("Title") + .textStyle(spectral).margin(DocumentInsets.top(20)))), LayerAlign.TOP_LEFT) + .layer(column("Sidebar", 0, MAIN, side -> side.addParagraph("Contact")), LayerAlign.TOP_LEFT) + .layer(column("MainLayer", SIDEBAR, 0, main -> main + .addSpacer(spacer -> spacer.name("TitlePlace").width(100).height(80)) + .addParagraph(p -> p.name("Role").text("Engineer").textStyle(lato))), LayerAlign.TOP_LEFT))) { + XWPFTableCell main = export.document().getTables().get(0).getRow(0).getCell(1); + XWPFParagraph title = main.getParagraphs().get(0); + double line = org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule.EXACT + .equals(title.getCTP().getPPr().getSpacing().getLineRule()) + ? DocxTwips.of(title.getCTP().getPPr().getSpacing().getLine()) / 20.0 : Double.NaN; + double raise = 0.8 * line - 1.059 * 30; + PlacedNode placedTitle = export.placed("Title"); + PlacedNode role = export.placed("Role"); + double gap = placedTitle.placementY() - (role.placementY() + role.placementHeight()); + + assertThat(main.getParagraphs()).extracting(XWPFParagraph::getText).containsExactly("Title", "Engineer"); + assertThat(spacingBefore(title)).as("the premise: the title raised into the space above it") + .isCloseTo(Math.round((20 - raise) * 20), org.assertj.core.data.Offset.offset(1L)); + assertThat(spacingBefore(main.getParagraphs().get(1))) + .isCloseTo(Math.round((gap + raise) * 20), org.assertj.core.data.Offset.offset(2L)); + } + } + + @Test + void aLaterLayerThatWritesNothingLeavesTheRaiseOwedInTheCell() throws Exception { + // The later layer only holds the title's place: written of it is nothing, and the raised + // title still owes below it what it was raised by, at the cell's end. + com.demcha.compose.document.style.DocumentTextStyle spectral = com.demcha.compose.document.style + .DocumentTextStyle.builder().fontName(com.demcha.compose.font.FontName.SPECTRAL).size(30).build(); + try (Export export = export(stack -> stack + .layer(column("TitleLayer", SIDEBAR, 0, top -> top.addParagraph(p -> p.name("Title").text("Title") + .textStyle(spectral).margin(DocumentInsets.top(20)))), LayerAlign.TOP_LEFT) + .layer(column("Sidebar", 0, MAIN, side -> side.addParagraph("Contact")), LayerAlign.TOP_LEFT) + .layer(column("MainLayer", SIDEBAR, 0, main -> main + .addSpacer(spacer -> spacer.name("TitlePlace").width(100).height(80))), LayerAlign.TOP_LEFT), + true)) { + XWPFTableCell main = export.document().getTables().get(0).getRow(0).getCell(1); + XWPFParagraph title = main.getParagraphs().get(main.getParagraphs().size() - 1); + long raised = 20 * 20L - spacingBefore(title); + var spacing = title.getCTP().getPPr().getSpacing(); + + assertThat(title.getText()).as("the premise: the title ends the cell").isEqualTo("Title"); + assertThat(raised).as("the premise: the title raised into the space above it").isGreaterThan(20); + assertThat(spacing.isSetAfter() ? DocxTwips.of(spacing.getAfter()) : 0).isEqualTo(raised); + } + } + + @Test + void aLaterLayerUnderAPanelTakesNoRaiseThePanelAlreadyOwedInside() throws Exception { + // The first layer ends in a painted card whose line is raised: the card's cell owes the + // raise below that line, inside the card, and the later layer's gap from the card's foot + // is the page's alone. + com.demcha.compose.document.style.DocumentTextStyle spectral = com.demcha.compose.document.style + .DocumentTextStyle.builder().fontName(com.demcha.compose.font.FontName.SPECTRAL).size(30).build(); + com.demcha.compose.document.style.DocumentTextStyle lato = com.demcha.compose.document.style + .DocumentTextStyle.builder().fontName(com.demcha.compose.font.FontName.LATO).size(10).build(); + try (Export export = export(stack -> stack + .layer(column("CardLayer", SIDEBAR, 0, top -> top.addSection("Card", card -> card + .fillColor(DocumentColor.rgb(238, 243, 249)).padding(DocumentInsets.of(4)) + .addParagraph(p -> p.name("Title").text("Title").textStyle(spectral) + .margin(DocumentInsets.top(20))))), LayerAlign.TOP_LEFT) + .layer(column("Sidebar", 0, MAIN, side -> side.addParagraph("Contact")), LayerAlign.TOP_LEFT) + .layer(column("MainLayer", SIDEBAR, 0, main -> main + .addSpacer(spacer -> spacer.name("CardPlace").width(100).height(100)) + .addParagraph(p -> p.name("Role").text("Engineer").textStyle(lato))), LayerAlign.TOP_LEFT))) { + XWPFTableCell main = export.document().getTables().get(0).getRow(0).getCell(1); + XWPFParagraph role = main.getParagraphs().stream() + .filter(paragraph -> "Engineer".equals(paragraph.getText())).findFirst().orElseThrow(); + XWPFParagraph title = main.getTables().get(0).getRow(0).getCell(0).getParagraphs().stream() + .filter(paragraph -> "Title".equals(paragraph.getText())).findFirst().orElseThrow(); + PlacedNode card = export.placed("Card"); + PlacedNode placedRole = export.placed("Role"); + double gap = card.placementY() - (placedRole.placementY() + placedRole.placementHeight()); + + assertThat(spacingBefore(title)).as("the premise: the title raised into the space above it") + .isLessThan(20 * 20L); + assertThat(spacingBefore(role)).isCloseTo(Math.round(gap * 20), org.assertj.core.data.Offset.offset(2L)); + } + } + @Test void layersSharingABandFollowOneAnotherAndTheStandInIsLeftOut() throws Exception { // The name is drawn first, in a layer of its own; the main column holds its place with @@ -88,7 +181,7 @@ void layersSharingABandFollowOneAnotherAndTheStandInIsLeftOut() throws Exception double gap = name.placementY() - (role.placementY() + role.placementHeight()); assertThat(gap).as("the page puts the role below the name").isGreaterThan(10); assertThat(spacingBefore(main.getParagraphs().get(1))) - .isCloseTo(Math.round(gap * 20), org.assertj.core.data.Offset.offset(1L)); + .isCloseTo(Math.round(gap * 20) - RAISE, org.assertj.core.data.Offset.offset(1L)); } } @@ -114,7 +207,7 @@ void aDrawingThatOpensALaterLayerKeepsItsRoomBelowTheResume() throws Exception { double gap = name.placementY() - (placedRole.placementY() + placedRole.placementHeight()); assertThat(gap).as("the portrait stands between them on the page").isGreaterThan(30); - assertThat(spacingBefore(role)).isCloseTo(Math.round(gap * 20), org.assertj.core.data.Offset.offset(2L)); + assertThat(spacingBefore(role)).isCloseTo(Math.round(gap * 20) - RAISE, org.assertj.core.data.Offset.offset(2L)); } } @@ -162,7 +255,7 @@ void aStandInAtTheFootOfAnEarlierLayerIsNotWhereTheGapIsMeasuredFrom() throws Ex .containsExactly("Ada Lovelace", "Engineer", LONG); assertThat(gap).isGreaterThan(5); assertThat(spacingBefore(main.getParagraphs().get(1))) - .isCloseTo(Math.round(gap * 20), org.assertj.core.data.Offset.offset(1L)); + .isCloseTo(Math.round(gap * 20) - RAISE, org.assertj.core.data.Offset.offset(1L)); } } @@ -179,7 +272,7 @@ void theFirstLayerKeepsItsTopEdgeAndTheStackItsLeftOne() throws Exception { .addParagraph(LONG)), LayerAlign.TOP_LEFT))) { XWPFTable table = export.document().getTables().get(0); - assertThat(spacingBefore(table.getRow(0).getCell(0).getParagraphs().get(0))).isEqualTo(25 * 20L); + assertThat(spacingBefore(table.getRow(0).getCell(0).getParagraphs().get(0))).isEqualTo(25 * 20L - RAISE); assertThat(table.getCTTbl().getTblPr().isSetTblInd()).as("the table is indented").isTrue(); assertThat(DocxTwips.of(table.getCTTbl().getTblPr().getTblInd().getW())).isEqualTo(16 * 20L); } @@ -307,11 +400,24 @@ private static DocumentNode column(String name, double insetLeft, double insetRi } private static Export export(Consumer layers) throws Exception { + return export(layers, false); + } + + /** + * @param followed whether a paragraph follows the stack, so its table does not close the + * document and its cells keep the space below their last lines + */ + private static Export export(Consumer layers, boolean followed) throws Exception { DocumentSession session = GraphCompose.document() .pageSize(PAGE_WIDTH, 600) .margin(DocumentInsets.of(MARGIN)) .create(); - session.pageFlow(page -> page.addLayerStack(stack -> layers.accept(stack.name("Columns")))); + session.pageFlow(page -> { + page.addLayerStack(stack -> layers.accept(stack.name("Columns"))); + if (followed) { + page.addParagraph("Below"); + } + }); XWPFDocument document = new XWPFDocument(new ByteArrayInputStream(session.export(new DocxSemanticBackend()))); return new Export(session, document); } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineHeightTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineHeightTest.java index 4144153cd..51592a384 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineHeightTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineHeightTest.java @@ -138,7 +138,8 @@ void theGapBetweenAParagraphsLinesIsInItsLinesAndTakenOnceFromAboveIt() throws E XWPFParagraph with = gapped.getParagraphs().get(1); assertThat(lineTwips(with)).isEqualTo(lineTwips(without) + 4 * 20L); - assertThat(before(with)).isEqualTo(before(without) - 4 * 20L); + assertThat(before(with)).as("the 10pt above it, less the gap its lines took") + .isEqualTo((10 - 4) * 20L); } } @@ -234,7 +235,8 @@ void aWrappedParagraphInACellLeavesTheSpaceAfterTheTableAlone() throws Exception XWPFParagraph after = document.getParagraphs().stream() .filter(paragraph -> "After".equals(paragraph.getText())).findFirst().orElseThrow(); - assertThat(before(after)).as("the space above it is its own, whole").isEqualTo(10 * 20L); + assertThat(before(after)).as("the space above it is its own, whole, less its line's raise into it") + .isEqualTo(10 * 20L - DocxExports.DEFAULT_LINE_RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLinePairTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLinePairTest.java index 1241461bf..ce46edae9 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLinePairTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLinePairTest.java @@ -400,7 +400,8 @@ void theHangReachesTheNextBlockOnlyNotThePageAfterABreak() throws Exception { XWPFParagraph after = document.getParagraphs().stream() .filter(paragraph -> "After".equals(paragraph.getText())).findFirst().orElseThrow(); - assertThat(before(after)).as("a new page: its 10pt whole").isEqualTo(10L * 20); + assertThat(before(after)).as("a new page: its 10pt whole, less its line's raise into it") + .isEqualTo(10L * 20 - DocxExports.DEFAULT_LINE_RAISE); } } @@ -415,7 +416,8 @@ void theHangStaysInTheCellItHangsIn() throws Exception { XWPFParagraph beside = document.getTables().get(0).getRow(0).getCell(1).getParagraphs().stream() .filter(paragraph -> "Beside".equals(paragraph.getText())).findFirst().orElseThrow(); - assertThat(before(beside)).as("its 10pt whole").isEqualTo(10L * 20); + assertThat(before(beside)).as("its 10pt whole, less its line's raise into it") + .isEqualTo(10L * 20 - DocxExports.DEFAULT_LINE_RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineSurplusTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineSurplusTest.java index cc5bddb85..16180465c 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineSurplusTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxLineSurplusTest.java @@ -37,6 +37,8 @@ class DocxLineSurplusTest { /** The page's content: 400 x 600 with a 20pt margin. */ private static final double CONTENT = 560; + /** What the default text's line after the paragraph is raised into the space above it, in points. */ + private static final double RAISE = DocxExports.DEFAULT_LINE_RAISE / 20.0; @Test void theSpaceBelowAParagraphWordSetsTallerTakesTheDifference() throws Exception { @@ -45,7 +47,7 @@ void theSpaceBelowAParagraphWordSetsTallerTakesTheDifference() throws Exception assertThat(surplus).as("the premise: Word's lines at the tallest pass the page's").isGreaterThan(1); assertThat(before(paragraph(exported.document(), "After")) / 20.0).as("the gap less what Word's lines pass the page by") - .isCloseTo(20 - surplus, within(0.05)); + .isCloseTo(20 - surplus - RAISE, within(0.05)); assertThat(exported.report().bySubject().get("space above")).isNull(); } @@ -106,7 +108,7 @@ void theSpaceBelowAParagraphOfOneSizeTakesWhatItsRoundingAdds() throws Exception double surplus = Math.round(page / line) * line - page; assertThat(before(paragraph(exported.document(), "After")) / 20.0).as("the gap less what the lines pass the page by") - .isCloseTo(20 - surplus, within(0.05)); + .isCloseTo(20 - surplus - RAISE, within(0.05)); assertThat(exported.report().bySubject().get("space above")).isNull(); } @@ -116,7 +118,8 @@ void aParagraphWrittenAtItsTallestLineOwesNothingForItsRounding() throws Excepti // the page: owed, that rounding stood ModernInvoice's lines a step of Word's grid lower. Exported exported = rounded(surplus -> surplus < -0.15); - assertThat(before(paragraph(exported.document(), "After"))).as("the gap alone").isEqualTo(400); + assertThat(before(paragraph(exported.document(), "After"))).as("the gap alone") + .isEqualTo(400 - DocxExports.DEFAULT_LINE_RAISE); } @Test diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxOverTheFlowTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxOverTheFlowTest.java index eeb046332..93971d7ce 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxOverTheFlowTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxOverTheFlowTest.java @@ -75,7 +75,8 @@ void aLinePulledUpInItTakesNothingFromTheFlowAfterIt() throws Exception { .addSection("Head", head -> head.padding(DocumentInsets.top(6)).addParagraph("Masthead")))) { assertThat(document.getDocument().getBody().xmlText()).as("the line is in a text box") .contains(""); - assertThat(before(masthead(document))).as("the section's space above it").isEqualTo(6 * 20L); + assertThat(before(masthead(document))).as("the section's space above it, less its line's raise into it") + .isEqualTo(6 * 20L - DocxExports.DEFAULT_LINE_RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxOverlayBandTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxOverlayBandTest.java index bfe8f6714..b8158b234 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxOverlayBandTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxOverlayBandTest.java @@ -34,6 +34,8 @@ class DocxOverlayBandTest { private static final double BADGE = 80; + /** What a line of the default text in the flow is raised into the space above it. */ + private static final long RAISE = DocxExports.DEFAULT_LINE_RAISE; @Test void aBadgeOverItsPlaceHolderIsWrittenWhereThePageDrawsIt() throws Exception { @@ -51,7 +53,7 @@ void aBadgeOverItsPlaceHolderIsWrittenWhereThePageDrawsIt() throws Exception { assertThat(before(paragraphs.get(1))).as("the initials sit where the ring centres them") .isCloseTo(Math.round((6 + above) * 20), org.assertj.core.data.Offset.offset(2L)); assertThat(before(paragraphs.get(2))).as("and the badge keeps its height below them") - .isCloseTo(Math.round((below + 12) * 20), org.assertj.core.data.Offset.offset(2L)); + .isCloseTo(Math.round((below + 12) * 20) - RAISE, org.assertj.core.data.Offset.offset(2L)); } } @@ -82,7 +84,7 @@ void aBandNestedUnderADrawingIsMeasuredPastItsOwnPlaceHolder() throws Exception assertThat(before(paragraphs.get(1))).as("the initials where the ring centres them") .isCloseTo(Math.round((6 + above) * 20), org.assertj.core.data.Offset.offset(2L)); assertThat(before(paragraphs.get(2))).as("and the badge's height below them") - .isCloseTo(Math.round(below * 20), org.assertj.core.data.Offset.offset(2L)); + .isCloseTo(Math.round(below * 20) - RAISE, org.assertj.core.data.Offset.offset(2L)); } } @@ -174,7 +176,7 @@ void aDrawingThatIsNotWrittenStillTakesItsRoom() throws Exception { XWPFParagraph below = document.getParagraphs().stream() .filter(paragraph -> "Below".equals(paragraph.getText())).findFirst().orElseThrow(); - assertThat(before(below)).isEqualTo(50L * 20); + assertThat(before(below)).isEqualTo(50L * 20 - RAISE); } } @@ -241,7 +243,7 @@ void aShapeContainersStackedLinesStandWhereTheOutlineSetsThem() throws Exception assertThat(before(initial)).as("written from where the ring sets the first initial") .isCloseTo(Math.round(above * 20), org.assertj.core.data.Offset.offset(2L)); assertThat(before(after)).as("and the ring's foot as far under the last as the page has it") - .isCloseTo(Math.round((below + gap) * 20), org.assertj.core.data.Offset.offset(2L)); + .isCloseTo(Math.round((below + gap) * 20) - RAISE, org.assertj.core.data.Offset.offset(2L)); } } @@ -291,7 +293,7 @@ void theLastLayersNegativeBottomEdgeIsTakenOnceBelowTheBand() throws Exception { XWPFParagraph below = document.getParagraphs().stream() .filter(paragraph -> "Below".equals(paragraph.getText())).findFirst().orElseThrow(); - assertThat(before(below)).isEqualTo((10 - 4) * 20L); + assertThat(before(below)).isEqualTo((10 - 4) * 20L - RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxPanelTailTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxPanelTailTest.java index abf05cf60..ea09ac118 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxPanelTailTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxPanelTailTest.java @@ -47,6 +47,8 @@ class DocxPanelTailTest { private static final SvgIcon ICON = SvgIcon.parse("" + ""); private static final DocumentTextStyle SMALL = DocumentTextStyle.DEFAULT.withSize(7); + /** What the default text's line after a panel is raised into the space above it. */ + private static final long RAISE = DocxExports.DEFAULT_LINE_RAISE; @Test void aPaddedCardsBorderBelowComesOutOfItsPaddingWhereNoSpaceTakesIt() throws Exception { @@ -68,7 +70,7 @@ void theSpaceBelowACardTakesItsBorderBeforeItsPaddingDoes() throws Exception { assertThat(exported.report().bySubject()).doesNotContainKey("space above"); assertThat(bottomMargin(panel(exported))).as("its padding, less half the border").isEqualTo(3 * 20); - assertThat(before(paragraph(exported, "After"))).as("the gap, less half the border").isEqualTo(9 * 20); + assertThat(before(paragraph(exported, "After"))).as("the gap, less half the border").isEqualTo(9 * 20 - RAISE); } @Test @@ -339,7 +341,7 @@ void aPanelsHangingLastLineComesOutOfItsPaddingBelow() throws Exception { assertThat(down).as("the line reaches below the page's").isPositive(); assertThat(bottomMargin(panel(exported))).as("the padding less the reach").isEqualTo(5 * 20 - down); - assertThat(before(paragraph(exported, "After"))).as("the whole gap").isEqualTo(10 * 20); + assertThat(before(paragraph(exported, "After"))).as("the whole gap").isEqualTo(10 * 20 - RAISE); } @Test @@ -351,7 +353,7 @@ void aPanelsHangingLastLineWithNoPaddingTakesTheGapUnderIt() throws Exception { long down = reachBelow(exported, "Iconed"); assertThat(down).as("the line reaches below the page's").isPositive(); - assertThat(before(paragraph(exported, "After"))).as("the gap, less the reach").isEqualTo(10 * 20 - down); + assertThat(before(paragraph(exported, "After"))).as("the gap, less the reach").isEqualTo(10 * 20 - down - RAISE); assertThat(exported.report().bySubject()).doesNotContainKey("space above"); } @@ -446,7 +448,7 @@ void aMarginBelowZeroUnderAPanelPullsWhatFollowsUp() throws Exception { .addParagraph(p -> p.name("After").text("After"))); assertThat(bottomMargin(panel(exported))).isEqualTo(8 * 20); - assertThat(before(paragraph(exported, "After"))).as("the gap, less the pull").isEqualTo(6 * 20); + assertThat(before(paragraph(exported, "After"))).as("the gap, less the pull").isEqualTo(6 * 20 - RAISE); assertThat(exported.report().bySubject()).doesNotContainKey("space above"); } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxPortraitTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxPortraitTest.java index 4ae70ddda..ae141f21d 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxPortraitTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxPortraitTest.java @@ -39,6 +39,8 @@ class DocxPortraitTest { private static final double PHOTO = 123.8; private static final double RING = 1.6; + /** What the default text's line under the frame is raised into the space above it. */ + private static final long RAISE = DocxExports.DEFAULT_LINE_RAISE; @Test void aPhotoInARingWiderThanItsColumnKeepsItsSize() throws Exception { @@ -80,7 +82,7 @@ void aLayersOwnMarginIsWrittenWithItAndNotTwice() throws Exception { assertThat(beforeOf(picture)).isEqualTo(Math.round((25 + gaps[0]) * 20)); assertThat(beforeOf(paragraphs.get(paragraphs.indexOf(picture) + 1))) - .isEqualTo(Math.round((gaps[1] + 22) * 20)); + .isEqualTo(Math.round((gaps[1] + 22) * 20) - RAISE); } } @@ -94,7 +96,8 @@ void aLayerMovedPastTheBottomLeavesTheFrameNoTallerThanItIs() throws Exception { try (XWPFDocument document = inSidebar(frame)) { List paragraphs = sidebar(document); XWPFParagraph picture = pictureIn(paragraphs); - long below = beforeOf(paragraphs.get(paragraphs.indexOf(picture) + 1)) - 22 * 20L; + // Less the 22pt above the heading under it, raised into that space. + long below = beforeOf(paragraphs.get(paragraphs.indexOf(picture) + 1)) + RAISE - 22 * 20L; assertThat(beforeOf(picture) - 25 * 20L + 40 * 20L + below) .as("the space above the picture, the picture and the space under it: the frame's 60pt") @@ -118,7 +121,7 @@ void aLayerMovedPastTheTopLeavesTheFrameNoTallerThanItIs() throws Exception { assertThat(beforeOf(picture)).as("none of the frame above the picture").isEqualTo(25 * 20L); assertThat(beforeOf(paragraphs.get(paragraphs.indexOf(picture) + 1))) .as("all of what it holds under it") - .isEqualTo(Math.round((gaps[0] + gaps[1] + 22) * 20)); + .isEqualTo(Math.round((gaps[0] + gaps[1] + 22) * 20) - RAISE); } } @@ -148,7 +151,7 @@ void aPhotoStandsAsFarInsideItsRingAsThePageSetsIt() throws Exception { assertThat(beforeOf(photo)).as("the sidebar's 25pt and the ring above the photo") .isEqualTo(Math.round((25 + RING) * 20)); assertThat(beforeOf(heading)).as("the ring below the photo, and the heading's 22pt") - .isEqualTo(Math.round((RING + 22) * 20)); + .isEqualTo(Math.round((RING + 22) * 20) - RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRowOverhangTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRowOverhangTest.java index 57860b59f..bf20279a2 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRowOverhangTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRowOverhangTest.java @@ -35,6 +35,8 @@ class DocxRowOverhangTest { + ""); private static final DocumentTextStyle SMALL = DocumentTextStyle.DEFAULT.withSize(7); private static final double GAP = 10; + /** What the small line after the row is raised into the space above it, and owes below. */ + private static final long RAISE = DocxExports.SMALL_LINE_RAISE; @Test void theTallestCellsHangingLineTakesItsReachOutOfTheGapUnderTheRow() throws Exception { @@ -48,7 +50,7 @@ void theTallestCellsHangingLineTakesItsReachOutOfTheGapUnderTheRow() throws Exce assertThat(iconed.getCTP().getPPr().getSpacing().getLineRule()).as("held to its icon") .isEqualTo(org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule.EXACT); assertThat(down).as("the line reaches below the page's").isPositive(); - assertThat(before(after(document))).as("the gap less that reach").isEqualTo(Math.round(GAP * 20) - down); + assertThat(before(after(document))).as("the gap less that reach").isEqualTo(Math.round(GAP * 20) - down - RAISE); } } @@ -62,7 +64,7 @@ void aHangingLineWithRoomUnderItInItsRowTakesNothing() throws Exception { right.addParagraph(p -> p.textStyle(SMALL).text("Line")); } }).document()) { - assertThat(before(after(document))).isEqualTo(Math.round(GAP * 20)); + assertThat(before(after(document))).isEqualTo(Math.round(GAP * 20) - RAISE); } } @@ -76,7 +78,7 @@ void aShorterCellSetAtTheRowsFootHasItsRoomAllTheSame() throws Exception { right.addParagraph(p -> p.textStyle(SMALL).text("Line")); } }, com.demcha.compose.document.node.RowVerticalAlign.BOTTOM).document()) { - assertThat(before(after(document))).isEqualTo(Math.round(GAP * 20)); + assertThat(before(after(document))).isEqualTo(Math.round(GAP * 20) - RAISE); } } @@ -97,7 +99,7 @@ void aHangingLineTakesItsReachOutOfItsCellsPaddingFirst() throws Exception { assertThat(spacing.isSetAfter() ? DocxTwips.of(spacing.getAfter()) : 0) .as("the padding less the reach").isEqualTo(5 * 20 - down); - assertThat(before(after(document))).isEqualTo(Math.round(GAP * 20)); + assertThat(before(after(document))).isEqualTo(Math.round(GAP * 20) - RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRowPaintTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRowPaintTest.java index cf8727b48..304e424a5 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRowPaintTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRowPaintTest.java @@ -325,7 +325,8 @@ void aPaintedRowTheLayoutMovesToANewPageKeepsTheSpaceAboveItThere() throws Excep var before = (org.apache.poi.xwpf.usermodel.XWPFParagraph) element; assertThat(before.getText()).isEqualTo("Before"); assertThat(twips(before.getCTP().getPPr().getSpacing().getAfter())) - .as("its own 10pt, on the page above").isEqualTo(200); + .as("its own 10pt, on the page above, and what its line owes below it for its raise") + .isEqualTo(200 + DocxExports.DEFAULT_LINE_RAISE); }); assertThat(exported.report().bySubject()).doesNotContainKey("row paint"); } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRuleTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRuleTest.java index f603717e3..f45bbb8db 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRuleTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxRuleTest.java @@ -33,6 +33,8 @@ class DocxRuleTest { private static final DocumentColor ACCENT = DocumentColor.rgb(26, 86, 148); + /** What the default text's line under a rule is raised into the space above it. */ + private static final long RAISE = DocxExports.DEFAULT_LINE_RAISE; @Test void aFillLineIsAParagraphBorderAcrossTheWidth() throws Exception { @@ -89,7 +91,7 @@ void theSpaceAroundTheStrokeInItsBoxIsKept() throws Exception { CTPPr below = document.getParagraphs().get(1).getCTP().getPPr(); assertThat(DocxTwips.of(rule.getSpacing().getLine())).isEqualTo(110L); - assertThat(DocxTwips.of(below.getSpacing().getBefore())).isEqualTo(110L); + assertThat(DocxTwips.of(below.getSpacing().getBefore())).isEqualTo(110L - RAISE); } } @@ -262,7 +264,7 @@ void aStrokeThickerThanItsBoxTakesItsExtraFromTheSpaceBelow() throws Exception { CTPPr after = document.getParagraphs().get(1).getCTP().getPPr(); // Box 1pt; Word takes 0.1 + 3: 2.1pt comes off the 10pt. - assertThat(DocxTwips.of(after.getSpacing().getBefore())).isEqualTo(158L); + assertThat(DocxTwips.of(after.getSpacing().getBefore())).isEqualTo(158L - RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceAboveOnANewPageTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceAboveOnANewPageTest.java index 17d15694e..a7e8f8887 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceAboveOnANewPageTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceAboveOnANewPageTest.java @@ -71,7 +71,7 @@ void aSpacerOfNoHeightTheGapBeforeCarriesToANewPageHoldsTheGapInItsLine() throws .isEqualTo(Math.round(GAP * 20) + HAIRLINE); assertThat(before(spacing(paragraphWith(document, "After")))) .as("the gap below it, less the hairline the spacer has not the height for") - .isEqualTo(Math.round(GAP * 20) - HAIRLINE); + .isEqualTo(Math.round(GAP * 20) - HAIRLINE - DocxExports.DEFAULT_LINE_RAISE); } } @@ -266,7 +266,8 @@ void aParagraphOnThePageOfTheBlockBeforeItIsWrittenAsBefore() throws Exception { XWPFParagraph heading = paragraphWith(document, "Heading"); assertThat(document.getParagraphs()).as("the spacer and the heading, no line between them").hasSize(2); - assertThat(before(spacing(heading))).isEqualTo(owed(CONTENT - 10 + GAP + PADDING)); + assertThat(before(spacing(heading))).as("raised into it, on the page of the block before it") + .isEqualTo(owed(CONTENT - 10 + GAP + PADDING) - DocxExports.DEFAULT_LINE_RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceOnANewPageTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceOnANewPageTest.java index 6b75c4d1b..0a4d595b8 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceOnANewPageTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxSpaceOnANewPageTest.java @@ -42,8 +42,9 @@ void aRowMovedToANewPageHoldsItsTopEdgeInALineKeptWithIt() throws Exception { .isEqualTo(Math.round(EDGE * 20)); assertThat(spacer.getCTP().getPPr().isSetKeepNext()).as("kept with the row").isTrue(); assertThat(spacingAfter(paragraphBefore(document, spacer))) - .as("the gap stays at the foot of the page above, the edge does not") - .isEqualTo(Math.round(GAP * 20)); + .as("the gap stays at the foot of the page above, the edge does not; with it, what the" + + " line there owes below it for its raise") + .isEqualTo(Math.round(GAP * 20) + DocxExports.DEFAULT_LINE_RAISE); } } @@ -95,7 +96,8 @@ void aRowOnThePageOfTheBlockBeforeItIsWrittenAsBefore() throws Exception { XWPFParagraph above = paragraphBefore(document, onlyTable(document)); assertThat(above.getText()).as("no line between them").isNotEmpty(); - assertThat(spacingAfter(above)).isEqualTo(Math.round((GAP + EDGE) * 20)); + assertThat(spacingAfter(above)).as("and what that line owes below it for its raise") + .isEqualTo(Math.round((GAP + EDGE) * 20) + DocxExports.DEFAULT_LINE_RAISE); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxStackedLayersTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxStackedLayersTest.java index 3e0e30eeb..f7c2ede73 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxStackedLayersTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxStackedLayersTest.java @@ -92,8 +92,8 @@ void theLastLineOfAStackEndsAtTheContainersFootAndHangsPastNothing() throws Exce + line(paragraph(document, "Three")); assertThat(stack).as("as tall as the box, its last line's own 36pt running past it") .isCloseTo(2 * PITCH + 34, within(0.1)); - assertThat(before(paragraph(document, "After"))).as("the whole gap under the box") - .isCloseTo(30, within(0.05)); + assertThat(before(paragraph(document, "After"))).as("the whole gap under the box, less its line's raise") + .isCloseTo(30 - DocxExports.DEFAULT_LINE_RAISE / 20.0, within(0.05)); } } @@ -112,8 +112,8 @@ void theLettersOfAStacksLastLineHangingPastTheFootComeOutOfTheGapUnderIt() throw assertThat(hang).as("just below its letters, not where its own line ends") .isCloseTo(last.pageBaseline() + last.inkBelow() + DocxStackedLines.INK_MARGIN - (2 * PITCH + 26), within(0.1)); - assertThat(before(paragraph(document, "After"))).as("by as much less gap under it") - .isCloseTo(30 - hang, within(0.1)); + assertThat(before(paragraph(document, "After"))).as("by as much less gap under it, and its line's raise") + .isCloseTo(30 - hang - DocxExports.DEFAULT_LINE_RAISE / 20.0, within(0.1)); } } diff --git a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxVerticalSpacingTest.java b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxVerticalSpacingTest.java index b26f6f69a..5e0f36c34 100644 --- a/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxVerticalSpacingTest.java +++ b/render-docx/src/test/java/com/demcha/compose/document/backend/semantic/docx/DocxVerticalSpacingTest.java @@ -31,11 +31,15 @@ * the first paragraph written inside it and its bottom edge to the last, because that is * where a reader sees it either way.

* + *

The space above a line of the default text is written less what the line is raised into + * it, and that is owed below the line ({@link DocxExports#DEFAULT_LINE_RAISE}).

+ * * @author Artem Demchyshyn */ class DocxVerticalSpacingTest { private static final double TWIPS_PER_POINT = 20.0; + private static final long RAISE = DocxExports.DEFAULT_LINE_RAISE; @Test void aParagraphCarriesItsOwnMarginAndPadding() throws Exception { @@ -46,7 +50,7 @@ void aParagraphCarriesItsOwnMarginAndPadding() throws Exception { .margin(DocumentInsets.bottom(6))) .addParagraph(p -> p.text("Below"))); - assertThat(before(paragraphs.get(1))).isEqualTo(Math.round(16 * TWIPS_PER_POINT)); + assertThat(before(paragraphs.get(1))).isEqualTo(Math.round(16 * TWIPS_PER_POINT) - RAISE); assertThat(before(paragraphs.get(2))) .as("the 6pt below it, written once, above what follows") .isEqualTo(Math.round(6 * TWIPS_PER_POINT)); @@ -60,7 +64,7 @@ void marginAndPaddingOnTheSameEdgeAddUp() throws Exception { .padding(DocumentInsets.top(10)) .margin(DocumentInsets.top(4)))); - assertThat(before(paragraphs.get(0))).isEqualTo(Math.round(14 * TWIPS_PER_POINT)); + assertThat(before(paragraphs.get(0))).isEqualTo(Math.round(14 * TWIPS_PER_POINT) - RAISE); } @Test @@ -76,11 +80,12 @@ void aContainersEdgesGoToItsFirstAndLastParagraph() throws Exception { assertThat(paragraphs).hasSize(4); assertThat(before(paragraphs.get(0))) .as("14pt of padding and 6pt of margin, on the paragraph that starts the card") - .isEqualTo(Math.round(20 * TWIPS_PER_POINT)); + .isEqualTo(Math.round(20 * TWIPS_PER_POINT) - RAISE); assertThat(before(paragraphs.get(1))).as("nothing in the middle").isZero(); assertThat(after(paragraphs.get(1))).isZero(); assertThat(before(paragraphs.get(3))) - .as("and the same below the one that ends it, above what follows the card") + .as("and the same below the one that ends it, above what follows the card, raised as far" + + " as the line above it") .isEqualTo(Math.round(20 * TWIPS_PER_POINT)); } @@ -218,7 +223,7 @@ void nestingAddsUpOnTheSameParagraph() throws Exception { .padding(DocumentInsets.top(12)) .addParagraph(p -> p.text("Deep").padding(DocumentInsets.top(3)))))); - assertThat(before(paragraphs.get(0))).isEqualTo(Math.round(23 * TWIPS_PER_POINT)); + assertThat(before(paragraphs.get(0))).isEqualTo(Math.round(23 * TWIPS_PER_POINT) - RAISE); } @Test @@ -236,7 +241,7 @@ void aContainerOfTablesHandsOnItsBottomEdgeAndDropsItsTop() throws Exception { assertThat(before(paragraphs.get(paragraphs.size() - 1))) .as("the bottom edge, and only it — the top one did not follow the table out") - .isEqualTo(160L); + .isEqualTo(160L - RAISE); } @Test @@ -260,7 +265,7 @@ void aContainerThatWritesNothingHandsBackTheEdgesAroundIt() throws Exception { assertThat(paragraphs).hasSize(1); assertThat(before(paragraphs.get(0))) .as("the sidebar's 30pt of padding, then the portrait's 5 + 40 + 7") - .isEqualTo(Math.round(82 * TWIPS_PER_POINT)); + .isEqualTo(Math.round(82 * TWIPS_PER_POINT) - RAISE); } @Test @@ -335,7 +340,7 @@ void aTableDropsTheEdgeItStoodBelow() throws Exception { .isZero(); assertThat(before(pastADivider.get(pastADivider.size() - 1))) .as("nor was it handed on by the divider the export drops, which keeps its own 4pt") - .isEqualTo(Math.round(4 * TWIPS_PER_POINT)); + .isEqualTo(Math.round(4 * TWIPS_PER_POINT) - RAISE); } @Test @@ -350,7 +355,7 @@ void oneGapIsWrittenOnceRatherThanFromBothSides() throws Exception { assertThat(before(paragraphs.get(1))) .as("the whole gap, on the side that can hold it") - .isEqualTo(Math.round(36 * TWIPS_PER_POINT)); + .isEqualTo(Math.round(36 * TWIPS_PER_POINT) - RAISE); assertThat(after(paragraphs.get(0))) .as("and nothing on the other, so adding and taking the maximum agree") .isZero(); @@ -435,7 +440,7 @@ void aTableHoldsItsOwnSpaceAboveAndBelow() throws Exception { .isEqualTo(Math.round(9 * TWIPS_PER_POINT)); assertThat(before(paragraphs.get(1))) .as("its bottom edge, on the paragraph below it") - .isEqualTo(Math.round(12 * TWIPS_PER_POINT)); + .isEqualTo(Math.round(12 * TWIPS_PER_POINT) - RAISE); } @Test @@ -450,7 +455,7 @@ void aRowHoldsItsOwnPaddingTheSameWay() throws Exception { .addParagraph(p -> p.text("After"))); assertThat(after(paragraphs.get(0))).isEqualTo(Math.round(14 * TWIPS_PER_POINT)); - assertThat(before(paragraphs.get(1))).isEqualTo(Math.round(14 * TWIPS_PER_POINT)); + assertThat(before(paragraphs.get(1))).isEqualTo(Math.round(14 * TWIPS_PER_POINT) - RAISE); } @Test @@ -464,7 +469,7 @@ void aTableWithNothingAboveItLosesThatEdgeAndKeepsTheOther() throws Exception { assertThat(before(paragraphs.get(0))) .as("the bottom edge and only it — the top had nothing to land on") - .isEqualTo(Math.round(12 * TWIPS_PER_POINT)); + .isEqualTo(Math.round(12 * TWIPS_PER_POINT) - RAISE); } @Test @@ -486,7 +491,7 @@ void aPictureKeepsItsOwnMargin() throws Exception { // top edge is on it and its bottom edge lands on the paragraph after. assertThat(before(paragraphs.get(paragraphs.size() - 1))) .as("the picture's bottom edge reaches the block under it") - .isEqualTo(Math.round(12 * TWIPS_PER_POINT)); + .isEqualTo(Math.round(12 * TWIPS_PER_POINT) - RAISE); } @Test @@ -513,7 +518,7 @@ void aListKeepsItsOwnBoxAndTheSpaceBetweenItsItems() throws Exception { assertThat(before(paragraphs.get(3))).isEqualTo(Math.round(3 * TWIPS_PER_POINT)); assertThat(before(paragraphs.get(4))) .as("the list's bottom edge, on the paragraph after it") - .isEqualTo(Math.round(10 * TWIPS_PER_POINT)); + .isEqualTo(Math.round(10 * TWIPS_PER_POINT) - RAISE); } @Test @@ -548,7 +553,7 @@ void aNegativeBottomEdgePullsTheNextParagraphUpOutOfItsContainer() throws Except .addParagraph(p -> p.text("Role").margin(new DocumentInsets(10, 0, 0, 0)))); assertThat(after(body.get(0))).as("no space below the line pulled into").isZero(); - assertThat(before(body.get(1))).isEqualTo(Math.round((10 - 4) * TWIPS_PER_POINT)); + assertThat(before(body.get(1))).isEqualTo(Math.round((10 - 4) * TWIPS_PER_POINT) - RAISE); } @Test @@ -569,7 +574,7 @@ void aPullTheSpaceOwedAboveCannotGiveComesOutOfTheParagraphsOwnEdge() throws Exc .addParagraph(p -> p.text("Role").margin(new DocumentInsets(10, 0, 0, 0)))); assertThat(after(body.get(0))).isZero(); - assertThat(before(body.get(1))).isEqualTo(Math.round((2 - 4 + 10) * TWIPS_PER_POINT)); + assertThat(before(body.get(1))).isEqualTo(Math.round((2 - 4 + 10) * TWIPS_PER_POINT) - RAISE); } @Test @@ -590,7 +595,7 @@ void aPullComesOutOfASpacerUnderIt() throws Exception { .addParagraph(p -> p.text("After"))); // Less the spacer's own hairline, which is part of its height. - assertThat(before(body.get(1))).isEqualTo(Math.round((10 - 4 - 0.1) * TWIPS_PER_POINT)); + assertThat(before(body.get(1))).isEqualTo(Math.round((10 - 4 - 0.1) * TWIPS_PER_POINT) - RAISE); } @Test @@ -602,7 +607,7 @@ void aPullStopsAtATable() throws Exception { assertThat(before(body.stream().filter(p -> p.getText().equals("After")).findFirst().orElseThrow())) .as("the paragraph after the table keeps its own edge") - .isEqualTo(Math.round(10 * TWIPS_PER_POINT)); + .isEqualTo(Math.round(10 * TWIPS_PER_POINT) - RAISE); } private static long before(XWPFParagraph paragraph) {