@airmark/quiver 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/package.json +5 -4
- package/quills/af4141/0.1.0/Quill.yaml +1 -2
- package/quills/af4141/0.1.0/plate.typ +3 -3
- package/quills/daf1206/0.1.0/Quill.yaml +1 -2
- package/quills/daf1206/0.1.0/plate.typ +2 -2
- package/quills/daf4392/0.1.0/Quill.yaml +1 -2
- package/quills/daf4392/0.1.0/plate.typ +4 -4
- package/quills/usaf_memo/0.2.0/Quill.yaml +3 -4
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +1 -2
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +5 -3
- package/quills/usaf_memo/0.2.0/plate.typ +5 -5
- package/quills/af4141/0.1.0/example.md +0 -86
- package/quills/daf1206/0.1.0/example.md +0 -23
- package/quills/daf4392/0.1.0/example.md +0 -34
- package/quills/usaf_memo/0.2.0/example.md +0 -56
package/README.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@airmark/quiver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"description": "Airmark Quiver — Air Force and DAF document Quills for Quillmark.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -16,11 +16,12 @@
|
|
|
16
16
|
"node": ">=24"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@quillmark/quiver": "^0.
|
|
20
|
-
"@quillmark/wasm": "^0.
|
|
19
|
+
"@quillmark/quiver": "^0.11.0",
|
|
20
|
+
"@quillmark/wasm": "^0.80.0"
|
|
21
21
|
},
|
|
22
22
|
"scripts": {
|
|
23
|
-
"test": "
|
|
23
|
+
"test": "quiver test",
|
|
24
|
+
"preview": "quiver preview",
|
|
24
25
|
"release:patch": "npm version patch -m \"chore(release): %s\" && git push --follow-tags",
|
|
25
26
|
"release:minor": "npm version minor -m \"chore(release): %s\" && git push --follow-tags"
|
|
26
27
|
},
|
|
@@ -3,7 +3,6 @@ quill:
|
|
|
3
3
|
version: 0.1.0
|
|
4
4
|
backend: typst
|
|
5
5
|
plate_file: plate.typ
|
|
6
|
-
example_file: example.md
|
|
7
6
|
description: "AF Form 4141 — Individual's Record of Duties and Experience, Ground Environment Personnel"
|
|
8
7
|
|
|
9
8
|
main:
|
|
@@ -28,7 +27,7 @@ main:
|
|
|
28
27
|
type: string
|
|
29
28
|
description: Commander's authentication entry on page 1.
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
card_kinds:
|
|
32
31
|
experience:
|
|
33
32
|
description: Each card represents one row in the Record of Experience table. Rows fill page 1 (up to 16 rows) then page 2 (up to 21 rows), for a maximum of 37 rows.
|
|
34
33
|
ui:
|
|
@@ -35,14 +35,14 @@
|
|
|
35
35
|
#if "grade" in data { vals.insert("commonforms_text_p1_3", data.grade) }
|
|
36
36
|
#if "commanders_auth" in data { vals.insert("commonforms_text_p1_116", data.commanders_auth) }
|
|
37
37
|
|
|
38
|
-
// --- Experience table rows from
|
|
38
|
+
// --- Experience table rows from CARDS ---
|
|
39
39
|
// The form supports 16 rows on page 1 and 21 rows on page 2 (37 total).
|
|
40
40
|
// Overflow rows are silently ignored.
|
|
41
41
|
#let max-rows = 37
|
|
42
42
|
#{
|
|
43
43
|
let row = 0
|
|
44
|
-
for card in data.
|
|
45
|
-
if card.
|
|
44
|
+
for card in data.CARDS {
|
|
45
|
+
if card.CARD == "experience" {
|
|
46
46
|
if row < max-rows {
|
|
47
47
|
for (col, key) in col-keys.enumerate() {
|
|
48
48
|
let value = form-cell(card.at(key, default: none))
|
|
@@ -3,7 +3,6 @@ quill:
|
|
|
3
3
|
version: 0.1.0
|
|
4
4
|
backend: typst
|
|
5
5
|
plate_file: plate.typ
|
|
6
|
-
example_file: example.md
|
|
7
6
|
description: "DAF Form 1206 — Nomination for Award"
|
|
8
7
|
|
|
9
8
|
main:
|
|
@@ -39,7 +38,7 @@ main:
|
|
|
39
38
|
unit_commander_rank_name_and_telephone:
|
|
40
39
|
type: string
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
card_kinds:
|
|
43
42
|
accomplishments_continued:
|
|
44
43
|
description: Optional. Add this card only when page 2 overflow is required. Use the card body for continued bullets. Rank/name on page 2 matches the main nominee line automatically.
|
|
45
44
|
ui:
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
#let continued-key = "SPECIFIC_ACCOMPLISHMENTS_Use_Performance_Statements_IAW_DAFMAN_362806_Continued"
|
|
41
|
-
#for card in data.
|
|
42
|
-
if card.
|
|
41
|
+
#for card in data.CARDS {
|
|
42
|
+
if card.CARD == "accomplishments_continued" and continued-key not in vals and "BODY" in card {
|
|
43
43
|
vals.insert(continued-key, card.BODY)
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -3,7 +3,6 @@ quill:
|
|
|
3
3
|
version: 0.1.0
|
|
4
4
|
backend: typst
|
|
5
5
|
plate_file: plate.typ
|
|
6
|
-
example_file: example.md
|
|
7
6
|
description: "DAF Form 4392 - Pre-Departure Safety Briefing (Page 2)"
|
|
8
7
|
|
|
9
8
|
main:
|
|
@@ -81,7 +80,7 @@ main:
|
|
|
81
80
|
type: string
|
|
82
81
|
description: "Put in your Emergency Contact's Phone Number."
|
|
83
82
|
|
|
84
|
-
|
|
83
|
+
card_kinds:
|
|
85
84
|
itinerary:
|
|
86
85
|
description: "Each card represents one row in the travel itinerary table. Up to 10 rows are supported."
|
|
87
86
|
ui:
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
#tf(40pt, 100pt)[#show-date(data.at("departure_date", default: none))]
|
|
30
30
|
#tf(123pt, 100pt)[#data.at("final_destination", default: "")]
|
|
31
31
|
|
|
32
|
-
// Itinerary Rows (via
|
|
32
|
+
// Itinerary Rows (via CARDS)
|
|
33
33
|
#{
|
|
34
34
|
let row = 0
|
|
35
35
|
let dy-start = 160pt
|
|
36
36
|
let dy-step = 40pt
|
|
37
|
-
if "
|
|
38
|
-
for card in data.
|
|
39
|
-
if card.
|
|
37
|
+
if "CARDS" in data {
|
|
38
|
+
for card in data.CARDS {
|
|
39
|
+
if card.CARD == "itinerary" and row < 10 {
|
|
40
40
|
let dy = dy-start + (row * dy-step)
|
|
41
41
|
tf(80pt, dy)[#show-date(card.at("date", default: none))]
|
|
42
42
|
tf(135pt, dy)[#card.at("departure_point", default: "")]
|
|
@@ -3,7 +3,6 @@ quill:
|
|
|
3
3
|
version: 0.2.0
|
|
4
4
|
backend: typst
|
|
5
5
|
plate_file: plate.typ
|
|
6
|
-
example_file: example.md
|
|
7
6
|
description: U.S. Air Force and Space Force Official Memorandum
|
|
8
7
|
|
|
9
8
|
main:
|
|
@@ -25,7 +24,7 @@ main:
|
|
|
25
24
|
|
|
26
25
|
memo_from:
|
|
27
26
|
type: array
|
|
28
|
-
|
|
27
|
+
default: []
|
|
29
28
|
example:
|
|
30
29
|
- ORG/SYMBOL
|
|
31
30
|
- Organization Name
|
|
@@ -33,7 +32,7 @@ main:
|
|
|
33
32
|
- City ST 12345-6789
|
|
34
33
|
ui:
|
|
35
34
|
group: Addressing
|
|
36
|
-
description: If recipients are on the same installation, use only the office symbol. For recipients on other installations, include the full mailing address to enable return correspondence.
|
|
35
|
+
description: "If recipients are on the same installation, use only the office symbol. For recipients on other installations, include the full mailing address to enable return correspondence. Omit entirely to produce a Memorandum for Record (no MEMO FROM line)."
|
|
37
36
|
|
|
38
37
|
subject:
|
|
39
38
|
type: string
|
|
@@ -182,7 +181,7 @@ main:
|
|
|
182
181
|
compact: true
|
|
183
182
|
description: "Optional marking appended after double slash (e.g. NF with classification CUI renders as CUI//NF). Leave blank to show only the classification with no //."
|
|
184
183
|
|
|
185
|
-
|
|
184
|
+
card_kinds:
|
|
186
185
|
indorsement:
|
|
187
186
|
description: Chain of routing endorsements. Each endorsement block adds an official response or forwarding action to the original memo.
|
|
188
187
|
ui:
|
|
@@ -31,7 +31,6 @@
|
|
|
31
31
|
) = {
|
|
32
32
|
assert(subject != none, message: "subject is required")
|
|
33
33
|
assert(memo_for != none, message: "memo_for is required")
|
|
34
|
-
assert(memo_from != none, message: "memo_from is required")
|
|
35
34
|
assert(
|
|
36
35
|
memo_style in ("usaf", "daf"),
|
|
37
36
|
message: "memo_style must be \"usaf\" or \"daf\"",
|
|
@@ -147,7 +146,7 @@
|
|
|
147
146
|
|
|
148
147
|
render-date-section(actual_date, memo-style: memo_style)
|
|
149
148
|
render-for-section(memo_for, memo_for_cols)
|
|
150
|
-
render-from-section(memo_from)
|
|
149
|
+
if not falsey(memo_from) { render-from-section(memo_from) }
|
|
151
150
|
render-subject-section(subject)
|
|
152
151
|
render-references-section(references)
|
|
153
152
|
|
|
@@ -98,9 +98,9 @@
|
|
|
98
98
|
" ",
|
|
99
99
|
align(left)[
|
|
100
100
|
#if type(recipients) == array {
|
|
101
|
-
create-auto-grid(recipients, column-gutter: spacing.tab, cols: cols)
|
|
101
|
+
create-auto-grid(recipients.map(upper), column-gutter: spacing.tab, cols: cols)
|
|
102
102
|
} else {
|
|
103
|
-
recipients
|
|
103
|
+
upper(recipients)
|
|
104
104
|
}
|
|
105
105
|
],
|
|
106
106
|
)
|
|
@@ -353,7 +353,9 @@
|
|
|
353
353
|
(if attachment-count == 1 { "Attachment" } else { str(attachment-count) + " Attachments" })
|
|
354
354
|
+ " (listed on next page):"
|
|
355
355
|
)
|
|
356
|
-
|
|
356
|
+
// AFH 33-337: a single attachment is not numbered; numbering applies to two or more.
|
|
357
|
+
let numbering-style = if attachment-count == 1 { none } else { "1." }
|
|
358
|
+
render-backmatter-section(attachments, section-label, numbering-style: numbering-style, continuation-label: continuation-label)
|
|
357
359
|
}
|
|
358
360
|
|
|
359
361
|
if cc != none and cc.len() > 0 {
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
// Receiver information
|
|
22
22
|
memo_for: data.memo_for,
|
|
23
23
|
|
|
24
|
-
// Sender information
|
|
25
|
-
memo_from: data.memo_from,
|
|
24
|
+
// Sender information (omitted for Memorandum for Record)
|
|
25
|
+
..if data.at("memo_from", default: ()).len() > 0 { (memo_from: data.memo_from) },
|
|
26
26
|
|
|
27
27
|
// Subject line
|
|
28
28
|
subject: data.subject,
|
|
@@ -69,9 +69,9 @@
|
|
|
69
69
|
..if "attachments" in data { (attachments: data.attachments) },
|
|
70
70
|
)
|
|
71
71
|
|
|
72
|
-
// Indorsements - iterate through
|
|
73
|
-
#for (i, card) in data.
|
|
74
|
-
if card.
|
|
72
|
+
// Indorsements - iterate through CARDS array and filter by CARD tag
|
|
73
|
+
#for (i, card) in data.CARDS.enumerate() {
|
|
74
|
+
if card.CARD == "indorsement" {
|
|
75
75
|
// The quillmark helper leaves an unset/whitespace-only markdown body as
|
|
76
76
|
// the empty string `""`; only non-empty bodies are eval'd into content.
|
|
77
77
|
// Pass truly empty content (`[]`) in the empty case so indorsement can
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
QUILL: af4141@0.1
|
|
3
|
-
# EDIT: Full name in Last, First, Middle Initial format
|
|
4
|
-
name: "LAST, FIRST M."
|
|
5
|
-
# EDIT: Unit of assignment (e.g., "1 ACCS/DOT", "726 ACS/MOC")
|
|
6
|
-
unit: "UNIT/SYMBOL"
|
|
7
|
-
# EDIT: Current grade or CCC level (e.g., "SSgt", "GS-12", "3")
|
|
8
|
-
grade: "GRADE"
|
|
9
|
-
# EDIT: Commander's authentication entry — often a commander's name/signature block or "Verified by unit commander"
|
|
10
|
-
commanders_auth: ""
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
<!-- ═══════════════════════════════════════════════════════════════
|
|
14
|
-
RECORD OF EXPERIENCE LEAVES
|
|
15
|
-
Each card below becomes one row in the experience table.
|
|
16
|
-
Page 1 holds up to 16 rows; Page 2 holds up to 21 rows (37 max).
|
|
17
|
-
|
|
18
|
-
Required reportable actions include:
|
|
19
|
-
• Initial/subsequent duty assignment
|
|
20
|
-
• Written and/or positional upgrade evaluations
|
|
21
|
-
• Certification events (Mission Ready, Senior Director, etc.)
|
|
22
|
-
• Downgrade or decertification
|
|
23
|
-
• PCS/PCA departure
|
|
24
|
-
• Temporary duty of significant duration
|
|
25
|
-
• Any other commander-directed entry
|
|
26
|
-
|
|
27
|
-
Leave blank any columns that do not apply to a given entry.
|
|
28
|
-
═══════════════════════════════════════════════════════════════ -->
|
|
29
|
-
|
|
30
|
-
<!-- Example 1: Initial assignment to a unit -->
|
|
31
|
-
---
|
|
32
|
-
KIND: experience
|
|
33
|
-
date: 2025-01-15
|
|
34
|
-
action: "Assigned to 1 ACCS/DOT as Weapons Director"
|
|
35
|
-
written_grade: ""
|
|
36
|
-
written_grade_date: 2025-01-15
|
|
37
|
-
positional_grade: ""
|
|
38
|
-
positional_grade_date: 2025-01-15
|
|
39
|
-
auth_or_remarks: "Initial assignment"
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
<!-- Example 2: Written upgrade evaluation -->
|
|
43
|
-
---
|
|
44
|
-
KIND: experience
|
|
45
|
-
date: 2025-03-15
|
|
46
|
-
action: "Completed written upgrade evaluation for 3-Level"
|
|
47
|
-
written_grade: "3"
|
|
48
|
-
written_grade_date: 2025-03-15
|
|
49
|
-
positional_grade: ""
|
|
50
|
-
positional_grade_date: 2025-03-15
|
|
51
|
-
auth_or_remarks: "Per AFMAN 13-1CRCV1"
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
<!-- Example 3: Positional (live-environment) upgrade / certification -->
|
|
55
|
-
---
|
|
56
|
-
KIND: experience
|
|
57
|
-
date: 2025-06-20
|
|
58
|
-
action: "Certified Mission Ready — positional upgrade"
|
|
59
|
-
written_grade: ""
|
|
60
|
-
written_grade_date: 2025-06-20
|
|
61
|
-
positional_grade: "4"
|
|
62
|
-
positional_grade_date: 2025-06-20
|
|
63
|
-
auth_or_remarks: "SSgt Jones, T.R."
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
<!-- Example 4: Combined written + positional upgrade (both columns filled) -->
|
|
67
|
-
---
|
|
68
|
-
KIND: experience
|
|
69
|
-
date: 2025-08-01
|
|
70
|
-
action: "Upgrade evaluation — written and positional"
|
|
71
|
-
written_grade: "4"
|
|
72
|
-
written_grade_date: 2025-08-01
|
|
73
|
-
positional_grade: "4"
|
|
74
|
-
positional_grade_date: 2025-08-01
|
|
75
|
-
auth_or_remarks: "Verified by unit commander"
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
<!-- Example 5: PCS departure — no written/positional grade; omit grade dates (or use "") -->
|
|
79
|
-
---
|
|
80
|
-
KIND: experience
|
|
81
|
-
date: 2025-09-01
|
|
82
|
-
action: "PCS to 726 ACS/MOC, Tinker AFB OK"
|
|
83
|
-
written_grade: ""
|
|
84
|
-
positional_grade: ""
|
|
85
|
-
auth_or_remarks: "Outprocessed 1 ACCS/DOT"
|
|
86
|
-
---
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
QUILL: daf1206@0.1.0
|
|
3
|
-
award: "CY2018 Stripes for Exceptional Performers II Board"
|
|
4
|
-
category_if_applicable: "Senior Master Sgt"
|
|
5
|
-
award_period: "N/A"
|
|
6
|
-
rankname_of_nominee: "Smith, John Q., SMSgt"
|
|
7
|
-
majcom_fldcom_foa_or_dru: "MAJCOM of Assignment"
|
|
8
|
-
dafsc_duty_title: "3F071/NCOIC, 123rd Force Support Squadron"
|
|
9
|
-
nominees_telephone_dsn_commercial: "DSN XXXX-XXXX, Comm (XXX) XXX-XXXX"
|
|
10
|
-
unit_office_symbol_street_address_base_state_zip: "123 FSS/FMSPD, Someplace AFB, CO XXXXX"
|
|
11
|
-
unit_commander_rank_name_and_telephone: "Lt Col Jane C. Doe, DSN XXX-XXXXXXX, Comm (XXX) XXX-XXXX"
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
Use this main body for page 1 accomplishments.
|
|
15
|
-
- Keep bullet format.
|
|
16
|
-
- Replace all placeholder values.
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
KIND: accomplishments_continued
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
Use this card body only if page 2 overflow is needed.
|
|
23
|
-
- Add continuation bullets here.
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
QUILL: daf4392
|
|
3
|
-
|
|
4
|
-
transportation_mode: "other"
|
|
5
|
-
departure_date: 2026-03-26
|
|
6
|
-
final_destination: "123 Sesame St, Fake City, MS"
|
|
7
|
-
notes: "Visiting Donald Duck over 3 day weekend."
|
|
8
|
-
organization: "333 TRS"
|
|
9
|
-
briefed_date: 2026-03-25
|
|
10
|
-
briefee_name: "Doe, Jane"
|
|
11
|
-
briefee_grade: "O-1"
|
|
12
|
-
briefer_name: ""
|
|
13
|
-
briefer_grade: ""
|
|
14
|
-
emergency_contact_name: "John Doe"
|
|
15
|
-
emergency_contact_phone: "999-999-9999"
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
KIND: itinerary
|
|
20
|
-
date: 2026-03-26
|
|
21
|
-
departure_point: "Biloxi, MS"
|
|
22
|
-
arrival_point: "Fake City, MS"
|
|
23
|
-
rest_length: "2 days"
|
|
24
|
-
mileage: "250"
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
KIND: itinerary
|
|
29
|
-
date: 2026-03-29
|
|
30
|
-
departure_point: "Fake City, MS"
|
|
31
|
-
arrival_point: "Biloxi, MS"
|
|
32
|
-
rest_length: "0"
|
|
33
|
-
mileage: "0"
|
|
34
|
-
---
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
# Essential
|
|
3
|
-
#===========
|
|
4
|
-
QUILL: usaf_memo@0.2.0
|
|
5
|
-
letterhead_title: DEPARTMENT OF THE AIR FORCE
|
|
6
|
-
letterhead_caption:
|
|
7
|
-
- HEADQUARTERS YOUR UNIT NAME
|
|
8
|
-
date: 2504-10-05
|
|
9
|
-
memo_for:
|
|
10
|
-
- ORG/SYMBOL # Organization/office symbol in UPPERCASE
|
|
11
|
-
# - DISTRIBUTION # For numerous recipients, use 'DISTRIBUTION' and list them below
|
|
12
|
-
memo_from:
|
|
13
|
-
- ORG/SYMBOL
|
|
14
|
-
- Organization Name
|
|
15
|
-
- 123 Street Ave
|
|
16
|
-
- City ST 12345-6789
|
|
17
|
-
subject: Subject of the Memorandum
|
|
18
|
-
|
|
19
|
-
# Optional
|
|
20
|
-
#===========
|
|
21
|
-
references:
|
|
22
|
-
- AFM 33-326, 31 July 2019, Preparing Official Communications
|
|
23
|
-
cc:
|
|
24
|
-
- ORG/SYMBOL
|
|
25
|
-
distribution:
|
|
26
|
-
- 1st ORG/SYMBOL
|
|
27
|
-
attachments:
|
|
28
|
-
- Attachment description, YYYY MMM DD
|
|
29
|
-
signature_block:
|
|
30
|
-
- FIRST M. LAST, Rank, USAF
|
|
31
|
-
- Duty Title
|
|
32
|
-
tag_line: Aim High
|
|
33
|
-
classification: UNCLASSIFIED
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
The `usaf_memo` Quill package takes care of all 33-337 formatting details. Focus on the content.
|
|
37
|
-
|
|
38
|
-
**Numbering** Top-level paragraphs like this one are automatically numbered. NEVER manually number your paragraphs.
|
|
39
|
-
|
|
40
|
-
- Use bullets for hierarchical paragraph nesting. These are automatically numbered or lettered as well.
|
|
41
|
-
- Up to five levels of paragraphs are supported
|
|
42
|
-
|
|
43
|
-
Do not include a complimentary close (e.g. "Respectfully,") in official memorandums.
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
KIND: indorsement
|
|
47
|
-
for: ORG/SYMBOL
|
|
48
|
-
format: standard
|
|
49
|
-
from: ORG/SYMBOL
|
|
50
|
-
action: undecided
|
|
51
|
-
signature_block:
|
|
52
|
-
- FIRST M. LAST, Rank, USAF
|
|
53
|
-
- Duty Title
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
This body and the metdata above are an indorsement card. Multiple or no indorsements leaves can be used.
|