overload-cli 0.1.0__py3-none-any.whl
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.
- overload/__init__.py +3 -0
- overload/__main__.py +5 -0
- overload/cli.py +393 -0
- overload/collection/__init__.py +1 -0
- overload/collection/environment.py +23 -0
- overload/collection/models.py +88 -0
- overload/collection/parser.py +220 -0
- overload/collection/variables.py +84 -0
- overload/config_file.py +73 -0
- overload/engine/__init__.py +1 -0
- overload/engine/assertions.py +151 -0
- overload/engine/auth.py +87 -0
- overload/engine/events.py +50 -0
- overload/engine/http_client.py +274 -0
- overload/engine/load_patterns.py +730 -0
- overload/engine/models.py +254 -0
- overload/engine/rate_limiter.py +124 -0
- overload/engine/runner.py +86 -0
- overload/report/__init__.py +1 -0
- overload/report/exporters.py +77 -0
- overload/report/generator.py +71 -0
- overload/report/templates/report.html +369 -0
- overload/utils/__init__.py +1 -0
- overload/utils/naming.py +26 -0
- overload/web/__init__.py +1 -0
- overload/web/app.py +38 -0
- overload/web/routes/__init__.py +1 -0
- overload/web/routes/api.py +461 -0
- overload/web/routes/ws.py +77 -0
- overload/web/static/css/app.css +242 -0
- overload/web/static/js/app.js +241 -0
- overload/web/static/js/charts.js +385 -0
- overload/web/static/js/collection.js +344 -0
- overload/web/static/js/runner.js +625 -0
- overload/web/templates/index.html +23 -0
- overload_cli-0.1.0.dist-info/METADATA +267 -0
- overload_cli-0.1.0.dist-info/RECORD +40 -0
- overload_cli-0.1.0.dist-info/WHEEL +4 -0
- overload_cli-0.1.0.dist-info/entry_points.txt +2 -0
- overload_cli-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: overload-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Free load testing tool that reads Postman collections — browser UI + CLI
|
|
5
|
+
Project-URL: Homepage, https://github.com/dprakash2101/overload
|
|
6
|
+
Project-URL: Repository, https://github.com/dprakash2101/overload
|
|
7
|
+
Project-URL: Issues, https://github.com/dprakash2101/overload/issues
|
|
8
|
+
Project-URL: Documentation, https://dprakash2101.github.io/overload/
|
|
9
|
+
Project-URL: Changelog, https://github.com/dprakash2101/overload/blob/main/CHANGELOG.md
|
|
10
|
+
Author: Devi Prakash
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: api-testing,assertions,ci-cd,load-testing,performance,postman,stress-test
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Environment :: Web Environment
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
24
|
+
Classifier: Topic :: Software Development :: Testing
|
|
25
|
+
Classifier: Topic :: System :: Networking
|
|
26
|
+
Requires-Python: >=3.10
|
|
27
|
+
Requires-Dist: fastapi>=0.100.0
|
|
28
|
+
Requires-Dist: httpx>=0.24.0
|
|
29
|
+
Requires-Dist: jinja2>=3.1.0
|
|
30
|
+
Requires-Dist: python-multipart>=0.0.6
|
|
31
|
+
Requires-Dist: pyyaml>=6.0
|
|
32
|
+
Requires-Dist: uvicorn[standard]>=0.20.0
|
|
33
|
+
Provides-Extra: dev
|
|
34
|
+
Requires-Dist: build; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest-asyncio>=0.21; extra == 'dev'
|
|
36
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: twine; extra == 'dev'
|
|
38
|
+
Description-Content-Type: text/markdown
|
|
39
|
+
|
|
40
|
+
# Overload
|
|
41
|
+
|
|
42
|
+
Free, open-source load testing tool that reads Postman collections. Run tests from a browser dashboard or the terminal CLI.
|
|
43
|
+
|
|
44
|
+
**📚 [Read the Full Documentation](https://dprakash2101.github.io/overload/)**
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
pip install overload-cli
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Or in dev mode from source:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
git clone https://github.com/dprakash2101/overload
|
|
58
|
+
cd overload
|
|
59
|
+
pip install -e ".[dev]"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Two Ways to Run
|
|
65
|
+
|
|
66
|
+
### Option 1 — Browser UI (results on screen)
|
|
67
|
+
|
|
68
|
+
Run `overload` with no arguments. It starts a local server and opens a dashboard in your browser where you configure the test, watch live progress, and view charts and reports — **no terminal reading required**.
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
overload
|
|
72
|
+
# Opens http://localhost:3000 automatically
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Step-by-step in the browser:**
|
|
76
|
+
|
|
77
|
+
1. The app auto-detects any Postman collection JSON files in your working directory and lists them under **"Detected Files"**. Click **Load** next to the one you want.
|
|
78
|
+
2. Optionally load a Postman environment file the same way.
|
|
79
|
+
3. Pick the **Test Type** from the dropdown (Burst, Load, Stress, Spike, etc.).
|
|
80
|
+
4. Adjust the config fields that appear (concurrency, RPS, duration, etc.).
|
|
81
|
+
5. Click **Start Test**. The dashboard shows live progress: phase, request count, RPS, and a real-time latency chart.
|
|
82
|
+
6. When the test finishes, click **View Report** to open the full HTML report in a new tab — latency charts, timeline scatter, per-second breakdown, and the raw request log.
|
|
83
|
+
7. Click **Stop** at any time to cancel immediately with partial results saved.
|
|
84
|
+
|
|
85
|
+
**Options:**
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
overload ui --port 8080 # Use a different port
|
|
89
|
+
overload ui --no-browser # Start server without auto-opening browser
|
|
90
|
+
overload ui --host 0.0.0.0 # Bind to all interfaces (LAN access)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### Option 2 — CLI (results in terminal)
|
|
96
|
+
|
|
97
|
+
Run tests headlessly and see a progress bar + summary printed to the terminal. An HTML report is saved to disk.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
overload run --collection path/to/collection.json --pattern burst
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Output looks like:**
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
OVERLOAD — BURST TEST
|
|
107
|
+
Collection: my_api.json
|
|
108
|
+
Requests: 5
|
|
109
|
+
Run ID: burst_20260529_abc123
|
|
110
|
+
|
|
111
|
+
[####################] 100% (200 requests) — complete
|
|
112
|
+
|
|
113
|
+
Results:
|
|
114
|
+
Total: 200 OK: 198 Errors: 2
|
|
115
|
+
Latency — min: 45ms p95: 312ms max: 891ms
|
|
116
|
+
Duration: 4.2s Avg RPS: 47.6
|
|
117
|
+
|
|
118
|
+
Report: /path/to/overload_report_20260529_abc123.html
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**All CLI flags for `overload run`:**
|
|
122
|
+
|
|
123
|
+
| Flag | Default | Description |
|
|
124
|
+
|------|---------|-------------|
|
|
125
|
+
| `--collection` | *(required)* | Path to Postman collection JSON |
|
|
126
|
+
| `--environment` | — | Path to Postman environment JSON |
|
|
127
|
+
| `--pattern` | `burst` | Test type: `load`, `stress`, `spike`, `soak`, `ramp`, `burst`, `breakpoint`, `custom`, `ratelimit` |
|
|
128
|
+
| `--requests` | `200` | Total requests (burst / rate limit tests) |
|
|
129
|
+
| `--concurrency` | `20` | Max simultaneous connections |
|
|
130
|
+
| `--rps` | `50` | Target requests per second |
|
|
131
|
+
| `--duration` | `300` | Test duration in seconds |
|
|
132
|
+
| `--timeout` | `30` | Per-request timeout in seconds |
|
|
133
|
+
| `--stages` | — | Custom stages JSON: `'[{"duration":60,"rps":100}]'` |
|
|
134
|
+
| `--var KEY=VALUE` | — | Override a collection variable (repeatable) |
|
|
135
|
+
| `--save-responses` | off | Save response bodies in the report |
|
|
136
|
+
| `--no-verify-ssl` | off | Skip SSL certificate verification |
|
|
137
|
+
| `--output` | `reports` | Directory to write the HTML report |
|
|
138
|
+
| `--format` | `html` | Report format: `html`, `json`, `csv` |
|
|
139
|
+
| `--assert EXPR` | — | Assertion threshold (repeatable), e.g. `p95_latency_ms<500` |
|
|
140
|
+
| `--junit PATH` | — | Write JUnit XML report for CI systems |
|
|
141
|
+
| `--config PATH` | — | Load config from `overload.config.yaml` |
|
|
142
|
+
| `--open-report` | off | Open HTML report in browser after run |
|
|
143
|
+
|
|
144
|
+
**Sequential runner (run requests in order):**
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
overload sequential --collection my_api.json --iterations 5 --delay 500
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
| Flag | Default | Description |
|
|
151
|
+
|------|---------|-------------|
|
|
152
|
+
| `--collection` | *(required)* | Path to Postman collection JSON |
|
|
153
|
+
| `--environment` | — | Path to Postman environment JSON |
|
|
154
|
+
| `--iterations` | `1` | How many times to run the full collection |
|
|
155
|
+
| `--delay` | `0` | Milliseconds to wait between requests |
|
|
156
|
+
| `--timeout` | `30` | Per-request timeout in seconds |
|
|
157
|
+
| `--output` | `.` | Directory to write the HTML report |
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Test Types
|
|
162
|
+
|
|
163
|
+
| Type | What it does |
|
|
164
|
+
|------|-------------|
|
|
165
|
+
| **Burst** | Fires all N requests at once as fast as possible |
|
|
166
|
+
| **Load** | Sustained traffic — ramp up → hold at target RPS → ramp down |
|
|
167
|
+
| **Stress** | Steps up RPS until errors exceed the failure threshold |
|
|
168
|
+
| **Spike** | Baseline RPS → sudden spike → recovery, to test elasticity |
|
|
169
|
+
| **Soak** | Steady low RPS over a long duration (find memory leaks / drift) |
|
|
170
|
+
| **Ramp** | Linearly increases from start RPS to end RPS |
|
|
171
|
+
| **Breakpoint** | Binary search to find the exact RPS where latency or errors degrade |
|
|
172
|
+
| **Custom** | Define your own stages: `[{"duration": 60, "rps": 100}, ...]` |
|
|
173
|
+
| **Rate Limit** | Verifies that the API enforces its rate limit correctly |
|
|
174
|
+
| **Sequential** | Runs each request in collection order, N iterations |
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## CI/CD Integration
|
|
179
|
+
|
|
180
|
+
Overload can gate your CI pipeline. Add assertions and the process exits `1` on failure — the universal CI signal.
|
|
181
|
+
|
|
182
|
+
**Inline assertions:**
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
overload run --collection api.json --pattern load --rps 100 --duration 60 \
|
|
186
|
+
--assert "p95_latency_ms<500" \
|
|
187
|
+
--assert "error_rate_pct<1" \
|
|
188
|
+
--junit results.xml
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Using a config file:**
|
|
192
|
+
|
|
193
|
+
Save your test config with assertions to `overload.config.yaml` (the browser UI can do this via **Save Config**):
|
|
194
|
+
|
|
195
|
+
```yaml
|
|
196
|
+
test_type: load
|
|
197
|
+
config:
|
|
198
|
+
target_rps: 100
|
|
199
|
+
hold_duration_seconds: 60
|
|
200
|
+
concurrency: 20
|
|
201
|
+
thresholds:
|
|
202
|
+
- metric: p95_latency_ms
|
|
203
|
+
operator: "<"
|
|
204
|
+
value: 500
|
|
205
|
+
- metric: error_rate_pct
|
|
206
|
+
operator: "<"
|
|
207
|
+
value: 1
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Then in CI:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
overload run --collection api.json --config overload.config.yaml --junit results.xml
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**GitHub Actions example:**
|
|
217
|
+
|
|
218
|
+
```yaml
|
|
219
|
+
- name: Run load test
|
|
220
|
+
run: |
|
|
221
|
+
pip install overload-cli
|
|
222
|
+
overload run --collection tests/api.json \
|
|
223
|
+
--config overload.config.yaml \
|
|
224
|
+
--junit results.xml
|
|
225
|
+
|
|
226
|
+
- name: Publish test results
|
|
227
|
+
uses: dorny/test-reporter@v1
|
|
228
|
+
if: always()
|
|
229
|
+
with:
|
|
230
|
+
name: Load Test
|
|
231
|
+
path: results.xml
|
|
232
|
+
reporter: java-junit
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Available assertion metrics:** `p50_latency_ms`, `p95_latency_ms`, `p99_latency_ms`, `max_latency_ms`, `mean_latency_ms`, `error_rate_pct`, `success_rate_pct`, `avg_rps`, `total_requests`, `rate_limited_count`
|
|
236
|
+
|
|
237
|
+
**Operators:** `<`, `<=`, `>`, `>=`, `==`
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Quick Reference
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
# See results in browser (recommended)
|
|
245
|
+
overload
|
|
246
|
+
|
|
247
|
+
# See results in terminal
|
|
248
|
+
overload run --collection my_api.json --pattern burst --requests 100
|
|
249
|
+
|
|
250
|
+
# Debug mode (verbose logging)
|
|
251
|
+
overload --debug
|
|
252
|
+
# or
|
|
253
|
+
OVERLOAD_DEBUG=1 overload
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Working Directory
|
|
259
|
+
|
|
260
|
+
When you launch `overload` from a directory that contains Postman JSON files, the UI auto-detects and lists them. Start from your project folder:
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
cd path/to/my-api-tests/
|
|
264
|
+
overload
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
The HTML report is also saved to the working directory after each test.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
overload/__init__.py,sha256=C52JK4KMjf9MnPZNJ_yYBD0f49c1qgMV5818fiDNO7Y,58
|
|
2
|
+
overload/__main__.py,sha256=0k15wwwnGTPqVP2hHL3TpawUo1tJ9nkkZVBgaikDTog,74
|
|
3
|
+
overload/cli.py,sha256=6CfuV41Xl4D_ZCxx8l66AikpfD4X2CFxAmIHUIwjpXY,15140
|
|
4
|
+
overload/config_file.py,sha256=dnE_FoJrf-jo1wPTL8ca1Xf6mz5O-5uhbSetd91fjXo,1831
|
|
5
|
+
overload/collection/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
|
|
6
|
+
overload/collection/environment.py,sha256=Z-Z-v8T4w0uc51V89QKTKJET8_a9PC-swB0xCqGFsE4,640
|
|
7
|
+
overload/collection/models.py,sha256=WVcPGUpCcYGCoJTTGUcwHOrlVyiCwWdaHLVDlDX2D9k,2265
|
|
8
|
+
overload/collection/parser.py,sha256=D-Jewn7sJ9Q-iD2j-yczZ3Ww-S_sbgQT3qUdUrB1T7A,6370
|
|
9
|
+
overload/collection/variables.py,sha256=_bZrxSIachcOTnf1W1Vl6hWZ5mM4JwHifxXeoxL98Lk,2714
|
|
10
|
+
overload/engine/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
|
|
11
|
+
overload/engine/assertions.py,sha256=FL7Hp_vsmPC7wdr6EFGh3QJ54_q7cY-tO4rEyD9d7n8,5162
|
|
12
|
+
overload/engine/auth.py,sha256=QpU-rWk_S0fwlKHcbvZ2FJnW8bW2ppV6Sm_AQmrEW0w,2571
|
|
13
|
+
overload/engine/events.py,sha256=PTuYKtgK46UJzRMjyJsu4mFwJcrCyVmCnfTcFUVXU2Y,1695
|
|
14
|
+
overload/engine/http_client.py,sha256=yZPbZ42glvZb-BeSguWhLb4AZyHVjK9IM0IY7-ygh1c,9533
|
|
15
|
+
overload/engine/load_patterns.py,sha256=83ANLbFETZCcuopwNEnKXyxpq8eSahjpp9Y67NdClqE,25774
|
|
16
|
+
overload/engine/models.py,sha256=mjZy8Q8fprMC3HeQl-sV6a5Qg1uxHxXJvTzxunP_1ag,7103
|
|
17
|
+
overload/engine/rate_limiter.py,sha256=iJjgV9QgvYnjHM-c4v72GYBGwZrh0qRGF-rd-uTd6u8,4115
|
|
18
|
+
overload/engine/runner.py,sha256=98e7sBXrMmQkYq3BpZ_Bx2o3HlVaqJv3qQi3Py4edVk,2865
|
|
19
|
+
overload/report/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
|
|
20
|
+
overload/report/exporters.py,sha256=OWzbVqIpvqMyuB24oJY99ic-LXZiCio5cQFY8_H8lLw,2122
|
|
21
|
+
overload/report/generator.py,sha256=UBd50SHXXtUXcbJ5y1fzm7vxnHEqqYeP_Qi4QHyNGa8,1809
|
|
22
|
+
overload/report/templates/report.html,sha256=gOX4-VUz-sJZq_e6FOIjNj-vakp5SHGP6ipmfZs2HaI,21252
|
|
23
|
+
overload/utils/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
|
|
24
|
+
overload/utils/naming.py,sha256=wiQCDp689e7R4FrwtZtJwOvrcAPv8THG1isd2sQ0bac,737
|
|
25
|
+
overload/web/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
|
|
26
|
+
overload/web/app.py,sha256=Be5oXDl4DQLbWJBTd6RbZMwUMQKLeDu_0lAQijs42h8,1013
|
|
27
|
+
overload/web/routes/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
|
|
28
|
+
overload/web/routes/api.py,sha256=3RUuM-gb-gnd6YXFXMoy54eeXY3gNWVxz-s1D4jYI9Q,17497
|
|
29
|
+
overload/web/routes/ws.py,sha256=4HAgg1uwL86zkP_A87xFe3XYYb6VVzBBS6-ZAbhCXbQ,2220
|
|
30
|
+
overload/web/static/css/app.css,sha256=CrsIpJIHzBgZVgTk273TWhjRwsr9LDG6Zd-JHmtI7KA,16446
|
|
31
|
+
overload/web/static/js/app.js,sha256=2YLK1Oeb5ukHln7hcf-3pvgmqq3n5wItlQSmM4SyA3E,11004
|
|
32
|
+
overload/web/static/js/charts.js,sha256=QHWcTHETa7s1UFw4UMXU8Hrb0fAjakRpcf59XWaLBaw,15190
|
|
33
|
+
overload/web/static/js/collection.js,sha256=z-QjOW883hlrhHhfITRNrbe58it223GUtufTvDP2U2Q,13722
|
|
34
|
+
overload/web/static/js/runner.js,sha256=Ew6SDfnmFtW-sOGWwo0CnhAvQhR19Oylodl8Ri7w9Xo,30973
|
|
35
|
+
overload/web/templates/index.html,sha256=qHlCwLfMJrDrc6BjtJndiNINGAwAM5lO63eBgn7SU1c,818
|
|
36
|
+
overload_cli-0.1.0.dist-info/METADATA,sha256=mZ73AMY18HUCDv3HluZeGT2378lqE7rfTKBsWkgXwTo,8795
|
|
37
|
+
overload_cli-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
38
|
+
overload_cli-0.1.0.dist-info/entry_points.txt,sha256=K2d6azt_baOwO_SOXzWpXxx552FcIivHdjOyAGVtqlE,47
|
|
39
|
+
overload_cli-0.1.0.dist-info/licenses/LICENSE,sha256=D4j7SEEdlPgLDOYn1MfcIu9_0pfCVLUnX3h58tAFSlc,1069
|
|
40
|
+
overload_cli-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Devi Prakash
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|