CyberMax-tools commited on
Commit
ecfece4
·
verified ·
1 Parent(s): 79ea524

Deploy pactsprig to the hub

Browse files
.gitattributes CHANGED
@@ -671,3 +671,4 @@ brand/pactsprig/cover.png filter=lfs diff=lfs merge=lfs -text
671
  brand/pactsprig/image-1-shot.png filter=lfs diff=lfs merge=lfs -text
672
  brand/pactsprig/image-2-shot.png filter=lfs diff=lfs merge=lfs -text
673
  brand/pactsprig/image-3-output.png filter=lfs diff=lfs merge=lfs -text
 
 
671
  brand/pactsprig/image-1-shot.png filter=lfs diff=lfs merge=lfs -text
672
  brand/pactsprig/image-2-shot.png filter=lfs diff=lfs merge=lfs -text
673
  brand/pactsprig/image-3-output.png filter=lfs diff=lfs merge=lfs -text
674
+ pactsprig/og.png filter=lfs diff=lfs merge=lfs -text
pactsprig/app.js ADDED
@@ -0,0 +1,380 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Pactsprig app: agreement picker, guided Cover Page form, live preview, PDF / DOCX / print, saved companies,
2
+ * presets and backup. Everything stays in this browser. © 2026 CyberMax. All rights reserved. */
3
+ (function () {
4
+ "use strict";
5
+ var C = window.PactCore, P = window.PactPDF, D = window.PactDOCX, X = window.CMXPro;
6
+ var KEY = "pactsprig:v1", FREE_PDFS = 3;
7
+ var AGREEMENTS = [
8
+ { id: "mnda", name: "Mutual NDA", desc: "Protect what both sides share", free: true },
9
+ { id: "psa", name: "Professional Services", desc: "Key Terms + Statement of Work", free: false },
10
+ { id: "design-partner", name: "Design Partner", desc: "Early access for feedback", free: false },
11
+ ];
12
+ var tpls = {}, state, tpl, model, renderTimer;
13
+ function $(id) { return document.getElementById(id); }
14
+ function pro() { return X.isPro(); }
15
+ function toast(m) { X.toast(m); }
16
+ function upsell(msg, from) { X.upsell(msg || "That is part of Pactsprig Pro.", from); }
17
+ function esc(s) { return String(s == null ? "" : s).replace(/[&<>"]/g, function (c) { return { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" }[c]; }); }
18
+ function agreementInfo(id) { return AGREEMENTS.filter(function (a) { return a.id === id; })[0] || AGREEMENTS[0]; }
19
+ function partiesEmpty() { return state.parties.every(function (p) { return !((p.company || "") + (p.name || "")).trim(); }); }
20
+ function allowed() { return agreementInfo(state.agreement).free || pro(); }
21
+
22
+ /* ---------- storage ---------- */
23
+ function load() {
24
+ var s = null;
25
+ try { s = JSON.parse(localStorage.getItem(KEY) || "null"); } catch (e) { s = null; }
26
+ if (!s || typeof s !== "object") s = { fresh: true };
27
+ s.agreement = agreementInfo(s.agreement).id;
28
+ s.docs = s.docs || {};
29
+ s.parties = Array.isArray(s.parties) && s.parties.length === 2 ? s.parties : [C.emptyParty(), C.emptyParty()];
30
+ s.savedParties = Array.isArray(s.savedParties) ? s.savedParties : [];
31
+ s.presets = Array.isArray(s.presets) ? s.presets : [];
32
+ s.page = s.page === "A4" ? "A4" : "Letter";
33
+ return s;
34
+ }
35
+ function save() {
36
+ try { var c = Object.assign({}, state); delete c.fresh; localStorage.setItem(KEY, JSON.stringify(c)); } catch (e) { /* private mode */ }
37
+ }
38
+
39
+ function getTpl(id) {
40
+ if (tpls[id]) return Promise.resolve(tpls[id]);
41
+ return fetch("templates/" + id + ".json").then(function (r) { if (!r.ok) throw new Error("template " + id); return r.json(); }).then(function (t) { tpls[id] = t; return t; });
42
+ }
43
+
44
+ /* ---------- picker ---------- */
45
+ function renderPicker() {
46
+ $("picker").innerHTML = AGREEMENTS.map(function (a) {
47
+ return '<button type="button" role="radio" data-agreement="' + a.id + '" aria-checked="' + (a.id === state.agreement) + '"><b>' + esc(a.name) + "</b><span>" + esc(a.desc) + "</span>" +
48
+ (a.free ? '<i class="tag free">Free</i>' : '<i class="tag pro">Pro</i>') + "</button>";
49
+ }).join("");
50
+ }
51
+ $("picker").addEventListener("click", function (e) {
52
+ var b = e.target.closest("button[data-agreement]");
53
+ if (!b) return;
54
+ switchTo(b.getAttribute("data-agreement"));
55
+ });
56
+ $("picker").addEventListener("keydown", function (e) {
57
+ if (["ArrowRight", "ArrowLeft", "ArrowDown", "ArrowUp"].indexOf(e.key) < 0) return;
58
+ var i = AGREEMENTS.findIndex(function (a) { return a.id === state.agreement; }), d = e.key === "ArrowRight" || e.key === "ArrowDown" ? 1 : -1;
59
+ var next = AGREEMENTS[(i + d + AGREEMENTS.length) % AGREEMENTS.length].id;
60
+ e.preventDefault();
61
+ switchTo(next).then(function () { var b = document.querySelector('[data-agreement="' + next + '"]'); if (b) b.focus(); });
62
+ });
63
+
64
+ function switchTo(id, useExample) {
65
+ return getTpl(id).then(function (t) {
66
+ state.agreement = id; tpl = t;
67
+ var doc = state.docs[id], ex = C.example(t, C.isoToday());
68
+ if (useExample === "blank") { state.docs[id] = { values: C.defaults(t, C.isoToday()) }; state.demo = false; }
69
+ else if (useExample === true || (!doc && (state.demo || state.fresh || partiesEmpty()))) {
70
+ // examples come with their own parties; keep the user's real parties if they typed some
71
+ state.docs[id] = { values: ex.values };
72
+ if (useExample === true || state.demo || state.fresh || partiesEmpty()) { state.parties = ex.parties; state.demo = true; }
73
+ } else if (!doc) state.docs[id] = { values: C.defaults(t, C.isoToday()) };
74
+ else {
75
+ // add any keys a newer template introduced
76
+ if (state.demo) state.parties = ex.parties;
77
+ var dv = C.defaults(t, C.isoToday());
78
+ Object.keys(dv).forEach(function (k) { if (!(k in doc.values)) doc.values[k] = dv[k]; });
79
+ }
80
+ if (!agreementInfo(id).free && !pro()) toast(t.name + " is part of Pro. You can fill it in and preview it; downloads need Pro.");
81
+ renderPicker(); renderParties(); renderForm(); renderPreview(); save();
82
+ }).catch(function (err) { if (window.console) console.warn(err); toast("Could not load that agreement. Check your connection and try again."); });
83
+ }
84
+
85
+ /* ---------- parties ---------- */
86
+ function renderParties() {
87
+ var roles = tpl.partyRoles || tpl.parties || ["Party 1", "Party 2"];
88
+ [0, 1].forEach(function (i) {
89
+ $("pl-" + i).textContent = roles[i];
90
+ ["company", "name", "title", "address"].forEach(function (f) { var el = $("p" + i + "-" + f); if (el !== document.activeElement) el.value = state.parties[i][f] || ""; });
91
+ });
92
+ var opts = '<option value="">Saved companies…</option>' + state.savedParties.map(function (p, i) { return '<option value="' + i + '">' + esc(p.company || p.name) + "</option>"; }).join("");
93
+ Array.prototype.forEach.call(document.querySelectorAll("select[data-load-party]"), function (s) { s.innerHTML = opts; s.hidden = !state.savedParties.length; });
94
+ }
95
+ document.querySelector(".parties").addEventListener("input", function (e) {
96
+ var el = e.target, i = el.getAttribute("data-party"), f = el.getAttribute("data-field");
97
+ if (i == null || !f) return;
98
+ state.parties[+i][f] = el.value;
99
+ state.demo = false;
100
+ schedule();
101
+ });
102
+ document.querySelector(".parties").addEventListener("click", function (e) {
103
+ var b = e.target.closest("[data-save-party]");
104
+ if (!b) return;
105
+ if (!pro()) return upsell("Saved companies are part of Pro: save a company once and fill it into any agreement.", "parties");
106
+ var p = Object.assign({}, state.parties[+b.getAttribute("data-save-party")]);
107
+ if (!(p.company || "").trim()) return toast("Type the company name first.");
108
+ var at = state.savedParties.findIndex(function (q) { return (q.company || "").toLowerCase() === p.company.toLowerCase(); });
109
+ if (at > -1) state.savedParties[at] = p; else state.savedParties.push(p);
110
+ save(); renderParties(); renderPresets();
111
+ toast("Saved " + p.company + ".");
112
+ });
113
+ document.querySelector(".parties").addEventListener("change", function (e) {
114
+ var s = e.target.closest("select[data-load-party]");
115
+ if (!s || s.value === "") return;
116
+ if (!pro()) { s.value = ""; return upsell(null, "parties"); }
117
+ var p = state.savedParties[+s.value];
118
+ if (p) { state.parties[+s.getAttribute("data-load-party")] = Object.assign(C.emptyParty(), p); renderParties(); renderPreview(); save(); }
119
+ s.value = "";
120
+ });
121
+
122
+ /* ---------- cover page form ---------- */
123
+ function inputFor(key, spec, vals, label) {
124
+ var v = vals[key] == null ? "" : vals[key], id = "v-" + key.replace(/[^A-Za-z0-9]+/g, "-");
125
+ var aria = ' aria-label="' + esc(label) + '"';
126
+ if (spec.k === "sel") return '<select id="' + id + '" data-key="' + esc(key) + '"' + aria + ">" + spec.o.map(function (o) { return "<option" + (o === v ? " selected" : "") + ">" + esc(o) + "</option>"; }).join("") + "</select>";
127
+ if (spec.k === "date") return '<input type="date" id="' + id + '" data-key="' + esc(key) + '" value="' + esc(v) + '"' + aria + ">";
128
+ if (spec.k === "area") return '<textarea id="' + id + '" class="wide" rows="4" data-key="' + esc(key) + '" placeholder="' + esc(spec.ph || "") + '"' + aria + ">" + esc(v) + "</textarea>";
129
+ var num = spec.k === "num";
130
+ return '<input id="' + id + '" class="inl' + (num ? " num" : "") + '" data-key="' + esc(key) + '" value="' + esc(v) + '"' + (num ? ' inputmode="decimal"' : "") + ' placeholder="' + esc(spec.ph || "") + '" style="--w:' + (spec.w || 12) + 'ch"' + aria + ">";
131
+ }
132
+ /** Option text with its inline inputs: "Expires {years} year(s)" -> text + <input>. */
133
+ function inline(t, key, ins, vals, label) {
134
+ return String(t).replace(/\{(@?\w+)\}|([^{]+)/g, function (m, name, txt) {
135
+ if (txt) return '<span class="ot">' + esc(txt) + "</span>";
136
+ if (name.charAt(0) === "@") return '<span class="ot glob">' + esc(name === "@p1" ? "[Party 1 company]" : name === "@p2" ? "[Party 2 company]" : "[Key Terms Effective Date]") + "</span>";
137
+ return ins && ins[name] ? inputFor(key + "." + name, ins[name], vals, label + " " + name) : esc(m);
138
+ });
139
+ }
140
+ function optionsHtml(pgId, row, vals) {
141
+ var k = pgId + ":" + row.id, name = "r-" + k.replace(/[^A-Za-z0-9]+/g, "-");
142
+ var html = row.lead ? '<p class="lead">' + esc(row.lead) + "</p>" : "";
143
+ function subs(o, ok) {
144
+ if (!o.sub) return "";
145
+ return '<div class="subs">' + o.sub.map(function (s) {
146
+ var sk = ok + "." + s.id;
147
+ return '<div class="opt-row"><label class="optl"><input type="checkbox" data-key="' + esc(sk) + '"' + (vals[sk] ? " checked" : "") + "></label><div class=\"opt-body\">" + inline(s.t, sk, s.in, vals, row.label) + "</div></div>";
148
+ }).join("") + "</div>";
149
+ }
150
+ (row.options || []).forEach(function (o) {
151
+ var ok = k + "." + o.id, on = row.type === "choice" ? vals[k] === o.id : !!vals[ok];
152
+ var ctl = row.type === "choice" ? '<input type="radio" name="' + name + '" data-key="' + esc(k) + '" value="' + esc(o.id) + '"' + (on ? " checked" : "") + ">" : '<input type="checkbox" data-key="' + esc(ok) + '"' + (on ? " checked" : "") + ">";
153
+ html += '<div class="opt-row' + (on ? " on" : "") + '"><label class="optl">' + ctl + '</label><div class="opt-body">' + inline(o.t, ok, o.in, vals, row.label) + (on ? subs(o, ok) : "") + "</div></div>";
154
+ });
155
+ if (row.type === "choice" && row.optional) {
156
+ html += '<div class="opt-row' + (!vals[k] ? " on" : "") + '"><label class="optl"><input type="radio" name="' + name + '" data-key="' + esc(k) + '" value=""' + (!vals[k] ? " checked" : "") + '></label><div class="opt-body"><span class="ot muted">None (leave this out)</span></div></div>';
157
+ }
158
+ return html;
159
+ }
160
+ function rowHtml(pg, row, vals) {
161
+ if (row.type === "heading") return '<h3 class="fh">' + esc(row.label) + "</h3>";
162
+ var k = pg.id + ":" + row.id, id = "v-" + k.replace(/[^A-Za-z0-9]+/g, "-");
163
+ var free = row.type === "text" || row.type === "textarea";
164
+ var head = row.omitLabel ? "" : '<div class="fl"><label' + (free ? ' for="' + id + '"' : "") + ">" + esc(row.label) + (row.optional ? ' <span class="opt">optional</span>' : "") + "</label>" + (row.sub ? '<span class="fsub">' + esc(row.sub) + "</span>" : "") + "</div>";
165
+ var body;
166
+ if (row.type === "text" || row.type === "textarea") {
167
+ body = row.type === "text" ? '<input id="' + id + '" data-key="' + esc(k) + '" value="' + esc(vals[k]) + '" placeholder="' + esc(row.ph || "") + '">'
168
+ : '<textarea id="' + id + '" rows="3" data-key="' + esc(k) + '" placeholder="' + esc(row.ph || "") + '">' + esc(vals[k]) + "</textarea>";
169
+ } else if (row.type === "line") body = '<div class="line">' + inline(row.t, k, row.in, vals, row.label) + "</div>";
170
+ else if (row.type === "fixed") body = '<div class="line fixed">' + esc(row.t) + "</div>";
171
+ else body = '<div class="opts" role="group" aria-label="' + esc(row.label || row.lead || "") + '">' + optionsHtml(pg.id, row, vals) + "</div>";
172
+ return '<div class="frow' + (row.omitLabel ? " cont" : "") + '" data-row="' + esc(k) + '">' + head + body + (row.help ? '<p class="help">' + esc(row.help) + "</p>" : "") + "</div>";
173
+ }
174
+ function renderForm() {
175
+ var vals = state.docs[state.agreement].values;
176
+ $("cover-form").innerHTML = tpl.cover.map(function (pg, i) {
177
+ var title = pg.kicker ? (pg.kicker === "SOW" ? "Statement of Work (SOW)" : pg.kicker) : "Cover Page";
178
+ return '<details class="card cover-card" open data-page="' + esc(pg.id) + '"><summary><h2>' + esc(title) + '</h2><span class="step">' + esc(tpl.short || tpl.name) + "</span></summary>" +
179
+ (i === 0 ? '<p class="hint">' + esc(tpl.blurb || "") + "</p>" : "") + pg.rows.map(function (r) { return rowHtml(pg, r, vals); }).join("") + "</details>";
180
+ }).join("");
181
+ }
182
+ function onField(e) {
183
+ var el = e.target, key = el.getAttribute && el.getAttribute("data-key");
184
+ if (!key) return;
185
+ var vals = state.docs[state.agreement].values;
186
+ if (el.type === "checkbox") vals[key] = el.checked;
187
+ else vals[key] = el.value;
188
+ if (el.type === "checkbox" || el.type === "radio") {
189
+ // re-draw this row so nested options appear / disappear
190
+ var rowEl = el.closest(".frow"), rk = rowEl && rowEl.getAttribute("data-row");
191
+ var pgId = rk.split(":")[0], rid = rk.split(":")[1];
192
+ var pg = tpl.cover.filter(function (p) { return p.id === pgId; })[0], row = pg.rows.filter(function (r) { return r.id === rid; })[0];
193
+ var tmp = document.createElement("div");
194
+ tmp.innerHTML = rowHtml(pg, row, vals);
195
+ rowEl.replaceWith(tmp.firstChild);
196
+ var again = document.querySelector('[data-row="' + rk + '"] [data-key="' + key + '"]' + (el.type === "radio" ? '[value="' + el.value + '"]' : ""));
197
+ if (again) again.focus();
198
+ }
199
+ schedule();
200
+ }
201
+ $("cover-form").addEventListener("input", onField);
202
+ $("cover-form").addEventListener("change", function (e) { if (e.target.type === "checkbox" || e.target.type === "radio" || e.target.tagName === "SELECT") onField(e); });
203
+
204
+ /* ---------- preview ---------- */
205
+ function schedule() { clearTimeout(renderTimer); renderTimer = setTimeout(function () { renderPreview(); save(); }, 120); }
206
+ function itemHtml(it) {
207
+ var t = esc(it.t).split(esc(C.BLANK)).join('<span class="miss">' + C.BLANK + "</span>");
208
+ return '<div class="d-it' + (it.bullet ? " b" : "") + (it.lead ? " lead" : "") + '" style="--lvl:' + it.lvl + '">' + t + "</div>";
209
+ }
210
+ function runsHtml(b) {
211
+ var h = "";
212
+ if (b.l === 1 && b.h && b.r) h += "<b>" + esc(b.n + " " + b.h) + ".</b> ";
213
+ else if (b.n) h += b.l <= 2 ? "<b>" + esc(b.n) + "</b> " : esc(b.n) + " ";
214
+ if (b.h3) h += "<b>" + esc(b.h3) + "</b> ";
215
+ (b.r || []).forEach(function (r) { h += typeof r === "string" ? esc(r) : r[0] === "b" ? "<b>" + esc(r[1]) + "</b>" : '<span class="v">' + esc(r[1]) + "</span>"; });
216
+ return h;
217
+ }
218
+ function renderPreview() {
219
+ var d = state.docs[state.agreement];
220
+ model = C.build(tpl, { values: d.values, parties: state.parties });
221
+ var h = "";
222
+ model.pages.forEach(function (pg) {
223
+ h += '<section class="d-cover">' + (pg.kicker ? '<div class="d-kicker">' + esc(pg.kicker) + "</div>" : "") + '<h2 class="d-title">' + esc(pg.title) + "</h2>";
224
+ if (pg.intro) h += '<p class="d-intro">' + esc(pg.intro) + "</p>";
225
+ if (pg.lead) h += '<p class="d-lead">' + esc(pg.lead) + "</p>";
226
+ h += '<div class="d-rows">' + pg.rows.map(function (r) {
227
+ if (r.heading) return '<div class="d-head">' + esc(r.heading) + "</div>";
228
+ return '<div class="d-row"><div class="d-l"><b>' + esc(r.label) + "</b>" + (r.sub ? "<small>" + esc(r.sub) + "</small>" : "") + '</div><div class="d-r">' + r.items.map(itemHtml).join("") + "</div></div>";
229
+ }).join("") + "</div>";
230
+ if (pg.closing) h += '<p class="d-closing">' + esc(pg.closing) + "</p>";
231
+ h += '<table class="d-sign"><thead><tr><th></th>' + pg.sign.heads.map(function (x) { return "<th>" + esc(x) + "</th>"; }).join("") + "</tr></thead><tbody>" +
232
+ pg.sign.rows.map(function (r) {
233
+ return '<tr><th scope="row">' + esc(r.label) + (r.note ? "<small>" + esc(r.note) + "</small>" : "") + "</th>" + r.values.map(function (v) { return r.line ? '<td class="sigline"><span></span></td>' : "<td>" + (esc(v) || '<span class="miss">' + C.BLANK + "</span>") + "</td>"; }).join("") + "</tr>";
234
+ }).join("") + "</tbody></table>";
235
+ h += '<p class="d-att">' + esc(model.attribution) + "</p></section>";
236
+ });
237
+ h += '<section class="d-terms"><h2 class="d-tt">' + esc(model.termsTitle) + '</h2><p class="d-tn">' + esc(model.termsNote) + "</p>";
238
+ h += model.terms.map(function (b) {
239
+ if (b.l === 1 && b.h && !b.r) return '<h3 class="d-sec">' + esc(b.n + " " + b.h) + "</h3>";
240
+ return '<p class="d-p l' + b.l + '">' + runsHtml(b) + "</p>";
241
+ }).join("");
242
+ h += '<p class="d-att end"><a href="' + esc(model.termsUrl) + '" target="_blank" rel="noopener">' + esc(model.attribution.replace(/ CC BY 4\.0\.$/, "")) + '</a> <a href="' + esc(model.licenceUrl) + '" target="_blank" rel="noopener">CC BY 4.0</a>.</p>' +
243
+ '<p class="d-src">Standard Terms: ' + esc(model.termsUrl) + " · Licence: " + esc(model.licenceUrl) + "</p></section>";
244
+ h += '<p class="d-credit">' + esc(C.CREDIT) + "</p>";
245
+ if (!allowed()) h += '<div class="d-lock"><p><b>' + esc(tpl.name) + "</b> is part of Pactsprig Pro. Keep filling it in; downloads and printing unlock with Pro ($29 once).</p><button type=\"button\" class=\"btn\" id=\"btn-unlock\">Unlock all agreements</button></div>";
246
+ var docEl = $("doc");
247
+ docEl.innerHTML = h;
248
+ docEl.classList.toggle("locked", !allowed());
249
+ docEl.classList.toggle("a4", state.page === "A4");
250
+ var ul = $("btn-unlock"); if (ul) ul.onclick = function () { upsell(null, "agreement"); };
251
+ $("doc-meta").textContent = tpl.short + " · Version " + tpl.version;
252
+ var w = $("warn");
253
+ w.textContent = model.missing.length ? "Still blank: " + model.missing.slice(0, 4).join(", ") + (model.missing.length > 4 ? " and " + (model.missing.length - 4) + " more" : "") + ". Blank lines print as ________ to fill by hand." : "";
254
+ quotaLine();
255
+ }
256
+
257
+ /* ---------- quota + downloads ---------- */
258
+ function quotaLine() {
259
+ var el = $("quota");
260
+ if (pro()) { el.textContent = "Pro: unlimited downloads, Word export, no Pactsprig footer line."; el.className = "quota"; return; }
261
+ if (!agreementInfo(state.agreement).free) { el.textContent = "This agreement is part of Pro. The Mutual NDA is free."; el.className = "quota out"; return; }
262
+ var q = X.quota("pdf", FREE_PDFS);
263
+ el.textContent = q.left > 0 ? q.left + " of " + FREE_PDFS + " free PDFs left this month · printing is free" : "You have used this month's " + FREE_PDFS + " free PDFs. Printing still works, or go Pro for unlimited.";
264
+ el.className = "quota" + (q.left > 0 ? "" : " out");
265
+ }
266
+ function lockedUpsell() { upsell(tpl.name + " is part of Pactsprig Pro, with Word export and unlimited downloads.", "agreement"); }
267
+ function downloadPdf() {
268
+ if (!allowed()) return lockedUpsell();
269
+ var q = X.quota("pdf", FREE_PDFS);
270
+ if (!pro() && q.left <= 0) { quotaLine(); return upsell("You have used this month's " + FREE_PDFS + " free PDFs. Go Pro for unlimited downloads with no footer line.", "pdf-limit"); }
271
+ var bytes;
272
+ try { bytes = P.build(model, { credit: !pro(), page: state.page }); } catch (e) { toast("Sorry, the PDF could not be made: " + e.message); return; }
273
+ q.take();
274
+ X.download(C.fileName(tpl, state.parties, "pdf"), new Blob([bytes], { type: "application/pdf" }));
275
+ quotaLine();
276
+ if (!pro()) {
277
+ $("pro-cta").hidden = false;
278
+ var left = X.quota("pdf", FREE_PDFS).left;
279
+ toast("PDF downloaded. " + (left ? left + " free PDF" + (left === 1 ? "" : "s") + " left this month." : "That was your last free PDF this month."));
280
+ } else toast("PDF downloaded.");
281
+ }
282
+ function downloadDocx() {
283
+ if (!pro()) return upsell("Word (DOCX) export is part of Pro, so you can edit the Cover Page in Word or upload it to your e-signature tool.", "docx");
284
+ var bytes = D.build(model, { page: state.page });
285
+ X.download(C.fileName(tpl, state.parties, "docx"), new Blob([bytes], { type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }));
286
+ toast("Word file downloaded.");
287
+ }
288
+ $("btn-pdf").addEventListener("click", downloadPdf);
289
+ $("m-pdf").addEventListener("click", downloadPdf);
290
+ $("btn-docx").addEventListener("click", downloadDocx);
291
+ $("btn-print").addEventListener("click", function () {
292
+ if (!allowed()) return lockedUpsell();
293
+ window.print();
294
+ });
295
+ $("f-page").addEventListener("change", function (e) { state.page = e.target.value === "A4" ? "A4" : "Letter"; save(); renderPreview(); });
296
+
297
+ /* ---------- presets, saved companies, backup ---------- */
298
+ function renderPresets() {
299
+ var box = $("presets");
300
+ if (!pro()) {
301
+ box.innerHTML = '<p class="hint">Pro remembers the companies you work with and your usual Cover Page answers (for example “Standard NDA: Delaware, 2 years”), so the next agreement takes seconds.</p><button type="button" class="btn sm" id="btn-presets-pro">Unlock with Pro</button>';
302
+ $("btn-presets-pro").onclick = function () { upsell(null, "presets"); };
303
+ return;
304
+ }
305
+ var mine = state.presets.filter(function (p) { return p.agreement === state.agreement; });
306
+ box.innerHTML = '<h3 class="mini">Cover Page presets for ' + esc(tpl.short) + '</h3><div class="preset-add"><label class="sr" for="f-preset">Preset name</label><input id="f-preset" placeholder="e.g. Standard NDA, Delaware, 2 years"><button type="button" class="btn sm" id="btn-preset-save">Save preset</button></div>' +
307
+ '<div class="chips">' + (mine.length ? mine.map(function (p) { var i = state.presets.indexOf(p); return '<span class="chip"><button type="button" class="chip-load" data-preset="' + i + '">' + esc(p.name) + '</button><button type="button" data-del-preset="' + i + '" aria-label="Delete preset ' + esc(p.name) + '">×</button></span>'; }).join("") : '<span class="hint">No presets yet.</span>') + "</div>" +
308
+ '<h3 class="mini">Saved companies</h3><div class="chips">' + (state.savedParties.length ? state.savedParties.map(function (p, i) { return '<span class="chip"><span>' + esc(p.company) + '</span><button type="button" data-del-party="' + i + '" aria-label="Delete ' + esc(p.company) + '">×</button></span>'; }).join("") : '<span class="hint">Use “Save company” on a party to keep it here.</span>') + "</div>";
309
+ }
310
+ $("presets").addEventListener("click", function (e) {
311
+ var t = e.target;
312
+ if (t.id === "btn-preset-save") {
313
+ var name = ($("f-preset").value || "").trim() || tpl.short + " preset " + (state.presets.length + 1);
314
+ state.presets.push({ name: name, agreement: state.agreement, values: Object.assign({}, state.docs[state.agreement].values) });
315
+ save(); renderPresets(); toast("Preset saved: " + name);
316
+ } else if (t.hasAttribute("data-preset")) {
317
+ var p = state.presets[+t.getAttribute("data-preset")];
318
+ if (p) { state.docs[state.agreement].values = Object.assign(C.defaults(tpl, C.isoToday()), p.values); renderForm(); renderPreview(); save(); toast("Loaded preset: " + p.name); }
319
+ } else if (t.hasAttribute("data-del-preset")) {
320
+ state.presets.splice(+t.getAttribute("data-del-preset"), 1); save(); renderPresets();
321
+ } else if (t.hasAttribute("data-del-party")) {
322
+ state.savedParties.splice(+t.getAttribute("data-del-party"), 1); save(); renderPresets(); renderParties();
323
+ }
324
+ });
325
+ $("btn-backup").addEventListener("click", function () {
326
+ if (!pro()) return upsell("JSON backup is part of Pro.", "backup");
327
+ var c = Object.assign({}, state); delete c.fresh;
328
+ X.download("pactsprig-backup-" + C.isoToday() + ".json", JSON.stringify({ app: "pactsprig", version: 1, saved: new Date().toISOString(), data: c }, null, 1), "application/json");
329
+ });
330
+ $("f-restore").addEventListener("click", function (e) { if (!pro()) { e.preventDefault(); upsell("JSON backup and restore are part of Pro.", "backup"); } });
331
+ $("f-restore").addEventListener("change", function (e) {
332
+ var f = e.target.files && e.target.files[0];
333
+ if (!f) return;
334
+ f.text().then(function (txt) {
335
+ var j = JSON.parse(txt);
336
+ if (!j || j.app !== "pactsprig" || !j.data) throw new Error("not a Pactsprig backup");
337
+ localStorage.setItem(KEY, JSON.stringify(j.data));
338
+ state = load();
339
+ return switchTo(state.agreement).then(function () { renderPresets(); toast("Backup restored."); });
340
+ }).catch(function (err) { toast("Could not restore: " + err.message); });
341
+ e.target.value = "";
342
+ });
343
+
344
+ /* ---------- hero buttons ---------- */
345
+ $("btn-example").addEventListener("click", function () { switchTo(state.agreement, true).then(function () { toast("Example loaded. Change anything; the contract updates as you type."); }); });
346
+ $("btn-clear").addEventListener("click", function () {
347
+ state.parties = [C.emptyParty(), C.emptyParty()];
348
+ switchTo(state.agreement, "blank").then(function () { toast("Blank Cover Page. Your saved companies and presets are still here."); });
349
+ });
350
+ $("btn-cta").addEventListener("click", function () { upsell(null, "mid-cta"); });
351
+
352
+ /* ---------- Pro on/off ---------- */
353
+ function onPro(on) {
354
+ $("pro-pill").textContent = on ? "Pro ✓" : "Pro";
355
+ if (on) $("pro-cta").hidden = true;
356
+ if (tpl) { renderPreview(); renderPresets(); }
357
+ }
358
+
359
+ /* ---------- PWA ---------- */
360
+ var deferred = null;
361
+ window.addEventListener("beforeinstallprompt", function (e) { e.preventDefault(); deferred = e; $("btn-install").hidden = false; });
362
+ $("btn-install").addEventListener("click", function () {
363
+ if (!deferred) return;
364
+ deferred.prompt();
365
+ deferred.userChoice.finally(function () { deferred = null; $("btn-install").hidden = true; });
366
+ });
367
+ if ("serviceWorker" in navigator && (location.protocol === "https:" || /^(localhost|127\.0\.0\.1)$/.test(location.hostname))) {
368
+ window.addEventListener("load", function () { navigator.serviceWorker.register("sw.js").catch(function () { /* offline cache is optional */ }); });
369
+ }
370
+
371
+ /* ---------- start ---------- */
372
+ state = load();
373
+ $("f-page").value = state.page;
374
+ renderPicker();
375
+ switchTo(state.agreement).then(function () {
376
+ state.fresh = false;
377
+ X.onChange(onPro);
378
+ document.documentElement.setAttribute("data-ready", "1");
379
+ });
380
+ })();
pactsprig/icon-192.png ADDED
pactsprig/icon-512.png ADDED
pactsprig/icon.svg ADDED
pactsprig/index.html ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>Free NDA Template &amp; Mutual NDA Generator (PDF) | Pactsprig</title>
7
+ <meta name="description" content="Free NDA template and mutual NDA generator: fill in the Cover Page of the Common Paper standard NDA and download a PDF to sign. No sign-up, nothing uploaded.">
8
+ <meta name="keywords" content="free NDA template, mutual NDA generator, NDA generator, mutual non-disclosure agreement template, contract generator, professional services agreement template, design partner agreement, Common Paper NDA">
9
+ <meta name="theme-color" content="#2A4D7A">
10
+ <link rel="canonical" href="https://cybermax-tools-cybermax.static.hf.space/pactsprig/index.html">
11
+ <link rel="manifest" href="manifest.webmanifest">
12
+ <link rel="icon" href="icon.svg" type="image/svg+xml">
13
+ <link rel="apple-touch-icon" href="icon-192.png">
14
+ <meta property="og:type" content="website">
15
+ <meta property="og:site_name" content="CyberMax">
16
+ <meta property="og:title" content="Pactsprig: free NDA template and contract generator">
17
+ <meta property="og:description" content="Fill in the Cover Page of a published standard agreement and download the contract as a PDF. Free, no sign-up, nothing uploaded.">
18
+ <meta property="og:url" content="https://cybermax-tools-cybermax.static.hf.space/pactsprig/index.html">
19
+ <meta property="og:image" content="https://cybermax-tools-cybermax.static.hf.space/pactsprig/og.png">
20
+ <meta name="twitter:card" content="summary_large_image">
21
+ <script type="application/ld+json">
22
+ {"@context":"https://schema.org","@graph":[
23
+ {"@type":"WebApplication","name":"Pactsprig","alternateName":"Pactsprig free NDA template and mutual NDA generator","url":"https://cybermax-tools-cybermax.static.hf.space/pactsprig/index.html","image":"https://cybermax-tools-cybermax.static.hf.space/pactsprig/og.png","applicationCategory":"BusinessApplication","operatingSystem":"Any (web browser)","browserRequirements":"Requires JavaScript","description":"NDA and business contract generator built on Common Paper's published standard agreements (CC BY 4.0). Fill in the Cover Page with plain-English help, preview the contract live and download a PDF with signature blocks. Works offline, nothing uploaded. Pactsprig is not a law firm and does not give legal advice.","offers":[{"@type":"Offer","name":"Free","price":"0","priceCurrency":"USD","description":"Mutual NDA, 3 PDF downloads a month, printing"},{"@type":"Offer","name":"Pactsprig Pro Lifetime","price":"29","priceCurrency":"USD","description":"All agreements (Mutual NDA, Professional Services, Design Partner), Word (DOCX) export, unlimited downloads, no Pactsprig footer line, saved companies and presets, JSON backup; pay once"}],"publisher":{"@type":"Organization","name":"CyberMax","email":"cybermax.tools@gmail.com"}},
24
+ {"@type":"FAQPage","mainEntity":[
25
+ {"@type":"Question","name":"Is the NDA template really free?","acceptedAnswer":{"@type":"Answer","text":"Yes. The Mutual NDA is free: fill in the Cover Page, preview it and download up to 3 PDFs a month, or print as often as you like, with no account. Free PDFs carry a small Prepared with Pactsprig line in the footer."}},
26
+ {"@type":"Question","name":"Why not LawDepot or Rocket Lawyer?","acceptedAnswer":{"@type":"Answer","text":"They are big legal-document services with many document types, e-signature and, at Rocket Lawyer, attorney help, sold by subscription: LawDepot from $7.99 a month billed yearly or $33 a month, Rocket Lawyer $39.99 a month (search summaries, checked 2 Oct 2026). If you need those, they are good choices. Pactsprig does one thing: fills in recognised open standard agreements, privately in your browser, for $29 once."}},
27
+ {"@type":"Question","name":"Where does the contract wording come from?","acceptedAnswer":{"@type":"Answer","text":"From Common Paper's standard agreements, written by a committee of attorneys and published free to use under CC BY 4.0. Pactsprig includes the Standard Terms word for word with the version number and the required attribution. Pactsprig is not affiliated with or endorsed by Common Paper."}},
28
+ {"@type":"Question","name":"Is my data private?","acceptedAnswer":{"@type":"Answer","text":"Yes. Pactsprig runs entirely in your browser. Party names, deal terms and saved companies stay on this device and the PDF is made on your device. Nothing is uploaded."}},
29
+ {"@type":"Question","name":"What does Pro add?","acceptedAnswer":{"@type":"Answer","text":"Every agreement (Professional Services Agreement with SOW and Design Partner Agreement as well as the Mutual NDA), Word (DOCX) export, unlimited downloads, no Pactsprig footer line, saved companies and Cover Page presets, and a JSON backup."}},
30
+ {"@type":"Question","name":"Can I cancel?","acceptedAnswer":{"@type":"Answer","text":"There is nothing to cancel. Pro is a single $29 payment, keep it forever."}},
31
+ {"@type":"Question","name":"Is this legal advice?","acceptedAnswer":{"@type":"Answer","text":"No. Pactsprig fills in published standard agreements; it is not a law firm and does not give legal advice. Have a lawyer review important contracts."}}]}
32
+ ]}
33
+ </script>
34
+ <link rel="stylesheet" href="style.css">
35
+ </head>
36
+ <body>
37
+ <header class="top"><div class="wrap top-in">
38
+ <a class="brand" href="./" aria-label="Pactsprig home"><img src="icon.svg" alt="" width="30" height="30"><span><b>Pactsprig</b> <small>by CyberMax</small></span></a>
39
+ <nav class="top-nav">
40
+ <button class="btn ghost sm" id="btn-install" type="button" hidden>Install app</button>
41
+ <a href="#cmx-pro" class="top-link">Pricing</a>
42
+ <a href="#cmx-pro" class="pill" id="pro-pill">Pro</a>
43
+ </nav>
44
+ </div></header>
45
+
46
+ <main>
47
+ <div class="wrap">
48
+ <section class="hero">
49
+ <h1>Free NDA template: a mutual NDA ready to sign</h1>
50
+ <p class="lede">For founders, freelancers and small businesses who need an NDA or a services contract today. Fill in the Cover Page of a recognised open standard agreement, watch the contract build as you type, then download it to sign. <b>Free, no sign-up, nothing uploaded.</b></p>
51
+ <div class="hero-row">
52
+ <button class="btn" id="btn-example" type="button">Load example</button>
53
+ <button class="btn ghost" id="btn-clear" type="button">Start blank</button>
54
+ <span class="hero-note">Mutual NDA free · 3 PDFs a month · print free · works offline</span>
55
+ </div>
56
+ <p class="legal-note" role="note"><b>Not legal advice.</b> Pactsprig fills in published standard agreements; it is not a law firm and does not give legal advice. Have a lawyer review important contracts.</p>
57
+ </section>
58
+ </div>
59
+
60
+ <section id="app" class="app wrap" aria-label="Contract generator">
61
+ <div class="picker" id="picker" role="radiogroup" aria-label="Agreement"></div>
62
+
63
+ <div class="cols">
64
+ <form id="editor" class="editor" autocomplete="off" novalidate>
65
+ <details class="card" open>
66
+ <summary><h2>Parties</h2></summary>
67
+ <p class="hint">The two companies signing. The person named signs for their company. Use an email or a postal address for notices.</p>
68
+ <div class="parties">
69
+ <fieldset class="party" data-party="0">
70
+ <legend id="pl-0">Party 1</legend>
71
+ <label for="p0-company">Company (official name)</label><input id="p0-company" data-party="0" data-field="company" autocomplete="organization">
72
+ <div class="g2">
73
+ <div><label for="p0-name">Signer name</label><input id="p0-name" data-party="0" data-field="name" autocomplete="name"></div>
74
+ <div><label for="p0-title">Signer title</label><input id="p0-title" data-party="0" data-field="title" autocomplete="organization-title"></div>
75
+ </div>
76
+ <label for="p0-address">Notice address <span class="opt">email or postal</span></label><textarea id="p0-address" data-party="0" data-field="address" rows="2"></textarea>
77
+ <div class="btns"><button type="button" class="btn ghost sm" data-save-party="0">Save company <span class="pro-tag">PRO</span></button><select class="saved-sel" data-load-party="0" aria-label="Fill Party 1 from a saved company"><option value="">Saved companies…</option></select></div>
78
+ </fieldset>
79
+ <fieldset class="party" data-party="1">
80
+ <legend id="pl-1">Party 2</legend>
81
+ <label for="p1-company">Company (official name)</label><input id="p1-company" data-party="1" data-field="company">
82
+ <div class="g2">
83
+ <div><label for="p1-name">Signer name</label><input id="p1-name" data-party="1" data-field="name"></div>
84
+ <div><label for="p1-title">Signer title</label><input id="p1-title" data-party="1" data-field="title"></div>
85
+ </div>
86
+ <label for="p1-address">Notice address <span class="opt">email or postal</span></label><textarea id="p1-address" data-party="1" data-field="address" rows="2"></textarea>
87
+ <div class="btns"><button type="button" class="btn ghost sm" data-save-party="1">Save company <span class="pro-tag">PRO</span></button><select class="saved-sel" data-load-party="1" aria-label="Fill Party 2 from a saved company"><option value="">Saved companies…</option></select></div>
88
+ </fieldset>
89
+ </div>
90
+ </details>
91
+
92
+ <div id="cover-form" class="cover-form"></div>
93
+
94
+ <details class="card" id="presets-card">
95
+ <summary><h2>Saved companies &amp; presets <span class="pro-tag">PRO</span></h2></summary>
96
+ <div id="presets"></div>
97
+ </details>
98
+
99
+ <details class="card">
100
+ <summary><h2>Backup <span class="pro-tag">PRO</span></h2></summary>
101
+ <p class="hint">Everything lives in this browser only. Nothing is uploaded. Download a backup file to move your saved companies and presets to another device.</p>
102
+ <div class="btns"><button type="button" class="btn ghost sm" id="btn-backup">Download backup (JSON)</button><label class="btn ghost sm file-btn" for="f-restore">Restore backup</label><input type="file" id="f-restore" accept="application/json,.json" hidden></div>
103
+ </details>
104
+ </form>
105
+
106
+ <aside class="preview-col" id="preview" aria-label="Preview and download">
107
+ <div class="actions card">
108
+ <div class="act-row">
109
+ <button type="button" class="btn big" id="btn-pdf">Download PDF</button>
110
+ <button type="button" class="btn ghost" id="btn-docx">Word (DOCX) <span class="pro-tag">PRO</span></button>
111
+ <button type="button" class="btn ghost" id="btn-print">Print</button>
112
+ </div>
113
+ <p class="quota" id="quota" aria-live="polite"></p>
114
+ <p class="warn" id="warn" aria-live="polite"></p>
115
+ <p class="disc">Pactsprig fills in published standard agreements; it is not a law firm and does not give legal advice. Have a lawyer review important contracts.</p>
116
+ <div class="act-meta"><label class="inline" for="f-page">Paper</label><select id="f-page" aria-label="Paper size"><option value="Letter">US Letter</option><option value="A4">A4</option></select><span class="hint" id="doc-meta"></span></div>
117
+ </div>
118
+ <div class="paper-wrap" id="paper-wrap"><article id="doc" class="paper" aria-label="Contract preview"></article></div>
119
+ </aside>
120
+ </div>
121
+ </section>
122
+
123
+ <div class="wrap">
124
+ <section class="pro-cta card" id="pro-cta" hidden>
125
+ <div>
126
+ <h2>Need the services contract next?</h2>
127
+ <p>Pactsprig Pro adds the Professional Services Agreement (Key Terms + SOW) and the Design Partner Agreement, Word (DOCX) export, unlimited downloads with no Pactsprig footer line, saved companies and presets. <b>$29 once.</b></p>
128
+ </div>
129
+ <button type="button" class="btn" id="btn-cta">See Pro</button>
130
+ </section>
131
+
132
+ <section class="how" id="how">
133
+ <h2>How it works</h2>
134
+ <ol class="steps">
135
+ <li><b>Pick an agreement.</b> The Mutual NDA is free. Pro adds the Professional Services Agreement and the Design Partner Agreement.</li>
136
+ <li><b>Fill in the Cover Page.</b> Parties, dates, term, governing law and the deal details, with a plain-English note under every field. The contract builds as you type.</li>
137
+ <li><b>Download and sign.</b> A PDF (or Word file with Pro) with the Cover Page, signature blocks and the full Standard Terms. Sign on paper or upload it to your e-signature tool.</li>
138
+ </ol>
139
+ </section>
140
+
141
+ <section class="compare" id="compare">
142
+ <h2>Pactsprig vs other contract generators</h2>
143
+ <div class="table-wrap">
144
+ <table class="cmp">
145
+ <thead><tr><th scope="col">Tool</th><th scope="col">Price</th><th scope="col">Good to know</th></tr></thead>
146
+ <tbody>
147
+ <tr class="us"><th scope="row">Pactsprig Free</th><td>$0</td><td>Mutual NDA, 3 PDFs a month, unlimited printing, no account, works offline, nothing uploaded</td></tr>
148
+ <tr class="us"><th scope="row">Pactsprig Pro</th><td><b>$29 once</b></td><td>Mutual NDA, Professional Services and Design Partner agreements, Word (DOCX), unlimited downloads, saved companies and presets</td></tr>
149
+ <tr><th scope="row"><a href="https://www.thesmbguide.com/lawdepot-reviews" target="_blank" rel="noopener nofollow">LawDepot</a></th><td>$7.99/month billed yearly, or $33/month</td><td>Large library of legal document types, by subscription</td></tr>
150
+ <tr><th scope="row"><a href="https://checkthat.ai/brands/rocket-lawyer/pricing" target="_blank" rel="noopener nofollow">Rocket Lawyer</a></th><td>$39.99/month</td><td>Many document types, e-signature and access to attorney help</td></tr>
151
+ <tr><th scope="row"><a href="https://taskip.net/bonsai-pricing/" target="_blank" rel="noopener nofollow">Bonsai</a></th><td>Contracts in Essentials, $25/user/month</td><td>Freelancer suite with contracts, e-signature, proposals and invoicing</td></tr>
152
+ </tbody>
153
+ </table>
154
+ </div>
155
+ <p class="hint">Rival prices checked 2 Oct 2026 from search summaries of the linked pages; prices can change, so check their sites. They offer things Pactsprig does not, such as e-signature, attorney Q&amp;A and many more document types. Pactsprig fills in recognised open standard agreements, privately, and you pay once.</p>
156
+ </section>
157
+
158
+ <section class="about-std card" id="standards">
159
+ <h2>About the agreements</h2>
160
+ <p>Pactsprig uses <a href="https://commonpaper.com/standards/" target="_blank" rel="noopener">Common Paper's standard agreements</a>, written by a committee of attorneys and published free to use under <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="noopener">CC BY 4.0</a>. Each one has a Cover Page for your deal details and Standard Terms that stay the same for everyone. Pactsprig copies the Standard Terms word for word, names the version and keeps Common Paper's attribution on every document. Changes you agree on go on the Cover Page, which is how the standard is designed to be used.</p>
161
+ <ul class="std-list" id="std-list">
162
+ <li><a href="https://commonpaper.com/standards/mutual-nda/1.0" target="_blank" rel="noopener">Mutual Non-Disclosure Agreement, Version 1.0</a> · free</li>
163
+ <li><a href="https://commonpaper.com/standards/professional-services-agreement/1.1" target="_blank" rel="noopener">Professional Services Agreement, Version 1.1</a> · Pro</li>
164
+ <li><a href="https://commonpaper.com/standards/design-partner-agreement/1.3" target="_blank" rel="noopener">Design Partner Agreement, Version 1.3</a> · Pro</li>
165
+ </ul>
166
+ <p class="hint"><b>Pactsprig is not affiliated with or endorsed by Common Paper.</b> Agreement text © Common Paper, Inc., licensed under CC BY 4.0; texts fetched and checked 2 Oct 2026.</p>
167
+ </section>
168
+
169
+ <section class="faq" id="faq">
170
+ <h2>Questions</h2>
171
+ <details><summary>Is the NDA template really free?</summary><p>Yes. The Mutual NDA is free: fill in the Cover Page, preview it and download up to 3 PDFs a month, or print as often as you like, with no account. Free PDFs and prints carry a small “Prepared with Pactsprig by CyberMax” line in the footer. The Common Paper attribution stays on every document, free or Pro.</p></details>
172
+ <details><summary>Why not LawDepot or Rocket Lawyer?</summary><p>They are big legal-document services with many document types, e-signature and, at Rocket Lawyer, access to attorney help, sold by subscription: LawDepot from $7.99 a month billed yearly or $33 a month, Rocket Lawyer $39.99 a month (search summaries, checked 2 Oct 2026). If you need those extras, they are good choices. Pactsprig does one thing: fills in recognised open standard agreements, privately in your browser, for $29 once.</p></details>
173
+ <details><summary>Why not Bonsai?</summary><p>Bonsai is a freelancer suite with contracts, e-signature, proposals and invoicing; contracts come in its Essentials plan at $25 per user per month (search summary, checked 2 Oct 2026). If you only need a solid NDA or services agreement, Pactsprig is free for the NDA and $29 once for the rest.</p></details>
174
+ <details><summary>Where does the contract wording come from?</summary><p>From Common Paper's standard agreements, written by a committee of attorneys and published free to use under CC BY 4.0. Pactsprig includes the Standard Terms word for word, with the version number and the required attribution and links. Pactsprig is not affiliated with or endorsed by Common Paper.</p></details>
175
+ <details><summary>Is it a mutual or a one-way NDA?</summary><p>Mutual: both sides protect what the other shares. That is the usual choice between two businesses, for example before a sale, a partnership or a supplier review.</p></details>
176
+ <details><summary>Can I change the Standard Terms?</summary><p>Not directly, and that is the point of a standard: both sides know the wording has not been touched. If you agree a change, type it in “Changes to Standard Terms” on the Cover Page; the Cover Page wins over the Standard Terms.</p></details>
177
+ <details><summary>How do we sign it?</summary><p>Each document has signature blocks with name, title and date lines. Print and sign, or upload the PDF to the e-signature tool you already use. Pactsprig does not collect signatures.</p></details>
178
+ <details><summary>Is my data private?</summary><p>Yes. Pactsprig runs entirely in your browser. Party names, deal terms and saved companies stay on this device and the PDF is made on your device. Nothing is uploaded.</p></details>
179
+ <details><summary>What does Pro add?</summary><p>Every agreement (the Professional Services Agreement with Key Terms and a Statement of Work, and the Design Partner Agreement, as well as the Mutual NDA), Word (DOCX) export, unlimited downloads, no Pactsprig footer line, saved companies and Cover Page presets, and a JSON backup.</p></details>
180
+ <details><summary>Can I cancel?</summary><p>There is nothing to cancel: Pro is a single $29 payment that you keep. Your unlock code works on your other devices too.</p></details>
181
+ <details><summary>Is this legal advice?</summary><p>No. Pactsprig fills in published standard agreements; it is not a law firm and does not give legal advice. Have a lawyer review important contracts. Pactsprig never claims a document is right for your situation.</p></details>
182
+ </section>
183
+
184
+ <p class="disclaimer">Pactsprig fills in published standard agreements; it is not a law firm and does not give legal advice. Have a lawyer review important contracts.</p>
185
+ </div>
186
+ </main>
187
+
188
+ <div class="wrap">
189
+ <footer class="more">
190
+ <div class="more-title">More free tools for business from CyberMax</div>
191
+ <div class="more-links">
192
+ <a href="https://cybermax-tools-cybermax.static.hf.space/pitchsprig/index.html" target="_blank" rel="noopener">Pitchsprig · send the proposal, then the agreement</a>
193
+ <a href="https://cybermax-tools-cybermax.static.hf.space/billsprig/index.html" target="_blank" rel="noopener">Billsprig · invoices &amp; receipts</a>
194
+ <a href="https://cybermax-tools-cybermax.static.hf.space/sigsprig/index.html" target="_blank" rel="noopener">Sigsprig · email signatures</a>
195
+ <a href="https://noticewright.cybermax-tools.workers.dev/" target="_blank" rel="noopener">Noticewright · privacy policy generator</a>
196
+ <a href="https://cybermax.cybermax-tools.workers.dev/store/?utm_source=pactsprig&amp;utm_medium=more-from" target="_blank" rel="noopener">CyberMax Store</a>
197
+ </div>
198
+ <p class="foot-legal">Pactsprig fills in published standard agreements; it is not a law firm and does not give legal advice. Have a lawyer review important contracts. Agreement text: Common Paper standard agreements, free to use under <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="noopener">CC BY 4.0</a>. Pactsprig is not affiliated with Common Paper.</p>
199
+ <div class="copy">© 2026 CyberMax. All rights reserved. · Support: <a href="mailto:cybermax.tools@gmail.com">cybermax.tools@gmail.com</a></div>
200
+ </footer>
201
+ </div>
202
+
203
+ <div class="mbar" id="mbar"><a class="btn ghost" href="#preview" id="m-preview">See contract</a><button type="button" class="btn" id="m-pdf">Download PDF</button></div>
204
+ <div class="toast" id="toast" role="status" aria-live="polite" hidden></div>
205
+ <script>window.CMX_PRO={"id":"pactsprig","name":"Pactsprig","free":"the Mutual NDA, 3 PDF downloads a month with a small footer line, unlimited printing.","perks":["Every agreement: Mutual NDA, Professional Services (Key Terms + SOW) and Design Partner","Word (DOCX) export","Unlimited downloads","No Pactsprig footer line","Saved companies and Cover Page presets","JSON backup"],"plans":[{"offer":"st-pactsprig-pro-lifetime","label":"Lifetime","price":"$29","per":" once","note":"Pay once, keep forever"}]};</script>
206
+ <script src="pro.js"></script>
207
+ <script src="lib/core.js"></script>
208
+ <script src="lib/pdf.js"></script>
209
+ <script src="lib/docx.js"></script>
210
+ <script src="app.js"></script>
211
+ </body>
212
+ </html>
pactsprig/lib/core.js ADDED
@@ -0,0 +1,276 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Pactsprig core: turns a Common Paper agreement template (templates/<id>.json) plus the user's Cover Page answers
2
+ * into a document model used by the preview, the PDF writer and the DOCX writer. Pure functions, no DOM.
3
+ * The Standard Terms are never altered: they are passed through exactly as stored in the template.
4
+ * © 2026 CyberMax. All rights reserved. Agreement text: Common Paper, CC BY 4.0 (see LICENSES.md). */
5
+ (function (root) {
6
+ "use strict";
7
+
8
+ var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
9
+ var BLANK = "__________";
10
+ var DISCLAIMER = "Pactsprig fills in published standard agreements; it is not a law firm and does not give legal advice. Have a lawyer review important contracts.";
11
+ var CREDIT = "Prepared with Pactsprig by CyberMax";
12
+ var LICENCE_URL = "https://creativecommons.org/licenses/by/4.0/";
13
+
14
+ function isoToday(d) {
15
+ d = d || new Date();
16
+ return d.getFullYear() + "-" + ("0" + (d.getMonth() + 1)).slice(-2) + "-" + ("0" + d.getDate()).slice(-2);
17
+ }
18
+ /** "2026-10-02" -> "October 2, 2026" (US style, as the standards are US agreements). */
19
+ function fmtDate(iso) {
20
+ var m = /^(\d{4})-(\d\d)-(\d\d)$/.exec(iso || "");
21
+ if (!m) return "";
22
+ return MONTHS[+m[2] - 1] + " " + (+m[3]) + ", " + m[1];
23
+ }
24
+ function clean(s) { return String(s == null ? "" : s).replace(/\r\n?/g, "\n").trim(); }
25
+
26
+ /* ---------- default answers ---------- */
27
+ function varDefault(spec, today) {
28
+ if (!spec) return "";
29
+ if (spec.d === "@today") return today;
30
+ return spec.d == null ? "" : String(spec.d);
31
+ }
32
+ function eachVar(o, key, fn) { Object.keys((o && o.in) || {}).forEach(function (v) { fn(key + "." + v, o.in[v], v); }); }
33
+
34
+ /** Default Cover Page answers for a template: a flat map of keys -> string/boolean. */
35
+ function defaults(tpl, today) {
36
+ today = today || isoToday();
37
+ var v = {};
38
+ (tpl.cover || []).forEach(function (pg) {
39
+ (pg.rows || []).forEach(function (row) {
40
+ if (!row.id) return;
41
+ var k = pg.id + ":" + row.id;
42
+ if (row.type === "text" || row.type === "textarea") v[k] = row.d || "";
43
+ else if (row.type === "line") eachVar(row, k, function (key, spec) { v[key] = varDefault(spec, today); });
44
+ else if (row.type === "choice" || row.type === "checks") {
45
+ if (row.type === "choice") v[k] = row.d || "";
46
+ (row.options || []).forEach(function (o) {
47
+ var ok = k + "." + o.id;
48
+ if (row.type === "checks") v[ok] = !!(row.d && row.d[o.id]);
49
+ eachVar(o, ok, function (key, spec) { v[key] = varDefault(spec, today); });
50
+ (o.sub || []).forEach(function (s) {
51
+ var sk = ok + "." + s.id;
52
+ v[sk] = false;
53
+ eachVar(s, sk, function (key, spec) { v[key] = varDefault(spec, today); });
54
+ });
55
+ });
56
+ }
57
+ });
58
+ });
59
+ return v;
60
+ }
61
+
62
+ function emptyParty() { return { company: "", name: "", title: "", address: "" }; }
63
+
64
+ /* ---------- filling templates ---------- */
65
+ /** Fill "{var}" placeholders. Returns {t, missing}. Globals: {@p1} {@p2} {@eff}. */
66
+ function fill(t, key, spec, vals, ctx) {
67
+ var missing = false;
68
+ var out = String(t).replace(/\{(@?\w+)\}/g, function (m0, name, off, str) {
69
+ var val;
70
+ if (name.charAt(0) === "@") val = ctx.globals[name.slice(1)];
71
+ else {
72
+ val = vals[key + "." + name];
73
+ var s = spec && spec[name];
74
+ if (s && s.k === "date") val = fmtDate(val);
75
+ }
76
+ val = clean(val);
77
+ if (!val) { missing = true; return BLANK; }
78
+ // "Example, Inc." followed by "." in the template: avoid a double full stop
79
+ if (/\.$/.test(val) && str.charAt(off + m0.length) === ".") val = val.slice(0, -1);
80
+ return val;
81
+ });
82
+ return { t: out, missing: missing };
83
+ }
84
+
85
+ function rowItems(pg, row, vals, ctx) {
86
+ var k = pg.id + ":" + row.id, items = [];
87
+ var lead = row.lead ? [{ t: row.lead, lvl: 0, lead: true }] : [];
88
+ var base = row.lead ? 1 : 0;
89
+ function push(f, lvl, bullet) { items.push({ t: f.t, lvl: lvl, bullet: !!bullet, missing: f.missing }); }
90
+ if (row.type === "fixed") return { items: [{ t: row.t, lvl: 0 }] };
91
+ if (row.type === "text" || row.type === "textarea") {
92
+ var val = clean(vals[k]);
93
+ if (!val) {
94
+ if (row.empty) return { items: [{ t: row.empty, lvl: 0 }] };
95
+ if (row.optional) return null;
96
+ return { items: [{ t: BLANK, lvl: 0, missing: true }], missing: true };
97
+ }
98
+ val.split(/\n+/).forEach(function (line, i) { items.push({ t: (i === 0 && row.prefix ? row.prefix : "") + line, lvl: 0 }); });
99
+ return { items: items };
100
+ }
101
+ if (row.type === "line") {
102
+ var f = fill(row.t, k, row.in, vals, ctx);
103
+ push(f, 0);
104
+ return { items: items, missing: f.missing };
105
+ }
106
+ var anyMissing = false;
107
+ function subs(o, ok, lvl) {
108
+ (o.sub || []).forEach(function (s) {
109
+ if (!vals[ok + "." + s.id]) return;
110
+ var fs = fill(s.t, ok + "." + s.id, s.in, vals, ctx);
111
+ anyMissing = anyMissing || fs.missing;
112
+ push(fs, lvl, true);
113
+ });
114
+ }
115
+ if (row.type === "choice") {
116
+ var sel = (row.options || []).filter(function (o) { return o.id === vals[k]; })[0];
117
+ if (!sel) {
118
+ if (row.optional) return null;
119
+ return { items: [{ t: BLANK, lvl: 0, missing: true }], missing: true };
120
+ }
121
+ var fc = fill(sel.t, k + "." + sel.id, sel.in, vals, ctx);
122
+ items = lead.slice();
123
+ push(fc, base);
124
+ anyMissing = fc.missing;
125
+ subs(sel, k + "." + sel.id, base + 1);
126
+ return { items: items, missing: anyMissing };
127
+ }
128
+ if (row.type === "checks") {
129
+ items = lead.slice();
130
+ (row.options || []).forEach(function (o) {
131
+ var ok = k + "." + o.id;
132
+ if (!vals[ok]) return;
133
+ var fo = fill(o.t, ok, o.in, vals, ctx);
134
+ anyMissing = anyMissing || fo.missing;
135
+ push(fo, base, true);
136
+ subs(o, ok, base + 1);
137
+ });
138
+ if (items.length === lead.length) return row.optional ? null : { items: lead.concat([{ t: "None.", lvl: base }]) };
139
+ return { items: items, missing: anyMissing };
140
+ }
141
+ return null;
142
+ }
143
+
144
+ function partyLabel(tpl, i, p) {
145
+ var role = (tpl.partyRoles || tpl.parties || ["Party 1", "Party 2"])[i];
146
+ return { role: role, company: clean(p && p.company) };
147
+ }
148
+
149
+ /**
150
+ * Build the document model.
151
+ * state: { values, parties: [p1, p2], today }
152
+ * Returns { title, pages: [{title, kicker, intro, lead, rows, closing, sign}], terms, attribution, termsUrl, licenceUrl, missing: [...] }
153
+ */
154
+ function build(tpl, state) {
155
+ state = state || {};
156
+ var vals = state.values || defaults(tpl, state.today);
157
+ var parties = state.parties || [emptyParty(), emptyParty()];
158
+ var missing = [];
159
+ var eff = vals["keyterms:effective"] === "date" ? fmtDate(vals["keyterms:effective.date.date"]) : (vals["keyterms:effective"] === "sig" ? "the date of last signature on the Key Terms Cover Page" : "");
160
+ var ctx = { globals: { p1: clean(parties[0] && parties[0].company), p2: clean(parties[1] && parties[1].company), eff: eff } };
161
+ [0, 1].forEach(function (i) {
162
+ var p = parties[i] || {}, role = partyLabel(tpl, i, p).role;
163
+ if (!clean(p.company)) missing.push(role + " company name");
164
+ if (!clean(p.name)) missing.push(role + " signer name");
165
+ });
166
+ var pages = (tpl.cover || []).map(function (pg) {
167
+ var rows = [], byId = {};
168
+ (pg.rows || []).forEach(function (row) {
169
+ if (row.type === "heading") { rows.push({ heading: row.label }); return; }
170
+ var r = rowItems(pg, row, vals, ctx);
171
+ if (!r) return;
172
+ if (r.missing) missing.push(row.label || (byId[row.after] && byId[row.after].label) || row.id);
173
+ if (row.after && byId[row.after]) { byId[row.after].items = byId[row.after].items.concat(r.items); return; }
174
+ var label = row.omitLabel && row.after ? ((pg.rows.filter(function (x) { return x.id === row.after; })[0] || {}).label || row.label) : row.label;
175
+ var out = { id: row.id, label: label, sub: row.sub || "", items: r.items };
176
+ byId[row.id] = out;
177
+ rows.push(out);
178
+ });
179
+ // drop headings with no rows under them
180
+ rows = rows.filter(function (r, i) { return !r.heading || (rows[i + 1] && !rows[i + 1].heading); });
181
+ var cols = [0, 1].map(function (i) {
182
+ var p = parties[i] || {}, pl = partyLabel(tpl, i, p);
183
+ return { head: tpl.id === "mnda" ? pl.role.toUpperCase() : pl.role.toUpperCase() + ": " + (pl.company || "[official company name]"), party: p };
184
+ });
185
+ var sign = (pg.sign || []).map(function (label) {
186
+ var key = { "Print Name": "name", "Title": "title", "Company": "company", "Notice Address": "address" }[label];
187
+ return { label: label, note: label === "Notice Address" ? "Use email or postal address" : "", line: !key, values: cols.map(function (c) { return key ? clean(c.party[key]) : ""; }) };
188
+ });
189
+ return { id: pg.id, title: pg.title, kicker: pg.kicker || "", intro: pg.intro || "", lead: pg.lead || "", rows: rows, closing: pg.closing || "", sign: { heads: cols.map(function (c) { return c.head; }), rows: sign } };
190
+ });
191
+ return {
192
+ id: tpl.id, title: tpl.name, version: tpl.version, pages: pages, terms: tpl.terms || [],
193
+ attribution: tpl.attribution, termsUrl: tpl.termsUrl, licenceUrl: tpl.licenceUrl || LICENCE_URL,
194
+ termsTitle: "Standard Terms",
195
+ termsNote: "Common Paper " + tpl.name + " Standard Terms Version " + tpl.version + ", posted at " + tpl.termsUrl.replace(/^https:\/\//, "") + ". Copy attached for convenience only.",
196
+ missing: missing.filter(function (m, i, a) { return a.indexOf(m) === i; }),
197
+ };
198
+ }
199
+
200
+ /** Plain text of the Standard Terms in a template (for tests and checks). */
201
+ function termsText(tpl) {
202
+ return (tpl.terms || []).map(function (b) {
203
+ return [b.n, b.h, b.h3].filter(Boolean).join(" ") + "\n" + (b.r || []).map(function (x) { return typeof x === "string" ? x : x[1]; }).join("");
204
+ }).join("\n");
205
+ }
206
+
207
+ /** File name such as "Mutual-NDA-Northwind-Analytics-Harbor-Pine-Robotics.pdf". */
208
+ function fileName(tpl, parties, ext) {
209
+ var parts = [tpl.short || tpl.name].concat((parties || []).map(function (p) { return p && p.company; })).filter(Boolean).join("-");
210
+ return parts.normalize("NFD").replace(/[̀-ͯ]/g, "").replace(/\b(Inc|LLC|Ltd|Corp|GmbH)\b\.?/gi, "").replace(/[^A-Za-z0-9._-]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 90) + "." + (ext || "pdf");
211
+ }
212
+
213
+ /** Example data used by "Load example" and the first screen. */
214
+ var EXAMPLES = {
215
+ mnda: {
216
+ parties: [
217
+ { company: "Northwind Analytics, Inc.", name: "Dana Reyes", title: "Chief Executive Officer", address: "legal@northwind-analytics.example" },
218
+ { company: "Harbor & Pine Robotics LLC", name: "Sam Okafor", title: "Chief Operating Officer", address: "200 Wharf Road, Wilmington, DE 19801" },
219
+ ],
220
+ values: {
221
+ "mnda:purpose": "Evaluating a possible data analytics partnership, including sharing product roadmaps, pricing and sample warehouse data.",
222
+ "mnda:term.fixed.years": "1",
223
+ "mnda:conf.fixed.years": "2",
224
+ "mnda:law.state": "Delaware",
225
+ "mnda:court.place": "New Castle County, Delaware",
226
+ },
227
+ },
228
+ psa: {
229
+ parties: [
230
+ { company: "Brightline Studio LLC", name: "Maya Chen", title: "Managing Partner", address: "hello@brightline.example" },
231
+ { company: "Cedar & Co. Dental Group, Inc.", name: "Luis Moreno", title: "Operations Director", address: "88 Elm Street, Austin, TX 78701" },
232
+ ],
233
+ values: {
234
+ "keyterms:law.state": "the State of Texas",
235
+ "keyterms:court.place": "Travis County, Texas",
236
+ "keyterms:cap.mult.x": "1",
237
+ "keyterms:publicity": "private",
238
+ "sow:sowref.num": "1",
239
+ "sow:services": "Redesign and rebuild the Cedar & Co. website (12 pages) with online booking. Lead designer: Maya Chen. Timeline: discovery in week 1, designs by week 4, launch by week 10.",
240
+ "sow:deliverables": "Website design files, the finished website code and content, and a 1-hour training session recording.",
241
+ "sow:delivOpts.accept": true,
242
+ "sow:delivOpts.accept.rej": true,
243
+ "sow:delivOpts.accept.resub": true,
244
+ "sow:fees": "Fixed fee of $18,000: 30% on signing, 40% on design approval, 30% on launch.",
245
+ "sow:invoice.text": "At each milestone",
246
+ "sow:obligations": "Name one point of contact, provide content and photos by week 3, and give feedback within 5 business days.",
247
+ },
248
+ },
249
+ "design-partner": {
250
+ parties: [
251
+ { company: "Lumen Ledger, Inc.", name: "Priya Shah", title: "Co-founder and CEO", address: "priya@lumenledger.example" },
252
+ { company: "Fieldstone Bakery Group LLC", name: "Tom Becker", title: "Finance Director", address: "tom@fieldstone.example" },
253
+ ],
254
+ values: {
255
+ "keyterms:product.text": "Lumen Ledger, a bookkeeping app that matches bank transactions to receipts automatically",
256
+ "keyterms:partnerDoes.sessions.n": "2",
257
+ "keyterms:partnerDoes.case": true,
258
+ "keyterms:providerDoes.discount": true,
259
+ "keyterms:providerDoes.discount.disc": "30%",
260
+ "keyterms:law.state": "California",
261
+ "keyterms:court.place": "San Francisco County, California",
262
+ },
263
+ },
264
+ };
265
+
266
+ function example(tpl, today) {
267
+ var e = EXAMPLES[tpl.id] || { parties: [emptyParty(), emptyParty()], values: {} };
268
+ var v = defaults(tpl, today);
269
+ Object.keys(e.values).forEach(function (k) { v[k] = e.values[k]; });
270
+ return { values: v, parties: e.parties.map(function (p) { return Object.assign(emptyParty(), p); }) };
271
+ }
272
+
273
+ var api = { build: build, defaults: defaults, example: example, fmtDate: fmtDate, isoToday: isoToday, termsText: termsText, fileName: fileName, emptyParty: emptyParty,
274
+ BLANK: BLANK, DISCLAIMER: DISCLAIMER, CREDIT: CREDIT, LICENCE_URL: LICENCE_URL, EXAMPLES: EXAMPLES };
275
+ if (typeof module === "object" && module.exports) module.exports = api; else root.PactCore = api;
276
+ })(typeof self !== "undefined" ? self : this);
pactsprig/lib/docx.js ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Pactsprig DOCX writer: builds a minimal, valid Word (.docx) file from a PactCore.build() model with a tiny
2
+ * dependency-free ZIP writer (stored entries + CRC-32). Cover Page as tables, signature table, Standard Terms,
3
+ * and the Common Paper CC BY 4.0 attribution in the footer of every page.
4
+ * © 2026 CyberMax. All rights reserved. Agreement text: Common Paper, CC BY 4.0. */
5
+ (function (root) {
6
+ "use strict";
7
+
8
+ /* ---------- ZIP (store only) ---------- */
9
+ var CRC = (function () {
10
+ var t = new Uint32Array(256);
11
+ for (var n = 0; n < 256; n++) { var c = n; for (var k = 0; k < 8; k++) c = c & 1 ? 0xEDB88320 ^ (c >>> 1) : c >>> 1; t[n] = c >>> 0; }
12
+ return t;
13
+ })();
14
+ function crc32(b) { var c = 0xFFFFFFFF; for (var i = 0; i < b.length; i++) c = CRC[(c ^ b[i]) & 255] ^ (c >>> 8); return (c ^ 0xFFFFFFFF) >>> 0; }
15
+ function utf8(s) {
16
+ if (typeof TextEncoder !== "undefined") return new TextEncoder().encode(s);
17
+ return Uint8Array.from(Buffer.from(s, "utf8"));
18
+ }
19
+ /** files: [{name, data: string|Uint8Array}] -> Uint8Array zip */
20
+ function zip(files, date) {
21
+ date = date || new Date();
22
+ var dosTime = (date.getHours() << 11) | (date.getMinutes() << 5) | (Math.floor(date.getSeconds() / 2));
23
+ var dosDate = ((date.getFullYear() - 1980) << 9) | ((date.getMonth() + 1) << 5) | date.getDate();
24
+ var parts = [], central = [], off = 0;
25
+ function u16(v) { return [v & 255, (v >>> 8) & 255]; }
26
+ function u32(v) { return [v & 255, (v >>> 8) & 255, (v >>> 16) & 255, (v >>> 24) & 255]; }
27
+ files.forEach(function (f) {
28
+ var name = utf8(f.name), data = typeof f.data === "string" ? utf8(f.data) : f.data, crc = crc32(data);
29
+ var head = [].concat([0x50, 0x4B, 3, 4], u16(20), u16(0x0800), u16(0), u16(dosTime), u16(dosDate), u32(crc), u32(data.length), u32(data.length), u16(name.length), u16(0));
30
+ parts.push(Uint8Array.from(head), name, data);
31
+ central.push(Uint8Array.from([].concat([0x50, 0x4B, 1, 2], u16(20), u16(20), u16(0x0800), u16(0), u16(dosTime), u16(dosDate), u32(crc), u32(data.length), u32(data.length), u16(name.length), u16(0), u16(0), u16(0), u16(0), u32(0), u32(off))), name);
32
+ off += head.length + name.length + data.length;
33
+ });
34
+ var cdSize = central.reduce(function (s, p) { return s + p.length; }, 0);
35
+ var end = Uint8Array.from([].concat([0x50, 0x4B, 5, 6], u16(0), u16(0), u16(files.length), u16(files.length), u32(cdSize), u32(off), u16(0)));
36
+ var all = parts.concat(central, [end]), len = all.reduce(function (s, p) { return s + p.length; }, 0), out = new Uint8Array(len), o = 0;
37
+ all.forEach(function (p) { out.set(p, o); o += p.length; });
38
+ return out;
39
+ }
40
+
41
+ /* ---------- WordprocessingML helpers ---------- */
42
+ function x(s) { return String(s == null ? "" : s).replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F]/g, "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;"); }
43
+ function run(t, o) {
44
+ o = o || {};
45
+ var pr = (o.b ? "<w:b/>" : "") + (o.i ? "<w:i/>" : "") + (o.caps ? "<w:caps/>" : "") + (o.color ? '<w:color w:val="' + o.color + '"/>' : "") + (o.sz ? '<w:sz w:val="' + o.sz + '"/><w:szCs w:val="' + o.sz + '"/>' : "") + (o.u ? '<w:u w:val="single"/>' : "");
46
+ return "<w:r>" + (pr ? "<w:rPr>" + pr + "</w:rPr>" : "") + '<w:t xml:space="preserve">' + x(t) + "</w:t></w:r>";
47
+ }
48
+ function p(runs, o) {
49
+ o = o || {};
50
+ var pr = (o.style ? '<w:pStyle w:val="' + o.style + '"/>' : "") + (o.keep ? "<w:keepNext/>" : "") + (o.pageBreak ? "<w:pageBreakBefore/>" : "") +
51
+ (o.border ? '<w:pBdr><w:bottom w:val="single" w:sz="8" w:space="4" w:color="15181F"/></w:pBdr>' : "") +
52
+ '<w:spacing w:before="' + (o.before || 0) + '" w:after="' + (o.after == null ? 120 : o.after) + '"/>' +
53
+ (o.ind || o.hang ? '<w:ind w:left="' + (o.ind || 0) + '"' + (o.hang ? ' w:hanging="' + o.hang + '"' : "") + "/>" : "") + (o.jc ? '<w:jc w:val="' + o.jc + '"/>' : "");
54
+ return "<w:p><w:pPr>" + pr + "</w:pPr>" + (Array.isArray(runs) ? runs.join("") : runs) + "</w:p>";
55
+ }
56
+ function link(rid, t, o) { return '<w:hyperlink r:id="' + rid + '" w:history="1">' + run(t, Object.assign({ color: "2A4D7A", u: true }, o || {})) + "</w:hyperlink>"; }
57
+ function cell(w, content, o) {
58
+ o = o || {};
59
+ return "<w:tc><w:tcPr><w:tcW w:w=\"" + w + "\" w:type=\"dxa\"/>" + (o.span ? '<w:gridSpan w:val="' + o.span + '"/>' : "") +
60
+ (o.bottomLine ? '<w:tcBorders><w:bottom w:val="single" w:sz="4" w:color="15181F"/></w:tcBorders>' : "") +
61
+ (o.shade ? '<w:shd w:val="clear" w:color="auto" w:fill="' + o.shade + '"/>' : "") + "</w:tcPr>" + (content || p("", { after: 0 })) + "</w:tc>";
62
+ }
63
+ function table(widths, rows) {
64
+ var grid = "<w:tblGrid>" + widths.map(function (w) { return '<w:gridCol w:w="' + w + '"/>'; }).join("") + "</w:tblGrid>";
65
+ var pr = '<w:tblPr><w:tblW w:w="' + widths.reduce(function (a, b) { return a + b; }, 0) + '" w:type="dxa"/><w:tblBorders>' +
66
+ '<w:top w:val="single" w:sz="4" w:color="D5D8DF"/><w:bottom w:val="single" w:sz="4" w:color="D5D8DF"/><w:insideH w:val="single" w:sz="4" w:color="D5D8DF"/>' +
67
+ '</w:tblBorders><w:tblLayout w:type="fixed"/><w:tblCellMar><w:top w:w="80" w:type="dxa"/><w:left w:w="80" w:type="dxa"/><w:bottom w:w="80" w:type="dxa"/><w:right w:w="80" w:type="dxa"/></w:tblCellMar></w:tblPr>';
68
+ return "<w:tbl>" + pr + grid + rows.map(function (r) { return "<w:tr><w:trPr><w:cantSplit/></w:trPr>" + r + "</w:tr>"; }).join("") + "</w:tbl>";
69
+ }
70
+
71
+ function body(model, A4) {
72
+ var out = [], TW = A4 ? 9746 : 10080, LW = 2900, RW = TW - LW;
73
+ model.pages.forEach(function (pg, i) {
74
+ if (pg.kicker) out.push(p(run(pg.kicker, { b: true, color: "2A4D7A", sz: 16, caps: true }), { after: 40, pageBreak: i > 0 }));
75
+ out.push(p(run(pg.title, { b: true, sz: 36 }), { after: 160, border: true, pageBreak: i > 0 && !pg.kicker }));
76
+ if (pg.intro) out.push(p(run(pg.intro, { sz: 17, color: "5B6170" }), { after: 160 }));
77
+ if (pg.lead) out.push(p(run(pg.lead, { b: true, sz: 19 }), { after: 120 }));
78
+ var rows = [];
79
+ pg.rows.forEach(function (r) {
80
+ if (r.heading) {
81
+ rows.push(cell(TW, p(run(r.heading, { b: true, sz: 17, color: "2A4D7A", caps: true }), { before: 120, after: 0 }), { span: 2 }));
82
+ return;
83
+ }
84
+ var left = p(run(r.label, { b: true, sz: 19 }), { after: 20 }) + (r.sub ? p(run(r.sub, { sz: 15, color: "5B6170" }), { after: 0 }) : "");
85
+ var right = r.items.map(function (it) {
86
+ var ind = it.lvl * 360 + (it.bullet ? 280 : 0);
87
+ return p((it.bullet ? run("•\t", { color: "2A4D7A" }) : "") + run(it.t, { sz: 19, color: it.lead ? "5B6170" : null }), { after: 60, ind: ind, hang: it.bullet ? 280 : 0 });
88
+ }).join("");
89
+ rows.push(cell(LW, left) + cell(RW, right));
90
+ });
91
+ out.push(table([LW, RW], rows));
92
+ if (pg.closing) out.push(p(run(pg.closing, { sz: 18 }), { before: 200, after: 200 }));
93
+ var SL = 2200, CW = Math.floor((TW - SL) / 2);
94
+ var srows = [cell(SL, p("", { after: 0 }), { shade: "EEF2F7" }) + pg.sign.heads.map(function (h) { return cell(CW, p(run(h, { b: true, sz: 17 }), { after: 0 }), { shade: "EEF2F7" }); }).join("")];
95
+ pg.sign.rows.forEach(function (r) {
96
+ var lab = p(run(r.label, { b: true, sz: 17 }), { after: 0 }) + (r.note ? p(run(r.note, { sz: 13, color: "5B6170" }), { after: 0 }) : "");
97
+ srows.push(cell(SL, lab) + r.values.map(function (v) {
98
+ return cell(CW, r.line ? p("", { after: 0, before: 360 }) : String(v || "").split(/\n/).map(function (t) { return p(run(t, { sz: 18 }), { after: 0 }); }).join(""), r.line ? { bottomLine: true } : {});
99
+ }).join(""));
100
+ });
101
+ out.push(table([SL, CW, CW], srows));
102
+ });
103
+ // Standard Terms
104
+ out.push(p(run(model.termsTitle, { b: true, sz: 32 }), { pageBreak: true, after: 80 }));
105
+ out.push(p(run(model.termsNote, { sz: 16, color: "5B6170" }), { after: 200, border: true }));
106
+ model.terms.forEach(function (b) {
107
+ if (b.l === 1 && b.h && !b.r) { out.push(p(run(b.n + " " + b.h, { b: true, sz: 22 }), { before: 200, after: 100, keep: true })); return; }
108
+ var rs = [];
109
+ if (b.l === 1 && b.h && b.r) rs.push(run(b.n + " " + b.h + ". ", { b: true, sz: 19 }));
110
+ else if (b.n) rs.push(run(b.n + " ", { b: b.l <= 2, sz: 19 }));
111
+ if (b.h3) rs.push(run(b.h3 + " ", { b: true, sz: 19 }));
112
+ (b.r || []).forEach(function (r) { rs.push(typeof r === "string" ? run(r, { sz: 19 }) : run(r[1], { sz: 19, b: r[0] === "b" })); });
113
+ out.push(p(rs, { after: 100, ind: b.l >= 3 ? 360 * (b.l - 2) : 0, before: b.l === 1 ? 80 : 0 }));
114
+ });
115
+ out.push(p([link("rIdTerms", model.attribution, { b: true, sz: 18 })], { before: 240, after: 60 }));
116
+ out.push(p([run("Standard Terms: ", { sz: 16, color: "5B6170" }), link("rIdTerms", model.termsUrl, { sz: 16 }), run(" Licence: ", { sz: 16, color: "5B6170" }), link("rIdLic", model.licenceUrl, { sz: 16 })], { after: 0 }));
117
+ return out.join("");
118
+ }
119
+
120
+ var NS = 'xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"';
121
+
122
+ /** Build the .docx bytes. opts: { page: "Letter"|"A4", credit: bool } */
123
+ function build(model, opts) {
124
+ opts = opts || {};
125
+ var A4 = opts.page === "A4";
126
+ var pg = A4 ? '<w:pgSz w:w="11906" w:h="16838"/>' : '<w:pgSz w:w="12240" w:h="15840"/>';
127
+ var doc = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<w:document ' + NS + "><w:body>" + body(model, A4) +
128
+ '<w:sectPr><w:footerReference w:type="default" r:id="rIdFooter"/>' + pg + '<w:pgMar w:top="1000" w:right="1080" w:bottom="1100" w:left="1080" w:header="500" w:footer="500" w:gutter="0"/></w:sectPr></w:body></w:document>';
129
+ var att = model.attribution, cut = att.indexOf("CC BY 4.0");
130
+ var attRuns = cut > -1 ? link("rIdTerms", att.slice(0, cut), { sz: 14, color: "8A8F9C", u: false }) + link("rIdLic", "CC BY 4.0", { sz: 14, color: "8A8F9C" }) + run(att.slice(cut + 9), { sz: 14, color: "8A8F9C" }) : link("rIdTerms", att, { sz: 14 });
131
+ var footer = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<w:ftr ' + NS + ">" +
132
+ (opts.credit ? p(run(opts.creditText || "Prepared with Pactsprig by CyberMax", { sz: 14, color: "8A8F9C" }), { after: 0 }) : "") +
133
+ '<w:p><w:pPr><w:tabs><w:tab w:val="right" w:pos="' + (A4 ? 9746 : 10080) + '"/></w:tabs><w:spacing w:after="0"/></w:pPr>' + attRuns + run("\tPage ", { sz: 14, color: "8A8F9C" }) +
134
+ '<w:r><w:rPr><w:color w:val="8A8F9C"/><w:sz w:val="14"/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:rPr><w:color w:val="8A8F9C"/><w:sz w:val="14"/></w:rPr><w:instrText xml:space="preserve"> PAGE </w:instrText></w:r><w:r><w:rPr><w:color w:val="8A8F9C"/><w:sz w:val="14"/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:color w:val="8A8F9C"/><w:sz w:val="14"/></w:rPr><w:t>1</w:t></w:r><w:r><w:rPr><w:color w:val="8A8F9C"/><w:sz w:val="14"/></w:rPr><w:fldChar w:fldCharType="end"/></w:r>' +
135
+ "</w:p></w:ftr>";
136
+ var styles = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">' +
137
+ '<w:docDefaults><w:rPrDefault><w:rPr><w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:eastAsia="Arial" w:cs="Arial"/><w:color w:val="15181F"/><w:sz w:val="19"/><w:szCs w:val="19"/><w:lang w:val="en-US"/></w:rPr></w:rPrDefault>' +
138
+ '<w:pPrDefault><w:pPr><w:spacing w:after="120" w:line="264" w:lineRule="auto"/></w:pPr></w:pPrDefault></w:docDefaults>' +
139
+ '<w:style w:type="paragraph" w:default="1" w:styleId="Normal"><w:name w:val="Normal"/><w:qFormat/></w:style>' +
140
+ '<w:style w:type="table" w:default="1" w:styleId="TableNormal"><w:name w:val="Normal Table"/><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style>' +
141
+ "</w:styles>";
142
+ var rels = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' +
143
+ '<Relationship Id="rIdStyles" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>' +
144
+ '<Relationship Id="rIdFooter" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" Target="footer1.xml"/>' +
145
+ '<Relationship Id="rIdTerms" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="' + x(model.termsUrl) + '" TargetMode="External"/>' +
146
+ '<Relationship Id="rIdLic" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="' + x(model.licenceUrl) + '" TargetMode="External"/>' +
147
+ "</Relationships>";
148
+ var footRels = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' +
149
+ '<Relationship Id="rIdTerms" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="' + x(model.termsUrl) + '" TargetMode="External"/>' +
150
+ '<Relationship Id="rIdLic" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="' + x(model.licenceUrl) + '" TargetMode="External"/>' +
151
+ "</Relationships>";
152
+ var d = opts.date || new Date(), iso = d.toISOString().replace(/\.\d+Z$/, "Z");
153
+ var core = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
154
+ "<dc:title>" + x(model.title) + "</dc:title><dc:creator>Pactsprig</dc:creator><dc:description>" + x(model.attribution) + '</dc:description><dcterms:created xsi:type="dcterms:W3CDTF">' + iso + "</dcterms:created></cp:coreProperties>";
155
+ var types = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">' +
156
+ '<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/>' +
157
+ '<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>' +
158
+ '<Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>' +
159
+ '<Override PartName="/word/footer1.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml"/>' +
160
+ '<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/></Types>';
161
+ var pkg = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' +
162
+ '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>' +
163
+ '<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/></Relationships>';
164
+ return zip([
165
+ { name: "[Content_Types].xml", data: types },
166
+ { name: "_rels/.rels", data: pkg },
167
+ { name: "docProps/core.xml", data: core },
168
+ { name: "word/document.xml", data: doc },
169
+ { name: "word/styles.xml", data: styles },
170
+ { name: "word/footer1.xml", data: footer },
171
+ { name: "word/_rels/document.xml.rels", data: rels },
172
+ { name: "word/_rels/footer1.xml.rels", data: footRels },
173
+ ], d);
174
+ }
175
+
176
+ var api = { build: build, zip: zip, crc32: crc32 };
177
+ if (typeof module === "object" && module.exports) module.exports = api; else root.PactDOCX = api;
178
+ })(typeof self !== "undefined" ? self : this);
pactsprig/lib/pdf.js ADDED
@@ -0,0 +1,324 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Pactsprig PDF writer: a small, dependency-free PDF 1.4 generator for agreements (Cover Page + Standard Terms).
2
+ * Text uses the built-in Helvetica fonts (WinAnsiEncoding), so it is real, selectable, searchable text.
3
+ * Glyph widths below come from Adobe's Core 14 AFM metrics for Helvetica and Helvetica-Bold
4
+ * (Copyright (c) 1985-1997 Adobe Systems Incorporated; metrics files are freely distributable).
5
+ * Everything else © 2026 CyberMax. All rights reserved. Agreement text: Common Paper, CC BY 4.0. */
6
+ (function (root) {
7
+ "use strict";
8
+ // Widths (1/1000 em) for WinAnsi codes 32..255.
9
+ var WR = [278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,350,556,350,222,556,333,1000,556,556,333,1000,667,333,1000,350,611,350,350,222,222,333,333,350,556,1000,333,1000,500,333,944,350,500,667,278,333,556,556,556,556,260,556,333,737,370,556,584,333,737,333,400,584,333,333,333,556,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1000,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,584,611,556,556,556,556,500,556,500];
10
+ var WB = [278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,350,556,350,278,556,500,1000,556,556,333,1000,667,333,1000,350,611,350,350,278,278,500,500,350,556,1000,333,1000,556,333,944,350,500,667,278,333,556,556,556,556,280,556,333,737,370,556,584,333,737,333,400,584,333,333,333,611,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1000,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,584,611,611,611,611,611,556,611,556];
11
+ var CP = { 0x20AC: 128, 0x201A: 130, 0x0192: 131, 0x201E: 132, 0x2026: 133, 0x2020: 134, 0x2021: 135, 0x02C6: 136, 0x2030: 137, 0x0160: 138, 0x2039: 139, 0x0152: 140, 0x017D: 142,
12
+ 0x2018: 145, 0x2019: 146, 0x201C: 147, 0x201D: 148, 0x2022: 149, 0x2013: 150, 0x2014: 151, 0x02DC: 152, 0x2122: 153, 0x0161: 154, 0x203A: 155, 0x0153: 156, 0x017E: 158, 0x0178: 159 };
13
+ var FALLBACK = { "ł": "l", "Ł": "L", "đ": "d", "Đ": "D", "ı": "i", "‐": "-", "‑": "-", "−": "-", " ": " ", " ": " ", " ": " ", "′": "'", "″": '"' };
14
+
15
+ function code(ch) {
16
+ var c = ch.codePointAt(0);
17
+ if (c >= 32 && c < 127) return c;
18
+ if (c >= 160 && c <= 255) return c;
19
+ if (CP[c]) return CP[c];
20
+ return -1;
21
+ }
22
+ /** Can every character be drawn with the built-in fonts? */
23
+ function canEncode(s) { for (var ch of String(s)) if (code(ch) < 0) return false; return true; }
24
+ /** String -> WinAnsi byte codes (accents stripped or "?" for anything the core fonts cannot draw). */
25
+ function encode(s) {
26
+ var out = [];
27
+ for (var ch of String(s == null ? "" : s).replace(/[\t\r\n]/g, " ")) {
28
+ var c = code(ch);
29
+ if (c < 0 && FALLBACK[ch]) c = code(FALLBACK[ch]);
30
+ if (c < 0) { var base = ch.normalize("NFD").charAt(0); c = code(base); }
31
+ out.push(c < 0 ? 63 : c);
32
+ }
33
+ return out;
34
+ }
35
+ function width(s, size, bold) {
36
+ var w = 0, t = bold ? WB : WR;
37
+ encode(s).forEach(function (c) { w += t[c - 32] || 556; });
38
+ return w * size / 1000;
39
+ }
40
+ /** Greedy word wrap to a width in points; long words are broken. */
41
+ function wrap(s, maxW, size, bold) {
42
+ var out = [];
43
+ String(s == null ? "" : s).split(/\r?\n/).forEach(function (para) {
44
+ var words = para.split(/\s+/).filter(Boolean), cur = "";
45
+ if (!words.length) { out.push(""); return; }
46
+ words.forEach(function (wd) {
47
+ while (width(wd, size, bold) > maxW && wd.length > 1) {
48
+ var k = wd.length - 1;
49
+ while (k > 1 && width(wd.slice(0, k), size, bold) > maxW) k--;
50
+ if (cur) { out.push(cur); cur = ""; }
51
+ out.push(wd.slice(0, k)); wd = wd.slice(k);
52
+ }
53
+ var next = cur ? cur + " " + wd : wd;
54
+ if (width(next, size, bold) <= maxW) cur = next; else { out.push(cur); cur = wd; }
55
+ });
56
+ out.push(cur);
57
+ });
58
+ return out;
59
+ }
60
+ function lit(s) {
61
+ return "(" + encode(s).map(function (c) {
62
+ if (c === 40 || c === 41 || c === 92) return "\\" + String.fromCharCode(c);
63
+ if (c >= 32 && c < 127) return String.fromCharCode(c);
64
+ return "\\" + ("00" + c.toString(8)).slice(-3);
65
+ }).join("") + ")";
66
+ }
67
+ function n2(v) { return (Math.round(v * 100) / 100).toString(); }
68
+ function rgb(hex) {
69
+ var m = /^#?([0-9a-f]{6})$/i.exec(hex || "") || [0, "11141b"];
70
+ var v = parseInt(m[1], 16);
71
+ return [(v >> 16 & 255) / 255, (v >> 8 & 255) / 255, (v & 255) / 255].map(function (x) { return Math.round(x * 1000) / 1000; }).join(" ");
72
+ }
73
+
74
+ /* ---------- page writer (top-left coordinates in points) ---------- */
75
+ function Writer(W, H) { this.W = W; this.H = H; this.pages = []; this.add(); }
76
+ Writer.prototype.add = function () { this.p = { ops: [], links: [] }; this.pages.push(this.p); return this.p; };
77
+ Writer.prototype.on = function (i) { this.p = this.pages[i]; };
78
+ Writer.prototype.rect = function (x, y, w, h, fill, stroke, lw) {
79
+ var o = ["q"];
80
+ if (fill) o.push(rgb(fill) + " rg");
81
+ if (stroke) o.push(rgb(stroke) + " RG " + n2(lw || 1) + " w");
82
+ o.push(n2(x) + " " + n2(this.H - y - h) + " " + n2(w) + " " + n2(h) + " re " + (fill && stroke ? "B" : fill ? "f" : "S"), "Q");
83
+ this.p.ops.push(o.join(" "));
84
+ };
85
+ Writer.prototype.line = function (x1, y1, x2, y2, color, lw) {
86
+ this.p.ops.push("q " + rgb(color) + " RG " + n2(lw || 0.5) + " w " + n2(x1) + " " + n2(this.H - y1) + " m " + n2(x2) + " " + n2(this.H - y2) + " l S Q");
87
+ };
88
+ /** Text with its baseline at y. o: size, bold, color, align ('left'|'right'|'center'). Returns the drawn width. */
89
+ Writer.prototype.text = function (x, y, s, o) {
90
+ o = o || {};
91
+ var size = o.size || 10, w = width(s, size, o.bold);
92
+ if (o.align === "right") x -= w; else if (o.align === "center") x -= w / 2;
93
+ this.p.ops.push("BT /" + (o.bold ? "F2" : "F1") + " " + n2(size) + " Tf " + rgb(o.color || "#11141B") + " rg " + n2(x) + " " + n2(this.H - y) + " Td " + lit(s) + " Tj ET");
94
+ return w;
95
+ };
96
+ Writer.prototype.link = function (x, y, w, h, url) { this.p.links.push({ r: [x, this.H - y - h, x + w, this.H - y], url: url }); };
97
+ /* ---------- serialisation ---------- */
98
+ function serialize(wr, info) {
99
+ var chunks = [], len = 0, offsets = [];
100
+ function put(x) {
101
+ if (typeof x === "string") { var b = new Uint8Array(x.length); for (var i = 0; i < x.length; i++) b[i] = x.charCodeAt(i) & 255; x = b; }
102
+ chunks.push(x); len += x.length;
103
+ }
104
+ var next = 6, pageNums = [], plan = [];
105
+ wr.pages.forEach(function (p) {
106
+ var pn = next++, cn = next++, an = p.links.map(function () { return next++; });
107
+ pageNums.push(pn); plan.push({ p: p, pn: pn, cn: cn, an: an });
108
+ });
109
+ function obj(n, body) { offsets[n] = len; put(n + " 0 obj\n"); if (typeof body === "string") put(body); else body(); put("\nendobj\n"); }
110
+ put("%PDF-1.4\n%âãÏÓ\n");
111
+ obj(1, "<< /Type /Catalog /Pages 2 0 R >>");
112
+ obj(2, "<< /Type /Pages /Kids [" + pageNums.map(function (n) { return n + " 0 R"; }).join(" ") + "] /Count " + pageNums.length + " >>");
113
+ obj(3, "<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>");
114
+ obj(4, "<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>");
115
+ obj(5, "<< /Title " + lit(info.title || "Document") + " /Author " + lit(info.author || "") + " /Producer (Pactsprig by CyberMax) /Creator (Pactsprig) /CreationDate (D:" + info.date + ") >>");
116
+ plan.forEach(function (q) {
117
+ var content = q.p.ops.join("\n");
118
+ obj(q.pn, "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 " + n2(wr.W) + " " + n2(wr.H) + "] /Resources << /Font << /F1 3 0 R /F2 4 0 R >> >> /Contents " + q.cn + " 0 R" + (q.an.length ? " /Annots [" + q.an.map(function (n) { return n + " 0 R"; }).join(" ") + "]" : "") + " >>");
119
+ obj(q.cn, "<< /Length " + content.length + " >>\nstream\n" + content + "\nendstream");
120
+ q.p.links.forEach(function (l, i) {
121
+ obj(q.an[i], "<< /Type /Annot /Subtype /Link /Rect [" + l.r.map(n2).join(" ") + "] /Border [0 0 0] /A << /S /URI /URI " + lit(l.url) + " >> >>");
122
+ });
123
+ });
124
+ var xref = len, count = next;
125
+ var x = "xref\n0 " + count + "\n0000000000 65535 f \n";
126
+ for (var i = 1; i < count; i++) x += ("000000000" + (offsets[i] || 0)).slice(-10) + " 00000 n \n";
127
+ put(x + "trailer\n<< /Size " + count + " /Root 1 0 R /Info 5 0 R >>\nstartxref\n" + xref + "\n%%EOF\n");
128
+ var out = new Uint8Array(len), o = 0;
129
+ chunks.forEach(function (c) { out.set(c, o); o += c.length; });
130
+ return out;
131
+ }
132
+
133
+ /* ---------- rich text (bold runs) ---------- */
134
+ /** segs: [{s, b}] -> lines of segments that fit maxW. */
135
+ function richWrap(segs, maxW, size) {
136
+ var words = [];
137
+ segs.forEach(function (sg) {
138
+ String(sg.s).split(/(\s+)/).forEach(function (w) {
139
+ if (w === "") return;
140
+ if (/^\s+$/.test(w)) { words.push({ sp: true }); return; }
141
+ words.push({ s: w, b: !!sg.b });
142
+ });
143
+ });
144
+ var lines = [], cur = [], cw = 0, pendingSpace = false;
145
+ function pushWord(w) {
146
+ var ww = width(w.s, size, w.b), sw = cur.length && pendingSpace ? width(" ", size, false) : 0;
147
+ if (cur.length && cw + sw + ww > maxW) { lines.push(cur); cur = []; cw = 0; sw = 0; }
148
+ if (cur.length && pendingSpace) { cur.push({ s: " ", b: cur[cur.length - 1].b && w.b }); cw += sw; }
149
+ cur.push({ s: w.s, b: w.b }); cw += ww; pendingSpace = false;
150
+ }
151
+ words.forEach(function (w) {
152
+ if (w.sp) { pendingSpace = true; return; }
153
+ while (width(w.s, size, w.b) > maxW && w.s.length > 1) {
154
+ var k = w.s.length - 1;
155
+ while (k > 1 && width(w.s.slice(0, k), size, w.b) > maxW) k--;
156
+ pushWord({ s: w.s.slice(0, k), b: w.b }); w = { s: w.s.slice(k), b: w.b }; pendingSpace = false;
157
+ lines.push(cur); cur = []; cw = 0;
158
+ }
159
+ pushWord(w);
160
+ });
161
+ if (cur.length) lines.push(cur);
162
+ // merge same-style neighbours
163
+ return lines.map(function (l) {
164
+ var o = [];
165
+ l.forEach(function (sg) { if (o.length && o[o.length - 1].b === sg.b) o[o.length - 1].s += sg.s; else o.push({ s: sg.s, b: sg.b }); });
166
+ return o;
167
+ });
168
+ }
169
+ function drawRich(wr, x, y, line, size, color) {
170
+ line.forEach(function (sg) { x += wr.text(x, y, sg.s, { size: size, bold: sg.b, color: color }); });
171
+ }
172
+
173
+ /* ---------- layout ---------- */
174
+ var INK = "#15181F", MUTED = "#5B6170", RULE = "#D5D8DF", FAINT = "#8A8F9C", ACCENT = "#2A4D7A";
175
+ function pageSize(name) { return name === "A4" ? [595.28, 841.89] : [612, 792]; }
176
+
177
+ /** Runs from a Standard Terms block -> segments. */
178
+ function blockSegs(b) {
179
+ var segs = [];
180
+ if (b.l === 1 && b.h && b.r) segs.push({ s: b.n + " " + b.h + ". ", b: true });
181
+ else if (b.n && !(b.l === 1 && b.h)) segs.push({ s: b.n + " ", b: b.l <= 2 });
182
+ if (b.h3) segs.push({ s: b.h3 + " ", b: true });
183
+ (b.r || []).forEach(function (x) {
184
+ if (typeof x === "string") segs.push({ s: x, b: false });
185
+ else segs.push({ s: x[1], b: x[0] === "b" });
186
+ });
187
+ return segs;
188
+ }
189
+
190
+ /**
191
+ * Build the agreement PDF from a PactCore.build() model.
192
+ * opts: { credit: bool, page: "Letter"|"A4", date: Date }
193
+ */
194
+ function build(model, opts) {
195
+ opts = opts || {};
196
+ var sz = pageSize(opts.page), W = sz[0], H = sz[1];
197
+ var wr = new Writer(W, H);
198
+ var M = 54, L = M, R = W - M, CW = R - L, TOP = 50, BOTTOM = H - (opts.credit ? 74 : 62);
199
+ var y = TOP;
200
+ function newPage() { wr.add(); y = TOP; }
201
+ function need(h) { if (y + h > BOTTOM) newPage(); }
202
+ function para(text, size, o) {
203
+ o = o || {};
204
+ var lh = size * 1.38, x = L + (o.indent || 0), lines = wrap(text, CW - (o.indent || 0), size, o.bold);
205
+ lines.forEach(function (t) { need(lh); wr.text(x, y + size, t, { size: size, bold: o.bold, color: o.color || INK }); y += lh; });
206
+ }
207
+
208
+ // ---------- cover pages ----------
209
+ model.pages.forEach(function (pg, pi) {
210
+ if (pi > 0) newPage();
211
+ if (pg.kicker) { wr.text(L, y + 8, pg.kicker.toUpperCase(), { size: 8, bold: true, color: ACCENT }); y += 14; }
212
+ wrap(pg.title, CW, 18, true).forEach(function (t) { wr.text(L, y + 17, t, { size: 18, bold: true }); y += 23; });
213
+ y += 4;
214
+ wr.line(L, y, R, y, INK, 1.2); y += 10;
215
+ if (pg.intro) { para(pg.intro, 8.5, { color: MUTED }); y += 6; }
216
+ if (pg.lead) { para(pg.lead, 9.5, { bold: true }); y += 4; }
217
+ var LW = 150, RX = L + LW + 12, RW = R - RX;
218
+ pg.rows.forEach(function (row) {
219
+ if (row.heading) {
220
+ need(34); y += 10;
221
+ wr.text(L, y + 9, row.heading.toUpperCase(), { size: 8.5, bold: true, color: ACCENT }); y += 16;
222
+ return;
223
+ }
224
+ var left = [];
225
+ wrap(row.label, LW, 9.5, true).forEach(function (t) { left.push({ t: t, size: 9.5, bold: true, color: INK, lh: 12.5 }); });
226
+ if (row.sub) wrap(row.sub, LW, 7.5, false).forEach(function (t) { left.push({ t: t, size: 7.5, color: MUTED, lh: 10 }); });
227
+ var right = [];
228
+ row.items.forEach(function (it) {
229
+ var ind = it.lvl * 14, bx = it.bullet ? 10 : 0;
230
+ wrap(it.t, RW - ind - bx, 9.5, false).forEach(function (t, k) { right.push({ t: t, x: RX + ind + bx, bullet: it.bullet && k === 0 ? RX + ind : null, lh: 12.8, color: it.lead ? MUTED : INK }); });
231
+ right[right.length - 1].gap = 2;
232
+ });
233
+ var lh = left.reduce(function (s, a) { return s + a.lh; }, 0), rh = right.reduce(function (s, a) { return s + a.lh + (a.gap || 0); }, 0);
234
+ need(Math.min(Math.max(lh, rh) + 14, 120));
235
+ wr.line(L, y, R, y, RULE, 0.6); y += 8;
236
+ var ly = y, ry = y;
237
+ left.forEach(function (a) { wr.text(L, ly + a.size, a.t, { size: a.size, bold: a.bold, color: a.color }); ly += a.lh; });
238
+ right.forEach(function (a) {
239
+ if (ry + a.lh > BOTTOM) { newPage(); ry = y; ly = y; wr.line(L, ry - 4, R, ry - 4, RULE, 0.6); }
240
+ if (a.bullet != null) wr.text(a.bullet, ry + 9.5, "•", { size: 9.5, color: ACCENT });
241
+ wr.text(a.x, ry + 9.5, a.t, { size: 9.5, color: a.color }); ry += a.lh + (a.gap || 0);
242
+ });
243
+ y = Math.max(ly, ry) + 6;
244
+ });
245
+ wr.line(L, y, R, y, RULE, 0.6); y += 12;
246
+ if (pg.closing) { para(pg.closing, 9, {}); y += 8; }
247
+
248
+ // signature block
249
+ var s = pg.sign, SL = 112, colW = (CW - SL) / 2;
250
+ var rowsH = s.rows.reduce(function (h, r) { return h + (r.line ? 32 : 26); }, 0) + 26;
251
+ need(Math.min(rowsH, BOTTOM - TOP));
252
+ wr.rect(L, y, CW, 22, "#EEF2F7");
253
+ s.heads.forEach(function (h, i) {
254
+ var t = wrap(h, colW - 12, 8.5, true)[0];
255
+ wr.text(L + SL + i * colW + 6, y + 14.5, t, { size: 8.5, bold: true, color: INK });
256
+ });
257
+ y += 22;
258
+ s.rows.forEach(function (r) {
259
+ var vals = r.values.map(function (v) { return wrap(v, colW - 12, 9, false).slice(0, 3); });
260
+ var h = r.line ? 32 : Math.max(26, 10 + Math.max.apply(null, vals.map(function (v) { return v.length; })) * 11.5 + (r.note ? 4 : 0));
261
+ need(h);
262
+ wr.text(L + 4, y + 13, r.label, { size: 8.5, bold: true });
263
+ if (r.note) wr.text(L + 4, y + 23, r.note, { size: 6.5, color: MUTED });
264
+ for (var i = 0; i < 2; i++) {
265
+ var x = L + SL + i * colW + 6;
266
+ if (r.line) wr.line(x, y + h - 7, x + colW - 14, y + h - 7, INK, 0.6);
267
+ else vals[i].forEach(function (t, k) { wr.text(x, y + 13 + k * 11.5, t, { size: 9 }); });
268
+ }
269
+ y += h;
270
+ wr.line(L, y, R, y, RULE, 0.5);
271
+ });
272
+ y += 10;
273
+ });
274
+
275
+ // ---------- Standard Terms ----------
276
+ newPage();
277
+ wr.text(L, y + 15, model.termsTitle, { size: 16, bold: true }); y += 24;
278
+ wrap(model.termsNote, CW, 8, false).forEach(function (t) { wr.text(L, y + 8, t, { size: 8, color: MUTED }); y += 11; });
279
+ wr.line(L, y + 4, R, y + 4, INK, 1.2); y += 14;
280
+ model.terms.forEach(function (b) {
281
+ if (b.l === 1 && b.h && !b.r) {
282
+ need(34); y += 8;
283
+ wr.text(L, y + 11, b.n + " " + b.h, { size: 11, bold: true }); y += 18;
284
+ return;
285
+ }
286
+ var ind = b.l >= 3 ? 18 * (b.l - 2) : 0, size = 9.5, lh = 13.2;
287
+ var lines = richWrap(blockSegs(b), CW - ind, size);
288
+ if (b.l === 1) y += 4;
289
+ need(Math.min(lines.length, 3) * lh);
290
+ lines.forEach(function (ln) { need(lh); drawRich(wr, L + ind, y + size, ln, size, INK); y += lh; });
291
+ y += 5;
292
+ });
293
+ y += 10;
294
+ need(40);
295
+ wr.line(L, y, R, y, RULE, 0.6); y += 12;
296
+ var attW = wr.text(L, y + 9, model.attribution, { size: 9, bold: true });
297
+ wr.link(L, y, attW, 12, model.termsUrl);
298
+ y += 15;
299
+ var src = "Standard Terms: " + model.termsUrl + " Licence: " + model.licenceUrl;
300
+ wrap(src, CW, 8, false).forEach(function (t) { wr.text(L, y + 8, t, { size: 8, color: MUTED }); y += 11; });
301
+
302
+ // ---------- footer on every page ----------
303
+ var n = wr.pages.length, att = model.attribution;
304
+ for (var i = 0; i < n; i++) {
305
+ wr.on(i);
306
+ var fy = H - 30;
307
+ var aw = wr.text(L, fy, att, { size: 7, color: FAINT });
308
+ var pre = att.indexOf("CC BY 4.0");
309
+ if (pre > -1) {
310
+ var x0 = L + width(att.slice(0, pre), 7, false);
311
+ wr.link(L, fy - 8, x0 - L, 10, model.termsUrl);
312
+ wr.link(x0, fy - 8, width("CC BY 4.0", 7, false), 10, model.licenceUrl);
313
+ } else wr.link(L, fy - 8, aw, 10, model.termsUrl);
314
+ wr.text(R, fy, "Page " + (i + 1) + " of " + n, { size: 7, color: FAINT, align: "right" });
315
+ if (opts.credit) wr.text(L, fy - 12, opts.creditText || "Prepared with Pactsprig by CyberMax", { size: 7, color: FAINT });
316
+ }
317
+ var d = opts.date || new Date();
318
+ var stamp = d.getUTCFullYear() + [d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds()].map(function (v) { return ("0" + v).slice(-2); }).join("") + "Z";
319
+ return serialize(wr, { title: model.title, author: "", date: stamp });
320
+ }
321
+
322
+ var api = { build: build, encode: encode, canEncode: canEncode, width: width, wrap: wrap, richWrap: richWrap, pageSize: pageSize };
323
+ if (typeof module === "object" && module.exports) module.exports = api; else root.PactPDF = api;
324
+ })(typeof self !== "undefined" ? self : this);
pactsprig/manifest.webmanifest ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "Pactsprig: free NDA template and contract generator",
3
+ "short_name": "Pactsprig",
4
+ "description": "Fill in the Cover Page of a published standard agreement (Mutual NDA free) and download the contract as a PDF. No sign-up, nothing uploaded, works offline.",
5
+ "start_url": "./?utm_source=pwa",
6
+ "scope": "./",
7
+ "display": "standalone",
8
+ "background_color": "#F6F3EC",
9
+ "theme_color": "#2A4D7A",
10
+ "categories": ["business", "productivity"],
11
+ "icons": [
12
+ {"src": "icon.svg", "sizes": "any", "type": "image/svg+xml"},
13
+ {"src": "icon-192.png", "sizes": "192x192", "type": "image/png"},
14
+ {"src": "icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any"},
15
+ {"src": "icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable"}
16
+ ]
17
+ }
pactsprig/og.png ADDED

Git LFS Details

  • SHA256: c5a1d663309e9e4cb5567023c2328724be0eb5b7ebe821000b335917b6233b14
  • Pointer size: 131 Bytes
  • Size of remote file: 157 kB
pactsprig/pro.js ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* CyberMax Pro unlock with plans, for static web apps (copied into each product's web/ folder; each product stays
2
+ * self-contained). Extends pro.js with several plans (monthly, yearly, one-time) and a re-check for subscriptions.
3
+ * Config before this script:
4
+ * window.CMX_PRO = { id, name, perks: [..], plans: [{ offer, label, price, per, note, best }], free: "one line" }
5
+ * Buy: counted link https://data.cybermax-tools.workers.dev/buy/<offer>?s=app-<id> -> Stripe Payment Link.
6
+ * After checkout Stripe sends the buyer to data.cybermax-tools.workers.dev/unlock/<id>?session_id=..., which checks the
7
+ * Checkout Session (and, for a subscription, that it is still active) and returns here with #cmx-pro=<session id>.
8
+ * The app checks that code once (/unlock/<id>?json=1&session_id=..) and remembers Pro in this browser; it re-checks every
9
+ * 3 days, so a cancelled subscription turns off by itself (one tiny request per buyer every 3 days, none for free users).
10
+ * The same code (shown on the receipt page and in the Pro box) unlocks Pro on another device. No account, no tracking.
11
+ * (c) 2026 CyberMax. All rights reserved. */
12
+ (function () {
13
+ "use strict";
14
+ var C = window.CMX_PRO || {};
15
+ if (!C.id) return;
16
+ var DATA = "https://data.cybermax-tools.workers.dev";
17
+ var KEY = "cmx-pro:" + C.id;
18
+ var SID = /^cs_(live|test)_[A-Za-z0-9]{10,200}$/;
19
+ var RECHECK = 3 * 864e5;
20
+ var listeners = [];
21
+
22
+ function get() { try { return JSON.parse(localStorage.getItem(KEY) || "null"); } catch (e) { return null; } }
23
+ function set(v) { try { if (v) localStorage.setItem(KEY, JSON.stringify(v)); else localStorage.removeItem(KEY); } catch (e) { /* private mode */ } mem = v; }
24
+ var mem = get();
25
+ function isPro() { return !!(mem && mem.code); }
26
+
27
+ function check(code) {
28
+ return fetch(DATA + "/unlock/" + encodeURIComponent(C.id) + "?json=1&session_id=" + encodeURIComponent(code))
29
+ .then(function (r) { return r.json(); })
30
+ .then(function (j) { return j && typeof j.pro === "boolean" ? j.pro : null; })
31
+ .catch(function () { return null; });
32
+ }
33
+
34
+ function unlock(code) {
35
+ return check(code).then(function (ok) {
36
+ if (ok) { set({ code: code, at: new Date().toISOString(), checked: Date.now() }); apply(); toast("Pro unlocked. Thank you for choosing " + C.name + "!"); }
37
+ else if (ok === false) toast("That code is not an active " + C.name + " Pro order.");
38
+ else toast("Could not reach the unlock check. Try again in a minute.");
39
+ return ok;
40
+ });
41
+ }
42
+
43
+ function recheck() {
44
+ if (!isPro() || Date.now() - (mem.checked || 0) < RECHECK) return;
45
+ check(mem.code).then(function (ok) {
46
+ if (ok === false) { set(null); apply(); toast(C.name + " Pro has ended in this browser. Everything free is still here."); }
47
+ else if (ok) set(Object.assign({}, mem, { checked: Date.now() }));
48
+ });
49
+ }
50
+
51
+ function toast(msg) {
52
+ var t = document.getElementById("toast");
53
+ if (t) { t.textContent = msg; t.hidden = false; t.classList.add("show"); setTimeout(function () { t.classList.remove("show"); }, 3500); }
54
+ var s = document.getElementById("cmx-pro-msg");
55
+ if (s) s.textContent = msg;
56
+ }
57
+
58
+ function esc(s) { return String(s).replace(/[&<>"]/g, function (c) { return { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" }[c]; }); }
59
+ function buyUrl(offer, from) { return DATA + "/buy/" + offer + "?s=app-" + C.id + (from ? "-" + from : ""); }
60
+
61
+ function box() {
62
+ var el = document.getElementById("cmx-pro");
63
+ if (!el) {
64
+ el = document.createElement("section");
65
+ el.id = "cmx-pro";
66
+ var anchor = document.querySelector("footer.more") || document.querySelector("main footer") || document.querySelector("footer");
67
+ if (anchor && anchor.parentNode) anchor.parentNode.insertBefore(el, anchor); else (document.querySelector("main") || document.body).appendChild(el);
68
+ }
69
+ el.className = "cmx-pro";
70
+ return el;
71
+ }
72
+
73
+ function render() {
74
+ var el = box();
75
+ if (isPro()) {
76
+ el.innerHTML = '<h2>' + esc(C.name) + ' Pro <span class="cmx-pro-badge">on</span></h2><p>Thank you! Pro is on in this browser: ' + C.perks.map(esc).join(" · ") +
77
+ '.</p><p class="cmx-pro-small">Your unlock code (paste it on another device): <code style="user-select:all;word-break:break-all">' + esc(mem.code) +
78
+ '</code></p>' + ((C.plans || []).some(function (p) { return /\//.test(p.per || ""); }) ? '<p class="cmx-pro-small">Monthly or yearly plan? Cancel any time from the link in your Stripe receipt email.</p>' : "");
79
+ return;
80
+ }
81
+ var subs = (C.plans || []).some(function (p) { return /\//.test(p.per || ""); });
82
+ var plans = (C.plans || []).map(function (p) {
83
+ return '<a class="cmx-plan' + (p.best ? " best" : "") + '" href="' + buyUrl(p.offer) + '" rel="nofollow" data-offer="' + esc(p.offer) + '">' +
84
+ (p.best ? "<i>Best value</i>" : "") + "<b>" + esc(p.label) + '</b><span class="cmx-price">' + esc(p.price) + "<small>" + esc(p.per || "") +
85
+ '</small></span><span class="cmx-note">' + esc(p.note || "") + "</span></a>";
86
+ }).join("");
87
+ el.innerHTML = '<h2>' + esc(C.name) + ' Pro</h2>' + (C.free ? '<p class="cmx-pro-small">Free: ' + esc(C.free) + "</p>" : "") +
88
+ "<ul>" + C.perks.map(function (p) { return "<li>" + esc(p) + "</li>"; }).join("") + '</ul><div class="cmx-plans">' + plans +
89
+ '</div><p class="cmx-pro-small">Secure Stripe checkout. Pro turns on the moment you pay; no account needed.' + (subs ? " Subscriptions cancel any time." : " One payment, no subscription.") + '</p>' +
90
+ '<details><summary>Already bought Pro?</summary><form id="cmx-pro-form"><label>Unlock code <input id="cmx-pro-code" autocomplete="off" placeholder="cs_live_…"></label> <button class="btn ghost" type="submit">Unlock</button></form></details><p id="cmx-pro-msg" class="cmx-pro-small" aria-live="polite"></p>';
91
+ var f = document.getElementById("cmx-pro-form");
92
+ if (f) f.onsubmit = function (e) { e.preventDefault(); var c = (document.getElementById("cmx-pro-code").value || "").trim(); if (SID.test(c)) unlock(c); else toast("Paste the code from your receipt page (it starts with cs_live_)."); };
93
+ }
94
+
95
+ function apply() {
96
+ document.documentElement.classList.toggle("cmx-pro", isPro());
97
+ render();
98
+ listeners.forEach(function (fn) { try { fn(isPro()); } catch (e) { /* app hook */ } });
99
+ }
100
+
101
+ /** Scroll to the Pro box (call when a free user hits a limit); `from` tags the counted buy links. */
102
+ function upsell(reason, from) {
103
+ var el = box();
104
+ if (from) Array.prototype.forEach.call(el.querySelectorAll("a.cmx-plan"), function (a) { a.href = buyUrl(a.getAttribute("data-offer"), from); });
105
+ if (reason) toast(reason);
106
+ el.scrollIntoView({ behavior: "smooth", block: "start" });
107
+ el.classList.add("cmx-pro-flash"); setTimeout(function () { el.classList.remove("cmx-pro-flash"); }, 1600);
108
+ }
109
+
110
+ /** Free monthly allowance kept in this browser: quota("pdf", 5) -> {used, left, take()}. */
111
+ function quota(name, limit) {
112
+ var k = "cmx-quota:" + C.id + ":" + name, month = new Date().toISOString().slice(0, 7), q;
113
+ try { q = JSON.parse(localStorage.getItem(k) || "null"); } catch (e) { q = null; }
114
+ if (!q || q.m !== month) q = { m: month, n: 0 };
115
+ return {
116
+ used: q.n, left: Math.max(0, limit - q.n), limit: limit,
117
+ take: function () { if (isPro()) return true; if (q.n >= limit) return false; q.n++; try { localStorage.setItem(k, JSON.stringify(q)); } catch (e) { /* */ } this.used = q.n; this.left = Math.max(0, limit - q.n); return true; },
118
+ };
119
+ }
120
+
121
+ function download(name, data, type) {
122
+ var a = document.createElement("a");
123
+ a.href = URL.createObjectURL(data instanceof Blob ? data : new Blob([data], { type: type || "text/csv;charset=utf-8" }));
124
+ a.download = name;
125
+ document.body.appendChild(a); a.click(); a.remove();
126
+ setTimeout(function () { URL.revokeObjectURL(a.href); }, 2000);
127
+ }
128
+
129
+ window.CMXPro = { isPro: isPro, onChange: function (fn) { listeners.push(fn); fn(isPro()); }, upsell: upsell, quota: quota, download: download, toast: toast };
130
+
131
+ var m = /[#&]cmx-pro=([^&]+)/.exec(location.hash || "");
132
+ function start() {
133
+ if (m && SID.test(decodeURIComponent(m[1]))) {
134
+ var code = decodeURIComponent(m[1]);
135
+ history.replaceState(null, "", location.pathname + location.search);
136
+ apply(); unlock(code);
137
+ } else { apply(); recheck(); }
138
+ }
139
+ if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start();
140
+ })();
pactsprig/robots.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ User-agent: *
2
+ Allow: /
3
+ Sitemap: https://cybermax-tools-cybermax.static.hf.space/pactsprig/sitemap.xml
pactsprig/sitemap.xml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url><loc>https://cybermax-tools-cybermax.static.hf.space/pactsprig/index.html</loc><lastmod>2026-10-02</lastmod><changefreq>monthly</changefreq></url></urlset>
pactsprig/style.css ADDED
@@ -0,0 +1,281 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Pactsprig. © 2026 CyberMax. All rights reserved. */
2
+ :root{
3
+ --accent:#2A4D7A;--accent2:#1B3455;--ink:#14171E;--muted:#596070;--bg:#F6F3EC;--card:#FFFFFF;--line:#E1DDD3;--field:#FFFFFF;
4
+ --soft:#E9EEF5;--warn:#9A4B00;--ok:#1E7A55;--shadow:0 1px 2px rgba(17,20,27,.06),0 6px 24px rgba(17,20,27,.06);--on:#fff;
5
+ color-scheme:light dark;
6
+ }
7
+ @media (prefers-color-scheme:dark){
8
+ :root{--accent:#86AEE6;--accent2:#B7CDEE;--ink:#ECEFF3;--muted:#A5ABB8;--bg:#11141A;--card:#1A1E26;--line:#2E3440;--field:#141820;--soft:#1C2533;--warn:#F2B66B;--ok:#6FD3A6;--shadow:none;--on:#0D1420}
9
+ }
10
+ *{box-sizing:border-box}
11
+ [hidden]{display:none!important}
12
+ html{-webkit-text-size-adjust:100%;scroll-padding-top:70px;scroll-padding-bottom:84px}
13
+ body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;overflow-x:hidden}
14
+ a{color:var(--accent)}
15
+ .wrap{max-width:1260px;margin:0 auto;padding:0 16px}
16
+ .sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
17
+ h1,h2,h3{line-height:1.2;letter-spacing:-.01em}
18
+ h1{font-size:clamp(1.7rem,4.4vw,2.6rem);margin:18px 0 8px;font-weight:800}
19
+ h2{font-size:1.12rem;margin:0}
20
+ :focus-visible{outline:3px solid color-mix(in srgb,var(--accent) 55%,transparent);outline-offset:2px}
21
+
22
+ /* header */
23
+ .top{position:sticky;top:0;z-index:20;background:color-mix(in srgb,var(--bg) 88%,transparent);backdrop-filter:blur(8px);border-bottom:1px solid var(--line)}
24
+ .top-in{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:56px}
25
+ .brand{display:flex;align-items:center;gap:9px;text-decoration:none;color:var(--ink);font-size:1.12rem;min-width:0}
26
+ .brand small{color:var(--muted);font-weight:500;font-size:.78rem}
27
+ .top-nav{display:flex;align-items:center;gap:8px}
28
+ .top-link{color:var(--ink);text-decoration:none;font-weight:600;font-size:.93rem;padding:6px 4px}
29
+ .pill{background:var(--accent);color:var(--on);text-decoration:none;font-weight:800;font-size:.8rem;padding:5px 12px;border-radius:999px;letter-spacing:.02em}
30
+ html.cmx-pro .pill{background:transparent;color:var(--accent);border:2px solid var(--accent)}
31
+
32
+ /* hero */
33
+ .hero{padding:4px 0 12px}
34
+ .lede{font-size:1.06rem;max-width:780px;margin:0 0 14px}
35
+ .hero-row{display:flex;flex-wrap:wrap;align-items:center;gap:10px}
36
+ .hero-note{color:var(--muted);font-size:.9rem}
37
+ .legal-note{margin:14px 0 0;max-width:780px;font-size:.9rem;background:var(--soft);border-left:4px solid var(--accent);padding:9px 12px;border-radius:0 10px 10px 0}
38
+
39
+ /* controls */
40
+ .btn{appearance:none;border:2px solid var(--accent);background:var(--accent);color:var(--on);font:inherit;font-weight:700;border-radius:10px;padding:9px 16px;cursor:pointer;text-decoration:none;display:inline-flex;align-items:center;gap:6px;line-height:1.2;justify-content:center}
41
+ .btn:hover{filter:brightness(1.07)}
42
+ .btn.ghost{background:transparent;color:var(--ink);border-color:var(--line)}
43
+ .btn.ghost:hover{border-color:var(--accent)}
44
+ .btn.sm{padding:6px 11px;font-size:.88rem;border-radius:9px}
45
+ .btn.big{padding:12px 22px;font-size:1.05rem;flex:1 1 180px}
46
+ .pro-tag{display:inline-block;font-size:.64rem;font-weight:800;letter-spacing:.04em;background:var(--accent);color:var(--on);border-radius:5px;padding:1px 5px;vertical-align:middle;font-style:normal}
47
+ html.cmx-pro .pro-tag{display:none}
48
+ label{display:block;font-size:.84rem;font-weight:650;margin:10px 0 4px}
49
+ label.inline{display:inline;margin:0 6px 0 0}
50
+ .opt{font-weight:400;color:var(--muted)}
51
+ input,select,textarea{width:100%;font:inherit;font-size:16px;color:var(--ink);background:var(--field);border:1.5px solid var(--line);border-radius:9px;padding:9px 10px;min-width:0}
52
+ textarea{resize:vertical}
53
+ input:focus,select:focus,textarea:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 22%,transparent)}
54
+ input[type=checkbox],input[type=radio]{width:20px;height:20px;margin:0;accent-color:var(--accent);flex:0 0 auto}
55
+ .hint{color:var(--muted);font-size:.86rem;margin:6px 0}
56
+ .btns{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:12px}
57
+ .btns select{width:auto;max-width:100%;font-size:.9rem;padding:6px 8px}
58
+ .file-btn{margin:0;cursor:pointer}
59
+
60
+ /* agreement picker */
61
+ .picker{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:8px 0 16px}
62
+ .picker button{appearance:none;position:relative;text-align:left;font:inherit;color:var(--ink);background:var(--card);border:1.5px solid var(--line);border-radius:14px;padding:12px 14px;cursor:pointer;box-shadow:var(--shadow);display:flex;flex-direction:column;gap:2px;min-width:0}
63
+ .picker button b{font-size:1rem;padding-right:44px}
64
+ .picker button span{color:var(--muted);font-size:.85rem}
65
+ .picker button[aria-checked=true]{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent) inset,var(--shadow)}
66
+ .picker .tag{position:absolute;top:10px;right:10px;font-style:normal;font-size:.68rem;font-weight:800;letter-spacing:.04em;border-radius:6px;padding:2px 7px}
67
+ .picker .tag.free{background:color-mix(in srgb,var(--ok) 16%,transparent);color:var(--ok)}
68
+ .picker .tag.pro{background:var(--accent);color:var(--on)}
69
+ html.cmx-pro .picker .tag.pro{background:transparent;color:var(--accent);border:1px solid var(--accent)}
70
+
71
+ /* layout */
72
+ .cols{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-items:start}
73
+ @media (min-width:1000px){.cols{grid-template-columns:minmax(0,460px) minmax(0,1fr)}.preview-col{position:sticky;top:68px}.paper-wrap{max-height:calc(100vh - 250px);overflow:auto}}
74
+ @media (min-width:1200px){.cols{grid-template-columns:minmax(0,500px) minmax(0,1fr)}}
75
+ .card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px 16px;box-shadow:var(--shadow);min-width:0}
76
+ .editor{display:flex;flex-direction:column;gap:12px;min-width:0}
77
+ .editor summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:10px}
78
+ .editor summary h2{flex:1}
79
+ .editor summary::-webkit-details-marker{display:none}
80
+ .editor summary::after{content:"";width:9px;height:9px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);transform:rotate(45deg);margin-right:4px;transition:transform .15s}
81
+ .editor details[open]>summary::after{transform:rotate(225deg)}
82
+ .editor details[open]>summary{margin-bottom:4px}
83
+ .step{font-size:.75rem;color:var(--muted);font-weight:600}
84
+ .g2{display:grid;grid-template-columns:1fr 1fr;gap:0 12px}
85
+ .parties{display:grid;gap:14px}
86
+ fieldset.party{border:1px solid var(--line);border-radius:12px;padding:4px 12px 12px;margin:0;min-width:0}
87
+ fieldset.party legend{font-weight:800;padding:0 6px;color:var(--accent)}
88
+
89
+ /* cover page form */
90
+ .cover-form{display:flex;flex-direction:column;gap:12px}
91
+ .frow{padding:12px 0;border-top:1px dashed var(--line)}
92
+ .frow.cont{border-top:0;padding-top:0}
93
+ .fl label{margin:0;font-size:.95rem;font-weight:750}
94
+ .fsub{display:block;font-size:.8rem;color:var(--muted);margin:1px 0 6px}
95
+ .fl{margin-bottom:6px}
96
+ .help{font-size:.83rem;color:var(--muted);margin:6px 0 0;padding-left:10px;border-left:2px solid var(--soft)}
97
+ .fh{font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;color:var(--accent);margin:16px 0 0}
98
+ .line{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;line-height:1.7}
99
+ .line.fixed{color:var(--muted)}
100
+ .ot{white-space:normal}
101
+ .ot.glob{color:var(--muted);font-style:italic}
102
+ .ot.muted{color:var(--muted)}
103
+ input.inl{width:calc(var(--w,12) * 1ch + 22px);max-width:100%;padding:5px 8px;display:inline-block}
104
+ input.inl.num{width:calc(var(--w,3) * 1ch + 26px)}
105
+ .line select,.opt-body select{width:auto;max-width:100%;padding:5px 8px;display:inline-block}
106
+ .line input[type=date],.opt-body input[type=date]{width:auto;padding:5px 8px}
107
+ textarea.wide{margin-top:6px}
108
+ .opts{display:flex;flex-direction:column;gap:6px}
109
+ .opts .lead{margin:4px 0 2px;font-size:.88rem;color:var(--muted);font-weight:600}
110
+ .opt-row{display:flex;gap:10px;align-items:flex-start;padding:7px 9px;border:1px solid var(--line);border-radius:10px;font-size:.93rem;line-height:1.45}
111
+ .opt-row.on{border-color:color-mix(in srgb,var(--accent) 55%,var(--line));background:color-mix(in srgb,var(--accent) 5%,var(--card))}
112
+ .optl{margin:2px 0 0;display:flex}
113
+ .opt-body{flex:1;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px}
114
+ .opt-body textarea{flex:1 1 100%}
115
+ .subs{flex:1 1 100%;display:flex;flex-direction:column;gap:5px;margin-top:6px}
116
+ .subs .opt-row{background:var(--card)}
117
+ .mini{font-size:.92rem;margin:12px 0 6px}
118
+ .preset-add{display:flex;gap:8px}
119
+ .preset-add input{flex:1}
120
+ .chips{display:flex;flex-wrap:wrap;gap:6px}
121
+ .chip{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--line);border-radius:999px;padding:2px 4px 2px 11px;font-size:.86rem;max-width:100%}
122
+ .chip span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
123
+ .chip button{border:0;background:transparent;color:var(--muted);cursor:pointer;font:inherit;border-radius:999px;padding:2px 6px}
124
+ .chip .chip-load{color:var(--accent);font-weight:700;padding-left:0}
125
+ .chip button:hover{background:var(--soft);color:var(--ink)}
126
+
127
+ /* actions + preview */
128
+ .preview-col{min-width:0;scroll-margin-top:68px}
129
+ #cmx-pro,#app{scroll-margin-top:68px}
130
+ .actions{margin-bottom:12px}
131
+ .act-row{display:flex;gap:8px;flex-wrap:wrap}
132
+ .quota{margin:10px 0 0;font-weight:700;font-size:.93rem}
133
+ .quota.out{color:var(--warn)}
134
+ .warn{margin:4px 0 0;color:var(--warn);font-size:.86rem}
135
+ .warn:empty{display:none}
136
+ .disc{margin:8px 0 0;font-size:.82rem;color:var(--muted);border-left:3px solid var(--accent);padding-left:9px}
137
+ .act-meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;margin-top:10px;font-size:.86rem}
138
+ .act-meta select{width:auto;padding:5px 8px;font-size:.88rem}
139
+ .act-meta .hint{margin:0}
140
+ .paper-wrap{position:relative;border-radius:8px;box-shadow:0 2px 6px rgba(0,0,0,.08),0 18px 40px rgba(17,20,27,.12);background:#fff}
141
+
142
+ /* the document (always light, like paper) */
143
+ .paper{position:relative;background:#fff;color:#15181F;font:13px/1.5 Helvetica,Arial,sans-serif;padding:44px 48px 56px;max-width:860px;margin:0 auto}
144
+ .paper *{box-sizing:border-box}
145
+ .d-cover{padding-bottom:26px;margin-bottom:26px;border-bottom:2px dashed #E3E5EA}
146
+ .d-kicker{font-size:10.5px;font-weight:700;letter-spacing:.08em;color:#2A4D7A;text-transform:uppercase;margin-bottom:2px}
147
+ .d-title{font-size:23px;margin:0 0 10px;padding-bottom:8px;border-bottom:1.6px solid #15181F;font-weight:700;letter-spacing:-.01em}
148
+ .d-intro{font-size:11px;color:#596070;margin:0 0 12px}
149
+ .d-lead{font-weight:700;margin:0 0 6px}
150
+ .d-rows{border-top:.8px solid #D5D8DF}
151
+ .d-row{display:grid;grid-template-columns:190px minmax(0,1fr);gap:14px;padding:9px 0;border-bottom:.8px solid #D5D8DF}
152
+ .d-l b{display:block;font-size:12.5px}
153
+ .d-l small{display:block;font-size:10px;color:#596070;line-height:1.3;margin-top:1px}
154
+ .d-r{min-width:0;overflow-wrap:anywhere}
155
+ .d-it{padding-left:calc(var(--lvl,0) * 16px);margin:0 0 3px;white-space:pre-wrap}
156
+ .d-it.b{position:relative;padding-left:calc(var(--lvl,0) * 16px + 13px)}
157
+ .d-it.b::before{content:"\2022";position:absolute;left:calc(var(--lvl,0) * 16px);color:#2A4D7A}
158
+ .d-it.lead{color:#596070}
159
+ .d-head{font-size:10.5px;font-weight:700;letter-spacing:.08em;color:#2A4D7A;text-transform:uppercase;padding:14px 0 6px;border-bottom:.8px solid #D5D8DF}
160
+ .miss{background:#FFF3C4;color:#7A5200;border-radius:3px;padding:0 2px}
161
+ .d-closing{margin:14px 0}
162
+ .d-sign{width:100%;border-collapse:collapse;font-size:12px;table-layout:fixed}
163
+ .d-sign thead th{background:#EEF2F7;text-align:left;padding:7px 8px;font-size:11px;overflow-wrap:anywhere}
164
+ .d-sign thead th:first-child{width:28%}
165
+ .d-sign tbody th{text-align:left;padding:8px;font-size:11.5px;vertical-align:top;width:28%}
166
+ .d-sign th small{display:block;font-weight:400;color:#596070;font-size:9.5px}
167
+ .d-sign td{padding:8px;vertical-align:top;border-bottom:.7px solid #D5D8DF;overflow-wrap:anywhere;white-space:pre-wrap}
168
+ .d-sign tbody th{border-bottom:.7px solid #D5D8DF}
169
+ .d-sign td.sigline span{display:block;border-bottom:1px solid #15181F;height:26px}
170
+ .d-att{font-size:10px;color:#8A8F9C;margin:14px 0 0}
171
+ .d-att.end{font-size:11.5px;font-weight:700;color:#15181F;border-top:.8px solid #D5D8DF;padding-top:10px;margin-top:20px}
172
+ .d-att a{color:#2A4D7A}
173
+ .d-src{font-size:10px;color:#596070;overflow-wrap:anywhere;margin:4px 0 0}
174
+ .d-tt{font-size:19px;margin:0 0 4px}
175
+ .d-tn{font-size:10.5px;color:#596070;margin:0 0 12px;padding-bottom:8px;border-bottom:1.6px solid #15181F}
176
+ .d-sec{font-size:14px;margin:18px 0 6px}
177
+ .d-p{margin:0 0 7px;text-align:left}
178
+ .d-p.l1{margin-top:10px}
179
+ .d-p.l3{padding-left:20px}
180
+ .d-p.l4{padding-left:40px}
181
+ .d-p .v{background:#EEF2F7;border-radius:3px;padding:0 2px}
182
+ .d-credit{font-size:10.5px;color:#8A8F9C;margin:16px 0 0}
183
+ html.cmx-pro .d-credit{display:none}
184
+ .paper.locked .d-terms{max-height:520px;overflow:hidden;-webkit-mask-image:linear-gradient(#000 40%,transparent);mask-image:linear-gradient(#000 40%,transparent)}
185
+ .d-lock{position:sticky;bottom:12px;margin:14px auto 0;max-width:520px;background:#15181F;color:#fff;border-radius:12px;padding:14px 16px;font-family:system-ui,sans-serif;box-shadow:0 10px 30px rgba(0,0,0,.25)}
186
+ .d-lock p{margin:0 0 10px;font-size:.92rem}
187
+ .d-lock .btn{background:#86AEE6;border-color:#86AEE6;color:#0D1420}
188
+
189
+ /* after the app */
190
+ .pro-cta{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:14px;margin:22px 0;border:2px solid var(--accent);background:var(--soft)}
191
+ .pro-cta[hidden]{display:none}
192
+ .pro-cta p{margin:6px 0 0;max-width:760px}
193
+ section.how,section.compare,section.faq,section.about-std{margin:34px 0}
194
+ section.how h2,section.compare h2,section.faq h2,section.about-std h2{font-size:1.45rem;margin-bottom:12px}
195
+ .steps{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));padding:0;margin:0;list-style:none;counter-reset:s}
196
+ .steps li{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px 16px 16px 58px;position:relative;counter-increment:s}
197
+ .steps li::before{content:counter(s);position:absolute;left:16px;top:14px;width:30px;height:30px;border-radius:50%;background:var(--accent);color:var(--on);font-weight:800;display:flex;align-items:center;justify-content:center}
198
+ .table-wrap{overflow-x:auto;max-width:100%}
199
+ .cmp{width:100%;border-collapse:collapse;background:var(--card);border-radius:12px;overflow:hidden;font-size:.94rem}
200
+ .cmp th,.cmp td{padding:10px 12px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
201
+ .cmp thead th{background:var(--soft);font-size:.82rem;text-transform:uppercase;letter-spacing:.03em}
202
+ .cmp tr.us th,.cmp tr.us td{background:color-mix(in srgb,var(--accent) 7%,var(--card))}
203
+ .std-list{padding-left:20px}
204
+ .std-list li{margin:4px 0}
205
+ .faq details{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 16px;margin-bottom:8px}
206
+ .faq summary{cursor:pointer;font-weight:700}
207
+ .faq p{margin:8px 0 0}
208
+ .disclaimer{font-size:.92rem;border-left:4px solid var(--accent);padding:6px 12px;background:var(--soft);border-radius:0 10px 10px 0}
209
+ footer.more{border-top:1px solid var(--line);margin-top:30px;padding:22px 0 40px}
210
+ .more-title{font-weight:800;margin-bottom:10px}
211
+ .more-links{display:flex;flex-wrap:wrap;gap:8px 16px;margin-bottom:16px}
212
+ .more-links a{text-decoration:none;font-weight:600}
213
+ .more-links a:hover{text-decoration:underline}
214
+ .foot-legal{color:var(--muted);font-size:.84rem;max-width:860px}
215
+ .copy{color:var(--muted);font-size:.88rem}
216
+ .toast{position:fixed;left:50%;bottom:20px;transform:translateX(-50%) translateY(20px);background:var(--ink);color:var(--bg);padding:10px 16px;border-radius:10px;font-weight:600;opacity:0;transition:.2s;z-index:50;max-width:calc(100% - 32px);pointer-events:none;text-align:center}
217
+ .toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
218
+
219
+ @media (max-width:700px){
220
+ .picker{grid-template-columns:1fr;gap:8px}
221
+ .picker button{padding:10px 12px}
222
+ .g2{grid-template-columns:1fr}
223
+ .cmp thead{display:none}.cmp,.cmp tbody,.cmp tr,.cmp th,.cmp td{display:block;width:100%}
224
+ .cmp tr{border-bottom:1px solid var(--line);padding:6px 0}.cmp th,.cmp td{border:0;padding:3px 12px}
225
+ .top-link{display:none}
226
+ .brand small{display:none}
227
+ .hero-row .btn{flex:1}
228
+ .paper{padding:22px 16px 30px;font-size:12.5px}
229
+ .d-row{grid-template-columns:1fr;gap:4px}
230
+ .d-sign thead th:first-child,.d-sign tbody th{width:30%}
231
+ .d-sign{font-size:11px}
232
+ }
233
+
234
+ /* phone action bar */
235
+ .mbar{display:none}
236
+ @media (max-width:999px){
237
+ .mbar{display:flex;gap:8px;position:fixed;left:0;right:0;bottom:0;z-index:30;padding:10px 16px calc(10px + env(safe-area-inset-bottom));background:color-mix(in srgb,var(--card) 94%,transparent);backdrop-filter:blur(8px);border-top:1px solid var(--line)}
238
+ .mbar .btn{flex:1}
239
+ .toast{bottom:84px}
240
+ body{padding-bottom:72px}
241
+ }
242
+
243
+ /* Pro box (shared/pro-unlock/pro-plans.css) */
244
+ #cmx-pro.cmx-pro{border:2px solid var(--accent,#b63a10);border-radius:16px;padding:20px;margin:28px 0;background:var(--card,#fff)}
245
+ #cmx-pro h2{margin:0 0 8px}
246
+ #cmx-pro ul{margin:8px 0 14px;padding-left:20px}
247
+ .cmx-pro-badge{background:var(--accent,#b63a10);color:#fff;border-radius:999px;padding:2px 10px;font-size:.7em;vertical-align:middle}
248
+ .cmx-pro-small{font-size:.88em;opacity:.8}
249
+ .cmx-plans{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:10px 0}
250
+ .cmx-plan{position:relative;display:flex;flex-direction:column;gap:2px;padding:14px;border:1px solid var(--line,#d9d3c7);border-radius:12px;text-decoration:none;color:inherit;background:var(--bg,#faf8f3)}
251
+ .cmx-plan:hover,.cmx-plan:focus{border-color:var(--accent,#b63a10);outline:none}
252
+ .cmx-plan.best{border:2px solid var(--accent,#b63a10)}
253
+ .cmx-plan i{position:absolute;top:-10px;right:10px;background:var(--accent,#b63a10);color:#fff;font-style:normal;font-size:.72em;font-weight:700;border-radius:999px;padding:2px 8px}
254
+ .cmx-price{font-size:1.5em;font-weight:800}
255
+ .cmx-price small{font-size:.55em;font-weight:600;opacity:.75}
256
+ .cmx-note{font-size:.82em;opacity:.75}
257
+ .cmx-pro-flash{animation:cmxflash 1.5s ease}
258
+ @keyframes cmxflash{0%,100%{box-shadow:none}30%{box-shadow:0 0 0 6px color-mix(in srgb,var(--accent,#b63a10) 35%,transparent)}}
259
+ #cmx-pro details{margin-top:8px}
260
+ #cmx-pro input{max-width:280px}
261
+ /* end shared */
262
+ #cmx-pro form{display:flex;flex-wrap:wrap;gap:8px;align-items:end}
263
+ #cmx-pro form label{flex:1 1 220px;margin:0}
264
+ #cmx-pro{scroll-margin-top:68px}
265
+
266
+ /* print: only the document */
267
+ @media print{
268
+ @page{margin:16mm 16mm 18mm}
269
+ html,body{background:#fff!important;padding:0!important}
270
+ .top,.toast,.mbar,.hero,.picker,.editor,.actions,.pro-cta,.how,.compare,.faq,.about-std,.disclaimer,footer.more,#cmx-pro,.d-lock{display:none!important}
271
+ .wrap{max-width:none;padding:0}
272
+ .cols{display:block}
273
+ .preview-col{position:static}
274
+ .paper-wrap{box-shadow:none;max-height:none!important;overflow:visible!important}
275
+ .paper{padding:0;max-width:none;font-size:10.5pt}
276
+ .d-cover{border-bottom:0;break-after:page;page-break-after:always;margin:0;padding:0}
277
+ .d-row,.d-sign tr{break-inside:avoid}
278
+ .d-sec{break-after:avoid}
279
+ .d-p .v{background:none;padding:0}
280
+ .miss{background:none;color:inherit}
281
+ }
pactsprig/sw.js ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Pactsprig offline cache. © 2026 CyberMax. All rights reserved. */
2
+ var CACHE = "pactsprig-v1";
3
+ var FILES = ["./", "index.html", "style.css", "pro.js", "lib/core.js", "lib/pdf.js", "lib/docx.js", "app.js", "manifest.webmanifest", "icon.svg", "icon-192.png", "icon-512.png",
4
+ "templates/index.json", "templates/mnda.json", "templates/psa.json", "templates/design-partner.json"];
5
+ self.addEventListener("install", function (e) {
6
+ e.waitUntil(caches.open(CACHE).then(function (c) { return c.addAll(FILES); }).then(function () { return self.skipWaiting(); }));
7
+ });
8
+ self.addEventListener("activate", function (e) {
9
+ e.waitUntil(caches.keys().then(function (keys) {
10
+ return Promise.all(keys.filter(function (k) { return k.indexOf("pactsprig-") === 0 && k !== CACHE; }).map(function (k) { return caches.delete(k); }));
11
+ }).then(function () { return self.clients.claim(); }));
12
+ });
13
+ self.addEventListener("fetch", function (e) {
14
+ var req = e.request, url = new URL(req.url);
15
+ if (req.method !== "GET" || url.origin !== location.origin) return;
16
+ var scope = new URL(self.registration.scope);
17
+ if (url.pathname.indexOf(scope.pathname) !== 0) return;
18
+ if (req.mode === "navigate") {
19
+ // Network first for pages so updates arrive quickly; the cached page works offline.
20
+ e.respondWith(fetch(req).then(function (r) {
21
+ var copy = r.clone(); caches.open(CACHE).then(function (c) { c.put("index.html", copy); });
22
+ return r;
23
+ }).catch(function () { return caches.match("index.html"); }));
24
+ return;
25
+ }
26
+ // Cache first for static files in this app's folder, refreshed in the background.
27
+ e.respondWith(caches.match(req, { ignoreSearch: true }).then(function (hit) {
28
+ var net = fetch(req).then(function (r) {
29
+ if (r && r.ok) { var copy = r.clone(); caches.open(CACHE).then(function (c) { c.put(req, copy); }); }
30
+ return r;
31
+ });
32
+ if (hit) { net.catch(function () { /* offline */ }); return hit; }
33
+ return net;
34
+ }));
35
+ });
pactsprig/templates/design-partner.json ADDED
@@ -0,0 +1,918 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "design-partner",
3
+ "name": "Design Partner Agreement",
4
+ "short": "Design Partner",
5
+ "version": "1.3",
6
+ "free": false,
7
+ "termsUrl": "https://commonpaper.com/standards/design-partner-agreement/1.3",
8
+ "aboutUrl": "https://commonpaper.com/standards/design-partner-agreement/",
9
+ "attribution": "Common Paper Design Partner Agreement (Version 1.3) free to use under CC BY 4.0.",
10
+ "parties": [
11
+ "Provider",
12
+ "Partner"
13
+ ],
14
+ "partyRoles": [
15
+ "Provider",
16
+ "Partner"
17
+ ],
18
+ "blurb": "For startups giving an early customer access to a product in exchange for feedback, before a full commercial contract.",
19
+ "cover": [
20
+ {
21
+ "id": "keyterms",
22
+ "title": "Design Partner Agreement",
23
+ "kicker": "Key Terms",
24
+ "intro": "This Agreement has 2 parts: (1) the Key Terms on this Cover Page and (2) the Common Paper Design Partner Standard Terms Version 1.3 posted at commonpaper.com/standards/design-partner-agreement/1.3 (“Standard Terms”), which is incorporated by reference. If there is any inconsistency between the parts of the Agreement, the Cover Page will control over the Standard Terms. Capitalized and highlighted words have the meanings given on the Cover Page. However, if the Cover Page omits or does not define a highlighted word, the default meaning will be “none” or “not applicable” and the correlating clause, sentence, or section does not apply to this Agreement. All other capitalized words have the meanings given in the Standard Terms.",
25
+ "lead": "The key legal terms of this Agreement are as follows:",
26
+ "rows": [
27
+ {
28
+ "id": "product",
29
+ "type": "line",
30
+ "label": "Product",
31
+ "t": "The Product is {text}.",
32
+ "in": {
33
+ "text": {
34
+ "k": "area",
35
+ "d": "",
36
+ "ph": "description of the product being developed"
37
+ }
38
+ },
39
+ "help": "The product (or feature) the partner gets early access to, in one or two sentences."
40
+ },
41
+ {
42
+ "id": "partnerDoes",
43
+ "type": "checks",
44
+ "label": "Program",
45
+ "lead": "As part of the Program, Partner will:",
46
+ "options": [
47
+ {
48
+ "id": "sessions",
49
+ "t": "Participate in {n} Feedback sessions per {per}",
50
+ "in": {
51
+ "n": {
52
+ "k": "num",
53
+ "d": "2",
54
+ "w": 3
55
+ },
56
+ "per": {
57
+ "k": "sel",
58
+ "o": [
59
+ "month",
60
+ "quarter",
61
+ "year",
62
+ "term"
63
+ ],
64
+ "d": "month"
65
+ }
66
+ }
67
+ },
68
+ {
69
+ "id": "case",
70
+ "t": "Provide case study that can be shared with others"
71
+ },
72
+ {
73
+ "id": "private",
74
+ "t": "Appear as a customer in private customer lists"
75
+ },
76
+ {
77
+ "id": "public",
78
+ "t": "Appear as a customer on Provider’s website and public customer lists"
79
+ },
80
+ {
81
+ "id": "ref",
82
+ "t": "Serve as a reference for prospective customers"
83
+ },
84
+ {
85
+ "id": "other",
86
+ "t": "{text}",
87
+ "in": {
88
+ "text": {
89
+ "k": "text",
90
+ "ph": "other: fill in details",
91
+ "d": "",
92
+ "w": 22
93
+ }
94
+ }
95
+ }
96
+ ],
97
+ "d": {
98
+ "sessions": true
99
+ },
100
+ "help": "What the design partner gives back: feedback sessions, a case study, a logo on your site, references."
101
+ },
102
+ {
103
+ "id": "providerDoes",
104
+ "type": "checks",
105
+ "label": "",
106
+ "omitLabel": true,
107
+ "lead": "As part of the Program, Provider will:",
108
+ "after": "partnerDoes",
109
+ "options": [
110
+ {
111
+ "id": "discount",
112
+ "t": "Give a {disc} discount to Partner if Partner signs a long-term customer agreement for the Product after completing the Program",
113
+ "in": {
114
+ "disc": {
115
+ "k": "text",
116
+ "ph": "flat amount or percentage",
117
+ "d": "",
118
+ "w": 12
119
+ }
120
+ }
121
+ },
122
+ {
123
+ "id": "develop",
124
+ "t": "Develop the following Product functionality: {text}",
125
+ "in": {
126
+ "text": {
127
+ "k": "text",
128
+ "ph": "fill in details",
129
+ "d": "",
130
+ "w": 22
131
+ }
132
+ }
133
+ },
134
+ {
135
+ "id": "other",
136
+ "t": "{text}",
137
+ "in": {
138
+ "text": {
139
+ "k": "text",
140
+ "ph": "other: fill in details",
141
+ "d": "",
142
+ "w": 22
143
+ }
144
+ }
145
+ }
146
+ ],
147
+ "help": "What you give the partner in return: a discount on a later contract, or features you commit to build."
148
+ },
149
+ {
150
+ "id": "effective",
151
+ "type": "fixed",
152
+ "label": "Effective Date",
153
+ "sub": "The date the Agreement starts",
154
+ "t": "Date of last Cover Page signature",
155
+ "help": "This standard starts on the day the second person signs."
156
+ },
157
+ {
158
+ "id": "term",
159
+ "type": "line",
160
+ "label": "Term",
161
+ "t": "{n} {u}",
162
+ "in": {
163
+ "n": {
164
+ "k": "num",
165
+ "d": "6",
166
+ "w": 3
167
+ },
168
+ "u": {
169
+ "k": "sel",
170
+ "o": [
171
+ "months",
172
+ "quarters",
173
+ "years"
174
+ ],
175
+ "d": "months"
176
+ }
177
+ },
178
+ "help": "How long the design partnership runs. Either side can still end it with 30 days’ notice."
179
+ },
180
+ {
181
+ "id": "law",
182
+ "type": "line",
183
+ "label": "Governing Law",
184
+ "t": "The laws of the State of {state}",
185
+ "in": {
186
+ "state": {
187
+ "k": "text",
188
+ "ph": "fill in state",
189
+ "d": "",
190
+ "w": 16
191
+ }
192
+ },
193
+ "help": "Which US state’s law applies."
194
+ },
195
+ {
196
+ "id": "court",
197
+ "type": "line",
198
+ "label": "Chosen Courts",
199
+ "sub": "Jurisdiction or where disputes are filed",
200
+ "t": "The state and federal courts located in {place}",
201
+ "in": {
202
+ "place": {
203
+ "k": "text",
204
+ "ph": "fill in state and/or county",
205
+ "d": "",
206
+ "w": 20
207
+ }
208
+ },
209
+ "help": "Where any dispute would be filed."
210
+ },
211
+ {
212
+ "id": "fees",
213
+ "type": "choice",
214
+ "label": "Fees",
215
+ "d": "none",
216
+ "options": [
217
+ {
218
+ "id": "paid",
219
+ "t": "During the Term, Partner will pay Provider ${amount} per {per} (excluding taxes) in U.S. Dollars to access and use the Product. This amount reflects a discount for Partner’s Feedback and participation in the Program. Partner will pay the fee within {days} days from receipt of invoice.",
220
+ "in": {
221
+ "amount": {
222
+ "k": "text",
223
+ "ph": "amount",
224
+ "d": "",
225
+ "w": 8
226
+ },
227
+ "per": {
228
+ "k": "sel",
229
+ "o": [
230
+ "month",
231
+ "quarter",
232
+ "year",
233
+ "term"
234
+ ],
235
+ "d": "month"
236
+ },
237
+ "days": {
238
+ "k": "num",
239
+ "d": "30",
240
+ "w": 3
241
+ }
242
+ }
243
+ },
244
+ {
245
+ "id": "none",
246
+ "t": "There are no Fees under this Agreement."
247
+ }
248
+ ],
249
+ "help": "Design partners often use the product free. If they pay, the fee is treated as a discounted price for their feedback."
250
+ },
251
+ {
252
+ "id": "changes",
253
+ "type": "textarea",
254
+ "label": "Other Changes to Standard Terms",
255
+ "sub": "List specific changes to the Standard Terms",
256
+ "optional": true,
257
+ "ph": "Leave empty if you are not changing anything",
258
+ "help": "Anything you both agreed to change. The Cover Page wins over the Standard Terms."
259
+ }
260
+ ],
261
+ "closing": "Provider and Partner have not changed the Standard Terms except for the details on the Cover Page above. By signing this Cover Page, each party agrees to enter into this Agreement as of the Effective Date.",
262
+ "sign": [
263
+ "Signature",
264
+ "Print Name",
265
+ "Title",
266
+ "Notice Address",
267
+ "Date"
268
+ ]
269
+ }
270
+ ],
271
+ "publisher": "Common Paper, Inc.",
272
+ "licence": "CC BY 4.0",
273
+ "licenceUrl": "https://creativecommons.org/licenses/by/4.0/",
274
+ "licenceEvidence": "Checked on https://commonpaper.com/standards/design-partner-agreement/ on 2026-10-02: “Common Paper agreements are free to use and modify under CC BY 4.0.”",
275
+ "released": "2025-05-30",
276
+ "fetched": "2026-10-02",
277
+ "source": "https://commonpaper.com/standards/design-partner-agreement/1.3",
278
+ "textNote": "Standard Terms copied word for word from the source page; only whitespace was normalised.",
279
+ "sha256": "80c06bd5eacb22c7651978194ddce098fe86063c775360db5bb807ebc2e42bfe",
280
+ "terms": [
281
+ {
282
+ "n": "1.",
283
+ "l": 1,
284
+ "h": "Design Partner Overview"
285
+ },
286
+ {
287
+ "n": "1.1",
288
+ "l": 2,
289
+ "h3": "Product Access.",
290
+ "r": [
291
+ [
292
+ "v",
293
+ "Partner"
294
+ ],
295
+ " would like to be one of the first users of the Product. During the ",
296
+ [
297
+ "v",
298
+ "Term"
299
+ ],
300
+ ", ",
301
+ [
302
+ "v",
303
+ "Partner"
304
+ ],
305
+ " will have early access to the Product for its internal business purposes and to give Feedback to ",
306
+ [
307
+ "v",
308
+ "Provider"
309
+ ],
310
+ " and participate in the ",
311
+ [
312
+ "v",
313
+ "Program"
314
+ ],
315
+ ", so long as ",
316
+ [
317
+ "v",
318
+ "Partner"
319
+ ],
320
+ " complies with the terms of this Agreement."
321
+ ]
322
+ },
323
+ {
324
+ "n": "1.2",
325
+ "l": 2,
326
+ "h3": "Program and Feedback.",
327
+ "r": [
328
+ "The purpose of the ",
329
+ [
330
+ "v",
331
+ "Program"
332
+ ],
333
+ " is for ",
334
+ [
335
+ "v",
336
+ "Provider"
337
+ ],
338
+ " to develop, build, and improve the Product for general use by all of ",
339
+ [
340
+ "v",
341
+ "Provider’s"
342
+ ],
343
+ " customers or users. ",
344
+ [
345
+ "v",
346
+ "Partner"
347
+ ],
348
+ " will give Feedback to ",
349
+ [
350
+ "v",
351
+ "Provider"
352
+ ],
353
+ " on a mutually agreed schedule and will participate in the ",
354
+ [
355
+ "v",
356
+ "Program"
357
+ ],
358
+ "."
359
+ ]
360
+ },
361
+ {
362
+ "n": "1.3",
363
+ "l": 2,
364
+ "h3": "Product Improvement.",
365
+ "r": [
366
+ [
367
+ "v",
368
+ "Provider"
369
+ ],
370
+ " will develop and improve the Product and may use all Feedback and insight about the Product from the ",
371
+ [
372
+ "v",
373
+ "Program"
374
+ ],
375
+ " freely without any restriction or obligation. ",
376
+ [
377
+ "v",
378
+ "Partner"
379
+ ],
380
+ " will not give any Feedback that ",
381
+ [
382
+ "v",
383
+ "Provider"
384
+ ],
385
+ " cannot use in this manner or for the purpose."
386
+ ]
387
+ },
388
+ {
389
+ "n": "2.",
390
+ "l": 1,
391
+ "h": "Fees and Costs"
392
+ },
393
+ {
394
+ "n": "2.1",
395
+ "l": 2,
396
+ "r": [
397
+ [
398
+ "v",
399
+ "Partner"
400
+ ],
401
+ " will pay ",
402
+ [
403
+ "v",
404
+ "Provider"
405
+ ],
406
+ " the ",
407
+ [
408
+ "v",
409
+ "Fees"
410
+ ],
411
+ ", if any."
412
+ ]
413
+ },
414
+ {
415
+ "n": "3.",
416
+ "l": 1,
417
+ "h": "Term & Termination"
418
+ },
419
+ {
420
+ "n": "3.1",
421
+ "l": 2,
422
+ "h3": "Agreement Term.",
423
+ "r": [
424
+ "This Agreement will start on the ",
425
+ [
426
+ "v",
427
+ "Effective Date"
428
+ ],
429
+ " and continue for the ",
430
+ [
431
+ "v",
432
+ "Term"
433
+ ],
434
+ ". ",
435
+ [
436
+ "v",
437
+ "Provider"
438
+ ],
439
+ " and ",
440
+ [
441
+ "v",
442
+ "Partner"
443
+ ],
444
+ " may mutually agree to extend the ",
445
+ [
446
+ "v",
447
+ "Term"
448
+ ],
449
+ ", including by email communication."
450
+ ]
451
+ },
452
+ {
453
+ "n": "3.2",
454
+ "l": 2,
455
+ "h3": "Termination.",
456
+ "r": [
457
+ "Either party may terminate this Agreement for any or no reason. To terminate this Agreement, the terminating party must notify the other party about termination by giving the other party 30 days advance notice."
458
+ ]
459
+ },
460
+ {
461
+ "n": "3.3",
462
+ "l": 2,
463
+ "h3": "Effect of Termination.",
464
+ "r": [
465
+ "Upon expiration or termination of the Agreement:"
466
+ ]
467
+ },
468
+ {
469
+ "n": "(a)",
470
+ "l": 3,
471
+ "r": [
472
+ [
473
+ "v",
474
+ "Partner"
475
+ ],
476
+ " will no longer have any right to access or use the Product. ",
477
+ [
478
+ "v",
479
+ "Partner"
480
+ ],
481
+ " will no longer be required to provide Feedback or participate in the ",
482
+ [
483
+ "v",
484
+ "Program"
485
+ ],
486
+ " under the Agreement."
487
+ ]
488
+ },
489
+ {
490
+ "n": "(b)",
491
+ "l": 3,
492
+ "r": [
493
+ "Each Recipient will return or destroy Discloser’s Confidential Information in its possession or control."
494
+ ]
495
+ },
496
+ {
497
+ "n": "3.4",
498
+ "l": 2,
499
+ "h3": "Survival."
500
+ },
501
+ {
502
+ "n": "(a)",
503
+ "l": 3,
504
+ "r": [
505
+ "The following sections will survive expiration or termination of the Agreement: Section 1.3 (Product Improvement), Section 3.3 (Effect of Termination), Section 3.4 (Survival), Section 4 (Disclaimer of Warranties), Section 5 (Confidentiality), Section 6 (Intellectual Property), Section 7 (General Terms), Section 8 (Definitions), and the portions of a Cover Page referenced by these sections."
506
+ ]
507
+ },
508
+ {
509
+ "n": "(b)",
510
+ "l": 3,
511
+ "r": [
512
+ "Each Recipient may retain Discloser’s Confidential Information in accordance with its standard backup or record retention policies maintained in the ordinary course of business or as required by Applicable Laws, in which case Section 5 (Confidentiality) will continue to apply to retained Confidential Information."
513
+ ]
514
+ },
515
+ {
516
+ "n": "4.",
517
+ "l": 1,
518
+ "h": "Disclaimer of Warranties"
519
+ },
520
+ {
521
+ "n": "4.1",
522
+ "l": 2,
523
+ "r": [
524
+ [
525
+ "v",
526
+ "Provider"
527
+ ],
528
+ " and ",
529
+ [
530
+ "v",
531
+ "Partner"
532
+ ],
533
+ " each disclaim all warranties, whether express or implied, including the implied warranties of merchantability, fitness for a particular purpose, title, and non-infringement. These disclaimers apply to the maximum extent permitted by Applicable Laws."
534
+ ]
535
+ },
536
+ {
537
+ "n": "5.",
538
+ "l": 1,
539
+ "h": "Confidentiality"
540
+ },
541
+ {
542
+ "n": "5.1",
543
+ "l": 2,
544
+ "h3": "Non-Use and Non-Disclosure.",
545
+ "r": [
546
+ "Unless otherwise authorized in the Agreement, Recipient will (a) only use Discloser’s Confidential Information to fulfill its obligations or exercise its rights under this Agreement; and (b) not disclose Discloser’s Confidential Information to anyone else. In addition, Recipient will protect Discloser’s Confidential Information using at least the same protections Recipient uses for its own similar information but no less than a reasonable standard of care."
547
+ ]
548
+ },
549
+ {
550
+ "n": "5.2",
551
+ "l": 2,
552
+ "h3": "Exclusions.",
553
+ "r": [
554
+ "Confidential Information does not include information that (a) Recipient knew without any obligation of confidentiality before disclosure by Discloser; (b) is or becomes publicly known and generally available through no fault of Recipient; (c) Recipient receives under no obligation of confidentiality from someone else who is authorized to make the disclosure; or (d) Recipient independently developed without use of or reference to Discloser’s Confidential Information. In addition, Feedback does not constitute ",
555
+ [
556
+ "v",
557
+ "Partner’s"
558
+ ],
559
+ " Confidential Information and ",
560
+ [
561
+ "v",
562
+ "Provider"
563
+ ],
564
+ " may use ",
565
+ [
566
+ "v",
567
+ "Partner’s"
568
+ ],
569
+ " Confidential Information to provide the Product."
570
+ ]
571
+ },
572
+ {
573
+ "n": "5.3",
574
+ "l": 2,
575
+ "h3": "Required Disclosures.",
576
+ "r": [
577
+ "Recipient may disclose Discloser’s Confidential Information to the extent required by Applicable Laws if, unless prohibited by Applicable Laws, Recipient provides the Discloser reasonable advance notice of the required disclosure and reasonably cooperates, at the Discloser’s expense, with the Discloser’s efforts to obtain confidential treatment for the Confidential Information."
578
+ ]
579
+ },
580
+ {
581
+ "n": "5.4",
582
+ "l": 2,
583
+ "h3": "Permitted Disclosures.",
584
+ "r": [
585
+ "Recipient may disclose Discloser’s Confidential Information to Users, employees, advisors, contractors, and representatives who each have a need to know the Confidential Information, but only if the person or entity is bound by confidentiality obligations at least as protective as those in this Section 5 and Recipient remains responsible for everyone’s compliance with the terms of this Section 5."
586
+ ]
587
+ },
588
+ {
589
+ "n": "6.",
590
+ "l": 1,
591
+ "h": "Intellectual Property"
592
+ },
593
+ {
594
+ "n": "6.1",
595
+ "l": 2,
596
+ "h3": "Reservation of Rights.",
597
+ "r": [
598
+ "Except for the limited license to access the Product in Section 1.1 (Product Access), ",
599
+ [
600
+ "v",
601
+ "Provider"
602
+ ],
603
+ " retains all right, title, and interest in and to the Product, including any aspects, features, or functionality created in response to Feedback or ",
604
+ [
605
+ "v",
606
+ "Partner’s"
607
+ ],
608
+ " participation in the ",
609
+ [
610
+ "v",
611
+ "Program"
612
+ ],
613
+ ", whether developed before or after the ",
614
+ [
615
+ "v",
616
+ "Effective Date"
617
+ ],
618
+ ". Each Discloser retains all right, title, and interest in and to its Confidential Information."
619
+ ]
620
+ },
621
+ {
622
+ "n": "6.2",
623
+ "l": 2,
624
+ "h3": "Ownership.",
625
+ "r": [
626
+ [
627
+ "v",
628
+ "Provider"
629
+ ],
630
+ " owns all Feedback. ",
631
+ [
632
+ "v",
633
+ "Partner"
634
+ ],
635
+ " hereby assigns to ",
636
+ [
637
+ "v",
638
+ "Provider"
639
+ ],
640
+ " all its right, title, and interest in and to Feedback and will reasonably cooperate with Provider as needed to establish, prove, or defend ",
641
+ [
642
+ "v",
643
+ "Provider’s"
644
+ ],
645
+ " ownership of Feedback."
646
+ ]
647
+ },
648
+ {
649
+ "n": "7.",
650
+ "l": 1,
651
+ "h": "General Terms"
652
+ },
653
+ {
654
+ "n": "7.1",
655
+ "l": 2,
656
+ "h3": "Entire Agreement.",
657
+ "r": [
658
+ "This Agreement is the only agreement between the parties about its subject and this Agreement supersedes all prior or contemporaneous statements (whether in writing or not) about its subject."
659
+ ]
660
+ },
661
+ {
662
+ "n": "7.2",
663
+ "l": 2,
664
+ "h3": "Modifications, Severability, and Waiver.",
665
+ "r": [
666
+ "Any waiver, modification, or change to the Agreement must be in writing and signed or electronically accepted by each party. If any term of this Agreement is determined to be invalid or unenforceable by a relevant court or governing body, the remaining terms of this Agreement will remain in full force and effect. The failure of a party to enforce a term or to exercise an option or right in this Agreement will not constitute a waiver by that party of the term, option, or right."
667
+ ]
668
+ },
669
+ {
670
+ "n": "7.3",
671
+ "l": 2,
672
+ "h3": "Governing Law and Chosen Courts.",
673
+ "r": [
674
+ "The ",
675
+ [
676
+ "v",
677
+ "Governing Law"
678
+ ],
679
+ " will govern all interpretations and disputes about this Agreement, without regard to its conflict of laws provisions. The parties will bring any legal suit, action, or proceeding about this Agreement in the ",
680
+ [
681
+ "v",
682
+ "Chosen Courts"
683
+ ],
684
+ " and each party irrevocably submits to the exclusive jurisdiction of the ",
685
+ [
686
+ "v",
687
+ "Chosen Courts"
688
+ ],
689
+ "."
690
+ ]
691
+ },
692
+ {
693
+ "n": "7.4",
694
+ "l": 2,
695
+ "h3": "Injunctive Relief.",
696
+ "r": [
697
+ "Despite Section 7.3 (Governing Law and Chosen Courts), a breach of Section 5 (Confidentiality) or the violation of a party’s intellectual property rights may cause irreparable harm for which monetary damages cannot adequately compensate. As a result, upon the actual or threatened breach of Section 5 (Confidentiality) or violation of a party’s intellectual property rights, the non-breaching or non-violating party may seek appropriate equitable relief, including an injunction, in any court of competent jurisdiction without the need to post a bond and without limiting its other rights or remedies."
698
+ ]
699
+ },
700
+ {
701
+ "n": "7.5",
702
+ "l": 2,
703
+ "h3": "Restrictions.",
704
+ "r": [
705
+ "Except as expressly permitted by this Agreement, ",
706
+ [
707
+ "v",
708
+ "Partner"
709
+ ],
710
+ " will not (and will not allow anyone else to): (a) reverse engineer, decompile, or attempt to discover any source code or underlying ideas or algorithms of the Product (except to the extent Applicable Laws prohibit this restriction); (b) provide, sell, transfer, sublicense, lend, distribute, rent, or otherwise allow others to access or use the Product; (c) remove any proprietary notices or labels; (d) copy, modify, or create derivative works of the Product; (e) conduct security or vulnerability tests on, interfere with the operation of, cause performance degradation of, or circumvent access restrictions of the Product; (f) access accounts, information, data, or portions of the Product to which ",
711
+ [
712
+ "v",
713
+ "Partner"
714
+ ],
715
+ " does not have explicit authorization; (g) use the Product to develop a competing service or product; (h) use the Product with activity prohibited by Applicable Laws; (i) use the Product to obtain unauthorized access to anyone else’s networks or equipment; or (j) upload, submit, or otherwise make available to the Product any information or content to which ",
716
+ [
717
+ "v",
718
+ "Partner"
719
+ ],
720
+ " does not have the proper rights."
721
+ ]
722
+ },
723
+ {
724
+ "n": "7.6",
725
+ "l": 2,
726
+ "h3": "Non-Exhaustive Remedies.",
727
+ "r": [
728
+ "Except where the Agreement provides for an exclusive remedy, seeking or exercising a remedy does not limit the other rights or remedies available to a party."
729
+ ]
730
+ },
731
+ {
732
+ "n": "7.7",
733
+ "l": 2,
734
+ "h3": "Assignment.",
735
+ "r": [
736
+ "Neither party may assign any rights or obligations under this Agreement without the prior written consent of the other party. However, either party may assign this Agreement upon notice if the assigning party undergoes a merger, change of control, reorganization, or sale of all or substantially all its equity, business, or assets to which this Agreement relates. Any attempted but non-permitted assignment is void. This Agreement will be binding upon and inure to the benefit of the parties and their permitted successors and assigns."
737
+ ]
738
+ },
739
+ {
740
+ "n": "7.8",
741
+ "l": 2,
742
+ "h3": "Notices.",
743
+ "r": [
744
+ "Any notice, request, or approval about the Agreement must be in writing and sent to the ",
745
+ [
746
+ "v",
747
+ "Notice Address"
748
+ ],
749
+ ". Notices will be deemed given (a) upon confirmed delivery if by email, registered or certified mail, or personal delivery; or (b) two days after mailing if by overnight commercial delivery."
750
+ ]
751
+ },
752
+ {
753
+ "n": "7.9",
754
+ "l": 2,
755
+ "h3": "Independent Contractors.",
756
+ "r": [
757
+ "The parties are independent contractors, not agents, partners, or joint venturers. Neither party is authorized to bind the other to any liability or obligation."
758
+ ]
759
+ },
760
+ {
761
+ "n": "7.10",
762
+ "l": 2,
763
+ "h3": "No Third-Party Beneficiary.",
764
+ "r": [
765
+ "There are no third-party beneficiaries of this Agreement."
766
+ ]
767
+ },
768
+ {
769
+ "n": "7.11",
770
+ "l": 2,
771
+ "h3": "Titles and Interpretation.",
772
+ "r": [
773
+ "Section titles are for convenience and reference only. All uses of “including” and similar phrases are non-exhaustive and without limitation. The United Nations Convention for the International Sale of Goods and the Uniform Computer Information Transaction Act do not apply to this Agreement."
774
+ ]
775
+ },
776
+ {
777
+ "n": "7.12",
778
+ "l": 2,
779
+ "h3": "Signature.",
780
+ "r": [
781
+ "This Agreement may be signed in counterparts, including by electronic copies or acceptance mechanism. Each copy will be deemed an original and all copies, when taken together, will be the same agreement."
782
+ ]
783
+ },
784
+ {
785
+ "n": "8.",
786
+ "l": 1,
787
+ "h": "Definitions"
788
+ },
789
+ {
790
+ "n": "8.1",
791
+ "l": 2,
792
+ "r": [
793
+ [
794
+ "b",
795
+ "“Agreement”"
796
+ ],
797
+ " means these Standard Terms, the Cover Page between ",
798
+ [
799
+ "v",
800
+ "Provider"
801
+ ],
802
+ " and ",
803
+ [
804
+ "v",
805
+ "Partner"
806
+ ],
807
+ ", and the policies and documents referenced in or attached to the Cover Page."
808
+ ]
809
+ },
810
+ {
811
+ "n": "8.2",
812
+ "l": 2,
813
+ "r": [
814
+ [
815
+ "b",
816
+ "“Applicable Laws”"
817
+ ],
818
+ " means the laws, rules, regulations, court orders, and other binding requirements of a relevant government authority that apply to or govern ",
819
+ [
820
+ "v",
821
+ "Provider"
822
+ ],
823
+ " or ",
824
+ [
825
+ "v",
826
+ "Partner"
827
+ ],
828
+ "."
829
+ ]
830
+ },
831
+ {
832
+ "n": "8.3",
833
+ "l": 2,
834
+ "r": [
835
+ [
836
+ "b",
837
+ "“Confidential Information”"
838
+ ],
839
+ " means information in any form disclosed by or on behalf of a Discloser, including before the ",
840
+ [
841
+ "v",
842
+ "Effective Date"
843
+ ],
844
+ ", to a Recipient in connection with this Agreement that (a) the Discloser identifies as “confidential”, “proprietary”, or the like; or (b) should be reasonably understood as confidential or proprietary due to its nature and the circumstances of its disclosure. Confidential Information includes the existence of this Agreement and the information on each Cover Page. ",
845
+ [
846
+ "v",
847
+ "Provider’s"
848
+ ],
849
+ " Confidential Information includes non-public information about the Product."
850
+ ]
851
+ },
852
+ {
853
+ "n": "8.4",
854
+ "l": 2,
855
+ "r": [
856
+ [
857
+ "b",
858
+ "“Cover Page”"
859
+ ],
860
+ " means a document that is signed or electronically accepted by the parties that incorporates these Standard Terms and identifies ",
861
+ [
862
+ "v",
863
+ "Provider"
864
+ ],
865
+ " and ",
866
+ [
867
+ "v",
868
+ "Partner"
869
+ ],
870
+ "."
871
+ ]
872
+ },
873
+ {
874
+ "n": "8.5",
875
+ "l": 2,
876
+ "r": [
877
+ [
878
+ "b",
879
+ "“Discloser”"
880
+ ],
881
+ " means a party to this Agreement when the party is providing or disclosing Confidential Information to the other party."
882
+ ]
883
+ },
884
+ {
885
+ "n": "8.6",
886
+ "l": 2,
887
+ "r": [
888
+ [
889
+ "b",
890
+ "“Feedback”"
891
+ ],
892
+ " means suggestions, feedback, or comments about the Product or related offerings."
893
+ ]
894
+ },
895
+ {
896
+ "n": "8.7",
897
+ "l": 2,
898
+ "r": [
899
+ [
900
+ "b",
901
+ "“Product”"
902
+ ],
903
+ " means the product or services described in the Cover Page."
904
+ ]
905
+ },
906
+ {
907
+ "n": "8.8",
908
+ "l": 2,
909
+ "r": [
910
+ [
911
+ "b",
912
+ "“Recipient”"
913
+ ],
914
+ " means a party to this Agreement when the party receives Confidential Information from the other party."
915
+ ]
916
+ }
917
+ ]
918
+ }
pactsprig/templates/index.json ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "id": "mnda",
4
+ "name": "Mutual Non-Disclosure Agreement",
5
+ "short": "Mutual NDA",
6
+ "version": "1.0",
7
+ "free": true,
8
+ "blurb": "Both sides protect each other’s confidential information. Use it before sharing pricing, plans, customer lists or code with a prospect, partner or supplier.",
9
+ "parties": [
10
+ "Party 1",
11
+ "Party 2"
12
+ ]
13
+ },
14
+ {
15
+ "id": "psa",
16
+ "name": "Professional Services Agreement",
17
+ "short": "Professional Services",
18
+ "version": "1.1",
19
+ "free": false,
20
+ "blurb": "For consultants, agencies and freelancers doing project work: Key Terms (law, liability, insurance) plus a Statement of Work (services, deliverables, fees, dates).",
21
+ "parties": [
22
+ "Provider",
23
+ "Customer"
24
+ ]
25
+ },
26
+ {
27
+ "id": "design-partner",
28
+ "name": "Design Partner Agreement",
29
+ "short": "Design Partner",
30
+ "version": "1.3",
31
+ "free": false,
32
+ "blurb": "For startups giving an early customer access to a product in exchange for feedback, before a full commercial contract.",
33
+ "parties": [
34
+ "Provider",
35
+ "Partner"
36
+ ]
37
+ }
38
+ ]
pactsprig/templates/mnda.json ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "mnda",
3
+ "name": "Mutual Non-Disclosure Agreement",
4
+ "short": "Mutual NDA",
5
+ "version": "1.0",
6
+ "free": true,
7
+ "termsUrl": "https://commonpaper.com/standards/mutual-nda/1.0",
8
+ "aboutUrl": "https://commonpaper.com/standards/mutual-nda/",
9
+ "attribution": "Common Paper Mutual Non-Disclosure Agreement (Version 1.0) free to use under CC BY 4.0.",
10
+ "parties": [
11
+ "Party 1",
12
+ "Party 2"
13
+ ],
14
+ "partyRoles": [
15
+ "Party 1",
16
+ "Party 2"
17
+ ],
18
+ "blurb": "Both sides protect each other’s confidential information. Use it before sharing pricing, plans, customer lists or code with a prospect, partner or supplier.",
19
+ "cover": [
20
+ {
21
+ "id": "mnda",
22
+ "title": "Mutual Non-Disclosure Agreement",
23
+ "intro": "This Mutual Non-Disclosure Agreement (the “MNDA”) consists of: (1) this Cover Page (“Cover Page”) and (2) the Common Paper Mutual NDA Standard Terms Version 1.0 (“Standard Terms”) posted at commonpaper.com/standards/mutual-nda/1.0. Any modifications of the Standard Terms should be made on the Cover Page, which will control over conflicts with the Standard Terms.",
24
+ "rows": [
25
+ {
26
+ "id": "purpose",
27
+ "type": "textarea",
28
+ "label": "Purpose",
29
+ "sub": "How Confidential Information may be used",
30
+ "d": "Evaluating whether to enter into a business relationship with the other party.",
31
+ "help": "Why you are sharing secrets. The other side may only use your information for this. Keep it broad (“exploring a partnership”) or narrow (“reviewing our security documents for vendor approval”)."
32
+ },
33
+ {
34
+ "id": "effective",
35
+ "type": "choice",
36
+ "label": "Effective Date",
37
+ "d": "date",
38
+ "options": [
39
+ {
40
+ "id": "date",
41
+ "t": "{date}",
42
+ "in": {
43
+ "date": {
44
+ "k": "date",
45
+ "d": "@today"
46
+ }
47
+ }
48
+ },
49
+ {
50
+ "id": "sig",
51
+ "t": "Date of last Cover Page signature"
52
+ }
53
+ ],
54
+ "help": "When the NDA starts. Most people use today’s date or the day the second person signs. A date in the past can cover things you have already shared."
55
+ },
56
+ {
57
+ "id": "term",
58
+ "type": "choice",
59
+ "label": "MNDA Term",
60
+ "sub": "Period for sharing Confidential Information",
61
+ "d": "fixed",
62
+ "options": [
63
+ {
64
+ "id": "fixed",
65
+ "t": "Expires {years} year(s) from Effective Date.",
66
+ "in": {
67
+ "years": {
68
+ "k": "num",
69
+ "d": "1",
70
+ "w": 3
71
+ }
72
+ }
73
+ },
74
+ {
75
+ "id": "open",
76
+ "t": "Continues until terminated in accordance with the terms of the MNDA."
77
+ }
78
+ ],
79
+ "help": "The window in which new information is covered. One year is the most common choice. Either side can still end the NDA early with written notice."
80
+ },
81
+ {
82
+ "id": "conf",
83
+ "type": "choice",
84
+ "label": "Term of Confidentiality",
85
+ "sub": "How long Confidential Information is protected",
86
+ "d": "fixed",
87
+ "options": [
88
+ {
89
+ "id": "fixed",
90
+ "t": "{years} year(s) from {from}, but in the case of trade secrets, until Confidential Information is no longer considered a trade secret under applicable laws.",
91
+ "in": {
92
+ "years": {
93
+ "k": "num",
94
+ "d": "2",
95
+ "w": 3
96
+ },
97
+ "from": {
98
+ "k": "sel",
99
+ "o": [
100
+ "Effective Date",
101
+ "the date of last disclosure"
102
+ ],
103
+ "d": "Effective Date"
104
+ }
105
+ }
106
+ },
107
+ {
108
+ "id": "forever",
109
+ "t": "In perpetuity."
110
+ }
111
+ ],
112
+ "help": "How long each side must keep the other’s information secret. This is separate from the MNDA Term and lasts even if the NDA ends early. Trade secrets stay protected for as long as they remain trade secrets."
113
+ },
114
+ {
115
+ "id": "law",
116
+ "type": "line",
117
+ "label": "Governing Law",
118
+ "t": "The laws of the State of {state}.",
119
+ "in": {
120
+ "state": {
121
+ "k": "text",
122
+ "ph": "e.g. Delaware",
123
+ "d": "",
124
+ "w": 16
125
+ }
126
+ },
127
+ "help": "Which state’s law decides how the NDA is read. The Standard Terms are written for a US state; pick the one you and the other party agree on (often where one of you is based)."
128
+ },
129
+ {
130
+ "id": "court",
131
+ "type": "line",
132
+ "label": "Jurisdiction",
133
+ "t": "The state and federal courts located in {place}.",
134
+ "in": {
135
+ "place": {
136
+ "k": "text",
137
+ "ph": "e.g. New Castle County, Delaware",
138
+ "d": "",
139
+ "w": 22
140
+ }
141
+ },
142
+ "help": "Where any dispute would be filed. Usually the same state as the governing law, often a named county or city."
143
+ },
144
+ {
145
+ "id": "changes",
146
+ "type": "textarea",
147
+ "label": "Changes to Standard Terms",
148
+ "sub": "List specific changes to the Standard Terms",
149
+ "empty": "None.",
150
+ "ph": "Leave empty if you are not changing anything",
151
+ "help": "The Standard Terms are never edited directly. If you both agree to change something, write it here; the Cover Page wins over the Standard Terms."
152
+ }
153
+ ],
154
+ "closing": "Neither party has changed the Standard Terms, except for the details on the Cover Page above. By signing this Cover Page, each party agrees to enter into this MNDA as of the Effective Date.",
155
+ "sign": [
156
+ "Signature",
157
+ "Print Name",
158
+ "Title",
159
+ "Company",
160
+ "Notice Address",
161
+ "Date"
162
+ ]
163
+ }
164
+ ],
165
+ "publisher": "Common Paper, Inc.",
166
+ "licence": "CC BY 4.0",
167
+ "licenceUrl": "https://creativecommons.org/licenses/by/4.0/",
168
+ "licenceEvidence": "Checked on https://commonpaper.com/standards/mutual-nda/ on 2026-10-02: “Common Paper agreements are free to use and modify under CC BY 4.0.”",
169
+ "released": "2021-07-19",
170
+ "fetched": "2026-10-02",
171
+ "source": "https://commonpaper.com/standards/mutual-nda/1.0",
172
+ "textNote": "Standard Terms copied word for word from the source page; only whitespace was normalised.",
173
+ "sha256": "6e13584707766f3d0df80cf8aba5b99497a5fd1d5370f2abcdbb23f25ec25c51",
174
+ "terms": [
175
+ {
176
+ "n": "1.",
177
+ "l": 1,
178
+ "h": "Introduction",
179
+ "r": [
180
+ "This Mutual Non-Disclosure Agreement (which incorporates these Standard Terms and the Cover Page (defined below)) (“",
181
+ [
182
+ "b",
183
+ "MNDA"
184
+ ],
185
+ "”) allows each party (“",
186
+ [
187
+ "b",
188
+ "Disclosing Party"
189
+ ],
190
+ "”) to disclose or make available information in connection with the ",
191
+ [
192
+ "v",
193
+ "Purpose"
194
+ ],
195
+ " which (1) the Disclosing Party identifies to the receiving party (“",
196
+ [
197
+ "b",
198
+ "Receiving Party"
199
+ ],
200
+ "”) as “confidential”, “proprietary”, or the like or (2) should be reasonably understood as confidential or proprietary due to its nature and the circumstances of its disclosure (“",
201
+ [
202
+ "b",
203
+ "Confidential Information"
204
+ ],
205
+ "”). Each party’s Confidential Information also includes the existence and status of the parties’ discussions and information on the Cover Page. Confidential Information includes technical or business information, product designs or roadmaps, requirements, pricing, security and compliance documentation, technology, inventions and know-how. To use this MNDA, the parties must complete and sign a cover page incorporating these Standard Terms (“",
206
+ [
207
+ "b",
208
+ "Cover Page"
209
+ ],
210
+ "”). Each party is identified on the Cover Page and capitalized terms have the meanings given herein or on the Cover Page."
211
+ ]
212
+ },
213
+ {
214
+ "n": "2.",
215
+ "l": 1,
216
+ "h": "Use and Protection of Confidential Information",
217
+ "r": [
218
+ "The Receiving Party shall: (a) use Confidential Information solely for the ",
219
+ [
220
+ "v",
221
+ "Purpose"
222
+ ],
223
+ "; (b) not disclose Confidential Information to third parties without the Disclosing Party’s prior written approval, except that the Receiving Party may disclose Confidential Information to its employees, agents, advisors, contractors and other representatives having a reasonable need to know for the ",
224
+ [
225
+ "v",
226
+ "Purpose"
227
+ ],
228
+ ", provided these representatives are bound by confidentiality obligations no less protective than the applicable terms in this MNDA and the Receiving Party remains responsible for their compliance with this MNDA; and (c) protect Confidential Information using at least the same protections the Receiving Party uses for its own similar information but no less than a reasonable standard of care."
229
+ ]
230
+ },
231
+ {
232
+ "n": "3.",
233
+ "l": 1,
234
+ "h": "Exceptions",
235
+ "r": [
236
+ "The Receiving Party’s obligations in this MNDA do not apply to information that it can demonstrate: (a) is or becomes publicly available through no fault of the Receiving Party; (b) it rightfully knew or possessed prior to receipt from the Disclosing Party without confidentiality restrictions; (c) it rightfully obtained from a third party without confidentiality restrictions; or (d) it independently developed without using or referencing the Confidential Information."
237
+ ]
238
+ },
239
+ {
240
+ "n": "4.",
241
+ "l": 1,
242
+ "h": "Disclosures Required by Law",
243
+ "r": [
244
+ "The Receiving Party may disclose Confidential Information to the extent required by law, regulation or regulatory authority, subpoena or court order, provided (to the extent legally permitted) it provides the Disclosing Party reasonable advance notice of the required disclosure and reasonably cooperates, at the Disclosing Party’s expense, with the Disclosing Party’s efforts to obtain confidential treatment for the Confidential Information."
245
+ ]
246
+ },
247
+ {
248
+ "n": "5.",
249
+ "l": 1,
250
+ "h": "Term and Termination",
251
+ "r": [
252
+ "This MNDA commences on the ",
253
+ [
254
+ "v",
255
+ "Effective Date"
256
+ ],
257
+ " and expires at the end of the ",
258
+ [
259
+ "v",
260
+ "MNDA Term"
261
+ ],
262
+ ". Either party may terminate this MNDA for any or no reason upon written notice to the other party. The Receiving Party’s obligations relating to Confidential Information will survive for the ",
263
+ [
264
+ "v",
265
+ "Term of Confidentiality"
266
+ ],
267
+ ", despite any expiration or termination of this MNDA."
268
+ ]
269
+ },
270
+ {
271
+ "n": "6.",
272
+ "l": 1,
273
+ "h": "Return or Destruction of Confidential Information",
274
+ "r": [
275
+ "Upon expiration or termination of this MNDA or upon the Disclosing Party’s earlier request, the Receiving Party will: (a) cease using Confidential Information; (b) promptly after the Disclosing Party’s written request, destroy all Confidential Information in the Receiving Party’s possession or control or return it to the Disclosing Party; and (c) if requested by the Disclosing Party, confirm its compliance with these obligations in writing. As an exception to subsection (b), the Receiving Party may retain Confidential Information in accordance with its standard backup or record retention policies or as required by law, but the terms of this MNDA will continue to apply to the retained Confidential Information."
276
+ ]
277
+ },
278
+ {
279
+ "n": "7.",
280
+ "l": 1,
281
+ "h": "Proprietary Rights",
282
+ "r": [
283
+ "The Disclosing Party retains all of its intellectual property and other rights in its Confidential Information and its disclosure to the Receiving Party grants no license under such rights."
284
+ ]
285
+ },
286
+ {
287
+ "n": "8.",
288
+ "l": 1,
289
+ "h": "Disclaimer",
290
+ "r": [
291
+ "ALL CONFIDENTIAL INFORMATION IS PROVIDED “AS IS”, WITH ALL FAULTS, AND WITHOUT WARRANTIES, INCLUDING THE IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE."
292
+ ]
293
+ },
294
+ {
295
+ "n": "9.",
296
+ "l": 1,
297
+ "h": "Governing Law and Jurisdiction",
298
+ "r": [
299
+ "This MNDA and all matters relating hereto are governed by, and construed in accordance with, the laws of the State of ",
300
+ [
301
+ "v",
302
+ "Governing Law"
303
+ ],
304
+ ", without regard to the conflict of laws provisions of such ",
305
+ [
306
+ "v",
307
+ "Governing Law"
308
+ ],
309
+ ". Any legal suit, action, or proceeding relating to this MNDA must be instituted in the federal or state courts located in ",
310
+ [
311
+ "v",
312
+ "Jurisdiction"
313
+ ],
314
+ ". Each party irrevocably submits to the exclusive jurisdiction of such ",
315
+ [
316
+ "v",
317
+ "Jurisdiction"
318
+ ],
319
+ " in any such suit, action, or proceeding."
320
+ ]
321
+ },
322
+ {
323
+ "n": "10.",
324
+ "l": 1,
325
+ "h": "Equitable Relief",
326
+ "r": [
327
+ "A breach of this MNDA may cause irreparable harm for which monetary damages are an insufficient remedy. Upon a breach of this MNDA, the Disclosing Party is entitled to seek appropriate equitable relief, including an injunction, in addition to its other remedies."
328
+ ]
329
+ },
330
+ {
331
+ "n": "11.",
332
+ "l": 1,
333
+ "h": "General",
334
+ "r": [
335
+ "Neither party has an obligation under this MNDA to disclose Confidential Information to the other or proceed with any proposed transaction. Neither party may assign this MNDA without the prior written consent of the other party, except that either party may assign this MNDA in connection with a merger, reorganization, acquisition or other transfer of all or substantially all its assets or voting securities. Any assignment in violation of this Section is null and void. This MNDA will bind and inure to the benefit of each party’s permitted successors and assigns. Waivers must be signed by the waiving party’s authorized representative and cannot be implied from conduct. If any provision of this MNDA is held unenforceable, it will be limited to the minimum extent necessary so the rest of this MNDA remains in effect. This MNDA (including the Cover Page) constitutes the entire agreement of the parties with respect to its subject matter, and supersedes all prior and contemporaneous understandings, agreements, representations, and warranties, whether written or oral, regarding such subject matter. This MNDA may only be amended, modified, waived, or supplemented by an agreement in writing signed by both parties. Notices, requests and approvals under this MNDA must be sent in writing to the email or postal addresses on the Cover Page and are deemed delivered on receipt. This MNDA may be executed in counterparts, including electronic copies, each of which is deemed an original and which together form the same agreement."
336
+ ]
337
+ }
338
+ ]
339
+ }
pactsprig/templates/psa.json ADDED
@@ -0,0 +1,2876 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "psa",
3
+ "name": "Professional Services Agreement",
4
+ "short": "Professional Services",
5
+ "version": "1.1",
6
+ "free": false,
7
+ "termsUrl": "https://commonpaper.com/standards/professional-services-agreement/1.1",
8
+ "aboutUrl": "https://commonpaper.com/standards/professional-services-agreement/",
9
+ "attribution": "Common Paper Professional Services Agreement (Version 1.1) free to use under CC BY 4.0.",
10
+ "parties": [
11
+ "Provider",
12
+ "Customer"
13
+ ],
14
+ "partyRoles": [
15
+ "Provider",
16
+ "Customer"
17
+ ],
18
+ "blurb": "For consultants, agencies and freelancers doing project work: Key Terms (law, liability, insurance) plus a Statement of Work (services, deliverables, fees, dates).",
19
+ "cover": [
20
+ {
21
+ "id": "keyterms",
22
+ "title": "Professional Services Agreement",
23
+ "kicker": "Key Terms",
24
+ "intro": "This Agreement has 2 parts: (1) the Key Terms on this Cover Page and (2) the Common Paper Professional Services Standard Terms Version 1.1 posted at commonpaper.com/standards/professional-services-agreement/1.1 (“Standard Terms”), which is incorporated by reference. If there is any inconsistency between the parts of the Agreement, the Cover Page will control over the Standard Terms. Capitalized and highlighted words have the meanings given on the Cover Page. However, if the Cover Page omits or does not define a highlighted word, the default meaning will be “none” or “not applicable” and the correlating clause, sentence, or section does not apply to this Agreement. All other capitalized words have the meanings given in the Standard Terms.",
25
+ "lead": "The key legal terms of this Agreement are as follows:",
26
+ "rows": [
27
+ {
28
+ "id": "effective",
29
+ "type": "choice",
30
+ "label": "Effective Date",
31
+ "sub": "The date the Agreement starts",
32
+ "d": "sig",
33
+ "options": [
34
+ {
35
+ "id": "sig",
36
+ "t": "Date of last signature on this Cover Page"
37
+ },
38
+ {
39
+ "id": "date",
40
+ "t": "{date}",
41
+ "in": {
42
+ "date": {
43
+ "k": "date",
44
+ "d": "@today"
45
+ }
46
+ }
47
+ }
48
+ ],
49
+ "help": "When the overall agreement starts. Each SOW below has its own start date."
50
+ },
51
+ {
52
+ "id": "law",
53
+ "type": "line",
54
+ "label": "Governing Law",
55
+ "t": "The laws of {state}",
56
+ "in": {
57
+ "state": {
58
+ "k": "text",
59
+ "ph": "state and/or country",
60
+ "d": "",
61
+ "w": 18
62
+ }
63
+ },
64
+ "help": "Which law decides how the agreement is read, for example “the State of New York” or “England and Wales”."
65
+ },
66
+ {
67
+ "id": "court",
68
+ "type": "line",
69
+ "label": "Chosen Courts",
70
+ "sub": "Jurisdiction or where disputes are filed",
71
+ "t": "The courts (whether state, federal, or otherwise) located in {place}",
72
+ "in": {
73
+ "place": {
74
+ "k": "text",
75
+ "ph": "state and/or county",
76
+ "d": "",
77
+ "w": 18
78
+ }
79
+ },
80
+ "help": "Where a dispute would be heard. Usually matches the governing law."
81
+ },
82
+ {
83
+ "id": "covered",
84
+ "type": "checks",
85
+ "label": "Covered Claims",
86
+ "sub": "Claims covered by indemnity obligations",
87
+ "optional": true,
88
+ "options": [
89
+ {
90
+ "id": "provider",
91
+ "t": "Provider Covered Claims: Any action, suit, proceeding, or claim that {text}",
92
+ "in": {
93
+ "text": {
94
+ "k": "area",
95
+ "d": "(a) the Deliverables (excluding any Customer Materials and Third-Party Materials procured by Customer), when used by Customer according to the terms of the SOW and the Agreement, violate, misappropriate, or otherwise infringe upon anyone else’s intellectual property or other proprietary rights; (b) Provider's employees or Subcontractors are deemed to be Customer's employees because of Provider's actions or omissions; or (c) arises out of Provider’s gross negligence, fraud, or willful misconduct."
96
+ }
97
+ }
98
+ },
99
+ {
100
+ "id": "customer",
101
+ "t": "Customer Covered Claims: Any action, suit, proceeding, or claim that {text}",
102
+ "in": {
103
+ "text": {
104
+ "k": "area",
105
+ "d": "(a) Customer Materials or Third-Party Materials procured by Customer, when used by Provider according to the terms of the SOW and the Agreement, violate, misappropriate, or otherwise infringe upon anyone else’s intellectual property or other proprietary rights; or (b) arises out of Customer’s gross negligence, fraud, or willful misconduct."
106
+ }
107
+ }
108
+ }
109
+ ],
110
+ "d": {
111
+ "provider": true,
112
+ "customer": true
113
+ },
114
+ "help": "Indemnity: who protects whom if a third party sues. The suggested wording is Common Paper’s; untick a side to leave it out."
115
+ },
116
+ {
117
+ "id": "cap",
118
+ "type": "choice",
119
+ "label": "General Cap Amount",
120
+ "sub": "Limitation of liability amount for most claims",
121
+ "optional": true,
122
+ "d": "mult",
123
+ "options": [
124
+ {
125
+ "id": "mult",
126
+ "t": "{x}x the fees paid or payable by Customer to Provider in the 12 month period immediately before the claim.",
127
+ "in": {
128
+ "x": {
129
+ "k": "num",
130
+ "d": "1",
131
+ "w": 3
132
+ }
133
+ }
134
+ },
135
+ {
136
+ "id": "fixed",
137
+ "t": "${amount}",
138
+ "in": {
139
+ "amount": {
140
+ "k": "text",
141
+ "ph": "e.g. 50,000",
142
+ "d": "",
143
+ "w": 10
144
+ }
145
+ }
146
+ },
147
+ {
148
+ "id": "greater",
149
+ "t": "The greater of ${amount} or {x}x the fees paid or payable by Customer to Provider in the 12 month period immediately before the claim.",
150
+ "in": {
151
+ "amount": {
152
+ "k": "text",
153
+ "ph": "e.g. 50,000",
154
+ "d": "",
155
+ "w": 10
156
+ },
157
+ "x": {
158
+ "k": "num",
159
+ "d": "1",
160
+ "w": 3
161
+ }
162
+ }
163
+ }
164
+ ],
165
+ "help": "The most either side can owe for most claims. “1x the fees from the last 12 months” is a common middle ground. Choose “None” and the agreement has no cap."
166
+ },
167
+ {
168
+ "id": "increased",
169
+ "type": "checks",
170
+ "label": "Increased Claims",
171
+ "sub": "Specific claims covered by the Increased Cap Amount",
172
+ "optional": true,
173
+ "options": [
174
+ {
175
+ "id": "sec3",
176
+ "t": "Breach of Section 3 (Privacy & Security)"
177
+ },
178
+ {
179
+ "id": "sec11",
180
+ "t": "Breach of Section 11 (Confidentiality) (however, excluding any breach of Section 3 (Privacy & Security))"
181
+ },
182
+ {
183
+ "id": "indem",
184
+ "t": "An Indemnifying Party’s indemnification obligations for its Covered Claims"
185
+ },
186
+ {
187
+ "id": "sec3gn",
188
+ "t": "Breach of Section 3 (Privacy & Security) resulting from gross negligence or willful misconduct"
189
+ },
190
+ {
191
+ "id": "sec11gn",
192
+ "t": "Breach of Section 11 (Confidentiality) resulting from gross negligence or willful misconduct (however, excluding any breach of Section 3 (Privacy & Security))"
193
+ },
194
+ {
195
+ "id": "gn",
196
+ "t": "Claims resulting from a party's gross negligence or willful misconduct"
197
+ },
198
+ {
199
+ "id": "other",
200
+ "t": "Other: {text}",
201
+ "in": {
202
+ "text": {
203
+ "k": "text",
204
+ "ph": "describe",
205
+ "d": "",
206
+ "w": 20
207
+ }
208
+ }
209
+ }
210
+ ],
211
+ "help": "Claims serious enough to get a higher cap (a “supercap”), such as data breaches. Leave all unticked if you do not need one."
212
+ },
213
+ {
214
+ "id": "supercap",
215
+ "type": "choice",
216
+ "label": "Increased Cap Amount",
217
+ "sub": "Higher limitation of liability amount for Increased Claims, often called a supercap",
218
+ "optional": true,
219
+ "d": "",
220
+ "options": [
221
+ {
222
+ "id": "mult",
223
+ "t": "{x}x the fees paid or payable by Customer to Provider in the 12 month period immediately before the claim.",
224
+ "in": {
225
+ "x": {
226
+ "k": "num",
227
+ "d": "2",
228
+ "w": 3
229
+ }
230
+ }
231
+ },
232
+ {
233
+ "id": "fixed",
234
+ "t": "${amount}",
235
+ "in": {
236
+ "amount": {
237
+ "k": "text",
238
+ "ph": "e.g. 50,000",
239
+ "d": "",
240
+ "w": 10
241
+ }
242
+ }
243
+ },
244
+ {
245
+ "id": "greater",
246
+ "t": "The greater of ${amount} or {x}x the fees paid or payable by Customer to Provider in the 12 month period immediately before the claim.",
247
+ "in": {
248
+ "amount": {
249
+ "k": "text",
250
+ "ph": "e.g. 50,000",
251
+ "d": "",
252
+ "w": 10
253
+ },
254
+ "x": {
255
+ "k": "num",
256
+ "d": "2",
257
+ "w": 3
258
+ }
259
+ }
260
+ }
261
+ ],
262
+ "help": "The higher cap for the Increased Claims above. Only needed if you ticked some."
263
+ },
264
+ {
265
+ "id": "unlimited",
266
+ "type": "checks",
267
+ "label": "Unlimited Claims",
268
+ "sub": "Claims excluded from any liability cap",
269
+ "optional": true,
270
+ "options": [
271
+ {
272
+ "id": "sec3gn",
273
+ "t": "Breach of Section 3 (Privacy & Security) resulting from gross negligence or willful misconduct"
274
+ },
275
+ {
276
+ "id": "sec11gn",
277
+ "t": "Breach of Section 11 (Confidentiality) resulting from gross negligence or willful misconduct (however, excluding any breach of Section 3 (Privacy & Security))"
278
+ },
279
+ {
280
+ "id": "indem",
281
+ "t": "An Indemnifying Party’s indemnification obligations for its Covered Claims"
282
+ },
283
+ {
284
+ "id": "sec3",
285
+ "t": "Breach of Section 3 (Privacy & Security)"
286
+ },
287
+ {
288
+ "id": "sec11",
289
+ "t": "Breach of Section 11 (Confidentiality) (however, excluding any breach of Section 3 (Privacy & Security))"
290
+ },
291
+ {
292
+ "id": "gn",
293
+ "t": "Claims resulting from a party's gross negligence or willful misconduct"
294
+ },
295
+ {
296
+ "id": "other",
297
+ "t": "Other: {text}",
298
+ "in": {
299
+ "text": {
300
+ "k": "text",
301
+ "ph": "describe",
302
+ "d": "",
303
+ "w": 20
304
+ }
305
+ }
306
+ }
307
+ ],
308
+ "help": "Claims with no cap at all. Many service providers keep this list short."
309
+ },
310
+ {
311
+ "id": "warranties",
312
+ "type": "checks",
313
+ "label": "Additional Warranties",
314
+ "optional": true,
315
+ "options": [
316
+ {
317
+ "id": "provider",
318
+ "t": "By Provider: {text}",
319
+ "in": {
320
+ "text": {
321
+ "k": "text",
322
+ "ph": "promise",
323
+ "d": "",
324
+ "w": 22
325
+ }
326
+ }
327
+ },
328
+ {
329
+ "id": "customer",
330
+ "t": "By Customer: {text}",
331
+ "in": {
332
+ "text": {
333
+ "k": "text",
334
+ "ph": "promise",
335
+ "d": "",
336
+ "w": 22
337
+ }
338
+ }
339
+ }
340
+ ],
341
+ "help": "Extra promises beyond the Standard Terms, for example “Provider’s staff hold current certifications”."
342
+ },
343
+ {
344
+ "id": "insurance",
345
+ "type": "checks",
346
+ "label": "Insurance Minimums",
347
+ "sub": "Requirements for Provider's or Customer's policies",
348
+ "optional": true,
349
+ "options": [
350
+ {
351
+ "id": "provider",
352
+ "t": "For Provider:",
353
+ "sub": [
354
+ {
355
+ "id": "cgl",
356
+ "t": "Commercial general liability with a minimum limit for each occurrence of at least ${occ} and at least ${agg} in the aggregate",
357
+ "in": {
358
+ "occ": {
359
+ "k": "text",
360
+ "ph": "1,000,000",
361
+ "d": "",
362
+ "w": 9
363
+ },
364
+ "agg": {
365
+ "k": "text",
366
+ "ph": "2,000,000",
367
+ "d": "",
368
+ "w": 9
369
+ }
370
+ }
371
+ },
372
+ {
373
+ "id": "wc",
374
+ "t": "Workers’ compensation insurance as required by Applicable Law"
375
+ },
376
+ {
377
+ "id": "eo",
378
+ "t": "Errors and omissions or professional liability with a minimum limit for each occurrence of at least ${occ} and at least ${agg} in the aggregate",
379
+ "in": {
380
+ "occ": {
381
+ "k": "text",
382
+ "ph": "1,000,000",
383
+ "d": "",
384
+ "w": 9
385
+ },
386
+ "agg": {
387
+ "k": "text",
388
+ "ph": "2,000,000",
389
+ "d": "",
390
+ "w": 9
391
+ }
392
+ }
393
+ },
394
+ {
395
+ "id": "cyber",
396
+ "t": "Cyber liability insurance with a minimum limit for each occurrence of at least ${occ} and at least ${agg} in the aggregate",
397
+ "in": {
398
+ "occ": {
399
+ "k": "text",
400
+ "ph": "1,000,000",
401
+ "d": "",
402
+ "w": 9
403
+ },
404
+ "agg": {
405
+ "k": "text",
406
+ "ph": "2,000,000",
407
+ "d": "",
408
+ "w": 9
409
+ }
410
+ }
411
+ },
412
+ {
413
+ "id": "auto",
414
+ "t": "Commercial automobile liability with a minimum limit for each occurrence of at least ${occ} and at least ${agg} in the aggregate",
415
+ "in": {
416
+ "occ": {
417
+ "k": "text",
418
+ "ph": "1,000,000",
419
+ "d": "",
420
+ "w": 9
421
+ },
422
+ "agg": {
423
+ "k": "text",
424
+ "ph": "2,000,000",
425
+ "d": "",
426
+ "w": 9
427
+ }
428
+ }
429
+ },
430
+ {
431
+ "id": "addl",
432
+ "t": "The following of Provider’s policies will cover Customer as additional insured:",
433
+ "sub": [
434
+ {
435
+ "id": "cgl",
436
+ "t": "Commercial general liability"
437
+ },
438
+ {
439
+ "id": "eo",
440
+ "t": "Errors and omissions"
441
+ },
442
+ {
443
+ "id": "cyber",
444
+ "t": "Cyber liability"
445
+ }
446
+ ]
447
+ }
448
+ ]
449
+ },
450
+ {
451
+ "id": "customer",
452
+ "t": "For Customer:",
453
+ "sub": [
454
+ {
455
+ "id": "cgl",
456
+ "t": "Commercial general liability with a minimum limit for each occurrence of at least ${occ} and at least ${agg} in the aggregate",
457
+ "in": {
458
+ "occ": {
459
+ "k": "text",
460
+ "ph": "1,000,000",
461
+ "d": "",
462
+ "w": 9
463
+ },
464
+ "agg": {
465
+ "k": "text",
466
+ "ph": "2,000,000",
467
+ "d": "",
468
+ "w": 9
469
+ }
470
+ }
471
+ },
472
+ {
473
+ "id": "wc",
474
+ "t": "Workers’ compensation insurance as required by Applicable Law"
475
+ },
476
+ {
477
+ "id": "eo",
478
+ "t": "Errors and omissions or professional liability with a minimum limit for each occurrence of at least ${occ} and at least ${agg} in the aggregate",
479
+ "in": {
480
+ "occ": {
481
+ "k": "text",
482
+ "ph": "1,000,000",
483
+ "d": "",
484
+ "w": 9
485
+ },
486
+ "agg": {
487
+ "k": "text",
488
+ "ph": "2,000,000",
489
+ "d": "",
490
+ "w": 9
491
+ }
492
+ }
493
+ },
494
+ {
495
+ "id": "cyber",
496
+ "t": "Cyber liability insurance with a minimum limit for each occurrence of at least ${occ} and at least ${agg} in the aggregate",
497
+ "in": {
498
+ "occ": {
499
+ "k": "text",
500
+ "ph": "1,000,000",
501
+ "d": "",
502
+ "w": 9
503
+ },
504
+ "agg": {
505
+ "k": "text",
506
+ "ph": "2,000,000",
507
+ "d": "",
508
+ "w": 9
509
+ }
510
+ }
511
+ },
512
+ {
513
+ "id": "auto",
514
+ "t": "Commercial automobile liability with a minimum limit for each occurrence of at least ${occ} and at least ${agg} in the aggregate",
515
+ "in": {
516
+ "occ": {
517
+ "k": "text",
518
+ "ph": "1,000,000",
519
+ "d": "",
520
+ "w": 9
521
+ },
522
+ "agg": {
523
+ "k": "text",
524
+ "ph": "2,000,000",
525
+ "d": "",
526
+ "w": 9
527
+ }
528
+ }
529
+ },
530
+ {
531
+ "id": "addl",
532
+ "t": "The following of Customer’s policies will cover Provider as additional insured:",
533
+ "sub": [
534
+ {
535
+ "id": "cgl",
536
+ "t": "Commercial general liability"
537
+ },
538
+ {
539
+ "id": "eo",
540
+ "t": "Errors and omissions"
541
+ },
542
+ {
543
+ "id": "cyber",
544
+ "t": "Cyber liability"
545
+ }
546
+ ]
547
+ }
548
+ ]
549
+ }
550
+ ],
551
+ "help": "Insurance either side must carry. Larger customers often ask for general liability and professional (E&O) cover."
552
+ },
553
+ {
554
+ "type": "heading",
555
+ "label": "Attachments and Supplements"
556
+ },
557
+ {
558
+ "id": "dpa",
559
+ "type": "textarea",
560
+ "label": "DPA",
561
+ "sub": "Data Protection Agreement",
562
+ "optional": true,
563
+ "ph": "If required by law or appropriate for the Services, attach or describe where to find.",
564
+ "help": "Needed if you will handle personal data for the customer. Name or link the data protection agreement here."
565
+ },
566
+ {
567
+ "id": "policies",
568
+ "type": "textarea",
569
+ "label": "Customer Policies",
570
+ "optional": true,
571
+ "ph": "Attach or describe where to find.",
572
+ "help": "Customer rules you must follow on site or in their systems, such as a code of conduct."
573
+ },
574
+ {
575
+ "id": "security",
576
+ "type": "checks",
577
+ "label": "Security Policy",
578
+ "optional": true,
579
+ "options": [
580
+ {
581
+ "id": "at",
582
+ "t": "Security Policy available at {where}",
583
+ "in": {
584
+ "where": {
585
+ "k": "text",
586
+ "ph": "describe where to find",
587
+ "d": "",
588
+ "w": 20
589
+ }
590
+ }
591
+ },
592
+ {
593
+ "id": "certs",
594
+ "t": "Provider will maintain annually updated reports or annual certifications of compliance with the following:",
595
+ "sub": [
596
+ {
597
+ "id": "iso",
598
+ "t": "ISO 27001"
599
+ },
600
+ {
601
+ "id": "pen",
602
+ "t": "Penetration testing"
603
+ },
604
+ {
605
+ "id": "soc1",
606
+ "t": "SOC 2 Type I"
607
+ },
608
+ {
609
+ "id": "pci1",
610
+ "t": "PCI Level 1"
611
+ },
612
+ {
613
+ "id": "soc2",
614
+ "t": "SOC 2 Type II"
615
+ },
616
+ {
617
+ "id": "pci2",
618
+ "t": "PCI Level 2"
619
+ },
620
+ {
621
+ "id": "hitrust",
622
+ "t": "HITRUST"
623
+ },
624
+ {
625
+ "id": "fedramp",
626
+ "t": "FedRAMP Authorized"
627
+ },
628
+ {
629
+ "id": "other",
630
+ "t": "Other: {text}",
631
+ "in": {
632
+ "text": {
633
+ "k": "text",
634
+ "ph": "fill in",
635
+ "d": "",
636
+ "w": 14
637
+ }
638
+ }
639
+ }
640
+ ]
641
+ }
642
+ ],
643
+ "help": "Security standards the provider commits to. Only tick what you really hold."
644
+ },
645
+ {
646
+ "type": "heading",
647
+ "label": "Changes to Standard Terms"
648
+ },
649
+ {
650
+ "id": "publicity",
651
+ "type": "choice",
652
+ "label": "Publicity Rights",
653
+ "sub": "Modifying Section 12.7 of the Standard Terms",
654
+ "optional": true,
655
+ "d": "",
656
+ "options": [
657
+ {
658
+ "id": "public",
659
+ "t": "Provider may identify Customer and use Customer’s logo and trademarks on Provider’s website and in marketing materials to identify Customer as a customer. Customer hereby grants Provider a non-exclusive, royalty-free license to do so in connection with any marketing, promotion, or advertising of Provider during the length of the Agreement."
660
+ },
661
+ {
662
+ "id": "private",
663
+ "t": "Provider may identify Customer as a customer in non-public settings, including with potential investors and advisors."
664
+ }
665
+ ],
666
+ "help": "Whether you may name the customer in your marketing. Leave as “None” to keep the Standard Terms default."
667
+ },
668
+ {
669
+ "id": "changes",
670
+ "type": "textarea",
671
+ "label": "Other Changes to Standard Terms",
672
+ "sub": "Changes that apply to the Agreement and all SOWs",
673
+ "optional": true,
674
+ "ph": "Leave empty if you are not changing anything",
675
+ "help": "Anything else you both agreed to change. The Cover Page wins over the Standard Terms."
676
+ }
677
+ ],
678
+ "closing": "Provider and Customer have not changed the Standard Terms except for the details on the Cover Page above. By signing this Cover Page, each party agrees to enter into this Agreement as of the Effective Date.",
679
+ "sign": [
680
+ "Signature",
681
+ "Print Name",
682
+ "Title",
683
+ "Notice Address",
684
+ "Date"
685
+ ]
686
+ },
687
+ {
688
+ "id": "sow",
689
+ "title": "Professional Services Agreement",
690
+ "kicker": "SOW",
691
+ "lead": "The key business terms of this SOW are as follows:",
692
+ "rows": [
693
+ {
694
+ "id": "sowref",
695
+ "type": "line",
696
+ "label": "SOW and Agreement",
697
+ "t": "This SOW {num} (“SOW”) incorporates the Agreement with a Key Terms Effective Date of {@eff} between {@p1} and {@p2}. If there is any inconsistency between this SOW and the Agreement, this SOW will control.",
698
+ "in": {
699
+ "num": {
700
+ "k": "text",
701
+ "ph": "e.g. #1",
702
+ "d": "1",
703
+ "w": 6
704
+ }
705
+ },
706
+ "help": "Number each SOW so later projects (SOW 2, SOW 3) can reuse the same Key Terms."
707
+ },
708
+ {
709
+ "id": "services",
710
+ "type": "textarea",
711
+ "label": "Services",
712
+ "ph": "Describe the Services: key people, overall timeline, milestones.",
713
+ "help": "What you will do, in plain words. Include the people involved, the timeline and milestones."
714
+ },
715
+ {
716
+ "id": "deliverables",
717
+ "type": "textarea",
718
+ "label": "Deliverables",
719
+ "optional": true,
720
+ "prefix": "The Deliverables are: ",
721
+ "ph": "What the customer will own when the work is done",
722
+ "help": "The things you hand over and the customer owns (designs, code, reports). Leave empty if the work produces nothing to hand over."
723
+ },
724
+ {
725
+ "id": "delivOpts",
726
+ "type": "checks",
727
+ "label": "Deliverables details",
728
+ "optional": true,
729
+ "omitLabel": true,
730
+ "after": "deliverables",
731
+ "options": [
732
+ {
733
+ "id": "wip",
734
+ "t": "In addition to completed projects, Deliverables include in-progress but not complete drafts or components of Deliverables and their associated intellectual property."
735
+ },
736
+ {
737
+ "id": "spec",
738
+ "t": "Deliverables will meet the attached specifications."
739
+ },
740
+ {
741
+ "id": "accept",
742
+ "t": "Deliverables are subject to the acceptance process in Section 1.4 with the following details:",
743
+ "sub": [
744
+ {
745
+ "id": "rej",
746
+ "t": "Rejection Period: {n} {u} from Deliverable submission",
747
+ "in": {
748
+ "n": {
749
+ "k": "num",
750
+ "d": "10",
751
+ "w": 3
752
+ },
753
+ "u": {
754
+ "k": "sel",
755
+ "o": [
756
+ "days",
757
+ "weeks",
758
+ "months"
759
+ ],
760
+ "d": "days"
761
+ }
762
+ }
763
+ },
764
+ {
765
+ "id": "resub",
766
+ "t": "Resubmission Period: {n} {u} from notice of rejection",
767
+ "in": {
768
+ "n": {
769
+ "k": "num",
770
+ "d": "10",
771
+ "w": 3
772
+ },
773
+ "u": {
774
+ "k": "sel",
775
+ "o": [
776
+ "days",
777
+ "weeks",
778
+ "months"
779
+ ],
780
+ "d": "days"
781
+ }
782
+ }
783
+ }
784
+ ]
785
+ }
786
+ ],
787
+ "help": "Optional extras: drafts count as deliverables, a spec is attached, or the customer gets a set time to accept or reject each deliverable."
788
+ },
789
+ {
790
+ "id": "assign",
791
+ "type": "choice",
792
+ "label": "Time of Assignment",
793
+ "optional": true,
794
+ "d": "payment",
795
+ "options": [
796
+ {
797
+ "id": "created",
798
+ "t": "Customer owns Deliverables as they are created."
799
+ },
800
+ {
801
+ "id": "payment",
802
+ "t": "Customer owns Deliverables upon payment of associated Fees."
803
+ }
804
+ ],
805
+ "help": "When ownership passes to the customer. “Upon payment” protects you if an invoice goes unpaid."
806
+ },
807
+ {
808
+ "id": "thirdparty",
809
+ "type": "choice",
810
+ "label": "Third-Party Materials",
811
+ "optional": true,
812
+ "d": "none",
813
+ "options": [
814
+ {
815
+ "id": "none",
816
+ "t": "No Third-Party Materials will be incorporated into the Deliverables."
817
+ },
818
+ {
819
+ "id": "yes",
820
+ "t": "Third-Party Materials will be incorporated in the Deliverables.",
821
+ "sub": [
822
+ {
823
+ "id": "provider",
824
+ "t": "Provider will procure Third-Party Materials."
825
+ },
826
+ {
827
+ "id": "customer",
828
+ "t": "Customer will procure Third-Party Materials."
829
+ }
830
+ ],
831
+ "multi": true
832
+ }
833
+ ],
834
+ "help": "Fonts, stock photos, plugins or licensed software someone else owns. Say if they are used and who buys them."
835
+ },
836
+ {
837
+ "id": "fees",
838
+ "type": "textarea",
839
+ "label": "Fees",
840
+ "ph": "Hourly, by project or by milestone; include pass-through costs.",
841
+ "help": "What the customer pays and how it is worked out: hourly rate, fixed price or per milestone."
842
+ },
843
+ {
844
+ "id": "travel",
845
+ "type": "checks",
846
+ "label": "Travel and expenses",
847
+ "omitLabel": true,
848
+ "optional": true,
849
+ "after": "fees",
850
+ "options": [
851
+ {
852
+ "id": "te",
853
+ "t": "Travel and expenses: {text}",
854
+ "in": {
855
+ "text": {
856
+ "k": "text",
857
+ "ph": "describe or attach policy",
858
+ "d": "",
859
+ "w": 22
860
+ }
861
+ }
862
+ }
863
+ ],
864
+ "help": "Tick if the customer will pay travel or other expenses, and say on what basis."
865
+ },
866
+ {
867
+ "id": "payment",
868
+ "type": "line",
869
+ "label": "Payment Period",
870
+ "sub": "Time frame for Customer to pay invoices",
871
+ "t": "{text}",
872
+ "in": {
873
+ "text": {
874
+ "k": "text",
875
+ "ph": "e.g. 30 days from Customer’s receipt of invoice",
876
+ "d": "30 days from Customer’s receipt of invoice",
877
+ "w": 28
878
+ }
879
+ },
880
+ "help": "How long the customer has to pay each invoice."
881
+ },
882
+ {
883
+ "id": "invoice",
884
+ "type": "line",
885
+ "label": "Invoice Period",
886
+ "sub": "How frequently Provider sends invoices",
887
+ "t": "{text}",
888
+ "in": {
889
+ "text": {
890
+ "k": "text",
891
+ "ph": "e.g. monthly, after each milestone",
892
+ "d": "",
893
+ "w": 24
894
+ }
895
+ },
896
+ "help": "When you send invoices: monthly, on acceptance, after each milestone."
897
+ },
898
+ {
899
+ "id": "sowdate",
900
+ "type": "choice",
901
+ "label": "SOW Date",
902
+ "sub": "The date this SOW begins",
903
+ "d": "sig",
904
+ "options": [
905
+ {
906
+ "id": "sig",
907
+ "t": "Date of last signature on this Cover Page"
908
+ },
909
+ {
910
+ "id": "date",
911
+ "t": "{date}",
912
+ "in": {
913
+ "date": {
914
+ "k": "date",
915
+ "d": "@today"
916
+ }
917
+ }
918
+ }
919
+ ],
920
+ "help": "When this piece of work starts."
921
+ },
922
+ {
923
+ "id": "sowterm",
924
+ "type": "choice",
925
+ "label": "SOW Term",
926
+ "sub": "How long this SOW lasts",
927
+ "lead": "The SOW Term begins on the SOW Date and ends:",
928
+ "d": "after",
929
+ "options": [
930
+ {
931
+ "id": "after",
932
+ "t": "{n} {u} after the SOW Date",
933
+ "in": {
934
+ "n": {
935
+ "k": "num",
936
+ "d": "3",
937
+ "w": 3
938
+ },
939
+ "u": {
940
+ "k": "sel",
941
+ "o": [
942
+ "days",
943
+ "weeks",
944
+ "months",
945
+ "year"
946
+ ],
947
+ "d": "months"
948
+ }
949
+ }
950
+ },
951
+ {
952
+ "id": "date",
953
+ "t": "{date}",
954
+ "in": {
955
+ "date": {
956
+ "k": "date",
957
+ "d": ""
958
+ }
959
+ }
960
+ }
961
+ ],
962
+ "help": "When this piece of work ends."
963
+ },
964
+ {
965
+ "id": "obligations",
966
+ "type": "textarea",
967
+ "label": "Customer Obligations",
968
+ "optional": true,
969
+ "ph": "e.g. a single point of contact, access to systems, feedback within 5 business days",
970
+ "help": "What the customer must do so you can deliver: a contact person, access, timely feedback."
971
+ },
972
+ {
973
+ "id": "sowchanges",
974
+ "type": "textarea",
975
+ "label": "Other Changes to Standard Terms",
976
+ "sub": "Changes that apply for this SOW only",
977
+ "optional": true,
978
+ "ph": "Leave empty if none",
979
+ "help": "Changes that apply to this SOW only."
980
+ }
981
+ ],
982
+ "closing": "By signing this Cover Page, each party agrees to enter into this SOW as of the SOW Date.",
983
+ "sign": [
984
+ "Signature",
985
+ "Print Name",
986
+ "Title",
987
+ "Notice Address",
988
+ "Date"
989
+ ]
990
+ }
991
+ ],
992
+ "publisher": "Common Paper, Inc.",
993
+ "licence": "CC BY 4.0",
994
+ "licenceUrl": "https://creativecommons.org/licenses/by/4.0/",
995
+ "licenceEvidence": "Checked on https://commonpaper.com/standards/professional-services-agreement/ on 2026-10-02: “Common Paper agreements are free to use and modify under CC BY 4.0.”",
996
+ "released": "2023-12-12",
997
+ "fetched": "2026-10-02",
998
+ "source": "https://commonpaper.com/standards/professional-services-agreement/1.1",
999
+ "textNote": "Standard Terms copied word for word from the source page; only whitespace was normalised.",
1000
+ "sha256": "ead2af3411fd2b960451c71cda0f7495890b1d702d318e57c369cc11d9e59782",
1001
+ "terms": [
1002
+ {
1003
+ "n": "1.",
1004
+ "l": 1,
1005
+ "h": "Services"
1006
+ },
1007
+ {
1008
+ "n": "1.1",
1009
+ "l": 2,
1010
+ "h3": "Providing Services.",
1011
+ "r": [
1012
+ [
1013
+ "v",
1014
+ "Customer"
1015
+ ],
1016
+ " or its Affiliates may enter SOWs with ",
1017
+ [
1018
+ "v",
1019
+ "Provider"
1020
+ ],
1021
+ ". ",
1022
+ [
1023
+ "v",
1024
+ "Provider"
1025
+ ],
1026
+ " will perform the Services as detailed in an applicable SOW. Each SOW together with the Key Terms and Standard Terms will constitute a separate agreement. ",
1027
+ [
1028
+ "v",
1029
+ "Provider"
1030
+ ],
1031
+ " will comply with ",
1032
+ [
1033
+ "v",
1034
+ "Customer Policies"
1035
+ ],
1036
+ ", if any. If a ",
1037
+ [
1038
+ "v",
1039
+ "Customer"
1040
+ ],
1041
+ " Affiliate enters an SOW with ",
1042
+ [
1043
+ "v",
1044
+ "Provider"
1045
+ ],
1046
+ ", references to ",
1047
+ [
1048
+ "v",
1049
+ "Customer"
1050
+ ],
1051
+ " in the SOW, Key Terms, or Standard Terms will mean that Affiliate for that agreement."
1052
+ ]
1053
+ },
1054
+ {
1055
+ "n": "1.2",
1056
+ "l": 2,
1057
+ "h3": "Cooperation.",
1058
+ "r": [
1059
+ [
1060
+ "v",
1061
+ "Customer"
1062
+ ],
1063
+ " will reasonably cooperate with ",
1064
+ [
1065
+ "v",
1066
+ "Provider"
1067
+ ],
1068
+ " to allow the performance of Services. ",
1069
+ [
1070
+ "v",
1071
+ "Provider"
1072
+ ],
1073
+ " is not responsible for an inability to perform the Services caused by ",
1074
+ [
1075
+ "v",
1076
+ "Customer’s"
1077
+ ],
1078
+ " failure to cooperate as reasonably requested. ",
1079
+ [
1080
+ "v",
1081
+ "Provider"
1082
+ ],
1083
+ " will provide its own equipment and tools to perform the Services."
1084
+ ]
1085
+ },
1086
+ {
1087
+ "n": "1.3",
1088
+ "l": 2,
1089
+ "h3": "Change Orders.",
1090
+ "r": [
1091
+ [
1092
+ "v",
1093
+ "Provider"
1094
+ ],
1095
+ " or ",
1096
+ [
1097
+ "v",
1098
+ "Customer"
1099
+ ],
1100
+ " may amend any SOW by entering a Change Order. If a party requests a Change Order, the other party will review and consider the proposed changes in good faith and respond to the Change Order request within a reasonable timeframe. However, a Change Order will not be binding until ",
1101
+ [
1102
+ "v",
1103
+ "Provider"
1104
+ ],
1105
+ " and ",
1106
+ [
1107
+ "v",
1108
+ "Customer"
1109
+ ],
1110
+ " agree in writing on the Change Order."
1111
+ ]
1112
+ },
1113
+ {
1114
+ "n": "1.4",
1115
+ "l": 2,
1116
+ "h3": "Acceptance.",
1117
+ "r": [
1118
+ "If according to the SOW ",
1119
+ [
1120
+ "v",
1121
+ "Deliverables"
1122
+ ],
1123
+ " are subject to this section, ",
1124
+ [
1125
+ "v",
1126
+ "Customer"
1127
+ ],
1128
+ " will be deemed to have approved a ",
1129
+ [
1130
+ "v",
1131
+ "Deliverable"
1132
+ ],
1133
+ " if ",
1134
+ [
1135
+ "v",
1136
+ "Customer"
1137
+ ],
1138
+ " does not reject the ",
1139
+ [
1140
+ "v",
1141
+ "Deliverable"
1142
+ ],
1143
+ " within the ",
1144
+ [
1145
+ "v",
1146
+ "Rejection Period"
1147
+ ],
1148
+ ". If ",
1149
+ [
1150
+ "v",
1151
+ "Customer"
1152
+ ],
1153
+ " rejects a ",
1154
+ [
1155
+ "v",
1156
+ "Deliverable"
1157
+ ],
1158
+ ", ",
1159
+ [
1160
+ "v",
1161
+ "Customer"
1162
+ ],
1163
+ " must notify ",
1164
+ [
1165
+ "v",
1166
+ "Provider"
1167
+ ],
1168
+ " in writing with reasonable detail about why the ",
1169
+ [
1170
+ "v",
1171
+ "Deliverable"
1172
+ ],
1173
+ " did not meet the requirements in the SOW. ",
1174
+ [
1175
+ "v",
1176
+ "Provider"
1177
+ ],
1178
+ " will correct the issue and resubmit the ",
1179
+ [
1180
+ "v",
1181
+ "Deliverable"
1182
+ ],
1183
+ " within the ",
1184
+ [
1185
+ "v",
1186
+ "Resubmission Period"
1187
+ ],
1188
+ "."
1189
+ ]
1190
+ },
1191
+ {
1192
+ "n": "1.5",
1193
+ "l": 2,
1194
+ "h3": "Subcontractors.",
1195
+ "r": [
1196
+ [
1197
+ "v",
1198
+ "Provider"
1199
+ ],
1200
+ " may use Subcontractors to perform the Services only with ",
1201
+ [
1202
+ "v",
1203
+ "Customer’s"
1204
+ ],
1205
+ " prior permission. However, ",
1206
+ [
1207
+ "v",
1208
+ "Provider"
1209
+ ],
1210
+ " may use its Affiliates to perform Services without ",
1211
+ [
1212
+ "v",
1213
+ "Customer’s"
1214
+ ],
1215
+ " prior permission. If ",
1216
+ [
1217
+ "v",
1218
+ "Provider"
1219
+ ],
1220
+ " uses Subcontractors to perform Services, ",
1221
+ [
1222
+ "v",
1223
+ "Provider"
1224
+ ],
1225
+ " is responsible for (a) all acts and omissions of its Subcontractors, (b) ensuring its Subcontractors’ compliance with this Agreement and the applicable SOW, and (c) making all payments owed to its Subcontractors for their portion of the Services."
1226
+ ]
1227
+ },
1228
+ {
1229
+ "n": "1.6",
1230
+ "l": 2,
1231
+ "h3": "Customer Obligations.",
1232
+ "r": [
1233
+ [
1234
+ "v",
1235
+ "Customer"
1236
+ ],
1237
+ " will comply with ",
1238
+ [
1239
+ "v",
1240
+ "Customer Obligations"
1241
+ ],
1242
+ ", if any."
1243
+ ]
1244
+ },
1245
+ {
1246
+ "n": "2.",
1247
+ "l": 1,
1248
+ "h": "Intellectual Property"
1249
+ },
1250
+ {
1251
+ "n": "2.1",
1252
+ "l": 2,
1253
+ "h3": "Deliverables.",
1254
+ "r": [
1255
+ "Except for Pre-Existing Materials and Third-Party Materials, ",
1256
+ [
1257
+ "v",
1258
+ "Provider"
1259
+ ],
1260
+ " assigns all right, title, and interest in the ",
1261
+ [
1262
+ "v",
1263
+ "Deliverables"
1264
+ ],
1265
+ " (if any) to ",
1266
+ [
1267
+ "v",
1268
+ "Customer"
1269
+ ],
1270
+ " at the ",
1271
+ [
1272
+ "v",
1273
+ "Time of Assignment"
1274
+ ],
1275
+ ". Upon the ",
1276
+ [
1277
+ "v",
1278
+ "Time of Assignment"
1279
+ ],
1280
+ ", ",
1281
+ [
1282
+ "v",
1283
+ "Provider"
1284
+ ],
1285
+ " will assert no rights over such ",
1286
+ [
1287
+ "v",
1288
+ "Deliverables"
1289
+ ],
1290
+ "."
1291
+ ]
1292
+ },
1293
+ {
1294
+ "n": "2.2",
1295
+ "l": 2,
1296
+ "h3": "Customer Materials.",
1297
+ "r": [
1298
+ [
1299
+ "v",
1300
+ "Provider"
1301
+ ],
1302
+ " may copy, display, modify, and use Customer Materials only as needed to provide the Services. ",
1303
+ [
1304
+ "v",
1305
+ "Customer"
1306
+ ],
1307
+ " is responsible for the accuracy and content of Customer Materials."
1308
+ ]
1309
+ },
1310
+ {
1311
+ "n": "2.3",
1312
+ "l": 2,
1313
+ "h3": "Pre-Existing Materials.",
1314
+ "r": [
1315
+ "To the extent ",
1316
+ [
1317
+ "v",
1318
+ "Provider"
1319
+ ],
1320
+ " incorporates Pre-Existing Materials into ",
1321
+ [
1322
+ "v",
1323
+ "Deliverables"
1324
+ ],
1325
+ ", ",
1326
+ [
1327
+ "v",
1328
+ "Provider"
1329
+ ],
1330
+ " grants ",
1331
+ [
1332
+ "v",
1333
+ "Customer"
1334
+ ],
1335
+ " a non-exclusive, non-transferrable, perpetual, irrevocable, worldwide license to use Pre-Existing Materials only as necessary to use the ",
1336
+ [
1337
+ "v",
1338
+ "Deliverables"
1339
+ ],
1340
+ " according to this Agreement."
1341
+ ]
1342
+ },
1343
+ {
1344
+ "n": "2.4",
1345
+ "l": 2,
1346
+ "h3": "Third-Party Materials."
1347
+ },
1348
+ {
1349
+ "n": "(a)",
1350
+ "l": 3,
1351
+ "r": [
1352
+ [
1353
+ "v",
1354
+ "Provider"
1355
+ ],
1356
+ " may incorporate Third-Party Materials into ",
1357
+ [
1358
+ "v",
1359
+ "Deliverables"
1360
+ ],
1361
+ " only if allowed in the SOW and as authorized by ",
1362
+ [
1363
+ "v",
1364
+ "Customer"
1365
+ ],
1366
+ " in writing (including by email)."
1367
+ ]
1368
+ },
1369
+ {
1370
+ "n": "(b)",
1371
+ "l": 3,
1372
+ "r": [
1373
+ [
1374
+ "v",
1375
+ "Provider"
1376
+ ],
1377
+ " is responsible for obtaining all rights, licenses, consents, approvals, and authorizations necessary to use and incorporate the Third-Party Materials procured by ",
1378
+ [
1379
+ "v",
1380
+ "Provider"
1381
+ ],
1382
+ " and incorporated into the ",
1383
+ [
1384
+ "v",
1385
+ "Deliverables"
1386
+ ],
1387
+ ". This includes securing the ability to grant ",
1388
+ [
1389
+ "v",
1390
+ "Customer"
1391
+ ],
1392
+ " rights in the ",
1393
+ [
1394
+ "v",
1395
+ "Deliverables"
1396
+ ],
1397
+ " under this Agreement and ensuring that ",
1398
+ [
1399
+ "v",
1400
+ "Customer"
1401
+ ],
1402
+ " has all rights necessary in these ",
1403
+ [
1404
+ "v",
1405
+ "Provider"
1406
+ ],
1407
+ "-procured Third-Party Materials so that ",
1408
+ [
1409
+ "v",
1410
+ "Customer"
1411
+ ],
1412
+ " may use ",
1413
+ [
1414
+ "v",
1415
+ "Deliverables"
1416
+ ],
1417
+ " according to this Agreement."
1418
+ ]
1419
+ },
1420
+ {
1421
+ "n": "(c)",
1422
+ "l": 3,
1423
+ "r": [
1424
+ [
1425
+ "v",
1426
+ "Customer"
1427
+ ],
1428
+ " is responsible for obtaining all rights, licenses, consents, approvals, and authorizations necessary to use and incorporate the Third-Party Materials procured by ",
1429
+ [
1430
+ "v",
1431
+ "Customer"
1432
+ ],
1433
+ " and incorporated into the ",
1434
+ [
1435
+ "v",
1436
+ "Deliverables"
1437
+ ],
1438
+ ". This includes securing the ability to grant ",
1439
+ [
1440
+ "v",
1441
+ "Provider"
1442
+ ],
1443
+ " rights in the ",
1444
+ [
1445
+ "v",
1446
+ "Customer"
1447
+ ],
1448
+ "-procured Third-Party Materials so ",
1449
+ [
1450
+ "v",
1451
+ "Provider"
1452
+ ],
1453
+ " can incorporate these Third-Party Materials into ",
1454
+ [
1455
+ "v",
1456
+ "Deliverables"
1457
+ ],
1458
+ ". ",
1459
+ [
1460
+ "v",
1461
+ "Provider"
1462
+ ],
1463
+ " will reasonably assist ",
1464
+ [
1465
+ "v",
1466
+ "Customer"
1467
+ ],
1468
+ " in obtaining the necessary rights, licenses, consents, approvals, and authorizations for the Third-Party Materials that ",
1469
+ [
1470
+ "v",
1471
+ "Provider"
1472
+ ],
1473
+ " recommends but that ",
1474
+ [
1475
+ "v",
1476
+ "Customer"
1477
+ ],
1478
+ " procures."
1479
+ ]
1480
+ },
1481
+ {
1482
+ "n": "2.5",
1483
+ "l": 2,
1484
+ "h3": "Feedback and Usage Data.",
1485
+ "r": [
1486
+ [
1487
+ "v",
1488
+ "Customer"
1489
+ ],
1490
+ " may, but is not required to, give ",
1491
+ [
1492
+ "v",
1493
+ "Provider"
1494
+ ],
1495
+ " Feedback, in which case ",
1496
+ [
1497
+ "v",
1498
+ "Customer"
1499
+ ],
1500
+ " gives Feedback “AS IS”. ",
1501
+ [
1502
+ "v",
1503
+ "Provider"
1504
+ ],
1505
+ " may use all Feedback freely without any restriction or obligation. In addition, ",
1506
+ [
1507
+ "v",
1508
+ "Provider"
1509
+ ],
1510
+ " may collect and analyze Usage Data, and ",
1511
+ [
1512
+ "v",
1513
+ "Provider"
1514
+ ],
1515
+ " may freely use Usage Data to maintain, improve, and enhance ",
1516
+ [
1517
+ "v",
1518
+ "Provider’s"
1519
+ ],
1520
+ " products and services without restriction or obligation. However, ",
1521
+ [
1522
+ "v",
1523
+ "Provider"
1524
+ ],
1525
+ " may only share Usage Data with others if the Usage Data is aggregated and does not identify ",
1526
+ [
1527
+ "v",
1528
+ "Customer"
1529
+ ],
1530
+ "."
1531
+ ]
1532
+ },
1533
+ {
1534
+ "n": "2.6",
1535
+ "l": 2,
1536
+ "h3": "Reservation of Rights.",
1537
+ "r": [
1538
+ "Except for (a) ",
1539
+ [
1540
+ "v",
1541
+ "Customer’s"
1542
+ ],
1543
+ " ownership of ",
1544
+ [
1545
+ "v",
1546
+ "Deliverables"
1547
+ ],
1548
+ " (if any) under Section 2.1 (Deliverables); (b) ",
1549
+ [
1550
+ "v",
1551
+ "Provider’s"
1552
+ ],
1553
+ " rights to use Customer Materials in Section 2.2 (Customer Materials); and (c) ",
1554
+ [
1555
+ "v",
1556
+ "Customer’s"
1557
+ ],
1558
+ " rights to Pre-Existing Materials in Section 2.3 (Pre-Existing Materials), neither party transfers any rights in any of their products, data, or any other intellectual property."
1559
+ ]
1560
+ },
1561
+ {
1562
+ "n": "3.",
1563
+ "l": 1,
1564
+ "h": "Privacy & Security"
1565
+ },
1566
+ {
1567
+ "n": "3.1",
1568
+ "l": 2,
1569
+ "h3": "Personal Data.",
1570
+ "r": [
1571
+ "If the parties have a ",
1572
+ [
1573
+ "v",
1574
+ "DPA"
1575
+ ],
1576
+ ", each party will comply with its obligations in the ",
1577
+ [
1578
+ "v",
1579
+ "DPA"
1580
+ ],
1581
+ ", the terms of the ",
1582
+ [
1583
+ "v",
1584
+ "DPA"
1585
+ ],
1586
+ " will control each party’s rights and obligations as to Personal Data, and the terms of the ",
1587
+ [
1588
+ "v",
1589
+ "DPA"
1590
+ ],
1591
+ " will control in the event of any conflict with this Agreement."
1592
+ ]
1593
+ },
1594
+ {
1595
+ "n": "3.2",
1596
+ "l": 2,
1597
+ "h3": "Security.",
1598
+ "r": [
1599
+ [
1600
+ "v",
1601
+ "Provider"
1602
+ ],
1603
+ " will comply with the ",
1604
+ [
1605
+ "v",
1606
+ "Security Policy"
1607
+ ],
1608
+ ", if any."
1609
+ ]
1610
+ },
1611
+ {
1612
+ "n": "4.",
1613
+ "l": 1,
1614
+ "h": "Payment & Taxes"
1615
+ },
1616
+ {
1617
+ "n": "4.1",
1618
+ "l": 2,
1619
+ "h3": "Fees and Invoices.",
1620
+ "r": [
1621
+ "Unless the currency is specified in the SOW, all ",
1622
+ [
1623
+ "v",
1624
+ "Fees"
1625
+ ],
1626
+ " are in U.S. Dollars and are exclusive of taxes. Except for the prorated refund of prepaid ",
1627
+ [
1628
+ "v",
1629
+ "Fees"
1630
+ ],
1631
+ " allowed with specific termination rights, ",
1632
+ [
1633
+ "v",
1634
+ "Fees"
1635
+ ],
1636
+ " are non-refundable. ",
1637
+ [
1638
+ "v",
1639
+ "Provider"
1640
+ ],
1641
+ " will send invoices for ",
1642
+ [
1643
+ "v",
1644
+ "Fees"
1645
+ ],
1646
+ " as described in the SOW."
1647
+ ]
1648
+ },
1649
+ {
1650
+ "n": "4.2",
1651
+ "l": 2,
1652
+ "h3": "Payment.",
1653
+ "r": [
1654
+ [
1655
+ "v",
1656
+ "Customer"
1657
+ ],
1658
+ " will pay ",
1659
+ [
1660
+ "v",
1661
+ "Provider"
1662
+ ],
1663
+ " the ",
1664
+ [
1665
+ "v",
1666
+ "Fees"
1667
+ ],
1668
+ " and taxes in each invoice in U.S. Dollars, unless the SOW specifies a different currency, within the ",
1669
+ [
1670
+ "v",
1671
+ "Payment Period"
1672
+ ],
1673
+ "."
1674
+ ]
1675
+ },
1676
+ {
1677
+ "n": "4.3",
1678
+ "l": 2,
1679
+ "h3": "Taxes.",
1680
+ "r": [
1681
+ [
1682
+ "v",
1683
+ "Customer"
1684
+ ],
1685
+ " is responsible for all duties, taxes, and levies that apply to ",
1686
+ [
1687
+ "v",
1688
+ "Fees"
1689
+ ],
1690
+ ", including sales, use, VAT, GST, or withholding, that ",
1691
+ [
1692
+ "v",
1693
+ "Provider"
1694
+ ],
1695
+ " itemizes and includes in an invoice. However, ",
1696
+ [
1697
+ "v",
1698
+ "Customer"
1699
+ ],
1700
+ " is not responsible for ",
1701
+ [
1702
+ "v",
1703
+ "Provider’s"
1704
+ ],
1705
+ " income taxes."
1706
+ ]
1707
+ },
1708
+ {
1709
+ "n": "4.4",
1710
+ "l": 2,
1711
+ "h3": "Payment Dispute.",
1712
+ "r": [
1713
+ "If ",
1714
+ [
1715
+ "v",
1716
+ "Customer"
1717
+ ],
1718
+ " has a good-faith disagreement about the amounts charged on an invoice, ",
1719
+ [
1720
+ "v",
1721
+ "Customer"
1722
+ ],
1723
+ " must notify ",
1724
+ [
1725
+ "v",
1726
+ "Provider"
1727
+ ],
1728
+ " about the dispute during the ",
1729
+ [
1730
+ "v",
1731
+ "Payment Period"
1732
+ ],
1733
+ " for the invoice and must pay all undisputed amounts on time. The parties will work together to resolve the dispute within 15 days after the end of the ",
1734
+ [
1735
+ "v",
1736
+ "Payment Period"
1737
+ ],
1738
+ ". If no resolution is agreed, each party may pursue any remedies available under the Agreement, the applicable SOW, or Applicable Laws."
1739
+ ]
1740
+ },
1741
+ {
1742
+ "n": "5.",
1743
+ "l": 1,
1744
+ "h": "Term & Termination"
1745
+ },
1746
+ {
1747
+ "n": "5.1",
1748
+ "l": 2,
1749
+ "h3": "Term.",
1750
+ "r": [
1751
+ "This Agreement will start on the ",
1752
+ [
1753
+ "v",
1754
+ "Effective Date"
1755
+ ],
1756
+ " and continue until 12 months have elapsed since the end of the latest ",
1757
+ [
1758
+ "v",
1759
+ "SOW Term"
1760
+ ],
1761
+ " end date."
1762
+ ]
1763
+ },
1764
+ {
1765
+ "n": "5.2",
1766
+ "l": 2,
1767
+ "h3": "Termination."
1768
+ },
1769
+ {
1770
+ "n": "(a)",
1771
+ "l": 3,
1772
+ "r": [
1773
+ "Either party may terminate this Agreement or an SOW immediately if the other party (i) fails to cure a material breach of the Agreement or SOW within 30 days after receiving notice of the breach; (ii) materially breaches the Agreement or SOW in a manner that cannot be cured; (iii) dissolves or stops conducting business without a successor; (iv) makes an assignment for the benefit of creditors; or (v) becomes the debtor in insolvency, receivership, or bankruptcy proceedings that continue for more than 60 days."
1774
+ ]
1775
+ },
1776
+ {
1777
+ "n": "(b)",
1778
+ "l": 3,
1779
+ "r": [
1780
+ "Either party may terminate an affected SOW immediately if a Force Majeure Event prevents ",
1781
+ [
1782
+ "v",
1783
+ "Provider"
1784
+ ],
1785
+ " from providing the Services for 30 or more consecutive days."
1786
+ ]
1787
+ },
1788
+ {
1789
+ "n": "(c)",
1790
+ "l": 3,
1791
+ "r": [
1792
+ "Either party may terminate this Agreement for any or no reason if there are no active SOWs."
1793
+ ]
1794
+ },
1795
+ {
1796
+ "n": "(d)",
1797
+ "l": 3,
1798
+ "r": [
1799
+ "A party must notify the other of its reason for termination."
1800
+ ]
1801
+ },
1802
+ {
1803
+ "n": "5.3",
1804
+ "l": 2,
1805
+ "h3": "Effect of Termination.",
1806
+ "r": [
1807
+ "Upon any expiration or termination:"
1808
+ ]
1809
+ },
1810
+ {
1811
+ "n": "(a)",
1812
+ "l": 3,
1813
+ "r": [
1814
+ "Termination of the Agreement pursuant to Section 5.2(a) or the Key Terms will automatically terminate all SOWs."
1815
+ ]
1816
+ },
1817
+ {
1818
+ "n": "(b)",
1819
+ "l": 3,
1820
+ "r": [
1821
+ [
1822
+ "v",
1823
+ "Provider"
1824
+ ],
1825
+ " will no longer have to provide the Services."
1826
+ ]
1827
+ },
1828
+ {
1829
+ "n": "(c)",
1830
+ "l": 3,
1831
+ "r": [
1832
+ "Each Recipient will return or destroy Discloser’s Confidential Information in its possession or control."
1833
+ ]
1834
+ },
1835
+ {
1836
+ "n": "(d)",
1837
+ "l": 3,
1838
+ "r": [
1839
+ "Except where ",
1840
+ [
1841
+ "v",
1842
+ "Customer"
1843
+ ],
1844
+ " terminates pursuant to Section 5.2(a), ",
1845
+ [
1846
+ "v",
1847
+ "Provider"
1848
+ ],
1849
+ " will submit a final invoice for all outstanding ",
1850
+ [
1851
+ "v",
1852
+ "Fees"
1853
+ ],
1854
+ " accrued before termination and ",
1855
+ [
1856
+ "v",
1857
+ "Customer"
1858
+ ],
1859
+ " will pay the invoice according to Section 4 (Payment & Taxes)."
1860
+ ]
1861
+ },
1862
+ {
1863
+ "n": "(e)",
1864
+ "l": 3,
1865
+ "r": [
1866
+ "Except where ",
1867
+ [
1868
+ "v",
1869
+ "Provider"
1870
+ ],
1871
+ " terminates pursuant to Section 5.2(a), ",
1872
+ [
1873
+ "v",
1874
+ "Provider"
1875
+ ],
1876
+ " will issue a refund for any unearned, prepaid ",
1877
+ [
1878
+ "v",
1879
+ "Fees"
1880
+ ],
1881
+ "."
1882
+ ]
1883
+ },
1884
+ {
1885
+ "n": "5.4",
1886
+ "l": 2,
1887
+ "h3": "Survival."
1888
+ },
1889
+ {
1890
+ "n": "(a)",
1891
+ "l": 3,
1892
+ "r": [
1893
+ "The following sections will survive expiration or termination of the Agreement: Section 2.1 (Deliverables), Section 2.3 (Pre-Existing Materials), Section 2.5 (Feedback and Usage Data), Section 2.6 (Reservation of Rights), Section 4 (Payment & Taxes) for fees accrued or payable before expiration or termination, Section 5.3 (Effect of Termination), Section 5.4 (Survival), Section 6 (Representations & Warranties), Section 7 (Disclaimer of Warranties), Section 8 (Limitation of Liability), Section 9 (Indemnification), Section 10 (Insurance) for the time period specified, Section 11 (Confidentiality), Section 12 (General Terms), Section 13 (Definitions), and the portions of a Cover Page referenced by these sections."
1894
+ ]
1895
+ },
1896
+ {
1897
+ "n": "(b)",
1898
+ "l": 3,
1899
+ "r": [
1900
+ "Each Recipient may retain Discloser’s Confidential Information in accordance with its standard backup or record retention policies maintained in the ordinary course of business or as required by Applicable Laws, in which case Section 3 (Privacy & Security) and Section 11 (Confidentiality) will continue to apply to retained Confidential Information."
1901
+ ]
1902
+ },
1903
+ {
1904
+ "n": "6.",
1905
+ "l": 1,
1906
+ "h": "Representations & Warranties"
1907
+ },
1908
+ {
1909
+ "n": "6.1",
1910
+ "l": 2,
1911
+ "h3": "Mutual.",
1912
+ "r": [
1913
+ "Each party represents and warrants to the other that: (a) it has the legal power and authority to enter into this Agreement; (b) it is duly organized, validly existing, and in good standing under the Applicable Laws of the jurisdiction of its origin; (c) it will comply with all Applicable Laws in performing its obligations or exercising its rights in this Agreement; and (d) it will comply with the ",
1914
+ [
1915
+ "v",
1916
+ "Additional Warranties"
1917
+ ]
1918
+ ]
1919
+ },
1920
+ {
1921
+ "n": "6.2",
1922
+ "l": 2,
1923
+ "h3": "From Customer.",
1924
+ "r": [
1925
+ [
1926
+ "v",
1927
+ "Customer"
1928
+ ],
1929
+ " represents and warrants to ",
1930
+ [
1931
+ "v",
1932
+ "Provider"
1933
+ ],
1934
+ " that (a) ",
1935
+ [
1936
+ "v",
1937
+ "Provider’s"
1938
+ ],
1939
+ " use of Customer Materials and ",
1940
+ [
1941
+ "v",
1942
+ "Customer"
1943
+ ],
1944
+ "-procured Third-Party Materials under this Agreement does not and will not infringe or misappropriate anyone else’s copyright, trademark, trade secret, or right of publicity; and (b) it has all rights necessary to provide Customer Materials and ",
1945
+ [
1946
+ "v",
1947
+ "Customer"
1948
+ ],
1949
+ "-procured Third-Party Materials under Section 2."
1950
+ ]
1951
+ },
1952
+ {
1953
+ "n": "6.3",
1954
+ "l": 2,
1955
+ "h3": "From Provider.",
1956
+ "r": [
1957
+ [
1958
+ "v",
1959
+ "Provider"
1960
+ ],
1961
+ " represents and warrants to ",
1962
+ [
1963
+ "v",
1964
+ "Customer"
1965
+ ],
1966
+ " that: (a) it will perform the Services in a timely, competent, and professional manner; (b) the ",
1967
+ [
1968
+ "v",
1969
+ "Deliverables"
1970
+ ],
1971
+ " (if any, however excluding Customer Materials and ",
1972
+ [
1973
+ "v",
1974
+ "Customer"
1975
+ ],
1976
+ "-procured Third-Party Materials) do not and will not infringe or misappropriate anyone else’s copyright, trademark, trade secret, or right of publicity; (c) the ",
1977
+ [
1978
+ "v",
1979
+ "Deliverables"
1980
+ ],
1981
+ " (if any) will conform to the requirements in the SOW; and (d) it has all rights necessary to perform the Services and convey the ",
1982
+ [
1983
+ "v",
1984
+ "Deliverables"
1985
+ ],
1986
+ " (if any, however excluding Customer Materials and ",
1987
+ [
1988
+ "v",
1989
+ "Customer"
1990
+ ],
1991
+ "-procured Third-Party Materials) under Section 2 (Intellectual Property)."
1992
+ ]
1993
+ },
1994
+ {
1995
+ "n": "6.4",
1996
+ "l": 2,
1997
+ "h3": "Warranty Remedy.",
1998
+ "r": [
1999
+ "If ",
2000
+ [
2001
+ "v",
2002
+ "Provider"
2003
+ ],
2004
+ " breaches the warranty in Section 6.3(c), ",
2005
+ [
2006
+ "v",
2007
+ "Customer"
2008
+ ],
2009
+ " must give ",
2010
+ [
2011
+ "v",
2012
+ "Provider"
2013
+ ],
2014
+ " notice (with enough detail for ",
2015
+ [
2016
+ "v",
2017
+ "Provider"
2018
+ ],
2019
+ " to understand or replicate the issue) within 45 days of discovering the issue. Within 45 days of receiving sufficient details of the warranty issue, ",
2020
+ [
2021
+ "v",
2022
+ "Provider"
2023
+ ],
2024
+ " will reperform the Services. If ",
2025
+ [
2026
+ "v",
2027
+ "Provider"
2028
+ ],
2029
+ " cannot resolve the issue, ",
2030
+ [
2031
+ "v",
2032
+ "Customer"
2033
+ ],
2034
+ " may terminate the affected SOW and ",
2035
+ [
2036
+ "v",
2037
+ "Provider"
2038
+ ],
2039
+ " will pay to ",
2040
+ [
2041
+ "v",
2042
+ "Customer"
2043
+ ],
2044
+ " a prorated refund of prepaid ",
2045
+ [
2046
+ "v",
2047
+ "Fees"
2048
+ ],
2049
+ " for the remainder of the ",
2050
+ [
2051
+ "v",
2052
+ "SOW Term"
2053
+ ],
2054
+ ". ",
2055
+ [
2056
+ "v",
2057
+ "Provider’s"
2058
+ ],
2059
+ " reperformance obligations and ",
2060
+ [
2061
+ "v",
2062
+ "Customer’s"
2063
+ ],
2064
+ " termination right are ",
2065
+ [
2066
+ "v",
2067
+ "Customer’s"
2068
+ ],
2069
+ " only remedies if ",
2070
+ [
2071
+ "v",
2072
+ "Provider"
2073
+ ],
2074
+ " does not meet the warranty in Section 6.3(c)."
2075
+ ]
2076
+ },
2077
+ {
2078
+ "n": "7.",
2079
+ "l": 1,
2080
+ "h": "Disclaimer of Warranties"
2081
+ },
2082
+ {
2083
+ "n": "7.1",
2084
+ "l": 2,
2085
+ "r": [
2086
+ "Except for the warranties in Section 6 (Representations & Warranties), ",
2087
+ [
2088
+ "v",
2089
+ "Provider"
2090
+ ],
2091
+ " and ",
2092
+ [
2093
+ "v",
2094
+ "Customer"
2095
+ ],
2096
+ " each ",
2097
+ [
2098
+ "b",
2099
+ "disclaim all other warranties, whether express or implied, including the implied warranties of merchantability, fitness for a particular purpose, title, and non-infringement"
2100
+ ],
2101
+ ". These disclaimers apply to the maximum extent permitted by Applicable Laws."
2102
+ ]
2103
+ },
2104
+ {
2105
+ "n": "8.",
2106
+ "l": 1,
2107
+ "h": "Limitation of Liability"
2108
+ },
2109
+ {
2110
+ "n": "8.1",
2111
+ "l": 2,
2112
+ "h3": "Liability Caps.",
2113
+ "r": [
2114
+ [
2115
+ "b",
2116
+ "If there are "
2117
+ ],
2118
+ [
2119
+ "v",
2120
+ "Increased Claims"
2121
+ ],
2122
+ [
2123
+ "b",
2124
+ ", each party’s total cumulative liability for the "
2125
+ ],
2126
+ [
2127
+ "v",
2128
+ "Increased Claims"
2129
+ ],
2130
+ [
2131
+ "b",
2132
+ " arising out of or relating to this Agreement will not be more than the "
2133
+ ],
2134
+ [
2135
+ "v",
2136
+ "Increased Cap Amount"
2137
+ ],
2138
+ [
2139
+ "b",
2140
+ ". Each party’s total cumulative liability for all other claims arising out of or relating to this Agreement will not be more than the "
2141
+ ],
2142
+ [
2143
+ "v",
2144
+ "General Cap Amount"
2145
+ ],
2146
+ [
2147
+ "b",
2148
+ "."
2149
+ ]
2150
+ ]
2151
+ },
2152
+ {
2153
+ "n": "8.2",
2154
+ "l": 2,
2155
+ "h3": "Damages Waiver.",
2156
+ "r": [
2157
+ [
2158
+ "b",
2159
+ "Each party’s liability for any claim or liability arising out of or relating to this Agreement will be limited to the fullest extent permitted by Applicable Laws. Under no circumstances will either party be liable to the other for lost profits or revenues, or for consequential, special, indirect, exemplary, punitive, or incidental damages relating to this Agreement, even if the party is informed of the possibility of this type of damage in advance."
2160
+ ]
2161
+ ]
2162
+ },
2163
+ {
2164
+ "n": "8.3",
2165
+ "l": 2,
2166
+ "h3": "Exceptions.",
2167
+ "r": [
2168
+ "The liability caps in Section 8.1 do not apply to any ",
2169
+ [
2170
+ "v",
2171
+ "Unlimited Claims"
2172
+ ],
2173
+ ". The damages waiver in Section 8.2 does not apply to any ",
2174
+ [
2175
+ "v",
2176
+ "Increased Claims"
2177
+ ],
2178
+ " or a breach of Section 11 (Confidentiality)."
2179
+ ]
2180
+ },
2181
+ {
2182
+ "n": "9.",
2183
+ "l": 1,
2184
+ "h": "Indemnification"
2185
+ },
2186
+ {
2187
+ "n": "9.1",
2188
+ "l": 2,
2189
+ "h3": "Protection by Provider.",
2190
+ "r": [
2191
+ [
2192
+ "v",
2193
+ "Provider"
2194
+ ],
2195
+ " will indemnify, defend, and hold harmless ",
2196
+ [
2197
+ "v",
2198
+ "Customer"
2199
+ ],
2200
+ " from and against all ",
2201
+ [
2202
+ "v",
2203
+ "Provider Covered Claims"
2204
+ ],
2205
+ " made by someone other than ",
2206
+ [
2207
+ "v",
2208
+ "Customer"
2209
+ ],
2210
+ " or its Affiliates, and all out-of-pocket damages, awards, settlements, costs, and expenses, including reasonable attorneys’ fees and other legal expenses, that arise from the ",
2211
+ [
2212
+ "v",
2213
+ "Provider Covered Claim"
2214
+ ],
2215
+ "."
2216
+ ]
2217
+ },
2218
+ {
2219
+ "n": "9.2",
2220
+ "l": 2,
2221
+ "h3": "Protection by Customer.",
2222
+ "r": [
2223
+ [
2224
+ "v",
2225
+ "Customer"
2226
+ ],
2227
+ " will indemnify, defend, and hold harmless ",
2228
+ [
2229
+ "v",
2230
+ "Provider"
2231
+ ],
2232
+ " from and against all ",
2233
+ [
2234
+ "v",
2235
+ "Customer Covered Claims"
2236
+ ],
2237
+ " made by someone other than ",
2238
+ [
2239
+ "v",
2240
+ "Provider"
2241
+ ],
2242
+ " or its Affiliates, and all out-of-pocket damages, awards, settlements, costs, and expenses, including reasonable attorneys’ fees and other legal expenses, that arise from the ",
2243
+ [
2244
+ "v",
2245
+ "Customer Covered Claim"
2246
+ ],
2247
+ "."
2248
+ ]
2249
+ },
2250
+ {
2251
+ "n": "9.3",
2252
+ "l": 2,
2253
+ "h3": "Procedure.",
2254
+ "r": [
2255
+ "The Indemnifying Party’s obligations in this section are contingent upon the Protected Party: (a) promptly notifying the Indemnifying Party of each Covered Claim for which it seeks protection; (b) providing reasonable assistance to the Indemnifying Party at the Indemnifying Party’s expense; and (c) giving the Indemnifying Party sole control over the defense and settlement of each Covered Claim. A Protected Party may participate in a Covered Claim for which it seeks protection with its own attorneys only at its own expense. The Indemnifying Party may not agree to any settlement of a Covered Claim that contains an admission of fault or otherwise materially and adversely impacts the Protected Party without the prior written consent of the Protected Party."
2256
+ ]
2257
+ },
2258
+ {
2259
+ "n": "9.4",
2260
+ "l": 2,
2261
+ "h3": "Exclusive Remedy.",
2262
+ "r": [
2263
+ "This Section 9 (Indemnification) describes each Protected Party’s exclusive remedy and each Indemnifying Party’s entire liability for a Covered Claim."
2264
+ ]
2265
+ },
2266
+ {
2267
+ "n": "10.",
2268
+ "l": 1,
2269
+ "h": "Insurance"
2270
+ },
2271
+ {
2272
+ "n": "10.1",
2273
+ "l": 2,
2274
+ "r": [
2275
+ "During the term of the Agreement and for six months after, each party will carry commercial insurance policies with coverage limits that meet the relevant ",
2276
+ [
2277
+ "v",
2278
+ "Insurance Minimums"
2279
+ ],
2280
+ " required in the SOW, if any. Upon request, each party will give the other a certificate of insurance evidencing its insurance policies that meet the required ",
2281
+ [
2282
+ "v",
2283
+ "Insurance Minimums"
2284
+ ],
2285
+ ". A party’s insurance policies will not be considered as evidence of its liability. Insurance coverage will be on a date of occurrence form and waive rights of subrogation or crossclaim."
2286
+ ]
2287
+ },
2288
+ {
2289
+ "n": "11.",
2290
+ "l": 1,
2291
+ "h": "Confidentiality"
2292
+ },
2293
+ {
2294
+ "n": "11.1",
2295
+ "l": 2,
2296
+ "h3": "Non-Use and Non-Disclosure.",
2297
+ "r": [
2298
+ "Unless otherwise authorized in the Agreement, Recipient will (a) only use Discloser’s Confidential Information to fulfill its obligations or exercise its rights under this Agreement; and (b) not disclose Discloser’s Confidential Information to anyone else. In addition, Recipient will protect Discloser’s Confidential Information using at least the same protections Recipient uses for its own similar information but no less than a reasonable standard of care."
2299
+ ]
2300
+ },
2301
+ {
2302
+ "n": "11.2",
2303
+ "l": 2,
2304
+ "h3": "Exclusions.",
2305
+ "r": [
2306
+ "Confidential Information does not include information that (a) Recipient knew without any obligation of confidentiality before disclosure by Discloser; (b) is or becomes publicly known and generally available through no fault of Recipient; (c) Recipient receives under no obligation of confidentiality from someone else who is authorized to make the disclosure; or (d) Recipient independently developed without use of or reference to Discloser’s Confidential Information."
2307
+ ]
2308
+ },
2309
+ {
2310
+ "n": "11.3",
2311
+ "l": 2,
2312
+ "h3": "Required Disclosures.",
2313
+ "r": [
2314
+ "Recipient may disclose Discloser’s Confidential Information to the extent required by Applicable Laws if, unless prohibited by Applicable Laws, Recipient provides the Discloser reasonable advance notice of the required disclosure and reasonably cooperates, at the Discloser’s expense, with the Discloser’s efforts to obtain confidential treatment for the Confidential Information."
2315
+ ]
2316
+ },
2317
+ {
2318
+ "n": "11.4",
2319
+ "l": 2,
2320
+ "h3": "Permitted Disclosures.",
2321
+ "r": [
2322
+ "Recipient may disclose Discloser’s Confidential Information to employees, advisors, contractors, and representatives who each have a need to know the Confidential Information, but only if the person or entity is bound by confidentiality obligations at least as protective as those in this Section 11 and Recipient remains responsible for everyone’s compliance with the terms of this Section 11."
2323
+ ]
2324
+ },
2325
+ {
2326
+ "n": "12.",
2327
+ "l": 1,
2328
+ "h": "General Terms"
2329
+ },
2330
+ {
2331
+ "n": "12.1",
2332
+ "l": 2,
2333
+ "h3": "Entire Agreement.",
2334
+ "r": [
2335
+ "This Agreement is the only agreement between the parties about its subject and this Agreement supersedes all prior or contemporaneous statements (whether in writing or not) about its subject. ",
2336
+ [
2337
+ "v",
2338
+ "Provider"
2339
+ ],
2340
+ " expressly rejects any terms included in ",
2341
+ [
2342
+ "v",
2343
+ "Customer’s"
2344
+ ],
2345
+ " purchase order or similar document, which may only be used for accounting or administrative purposes."
2346
+ ]
2347
+ },
2348
+ {
2349
+ "n": "12.2",
2350
+ "l": 2,
2351
+ "h3": "Modifications, Severability, and Waiver.",
2352
+ "r": [
2353
+ "Any waiver, modification, or change to the Agreement must be in writing and signed or electronically accepted by each party. However, this does not limit ",
2354
+ [
2355
+ "v",
2356
+ "Provider’s"
2357
+ ],
2358
+ " or ",
2359
+ [
2360
+ "v",
2361
+ "Customer’s"
2362
+ ],
2363
+ " ability to update an SOW by following the Change Order procedures. If any term of this Agreement is determined to be invalid or unenforceable by a relevant court or governing body, the remaining terms of this Agreement will remain in full force and effect. The failure of a party to enforce a term or to exercise an option or right in this Agreement will not constitute a waiver by that party of the term, option, or right."
2364
+ ]
2365
+ },
2366
+ {
2367
+ "n": "12.3",
2368
+ "l": 2,
2369
+ "h3": "Governing Law and Chosen Courts.",
2370
+ "r": [
2371
+ "The ",
2372
+ [
2373
+ "v",
2374
+ "Governing Law"
2375
+ ],
2376
+ " will govern all interpretations and disputes about this Agreement, without regard to its conflict of laws provisions. The parties will bring any legal suit, action, or proceeding about this Agreement or an SOW in the ",
2377
+ [
2378
+ "v",
2379
+ "Chosen Courts"
2380
+ ],
2381
+ " and each party irrevocably submits to the exclusive jurisdiction of the ",
2382
+ [
2383
+ "v",
2384
+ "Chosen Courts"
2385
+ ],
2386
+ "."
2387
+ ]
2388
+ },
2389
+ {
2390
+ "n": "12.4",
2391
+ "l": 2,
2392
+ "h3": "Injunctive Relief.",
2393
+ "r": [
2394
+ "Despite Section 12.3 (Governing Law and Chosen Courts), a breach of Section 11 (Confidentiality) or the violation of a party’s intellectual property rights may cause irreparable harm for which monetary damages cannot adequately compensate. As a result, upon the actual or threatened breach of Section 11 (Confidentiality) or violation of a party’s intellectual property rights, the non-breaching or non-violating party may seek appropriate equitable relief, including an injunction, in any court of competent jurisdiction without the need to post a bond and without limiting its other rights or remedies."
2395
+ ]
2396
+ },
2397
+ {
2398
+ "n": "12.5",
2399
+ "l": 2,
2400
+ "h3": "Non-Exhaustive Remedies.",
2401
+ "r": [
2402
+ "Except where the Agreement provides for an exclusive remedy, seeking or exercising a remedy does not limit the other rights or remedies available to a party."
2403
+ ]
2404
+ },
2405
+ {
2406
+ "n": "12.6",
2407
+ "l": 2,
2408
+ "h3": "Assignment.",
2409
+ "r": [
2410
+ "Neither party may assign any rights or obligations under this Agreement or any SOW without the prior written consent of the other party. However, ",
2411
+ [
2412
+ "v",
2413
+ "Customer"
2414
+ ],
2415
+ " may assign this Agreement upon notice if ",
2416
+ [
2417
+ "v",
2418
+ "Customer"
2419
+ ],
2420
+ " undergoes a merger, change of control, reorganization, or sale of all or substantially all its equity, business, or assets to which this Agreement relates. Any attempted but non-permitted assignment is void. This Agreement will be binding upon and inure to the benefit of the parties and their permitted successors and assigns."
2421
+ ]
2422
+ },
2423
+ {
2424
+ "n": "12.7",
2425
+ "l": 2,
2426
+ "h3": "No Publicity.",
2427
+ "r": [
2428
+ "Neither party may publicly announce the existence of this Agreement or any SOW without the prior written approval of the other party."
2429
+ ]
2430
+ },
2431
+ {
2432
+ "n": "12.8",
2433
+ "l": 2,
2434
+ "h3": "Notices.",
2435
+ "r": [
2436
+ "Any notice, request, or approval about the Agreement must be in writing and sent to the Notice Address. Notices will be deemed given (a) upon confirmed delivery if by email, registered or certified mail, or personal delivery; or (b) two days after mailing if by overnight commercial delivery."
2437
+ ]
2438
+ },
2439
+ {
2440
+ "n": "12.9",
2441
+ "l": 2,
2442
+ "h3": "Independent Contractors.",
2443
+ "r": [
2444
+ "The parties are independent contractors, not agents, partners, or joint venturers. Neither party is authorized to bind the other to any liability or obligation."
2445
+ ]
2446
+ },
2447
+ {
2448
+ "n": "12.10",
2449
+ "l": 2,
2450
+ "h3": "No Third-Party Beneficiary.",
2451
+ "r": [
2452
+ "There are no third-party beneficiaries of this Agreement."
2453
+ ]
2454
+ },
2455
+ {
2456
+ "n": "12.11",
2457
+ "l": 2,
2458
+ "h3": "Force Majeure.",
2459
+ "r": [
2460
+ "Neither party will be liable for a delay or failure to perform its obligations of this Agreement if caused by a Force Majeure Event. However, this section does not excuse ",
2461
+ [
2462
+ "v",
2463
+ "Customer’s"
2464
+ ],
2465
+ " obligations to pay ",
2466
+ [
2467
+ "v",
2468
+ "Fees"
2469
+ ],
2470
+ "."
2471
+ ]
2472
+ },
2473
+ {
2474
+ "n": "12.12",
2475
+ "l": 2,
2476
+ "h3": "Export Controls.",
2477
+ "r": [
2478
+ [
2479
+ "v",
2480
+ "Customer"
2481
+ ],
2482
+ " may not remove or export from the United States or allow the export or re-export of the Service, ",
2483
+ [
2484
+ "v",
2485
+ "Deliverables"
2486
+ ],
2487
+ ", or any related technology or materials in violation of any restrictions, laws, or regulations of the United States Department of Commerce, the United States Department of Treasury Office of Foreign Assets Control, or any other United States or foreign agency or authority."
2488
+ ]
2489
+ },
2490
+ {
2491
+ "n": "12.13",
2492
+ "l": 2,
2493
+ "h3": "Anti-Bribery.",
2494
+ "r": [
2495
+ "Neither party will take any action that would be a violation of any Applicable Laws that prohibit the offering, giving, promising to offer or give, or receiving, directly or indirectly, money or anything of value to any third party to assist ",
2496
+ [
2497
+ "v",
2498
+ "Provider"
2499
+ ],
2500
+ " or ",
2501
+ [
2502
+ "v",
2503
+ "Customer"
2504
+ ],
2505
+ " in retaining or obtaining business. Examples of these kinds of laws include the U.S. Foreign Corrupt Practices Act and the UK Bribery Act 2010."
2506
+ ]
2507
+ },
2508
+ {
2509
+ "n": "12.14",
2510
+ "l": 2,
2511
+ "h3": "Titles and Interpretation.",
2512
+ "r": [
2513
+ "Section titles are for convenience and reference only. All uses of “including” and similar phrases are non-exhaustive and without limitation."
2514
+ ]
2515
+ },
2516
+ {
2517
+ "n": "12.15",
2518
+ "l": 2,
2519
+ "h3": "Signature.",
2520
+ "r": [
2521
+ "This Agreement may be signed in counterparts, including by electronic copies or acceptance mechanism. Each copy will be deemed an original and all copies, when taken together, will be the same agreement."
2522
+ ]
2523
+ },
2524
+ {
2525
+ "n": "13.",
2526
+ "l": 1,
2527
+ "h": "Definitions"
2528
+ },
2529
+ {
2530
+ "n": "13.1",
2531
+ "l": 2,
2532
+ "r": [
2533
+ [
2534
+ "b",
2535
+ "“Affiliate”"
2536
+ ],
2537
+ " means an entity that, directly or indirectly, controls, is under the control of, or is under common control with a party, where control means having more than fifty percent (50%) of the voting stock or other ownership interest."
2538
+ ]
2539
+ },
2540
+ {
2541
+ "n": "13.2",
2542
+ "l": 2,
2543
+ "r": [
2544
+ [
2545
+ "b",
2546
+ "“Agreement”"
2547
+ ],
2548
+ " means these Standard Terms, the Key Terms between ",
2549
+ [
2550
+ "v",
2551
+ "Provider"
2552
+ ],
2553
+ " and ",
2554
+ [
2555
+ "v",
2556
+ "Customer"
2557
+ ],
2558
+ ", and the policies and documents referenced in or attached to the Key Terms."
2559
+ ]
2560
+ },
2561
+ {
2562
+ "n": "13.3",
2563
+ "l": 2,
2564
+ "r": [
2565
+ [
2566
+ "b",
2567
+ "“Applicable Laws”"
2568
+ ],
2569
+ " means the laws, rules, regulations, court orders, and other binding requirements of a relevant government authority."
2570
+ ]
2571
+ },
2572
+ {
2573
+ "n": "13.4",
2574
+ "l": 2,
2575
+ "r": [
2576
+ [
2577
+ "b",
2578
+ "“Change Order”"
2579
+ ],
2580
+ " means a document that identifies the SOW being changed, describes what the parties are changing, and is approved by an authorized representative of each party."
2581
+ ]
2582
+ },
2583
+ {
2584
+ "n": "13.5",
2585
+ "l": 2,
2586
+ "r": [
2587
+ [
2588
+ "b",
2589
+ "“Confidential Information”"
2590
+ ],
2591
+ " means information in any form disclosed by or on behalf of a Discloser, including before the ",
2592
+ [
2593
+ "v",
2594
+ "Effective Date"
2595
+ ],
2596
+ ", to a Recipient in connection with this Agreement that (a) the Discloser identifies as “confidential”, “proprietary”, or the like; or (b) should be reasonably understood as confidential or proprietary due to its nature and the circumstances of its disclosure. Confidential Information includes the existence of this Agreement and the information on each Cover Page."
2597
+ ]
2598
+ },
2599
+ {
2600
+ "n": "13.6",
2601
+ "l": 2,
2602
+ "r": [
2603
+ [
2604
+ "b",
2605
+ "“Cover Page”"
2606
+ ],
2607
+ " means a document that is signed or electronically accepted by the parties that incorporates these Standard Terms, identifies ",
2608
+ [
2609
+ "v",
2610
+ "Provider"
2611
+ ],
2612
+ " and ",
2613
+ [
2614
+ "v",
2615
+ "Customer"
2616
+ ],
2617
+ ", and may include a SOW, Key Terms, or both."
2618
+ ]
2619
+ },
2620
+ {
2621
+ "n": "13.7",
2622
+ "l": 2,
2623
+ "r": [
2624
+ [
2625
+ "b",
2626
+ "“Covered Claim”"
2627
+ ],
2628
+ " means either a ",
2629
+ [
2630
+ "v",
2631
+ "Provider Covered Claim"
2632
+ ],
2633
+ " or ",
2634
+ [
2635
+ "v",
2636
+ "Customer Covered Claim"
2637
+ ],
2638
+ "."
2639
+ ]
2640
+ },
2641
+ {
2642
+ "n": "13.8",
2643
+ "l": 2,
2644
+ "r": [
2645
+ [
2646
+ "b",
2647
+ "“Customer Materials”"
2648
+ ],
2649
+ " means data, information, or materials owned or provided by or on behalf of ",
2650
+ [
2651
+ "v",
2652
+ "Customer"
2653
+ ],
2654
+ " for use with the Services, but excludes Feedback and ",
2655
+ [
2656
+ "v",
2657
+ "Customer"
2658
+ ],
2659
+ "-procured Third-Party Materials."
2660
+ ]
2661
+ },
2662
+ {
2663
+ "n": "13.9",
2664
+ "l": 2,
2665
+ "r": [
2666
+ [
2667
+ "b",
2668
+ "“Discloser”"
2669
+ ],
2670
+ " means a party to this Agreement when the party is providing or disclosing Confidential Information to the other party."
2671
+ ]
2672
+ },
2673
+ {
2674
+ "n": "13.10",
2675
+ "l": 2,
2676
+ "r": [
2677
+ [
2678
+ "b",
2679
+ "“Feedback”"
2680
+ ],
2681
+ " means suggestions, feedback, or comments about the Services or related offerings."
2682
+ ]
2683
+ },
2684
+ {
2685
+ "n": "13.11",
2686
+ "l": 2,
2687
+ "r": [
2688
+ [
2689
+ "b",
2690
+ "“Force Majeure Event”"
2691
+ ],
2692
+ " means an unforeseen event outside a party’s reasonable control where the affected party took reasonable measures to avoid or mitigate the impacts of the event. Examples of these kinds of events include unpredicted natural disaster like a major earthquake, war, pandemic, riot, act of terrorism, or public utility or internet failure."
2693
+ ]
2694
+ },
2695
+ {
2696
+ "n": "13.12",
2697
+ "l": 2,
2698
+ "r": [
2699
+ [
2700
+ "b",
2701
+ "“Indemnifying Party”"
2702
+ ],
2703
+ " means a party to this Agreement when the party is providing protection for a particular Covered Claim."
2704
+ ]
2705
+ },
2706
+ {
2707
+ "n": "13.13",
2708
+ "l": 2,
2709
+ "r": [
2710
+ [
2711
+ "b",
2712
+ "“Key Terms”"
2713
+ ],
2714
+ " means a Cover Page that includes the key legal details and definitions for this Agreement that are not defined in the SOW or Standard Terms. The Key Terms may include details about Covered Claims, set the ",
2715
+ [
2716
+ "v",
2717
+ "Governing Law"
2718
+ ],
2719
+ ", or contain other legal details about this Agreement."
2720
+ ]
2721
+ },
2722
+ {
2723
+ "n": "13.14",
2724
+ "l": 2,
2725
+ "r": [
2726
+ [
2727
+ "b",
2728
+ "“Pre-Existing Materials”"
2729
+ ],
2730
+ " means any information, tools, materials, or intellectual property that ",
2731
+ [
2732
+ "v",
2733
+ "Provider"
2734
+ ],
2735
+ " developed or owned before the ",
2736
+ [
2737
+ "v",
2738
+ "Effective Date"
2739
+ ],
2740
+ " or developed after the ",
2741
+ [
2742
+ "v",
2743
+ "Effective Date"
2744
+ ],
2745
+ " that are independent from or outside the scope of the Agreement, and any derivatives of these items that are not unique to ",
2746
+ [
2747
+ "v",
2748
+ "Customer"
2749
+ ],
2750
+ " or that have generally applicable use and do not incorporate or disclose any ",
2751
+ [
2752
+ "v",
2753
+ "Customer"
2754
+ ],
2755
+ " Confidential Information."
2756
+ ]
2757
+ },
2758
+ {
2759
+ "n": "13.15",
2760
+ "l": 2,
2761
+ "r": [
2762
+ [
2763
+ "b",
2764
+ "“Protected Party”"
2765
+ ],
2766
+ " means a party to this Agreement when the party is receiving the benefit of protection for a particular Covered Claim."
2767
+ ]
2768
+ },
2769
+ {
2770
+ "n": "13.16",
2771
+ "l": 2,
2772
+ "r": [
2773
+ [
2774
+ "b",
2775
+ "“Recipient”"
2776
+ ],
2777
+ " means a party to this Agreement when the party receives Confidential Information from the other party."
2778
+ ]
2779
+ },
2780
+ {
2781
+ "n": "13.17",
2782
+ "l": 2,
2783
+ "r": [
2784
+ [
2785
+ "b",
2786
+ "“Services”"
2787
+ ],
2788
+ " means the services described in a SOW, including the creation of ",
2789
+ [
2790
+ "v",
2791
+ "Deliverables"
2792
+ ],
2793
+ " (if any)."
2794
+ ]
2795
+ },
2796
+ {
2797
+ "n": "13.18",
2798
+ "l": 2,
2799
+ "r": [
2800
+ [
2801
+ "b",
2802
+ "“SOW”"
2803
+ ],
2804
+ " means a Cover Page that includes the key business details and definitions for this Agreement that are not defined in the Key Terms or Standard Terms. A SOW may include details about the ",
2805
+ [
2806
+ "v",
2807
+ "Deliverables"
2808
+ ],
2809
+ ", ",
2810
+ [
2811
+ "v",
2812
+ "Fees"
2813
+ ],
2814
+ ", or other details about the Services."
2815
+ ]
2816
+ },
2817
+ {
2818
+ "n": "13.19",
2819
+ "l": 2,
2820
+ "r": [
2821
+ [
2822
+ "b",
2823
+ "“Subcontractors”"
2824
+ ],
2825
+ " means other people or companies engaged by ",
2826
+ [
2827
+ "v",
2828
+ "Provider"
2829
+ ],
2830
+ " to perform some of the Services, including ",
2831
+ [
2832
+ "v",
2833
+ "Provider’s"
2834
+ ],
2835
+ " Affiliates."
2836
+ ]
2837
+ },
2838
+ {
2839
+ "n": "13.20",
2840
+ "l": 2,
2841
+ "r": [
2842
+ [
2843
+ "b",
2844
+ "“Third-Party Materials”"
2845
+ ],
2846
+ " means any information, tools, materials, or intellectual property owned by anyone other than ",
2847
+ [
2848
+ "v",
2849
+ "Provider"
2850
+ ],
2851
+ ", its Affiliates, or ",
2852
+ [
2853
+ "v",
2854
+ "Customer"
2855
+ ],
2856
+ "."
2857
+ ]
2858
+ },
2859
+ {
2860
+ "n": "13.21",
2861
+ "l": 2,
2862
+ "r": [
2863
+ [
2864
+ "b",
2865
+ "“Usage Data”"
2866
+ ],
2867
+ " means data and information about the provision, use, and performance of the Services based on ",
2868
+ [
2869
+ "v",
2870
+ "Customer’s"
2871
+ ],
2872
+ " use of the Services."
2873
+ ]
2874
+ }
2875
+ ]
2876
+ }