KonstantinosKakkavas commited on
Commit
1108a3a
1 Parent(s): 82acdca

Upload 29 files

Browse files
.idea/.gitignore ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
4
+ # Editor-based HTTP Client requests
5
+ /httpRequests/
6
+ # Datasource local storage ignored files
7
+ /dataSources/
8
+ /dataSources.local.xml
.idea/inspectionProfiles/profiles_settings.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
.idea/invoice_extractor.iml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="jdk" jdkName="llm_env" jdkType="Python SDK" />
6
+ <orderEntry type="sourceFolder" forTests="false" />
7
+ </component>
8
+ </module>
.idea/material_theme_project_new.xml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="MaterialThemeProjectNewConfig">
4
+ <option name="metadata">
5
+ <MTProjectMetadataState>
6
+ <option name="migrated" value="true" />
7
+ <option name="pristineConfig" value="false" />
8
+ <option name="userId" value="13c809ac:18ec6bfab90:-7ffe" />
9
+ </MTProjectMetadataState>
10
+ </option>
11
+ </component>
12
+ </project>
.idea/misc.xml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="C:\Users\kosti\anaconda3" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="llm_env" project-jdk-type="Python SDK" />
7
+ </project>
.idea/modules.xml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/invoice_extractor.iml" filepath="$PROJECT_DIR$/.idea/invoice_extractor.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="$PROJECT_DIR$/pdfkit-invoice" vcs="Git" />
5
+ </component>
6
+ </project>
.idea/workspace.xml ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="5d5b8dc8-e7fe-43d9-8802-74478f493adb" name="Changes" comment="" />
8
+ <option name="SHOW_DIALOG" value="false" />
9
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
10
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
11
+ <option name="LAST_RESOLUTION" value="IGNORE" />
12
+ </component>
13
+ <component name="FileTemplateManagerImpl">
14
+ <option name="RECENT_TEMPLATES">
15
+ <list>
16
+ <option value="Python Script" />
17
+ </list>
18
+ </option>
19
+ </component>
20
+ <component name="Git.Settings">
21
+ <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/pdfkit-invoice" />
22
+ </component>
23
+ <component name="ProjectColorInfo">{
24
+ &quot;associatedIndex&quot;: 4
25
+ }</component>
26
+ <component name="ProjectId" id="2f2dqHtOqUJDiIt51G8oHM6rauH" />
27
+ <component name="ProjectViewState">
28
+ <option name="hideEmptyMiddlePackages" value="true" />
29
+ <option name="showLibraryContents" value="true" />
30
+ </component>
31
+ <component name="PropertiesComponent">{
32
+ &quot;keyToString&quot;: {
33
+ &quot;Python.pdf_reader.executor&quot;: &quot;Run&quot;,
34
+ &quot;Python.real_promises_only.executor&quot;: &quot;Run&quot;,
35
+ &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
36
+ &quot;git-widget-placeholder&quot;: &quot;master&quot;,
37
+ &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
38
+ &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
39
+ &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
40
+ &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
41
+ &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
42
+ &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
43
+ }
44
+ }</component>
45
+ <component name="RunManager" selected="Python.real_promises_only">
46
+ <configuration name="app" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
47
+ <module name="invoice_extractor" />
48
+ <option name="ENV_FILES" value="" />
49
+ <option name="INTERPRETER_OPTIONS" value="" />
50
+ <option name="PARENT_ENVS" value="true" />
51
+ <envs>
52
+ <env name="PYTHONUNBUFFERED" value="1" />
53
+ </envs>
54
+ <option name="SDK_HOME" value="" />
55
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
56
+ <option name="IS_MODULE_SDK" value="true" />
57
+ <option name="ADD_CONTENT_ROOTS" value="true" />
58
+ <option name="ADD_SOURCE_ROOTS" value="true" />
59
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
60
+ <option name="SCRIPT_NAME" value="C:\Users\kosti\PycharmProjects\invoice_extractor\app.py" />
61
+ <option name="PARAMETERS" value="" />
62
+ <option name="SHOW_COMMAND_LINE" value="false" />
63
+ <option name="EMULATE_TERMINAL" value="false" />
64
+ <option name="MODULE_MODE" value="false" />
65
+ <option name="REDIRECT_INPUT" value="false" />
66
+ <option name="INPUT_FILE" value="" />
67
+ <method v="2" />
68
+ </configuration>
69
+ <configuration name="pdf_reader" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
70
+ <module name="invoice_extractor" />
71
+ <option name="ENV_FILES" value="" />
72
+ <option name="INTERPRETER_OPTIONS" value="" />
73
+ <option name="PARENT_ENVS" value="true" />
74
+ <envs>
75
+ <env name="PYTHONUNBUFFERED" value="1" />
76
+ </envs>
77
+ <option name="SDK_HOME" value="" />
78
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
79
+ <option name="IS_MODULE_SDK" value="true" />
80
+ <option name="ADD_CONTENT_ROOTS" value="true" />
81
+ <option name="ADD_SOURCE_ROOTS" value="true" />
82
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
83
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/pdf_reader.py" />
84
+ <option name="PARAMETERS" value="" />
85
+ <option name="SHOW_COMMAND_LINE" value="false" />
86
+ <option name="EMULATE_TERMINAL" value="false" />
87
+ <option name="MODULE_MODE" value="false" />
88
+ <option name="REDIRECT_INPUT" value="false" />
89
+ <option name="INPUT_FILE" value="" />
90
+ <method v="2" />
91
+ </configuration>
92
+ <configuration name="real_promises_only" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
93
+ <module name="invoice_extractor" />
94
+ <option name="ENV_FILES" value="" />
95
+ <option name="INTERPRETER_OPTIONS" value="" />
96
+ <option name="PARENT_ENVS" value="true" />
97
+ <envs>
98
+ <env name="PYTHONUNBUFFERED" value="1" />
99
+ </envs>
100
+ <option name="SDK_HOME" value="" />
101
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
102
+ <option name="IS_MODULE_SDK" value="true" />
103
+ <option name="ADD_CONTENT_ROOTS" value="true" />
104
+ <option name="ADD_SOURCE_ROOTS" value="true" />
105
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
106
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/real_promises_only.py" />
107
+ <option name="PARAMETERS" value="" />
108
+ <option name="SHOW_COMMAND_LINE" value="false" />
109
+ <option name="EMULATE_TERMINAL" value="false" />
110
+ <option name="MODULE_MODE" value="false" />
111
+ <option name="REDIRECT_INPUT" value="false" />
112
+ <option name="INPUT_FILE" value="" />
113
+ <method v="2" />
114
+ </configuration>
115
+ <recent_temporary>
116
+ <list>
117
+ <item itemvalue="Python.real_promises_only" />
118
+ <item itemvalue="Python.pdf_reader" />
119
+ </list>
120
+ </recent_temporary>
121
+ </component>
122
+ <component name="SharedIndexes">
123
+ <attachedChunks>
124
+ <set>
125
+ <option value="bundled-js-predefined-1d06a55b98c1-74d2a5396914-JavaScript-PY-241.14494.241" />
126
+ <option value="bundled-python-sdk-0509580d9d50-28c9f5db9ffe-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-241.14494.241" />
127
+ </set>
128
+ </attachedChunks>
129
+ </component>
130
+ <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
131
+ <component name="TaskManager">
132
+ <task active="true" id="Default" summary="Default task">
133
+ <changelist id="5d5b8dc8-e7fe-43d9-8802-74478f493adb" name="Changes" comment="" />
134
+ <created>1713003295790</created>
135
+ <option name="number" value="Default" />
136
+ <option name="presentableId" value="Default" />
137
+ <updated>1713003295790</updated>
138
+ <workItem from="1713003297318" duration="7246000" />
139
+ <workItem from="1713108901124" duration="72000" />
140
+ <workItem from="1713108981255" duration="5119000" />
141
+ <workItem from="1713203072228" duration="313000" />
142
+ <workItem from="1713303909981" duration="380000" />
143
+ </task>
144
+ <servers />
145
+ </component>
146
+ <component name="TypeScriptGeneratedFilesManager">
147
+ <option name="version" value="3" />
148
+ </component>
149
+ <component name="XDebuggerManager">
150
+ <breakpoint-manager>
151
+ <breakpoints>
152
+ <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
153
+ <url>file://$PROJECT_DIR$/app.py</url>
154
+ <line>8</line>
155
+ <option name="timeStamp" value="1" />
156
+ </line-breakpoint>
157
+ </breakpoints>
158
+ </breakpoint-manager>
159
+ </component>
160
+ <component name="com.intellij.coverage.CoverageDataManagerImpl">
161
+ <SUITE FILE_PATH="coverage/invoice_extractor$real_promises_only.coverage" NAME="real_promises_only Coverage Results" MODIFIED="1713113163159" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
162
+ <SUITE FILE_PATH="coverage/invoice_extractor$pdf_reader.coverage" NAME="pdf_reader Coverage Results" MODIFIED="1713010596714" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
163
+ </component>
164
+ </project>
Extracted_Invoice.csv ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ 0
2
+ "
3
+
4
+ {'Invoice no.': '001', 'Description': ['Widget A', 'Widget B'], 'Quantity': ['2', '5'], 'Date': '2024-04-13', 'Unit price': ['$30.00', '$20.00'], 'Amount': ['$60.00', '$100.00'], 'Total': '$168.00', 'email': 'info@gptwidgets.com', 'phone number': '(123) 456-7890', 'address': ['123 AI Lane', 'Model Town', 'OpenAI'], 'customer name': 'John Doe', 'customer address': '789 Coding Rd, Dev City', 'customer email': 'johndoe@example.com', 'customer phone': '(987) 654-3210'}"
Extracted_Invoice1.csv ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 0
2
+ "
3
+
4
+ - Invoice no.: 001
5
+ - Description: Widget A, Widget B
6
+ - Quantity: 2, 5
7
+ - Date: 2024-04-13
8
+ - Unit price: $30.00, $20.00
9
+ - Amount: $60.00, $100.00
10
+ - Total: $160.00
11
+ - Email: info@gptwidgets.com
12
+ - Phone number: (123) 456-7890
13
+ - Address: 123 AI Lane, Model Town, OpenAI"
Extracted_Invoice_001.csv ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ 0
2
+ " {'email': 'info@gptwidgets.com', 'phone number': '(123) 456-7890', 'address': '123 AI Lane, Model Town, OpenAI'}
3
+
4
+ {'Invoice no.': '001', 'Description': 'Widget A', 'Quantity': '2', 'Date': '2024-04-13', 'Unit price': '30.00', 'Amount': '60.00', 'Total': '160.00'}
5
+ {'Invoice no.': '001', 'Description': 'Widget B', 'Quantity': '5', 'Date': '2024-04-13', 'Unit price': '20.00', 'Amount': '100.00', 'Total': '160.00'}
6
+ {'email': 'info@gptwidgets.com', 'phone number': '(123) 456-7890', 'address': '123 AI Lane, Model Town, OpenAI'}"
Invoice_001.pdf ADDED
Binary file (1.63 kB). View file
 
Political_Promises_Fine_Tuning.csv ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ text,label
2
+ "We will build 10,000 kilometres of subway lines in the next ten years.",promise
3
+ We expect the Japanese to increase tariffs next year.,not promise
4
+ We will work towards making Canada a better place.,not promise
5
+ AI will cause the loss of a million jobs next year.,not promise
6
+ The government will provide free college education to all students by 2025.,promise
7
+ Interest rates are expected to rise by next quarter.,not promise
8
+ "We will eliminate the income tax for individuals earning less than $30,000 by next year.",promise
9
+ The economy is predicted to grow by 4% in the coming fiscal year.,not promise
10
+ Our administration will ensure the construction of 500 new schools in rural areas within five years.,promise
11
+ Climate change will likely increase temperatures globally.,not promise
__pycache__/utils.cpython-311.pyc ADDED
Binary file (4.02 kB). View file
 
app.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from dotenv import load_dotenv
3
+
4
+ from utils import *
5
+
6
+
7
+ def main():
8
+ load_dotenv()
9
+
10
+ st.set_page_config(page_title="Invoice Extractor")
11
+ st.title("Invoice Extractor Bot...")
12
+ st.subheader("I can help you in extracting invoice data")
13
+
14
+ # Upload the Invoices (pdf files)
15
+ pdf = st.file_uploader("Upload invoices here", type=["pdf"], accept_multiple_files=True)
16
+
17
+ submit = st.button("Extract Data")
18
+
19
+ if submit:
20
+ with st.spinner("Loading invoices..."):
21
+ df = create_docs(pdf)
22
+ # st.write('managed to extract data from pdf')
23
+ # st.write(df)
24
+ st.write(df.head())
25
+
26
+ # Saving the dataframe as CSV file
27
+ data_as_csv = df.to_csv(index=False).encode('utf-8')
28
+ st.download_button(
29
+ "Download CSV",
30
+ data_as_csv,
31
+ "invoice_extracted_data.csv",
32
+ "text/csv",
33
+ key="download-tools-csv",
34
+ )
35
+
36
+ st.success("Hope I was able to save your time <3")
37
+
38
+
39
+ if __name__ == '__main__':
40
+ main()
extracted_data.csv ADDED
@@ -0,0 +1 @@
 
 
1
+
pdf_reader.py ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # import pandas as pd
2
+ # import json
3
+ #
4
+ #
5
+ # # Function to parse the LLM output and create a DataFrame
6
+ # def process_llm_data(llm_data):
7
+ # # Assuming llm_data is a string that exactly matches the dictionary format
8
+ # # Safely convert string representation of dictionary to a dictionary
9
+ # data_dict = eval(llm_data.strip())
10
+ #
11
+ # # Convert the dictionary to a DataFrame
12
+ # # Since our example has comma-separated values in strings for some fields, let's handle that
13
+ # for key, value in data_dict.items():
14
+ # if ',' in value:
15
+ # data_dict[key] = [v.strip() for v in value.split(',')]
16
+ # else:
17
+ # data_dict[key] = [value]
18
+ #
19
+ # df = pd.DataFrame(data_dict)
20
+ #
21
+ # # Saving the DataFrame to a CSV file
22
+ # csv_file_path = "Invoice_Data.csv"
23
+ # df.to_csv(csv_file_path, index=False)
24
+ #
25
+ # return csv_file_path
26
+ #
27
+ #
28
+ # # Example usage
29
+ # llm_extracted_data = """
30
+ # {
31
+ # 'Invoice no.': '001',
32
+ # 'Description': 'Widget A, Widget B',
33
+ # 'Quantity': '2, 5',
34
+ # 'Date': '2024-04-13',
35
+ # 'Unit price': '$30.00, $20.00',
36
+ # 'Amount': '$60.00, $100.00',
37
+ # 'Total': '$160.00',
38
+ # 'Email': 'info@gptwidgets.com',
39
+ # 'Phone number': '(123) 456-7890',
40
+ # 'Address': '123 AI Lane, Model Town, OpenAI'
41
+ # }
42
+ # """
43
+ #
44
+ # # Call the function to process the data and create a CSV
45
+ # csv_path = process_llm_data(llm_extracted_data)
46
+ # print(f"Data saved to CSV at: {csv_path}")
47
+
48
+ import pandas as pd
49
+ from utils import get_pdf_text, extracted_data
50
+ from dotenv import load_dotenv
51
+
52
+ load_dotenv()
53
+
54
+
55
+ def save_data_to_csv(data, filename):
56
+ # Convert the dictionary to a DataFrame
57
+ df = pd.DataFrame([data])
58
+ print(df)
59
+ # Save the DataFrame to a CSV file
60
+ csv_path = f"{filename}.csv"
61
+ df.to_csv(csv_path, index=False)
62
+ print(f"Data saved to {csv_path}")
63
+
64
+
65
+ # Example usage
66
+ print('filename is {}'.format("Invoice_001.pdf"))
67
+ raw_data = get_pdf_text("Invoice_001.pdf")
68
+ print('raw_data is {}'.format(raw_data))
69
+
70
+ llm_extracted_data = extracted_data(raw_data)
71
+ print('llm_extracted_data is {}'.format(llm_extracted_data))
72
+
73
+ # Assuming llm_extracted_data is a dictionary containing the extracted fields
74
+ save_data_to_csv(llm_extracted_data, "Extracted_Invoice1")
pdfkit-invoice/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ node_modules
2
+ invoice.pdf
pdfkit-invoice/README.md ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PDFKit Invoices
2
+
3
+ <center>
4
+ <a href="https://pspdfkit.com/web">
5
+ <img src="./screenshot.png" alt="Screenshot of an invoice PDF in the PSPDFKit for Web reader." width="1009">
6
+ </a>
7
+ </center>
8
+
9
+ ## Prerequisites
10
+
11
+ - [Node.js](http://nodejs.org/) (with npm or Yarn)
12
+
13
+ ## Getting Started
14
+
15
+ This repository is an example of how to make PDF invoices with PDFKit.
16
+
17
+ There are two important fields in this this repository:
18
+
19
+ - [`index.js`](index.js) is the main entry point. It defines the data structure used to create the invoices.
20
+ - [`createInvoice.js`](createInvoice.js) exports a function that can be used to create invoice PDFs.
21
+
22
+ To get started, use the following commands:
23
+
24
+ ```bash
25
+ git clone https://github.com/PSPDFKit-labs/pdfkit-invoice.git
26
+
27
+ npm install # Install dependencies
28
+
29
+ npm start # This will create an invoice.pdf file in the root of the project.
30
+ ```
31
+
32
+ To learn more about this project, make sure to read the accompanying [blog post](https://pspdfkit.com/blog/2019/generate-invoices-pdfkit-node)
33
+
34
+ ## Contributing
35
+
36
+ Please ensure
37
+ [you have signed our CLA](https://pspdfkit.com/guides/web/current/miscellaneous/contributing/) so that we can
38
+ accept your contributions.
pdfkit-invoice/createInvoice.js ADDED
@@ -0,0 +1,193 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const fs = require("fs");
2
+ const PDFDocument = require("pdfkit");
3
+
4
+ function createInvoice(invoice, path) {
5
+ let doc = new PDFDocument({ size: "A4", margin: 50 });
6
+
7
+ generateHeader(doc);
8
+ generateCustomerInformation(doc, invoice);
9
+ generateInvoiceTable(doc, invoice);
10
+ generateFooter(doc);
11
+
12
+ doc.end();
13
+ doc.pipe(fs.createWriteStream(path));
14
+ }
15
+
16
+ function generateHeader(doc) {
17
+ doc
18
+ .image("logo.png", 50, 45, { width: 50 })
19
+ .fillColor("#444444")
20
+ .fontSize(20)
21
+ .text("ACME Inc.", 110, 57)
22
+ .fontSize(10)
23
+ .text("ACME Inc.", 200, 50, { align: "right" })
24
+ .text("123 Main Street", 200, 65, { align: "right" })
25
+ .text("New York, NY, 10025", 200, 80, { align: "right" })
26
+ .moveDown();
27
+ }
28
+
29
+ function generateCustomerInformation(doc, invoice) {
30
+ doc
31
+ .fillColor("#444444")
32
+ .fontSize(20)
33
+ .text("Invoice", 50, 160);
34
+
35
+ generateHr(doc, 185);
36
+
37
+ const customerInformationTop = 200;
38
+
39
+ doc
40
+ .fontSize(10)
41
+ .text("Invoice Number:", 50, customerInformationTop)
42
+ .font("Helvetica-Bold")
43
+ .text(invoice.invoice_nr, 150, customerInformationTop)
44
+ .font("Helvetica")
45
+ .text("Invoice Date:", 50, customerInformationTop + 15)
46
+ .text(formatDate(new Date()), 150, customerInformationTop + 15)
47
+ .text("Balance Due:", 50, customerInformationTop + 30)
48
+ .text(
49
+ formatCurrency(invoice.subtotal - invoice.paid),
50
+ 150,
51
+ customerInformationTop + 30
52
+ )
53
+
54
+ .font("Helvetica-Bold")
55
+ .text(invoice.shipping.name, 300, customerInformationTop)
56
+ .font("Helvetica")
57
+ .text(invoice.shipping.address, 300, customerInformationTop + 15)
58
+ .text(
59
+ invoice.shipping.city +
60
+ ", " +
61
+ invoice.shipping.state +
62
+ ", " +
63
+ invoice.shipping.country,
64
+ 300,
65
+ customerInformationTop + 30
66
+ )
67
+ .moveDown();
68
+
69
+ generateHr(doc, 252);
70
+ }
71
+
72
+ function generateInvoiceTable(doc, invoice) {
73
+ let i;
74
+ const invoiceTableTop = 330;
75
+
76
+ doc.font("Helvetica-Bold");
77
+ generateTableRow(
78
+ doc,
79
+ invoiceTableTop,
80
+ "Item",
81
+ "Description",
82
+ "Unit Cost",
83
+ "Quantity",
84
+ "Line Total"
85
+ );
86
+ generateHr(doc, invoiceTableTop + 20);
87
+ doc.font("Helvetica");
88
+
89
+ for (i = 0; i < invoice.items.length; i++) {
90
+ const item = invoice.items[i];
91
+ const position = invoiceTableTop + (i + 1) * 30;
92
+ generateTableRow(
93
+ doc,
94
+ position,
95
+ item.item,
96
+ item.description,
97
+ formatCurrency(item.amount / item.quantity),
98
+ item.quantity,
99
+ formatCurrency(item.amount)
100
+ );
101
+
102
+ generateHr(doc, position + 20);
103
+ }
104
+
105
+ const subtotalPosition = invoiceTableTop + (i + 1) * 30;
106
+ generateTableRow(
107
+ doc,
108
+ subtotalPosition,
109
+ "",
110
+ "",
111
+ "Subtotal",
112
+ "",
113
+ formatCurrency(invoice.subtotal)
114
+ );
115
+
116
+ const paidToDatePosition = subtotalPosition + 20;
117
+ generateTableRow(
118
+ doc,
119
+ paidToDatePosition,
120
+ "",
121
+ "",
122
+ "Paid To Date",
123
+ "",
124
+ formatCurrency(invoice.paid)
125
+ );
126
+
127
+ const duePosition = paidToDatePosition + 25;
128
+ doc.font("Helvetica-Bold");
129
+ generateTableRow(
130
+ doc,
131
+ duePosition,
132
+ "",
133
+ "",
134
+ "Balance Due",
135
+ "",
136
+ formatCurrency(invoice.subtotal - invoice.paid)
137
+ );
138
+ doc.font("Helvetica");
139
+ }
140
+
141
+ function generateFooter(doc) {
142
+ doc
143
+ .fontSize(10)
144
+ .text(
145
+ "Payment is due within 15 days. Thank you for your business.",
146
+ 50,
147
+ 780,
148
+ { align: "center", width: 500 }
149
+ );
150
+ }
151
+
152
+ function generateTableRow(
153
+ doc,
154
+ y,
155
+ item,
156
+ description,
157
+ unitCost,
158
+ quantity,
159
+ lineTotal
160
+ ) {
161
+ doc
162
+ .fontSize(10)
163
+ .text(item, 50, y)
164
+ .text(description, 150, y)
165
+ .text(unitCost, 280, y, { width: 90, align: "right" })
166
+ .text(quantity, 370, y, { width: 90, align: "right" })
167
+ .text(lineTotal, 0, y, { align: "right" });
168
+ }
169
+
170
+ function generateHr(doc, y) {
171
+ doc
172
+ .strokeColor("#aaaaaa")
173
+ .lineWidth(1)
174
+ .moveTo(50, y)
175
+ .lineTo(550, y)
176
+ .stroke();
177
+ }
178
+
179
+ function formatCurrency(cents) {
180
+ return "$" + (cents / 100).toFixed(2);
181
+ }
182
+
183
+ function formatDate(date) {
184
+ const day = date.getDate();
185
+ const month = date.getMonth() + 1;
186
+ const year = date.getFullYear();
187
+
188
+ return year + "/" + month + "/" + day;
189
+ }
190
+
191
+ module.exports = {
192
+ createInvoice
193
+ };
pdfkit-invoice/index.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const { createInvoice } = require("./createInvoice.js");
2
+
3
+ const invoice = {
4
+ shipping: {
5
+ name: "John Doe",
6
+ address: "1234 Main Street",
7
+ city: "San Francisco",
8
+ state: "CA",
9
+ country: "US",
10
+ postal_code: 94111
11
+ },
12
+ items: [
13
+ {
14
+ item: "TC 100",
15
+ description: "Toner Cartridge",
16
+ quantity: 2,
17
+ amount: 6000
18
+ },
19
+ {
20
+ item: "USB_EXT",
21
+ description: "USB Cable Extender",
22
+ quantity: 1,
23
+ amount: 2000
24
+ }
25
+ ],
26
+ subtotal: 8000,
27
+ paid: 0,
28
+ invoice_nr: 1234
29
+ };
30
+
31
+ createInvoice(invoice, "invoice.pdf");
pdfkit-invoice/logo.png ADDED
pdfkit-invoice/package-lock.json ADDED
@@ -0,0 +1,1395 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "pdfkit-invoice",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 2,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "pdfkit-invoice",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "pdfkit": "^0.13.0"
13
+ }
14
+ },
15
+ "node_modules/@swc/helpers": {
16
+ "version": "0.3.17",
17
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.3.17.tgz",
18
+ "integrity": "sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==",
19
+ "dependencies": {
20
+ "tslib": "^2.4.0"
21
+ }
22
+ },
23
+ "node_modules/available-typed-arrays": {
24
+ "version": "1.0.5",
25
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
26
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
27
+ "engines": {
28
+ "node": ">= 0.4"
29
+ },
30
+ "funding": {
31
+ "url": "https://github.com/sponsors/ljharb"
32
+ }
33
+ },
34
+ "node_modules/base64-js": {
35
+ "version": "1.5.1",
36
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
37
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
38
+ "funding": [
39
+ {
40
+ "type": "github",
41
+ "url": "https://github.com/sponsors/feross"
42
+ },
43
+ {
44
+ "type": "patreon",
45
+ "url": "https://www.patreon.com/feross"
46
+ },
47
+ {
48
+ "type": "consulting",
49
+ "url": "https://feross.org/support"
50
+ }
51
+ ]
52
+ },
53
+ "node_modules/brotli": {
54
+ "version": "1.3.3",
55
+ "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
56
+ "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
57
+ "dependencies": {
58
+ "base64-js": "^1.1.2"
59
+ }
60
+ },
61
+ "node_modules/call-bind": {
62
+ "version": "1.0.2",
63
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
64
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
65
+ "dependencies": {
66
+ "function-bind": "^1.1.1",
67
+ "get-intrinsic": "^1.0.2"
68
+ },
69
+ "funding": {
70
+ "url": "https://github.com/sponsors/ljharb"
71
+ }
72
+ },
73
+ "node_modules/clone": {
74
+ "version": "2.1.2",
75
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
76
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
77
+ "engines": {
78
+ "node": ">=0.8"
79
+ }
80
+ },
81
+ "node_modules/crypto-js": {
82
+ "version": "4.1.1",
83
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
84
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
85
+ },
86
+ "node_modules/deep-equal": {
87
+ "version": "2.0.5",
88
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
89
+ "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
90
+ "dependencies": {
91
+ "call-bind": "^1.0.0",
92
+ "es-get-iterator": "^1.1.1",
93
+ "get-intrinsic": "^1.0.1",
94
+ "is-arguments": "^1.0.4",
95
+ "is-date-object": "^1.0.2",
96
+ "is-regex": "^1.1.1",
97
+ "isarray": "^2.0.5",
98
+ "object-is": "^1.1.4",
99
+ "object-keys": "^1.1.1",
100
+ "object.assign": "^4.1.2",
101
+ "regexp.prototype.flags": "^1.3.0",
102
+ "side-channel": "^1.0.3",
103
+ "which-boxed-primitive": "^1.0.1",
104
+ "which-collection": "^1.0.1",
105
+ "which-typed-array": "^1.1.2"
106
+ },
107
+ "funding": {
108
+ "url": "https://github.com/sponsors/ljharb"
109
+ }
110
+ },
111
+ "node_modules/define-properties": {
112
+ "version": "1.1.4",
113
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
114
+ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
115
+ "dependencies": {
116
+ "has-property-descriptors": "^1.0.0",
117
+ "object-keys": "^1.1.1"
118
+ },
119
+ "engines": {
120
+ "node": ">= 0.4"
121
+ },
122
+ "funding": {
123
+ "url": "https://github.com/sponsors/ljharb"
124
+ }
125
+ },
126
+ "node_modules/dfa": {
127
+ "version": "1.2.0",
128
+ "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
129
+ "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="
130
+ },
131
+ "node_modules/es-abstract": {
132
+ "version": "1.20.4",
133
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
134
+ "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
135
+ "dependencies": {
136
+ "call-bind": "^1.0.2",
137
+ "es-to-primitive": "^1.2.1",
138
+ "function-bind": "^1.1.1",
139
+ "function.prototype.name": "^1.1.5",
140
+ "get-intrinsic": "^1.1.3",
141
+ "get-symbol-description": "^1.0.0",
142
+ "has": "^1.0.3",
143
+ "has-property-descriptors": "^1.0.0",
144
+ "has-symbols": "^1.0.3",
145
+ "internal-slot": "^1.0.3",
146
+ "is-callable": "^1.2.7",
147
+ "is-negative-zero": "^2.0.2",
148
+ "is-regex": "^1.1.4",
149
+ "is-shared-array-buffer": "^1.0.2",
150
+ "is-string": "^1.0.7",
151
+ "is-weakref": "^1.0.2",
152
+ "object-inspect": "^1.12.2",
153
+ "object-keys": "^1.1.1",
154
+ "object.assign": "^4.1.4",
155
+ "regexp.prototype.flags": "^1.4.3",
156
+ "safe-regex-test": "^1.0.0",
157
+ "string.prototype.trimend": "^1.0.5",
158
+ "string.prototype.trimstart": "^1.0.5",
159
+ "unbox-primitive": "^1.0.2"
160
+ },
161
+ "engines": {
162
+ "node": ">= 0.4"
163
+ },
164
+ "funding": {
165
+ "url": "https://github.com/sponsors/ljharb"
166
+ }
167
+ },
168
+ "node_modules/es-get-iterator": {
169
+ "version": "1.1.2",
170
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
171
+ "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
172
+ "dependencies": {
173
+ "call-bind": "^1.0.2",
174
+ "get-intrinsic": "^1.1.0",
175
+ "has-symbols": "^1.0.1",
176
+ "is-arguments": "^1.1.0",
177
+ "is-map": "^2.0.2",
178
+ "is-set": "^2.0.2",
179
+ "is-string": "^1.0.5",
180
+ "isarray": "^2.0.5"
181
+ },
182
+ "funding": {
183
+ "url": "https://github.com/sponsors/ljharb"
184
+ }
185
+ },
186
+ "node_modules/es-to-primitive": {
187
+ "version": "1.2.1",
188
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
189
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
190
+ "dependencies": {
191
+ "is-callable": "^1.1.4",
192
+ "is-date-object": "^1.0.1",
193
+ "is-symbol": "^1.0.2"
194
+ },
195
+ "engines": {
196
+ "node": ">= 0.4"
197
+ },
198
+ "funding": {
199
+ "url": "https://github.com/sponsors/ljharb"
200
+ }
201
+ },
202
+ "node_modules/fontkit": {
203
+ "version": "1.9.0",
204
+ "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.9.0.tgz",
205
+ "integrity": "sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==",
206
+ "dependencies": {
207
+ "@swc/helpers": "^0.3.13",
208
+ "brotli": "^1.3.2",
209
+ "clone": "^2.1.2",
210
+ "deep-equal": "^2.0.5",
211
+ "dfa": "^1.2.0",
212
+ "restructure": "^2.0.1",
213
+ "tiny-inflate": "^1.0.3",
214
+ "unicode-properties": "^1.3.1",
215
+ "unicode-trie": "^2.0.0"
216
+ }
217
+ },
218
+ "node_modules/for-each": {
219
+ "version": "0.3.3",
220
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
221
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
222
+ "dependencies": {
223
+ "is-callable": "^1.1.3"
224
+ }
225
+ },
226
+ "node_modules/function-bind": {
227
+ "version": "1.1.1",
228
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
229
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
230
+ },
231
+ "node_modules/function.prototype.name": {
232
+ "version": "1.1.5",
233
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
234
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
235
+ "dependencies": {
236
+ "call-bind": "^1.0.2",
237
+ "define-properties": "^1.1.3",
238
+ "es-abstract": "^1.19.0",
239
+ "functions-have-names": "^1.2.2"
240
+ },
241
+ "engines": {
242
+ "node": ">= 0.4"
243
+ },
244
+ "funding": {
245
+ "url": "https://github.com/sponsors/ljharb"
246
+ }
247
+ },
248
+ "node_modules/functions-have-names": {
249
+ "version": "1.2.3",
250
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
251
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
252
+ "funding": {
253
+ "url": "https://github.com/sponsors/ljharb"
254
+ }
255
+ },
256
+ "node_modules/get-intrinsic": {
257
+ "version": "1.1.3",
258
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
259
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
260
+ "dependencies": {
261
+ "function-bind": "^1.1.1",
262
+ "has": "^1.0.3",
263
+ "has-symbols": "^1.0.3"
264
+ },
265
+ "funding": {
266
+ "url": "https://github.com/sponsors/ljharb"
267
+ }
268
+ },
269
+ "node_modules/get-symbol-description": {
270
+ "version": "1.0.0",
271
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
272
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
273
+ "dependencies": {
274
+ "call-bind": "^1.0.2",
275
+ "get-intrinsic": "^1.1.1"
276
+ },
277
+ "engines": {
278
+ "node": ">= 0.4"
279
+ },
280
+ "funding": {
281
+ "url": "https://github.com/sponsors/ljharb"
282
+ }
283
+ },
284
+ "node_modules/has": {
285
+ "version": "1.0.3",
286
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
287
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
288
+ "dependencies": {
289
+ "function-bind": "^1.1.1"
290
+ },
291
+ "engines": {
292
+ "node": ">= 0.4.0"
293
+ }
294
+ },
295
+ "node_modules/has-bigints": {
296
+ "version": "1.0.2",
297
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
298
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
299
+ "funding": {
300
+ "url": "https://github.com/sponsors/ljharb"
301
+ }
302
+ },
303
+ "node_modules/has-property-descriptors": {
304
+ "version": "1.0.0",
305
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
306
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
307
+ "dependencies": {
308
+ "get-intrinsic": "^1.1.1"
309
+ },
310
+ "funding": {
311
+ "url": "https://github.com/sponsors/ljharb"
312
+ }
313
+ },
314
+ "node_modules/has-symbols": {
315
+ "version": "1.0.3",
316
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
317
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
318
+ "engines": {
319
+ "node": ">= 0.4"
320
+ },
321
+ "funding": {
322
+ "url": "https://github.com/sponsors/ljharb"
323
+ }
324
+ },
325
+ "node_modules/has-tostringtag": {
326
+ "version": "1.0.0",
327
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
328
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
329
+ "dependencies": {
330
+ "has-symbols": "^1.0.2"
331
+ },
332
+ "engines": {
333
+ "node": ">= 0.4"
334
+ },
335
+ "funding": {
336
+ "url": "https://github.com/sponsors/ljharb"
337
+ }
338
+ },
339
+ "node_modules/internal-slot": {
340
+ "version": "1.0.3",
341
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
342
+ "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
343
+ "dependencies": {
344
+ "get-intrinsic": "^1.1.0",
345
+ "has": "^1.0.3",
346
+ "side-channel": "^1.0.4"
347
+ },
348
+ "engines": {
349
+ "node": ">= 0.4"
350
+ }
351
+ },
352
+ "node_modules/is-arguments": {
353
+ "version": "1.1.1",
354
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
355
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
356
+ "dependencies": {
357
+ "call-bind": "^1.0.2",
358
+ "has-tostringtag": "^1.0.0"
359
+ },
360
+ "engines": {
361
+ "node": ">= 0.4"
362
+ },
363
+ "funding": {
364
+ "url": "https://github.com/sponsors/ljharb"
365
+ }
366
+ },
367
+ "node_modules/is-bigint": {
368
+ "version": "1.0.4",
369
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
370
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
371
+ "dependencies": {
372
+ "has-bigints": "^1.0.1"
373
+ },
374
+ "funding": {
375
+ "url": "https://github.com/sponsors/ljharb"
376
+ }
377
+ },
378
+ "node_modules/is-boolean-object": {
379
+ "version": "1.1.2",
380
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
381
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
382
+ "dependencies": {
383
+ "call-bind": "^1.0.2",
384
+ "has-tostringtag": "^1.0.0"
385
+ },
386
+ "engines": {
387
+ "node": ">= 0.4"
388
+ },
389
+ "funding": {
390
+ "url": "https://github.com/sponsors/ljharb"
391
+ }
392
+ },
393
+ "node_modules/is-callable": {
394
+ "version": "1.2.7",
395
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
396
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
397
+ "engines": {
398
+ "node": ">= 0.4"
399
+ },
400
+ "funding": {
401
+ "url": "https://github.com/sponsors/ljharb"
402
+ }
403
+ },
404
+ "node_modules/is-date-object": {
405
+ "version": "1.0.5",
406
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
407
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
408
+ "dependencies": {
409
+ "has-tostringtag": "^1.0.0"
410
+ },
411
+ "engines": {
412
+ "node": ">= 0.4"
413
+ },
414
+ "funding": {
415
+ "url": "https://github.com/sponsors/ljharb"
416
+ }
417
+ },
418
+ "node_modules/is-map": {
419
+ "version": "2.0.2",
420
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
421
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
422
+ "funding": {
423
+ "url": "https://github.com/sponsors/ljharb"
424
+ }
425
+ },
426
+ "node_modules/is-negative-zero": {
427
+ "version": "2.0.2",
428
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
429
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
430
+ "engines": {
431
+ "node": ">= 0.4"
432
+ },
433
+ "funding": {
434
+ "url": "https://github.com/sponsors/ljharb"
435
+ }
436
+ },
437
+ "node_modules/is-number-object": {
438
+ "version": "1.0.7",
439
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
440
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
441
+ "dependencies": {
442
+ "has-tostringtag": "^1.0.0"
443
+ },
444
+ "engines": {
445
+ "node": ">= 0.4"
446
+ },
447
+ "funding": {
448
+ "url": "https://github.com/sponsors/ljharb"
449
+ }
450
+ },
451
+ "node_modules/is-regex": {
452
+ "version": "1.1.4",
453
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
454
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
455
+ "dependencies": {
456
+ "call-bind": "^1.0.2",
457
+ "has-tostringtag": "^1.0.0"
458
+ },
459
+ "engines": {
460
+ "node": ">= 0.4"
461
+ },
462
+ "funding": {
463
+ "url": "https://github.com/sponsors/ljharb"
464
+ }
465
+ },
466
+ "node_modules/is-set": {
467
+ "version": "2.0.2",
468
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
469
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
470
+ "funding": {
471
+ "url": "https://github.com/sponsors/ljharb"
472
+ }
473
+ },
474
+ "node_modules/is-shared-array-buffer": {
475
+ "version": "1.0.2",
476
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
477
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
478
+ "dependencies": {
479
+ "call-bind": "^1.0.2"
480
+ },
481
+ "funding": {
482
+ "url": "https://github.com/sponsors/ljharb"
483
+ }
484
+ },
485
+ "node_modules/is-string": {
486
+ "version": "1.0.7",
487
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
488
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
489
+ "dependencies": {
490
+ "has-tostringtag": "^1.0.0"
491
+ },
492
+ "engines": {
493
+ "node": ">= 0.4"
494
+ },
495
+ "funding": {
496
+ "url": "https://github.com/sponsors/ljharb"
497
+ }
498
+ },
499
+ "node_modules/is-symbol": {
500
+ "version": "1.0.4",
501
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
502
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
503
+ "dependencies": {
504
+ "has-symbols": "^1.0.2"
505
+ },
506
+ "engines": {
507
+ "node": ">= 0.4"
508
+ },
509
+ "funding": {
510
+ "url": "https://github.com/sponsors/ljharb"
511
+ }
512
+ },
513
+ "node_modules/is-typed-array": {
514
+ "version": "1.1.9",
515
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz",
516
+ "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==",
517
+ "dependencies": {
518
+ "available-typed-arrays": "^1.0.5",
519
+ "call-bind": "^1.0.2",
520
+ "es-abstract": "^1.20.0",
521
+ "for-each": "^0.3.3",
522
+ "has-tostringtag": "^1.0.0"
523
+ },
524
+ "engines": {
525
+ "node": ">= 0.4"
526
+ },
527
+ "funding": {
528
+ "url": "https://github.com/sponsors/ljharb"
529
+ }
530
+ },
531
+ "node_modules/is-weakmap": {
532
+ "version": "2.0.1",
533
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
534
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
535
+ "funding": {
536
+ "url": "https://github.com/sponsors/ljharb"
537
+ }
538
+ },
539
+ "node_modules/is-weakref": {
540
+ "version": "1.0.2",
541
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
542
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
543
+ "dependencies": {
544
+ "call-bind": "^1.0.2"
545
+ },
546
+ "funding": {
547
+ "url": "https://github.com/sponsors/ljharb"
548
+ }
549
+ },
550
+ "node_modules/is-weakset": {
551
+ "version": "2.0.2",
552
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
553
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
554
+ "dependencies": {
555
+ "call-bind": "^1.0.2",
556
+ "get-intrinsic": "^1.1.1"
557
+ },
558
+ "funding": {
559
+ "url": "https://github.com/sponsors/ljharb"
560
+ }
561
+ },
562
+ "node_modules/isarray": {
563
+ "version": "2.0.5",
564
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
565
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
566
+ },
567
+ "node_modules/linebreak": {
568
+ "version": "1.1.0",
569
+ "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
570
+ "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==",
571
+ "dependencies": {
572
+ "base64-js": "0.0.8",
573
+ "unicode-trie": "^2.0.0"
574
+ }
575
+ },
576
+ "node_modules/linebreak/node_modules/base64-js": {
577
+ "version": "0.0.8",
578
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
579
+ "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==",
580
+ "engines": {
581
+ "node": ">= 0.4"
582
+ }
583
+ },
584
+ "node_modules/object-inspect": {
585
+ "version": "1.12.2",
586
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
587
+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
588
+ "funding": {
589
+ "url": "https://github.com/sponsors/ljharb"
590
+ }
591
+ },
592
+ "node_modules/object-is": {
593
+ "version": "1.1.5",
594
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
595
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
596
+ "dependencies": {
597
+ "call-bind": "^1.0.2",
598
+ "define-properties": "^1.1.3"
599
+ },
600
+ "engines": {
601
+ "node": ">= 0.4"
602
+ },
603
+ "funding": {
604
+ "url": "https://github.com/sponsors/ljharb"
605
+ }
606
+ },
607
+ "node_modules/object-keys": {
608
+ "version": "1.1.1",
609
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
610
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
611
+ "engines": {
612
+ "node": ">= 0.4"
613
+ }
614
+ },
615
+ "node_modules/object.assign": {
616
+ "version": "4.1.4",
617
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
618
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
619
+ "dependencies": {
620
+ "call-bind": "^1.0.2",
621
+ "define-properties": "^1.1.4",
622
+ "has-symbols": "^1.0.3",
623
+ "object-keys": "^1.1.1"
624
+ },
625
+ "engines": {
626
+ "node": ">= 0.4"
627
+ },
628
+ "funding": {
629
+ "url": "https://github.com/sponsors/ljharb"
630
+ }
631
+ },
632
+ "node_modules/pako": {
633
+ "version": "0.2.9",
634
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
635
+ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
636
+ },
637
+ "node_modules/pdfkit": {
638
+ "version": "0.13.0",
639
+ "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.13.0.tgz",
640
+ "integrity": "sha512-AW79eHU5eLd2vgRDS9z3bSoi0FA+gYm+100LLosrQQMLUzOBGVOhG7ABcMFpJu7Bpg+MT74XYHi4k9EuU/9EZw==",
641
+ "dependencies": {
642
+ "crypto-js": "^4.0.0",
643
+ "fontkit": "^1.8.1",
644
+ "linebreak": "^1.0.2",
645
+ "png-js": "^1.0.0"
646
+ }
647
+ },
648
+ "node_modules/png-js": {
649
+ "version": "1.0.0",
650
+ "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
651
+ "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
652
+ },
653
+ "node_modules/regexp.prototype.flags": {
654
+ "version": "1.4.3",
655
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
656
+ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
657
+ "dependencies": {
658
+ "call-bind": "^1.0.2",
659
+ "define-properties": "^1.1.3",
660
+ "functions-have-names": "^1.2.2"
661
+ },
662
+ "engines": {
663
+ "node": ">= 0.4"
664
+ },
665
+ "funding": {
666
+ "url": "https://github.com/sponsors/ljharb"
667
+ }
668
+ },
669
+ "node_modules/restructure": {
670
+ "version": "2.0.1",
671
+ "resolved": "https://registry.npmjs.org/restructure/-/restructure-2.0.1.tgz",
672
+ "integrity": "sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg=="
673
+ },
674
+ "node_modules/safe-regex-test": {
675
+ "version": "1.0.0",
676
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
677
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
678
+ "dependencies": {
679
+ "call-bind": "^1.0.2",
680
+ "get-intrinsic": "^1.1.3",
681
+ "is-regex": "^1.1.4"
682
+ },
683
+ "funding": {
684
+ "url": "https://github.com/sponsors/ljharb"
685
+ }
686
+ },
687
+ "node_modules/side-channel": {
688
+ "version": "1.0.4",
689
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
690
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
691
+ "dependencies": {
692
+ "call-bind": "^1.0.0",
693
+ "get-intrinsic": "^1.0.2",
694
+ "object-inspect": "^1.9.0"
695
+ },
696
+ "funding": {
697
+ "url": "https://github.com/sponsors/ljharb"
698
+ }
699
+ },
700
+ "node_modules/string.prototype.trimend": {
701
+ "version": "1.0.5",
702
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
703
+ "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
704
+ "dependencies": {
705
+ "call-bind": "^1.0.2",
706
+ "define-properties": "^1.1.4",
707
+ "es-abstract": "^1.19.5"
708
+ },
709
+ "funding": {
710
+ "url": "https://github.com/sponsors/ljharb"
711
+ }
712
+ },
713
+ "node_modules/string.prototype.trimstart": {
714
+ "version": "1.0.5",
715
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
716
+ "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
717
+ "dependencies": {
718
+ "call-bind": "^1.0.2",
719
+ "define-properties": "^1.1.4",
720
+ "es-abstract": "^1.19.5"
721
+ },
722
+ "funding": {
723
+ "url": "https://github.com/sponsors/ljharb"
724
+ }
725
+ },
726
+ "node_modules/tiny-inflate": {
727
+ "version": "1.0.3",
728
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
729
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
730
+ },
731
+ "node_modules/tslib": {
732
+ "version": "2.4.0",
733
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
734
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
735
+ },
736
+ "node_modules/unbox-primitive": {
737
+ "version": "1.0.2",
738
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
739
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
740
+ "dependencies": {
741
+ "call-bind": "^1.0.2",
742
+ "has-bigints": "^1.0.2",
743
+ "has-symbols": "^1.0.3",
744
+ "which-boxed-primitive": "^1.0.2"
745
+ },
746
+ "funding": {
747
+ "url": "https://github.com/sponsors/ljharb"
748
+ }
749
+ },
750
+ "node_modules/unicode-properties": {
751
+ "version": "1.4.1",
752
+ "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
753
+ "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
754
+ "dependencies": {
755
+ "base64-js": "^1.3.0",
756
+ "unicode-trie": "^2.0.0"
757
+ }
758
+ },
759
+ "node_modules/unicode-trie": {
760
+ "version": "2.0.0",
761
+ "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
762
+ "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
763
+ "dependencies": {
764
+ "pako": "^0.2.5",
765
+ "tiny-inflate": "^1.0.0"
766
+ }
767
+ },
768
+ "node_modules/which-boxed-primitive": {
769
+ "version": "1.0.2",
770
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
771
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
772
+ "dependencies": {
773
+ "is-bigint": "^1.0.1",
774
+ "is-boolean-object": "^1.1.0",
775
+ "is-number-object": "^1.0.4",
776
+ "is-string": "^1.0.5",
777
+ "is-symbol": "^1.0.3"
778
+ },
779
+ "funding": {
780
+ "url": "https://github.com/sponsors/ljharb"
781
+ }
782
+ },
783
+ "node_modules/which-collection": {
784
+ "version": "1.0.1",
785
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
786
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
787
+ "dependencies": {
788
+ "is-map": "^2.0.1",
789
+ "is-set": "^2.0.1",
790
+ "is-weakmap": "^2.0.1",
791
+ "is-weakset": "^2.0.1"
792
+ },
793
+ "funding": {
794
+ "url": "https://github.com/sponsors/ljharb"
795
+ }
796
+ },
797
+ "node_modules/which-typed-array": {
798
+ "version": "1.1.8",
799
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
800
+ "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==",
801
+ "dependencies": {
802
+ "available-typed-arrays": "^1.0.5",
803
+ "call-bind": "^1.0.2",
804
+ "es-abstract": "^1.20.0",
805
+ "for-each": "^0.3.3",
806
+ "has-tostringtag": "^1.0.0",
807
+ "is-typed-array": "^1.1.9"
808
+ },
809
+ "engines": {
810
+ "node": ">= 0.4"
811
+ },
812
+ "funding": {
813
+ "url": "https://github.com/sponsors/ljharb"
814
+ }
815
+ }
816
+ },
817
+ "dependencies": {
818
+ "@swc/helpers": {
819
+ "version": "0.3.17",
820
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.3.17.tgz",
821
+ "integrity": "sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==",
822
+ "requires": {
823
+ "tslib": "^2.4.0"
824
+ }
825
+ },
826
+ "available-typed-arrays": {
827
+ "version": "1.0.5",
828
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
829
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
830
+ },
831
+ "base64-js": {
832
+ "version": "1.5.1",
833
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
834
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
835
+ },
836
+ "brotli": {
837
+ "version": "1.3.3",
838
+ "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
839
+ "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
840
+ "requires": {
841
+ "base64-js": "^1.1.2"
842
+ }
843
+ },
844
+ "call-bind": {
845
+ "version": "1.0.2",
846
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
847
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
848
+ "requires": {
849
+ "function-bind": "^1.1.1",
850
+ "get-intrinsic": "^1.0.2"
851
+ }
852
+ },
853
+ "clone": {
854
+ "version": "2.1.2",
855
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
856
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
857
+ },
858
+ "crypto-js": {
859
+ "version": "4.1.1",
860
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
861
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
862
+ },
863
+ "deep-equal": {
864
+ "version": "2.0.5",
865
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
866
+ "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
867
+ "requires": {
868
+ "call-bind": "^1.0.0",
869
+ "es-get-iterator": "^1.1.1",
870
+ "get-intrinsic": "^1.0.1",
871
+ "is-arguments": "^1.0.4",
872
+ "is-date-object": "^1.0.2",
873
+ "is-regex": "^1.1.1",
874
+ "isarray": "^2.0.5",
875
+ "object-is": "^1.1.4",
876
+ "object-keys": "^1.1.1",
877
+ "object.assign": "^4.1.2",
878
+ "regexp.prototype.flags": "^1.3.0",
879
+ "side-channel": "^1.0.3",
880
+ "which-boxed-primitive": "^1.0.1",
881
+ "which-collection": "^1.0.1",
882
+ "which-typed-array": "^1.1.2"
883
+ }
884
+ },
885
+ "define-properties": {
886
+ "version": "1.1.4",
887
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
888
+ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
889
+ "requires": {
890
+ "has-property-descriptors": "^1.0.0",
891
+ "object-keys": "^1.1.1"
892
+ }
893
+ },
894
+ "dfa": {
895
+ "version": "1.2.0",
896
+ "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
897
+ "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="
898
+ },
899
+ "es-abstract": {
900
+ "version": "1.20.4",
901
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
902
+ "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
903
+ "requires": {
904
+ "call-bind": "^1.0.2",
905
+ "es-to-primitive": "^1.2.1",
906
+ "function-bind": "^1.1.1",
907
+ "function.prototype.name": "^1.1.5",
908
+ "get-intrinsic": "^1.1.3",
909
+ "get-symbol-description": "^1.0.0",
910
+ "has": "^1.0.3",
911
+ "has-property-descriptors": "^1.0.0",
912
+ "has-symbols": "^1.0.3",
913
+ "internal-slot": "^1.0.3",
914
+ "is-callable": "^1.2.7",
915
+ "is-negative-zero": "^2.0.2",
916
+ "is-regex": "^1.1.4",
917
+ "is-shared-array-buffer": "^1.0.2",
918
+ "is-string": "^1.0.7",
919
+ "is-weakref": "^1.0.2",
920
+ "object-inspect": "^1.12.2",
921
+ "object-keys": "^1.1.1",
922
+ "object.assign": "^4.1.4",
923
+ "regexp.prototype.flags": "^1.4.3",
924
+ "safe-regex-test": "^1.0.0",
925
+ "string.prototype.trimend": "^1.0.5",
926
+ "string.prototype.trimstart": "^1.0.5",
927
+ "unbox-primitive": "^1.0.2"
928
+ }
929
+ },
930
+ "es-get-iterator": {
931
+ "version": "1.1.2",
932
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
933
+ "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
934
+ "requires": {
935
+ "call-bind": "^1.0.2",
936
+ "get-intrinsic": "^1.1.0",
937
+ "has-symbols": "^1.0.1",
938
+ "is-arguments": "^1.1.0",
939
+ "is-map": "^2.0.2",
940
+ "is-set": "^2.0.2",
941
+ "is-string": "^1.0.5",
942
+ "isarray": "^2.0.5"
943
+ }
944
+ },
945
+ "es-to-primitive": {
946
+ "version": "1.2.1",
947
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
948
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
949
+ "requires": {
950
+ "is-callable": "^1.1.4",
951
+ "is-date-object": "^1.0.1",
952
+ "is-symbol": "^1.0.2"
953
+ }
954
+ },
955
+ "fontkit": {
956
+ "version": "1.9.0",
957
+ "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.9.0.tgz",
958
+ "integrity": "sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==",
959
+ "requires": {
960
+ "@swc/helpers": "^0.3.13",
961
+ "brotli": "^1.3.2",
962
+ "clone": "^2.1.2",
963
+ "deep-equal": "^2.0.5",
964
+ "dfa": "^1.2.0",
965
+ "restructure": "^2.0.1",
966
+ "tiny-inflate": "^1.0.3",
967
+ "unicode-properties": "^1.3.1",
968
+ "unicode-trie": "^2.0.0"
969
+ }
970
+ },
971
+ "for-each": {
972
+ "version": "0.3.3",
973
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
974
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
975
+ "requires": {
976
+ "is-callable": "^1.1.3"
977
+ }
978
+ },
979
+ "function-bind": {
980
+ "version": "1.1.1",
981
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
982
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
983
+ },
984
+ "function.prototype.name": {
985
+ "version": "1.1.5",
986
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
987
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
988
+ "requires": {
989
+ "call-bind": "^1.0.2",
990
+ "define-properties": "^1.1.3",
991
+ "es-abstract": "^1.19.0",
992
+ "functions-have-names": "^1.2.2"
993
+ }
994
+ },
995
+ "functions-have-names": {
996
+ "version": "1.2.3",
997
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
998
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
999
+ },
1000
+ "get-intrinsic": {
1001
+ "version": "1.1.3",
1002
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
1003
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
1004
+ "requires": {
1005
+ "function-bind": "^1.1.1",
1006
+ "has": "^1.0.3",
1007
+ "has-symbols": "^1.0.3"
1008
+ }
1009
+ },
1010
+ "get-symbol-description": {
1011
+ "version": "1.0.0",
1012
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
1013
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
1014
+ "requires": {
1015
+ "call-bind": "^1.0.2",
1016
+ "get-intrinsic": "^1.1.1"
1017
+ }
1018
+ },
1019
+ "has": {
1020
+ "version": "1.0.3",
1021
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1022
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1023
+ "requires": {
1024
+ "function-bind": "^1.1.1"
1025
+ }
1026
+ },
1027
+ "has-bigints": {
1028
+ "version": "1.0.2",
1029
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
1030
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="
1031
+ },
1032
+ "has-property-descriptors": {
1033
+ "version": "1.0.0",
1034
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
1035
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
1036
+ "requires": {
1037
+ "get-intrinsic": "^1.1.1"
1038
+ }
1039
+ },
1040
+ "has-symbols": {
1041
+ "version": "1.0.3",
1042
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1043
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
1044
+ },
1045
+ "has-tostringtag": {
1046
+ "version": "1.0.0",
1047
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
1048
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
1049
+ "requires": {
1050
+ "has-symbols": "^1.0.2"
1051
+ }
1052
+ },
1053
+ "internal-slot": {
1054
+ "version": "1.0.3",
1055
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
1056
+ "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
1057
+ "requires": {
1058
+ "get-intrinsic": "^1.1.0",
1059
+ "has": "^1.0.3",
1060
+ "side-channel": "^1.0.4"
1061
+ }
1062
+ },
1063
+ "is-arguments": {
1064
+ "version": "1.1.1",
1065
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
1066
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
1067
+ "requires": {
1068
+ "call-bind": "^1.0.2",
1069
+ "has-tostringtag": "^1.0.0"
1070
+ }
1071
+ },
1072
+ "is-bigint": {
1073
+ "version": "1.0.4",
1074
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
1075
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
1076
+ "requires": {
1077
+ "has-bigints": "^1.0.1"
1078
+ }
1079
+ },
1080
+ "is-boolean-object": {
1081
+ "version": "1.1.2",
1082
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
1083
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
1084
+ "requires": {
1085
+ "call-bind": "^1.0.2",
1086
+ "has-tostringtag": "^1.0.0"
1087
+ }
1088
+ },
1089
+ "is-callable": {
1090
+ "version": "1.2.7",
1091
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
1092
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="
1093
+ },
1094
+ "is-date-object": {
1095
+ "version": "1.0.5",
1096
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
1097
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
1098
+ "requires": {
1099
+ "has-tostringtag": "^1.0.0"
1100
+ }
1101
+ },
1102
+ "is-map": {
1103
+ "version": "2.0.2",
1104
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
1105
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg=="
1106
+ },
1107
+ "is-negative-zero": {
1108
+ "version": "2.0.2",
1109
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
1110
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
1111
+ },
1112
+ "is-number-object": {
1113
+ "version": "1.0.7",
1114
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
1115
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
1116
+ "requires": {
1117
+ "has-tostringtag": "^1.0.0"
1118
+ }
1119
+ },
1120
+ "is-regex": {
1121
+ "version": "1.1.4",
1122
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
1123
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
1124
+ "requires": {
1125
+ "call-bind": "^1.0.2",
1126
+ "has-tostringtag": "^1.0.0"
1127
+ }
1128
+ },
1129
+ "is-set": {
1130
+ "version": "2.0.2",
1131
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
1132
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g=="
1133
+ },
1134
+ "is-shared-array-buffer": {
1135
+ "version": "1.0.2",
1136
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
1137
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
1138
+ "requires": {
1139
+ "call-bind": "^1.0.2"
1140
+ }
1141
+ },
1142
+ "is-string": {
1143
+ "version": "1.0.7",
1144
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
1145
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
1146
+ "requires": {
1147
+ "has-tostringtag": "^1.0.0"
1148
+ }
1149
+ },
1150
+ "is-symbol": {
1151
+ "version": "1.0.4",
1152
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
1153
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
1154
+ "requires": {
1155
+ "has-symbols": "^1.0.2"
1156
+ }
1157
+ },
1158
+ "is-typed-array": {
1159
+ "version": "1.1.9",
1160
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz",
1161
+ "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==",
1162
+ "requires": {
1163
+ "available-typed-arrays": "^1.0.5",
1164
+ "call-bind": "^1.0.2",
1165
+ "es-abstract": "^1.20.0",
1166
+ "for-each": "^0.3.3",
1167
+ "has-tostringtag": "^1.0.0"
1168
+ }
1169
+ },
1170
+ "is-weakmap": {
1171
+ "version": "2.0.1",
1172
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
1173
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA=="
1174
+ },
1175
+ "is-weakref": {
1176
+ "version": "1.0.2",
1177
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
1178
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
1179
+ "requires": {
1180
+ "call-bind": "^1.0.2"
1181
+ }
1182
+ },
1183
+ "is-weakset": {
1184
+ "version": "2.0.2",
1185
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
1186
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
1187
+ "requires": {
1188
+ "call-bind": "^1.0.2",
1189
+ "get-intrinsic": "^1.1.1"
1190
+ }
1191
+ },
1192
+ "isarray": {
1193
+ "version": "2.0.5",
1194
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
1195
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
1196
+ },
1197
+ "linebreak": {
1198
+ "version": "1.1.0",
1199
+ "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
1200
+ "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==",
1201
+ "requires": {
1202
+ "base64-js": "0.0.8",
1203
+ "unicode-trie": "^2.0.0"
1204
+ },
1205
+ "dependencies": {
1206
+ "base64-js": {
1207
+ "version": "0.0.8",
1208
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
1209
+ "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw=="
1210
+ }
1211
+ }
1212
+ },
1213
+ "object-inspect": {
1214
+ "version": "1.12.2",
1215
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
1216
+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
1217
+ },
1218
+ "object-is": {
1219
+ "version": "1.1.5",
1220
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
1221
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
1222
+ "requires": {
1223
+ "call-bind": "^1.0.2",
1224
+ "define-properties": "^1.1.3"
1225
+ }
1226
+ },
1227
+ "object-keys": {
1228
+ "version": "1.1.1",
1229
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1230
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
1231
+ },
1232
+ "object.assign": {
1233
+ "version": "4.1.4",
1234
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
1235
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
1236
+ "requires": {
1237
+ "call-bind": "^1.0.2",
1238
+ "define-properties": "^1.1.4",
1239
+ "has-symbols": "^1.0.3",
1240
+ "object-keys": "^1.1.1"
1241
+ }
1242
+ },
1243
+ "pako": {
1244
+ "version": "0.2.9",
1245
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
1246
+ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
1247
+ },
1248
+ "pdfkit": {
1249
+ "version": "0.13.0",
1250
+ "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.13.0.tgz",
1251
+ "integrity": "sha512-AW79eHU5eLd2vgRDS9z3bSoi0FA+gYm+100LLosrQQMLUzOBGVOhG7ABcMFpJu7Bpg+MT74XYHi4k9EuU/9EZw==",
1252
+ "requires": {
1253
+ "crypto-js": "^4.0.0",
1254
+ "fontkit": "^1.8.1",
1255
+ "linebreak": "^1.0.2",
1256
+ "png-js": "^1.0.0"
1257
+ }
1258
+ },
1259
+ "png-js": {
1260
+ "version": "1.0.0",
1261
+ "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
1262
+ "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
1263
+ },
1264
+ "regexp.prototype.flags": {
1265
+ "version": "1.4.3",
1266
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
1267
+ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
1268
+ "requires": {
1269
+ "call-bind": "^1.0.2",
1270
+ "define-properties": "^1.1.3",
1271
+ "functions-have-names": "^1.2.2"
1272
+ }
1273
+ },
1274
+ "restructure": {
1275
+ "version": "2.0.1",
1276
+ "resolved": "https://registry.npmjs.org/restructure/-/restructure-2.0.1.tgz",
1277
+ "integrity": "sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg=="
1278
+ },
1279
+ "safe-regex-test": {
1280
+ "version": "1.0.0",
1281
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
1282
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
1283
+ "requires": {
1284
+ "call-bind": "^1.0.2",
1285
+ "get-intrinsic": "^1.1.3",
1286
+ "is-regex": "^1.1.4"
1287
+ }
1288
+ },
1289
+ "side-channel": {
1290
+ "version": "1.0.4",
1291
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1292
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1293
+ "requires": {
1294
+ "call-bind": "^1.0.0",
1295
+ "get-intrinsic": "^1.0.2",
1296
+ "object-inspect": "^1.9.0"
1297
+ }
1298
+ },
1299
+ "string.prototype.trimend": {
1300
+ "version": "1.0.5",
1301
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
1302
+ "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
1303
+ "requires": {
1304
+ "call-bind": "^1.0.2",
1305
+ "define-properties": "^1.1.4",
1306
+ "es-abstract": "^1.19.5"
1307
+ }
1308
+ },
1309
+ "string.prototype.trimstart": {
1310
+ "version": "1.0.5",
1311
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
1312
+ "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
1313
+ "requires": {
1314
+ "call-bind": "^1.0.2",
1315
+ "define-properties": "^1.1.4",
1316
+ "es-abstract": "^1.19.5"
1317
+ }
1318
+ },
1319
+ "tiny-inflate": {
1320
+ "version": "1.0.3",
1321
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
1322
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
1323
+ },
1324
+ "tslib": {
1325
+ "version": "2.4.0",
1326
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
1327
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
1328
+ },
1329
+ "unbox-primitive": {
1330
+ "version": "1.0.2",
1331
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
1332
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
1333
+ "requires": {
1334
+ "call-bind": "^1.0.2",
1335
+ "has-bigints": "^1.0.2",
1336
+ "has-symbols": "^1.0.3",
1337
+ "which-boxed-primitive": "^1.0.2"
1338
+ }
1339
+ },
1340
+ "unicode-properties": {
1341
+ "version": "1.4.1",
1342
+ "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
1343
+ "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
1344
+ "requires": {
1345
+ "base64-js": "^1.3.0",
1346
+ "unicode-trie": "^2.0.0"
1347
+ }
1348
+ },
1349
+ "unicode-trie": {
1350
+ "version": "2.0.0",
1351
+ "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
1352
+ "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
1353
+ "requires": {
1354
+ "pako": "^0.2.5",
1355
+ "tiny-inflate": "^1.0.0"
1356
+ }
1357
+ },
1358
+ "which-boxed-primitive": {
1359
+ "version": "1.0.2",
1360
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
1361
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
1362
+ "requires": {
1363
+ "is-bigint": "^1.0.1",
1364
+ "is-boolean-object": "^1.1.0",
1365
+ "is-number-object": "^1.0.4",
1366
+ "is-string": "^1.0.5",
1367
+ "is-symbol": "^1.0.3"
1368
+ }
1369
+ },
1370
+ "which-collection": {
1371
+ "version": "1.0.1",
1372
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
1373
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
1374
+ "requires": {
1375
+ "is-map": "^2.0.1",
1376
+ "is-set": "^2.0.1",
1377
+ "is-weakmap": "^2.0.1",
1378
+ "is-weakset": "^2.0.1"
1379
+ }
1380
+ },
1381
+ "which-typed-array": {
1382
+ "version": "1.1.8",
1383
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
1384
+ "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==",
1385
+ "requires": {
1386
+ "available-typed-arrays": "^1.0.5",
1387
+ "call-bind": "^1.0.2",
1388
+ "es-abstract": "^1.20.0",
1389
+ "for-each": "^0.3.3",
1390
+ "has-tostringtag": "^1.0.0",
1391
+ "is-typed-array": "^1.1.9"
1392
+ }
1393
+ }
1394
+ }
1395
+ }
pdfkit-invoice/package.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "pdfkit-invoice",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "start": "node index.js",
8
+ "test": "echo \"Error: no test specified\" && exit 1"
9
+ },
10
+ "keywords": [],
11
+ "author": "",
12
+ "license": "ISC",
13
+ "dependencies": {
14
+ "pdfkit": "^0.13.0"
15
+ }
16
+ }
pdfkit-invoice/screenshot.png ADDED
pillmatePPTXBackground.webp ADDED
real_promises_only.py ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # promises detector fine tuning for llama2-7B
2
+ from datasets import load_dataset
3
+ from accelerate import find_executable_batch_size # 8 is the recommended from the book
4
+ from transformers import TrainingArguments, BitsAndBytesConfig
5
+ from transformers import LlamaForCausalLM, LlamaTokenizer
6
+ from peft import PeftModel, LoraConfig
7
+ from trl import SFTTrainer
8
+
9
+
10
+ tune_data = load_dataset("csv", data_files='Political_Promises_Fine_Tuning.csv')
11
+
12
+ optim = "paged_adamw_32bit"
13
+ learning_rate = 3e-4
14
+ weight_decay = .01
15
+ lr_scheduler_type = 'cosine'
16
+ warmup_ratio = .03 # The proportion of training steps
17
+
18
+ # on a 16GB GPU the params are:
19
+ gradient_accumulation_steps = 4
20
+ bf16 = True
21
+ gradient_checkpointing = True
22
+
23
+ # Label smoothing
24
+ # Label 0 will be transformed to label_smoothing_factor/num_labels
25
+ # Label 1 will be transformed to 1 + label_smoothing_factor(-1 + 1/ num_labels)
26
+
27
+ label_smoothing_factor = .1
28
+ # neftune stands for Noise Embedding Instruction Fine-Tuning (noise ~U(-1,1))
29
+ neftune_noise_alpha = 5
30
+
31
+ # batch-size (the bigger, the faster and more memory heavy and prone to local minima/overfitting)
32
+ # Tip: Reduce max_seq_len to support larger batch_size
33
+ per_device_train_batch_size = find_executable_batch_size()
34
+ per_device_eval_batch_size = find_executable_batch_size()
35
+
36
+ max_grad_norm = 2
37
+ group_by_length = True
38
+ max_train_epochs = 3
39
+
40
+ # peft = parameter efficient fine tuning
41
+ # LORA:
42
+ r = 64
43
+ lora_alpha = 8
44
+ lora_dropout = 0.1
45
+
46
+ # Working with reduced precision with bitsandbytes
47
+ use_4bit = True
48
+ bnb_4bit_compute_dtype = 'float16'
49
+ bnb_4bit_quant_type = 'nf4'
50
+ use_nested_quant = False
51
+
52
+ # trl = Transformer Reinforcement Learning, for supervised fine-tuning
53
+ max_seq_length = 128
54
+ # Packing is used to place multiple instructions in the same input sequence
55
+
56
+ packing = True
57
+
58
+ train_params = TrainingArguments(
59
+ optim=optim,
60
+ learning_rate=learning_rate,
61
+ weight_decay=weight_decay,
62
+ warmup_ratio=warmup_ratio,
63
+ gradient_accumulation_steps=gradient_accumulation_steps,
64
+ bf16=bf16,
65
+ gradient_checkpointing=gradient_checkpointing,
66
+ label_smoothing_factor=label_smoothing_factor,
67
+ neftune_noise_alpha=neftune_noise_alpha,
68
+ per_device_train_batch_size=per_device_train_batch_size,
69
+ per_device_eval_batch_size=per_device_eval_batch_size,
70
+ max_grad_norm=max_grad_norm,
71
+ group_by_length=group_by_length,
72
+ num_train_epochs=max_train_epochs,
73
+ output_dir='./model_outputs',
74
+ save_steps=50,
75
+ logging_steps=10
76
+ )
77
+
78
+ quantize_params = BitsAndBytesConfig(
79
+ use_4bit=use_4bit,
80
+ bnb_4bit_compute_dtype=bnb_4bit_compute_dtype,
81
+ bnb_4bit_quant_type=bnb_4bit_quant_type,
82
+ use_nested_quant=use_nested_quant,
83
+ )
84
+
85
+
86
+ lora_params = LoraConfig (
87
+ r = 64,
88
+ lora_alpha = 8,
89
+ lora_dropout = 0.1
90
+ )
91
+
92
+ model = LlamaForCausalLM.from_pretrained(
93
+ pretrained_model_name_or_path = 'meta-llama/Llama-2-7b',
94
+ quantization_config=quantize_params,
95
+ device_map='auto'
96
+ )
97
+
98
+ tokenizer = LlamaTokenizer.from_pretrained('meta-llama/Llama-2-7b')
99
+
100
+ tune_data = load_dataset("csv", data_files='/path/to/finetune_data.csv')
101
+
102
+ sft = SFTTrainer (
103
+ model = model,
104
+ args = train_params,
105
+ train_dataset = tune_data,
106
+ tokenizer = tokenizer
107
+ peft_config = lora_params,
108
+ max_seq_length = 128,
109
+ dataset_text_field = 'text',
110
+ packing = True
111
+ )
112
+
113
+ sft.train()
114
+ sft.model.save_pretrained('/path/to/llama-2-it.csv')
report.md ADDED
File without changes
utils.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain_openai import OpenAI
2
+ from pypdf import PdfReader
3
+ import pandas as pd
4
+ import re
5
+ import replicate
6
+ from langchain.prompts import PromptTemplate
7
+
8
+
9
+ def get_pdf_text(pdf_doc):
10
+ text = ''
11
+ pdf_reader = PdfReader(pdf_doc)
12
+ for page in pdf_reader.pages:
13
+ text += page.extract_text()
14
+ return text
15
+
16
+
17
+ def extracted_data(pages_data):
18
+ template = """Extract all the following values : invoice no. Description, Quantinty, data, Unit price, Amount, Total
19
+ email, phone number and address from this data: {pages}
20
+
21
+ Expected output: remove any dollar symbols {{'Invoice no.': '1001329', 'Description': 'Office Chair', 'Quantity': '2', 'Date': '5/4/2018', 'Unit price': '100', 'Amount': '20', 'Total': '12020' and so on}}"""
22
+
23
+ prompt_template = PromptTemplate(input_variables=["pages"], template=template)
24
+
25
+ llm = OpenAI(temperature=.7)
26
+ full_response = llm(prompt_template.format(pages=pages_data))
27
+
28
+ # input_prompt = {
29
+ # "top_p": .9,
30
+ # "prompt": prompt_template.format(pages=pages_data),
31
+ # "temperature": .1,
32
+ # "max_new_tokens": 500
33
+ # }
34
+ # full_response = ''
35
+ # for event in replicate.stream("meta/llama-2-70b-chat", input=input_prompt):
36
+ # full_response += event
37
+
38
+ return full_response
39
+
40
+
41
+ def create_docs(user_pdf_list):
42
+ """Iterate over files in that user uploaded PDF files, one by one"""
43
+ print("Started creating docs")
44
+ df = pd.DataFrame({"Invoice no.": pd.Series(dtype='str'),
45
+ "Description": pd.Series(dtype='str'),
46
+ "Quantinty": pd.Series(dtype='str'),
47
+ "Date": pd.Series(dtype='str'),
48
+ "Unit price": pd.Series(dtype='str'),
49
+ "Amount": pd.Series(dtype='int'),
50
+ "Total": pd.Series(dtype='str'),
51
+ "Email": pd.Series(dtype='str'),
52
+ "Phone number": pd.Series(dtype='str'),
53
+ "Address": pd.Series(dtype='str')})
54
+
55
+ for filename in user_pdf_list:
56
+ print('filename is {}'.format(filename))
57
+ raw_data = get_pdf_text(filename)
58
+ print('raw_data is {}'.format(raw_data))
59
+
60
+ llm_extracted_data = extracted_data(raw_data)
61
+ print('llm_extracted_data is {}'.format(llm_extracted_data))
62
+
63
+ # Capturing just the required data and excluding andy unwanted test from the LLM response
64
+ pattern = r'{(.+)}'
65
+ match = re.search(pattern, llm_extracted_data, re.DOTALL)
66
+
67
+ if match:
68
+ extracted_text = match.group(1)
69
+ # Converting the extracted text to a dictionary
70
+ data_dict = eval('{' + extracted_text + '}')
71
+ print('data_dict is {}'.format(data_dict))
72
+ else:
73
+ print("No match found.")
74
+ new_row = pd.DataFrame([data_dict]) # Creating a DataFrame from the dictionary
75
+ df = pd.concat([df, new_row], ignore_index=True) # Concatenating the new row
76
+ print('*' * 10 + 'DONE' + '*' * 10)
77
+
78
+ df.head()
79
+ return df