@mylasertools/kerfscript 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -2
- package/LANGUAGE.md +95 -64
- package/README.md +21 -10
- package/THIRD-PARTY-NOTICES.md +13 -4
- package/dist/cli.js +529 -243
- package/dist/evaluator.d.cts +3 -0
- package/dist/evaluator.d.ts +3 -0
- package/dist/export/dxf.d.cts +1 -1
- package/dist/export/dxf.d.ts +1 -1
- package/dist/font.d.cts +3 -0
- package/dist/font.d.ts +3 -0
- package/dist/functions.d.cts +21 -2
- package/dist/functions.d.ts +21 -2
- package/dist/index.cjs +11 -11
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +11 -11
- package/dist/lexer.d.cts +4 -1
- package/dist/lexer.d.ts +4 -1
- package/dist/parser.d.cts +1 -1
- package/dist/parser.d.ts +1 -1
- package/dist/render.d.cts +1 -1
- package/dist/render.d.ts +1 -1
- package/dist/values.d.cts +10 -2
- package/dist/values.d.ts +10 -2
- package/dist/wasm.d.cts +1 -0
- package/dist/wasm.d.ts +1 -0
- package/docs/cli.md +46 -20
- package/docs/compatibility.md +3 -3
- package/docs/customizer.md +9 -9
- package/docs/desktop.md +96 -0
- package/docs/javascript.md +29 -27
- package/docs/layers.md +6 -6
- package/docs/openscad.md +9 -9
- package/docs/versions.md +2 -2
- package/docs/webassembly.md +131 -0
- package/fonts/OFL.txt +92 -0
- package/package.json +6 -3
package/dist/cli.js
CHANGED
|
@@ -31,10 +31,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
31
31
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
32
32
|
mod
|
|
33
33
|
));
|
|
34
|
+
var __toBinaryNode = (base64) => new Uint8Array(Buffer.from(base64, "base64"));
|
|
34
35
|
|
|
35
|
-
//
|
|
36
|
+
// node_modules/opentype.js/dist/opentype.js
|
|
36
37
|
var require_opentype = __commonJS({
|
|
37
|
-
"
|
|
38
|
+
"node_modules/opentype.js/dist/opentype.js"(exports, module) {
|
|
38
39
|
(function(global, factory) {
|
|
39
40
|
typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global = global || self, factory(global.opentype = {}));
|
|
40
41
|
})(exports, (function(exports2) {
|
|
@@ -922,14 +923,14 @@ var require_opentype = __commonJS({
|
|
|
922
923
|
}
|
|
923
924
|
return encodingTable;
|
|
924
925
|
};
|
|
925
|
-
encode.MACSTRING = function(
|
|
926
|
+
encode.MACSTRING = function(str, encoding) {
|
|
926
927
|
var table2 = getMacEncodingTable(encoding);
|
|
927
928
|
if (table2 === void 0) {
|
|
928
929
|
return void 0;
|
|
929
930
|
}
|
|
930
931
|
var result = [];
|
|
931
|
-
for (var i = 0; i <
|
|
932
|
-
var c =
|
|
932
|
+
for (var i = 0; i < str.length; i++) {
|
|
933
|
+
var c = str.charCodeAt(i);
|
|
933
934
|
if (c >= 128) {
|
|
934
935
|
c = table2[c];
|
|
935
936
|
if (c === void 0) {
|
|
@@ -940,8 +941,8 @@ var require_opentype = __commonJS({
|
|
|
940
941
|
}
|
|
941
942
|
return result;
|
|
942
943
|
};
|
|
943
|
-
sizeOf.MACSTRING = function(
|
|
944
|
-
var b = encode.MACSTRING(
|
|
944
|
+
sizeOf.MACSTRING = function(str, encoding) {
|
|
945
|
+
var b = encode.MACSTRING(str, encoding);
|
|
945
946
|
if (b !== void 0) {
|
|
946
947
|
return b.length;
|
|
947
948
|
} else {
|
|
@@ -5687,18 +5688,18 @@ var require_opentype = __commonJS({
|
|
|
5687
5688
|
var language = getLanguageCode(platformID, languageID, ltag2);
|
|
5688
5689
|
var encoding = getEncoding(platformID, encodingID, languageID);
|
|
5689
5690
|
if (encoding !== void 0 && language !== void 0) {
|
|
5690
|
-
var
|
|
5691
|
+
var text2 = void 0;
|
|
5691
5692
|
if (encoding === utf16) {
|
|
5692
|
-
|
|
5693
|
+
text2 = decode.UTF16(data, stringOffset + offset2, byteLength);
|
|
5693
5694
|
} else {
|
|
5694
|
-
|
|
5695
|
+
text2 = decode.MACSTRING(data, stringOffset + offset2, byteLength, encoding);
|
|
5695
5696
|
}
|
|
5696
|
-
if (
|
|
5697
|
+
if (text2) {
|
|
5697
5698
|
var translations = name[property];
|
|
5698
5699
|
if (translations === void 0) {
|
|
5699
5700
|
translations = name[property] = {};
|
|
5700
5701
|
}
|
|
5701
|
-
translations[language] =
|
|
5702
|
+
translations[language] = text2;
|
|
5702
5703
|
}
|
|
5703
5704
|
}
|
|
5704
5705
|
}
|
|
@@ -5778,12 +5779,12 @@ var require_opentype = __commonJS({
|
|
|
5778
5779
|
nameID = nameIDs[i];
|
|
5779
5780
|
var translations = namesWithNumericKeys[nameID];
|
|
5780
5781
|
for (var lang in translations) {
|
|
5781
|
-
var
|
|
5782
|
+
var text2 = translations[lang];
|
|
5782
5783
|
var macPlatform = 1;
|
|
5783
5784
|
var macLanguage = macLanguageIds[lang];
|
|
5784
5785
|
var macScript = macLanguageToScript[macLanguage];
|
|
5785
5786
|
var macEncoding = getEncoding(macPlatform, macScript, macLanguage);
|
|
5786
|
-
var macName = encode.MACSTRING(
|
|
5787
|
+
var macName = encode.MACSTRING(text2, macEncoding);
|
|
5787
5788
|
if (macName === void 0) {
|
|
5788
5789
|
macPlatform = 0;
|
|
5789
5790
|
macLanguage = ltag2.indexOf(lang);
|
|
@@ -5792,7 +5793,7 @@ var require_opentype = __commonJS({
|
|
|
5792
5793
|
ltag2.push(lang);
|
|
5793
5794
|
}
|
|
5794
5795
|
macScript = 4;
|
|
5795
|
-
macName = encode.UTF16(
|
|
5796
|
+
macName = encode.UTF16(text2);
|
|
5796
5797
|
}
|
|
5797
5798
|
var macNameOffset = addStringToPool(macName, stringPool);
|
|
5798
5799
|
nameRecords.push(makeNameRecord(
|
|
@@ -5805,7 +5806,7 @@ var require_opentype = __commonJS({
|
|
|
5805
5806
|
));
|
|
5806
5807
|
var winLanguage = windowsLanguageIds[lang];
|
|
5807
5808
|
if (winLanguage !== void 0) {
|
|
5808
|
-
var winName = encode.UTF16(
|
|
5809
|
+
var winName = encode.UTF16(text2);
|
|
5809
5810
|
var winNameOffset = addStringToPool(winName, stringPool);
|
|
5810
5811
|
nameRecords.push(makeNameRecord(
|
|
5811
5812
|
3,
|
|
@@ -6537,8 +6538,8 @@ var require_opentype = __commonJS({
|
|
|
6537
6538
|
var tag = p.parseTag();
|
|
6538
6539
|
var dataOffset = p.parseULong();
|
|
6539
6540
|
var dataLength = p.parseULong();
|
|
6540
|
-
var
|
|
6541
|
-
tags[tag] =
|
|
6541
|
+
var text2 = decode.UTF8(data, start + dataOffset, dataLength);
|
|
6542
|
+
tags[tag] = text2;
|
|
6542
6543
|
}
|
|
6543
6544
|
return tags;
|
|
6544
6545
|
}
|
|
@@ -10474,10 +10475,10 @@ var require_opentype = __commonJS({
|
|
|
10474
10475
|
}
|
|
10475
10476
|
});
|
|
10476
10477
|
};
|
|
10477
|
-
Tokenizer.prototype.tokenize = function(
|
|
10478
|
+
Tokenizer.prototype.tokenize = function(text2) {
|
|
10478
10479
|
this.tokens = [];
|
|
10479
10480
|
this.resetContextsRanges();
|
|
10480
|
-
var chars = Array.from(
|
|
10481
|
+
var chars = Array.from(text2);
|
|
10481
10482
|
this.dispatch("start");
|
|
10482
10483
|
for (var i = 0; i < chars.length; i++) {
|
|
10483
10484
|
var char = chars[i];
|
|
@@ -11166,8 +11167,8 @@ var require_opentype = __commonJS({
|
|
|
11166
11167
|
this.tokenizer = new Tokenizer();
|
|
11167
11168
|
this.featuresTags = {};
|
|
11168
11169
|
}
|
|
11169
|
-
Bidi.prototype.setText = function(
|
|
11170
|
-
this.text =
|
|
11170
|
+
Bidi.prototype.setText = function(text2) {
|
|
11171
|
+
this.text = text2;
|
|
11171
11172
|
};
|
|
11172
11173
|
Bidi.prototype.contextChecks = {
|
|
11173
11174
|
latinWordCheck,
|
|
@@ -11299,19 +11300,19 @@ var require_opentype = __commonJS({
|
|
|
11299
11300
|
reverseArabicSentences.call(this);
|
|
11300
11301
|
}
|
|
11301
11302
|
};
|
|
11302
|
-
Bidi.prototype.processText = function(
|
|
11303
|
-
if (!this.text || this.text !==
|
|
11304
|
-
this.setText(
|
|
11303
|
+
Bidi.prototype.processText = function(text2) {
|
|
11304
|
+
if (!this.text || this.text !== text2) {
|
|
11305
|
+
this.setText(text2);
|
|
11305
11306
|
tokenizeText.call(this);
|
|
11306
11307
|
this.applyFeaturesToContexts();
|
|
11307
11308
|
}
|
|
11308
11309
|
};
|
|
11309
|
-
Bidi.prototype.getBidiText = function(
|
|
11310
|
-
this.processText(
|
|
11310
|
+
Bidi.prototype.getBidiText = function(text2) {
|
|
11311
|
+
this.processText(text2);
|
|
11311
11312
|
return this.tokenizer.getText();
|
|
11312
11313
|
};
|
|
11313
|
-
Bidi.prototype.getTextGlyphs = function(
|
|
11314
|
-
this.processText(
|
|
11314
|
+
Bidi.prototype.getTextGlyphs = function(text2) {
|
|
11315
|
+
this.processText(text2);
|
|
11315
11316
|
var indexes = [];
|
|
11316
11317
|
for (var i = 0; i < this.tokenizer.tokens.length; i++) {
|
|
11317
11318
|
var token = this.tokenizer.tokens[i];
|
|
@@ -11463,13 +11464,13 @@ var require_opentype = __commonJS({
|
|
|
11463
11464
|
{ script: "latn", tags: ["liga", "rlig"] }
|
|
11464
11465
|
]
|
|
11465
11466
|
};
|
|
11466
|
-
Font.prototype.forEachGlyph = function(
|
|
11467
|
+
Font.prototype.forEachGlyph = function(text2, x, y, fontSize, options, callback) {
|
|
11467
11468
|
x = x !== void 0 ? x : 0;
|
|
11468
11469
|
y = y !== void 0 ? y : 0;
|
|
11469
11470
|
fontSize = fontSize !== void 0 ? fontSize : 72;
|
|
11470
11471
|
options = Object.assign({}, this.defaultRenderOptions, options);
|
|
11471
11472
|
var fontScale = 1 / this.unitsPerEm * fontSize;
|
|
11472
|
-
var glyphs = this.stringToGlyphs(
|
|
11473
|
+
var glyphs = this.stringToGlyphs(text2, options);
|
|
11473
11474
|
var kerningLookups;
|
|
11474
11475
|
if (options.kerning) {
|
|
11475
11476
|
var script = options.script || this.position.getDefaultScriptName();
|
|
@@ -11493,36 +11494,36 @@ var require_opentype = __commonJS({
|
|
|
11493
11494
|
}
|
|
11494
11495
|
return x;
|
|
11495
11496
|
};
|
|
11496
|
-
Font.prototype.getPath = function(
|
|
11497
|
+
Font.prototype.getPath = function(text2, x, y, fontSize, options) {
|
|
11497
11498
|
var fullPath = new Path();
|
|
11498
|
-
this.forEachGlyph(
|
|
11499
|
+
this.forEachGlyph(text2, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {
|
|
11499
11500
|
var glyphPath = glyph.getPath(gX, gY, gFontSize, options, this);
|
|
11500
11501
|
fullPath.extend(glyphPath);
|
|
11501
11502
|
});
|
|
11502
11503
|
return fullPath;
|
|
11503
11504
|
};
|
|
11504
|
-
Font.prototype.getPaths = function(
|
|
11505
|
+
Font.prototype.getPaths = function(text2, x, y, fontSize, options) {
|
|
11505
11506
|
var glyphPaths = [];
|
|
11506
|
-
this.forEachGlyph(
|
|
11507
|
+
this.forEachGlyph(text2, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {
|
|
11507
11508
|
var glyphPath = glyph.getPath(gX, gY, gFontSize, options, this);
|
|
11508
11509
|
glyphPaths.push(glyphPath);
|
|
11509
11510
|
});
|
|
11510
11511
|
return glyphPaths;
|
|
11511
11512
|
};
|
|
11512
|
-
Font.prototype.getAdvanceWidth = function(
|
|
11513
|
-
return this.forEachGlyph(
|
|
11513
|
+
Font.prototype.getAdvanceWidth = function(text2, fontSize, options) {
|
|
11514
|
+
return this.forEachGlyph(text2, 0, 0, fontSize, options, function() {
|
|
11514
11515
|
});
|
|
11515
11516
|
};
|
|
11516
|
-
Font.prototype.draw = function(ctx,
|
|
11517
|
-
this.getPath(
|
|
11517
|
+
Font.prototype.draw = function(ctx, text2, x, y, fontSize, options) {
|
|
11518
|
+
this.getPath(text2, x, y, fontSize, options).draw(ctx);
|
|
11518
11519
|
};
|
|
11519
|
-
Font.prototype.drawPoints = function(ctx,
|
|
11520
|
-
this.forEachGlyph(
|
|
11520
|
+
Font.prototype.drawPoints = function(ctx, text2, x, y, fontSize, options) {
|
|
11521
|
+
this.forEachGlyph(text2, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {
|
|
11521
11522
|
glyph.drawPoints(ctx, gX, gY, gFontSize);
|
|
11522
11523
|
});
|
|
11523
11524
|
};
|
|
11524
|
-
Font.prototype.drawMetrics = function(ctx,
|
|
11525
|
-
this.forEachGlyph(
|
|
11525
|
+
Font.prototype.drawMetrics = function(ctx, text2, x, y, fontSize, options) {
|
|
11526
|
+
this.forEachGlyph(text2, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {
|
|
11526
11527
|
glyph.drawMetrics(ctx, gX, gY, gFontSize);
|
|
11527
11528
|
});
|
|
11528
11529
|
};
|
|
@@ -12305,12 +12306,21 @@ import { basename, dirname, extname, join, resolve } from "node:path";
|
|
|
12305
12306
|
var isRange = (v) => typeof v === "object" && v !== null && !Array.isArray(v) && v.type === "range";
|
|
12306
12307
|
var isFn = (v) => typeof v === "object" && v !== null && !Array.isArray(v) && v.type === "function";
|
|
12307
12308
|
var isNum = (v) => typeof v === "number";
|
|
12309
|
+
var own = (o, key) => o && Object.prototype.hasOwnProperty.call(o, key) ? o[key] : void 0;
|
|
12310
|
+
function checkSetting(name, v, depth = 0) {
|
|
12311
|
+
if (v === null || v === void 0 || ["number", "string", "boolean"].includes(typeof v)) return;
|
|
12312
|
+
if (Array.isArray(v) && depth < 32) {
|
|
12313
|
+
for (const x of v) checkSetting(name, x, depth + 1);
|
|
12314
|
+
return;
|
|
12315
|
+
}
|
|
12316
|
+
throw new Error(`Setting "${name}" must be a number, string, boolean or list`);
|
|
12317
|
+
}
|
|
12308
12318
|
function rangeValues(r, limit) {
|
|
12309
12319
|
const out = [];
|
|
12310
12320
|
if (r.step === 0) return out;
|
|
12311
12321
|
if (r.step > 0 ? r.start > r.end : r.start < r.end) return out;
|
|
12312
12322
|
const n2 = Math.floor((r.end - r.start) / r.step + 1e-9) + 1;
|
|
12313
|
-
if (n2 > limit) throw new Error(`
|
|
12323
|
+
if (n2 > limit) throw new Error(`a range of ${n2} items is more than the limit of ${limit}`);
|
|
12314
12324
|
for (let k = 0; k < n2; k++) out.push(r.start + k * r.step);
|
|
12315
12325
|
return out;
|
|
12316
12326
|
}
|
|
@@ -12320,11 +12330,34 @@ function truthy(v) {
|
|
|
12320
12330
|
if (typeof v === "number") return !Number.isNaN(v);
|
|
12321
12331
|
return true;
|
|
12322
12332
|
}
|
|
12323
|
-
|
|
12324
|
-
|
|
12325
|
-
|
|
12326
|
-
if (
|
|
12327
|
-
|
|
12333
|
+
var same = (a, b) => isRange(a) && isRange(b) ? a.start === b.start && a.step === b.step && a.end === b.end : a === b;
|
|
12334
|
+
function equals(a, b, step) {
|
|
12335
|
+
step?.();
|
|
12336
|
+
if (!Array.isArray(a) || !Array.isArray(b)) return same(a, b);
|
|
12337
|
+
const seen = /* @__PURE__ */ new Map();
|
|
12338
|
+
const open = [];
|
|
12339
|
+
const enter = (x, y) => {
|
|
12340
|
+
let ys = seen.get(x);
|
|
12341
|
+
if (ys?.has(y)) return true;
|
|
12342
|
+
if (x.length !== y.length) return false;
|
|
12343
|
+
if (!ys) seen.set(x, ys = /* @__PURE__ */ new Set());
|
|
12344
|
+
ys.add(y);
|
|
12345
|
+
open.push([x, y, 0]);
|
|
12346
|
+
return true;
|
|
12347
|
+
};
|
|
12348
|
+
if (!enter(a, b)) return false;
|
|
12349
|
+
while (open.length) {
|
|
12350
|
+
const top = open[open.length - 1];
|
|
12351
|
+
if (top[2] === top[0].length) {
|
|
12352
|
+
open.pop();
|
|
12353
|
+
continue;
|
|
12354
|
+
}
|
|
12355
|
+
const x = top[0][top[2]];
|
|
12356
|
+
const y = top[1][top[2]++];
|
|
12357
|
+
step?.();
|
|
12358
|
+
if (Array.isArray(x) && Array.isArray(y) ? !enter(x, y) : !same(x, y)) return false;
|
|
12359
|
+
}
|
|
12360
|
+
return true;
|
|
12328
12361
|
}
|
|
12329
12362
|
function typeName(v) {
|
|
12330
12363
|
if (v === void 0) return "undef";
|
|
@@ -12333,17 +12366,73 @@ function typeName(v) {
|
|
|
12333
12366
|
if (isFn(v)) return "function";
|
|
12334
12367
|
return typeof v;
|
|
12335
12368
|
}
|
|
12336
|
-
function
|
|
12369
|
+
function scalar(v) {
|
|
12337
12370
|
if (v === void 0) return "undef";
|
|
12338
12371
|
if (typeof v === "string") return JSON.stringify(v);
|
|
12339
12372
|
if (typeof v === "number") return fmt(v);
|
|
12340
|
-
if (Array.isArray(v)) return `[${v.map(show).join(", ")}]`;
|
|
12341
12373
|
if (isRange(v)) return `[${fmt(v.start)}:${fmt(v.step)}:${fmt(v.end)}]`;
|
|
12342
12374
|
if (isFn(v)) return `function(${v.params.map((p) => p.name).join(", ")})`;
|
|
12343
12375
|
return String(v);
|
|
12344
12376
|
}
|
|
12345
|
-
function
|
|
12346
|
-
|
|
12377
|
+
function write(v, max, quote = false) {
|
|
12378
|
+
if (typeof v === "string" && !quote)
|
|
12379
|
+
return { text: v.length > max ? v.slice(0, Math.max(max, 0)) : v, whole: v.length <= max };
|
|
12380
|
+
const out = [];
|
|
12381
|
+
let n2 = 0;
|
|
12382
|
+
const put = (s) => {
|
|
12383
|
+
out.push(s);
|
|
12384
|
+
n2 += s.length;
|
|
12385
|
+
};
|
|
12386
|
+
const open = [];
|
|
12387
|
+
let next = v;
|
|
12388
|
+
for (; ; ) {
|
|
12389
|
+
if (Array.isArray(next)) {
|
|
12390
|
+
put("[");
|
|
12391
|
+
open.push([next, 0]);
|
|
12392
|
+
} else put(scalar(next));
|
|
12393
|
+
let more = false;
|
|
12394
|
+
while (open.length && !more) {
|
|
12395
|
+
const top = open[open.length - 1];
|
|
12396
|
+
if (top[1] < top[0].length) {
|
|
12397
|
+
if (top[1]) put(", ");
|
|
12398
|
+
next = top[0][top[1]++];
|
|
12399
|
+
more = true;
|
|
12400
|
+
} else {
|
|
12401
|
+
open.pop();
|
|
12402
|
+
put("]");
|
|
12403
|
+
}
|
|
12404
|
+
}
|
|
12405
|
+
if (!more || n2 > max) break;
|
|
12406
|
+
}
|
|
12407
|
+
const text2 = out.join("");
|
|
12408
|
+
return n2 > max ? { text: text2.slice(0, Math.max(max, 0)), whole: false } : { text: text2, whole: true };
|
|
12409
|
+
}
|
|
12410
|
+
function joinText(vs, sep, max) {
|
|
12411
|
+
const out = [];
|
|
12412
|
+
let n2 = 0;
|
|
12413
|
+
for (const v of vs) {
|
|
12414
|
+
if (out.length) n2 += sep.length;
|
|
12415
|
+
const r = write(v, max - n2);
|
|
12416
|
+
if (!r.whole) return void 0;
|
|
12417
|
+
n2 += r.text.length;
|
|
12418
|
+
out.push(r.text);
|
|
12419
|
+
}
|
|
12420
|
+
return out.join(sep);
|
|
12421
|
+
}
|
|
12422
|
+
function show(v) {
|
|
12423
|
+
const r = write(v, 200, true);
|
|
12424
|
+
return r.whole ? r.text : r.text + "...";
|
|
12425
|
+
}
|
|
12426
|
+
var toText = (v) => typeof v === "string" ? v : show(v);
|
|
12427
|
+
function toNumber(v) {
|
|
12428
|
+
let inList = false;
|
|
12429
|
+
while (Array.isArray(v) && v.length === 1) {
|
|
12430
|
+
v = v[0];
|
|
12431
|
+
inList = true;
|
|
12432
|
+
}
|
|
12433
|
+
if (Array.isArray(v)) return v.length ? NaN : 0;
|
|
12434
|
+
if (inList && (v === void 0 || typeof v === "boolean")) return v === void 0 ? 0 : NaN;
|
|
12435
|
+
return typeof v === "object" ? NaN : Number(v);
|
|
12347
12436
|
}
|
|
12348
12437
|
function fmt(n2) {
|
|
12349
12438
|
if (Number.isInteger(n2)) return String(n2);
|
|
@@ -12352,17 +12441,72 @@ function fmt(n2) {
|
|
|
12352
12441
|
|
|
12353
12442
|
// src/functions.ts
|
|
12354
12443
|
var RAD = Math.PI / 180;
|
|
12444
|
+
var def = (sig, run, order) => ({
|
|
12445
|
+
params: sig.replace("...", "").split(",").map((p) => p.trim()).filter(Boolean),
|
|
12446
|
+
rest: sig.endsWith("..."),
|
|
12447
|
+
order,
|
|
12448
|
+
run
|
|
12449
|
+
});
|
|
12450
|
+
function givenTwice(f, pos, named) {
|
|
12451
|
+
if (f.order) return [];
|
|
12452
|
+
return f.params.filter((p, i) => i < pos.length && named.has(p));
|
|
12453
|
+
}
|
|
12454
|
+
function bindArgs(f, pos, named) {
|
|
12455
|
+
if (f.rest) {
|
|
12456
|
+
const out = [...pos];
|
|
12457
|
+
f.params.forEach((p, i) => {
|
|
12458
|
+
if (named.has(p)) out[i] = named.get(p);
|
|
12459
|
+
});
|
|
12460
|
+
return out;
|
|
12461
|
+
}
|
|
12462
|
+
if (!f.order) return f.params.map((p, i) => named.has(p) ? named.get(p) : pos[i]);
|
|
12463
|
+
const given = pos.length + f.params.filter((p) => named.has(p)).length;
|
|
12464
|
+
const free = f.order(given).filter((p) => !named.has(p));
|
|
12465
|
+
return f.params.map((p) => named.has(p) ? named.get(p) : pos[free.indexOf(p)]);
|
|
12466
|
+
}
|
|
12467
|
+
function text(vs, sep, c, fn) {
|
|
12468
|
+
const out = joinText(vs, sep, c.maxLength);
|
|
12469
|
+
if (out === void 0)
|
|
12470
|
+
throw new Error(
|
|
12471
|
+
`${fn}(): the text would be longer than the limit of ${c.maxLength} characters`
|
|
12472
|
+
);
|
|
12473
|
+
c.step(Math.ceil(out.length / 8));
|
|
12474
|
+
return out;
|
|
12475
|
+
}
|
|
12355
12476
|
function num(v, fn) {
|
|
12356
12477
|
if (typeof v !== "number") throw new Error(`${fn}() needs a number, got ${typeName(v)}`);
|
|
12357
12478
|
return v;
|
|
12358
12479
|
}
|
|
12359
|
-
function list(v, fn) {
|
|
12480
|
+
function list(v, fn, c) {
|
|
12360
12481
|
if (Array.isArray(v)) return v;
|
|
12361
|
-
if (isRange(v)) return rangeValues(v,
|
|
12482
|
+
if (isRange(v)) return rangeValues(v, c.maxLength);
|
|
12362
12483
|
if (typeof v === "string") return [...v];
|
|
12363
12484
|
throw new Error(`${fn}() needs a list, got ${typeName(v)}`);
|
|
12364
12485
|
}
|
|
12365
|
-
var
|
|
12486
|
+
var CONSTANT_TIME = /* @__PURE__ */ new Set([
|
|
12487
|
+
"is_num",
|
|
12488
|
+
"is_string",
|
|
12489
|
+
"is_bool",
|
|
12490
|
+
"is_list",
|
|
12491
|
+
"is_undef",
|
|
12492
|
+
"is_function",
|
|
12493
|
+
"type_of",
|
|
12494
|
+
"ord"
|
|
12495
|
+
]);
|
|
12496
|
+
function argumentWork(name, args, max) {
|
|
12497
|
+
if (CONSTANT_TIME.has(name)) return 0;
|
|
12498
|
+
let n2 = 0;
|
|
12499
|
+
for (const v of args) {
|
|
12500
|
+
if (typeof v === "string") n2 += v.length;
|
|
12501
|
+
else if (Array.isArray(v)) n2 += name === "len" ? 0 : v.length;
|
|
12502
|
+
else if (isRange(v) && v.step !== 0) {
|
|
12503
|
+
const items = Math.floor((v.end - v.start) / v.step) + 1;
|
|
12504
|
+
if (items > 0) n2 += Math.min(items, max + 1);
|
|
12505
|
+
}
|
|
12506
|
+
}
|
|
12507
|
+
return n2;
|
|
12508
|
+
}
|
|
12509
|
+
var math1 = (f) => def("x", (a) => typeof a[0] === "number" ? clean(f(a[0])) : void 0);
|
|
12366
12510
|
function clean(x) {
|
|
12367
12511
|
const r = Math.round(x);
|
|
12368
12512
|
return Math.abs(x - r) < 1e-12 ? r : x;
|
|
@@ -12383,69 +12527,112 @@ function minmax(a, pick, name) {
|
|
|
12383
12527
|
return pick(xs.map((x) => num(x, name)));
|
|
12384
12528
|
}
|
|
12385
12529
|
var FUNCTIONS = {
|
|
12386
|
-
abs: math1(
|
|
12387
|
-
sign: math1(
|
|
12388
|
-
floor: math1(
|
|
12389
|
-
ceil: math1(
|
|
12390
|
-
round: math1(
|
|
12391
|
-
sqrt: math1(
|
|
12392
|
-
exp: math1(
|
|
12393
|
-
ln: math1(
|
|
12394
|
-
log
|
|
12395
|
-
|
|
12396
|
-
|
|
12397
|
-
|
|
12398
|
-
|
|
12399
|
-
|
|
12400
|
-
|
|
12401
|
-
|
|
12402
|
-
|
|
12403
|
-
|
|
12404
|
-
|
|
12405
|
-
|
|
12406
|
-
|
|
12530
|
+
abs: math1(Math.abs),
|
|
12531
|
+
sign: math1(Math.sign),
|
|
12532
|
+
floor: math1(Math.floor),
|
|
12533
|
+
ceil: math1(Math.ceil),
|
|
12534
|
+
round: math1((x) => x < 0 ? -Math.round(-x) : Math.round(x)),
|
|
12535
|
+
sqrt: math1(Math.sqrt),
|
|
12536
|
+
exp: math1(Math.exp),
|
|
12537
|
+
ln: math1(Math.log),
|
|
12538
|
+
// log(x) is base 10; log(base, x) takes the base first
|
|
12539
|
+
log: def(
|
|
12540
|
+
"x, base",
|
|
12541
|
+
(a, c) => c.given < 2 ? clean(Math.log10(num(a[0], "log"))) : Math.log(num(a[0], "log")) / Math.log(num(a[1], "log")),
|
|
12542
|
+
(n2) => n2 >= 2 ? ["base", "x"] : ["x", "base"]
|
|
12543
|
+
),
|
|
12544
|
+
sin: math1((x) => Math.sin(x * RAD)),
|
|
12545
|
+
cos: math1((x) => Math.cos(x * RAD)),
|
|
12546
|
+
tan: math1((x) => Math.tan(x * RAD)),
|
|
12547
|
+
asin: math1((x) => Math.asin(x) / RAD),
|
|
12548
|
+
acos: math1((x) => Math.acos(x) / RAD),
|
|
12549
|
+
atan: math1((x) => Math.atan(x) / RAD),
|
|
12550
|
+
atan2: def("y, x", (a) => clean(Math.atan2(num(a[0], "atan2"), num(a[1], "atan2")) / RAD)),
|
|
12551
|
+
pow: def("x, y", (a) => Math.pow(num(a[0], "pow"), num(a[1], "pow"))),
|
|
12552
|
+
min: def(
|
|
12553
|
+
"values...",
|
|
12554
|
+
(a) => minmax(a, (xs) => xs.reduce((m, x) => x < m ? x : m, Infinity), "min")
|
|
12555
|
+
),
|
|
12556
|
+
max: def(
|
|
12557
|
+
"values...",
|
|
12558
|
+
(a) => minmax(a, (xs) => xs.reduce((m, x) => x > m ? x : m, -Infinity), "max")
|
|
12559
|
+
),
|
|
12560
|
+
clamp: def(
|
|
12561
|
+
"x, low, high",
|
|
12562
|
+
(a) => Math.min(Math.max(num(a[0], "clamp"), num(a[1], "clamp")), num(a[2], "clamp"))
|
|
12563
|
+
),
|
|
12564
|
+
lerp: def("a, b, t", (a) => {
|
|
12407
12565
|
const t = num(a[2], "lerp");
|
|
12408
12566
|
if (Array.isArray(a[0]) && Array.isArray(a[1])) {
|
|
12409
12567
|
const b = a[1];
|
|
12410
12568
|
return a[0].map((x, i) => num(x, "lerp") + (num(b[i], "lerp") - num(x, "lerp")) * t);
|
|
12411
12569
|
}
|
|
12412
12570
|
return num(a[0], "lerp") + (num(a[1], "lerp") - num(a[0], "lerp")) * t;
|
|
12413
|
-
},
|
|
12414
|
-
norm: (
|
|
12415
|
-
|
|
12416
|
-
|
|
12417
|
-
|
|
12571
|
+
}),
|
|
12572
|
+
norm: def(
|
|
12573
|
+
"v",
|
|
12574
|
+
(a, c) => Math.sqrt(list(a[0], "norm", c).reduce((s, x) => s + num(x, "norm") ** 2, 0))
|
|
12575
|
+
),
|
|
12576
|
+
cross: def("a, b", (a, c) => {
|
|
12577
|
+
const u = list(a[0], "cross", c).map((x) => num(x, "cross"));
|
|
12578
|
+
const v = list(a[1], "cross", c).map((x) => num(x, "cross"));
|
|
12418
12579
|
if (u.length === 2) return u[0] * v[1] - u[1] * v[0];
|
|
12419
12580
|
return [u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]];
|
|
12420
|
-
},
|
|
12421
|
-
len: (
|
|
12422
|
-
|
|
12423
|
-
|
|
12424
|
-
|
|
12425
|
-
|
|
12426
|
-
const
|
|
12581
|
+
}),
|
|
12582
|
+
len: def(
|
|
12583
|
+
"value",
|
|
12584
|
+
(a) => typeof a[0] === "string" ? [...a[0]].length : Array.isArray(a[0]) ? a[0].length : void 0
|
|
12585
|
+
),
|
|
12586
|
+
concat: def("...", (a, c) => {
|
|
12587
|
+
const n2 = a.reduce((s, x) => s + (Array.isArray(x) ? x.length : 1), 0);
|
|
12588
|
+
if (n2 > c.maxLength)
|
|
12589
|
+
throw new Error(`concat(): a list of ${n2} items is more than the limit of ${c.maxLength}`);
|
|
12590
|
+
return a.flatMap((x) => Array.isArray(x) ? x : [x]);
|
|
12591
|
+
}),
|
|
12592
|
+
reverse: def(
|
|
12593
|
+
"value",
|
|
12594
|
+
(a, c) => typeof a[0] === "string" ? [...a[0]].reverse().join("") : [...list(a[0], "reverse", c)].reverse()
|
|
12595
|
+
),
|
|
12596
|
+
sum: def("values", (a, c) => list(a[0], "sum", c).reduce((s, x) => s + num(x, "sum"), 0)),
|
|
12597
|
+
slice: def("value, start, end", (a, c) => {
|
|
12598
|
+
const xs = typeof a[0] === "string" ? [...a[0]] : list(a[0], "slice", c);
|
|
12427
12599
|
const out = xs.slice(
|
|
12428
12600
|
num(a[1] ?? 0, "slice"),
|
|
12429
12601
|
a[2] === void 0 ? void 0 : num(a[2], "slice")
|
|
12430
12602
|
);
|
|
12431
12603
|
return typeof a[0] === "string" ? out.join("") : out;
|
|
12432
|
-
},
|
|
12433
|
-
str: (a) => a
|
|
12434
|
-
chr: (
|
|
12435
|
-
|
|
12436
|
-
|
|
12437
|
-
|
|
12438
|
-
|
|
12439
|
-
|
|
12440
|
-
|
|
12441
|
-
|
|
12442
|
-
|
|
12604
|
+
}),
|
|
12605
|
+
str: def("...", (a, c) => text(a, "", c, "str")),
|
|
12606
|
+
chr: def(
|
|
12607
|
+
"...",
|
|
12608
|
+
(a) => a.flatMap((x) => Array.isArray(x) ? x : [x]).map((x) => String.fromCodePoint(num(x, "chr"))).join("")
|
|
12609
|
+
),
|
|
12610
|
+
ord: def(
|
|
12611
|
+
"text",
|
|
12612
|
+
(a) => typeof a[0] === "string" && a[0].length ? a[0].codePointAt(0) : void 0
|
|
12613
|
+
),
|
|
12614
|
+
upper: def("text", (a) => typeof a[0] === "string" ? a[0].toUpperCase() : void 0),
|
|
12615
|
+
lower: def("text", (a) => typeof a[0] === "string" ? a[0].toLowerCase() : void 0),
|
|
12616
|
+
split: def(
|
|
12617
|
+
"text, separator",
|
|
12618
|
+
(a) => typeof a[0] === "string" ? a[0].split(typeof a[1] === "string" ? a[1] : " ") : void 0
|
|
12619
|
+
),
|
|
12620
|
+
join: def(
|
|
12621
|
+
"values, separator",
|
|
12622
|
+
(a, c) => text(list(a[0], "join", c), typeof a[1] === "string" ? a[1] : "", c, "join")
|
|
12623
|
+
),
|
|
12624
|
+
search: def("value, list", (a, c) => {
|
|
12625
|
+
const xs = typeof a[1] === "string" ? [...a[1]] : list(a[1], "search", c);
|
|
12626
|
+
const i = xs.findIndex((x) => equals(x, a[0], c.step));
|
|
12443
12627
|
return i < 0 ? void 0 : i;
|
|
12444
|
-
},
|
|
12445
|
-
contains: (
|
|
12446
|
-
|
|
12628
|
+
}),
|
|
12629
|
+
contains: def(
|
|
12630
|
+
"value, item",
|
|
12631
|
+
(a, c) => typeof a[0] === "string" ? a[0].includes(text([a[1]], "", c, "contains")) : list(a[0], "contains", c).some((x) => equals(x, a[1], c.step))
|
|
12632
|
+
),
|
|
12633
|
+
lookup: def("x, table", (a, c) => {
|
|
12447
12634
|
const key = num(a[0], "lookup");
|
|
12448
|
-
const table = list(a[1], "lookup");
|
|
12635
|
+
const table = list(a[1], "lookup", c);
|
|
12449
12636
|
if (!table.length) return void 0;
|
|
12450
12637
|
const rows = table.map((r) => [num(r[0], "lookup"), num(r[1], "lookup")]).sort((p, q) => p[0] - q[0]);
|
|
12451
12638
|
if (key <= rows[0][0]) return rows[0][1];
|
|
@@ -12456,25 +12643,25 @@ var FUNCTIONS = {
|
|
|
12456
12643
|
return y0 + (key - x0) / (x1 - x0) * (y1 - y0);
|
|
12457
12644
|
}
|
|
12458
12645
|
return rows[rows.length - 1][1];
|
|
12459
|
-
},
|
|
12460
|
-
rands: (a) => {
|
|
12646
|
+
}),
|
|
12647
|
+
rands: def("min, max, count, seed", (a) => {
|
|
12461
12648
|
const lo = num(a[0], "rands"), hi = num(a[1], "rands"), n2 = num(a[2], "rands");
|
|
12462
12649
|
const rnd = seeded(a[3] === void 0 ? 1 : num(a[3], "rands"));
|
|
12463
12650
|
return Array.from(
|
|
12464
12651
|
{ length: Math.min(Math.max(0, Math.floor(n2)), 1e6) },
|
|
12465
12652
|
() => lo + (hi - lo) * rnd()
|
|
12466
12653
|
);
|
|
12467
|
-
},
|
|
12468
|
-
is_num: (a) => isNum(a[0]) && !Number.isNaN(a[0]),
|
|
12469
|
-
is_string: (a) => typeof a[0] === "string",
|
|
12470
|
-
is_bool: (a) => typeof a[0] === "boolean",
|
|
12471
|
-
is_list: (a) => Array.isArray(a[0]),
|
|
12472
|
-
is_undef: (a) => a[0] === void 0,
|
|
12473
|
-
is_function: (a) => isFn(a[0]),
|
|
12474
|
-
type_of: (a) => typeName(a[0])
|
|
12654
|
+
}),
|
|
12655
|
+
is_num: def("value", (a) => isNum(a[0]) && !Number.isNaN(a[0])),
|
|
12656
|
+
is_string: def("value", (a) => typeof a[0] === "string"),
|
|
12657
|
+
is_bool: def("value", (a) => typeof a[0] === "boolean"),
|
|
12658
|
+
is_list: def("value", (a) => Array.isArray(a[0])),
|
|
12659
|
+
is_undef: def("value", (a) => a[0] === void 0),
|
|
12660
|
+
is_function: def("value", (a) => isFn(a[0])),
|
|
12661
|
+
type_of: def("value", (a) => typeName(a[0]))
|
|
12475
12662
|
};
|
|
12476
12663
|
|
|
12477
|
-
//
|
|
12664
|
+
// node_modules/clipper2-ts/dist/Core.js
|
|
12478
12665
|
var ClipType;
|
|
12479
12666
|
(function(ClipType2) {
|
|
12480
12667
|
ClipType2[ClipType2["NoClip"] = 0] = "NoClip";
|
|
@@ -13133,7 +13320,7 @@ var RectDUtils = {
|
|
|
13133
13320
|
var InvalidRect64 = Object.freeze(Rect64Utils.createInvalid());
|
|
13134
13321
|
var InvalidRectD = Object.freeze(RectDUtils.createInvalid());
|
|
13135
13322
|
|
|
13136
|
-
//
|
|
13323
|
+
// node_modules/clipper2-ts/dist/Engine.js
|
|
13137
13324
|
var B02 = BigInt(0);
|
|
13138
13325
|
var B22 = BigInt(2);
|
|
13139
13326
|
var B42 = BigInt(4);
|
|
@@ -15898,7 +16085,7 @@ var Clipper = {
|
|
|
15898
16085
|
}
|
|
15899
16086
|
};
|
|
15900
16087
|
|
|
15901
|
-
//
|
|
16088
|
+
// node_modules/clipper2-ts/dist/Offset.js
|
|
15902
16089
|
var JoinType;
|
|
15903
16090
|
(function(JoinType2) {
|
|
15904
16091
|
JoinType2[JoinType2["Miter"] = 0] = "Miter";
|
|
@@ -16511,7 +16698,7 @@ var ClipperOffset = class _ClipperOffset {
|
|
|
16511
16698
|
}
|
|
16512
16699
|
};
|
|
16513
16700
|
|
|
16514
|
-
//
|
|
16701
|
+
// node_modules/clipper2-ts/dist/Clipper.js
|
|
16515
16702
|
var B23 = BigInt(2);
|
|
16516
16703
|
function union(subject, clipOrFillRule, fillRule) {
|
|
16517
16704
|
if (typeof clipOrFillRule === "number") {
|
|
@@ -16850,14 +17037,16 @@ function livingHinge(w, h, spacing, bridge, cut) {
|
|
|
16850
17037
|
}
|
|
16851
17038
|
|
|
16852
17039
|
// src/lexer.ts
|
|
17040
|
+
var where = (pos, col = true) => `line ${pos.line}${col ? `, column ${pos.col}` : ""}${pos.file ? ` in <${pos.file}>` : ""}`;
|
|
16853
17041
|
var KerfError = class extends Error {
|
|
16854
17042
|
constructor(message, pos) {
|
|
16855
|
-
super(pos ? `${message} (
|
|
17043
|
+
super(pos ? `${message} (${where(pos)})` : message);
|
|
16856
17044
|
this.echoes = [];
|
|
16857
17045
|
this.name = "KerfError";
|
|
16858
17046
|
if (pos) {
|
|
16859
17047
|
this.line = pos.line;
|
|
16860
17048
|
this.col = pos.col;
|
|
17049
|
+
this.file = pos.file;
|
|
16861
17050
|
}
|
|
16862
17051
|
}
|
|
16863
17052
|
};
|
|
@@ -16891,13 +17080,13 @@ var PUNCT = [
|
|
|
16891
17080
|
"}",
|
|
16892
17081
|
"#"
|
|
16893
17082
|
];
|
|
16894
|
-
function tokenize(src) {
|
|
17083
|
+
function tokenize(src, file) {
|
|
16895
17084
|
const tokens = [];
|
|
16896
17085
|
const comments = [];
|
|
16897
17086
|
let i = 0;
|
|
16898
17087
|
let line = 1;
|
|
16899
17088
|
let lineStart = 0;
|
|
16900
|
-
const pos = () => ({ line, col: i - lineStart + 1, offset: i });
|
|
17089
|
+
const pos = () => ({ line, col: i - lineStart + 1, offset: i, ...file && { file } });
|
|
16901
17090
|
const advance = (n2) => {
|
|
16902
17091
|
for (let k = 0; k < n2; k++) {
|
|
16903
17092
|
if (src[i] === "\n") {
|
|
@@ -16916,8 +17105,8 @@ function tokenize(src) {
|
|
|
16916
17105
|
if (c === "/" && src[i + 1] === "/") {
|
|
16917
17106
|
const end = src.indexOf("\n", i);
|
|
16918
17107
|
const stop = end < 0 ? src.length : end;
|
|
16919
|
-
const
|
|
16920
|
-
comments.push({ text: src.slice(i + 2, stop).trim(), line, block: false, own });
|
|
17108
|
+
const own2 = /^[ \t]*$/.test(src.slice(src.lastIndexOf("\n", i - 1) + 1, i));
|
|
17109
|
+
comments.push({ text: src.slice(i + 2, stop).trim(), line, block: false, own: own2 });
|
|
16921
17110
|
i = stop;
|
|
16922
17111
|
continue;
|
|
16923
17112
|
}
|
|
@@ -17006,8 +17195,8 @@ var KEYWORDS = /* @__PURE__ */ new Set([
|
|
|
17006
17195
|
"false",
|
|
17007
17196
|
"undef"
|
|
17008
17197
|
]);
|
|
17009
|
-
function parse(src) {
|
|
17010
|
-
const { tokens, comments } = tokenize(src);
|
|
17198
|
+
function parse(src, file) {
|
|
17199
|
+
const { tokens, comments } = tokenize(src, file);
|
|
17011
17200
|
const p = new Parser(tokens);
|
|
17012
17201
|
const body = [];
|
|
17013
17202
|
while (!p.at("eof")) body.push(...p.statement());
|
|
@@ -17149,12 +17338,12 @@ var Parser = class _Parser {
|
|
|
17149
17338
|
const out = [];
|
|
17150
17339
|
while (!this.isP(")")) {
|
|
17151
17340
|
const name = this.ident().value;
|
|
17152
|
-
let
|
|
17341
|
+
let def2 = null;
|
|
17153
17342
|
if (this.isP("=")) {
|
|
17154
17343
|
this.next();
|
|
17155
|
-
|
|
17344
|
+
def2 = this.expr();
|
|
17156
17345
|
}
|
|
17157
|
-
out.push({ name, default:
|
|
17346
|
+
out.push({ name, default: def2 });
|
|
17158
17347
|
if (!this.isP(")")) this.expectP(",");
|
|
17159
17348
|
}
|
|
17160
17349
|
this.next();
|
|
@@ -17600,7 +17789,7 @@ var FontBook = class {
|
|
|
17600
17789
|
}
|
|
17601
17790
|
const hit = this.parsed.get(key);
|
|
17602
17791
|
if (hit) return hit;
|
|
17603
|
-
const src = this.sources
|
|
17792
|
+
const src = own(this.sources, key);
|
|
17604
17793
|
if (!src) {
|
|
17605
17794
|
this.missing.add(key);
|
|
17606
17795
|
throw new Error(
|
|
@@ -17613,25 +17802,23 @@ var FontBook = class {
|
|
|
17613
17802
|
return font;
|
|
17614
17803
|
}
|
|
17615
17804
|
};
|
|
17616
|
-
function layoutCommands(font,
|
|
17805
|
+
function layoutCommands(font, text2, o) {
|
|
17617
17806
|
const opts = { kerning: true };
|
|
17618
17807
|
if (o.spacing === 1) {
|
|
17619
|
-
const path = font.getPath(
|
|
17620
|
-
return { cmds: path.commands, advance: font.getAdvanceWidth(
|
|
17808
|
+
const path = font.getPath(text2, 0, 0, o.size, opts);
|
|
17809
|
+
return { cmds: path.commands, advance: font.getAdvanceWidth(text2, o.size, opts) };
|
|
17621
17810
|
}
|
|
17622
17811
|
const cmds = [];
|
|
17623
17812
|
let x = 0;
|
|
17624
|
-
const chars = [...
|
|
17813
|
+
const chars = [...text2];
|
|
17625
17814
|
chars.forEach((ch, i) => {
|
|
17626
17815
|
cmds.push(...font.getPath(ch, x, 0, o.size, opts).commands);
|
|
17627
17816
|
x += font.getAdvanceWidth(ch, o.size, opts) * (i < chars.length - 1 ? o.spacing : 1);
|
|
17628
17817
|
});
|
|
17629
17818
|
return { cmds, advance: x };
|
|
17630
17819
|
}
|
|
17631
|
-
function
|
|
17632
|
-
|
|
17633
|
-
const font = book.get(o.font);
|
|
17634
|
-
const { cmds, advance } = layoutCommands(font, text, o);
|
|
17820
|
+
function outlines(font, text2, o) {
|
|
17821
|
+
const { cmds, advance } = layoutCommands(font, text2, o);
|
|
17635
17822
|
const flipped = cmds.map((c) => {
|
|
17636
17823
|
if (c.type === "Z") return c;
|
|
17637
17824
|
if (c.type === "C") return { ...c, y1: -c.y1, y2: -c.y2, y: -c.y };
|
|
@@ -17639,17 +17826,22 @@ function textRegions(book, text, o) {
|
|
|
17639
17826
|
return { ...c, y: -c.y };
|
|
17640
17827
|
});
|
|
17641
17828
|
const flat = flatten(flipped, Math.max(5e-3, o.size / 2e3));
|
|
17642
|
-
|
|
17829
|
+
return { polys: [...flat.closed, ...flat.open.filter((p) => p.length >= 3)], advance };
|
|
17830
|
+
}
|
|
17831
|
+
function textRegions(book, text2, o) {
|
|
17832
|
+
if (!text2) return [];
|
|
17833
|
+
const font = book.get(o.font);
|
|
17834
|
+
const { polys: raw, advance } = outlines(font, text2, o);
|
|
17835
|
+
const polys = union2(raw);
|
|
17643
17836
|
const b = bounds(polys);
|
|
17644
17837
|
if (!b) return [];
|
|
17645
17838
|
const dx = o.halign === "center" ? -advance / 2 : o.halign === "right" ? -advance : 0;
|
|
17646
17839
|
const dy = o.valign === "top" ? -b[3] : o.valign === "center" ? -(b[1] + b[3]) / 2 : o.valign === "bottom" ? -b[1] : 0;
|
|
17647
17840
|
return polys.map((p) => p.map(([x, y]) => [x + dx, y + dy]));
|
|
17648
17841
|
}
|
|
17649
|
-
function textMetrics(book,
|
|
17842
|
+
function textMetrics(book, text2, o) {
|
|
17650
17843
|
const font = book.get(o.font);
|
|
17651
|
-
const { advance } =
|
|
17652
|
-
const polys = textRegions(book, text, { ...o, halign: "left", valign: "baseline" });
|
|
17844
|
+
const { polys, advance } = outlines(font, text2, o);
|
|
17653
17845
|
const b = bounds(polys) ?? [0, 0, 0, 0];
|
|
17654
17846
|
return {
|
|
17655
17847
|
advance,
|
|
@@ -17769,17 +17961,17 @@ var Evaluator = class {
|
|
|
17769
17961
|
warnings: this.warnings
|
|
17770
17962
|
};
|
|
17771
17963
|
}
|
|
17772
|
-
tick(pos) {
|
|
17773
|
-
if (
|
|
17964
|
+
tick(pos, n2 = 1) {
|
|
17965
|
+
if (!((this.steps += n2) <= this.maxSteps))
|
|
17774
17966
|
throw new KerfError(`Stopped after ${this.maxSteps} steps. Is there an endless loop?`, pos);
|
|
17775
17967
|
}
|
|
17776
17968
|
load(path, at) {
|
|
17777
17969
|
const hit = this.loaded.get(path);
|
|
17778
17970
|
if (hit) return hit;
|
|
17779
|
-
const src = STDLIB
|
|
17780
|
-
if (src
|
|
17971
|
+
const src = own(STDLIB, path) ?? this.opts.resolve?.(path);
|
|
17972
|
+
if (typeof src !== "string") throw new KerfError(`Library <${path}> not found`, at);
|
|
17781
17973
|
this.loaded.set(path, { body: [] });
|
|
17782
|
-
const { program } = parse(src);
|
|
17974
|
+
const { program } = parse(src, path);
|
|
17783
17975
|
this.loaded.set(path, program);
|
|
17784
17976
|
return program;
|
|
17785
17977
|
}
|
|
@@ -17867,7 +18059,7 @@ var Evaluator = class {
|
|
|
17867
18059
|
iterable(v, at) {
|
|
17868
18060
|
if (isRange(v)) {
|
|
17869
18061
|
try {
|
|
17870
|
-
return rangeValues(v,
|
|
18062
|
+
return rangeValues(v, this.limits.maxListLength);
|
|
17871
18063
|
} catch (e) {
|
|
17872
18064
|
throw new KerfError(e.message, at);
|
|
17873
18065
|
}
|
|
@@ -17908,13 +18100,17 @@ var Evaluator = class {
|
|
|
17908
18100
|
});
|
|
17909
18101
|
for (const k of args.named.keys()) {
|
|
17910
18102
|
if (k.startsWith("$")) env.vars.set(k, args.named.get(k));
|
|
17911
|
-
else if (!names.has(k))
|
|
17912
|
-
const warning = `${what}: unknown argument "${k}" (line ${args.at.line})`;
|
|
17913
|
-
if (!this.warnings.includes(warning)) this.warnings.push(warning);
|
|
17914
|
-
}
|
|
18103
|
+
else if (!names.has(k)) this.unknownArg(what, k, args.at);
|
|
17915
18104
|
}
|
|
17916
18105
|
void defEnv;
|
|
17917
18106
|
}
|
|
18107
|
+
unknownArg(what, name, at) {
|
|
18108
|
+
this.warn(`${what}: unknown argument "${name}" (${where(at, false)})`);
|
|
18109
|
+
}
|
|
18110
|
+
// A warning, once however often it comes up
|
|
18111
|
+
warn(warning) {
|
|
18112
|
+
if (!this.warnings.includes(warning)) this.warnings.push(warning);
|
|
18113
|
+
}
|
|
17918
18114
|
callModule(s, env) {
|
|
17919
18115
|
const args = this.evalArgs(s.args, env, s.pos);
|
|
17920
18116
|
const user = env.mod(s.name);
|
|
@@ -17931,7 +18127,7 @@ var Evaluator = class {
|
|
|
17931
18127
|
this.depth--;
|
|
17932
18128
|
}
|
|
17933
18129
|
}
|
|
17934
|
-
const b = this.builtins
|
|
18130
|
+
const b = own(this.builtins, s.name);
|
|
17935
18131
|
if (!b) {
|
|
17936
18132
|
const hint = s.name === "color" ? " Use layer(), cut(), score() or engrave() instead." : s.name === "square" ? " Use rect()." : "";
|
|
17937
18133
|
throw new KerfError(`Unknown module ${s.name}().${hint}`, s.pos);
|
|
@@ -18029,8 +18225,8 @@ var Evaluator = class {
|
|
|
18029
18225
|
if (x.op === "||") return truthy(this.expr(x.left, env)) || truthy(this.expr(x.right, env));
|
|
18030
18226
|
const a = this.expr(x.left, env);
|
|
18031
18227
|
const b = this.expr(x.right, env);
|
|
18032
|
-
if (x.op === "=="
|
|
18033
|
-
|
|
18228
|
+
if (x.op === "==" || x.op === "!=")
|
|
18229
|
+
return equals(a, b, () => this.tick(x.pos)) === (x.op === "==");
|
|
18034
18230
|
if (x.op === "<" || x.op === "<=" || x.op === ">" || x.op === ">=") {
|
|
18035
18231
|
if (!(typeof a === "number" && typeof b === "number" || typeof a === "string" && typeof b === "string"))
|
|
18036
18232
|
throw new KerfError(`Can't compare ${typeName(a)} ${x.op} ${typeName(b)}`, x.pos);
|
|
@@ -18122,13 +18318,27 @@ var Evaluator = class {
|
|
|
18122
18318
|
if (f2) return this.callFunction(f2, this.evalArgs(x.args, env, x.pos), env, name);
|
|
18123
18319
|
const special = this.specialFunction(name, x, env);
|
|
18124
18320
|
if (special.handled) return special.value;
|
|
18125
|
-
const b = FUNCTIONS
|
|
18321
|
+
const b = own(FUNCTIONS, name);
|
|
18126
18322
|
if (b) {
|
|
18127
18323
|
const args = this.evalArgs(x.args, env, x.pos);
|
|
18324
|
+
for (const k of args.named.keys())
|
|
18325
|
+
if (!k.startsWith("$") && !b.params.includes(k)) this.unknownArg(`${name}()`, k, x.pos);
|
|
18326
|
+
for (const k of givenTwice(b, args.pos, args.named))
|
|
18327
|
+
this.warn(
|
|
18328
|
+
`${name}(): "${k}" is given by position and by name; the named value is used (${where(x.pos, false)})`
|
|
18329
|
+
);
|
|
18330
|
+
const ctx = {
|
|
18331
|
+
maxLength: this.limits.maxListLength,
|
|
18332
|
+
step: (n2) => this.tick(x.pos, n2),
|
|
18333
|
+
given: args.pos.length + b.params.filter((p) => args.named.has(p)).length
|
|
18334
|
+
};
|
|
18335
|
+
const bound = bindArgs(b, args.pos, args.named);
|
|
18336
|
+
this.tick(x.pos, argumentWork(name, bound, this.limits.maxListLength));
|
|
18128
18337
|
let out;
|
|
18129
18338
|
try {
|
|
18130
|
-
out = b(
|
|
18339
|
+
out = b.run(bound, ctx);
|
|
18131
18340
|
} catch (e) {
|
|
18341
|
+
if (e instanceof KerfError) throw e;
|
|
18132
18342
|
throw new KerfError(
|
|
18133
18343
|
e instanceof RangeError ? `${name}(): the result is too large` : e.message,
|
|
18134
18344
|
x.pos
|
|
@@ -18154,12 +18364,7 @@ var Evaluator = class {
|
|
|
18154
18364
|
return { handled: true, value: void 0 };
|
|
18155
18365
|
}
|
|
18156
18366
|
if (name === "assert") {
|
|
18157
|
-
|
|
18158
|
-
if (!truthy(a.pos[0]))
|
|
18159
|
-
throw new KerfError(
|
|
18160
|
-
`Assertion failed${a.pos[1] !== void 0 ? ": " + (typeof a.pos[1] === "string" ? a.pos[1] : show(a.pos[1])) : ""}`,
|
|
18161
|
-
x.pos
|
|
18162
|
-
);
|
|
18367
|
+
this.assert(this.evalArgs(x.args, env, x.pos));
|
|
18163
18368
|
return { handled: true, value: true };
|
|
18164
18369
|
}
|
|
18165
18370
|
if (name === "text_width" || name === "text_metrics") {
|
|
@@ -18178,13 +18383,33 @@ var Evaluator = class {
|
|
|
18178
18383
|
}
|
|
18179
18384
|
return { handled: false };
|
|
18180
18385
|
}
|
|
18181
|
-
|
|
18182
|
-
this.
|
|
18183
|
-
this.
|
|
18386
|
+
assert(a) {
|
|
18387
|
+
if (truthy(this.arg(a, "condition", 0))) return;
|
|
18388
|
+
const m = this.arg(a, "message", 1);
|
|
18389
|
+
throw new KerfError(`Assertion failed${m === void 0 ? "" : ": " + toText(m)}`, a.at);
|
|
18184
18390
|
}
|
|
18391
|
+
echo(text2, at) {
|
|
18392
|
+
this.charge(Math.ceil(text2.length / CHARS_PER_ITEM), at);
|
|
18393
|
+
this.echoes.push(text2);
|
|
18394
|
+
}
|
|
18395
|
+
// Echo text stops at maxListLength characters, before it is all written out
|
|
18185
18396
|
echoText(a) {
|
|
18186
|
-
const
|
|
18187
|
-
|
|
18397
|
+
const max = this.limits.maxListLength;
|
|
18398
|
+
const parts = [];
|
|
18399
|
+
let n2 = 0;
|
|
18400
|
+
const add = (label, v, quote) => {
|
|
18401
|
+
if (parts.length) n2 += 2;
|
|
18402
|
+
const r = write(v, max - n2 - label.length, quote);
|
|
18403
|
+
n2 += label.length + r.text.length;
|
|
18404
|
+
if (!r.whole)
|
|
18405
|
+
throw new KerfError(
|
|
18406
|
+
`echo(): the text would be longer than the limit of ${max} characters`,
|
|
18407
|
+
a.at
|
|
18408
|
+
);
|
|
18409
|
+
parts.push(label + r.text);
|
|
18410
|
+
};
|
|
18411
|
+
for (const v of a.pos) add("", v, false);
|
|
18412
|
+
for (const [k, v] of a.named) add(`${k} = `, v, true);
|
|
18188
18413
|
return parts.join(", ");
|
|
18189
18414
|
}
|
|
18190
18415
|
arith(op, a, b, at) {
|
|
@@ -18219,21 +18444,37 @@ var Evaluator = class {
|
|
|
18219
18444
|
return a.map((x, i) => this.arith(op, x, b[i], at));
|
|
18220
18445
|
}
|
|
18221
18446
|
if (op === "*") {
|
|
18222
|
-
if (Array.isArray(a[0]))
|
|
18447
|
+
if (Array.isArray(a[0])) {
|
|
18448
|
+
this.charge(a.length + LIST_COST, at);
|
|
18449
|
+
return a.map((row) => this.arith("*", row, b, at));
|
|
18450
|
+
}
|
|
18451
|
+
const term = (x, y) => {
|
|
18452
|
+
const t = this.arith("*", x, y, at);
|
|
18453
|
+
if (typeof t !== "number")
|
|
18454
|
+
throw new KerfError(
|
|
18455
|
+
"Can't multiply these lists: an item times an item is not a number",
|
|
18456
|
+
at
|
|
18457
|
+
);
|
|
18458
|
+
return t;
|
|
18459
|
+
};
|
|
18223
18460
|
if (Array.isArray(b[0])) {
|
|
18224
18461
|
const cols = b[0].length;
|
|
18462
|
+
if (a.length !== b.length || b.some((r) => !Array.isArray(r) || r.length !== cols))
|
|
18463
|
+
throw new KerfError(
|
|
18464
|
+
`Can't multiply a list of length ${a.length} by a matrix: it needs ${a.length} rows of the same length`,
|
|
18465
|
+
at
|
|
18466
|
+
);
|
|
18225
18467
|
this.checkSize(cols, false, at);
|
|
18468
|
+
this.tick(at, cols * a.length);
|
|
18226
18469
|
return Array.from(
|
|
18227
18470
|
{ length: cols },
|
|
18228
|
-
(_, j) => a.reduce(
|
|
18229
|
-
(s, x, i) => s + this.arith("*", x, b[i][j], at),
|
|
18230
|
-
0
|
|
18231
|
-
)
|
|
18471
|
+
(_, j) => a.reduce((s, x, i) => s + term(x, b[i][j]), 0)
|
|
18232
18472
|
);
|
|
18233
18473
|
}
|
|
18234
18474
|
if (a.length !== b.length)
|
|
18235
18475
|
throw new KerfError(`Can't multiply lists of length ${a.length} and ${b.length}`, at);
|
|
18236
|
-
|
|
18476
|
+
this.tick(at, a.length);
|
|
18477
|
+
return a.reduce((s, x, i) => s + term(x, b[i]), 0);
|
|
18237
18478
|
}
|
|
18238
18479
|
}
|
|
18239
18480
|
if (Array.isArray(a) && typeof b === "number" && (op === "*" || op === "/")) {
|
|
@@ -18254,10 +18495,10 @@ var Evaluator = class {
|
|
|
18254
18495
|
};
|
|
18255
18496
|
throw new KerfError(`Can't ${verb[op] ?? op} ${typeName(a)} and ${typeName(b)}`, at);
|
|
18256
18497
|
}
|
|
18257
|
-
arg(a, name, index,
|
|
18498
|
+
arg(a, name, index, def2) {
|
|
18258
18499
|
if (a.named.has(name)) return a.named.get(name);
|
|
18259
18500
|
if (index >= 0 && index < a.pos.length) return a.pos[index];
|
|
18260
|
-
return
|
|
18501
|
+
return def2;
|
|
18261
18502
|
}
|
|
18262
18503
|
num(v, fn, name) {
|
|
18263
18504
|
if (typeof v !== "number" || !Number.isFinite(v))
|
|
@@ -18302,9 +18543,9 @@ var Evaluator = class {
|
|
|
18302
18543
|
this.charge(isString ? Math.ceil(n2 / CHARS_PER_ITEM) : n2 + LIST_COST, pos);
|
|
18303
18544
|
}
|
|
18304
18545
|
segs(env) {
|
|
18305
|
-
const fn =
|
|
18306
|
-
const fa =
|
|
18307
|
-
const fs =
|
|
18546
|
+
const fn = toNumber(this.dyn(env, "$fn")) || 0;
|
|
18547
|
+
const fa = toNumber(this.dyn(env, "$fa")) || 2;
|
|
18548
|
+
const fs = toNumber(this.dyn(env, "$fs")) || 0.2;
|
|
18308
18549
|
const max = this.limits.maxSegments;
|
|
18309
18550
|
return (r) => {
|
|
18310
18551
|
const n2 = fragments(r, fn, fa, fs);
|
|
@@ -18331,9 +18572,15 @@ var Evaluator = class {
|
|
|
18331
18572
|
"text needs a font. Pass fonts to render(), or --font on the command line.",
|
|
18332
18573
|
a.at
|
|
18333
18574
|
);
|
|
18334
|
-
const
|
|
18575
|
+
const shown = write(this.arg(a, "text", 0, ""), this.limits.maxTextLength);
|
|
18576
|
+
if (!shown.whole)
|
|
18577
|
+
throw new KerfError(
|
|
18578
|
+
`the text is more than ${this.limits.maxTextLength} characters, the limit for one text()`,
|
|
18579
|
+
a.at
|
|
18580
|
+
);
|
|
18581
|
+
this.tick(a.at, shown.text.length);
|
|
18335
18582
|
try {
|
|
18336
|
-
return textMetrics(this.opts.fonts, text, this.textOpts(a, env));
|
|
18583
|
+
return textMetrics(this.opts.fonts, shown.text, this.textOpts(a, env));
|
|
18337
18584
|
} catch (e) {
|
|
18338
18585
|
if (e instanceof KerfError) throw e;
|
|
18339
18586
|
throw new KerfError(e.message, a.at);
|
|
@@ -18342,10 +18589,10 @@ var Evaluator = class {
|
|
|
18342
18589
|
textOpts(a, env) {
|
|
18343
18590
|
return {
|
|
18344
18591
|
size: this.num(this.arg(a, "size", 1, 10), "text", "size"),
|
|
18345
|
-
font:
|
|
18346
|
-
halign:
|
|
18347
|
-
valign:
|
|
18348
|
-
spacing:
|
|
18592
|
+
font: toText(this.arg(a, "font", 2, this.dyn(env, "$font") ?? "")),
|
|
18593
|
+
halign: toText(this.arg(a, "halign", -1, "left")),
|
|
18594
|
+
valign: toText(this.arg(a, "valign", -1, "baseline")),
|
|
18595
|
+
spacing: toNumber(this.arg(a, "spacing", -1, 1))
|
|
18349
18596
|
};
|
|
18350
18597
|
}
|
|
18351
18598
|
edges(v) {
|
|
@@ -18363,7 +18610,7 @@ var Evaluator = class {
|
|
|
18363
18610
|
return {
|
|
18364
18611
|
rect: (c) => {
|
|
18365
18612
|
const [w, h] = this.vec2(this.arg(c.args, "size", 0, 1), "size");
|
|
18366
|
-
const r =
|
|
18613
|
+
const r = toNumber(this.arg(c.args, "r", -1, 0)) || 0;
|
|
18367
18614
|
const center = truthy(this.arg(c.args, "center", 1, false));
|
|
18368
18615
|
const p = roundedRect(w, h, r, this.segs(c.env));
|
|
18369
18616
|
return regionShape(union2([center ? p.map(([x, y]) => [x - w / 2, y - h / 2]) : p]));
|
|
@@ -18406,7 +18653,7 @@ var Evaluator = class {
|
|
|
18406
18653
|
const pts = this.points(this.arg(c.args, "points", 0), "points");
|
|
18407
18654
|
const paths = this.arg(c.args, "paths", 1);
|
|
18408
18655
|
const polys = Array.isArray(paths) ? paths.map(
|
|
18409
|
-
(ix) => (Array.isArray(ix) ? ix : []).map((i) => pts[
|
|
18656
|
+
(ix) => (Array.isArray(ix) ? ix : []).map((i) => pts[toNumber(i)]).filter(Boolean)
|
|
18410
18657
|
) : [pts];
|
|
18411
18658
|
return regionShape(union2(polys, "evenodd"));
|
|
18412
18659
|
},
|
|
@@ -18415,7 +18662,7 @@ var Evaluator = class {
|
|
|
18415
18662
|
if (typeof d2 !== "string")
|
|
18416
18663
|
throw new Error('path() needs SVG path data, like path("M0 0 L10 0 L5 8 Z")');
|
|
18417
18664
|
const flat2 = flatten(parseSvgPath(d2), 0.01);
|
|
18418
|
-
const fill =
|
|
18665
|
+
const fill = this.arg(c.args, "fill", -1, "evenodd") === "nonzero" ? "nonzero" : "evenodd";
|
|
18419
18666
|
return merge([regionShape(union2(flat2.closed, fill)), lineShape(flat2.open)]);
|
|
18420
18667
|
},
|
|
18421
18668
|
line: (c) => {
|
|
@@ -18449,13 +18696,14 @@ var Evaluator = class {
|
|
|
18449
18696
|
throw new Error(
|
|
18450
18697
|
"text() needs a font. Pass fonts to render(), or --font on the command line."
|
|
18451
18698
|
);
|
|
18452
|
-
const
|
|
18453
|
-
const shown =
|
|
18454
|
-
if (shown.
|
|
18699
|
+
const text2 = this.arg(c.args, "text", 0, "");
|
|
18700
|
+
const shown = write(text2, this.limits.maxTextLength);
|
|
18701
|
+
if (!shown.whole)
|
|
18455
18702
|
throw new Error(
|
|
18456
|
-
|
|
18703
|
+
`the text is more than ${this.limits.maxTextLength} characters, the limit for one text()`
|
|
18457
18704
|
);
|
|
18458
|
-
|
|
18705
|
+
this.tick(c.args.at, shown.text.length);
|
|
18706
|
+
return regionShape(textRegions(this.opts.fonts, shown.text, this.textOpts(c.args, c.env)));
|
|
18459
18707
|
},
|
|
18460
18708
|
translate: (c) => {
|
|
18461
18709
|
const [x, y] = this.vec2(this.arg(c.args, "v", 0, [0, 0]), "v", false);
|
|
@@ -18463,7 +18711,7 @@ var Evaluator = class {
|
|
|
18463
18711
|
},
|
|
18464
18712
|
rotate: (c) => {
|
|
18465
18713
|
const a = this.arg(c.args, "a", 0, 0);
|
|
18466
|
-
const deg = Array.isArray(a) ?
|
|
18714
|
+
const deg = Array.isArray(a) ? toNumber(a[2] ?? 0) : this.num(a, "rotate", "a");
|
|
18467
18715
|
const r = deg * Math.PI / 180;
|
|
18468
18716
|
const cs = Math.cos(r), sn = Math.sin(r);
|
|
18469
18717
|
const ctr = this.arg(c.args, "center", -1);
|
|
@@ -18514,22 +18762,26 @@ var Evaluator = class {
|
|
|
18514
18762
|
}
|
|
18515
18763
|
return out;
|
|
18516
18764
|
},
|
|
18765
|
+
// One hull for the shapes outside parts, and one inside each part
|
|
18517
18766
|
hull: (c) => {
|
|
18518
18767
|
const s = c.children();
|
|
18519
|
-
const
|
|
18520
|
-
|
|
18521
|
-
|
|
18522
|
-
|
|
18523
|
-
|
|
18524
|
-
|
|
18525
|
-
|
|
18768
|
+
const each = (layers) => {
|
|
18769
|
+
const pts = [];
|
|
18770
|
+
let key = "cut";
|
|
18771
|
+
let first = true;
|
|
18772
|
+
for (const [k, l] of layers) {
|
|
18773
|
+
if (first && (l.regions.length || l.lines.length)) {
|
|
18774
|
+
key = k;
|
|
18775
|
+
first = false;
|
|
18776
|
+
}
|
|
18777
|
+
for (const p of [...l.regions, ...l.lines]) for (const q of p) pts.push(q);
|
|
18526
18778
|
}
|
|
18527
|
-
|
|
18528
|
-
|
|
18529
|
-
|
|
18779
|
+
const h = hull(pts);
|
|
18780
|
+
return /* @__PURE__ */ new Map([[key, { regions: h.length >= 3 ? [h] : [], lines: [] }]]);
|
|
18781
|
+
};
|
|
18530
18782
|
return {
|
|
18531
|
-
layers:
|
|
18532
|
-
parts: s.parts
|
|
18783
|
+
layers: each(s.layers),
|
|
18784
|
+
parts: s.parts.map((p) => ({ ...p, layers: each(p.layers) }))
|
|
18533
18785
|
};
|
|
18534
18786
|
},
|
|
18535
18787
|
offset: (c) => {
|
|
@@ -18568,15 +18820,15 @@ var Evaluator = class {
|
|
|
18568
18820
|
const m = mode ?? known?.mode ?? "line";
|
|
18569
18821
|
if (!["cut", "line", "fill", "guide"].includes(m))
|
|
18570
18822
|
throw new Error('mode must be "cut", "line", "fill" or "guide"');
|
|
18571
|
-
const col =
|
|
18823
|
+
const col = toText(color ?? known?.color ?? "#00aa00");
|
|
18572
18824
|
if (!/^#[0-9a-fA-F]{6}$/.test(col)) throw new Error('color must look like "#00aa00"');
|
|
18573
18825
|
this.layers.set(name, { name, mode: m, color: col });
|
|
18574
18826
|
}
|
|
18575
18827
|
return retag(c.children(), name);
|
|
18576
18828
|
},
|
|
18577
18829
|
part: (c) => {
|
|
18578
|
-
const name =
|
|
18579
|
-
const qty = Math.max(1, Math.floor(
|
|
18830
|
+
const name = toText(this.arg(c.args, "name", 0, "part"));
|
|
18831
|
+
const qty = Math.max(1, Math.floor(toNumber(this.arg(c.args, "qty", 1, 1)) || 1));
|
|
18580
18832
|
this.copies += qty;
|
|
18581
18833
|
if (!(this.copies <= this.limits.maxParts))
|
|
18582
18834
|
throw new Error(`more than ${this.limits.maxParts} part copies in total, the limit`);
|
|
@@ -18590,8 +18842,8 @@ var Evaluator = class {
|
|
|
18590
18842
|
qty,
|
|
18591
18843
|
layers: s.layers,
|
|
18592
18844
|
thickness: this.thickness(c.env),
|
|
18593
|
-
kerf:
|
|
18594
|
-
material:
|
|
18845
|
+
kerf: toNumber(this.dyn(c.env, "$kerf")) || 0,
|
|
18846
|
+
material: toText(this.dyn(c.env, "$material") ?? "material")
|
|
18595
18847
|
}
|
|
18596
18848
|
]
|
|
18597
18849
|
};
|
|
@@ -18602,7 +18854,7 @@ var Evaluator = class {
|
|
|
18602
18854
|
const n2 = this.arg(c.args, "name", 2);
|
|
18603
18855
|
if (t !== void 0) c.env.vars.set("$thickness", this.num(t, "material", "thickness"));
|
|
18604
18856
|
if (k !== void 0) c.env.vars.set("$kerf", this.num(k, "material", "kerf"));
|
|
18605
|
-
if (n2 !== void 0) c.env.vars.set("$material",
|
|
18857
|
+
if (n2 !== void 0) c.env.vars.set("$material", toText(n2));
|
|
18606
18858
|
return c.children();
|
|
18607
18859
|
},
|
|
18608
18860
|
children: (c) => {
|
|
@@ -18616,7 +18868,7 @@ var Evaluator = class {
|
|
|
18616
18868
|
if (idx === void 0) kids.forEach((k) => want.add(k));
|
|
18617
18869
|
else
|
|
18618
18870
|
for (const i of this.iterable(idx, c.args.at))
|
|
18619
|
-
if (kids[
|
|
18871
|
+
if (kids[toNumber(i)]) want.add(kids[toNumber(i)]);
|
|
18620
18872
|
const out = [];
|
|
18621
18873
|
for (const st of ctx.stmts) {
|
|
18622
18874
|
if (st.kind === "assign") this.stmt(st, e);
|
|
@@ -18632,12 +18884,7 @@ var Evaluator = class {
|
|
|
18632
18884
|
return c.children();
|
|
18633
18885
|
},
|
|
18634
18886
|
assert: (c) => {
|
|
18635
|
-
|
|
18636
|
-
if (!truthy(a.pos[0] ?? a.named.get("condition")))
|
|
18637
|
-
throw new KerfError(
|
|
18638
|
-
`Assertion failed${a.pos[1] !== void 0 ? ": " + (typeof a.pos[1] === "string" ? a.pos[1] : show(a.pos[1])) : ""}`,
|
|
18639
|
-
a.at
|
|
18640
|
-
);
|
|
18887
|
+
this.assert(c.args);
|
|
18641
18888
|
return c.children();
|
|
18642
18889
|
},
|
|
18643
18890
|
finger_rect: (c) => {
|
|
@@ -18720,21 +18967,21 @@ function tidy(p, closed) {
|
|
|
18720
18967
|
var d = (p, closed) => `M${tidy(p, closed).map(([x, y]) => `${x} ${y}`).join("L")}${closed ? "Z" : ""}`;
|
|
18721
18968
|
function layerPaths(items, layers) {
|
|
18722
18969
|
const out = [];
|
|
18723
|
-
for (const
|
|
18970
|
+
for (const def2 of layers) {
|
|
18724
18971
|
const lines = [];
|
|
18725
18972
|
const holes = [];
|
|
18726
18973
|
const shapes = [];
|
|
18727
18974
|
for (const it of items) {
|
|
18728
|
-
const l = it.layers.get(
|
|
18975
|
+
const l = it.layers.get(def2.name);
|
|
18729
18976
|
if (!l) continue;
|
|
18730
18977
|
for (const p of l.lines) lines.push(d(p, false));
|
|
18731
18978
|
for (const p of l.regions) (area2(p) < 0 ? holes : shapes).push(d(p, true));
|
|
18732
18979
|
}
|
|
18733
18980
|
if (lines.length || holes.length || shapes.length)
|
|
18734
18981
|
out.push({
|
|
18735
|
-
name:
|
|
18736
|
-
mode:
|
|
18737
|
-
color:
|
|
18982
|
+
name: def2.name,
|
|
18983
|
+
mode: def2.mode,
|
|
18984
|
+
color: def2.color,
|
|
18738
18985
|
d: [...lines, ...holes, ...shapes].join(""),
|
|
18739
18986
|
regions: [...holes, ...shapes].join(""),
|
|
18740
18987
|
lines: lines.join("")
|
|
@@ -18747,19 +18994,19 @@ function toSvg(items, width, height, layers) {
|
|
|
18747
18994
|
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
18748
18995
|
`<svg xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="${n(width)}mm" height="${n(height)}mm" viewBox="0 0 ${n(width)} ${n(height)}">`
|
|
18749
18996
|
];
|
|
18750
|
-
for (const
|
|
18997
|
+
for (const def2 of layers) {
|
|
18751
18998
|
const inner = [];
|
|
18752
18999
|
const outer = [];
|
|
18753
19000
|
for (const it of items) {
|
|
18754
|
-
const l = it.layers.get(
|
|
19001
|
+
const l = it.layers.get(def2.name);
|
|
18755
19002
|
if (!l) continue;
|
|
18756
19003
|
const tag = ` data-part="${esc(it.part)}"`;
|
|
18757
|
-
if (
|
|
19004
|
+
if (def2.mode === "fill") {
|
|
18758
19005
|
if (l.regions.length)
|
|
18759
19006
|
outer.push(`<path${tag} d="${l.regions.map((p) => d(p, true)).join("")}"/>`);
|
|
18760
19007
|
for (const p of l.lines)
|
|
18761
19008
|
outer.push(
|
|
18762
|
-
`<path${tag} fill="none" stroke="${
|
|
19009
|
+
`<path${tag} fill="none" stroke="${def2.color}" stroke-width="0.1" d="${d(p, false)}"/>`
|
|
18763
19010
|
);
|
|
18764
19011
|
continue;
|
|
18765
19012
|
}
|
|
@@ -18768,9 +19015,9 @@ function toSvg(items, width, height, layers) {
|
|
|
18768
19015
|
(area2(p) < 0 ? inner : outer).push(`<path${tag} d="${d(p, true)}"/>`);
|
|
18769
19016
|
}
|
|
18770
19017
|
if (!inner.length && !outer.length) continue;
|
|
18771
|
-
const paint =
|
|
19018
|
+
const paint = def2.mode === "fill" ? `fill="${def2.color}" fill-rule="evenodd" stroke="none"` : `fill="none" stroke="${def2.color}" stroke-width="0.1"${def2.mode === "guide" ? ' stroke-dasharray="1 1"' : ""}`;
|
|
18772
19019
|
out.push(
|
|
18773
|
-
`<g id="${esc(
|
|
19020
|
+
`<g id="${esc(def2.name)}" inkscape:groupmode="layer" inkscape:label="${esc(def2.name)}" data-mode="${def2.mode}" ${paint}>`,
|
|
18774
19021
|
...inner,
|
|
18775
19022
|
...outer,
|
|
18776
19023
|
"</g>"
|
|
@@ -18799,10 +19046,32 @@ var aci = (color) => {
|
|
|
18799
19046
|
if (b > r && b > g) return 5;
|
|
18800
19047
|
return 7;
|
|
18801
19048
|
};
|
|
19049
|
+
function dxfNames(layers) {
|
|
19050
|
+
const base = (s) => s.toUpperCase().replace(/[^A-Z0-9_-]/g, "_");
|
|
19051
|
+
const builtIn = new Set(DEFAULT_LAYERS.map((l) => l.name));
|
|
19052
|
+
const taken = new Set(layers.map((l) => base(l.name)));
|
|
19053
|
+
const used = /* @__PURE__ */ new Set();
|
|
19054
|
+
const out = /* @__PURE__ */ new Map();
|
|
19055
|
+
const ordered = [
|
|
19056
|
+
...layers.filter((l) => builtIn.has(l.name)),
|
|
19057
|
+
...layers.filter((l) => !builtIn.has(l.name))
|
|
19058
|
+
];
|
|
19059
|
+
for (const l of ordered) {
|
|
19060
|
+
let n2 = base(l.name);
|
|
19061
|
+
if (used.has(n2)) {
|
|
19062
|
+
let i = 2;
|
|
19063
|
+
while (taken.has(`${n2}_${i}`) || used.has(`${n2}_${i}`)) i++;
|
|
19064
|
+
n2 = `${n2}_${i}`;
|
|
19065
|
+
}
|
|
19066
|
+
used.add(n2);
|
|
19067
|
+
out.set(l.name, n2);
|
|
19068
|
+
}
|
|
19069
|
+
return out;
|
|
19070
|
+
}
|
|
18802
19071
|
function toDxf(items, _width, height, layers) {
|
|
18803
19072
|
const out = [];
|
|
18804
19073
|
const g = (code, value) => out.push(String(code), String(value));
|
|
18805
|
-
const
|
|
19074
|
+
const names = dxfNames(layers);
|
|
18806
19075
|
g(0, "SECTION");
|
|
18807
19076
|
g(2, "HEADER");
|
|
18808
19077
|
g(9, "$ACADVER");
|
|
@@ -18817,7 +19086,7 @@ function toDxf(items, _width, height, layers) {
|
|
|
18817
19086
|
g(70, layers.length);
|
|
18818
19087
|
for (const l of layers) {
|
|
18819
19088
|
g(0, "LAYER");
|
|
18820
|
-
g(2,
|
|
19089
|
+
g(2, names.get(l.name));
|
|
18821
19090
|
g(70, 0);
|
|
18822
19091
|
g(62, aci(l.color));
|
|
18823
19092
|
g(6, "CONTINUOUS");
|
|
@@ -18847,11 +19116,11 @@ function toDxf(items, _width, height, layers) {
|
|
|
18847
19116
|
g(0, "SEQEND");
|
|
18848
19117
|
g(8, layer);
|
|
18849
19118
|
};
|
|
18850
|
-
for (const
|
|
18851
|
-
const ln =
|
|
19119
|
+
for (const def2 of layers) {
|
|
19120
|
+
const ln = names.get(def2.name);
|
|
18852
19121
|
const outer = [];
|
|
18853
19122
|
for (const it of items) {
|
|
18854
|
-
const l = it.layers.get(
|
|
19123
|
+
const l = it.layers.get(def2.name);
|
|
18855
19124
|
if (!l) continue;
|
|
18856
19125
|
for (const p of l.lines) poly(ln, p, false);
|
|
18857
19126
|
for (const p of l.regions) area2(p) < 0 ? poly(ln, p, true) : outer.push(p);
|
|
@@ -18873,6 +19142,13 @@ var perimeter = (p, closed) => {
|
|
|
18873
19142
|
};
|
|
18874
19143
|
var round2 = (n2) => Math.round(n2 * 100) / 100;
|
|
18875
19144
|
function render(source, options = {}) {
|
|
19145
|
+
for (const [name, v] of Object.entries(options.params ?? {})) {
|
|
19146
|
+
try {
|
|
19147
|
+
checkSetting(name, v);
|
|
19148
|
+
} catch (e) {
|
|
19149
|
+
throw new KerfError(e.message);
|
|
19150
|
+
}
|
|
19151
|
+
}
|
|
18876
19152
|
const { program } = parse(source);
|
|
18877
19153
|
const fonts = options.fonts ? new FontBook(options.fonts, options.defaultFont) : void 0;
|
|
18878
19154
|
const ev = new Evaluator({
|
|
@@ -18907,9 +19183,9 @@ function render(source, options = {}) {
|
|
|
18907
19183
|
name: "part",
|
|
18908
19184
|
qty: 1,
|
|
18909
19185
|
layers: res.shape.layers,
|
|
18910
|
-
thickness:
|
|
18911
|
-
kerf:
|
|
18912
|
-
material:
|
|
19186
|
+
thickness: toNumber(g("$thickness")) || 3,
|
|
19187
|
+
kerf: toNumber(g("$kerf")) || 0,
|
|
19188
|
+
material: toText(g("$material") ?? "material")
|
|
18913
19189
|
});
|
|
18914
19190
|
if (!parts.length) warnings.push("Nothing to cut: the program made no shapes.");
|
|
18915
19191
|
const infos = [];
|
|
@@ -18990,7 +19266,7 @@ function render(source, options = {}) {
|
|
|
18990
19266
|
const sheetSize = options.sheet ?? g("$sheet");
|
|
18991
19267
|
if (!Array.isArray(sheetSize) || !(Number.isFinite(sheetSize[0]) && sheetSize[0] > 0) || !(Number.isFinite(sheetSize[1]) && sheetSize[1] > 0))
|
|
18992
19268
|
throw new KerfError("$sheet must be [width, height], both more than 0");
|
|
18993
|
-
const gap = options.gap ??
|
|
19269
|
+
const gap = options.gap ?? toNumber(g("$gap") ?? 3);
|
|
18994
19270
|
const margin = options.margin ?? gap;
|
|
18995
19271
|
if (!(Number.isFinite(gap) && gap >= 0)) throw new KerfError("$gap must be a number, 0 or more");
|
|
18996
19272
|
if (!(Number.isFinite(margin) && margin >= 0))
|
|
@@ -19227,9 +19503,18 @@ function parameters(source) {
|
|
|
19227
19503
|
}
|
|
19228
19504
|
|
|
19229
19505
|
// src/index.ts
|
|
19230
|
-
var VERSION = "0.
|
|
19506
|
+
var VERSION = "0.3.0";
|
|
19231
19507
|
var LANGUAGE_VERSION = "0.1";
|
|
19232
19508
|
|
|
19509
|
+
// fonts/AtkinsonHyperlegible-Regular.ttf
|
|
19510
|
+
var AtkinsonHyperlegible_Regular_default = __toBinaryNode("AAEAAAASAQAABAAgRFNJRwAAAAEAANREAAAACEdERUYmIiVoAACtoAAAAPhHUE9TBhS8lAAArpgAACDKR1NVQs2+72cAAM9kAAAE3k9TLzKBnCDAAAABqAAAAGBjbWFwMF4gUgAAB8wAAAOOY3Z0IBXBCrQAABooAAAAbGZwZ21iLv99AAALXAAADgxnYXNwAAAAEAAArZgAAAAIZ2x5ZhpHbHEAAB14AACEOGhlYWQdEfmxAAABLAAAADZoaGVhCIkENgAAAWQAAAAkaG10eMbdPbEAAAIIAAAFwmxvY2GjLsNGAAAalAAAAuRtYXhwAssPEgAAAYgAAAAgbmFtZXEwlLkAAKGwAAAEpnBvc3S6e2pLAACmWAAAB0BwcmVwWrHfOwAAGWgAAAC9AAEAAAABAYk7pItRXw889QAPA+gAAAAA3G3PNQAAAADcsOWS/8b/BgUKA3gAAAAGAAIAAAAAAAAAAQAAA7b+3gAABTD/xv63BQoAAQAAAAAAAAAAAAAAAAAAAXAAAQAAAXEAWAAHAFQABAACACoAVwCNAAAAlQ4MAAIAAQAEAhYBkAAFAAACigK7AAAAjAKKArsAAAHfADEBAgAAAAAAAAAAAAAAAIAAAO8AACBLAAAAAAAAAABOT05FAMAADSXKA7b+3gAAA7YBIiAAAAMAAAAAAfACnAAAACAAAwIPADICWAAAAAAAAAEYAAABGAAAAogAPAGSACoCJQAiAj4AKgJmACYCRwA2AlYAPAH+AA8CZwA8AlYAPAJyAAoCawBMApAAMgKhAEwCNwBMAiQATALGADICsgBMAZ4AQgH+AA8CcwBMAhsATAM0AEwCsQBMAtcAMgJZAEwC8QAyAmoATAJUACgCLgAKArIATAJNAAoDSAAKAm8ACgJTAAoCXwAsAg4AJgI2AEYB9AAmAjQAJgIbACYBNwAPAjAAJgIiAEYBFgAtAP7/xgHqAEYA7wBGA0kARgIiAEYCKAAmAjYARgJAACYBVABGAdcAHwFEABQCGABEAbkAAAKOAAABzQAAAa0AAAHMACgBrQA1Aa0ANQGPADUA1gA1AP0ADwEHADUA6wA1AOsANQDrADUBjgA1AY4ANQGOADUCHQAoAh0AKAG2ADUCuAA1BTAAJgFhADUBYQA1AkoADwFzADUCMgA1AloANQMeADUBfgA1AWAAKAJDADUBfgA1AX8ANQEMADUCGgBGAfwAJgDrADUBIwBJAQAANQF9ADkCMgA1AzoANQMsADUDZAA1AikAKAJaADUCKQAoAggAKAMMADIAzQAmAM0AJgE7AEwBeQAPATsAIQIoADUBjAAKAQwANQEZAEwBLQAoAo8AJgJSACgDnwAmAsEAJgCgACgBLAAyASwAIwGxAEQCWgA1AM0AJgFwACYAzQAmAXkADwE/ACYA6QBMAT8AIgIrACgBGQBMAfQAJgJKAEYCRAA1AlMACgDpAEwCEgAfAakANQMeADUCCAAxAlUATAPmAAoBQQAZAcoANQJFADUCWgA1AkMANQJDADUCMQA1AksANQJaADUCVgAPAOsANQJGADUDBQA1Aq8AMgJuADUCRgA1AvcANQJJADUCTwAUAZ4ANQGzADUB4AApAyAAKQNQADUBwgA1Aj0AFADtAA8CKAAmAtcAMgJAAEwDagAmAjcAJgI2AEYCEAA1AloANQQcADIDnwAmAnIACgJyAAoCcgAKAnIACgJyAAoCcgAKAnIACgIOACYCDgAmAg4AJgIOACYCDgAmAg4AJgIOACYCkAAyAfQAJgI3AEwCNwBMAjcATAI3AEwCGwAmAhsAJgIbACYCGwAmAZ4AQgGeAEIBngAtAZ4ALwEWABoBFgAtARb/5AEW/+YCsQBMAtcAMgLXADIC1wAyAtcAMgLXADICsgBMArIATAKyAEwCsgBMAlMACgIiAEYCKAAmAigAJgIoACYCKAAmAigAJgIYAEQCGABEAhgARAIYAEQBrQAAAa0AAAJUACgB1wAfAlMACgJfACwBzAAoAsgAFAJ/ADgCfwBtAn8ATwJ/AFQCfwAzAn8AVgJ/AFECfwBZAn8ASAJ/AFECcgAKAg4AJgJyAAoCDgAmAjcATAIbACYCNwBMAhsAJgI3AEwCGwAmAjcATAIbACYC1wAyAigAJgGeAEIBFv/8AZ4AQgEWACICkAAyAfQAJgKQADIB9AAmAlQAKAHXAB8CsgBMAhgARAKyAEwCGABEArIATAIYAEQCsgBMAhgARAKxAEwCIgBGArEATAIiAEYCXwAsAcwAKAJfACwBzAAoAsYACgJFABQCxgAyAjAAJgLGADICMAAmAjAAJgIbAEwA7wA3Ai4ACgDvAEYCGwBMAUQAFAKxAEwCIgBGAmoATAFUAEYCagBMAVQAJQLIABQCWwAm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JUawF0NYUBtSWVggPFkusTABFCstsEQssDsriiAgPLAGI0KKOCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrsAZDLrAwKy2wRSywABawBCWwBCYgICBGI0dhsAwjQi5HI0cjYbALQysjIDwgLiM4sTABFCstsEYssQoEJUKwABawBCWwBCUgLkcjRyNhILAGI0KxDABCsAtDKyCwYFBYILBAUVizBCAFIBuzBCYFGllCQiMgR7AGQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsARDYGQjsAVDYWRQWLAEQ2EbsAVDYFmwAyWwAmIgsABQWLBAYFlmsAFjYbACJUZhOCMgPCM4GyEgIEYjR7ABKyNhOCFZsTABFCstsEcssQA6Ky6xMAEUKy2wSCyxADsrISMgIDywBiNCIzixMAEUK7AGQy6wMCstsEkssAAVIEewACNCsgABARUUEy6wNiotsEossAAVIEewACNCsgABARUUEy6wNiotsEsssQABFBOwNyotsEwssDkqLbBNLLAAFkUjIC4gRoojYTixMAEUKy2wTiywCiNCsE0rLbBPLLIAAEYrLbBQLLIAAUYrLbBRLLIBAEYrLbBSLLIBAUYrLbBTLLIAAEcrLbBULLIAAUcrLbBVLLIBAEcrLbBWLLIBAUcrLbBXLLMAAABDKy2wWCyzAAEAQystsFksswEAAEMrLbBaLLMBAQBDKy2wWyyzAAABQystsFwsswABAUMrLbBdLLMBAAFDKy2wXiyzAQEBQystsF8ssgAARSstsGAssgABRSstsGEssgEARSstsGIssgEBRSstsGMssgAASCstsGQssgABSCstsGUssgEASCstsGYssgEBSCstsGcsswAAAEQrLbBoLLMAAQBEKy2waSyzAQAARCstsGosswEBAEQrLbBrLLMAAAFEKy2wbCyzAAEBRCstsG0sswEAAUQrLbBuLLMBAQFEKy2wbyyxADwrLrEwARQrLbBwLLEAPCuwQCstsHEssQA8K7BBKy2wciywABaxADwrsEIrLbBzLLEBPCuwQCstsHQssQE8K7BBKy2wdSywABaxATwrsEIrLbB2LLEAPSsusTABFCstsHcssQA9K7BAKy2weCyxAD0rsEErLbB5LLEAPSuwQistsHossQE9K7BAKy2weyyxAT0rsEErLbB8LLEBPSuwQistsH0ssQA+Ky6xMAEUKy2wfiyxAD4rsEArLbB/LLEAPiuwQSstsIAssQA+K7BCKy2wgSyxAT4rsEArLbCCLLEBPiuwQSstsIMssQE+K7BCKy2whCyxAD8rLrEwARQrLbCFLLEAPyuwQCstsIYssQA/K7BBKy2whyyxAD8rsEIrLbCILLEBPyuwQCstsIkssQE/K7BBKy2wiiyxAT8rsEIrLbCLLLILAANFUFiwBhuyBAIDRVgjIRshWVlCK7AIZbADJFB4sQUBFUVYMFktAEu4AMhSWLEBAY5ZsAG5CAAIAGNwsQAHQrQAKxsDACqxAAdCtzAEIAgSBwMKKrEAB0K3NAIoBhkFAwoqsQAKQrwMQAhABMAAAwALKrEADUK8AEAAQABAAAMACyq5AAMAAESxJAGIUViwQIhYuQADAGREsSgBiFFYuAgAiFi5AAMAAERZG7EnAYhRWLoIgAABBECIY1RYuQADAABEWVlZWVm3MgIiBhQFAw4quAH/hbAEjbECAESzBWQGAEREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAYABgAGAKoAAAB8AAA/14CqAAAAfAAAP9eAFoAWgBKAEoCnAAAApwB8AAA/18CqP/0AssB+P/0/18AGAAYABgAGAMSAZMDEgGNAAAARABEAEQARABEAI4AtAD2AVwBkAHqAkoCbgLeAzgDZgO8BAQEQARuBJgFCgU2BWAFkgXABd4GDAY0BnwGuAcSB1gHvAfeCA4IMghiCJAIuAjkCVQJugoCCmwKwAsKC4oLwgwODGYMkgy6DRwNZA2wDhQOqg7oD0QPfg/KD+4QHhBIEHwQqBDSEPwRMBFaEaAR7hIYEkISbhK0EvYTOhNkE5wTyBQWFPIVFBU2FVIVshXmFggWmBa4FwAXOBd2F9YYCBhcGJAYthkiGUgZihm+GiIakhtSG2gblBuoHAgcwBz+HUAdZB2AHaQdzB3sHhYeTB5yHsgfQB/oIH4gmCC+IOQhECE4IWQhgCGkIcAiEiIsInoiwCMII1Yj1CRIJIoktCVEJYQmDiaaJxInVifSKCwolCkGKTQpYil8KbIpzinoKg4qPCqqKv4rWCu+K+IsCCw+LHwsxiziLP4tRi2eLc4uBi52LuAvHi/KMDowiDCkMRoxsDI4MkQyVjJoMnoyhjKSMqQysDK8Msgy1DLgMuwy+DMEMxAzHDMoMzQzRjNSM14zajN2M4IzjjOaM6wzuDPEM9Az3DPuM/o0BjQSNCQ0NjRCNE40WjRsNHg0hDSQNJw0qDS0NMA0zDTYNOQ08DT8NQg1GjUmNTg1SjVWNaI1qjXqNfI1+jYCNgo2EjYaNiI2KjY8Nkg2VDZgNnI2fjaQNpw2qDc2N0g3VDdmN3I3hDeQN5w3qDe0N8A30jfeN+o39jgIOBQ4JjgyOEQ4UDhcOMw42DjkOPY5AjkOORo5LDk4OXo5wjnUOeA58jn+OhI6HjoqOjw6TjpgOnI6fjqKOpY6ojq0OsA6yDtIO1o7bDt4O4Q7kDuiO647ujvGO9I73jvqPBw8Rjx6PIg8uDziPRI9ID2MPbQ92D4GPkY+VD5+Pow+/D8uP1g/fj+8P8o/6EAIQBZAgkDQQSRBakF4QYRBoEGsQbhBxEIOQhwABQAyAAAB3QK8AAMABgAJAAwADwA2QDMPDAsKCQgHBwMCAUwAAAACAwACZwADAQEDVwADAwFfBAEBAwFPAAAODQYFAAMAAxEFBhcrMxEhEQMTIQERAwMTAxMhAzIBq9a6/o0Be7XNtLQIAXK5Arz9RAFzATX9hwJd/tL+0wEtASz9iwE0AAAAAAMAPP/0AkwCqAALABMAHAA1QDIXFhMDAwIBTAACAgFhAAEBKE0FAQMDAGEEAQAAKQBOFRQBABQcFRwSEAcFAAsBCwYIFisFIiY1NDYzMhYVFAY3NjU0JiMiBxMyNwEGBhUUFgFEgYeHgYGHhxsRVVhBKmtFKv74CgpVDLOop7Kyp6izyjxVg4wo/ggtAXsfTCyDjgABACoAAAEwApwACQAjQCAAAQAAAwEAZwACAiJNBAEDAyMDTgAAAAkACRMREQUIGSszESM1MjY2NzMR3LIwUz0OOAH4Qw4qKf1kAAAAAQAiAAACAwKoABoAMEAtDAsCAgABAQMCAkwAAAABYQABAShNAAICA18EAQMDIwNOAAAAGgAaGCUnBQgZKzM1PgI1NCYjIgYHJzY2MzIWFhUUDgIHIRUidqdZQjsvUQxUEnhYPl83OGJ+RgFwS1eSfzs0QDM9GElVKU44Om9pZzNNAAAAAQAq//QCAgKoAC4AREBBHh0CAwQoAQIDBQQCAQIDTAADAAIBAwJpAAQEBWEABQUoTQABAQBhBgEAACkATgEAIiAbGRMSEQ8JBwAuAS4HCBYrBSImJic3FhYzMjY1NC4DIzUyPgI1NCYjIgYHJzY2MzIWFhUUBgcWFhUUBgYBEENfOAxTC0lAQlUgMjkzEBxBOyVNNT1IClISdVw6Yjw4NUs1RG4MLEotGDRBQz4mMRoMAkwGFS0nNjc+MhhHVyFLPjNSFhdbNUNZLAAAAgAmAAACQAKcAAoADQAzQDANAQIBAUwDAQIBSwUBAgMBAAQCAGcAAQEiTQYBBAQjBE4AAAwLAAoAChEREhEHCBorITUhNQEzETMVIxUlMxEBcv60AUtVenr+u/GlTwGo/lhPpfQBNQABADb/9AIJApwAIwBBQD4ZAQIFFBMFBAQBAgJMAAUAAgEFAmkABAQDXwADAyJNAAEBAGEGAQAAKQBOAQAdGxgXFhURDwkHACMBIwcIFisFIiYmJzcWFjMyNjY1NCYmIyIGBycTIRUhBzY2MzIWFhUUBgYBHENeOA1SDEdBKEQpLUUkNEILUikBf/7FFxpNKTtjPUNsDCxKLRg3PiZIMzhGITEZGAFUUbsaGDZmSkxoNAAAAAACADz/9AIaAqgAHAAoAERAQQwLAgMCEgEEBQJMAAMABQQDBWkAAgIBYQABAShNBwEEBABhBgEAACkATh4dAQAkIh0oHigWFBAOCQcAHAEcCAgWKwUiJjU0PgIzMhYXByYmIyIGBzY2MzIWFhUUBgYnMjY1NCYjIgYVFBYBL312Gz1kSUpcFlUPOihOUwMXVkM+YTg6aUhCT09CQ09PDKiaR4RpPj4tGR0hjnQnNjpmQz5pP0dXRUVXV0VFVwAAAAABAA8AAAHcApwABgAkQCEFAQABSwAAAAFfAAEBIk0DAQICIwJOAAAABgAGEREECBgrMwEhNSEVAV0BIv6QAc3+6gJLUVH9tQADADz/9AIrAqgAGwAnADMARUBCFQcCBQIBTAcBAgAFBAIFaQADAwFhAAEBKE0IAQQEAGEGAQAAKQBOKSgdHAEALy0oMykzIyEcJx0nDw0AGwEbCQgWKwUiJiY1NDY3JiY1NDY2MzIWFhUUBgcWFhUUBgYDMjY1NCYjIgYVFBYTMjY1NCYjIgYVFBYBM0VwQkQ3Gh8xUjIzUjEfGjhDQnBGLD8/LCw/PyxIVVVIR1VVDC9ZQEFbFhlEKDJSMTFSMihEGRZbQUBZLwGTPy4sPj4sLj/+t0Q6O0ZGOzpEAAAAAAIAPAAAAhoCpwAaACoANkAzBQEAAwFMBgEDAAACAwBpAAQEAWEAAQEoTQUBAgIjAk4cGwAAJCIbKhwqABoAGiYmBwgYKzMwPgI3BiMiJiY1NDY2MzIWFhUUBw4DBwMyNjY1NCYmIyIGBhUUFhbVGyswFRkcQW1BQG1CRWw+EgUkN0UmEitGKipGKypGKSlGJj5JIgZBbUJCbEBBbUIuLQxFYnE4AR8qRioqRikpRioqRioAAAIACgAAAmgCnQAHAAoALEApCgEEAAFMAAQAAgEEAmgAAAAiTQUDAgEBIwFOAAAJCAAHAAcREREGCBkrMxMzEyMnIQc3MwMK+2n6ZDP+0DNQ9nsCnf1jkpLjAVsAAwBMAAACRQKcABAAGgAlADlANgkBBQIBTAACAAUEAgVnAAMDAF8AAAAiTQAEBAFfBgEBASMBTgAAJSMdGxoYExEAEAAPIQcIFyszESEyFhYVFAYHFhYVFAYGIwMzMjY1NCYmIyMRMzI2NjU0JiYjI0wBDUlbKyQiMjExYkm/uTMzFy0iucklMhoZMybIApwwSysoTh0aWTAwWDgBfkAmGjAf/gIiNR0dMyEAAAEAMv/0AmoCqAAdADFALhsaDAsEAwIBTAACAgFhAAEBKE0AAwMAYQQBAAApAE4BABgWEA4JBwAdAR0FCBYrBSImJjU0NjYzMhYXByYmIyIGBhUUFhYzMjY3FwYGAWFfiEhNjF5UhyJSFllBO184NmE+QVkXUiSMDFmcZmibVk5JHi05PHdXVHhAOC4eSk0AAAIATAAAAm8CnAAMABkAJ0AkAAMDAF8AAAAiTQACAgFfBAEBASMBTgAAGRcPDQAMAAshBQgXKzMRMzIeAhUUDgIjJzMyPgI1NC4CIyNMtlCFYjY2YoVQWFY0YU0tLU1hNFYCnCFMgV9ggU0hTxEzZ1VVZTMRAAAAAAEATAAAAhECnAALAC9ALAACAAMEAgNnAAEBAF8AAAAiTQAEBAVfBgEFBSMFTgAAAAsACxERERERBwgbKzMRIRUhFSEVIRUhFUwBxf6ZAQn+9wFnApxRy1HeUQAAAQBMAAAB/gKcAAkAKUAmAAIAAwQCA2cAAQEAXwAAACJNBQEEBCMETgAAAAkACREREREGCBorMxEhFSEVIRUhEUwBsv6sAVT+rAKcUctR/tEAAAAAAQAy//QCggKoACUAckALDAsCBQIjAQMEAkxLsBVQWEAfAAUABAMFBGcAAgIBYQABAShNAAMDAGEGBwIAACkAThtAIwAFAAQDBQRnAAICAWEAAQEoTQAGBiNNAAMDAGEHAQAAKQBOWUAVAQAiISAfHh0YFhAOCQcAJQElCAgWKwUiJiY1NDY2MzIWFwcmJiMiBgYVFBYWMzI+AjU1IzUhESMnBgYBYGCHR02MXlSHI1MWWUE7Xzg1Xz4hRjokwwEcNhkgbwxZnGZom1ZOSR4tOTx3V1R4QBAnRDQWUf6nVDMtAAAAAQBMAAACZgKcAAsAJ0AkAAEABAMBBGcCAQAAIk0GBQIDAyMDTgAAAAsACxERERERBwgbKzMRMxEhETMRIxEhEUxeAV5eXv6iApz+5AEc/WQBL/7RAAAAAAEAQgAAAVwCnAALAClAJgMBAQECXwACAiJNBAEAAAVfBgEFBSMFTgAAAAsACxERERERBwgbKzM1MxEjNSEVIxEzFUJeXgEaXl5KAghKSv34SgAAAAEAD//0AbICnAAQAChAJQQDAgECAUwAAgIiTQABAQBhAwEAACkATgEADQwIBgAQARAECBYrFyImJzcGFjMyNjY1ETMRFAbgXm4FVwJKMhs2I15wDGVkGUxJGEA8Acf+OG1zAAABAEwAAAJpApwACwAmQCMKCQYDBAIAAUwBAQAAIk0EAwICAiMCTgAAAAsACxISEQUIGSszETMRATMDASMDBxVMXgEtdf8BHHPoZAKc/rABUP7p/nsBQG7SAAAAAAEATAAAAhECnAAFAB9AHAAAACJNAAEBAmADAQICIwJOAAAABQAFEREECBgrMxEzESEVTF4BZwKc/bVRAAEATAAAAugCnAAMACdAJAsIAwMCAAFMAQEAACJNBQQDAwICIwJOAAAADAAMEhESEQYIGiszETMTEzMRIxEDIwMRTJyyspxewV3CApz93gIi/WQCOv3GAjr9xgAAAQBMAAACZQKcAAkAJEAhCAMCAgABTAEBAAAiTQQDAgICIwJOAAAACQAJERIRBQgZKzMRMwERMxEjARFMiwEwXor+zwKc/cgCOP1kAjv9xQACADL/9AKlAqgADwAfAC1AKgADAwFhAAEBKE0FAQICAGEEAQAAKQBOERABABkXEB8RHwkHAA8BDwYIFisFIiYmNTQ2NjMyFhYVFAYGJzI2NjU0JiYjIgYGFRQWFgFrYIxNTYxgYYxNTYxhPWM6OmM9PGM6OmMMWZ1lZZtZWZtlZZ1ZTz53V1Z3PT13Vld3PgACAEwAAQIzApwADAAXACtAKAADAAECAwFnAAQEAF8AAAAiTQUBAgIjAk4AABcVDw0ADAAMJiEGCBgrNxEzMhYWFRQGBiMjEREzMjY2NTQmJiMjTNFSfUdHfVJzezFOLy9OMXsBApsgV1NSVx/+9wFaDjM2NzQQAAACADL/1ALxAqgAFAAoADVAMhoZGBcTBQIDFAECAAICTAADAwFhAAEBKE0EAQICAGEAAAApAE4WFSIgFSgWKCYjBQgYKwUnBgYjIiYmNTQ2NjMyFhYVFAYHFyUyNyc3FzY2NTQmJiMiBgYVFBYWArF1J2pAYIxNTYxgYYxNGBd7/npYObNApgsLOmM9PGM6OmMsbSUoWZ1lZZtZWZtlOGMpcys7qEScG0ElVnc9PXdWV3c+AAACAEwAAAJMApwADwAaADNAMAoBAgQBTAAEAAIBBAJnAAUFAF8AAAAiTQYDAgEBIwFOAAAaGBIQAA8ADxEYIQcIGSszETMyFhYVFAYGBxMjAyMRETMyNjY1NCYmIyNM1FJ9RxxPTs9zy2R9MU8vL08xfQKcHVNQLU42C/7gARn+5wFoDjEzNDAPAAAAAAEAKP/0AiwCqAAyADFALh4dBQQEAQMBTAADAwJhAAICKE0AAQEAYQQBAAApAE4BACIgGhgKCAAyATIFCBYrBSImJic3HgIzMjY2NTQmJycuAjU0NjYzMhYWFwcmJiMiBgYVFBYWFxceAhUUDgIBKDdoTxJXDDZHJChILTxKVS5ZOUdxPS9bSRVWE1UuJEIqJ0EnSTNaOCxKXQwiRjYaJC8WGjUoKTATEwwoSj45UCobNysZIyQXLiMhKBcJEAwqTEAuSTEaAAAAAQAKAAACJAKcAAcAIUAeAgEAAAFfAAEBIk0EAQMDIwNOAAAABwAHERERBQgZKzMRIzUhFSMR6N4CGt4CS1FR/bUAAAABAEz/9AJmApwAEQAkQCEDAQEBIk0AAgIAYQQBAAApAE4BAA4NCggFBAARAREFCBYrBSImNREzERQWMzI2NREzERQGAVmRfF5PYGBPXnsMkZIBhf50Y2hoYwGM/nuSkQABAAoAAAJDApwABgAhQB4DAQIAAUwBAQAAIk0DAQICIwJOAAAABgAGEhEECBgrMwMzExMzA+/lZ7W2Z+YCnP3SAi79ZAAAAAABAAoAAAM+ApwADAAnQCQLBgMDAwABTAIBAgAAIk0FBAIDAyMDTgAAAAwADBESEhEGCBorMwMzExMzExMzAyMDA7KoZ4J6bnqCZ6dygYECnP3YAij92AIo/WQCKP3YAAABAAoAAAJlApwACwAmQCMKBwQBBAIAAUwBAQAAIk0EAwICAiMCTgAAAAsACxISEgUIGSszEwMzFzczAxMjAwMK9edwr69x5/VxvbwBWAFE9fX+vP6oAQn+9wAAAAEACgAAAkkCnAAIACNAIAcEAQMCAAFMAQEAACJNAwECAiMCTgAAAAgACBISBAgYKzMRAzMTEzMDEfvxZ7m4Z/ABAwGZ/r0BQ/5n/v0AAAAAAQAsAAACMwKcAAkALUAqBgEAAQECAksAAAABXwABASJNAAICA18EAQMDIwNOAAAACQAJEhESBQgZKzM1ASE1IRUBIRUsAYr+hQHp/ngBl1EB+lFR/gZRAAIAJv/0AdsB+AAdACkAY0AKIxsPDggFBAEBTEuwFVBYQBgAAQECYQACAitNBgEEBABhAwUCAAApAE4bQBwAAQECYQACAitNAAMDI00GAQQEAGEFAQAAKQBOWUAVHx4BAB4pHykaGRMRDAoAHQEdBwgWKxciJiY1NDY2NzYmIyIGByc2NjMyFhUVFBYXIycGBicyNjY1NQ4CFRQW0S9OLlOXZQI2PC05CFEUZ0NnXwoHTRQWUi8nRixMcD0zDCJALTtEJQs/RCkkGDk/YWh0PlojRCUrQxxDOh8IFykiIysAAgBG//QCEAKcABIAHgBrtggDAgQFAUxLsBVQWEAdAAICIk0ABQUDYQADAytNBwEEBABhAQYCAAApAE4bQCEAAgIiTQAFBQNhAAMDK00AAQEjTQcBBAQAYQYBAAApAE5ZQBcUEwEAGhgTHhQeDAoHBgUEABIBEggIFisFIiYnByMRMxU2NjMyFhYVFAYGJzI2NTQmIyIGFRQWATs6UBcWPlQXUDo5YTs7YU9ATU1AQE1NDC8oSwKc+icvPXNSUnM9SGJYWWFhWVhiAAAAAQAm//QB0wH4AB0AMUAuGxoMCwQDAgFMAAICAWEAAQErTQADAwBhBAEAACkATgEAGBYQDgkHAB0BHQUIFisFIiYmNTQ2NjMyFhcHJiYjIgYGFRQWFjMyNjcXBgYBDUdoODtsSUNgGE0QPiYlQigpQSUpPRBNHGgMQ3RLSnVDQi4cHiQnUT8+UyglHBwwPwAAAgAm//QCAQKcABUAIQBrthMLAgQFAUxLsBVQWEAdAAICIk0ABQUBYQABAStNBwEEBABhAwYCAAApAE4bQCEAAgIiTQAFBQFhAAEBK00AAwMjTQcBBAQAYQYBAAApAE5ZQBcXFgEAHRsWIRchEhENDAkHABUBFQgIFisXIiYmNTQ2NjMyFhc1MxEUFhcjJwYGJzI2NTQmIyIGFRQW+zhiOztiODtQFlQEDU8WFlAlQE1NQEBNTQw9c1JScz0vJ/r+HxlhQUsoL0hiWFlhYVlYYgAAAAACACb/9AICAfgAGAAhADtAOBYVAgMCAUwABAACAwQCZwAFBQFhAAEBK00AAwMAYQYBAAApAE4BAB8dGhkTEQ4NCQcAGAEYBwgWKwUiJiY1NDY2MzIeAgchHgIzMjY3FwYGAyE0JiYjIgYGARlObDlAbUQ7WjsbBP6CAjNGHio5EVEbZN4BJCM/LCVCKwxFdUlPcz8vT2Q1PkgdGxYYKzgBMCNAKRw+AAABAA8AAAEeAsIAFABVS7ARUFhAHQADAwJhAAICKk0FAQAAAV8EAQEBJU0HAQYGIwZOG0AbAAIAAwECA2kFAQAAAV8EAQEBJU0HAQYGIwZOWUAPAAAAFAAUERMhJBERCAgcKzMRIzUzNTQ2NjMzFSMiBhUVMxUjEWNUVBQ6NzY0IBNnZwGtQ0ozPBlHGiZLQ/5TAAAAAgAm/0AB6gH4AB8ALQB3QAwaDAIFBgUEAgECAkxLsB1QWEAfAAEHAQABAGUABgYDYQQBAwMrTQgBBQUCYQACAiMCThtAIwABBwEAAQBlAAQEJU0ABgYDYQADAytNCAEFBQJhAAICIwJOWUAZISABACknIC0hLRwbGBYQDgkHAB8BHwkIFisFIiYmJzcWFjMyNjU1BgYjIiYmNTQ2NjMyFhc3MxEUBgMyNjY1NCYmIyIGFRQWARIoTz0NVA5AH003F0w7N2A7O2A3O0wXFz1ffiY/Jyc/Jj1PT8AXNCkXJxpKSEInLjlvT1BuOi8nTv4/dnkBDyROPz9OI1tVVVwAAAEARgAAAd4CnAAUAC1AKgMBAgMBTAAAACJNAAMDAWEAAQErTQUEAgICIwJOAAAAFAAUJBMjEQYIGiszETMVNjYzMhYVESMRNCYmIyIGFRFGVBVMP1pKVA4vMD1GApz3IzBpVf7GASEmQShTUP7zAAACAC0AAADbAssACwARAFlLsBFQWEAcBQEAAAFhAAEBKk0AAgIDXwADAyVNBgEEBCMEThtAGgABBQEAAwEAaQACAgNfAAMDJU0GAQQEIwROWUAVDAwBAAwRDBEQDw4NBwUACwELBwgWKxMiJjU0NjMyFhUUBgMRIzUzEZwZJSUZGiUlREWZAk4lGhokJBoaJf2yAa1D/hAAAAL/xv9fAMICywALABkAWUuwEVBYQBwFAQAAAWEAAQEqTQAEBCVNAAMDAmEGAQICJwJOG0AaAAEFAQAEAQBpAAQEJU0AAwMCYQYBAgInAk5ZQBUNDAEAFRQQDgwZDRkHBQALAQsHCBYrEyImNTQ2MzIWFRQGAyc1FzI2NjURMxEUBgaEGiUlGhokJKE3LyosD1QfTQJOJRoaJCQaGiX9EQJJAQ8qKgHk/hdASR8AAAAAAQBGAAAB4AKcAAsAKkAnCgkGAwQCAQFMAAAAIk0AAQElTQQDAgICIwJOAAAACwALEhIRBQgZKzMRMxE3MwcTIycHFUZUyGW71GelOgKc/nXfzf7d5T+mAAEARgAAAOACmwAMACFAHgABASJNAAICAGIDAQAAIwBOAQALCQYFAAwBDAQIFiszIiYmNREzERQWMzMVuy8zE1QQIxMTNjMCH/3vJhpKAAAAAQBGAAADBQH4ACQAVrYJAwIDBAFMS7AdUFhAFgYBBAQAYQIBAgAAJU0IBwUDAwMjA04bQBoAAAAlTQYBBAQBYQIBAQErTQgHBQMDAyMDTllAEAAAACQAJCQTJBMkIxEJCB0rMxEzFzY2MzIWFzY2MzIWFREjETQmJiMiBhURIxE0JiYjIgYVEUY+FhVJNzlGEB5VNFZKVA8tLjZBVA8tLjZCAfBLIzAuKS4paVX+xgEhJkEoU1D+8wEhJkEoU1D+8wAAAAEARgAAAd4B+AAUAEy1AwECAwFMS7AdUFhAEwADAwBhAQEAACVNBQQCAgIjAk4bQBcAAAAlTQADAwFhAAEBK00FBAICAiMCTllADQAAABQAFCQTIxEGCBorMxEzFzY2MzIWFREjETQmJiMiBhURRj4WFUw/WkpUDi8wPUYB8EsjMGlV/sYBISZBKFNQ/vMAAAIAJv/0AgIB+AATACMALUAqAAMDAWEAAQErTQUBAgIAYQQBAAApAE4VFAEAHRsUIxUjCwkAEwETBggWKwUiLgI1ND4CMzIeAhUUDgInMjY2NTQmJiMiBgYVFBYWARQrVEUqKkVUKytVRSkpRVUrJEQsLEQkI0UsLEUMHj9iQ0NiPx4eP2JDQ2I/HkonUUBAUScnUUBAUScAAgBG/18CEAH4ABIAHgBothEDAgQFAUxLsB1QWEAdAAUFAGEBAQAAJU0HAQQEAmEAAgIpTQYBAwMnA04bQCEAAAAlTQAFBQFhAAEBK00HAQQEAmEAAgIpTQYBAwMnA05ZQBQUEwAAGhgTHhQeABIAEiYjEQgIGSsXETMXNjYzMhYWFRQGBiMiJicVNzI2NTQmIyIGFRQWRj0XF1A6OWE7O2E5OlAXi0BNTUBATU2hApFOJy89c1JRdD0vKOzdYlhZYWFZWGIAAAACACb/UwJ0AfgAHgAqAKxADxMFAgUGGwEEARwBAAQDTEuwHVBYQCIABgYCYQMBAgIrTQgBBQUBYQABASlNAAQEAGEHAQAAJwBOG0uwKVBYQCYAAwMlTQAGBgJhAAICK00IAQUFAWEAAQEpTQAEBABhBwEAACcAThtAIwAEBwEABABlAAMDJU0ABgYCYQACAitNCAEFBQFhAAEBKQFOWVlAGSAfAQAmJB8qICoaGBUUEQ8JBwAeAR4JCBYrBSImJjU1BgYjIiYmNTQ2NjMyFhc3MxEUFjMyNxUGBiUyNjU0JiMiBhUUFgIfIjwlFlE7OGE7O2E4O1EWFz0hJhojEyz+3EBNTUBATk6tGj85ZigvPXRRUnM9LydO/fgbKw1OBgjpYlhZYWFZWGIAAAABAEYAAAFPAfgADgBJtQMBAwIBTEuwHVBYQBIAAgIAYQEBAAAlTQQBAwMjA04bQBYAAAAlTQACAgFhAAEBK00EAQMDIwNOWUAMAAAADgAOIRMRBQgZKzMRMxc2NjMVIiIHBgYVFUY9GxpZPgcPB1VDAfBcLTdXAQdoXNUAAQAf//QBuQH5AC0AMUAuHBsFBAQBAwFMAAMDAmEAAgIrTQABAQBhBAEAACkATgEAIB4ZFwkHAC0BLQUIFisXIiYmJzcWFjMyNjY1NCYnJy4CNTQ2NjMyFhcHJiYjIgYVFBYXFx4CFRQGBu8rU0ERUQtLKR41IkEtRSQ+JjhXMDtpFk8NQSMmPjUnQShILjpcDBs3Kh4sJxIiFikiCQ4IHTYtLT0gMTQdHh0iICAdCA0IHjs1L0IjAAEAFAAAARwCbQAUADVAMgADAgOFBQEBAQJfBAECAiVNAAYGAGIHAQAAIwBOAQATEQ4NDAsKCQgHBgUAFAEUCAgWKzMiJiY1ESM1MzUzFTMVIxEUFjMzFd0vMxNUVFRgYA8kLRM2MwExQ319Q/7dJhpKAAAAAQBE//QB0gHxABUAULUTAQIBAUxLsBVQWEATAwEBASVNAAICAGEEBQIAACkAThtAFwMBAQElTQAEBCNNAAICAGEFAQAAKQBOWUARAQASERAPDAoGBQAVARUGCBYrFyImJjURMxEUFhYzMjY1ETMRIycGBuM6Rh9UGi8fO0NUPxUVSAwxVzgBPf7XNzwXU08BEf4PSCQwAAABAAAAAAG5AfAABgAhQB4DAQIAAUwBAQAAJU0DAQICIwJOAAAABgAGEhEECBgrMwMzExMzA7GxW4KBW7EB8P5+AYL+EAAAAAABAAAAAAKOAfAADAAnQCQLBgMDAwABTAIBAgAAJU0FBAIDAyMDTgAAAAwADBESEhEGCBorMwMzExMzExMzAyMDA4+PWl9jV2JfWo5NbGwB8P6RAW/+kQFv/hABj/5xAAABAAAAAAHNAfAACwAmQCMKBwQBBAIAAUwBAQAAJU0EAwICAiMCTgAAAAsACxISEgUIGSsxNyczFzczBxcjJwe1rGN6e2OstWOEg//xrKzx/7m5AAABAAD/XwGtAe8AEAAoQCUJBgIAAQFMAgEBASVNAAAAA2IEAQMDJwNOAAAAEAAPEhQhBQgZKxc1MzI2NjcDMxMTMwMOAiMlIiQmFwuzXXp6XLASJT44oUoLJSYB8P6CAX79+zU9GQAAAAEAKAAAAa4B8AAJAC1AKgYBAAEBAgJLAAAAAV8AAQElTQACAgNfBAEDAyMDTgAAAAkACRIREgUIGSszNQEhNSEVASEVKAEd/uwBc/7jASdKAVxKSv6kSgABADUCPwF4ArcACQAnsQZkREAcCAEBAAFMAAABAIUDAgIBAXYAAAAJAAkSIgQIGCuxBgBEEzc2MzIXFyMnBzVwFB4dFHBeREMCP2UTE2U9PQAAAAABADUCOQF4ArEACQApsQZkREAeBQEAAQFMAgEBAAGFAwEAAHYBAAcGBAMACQEJBAgWK7EGAEQTIicnMxc3MwcG1x4UcF5DRF5wFAI5E2U9PWUTAAABADUCOQFbArEADQAxsQZkREAmAwEBAgGFAAIAAAJZAAICAGEEAQACAFEBAAsKCAYEAwANAQ0FCBYrsQYARBMiJiczFhYzMjY3MwYGyDdRC0UJKhsaKgpFClMCOUUzFx4eFzNFAAAAAAEANQJOAKECugALACexBmREQBwAAQAAAVkAAQEAYQIBAAEAUQEABwUACwELAwgWK7EGAEQTIiY1NDYzMhYVFAZrFiAgFhcfHwJOIBYXHx8XFiAAAAIADwIvAOkDCQANABkAObEGZERALgABAAMCAQNpBQECAAACWQUBAgIAYQQBAAIAUQ8OAQAVEw4ZDxkJBwANAQ0GCBYrsQYARBMiJiY1NDY2MzIWFRQGJzI2NTQmIyIGFRQWfh8yHh4yHy49PTAWHh4WFh4eAi8eMh0eMR5BLCxBOh4VFR4eFRUeAAAAAQA1/1MA0gAAABIAXLEGZERAChABAgERAQACAkxLsAtQWEAXAAECAgFwAAIAAAJZAAICAGIDAQACAFIbQBYAAQIBhQACAAACWQACAgBiAwEAAgBSWUANAQAODAcGABIBEgQIFiuxBgBEFyImNTQ2NzMGBhUUFjMyNjcVBpMtMSslTTMkHBUJEwoirTIgHzMJEyUTFBQEBDYMAAAAAQA1AaIAtgKcAA0AIEAdCAEAAQFMAgEAAAFfAAEBIgBOAQAHBgANAQ0DCBYrEyImNTQ3NzMHFhYVFAZ2GyYFPjcvFx8mAaInGQwNoXoEJBgbJQAAAQA1Aa0AtgKoAA0AH0AcAQEBAAFMAgEBAQBhAAAAKAFOAAAADQANJgMIFysTNyYmNTQ2MzIWFRQHBzwvFx8mGhsmBT4BrXsEIxgbJiYaDA2iAAAAAQA1/3oAtgB1AA0AJEAhAQEBAAFMAAABAQBZAAAAAV8CAQEAAU8AAAANAA0mAwgXKxc3JiY1NDYzMhYVFAcHPC8XHyYaGyYFPoZ7BCMYGyYmGgwNogAAAAIANQGiAVkCnAAOAB0ALEApGAkCAAEBTAUCBAMAAAFfAwEBASIAThAPAQAXFg8dEB0IBwAOAQ4GCBYrEyImNTQ2NzczBxYWFRQGMyImNTQ2NzczBxYWFRQGdhkoBAQ7Ny8XHyaJGSgEBDs3LxcfJgGiIxgLEQqZegQkGBslIxgLEQqZegQkGBslAAAAAgA1Aa0BWQKoAA0AGwArQCgPAQIBAAFMBQMEAwEBAGECAQAAKAFODg4AAA4bDhsWFAANAA0mBggXKxM3JiY1NDYzMhYVFAcHMzcmJjU0NjMyFhUUBwc8LxcfJhobJgU+bC8XHyYbGyUFPQGtewQjGBsmJhoMDaJ7BCMYGyYmGgwNogAAAgA1/3oBWQB1AA0AGwAxQC4PAQIBAAFMAgEAAQEAWQIBAAABXwUDBAMBAAFPDg4AAA4bDhsWFAANAA0mBggXKxc3JiY1NDYzMhYVFAcHMzcmJjU0NjMyFhUUBwc8LxcfJhobJgU+bC8XHyYbGyUFPYZ7BCMYGyYmGgwNonsEIxgbJiYaDA2iAAEAKAAAAfUCnAALAClAJgACAiJNBAEAAAFfAwEBASVNBgEFBSMFTgAAAAsACxERERERBwgbKzMRIzUzNTMVMxUjEea+vlG+vgGgUKysUP5gAAAAAAEAKAAAAfUCnAATADdANAcBAQgBAAkBAGcABAQiTQYBAgIDXwUBAwMlTQoBCQkjCU4AAAATABMRERERERERERELCB8rMzUjNTM1IzUzNTMVMxUjFTMVIxXmvr6+vlG+vr6+rE+lUKysUKVPrAAAAAABADUAWAGBAaQADwAfQBwAAQAAAVkAAQEAYQIBAAEAUQEACQcADwEPAwgWKzciJiY1NDY2MzIWFhUUBgbbLkstLUsuLkstLUtYLUwtLkstLUsuLUwtAAAAAwA1//QCgwB1AAsAFwAjADBALQUDAgEBAGEIBAcCBgUAACkAThkYDQwBAB8dGCMZIxMRDBcNFwcFAAsBCwkIFisFIiY1NDYzMhYVFAYhIiY1NDYzMhYVFAYzIiY1NDYzMhYVFAYCQxsmJhsaJib+GBomJhobJibMGyUlGxsmJgwmGhsmJhsaJiYaGyYmGxomJhobJiYbGiYAAAAABwAm//QFCgKoAA8AEwAfAC8APwBLAFcAtUuwFVBYQDIQAQQOAQALBABpCQEHDQELCgcLagAFBQFhAgEBAShNFAwTAwoKA2ESCBEGDwUDAyMDThtAOhABBA4BAAsEAGkJAQcNAQsKBwtqAAICIk0ABQUBYQABAShNDwEDAyNNFAwTAwoKBmESCBEDBgYpBk5ZQDtNTEFAMTAhIBUUEBABAFNRTFdNV0dFQEtBSzk3MD8xPyknIC8hLxsZFB8VHxATEBMSEQkHAA8BDxUIFisTIiYmNTQ2NjMyFhYVFAYGAwEzAQMyNjU0JiMiBhUUFgEiJiY1NDY2MzIWFhUUBgYhIiYmNTQ2NjMyFhYVFAYGJTI2NTQmIyIGFRQWITI2NTQmIyIGFRQW3DJTMTFTMjJSMTFSVAHUWP4sNiw/PywsQEACFDJTMTFTMjJSMTFSAV8yUzExUzIyUjExUv49LD8/LC0/PwG+LD8/LC0/PwE8MVMyMlMxMVMyMlMx/sQCnP1kAYc/LCw/PywsP/5tMVIyM1IxMVIzMlIxMVIyM1IxMVIzMlIxSj8sLT8/LSw/PywtPz8tLD8AAAABADUAKAEsAc0ABQAlQCIEAQIBAAFMAAABAQBXAAAAAV8CAQEAAU8AAAAFAAUSAwgXKzcnNzMHF8mUlGOVlSjS09PSAAEANQAoASwBzQAFACVAIgQBAgEAAUwAAAEBAFcAAAABXwIBAQABTwAAAAUABRIDCBcrNzcnMxcHNZWVZJOTKNLT09IAAQAPAAACOwKcAAMAGUAWAAAAIk0CAQEBIwFOAAAAAwADEQMIFyszATMBDwHUWP4sApz9ZAAAAAACADUBjQE+ArQAHwAqAD9APCQQDwgEBAEdAQMEAkwAAgABBAIBaQADAzNNBgEEBABhBQEAADUATiEgAQAgKiEqHBsUEg0LAB8BHwcJFisTIiY1NDY2Nzc0JiYjIgYHJzY2MzIWFhUVFBYXIycGBicyNjU1BwYGFRQWmC41L00tEQUWGhYeBT0LPy8gNSEHBDoMDTgHIyAWNSkbAY0tJCMoEwQCEB4TERMSHiUVNC5SFyoXJxkUMykeCwMHEhMREgACADUAKAH9Ac0ABQALADNAMAoHBAEEAQABTAIBAAEBAFcCAQAAAV8FAwQDAQABTwYGAAAGCwYLCQgABQAFEgYIFyslJzczBxchJzczBxcBmZOTZJaW/syUlGOVlSjT0tLT09LS0wAAAAEANQBaAiUBjAAFACRAIQMBAgAChgABAAABVwABAQBfAAABAE8AAAAFAAUREQQIGCslNSE1IREB1P5hAfBa40/+zgAABAA1//QC6QKoABMAJwA3AEAAabEGZERAXjIBBggBTAwHAgUGAgYFAoAAAQADBAEDaQAEAAkIBAlpAAgABgUIBmcLAQIAAAJZCwECAgBhCgEAAgBRKCgVFAEAQD46OCg3KDc2NTQzKykfHRQnFScLCQATARMNCBYrsQYARAUiLgI1ND4CMzIeAhUUDgInMj4CNTQuAiMiDgIVFB4CJxEzMhYWFRQGBgcXIycjFTUzMjY1NCYjIwGPSH1fNjZffUhIfV82Nl99SDtnTiwsTmc7O2dOLCxOZ0xwN00qDCYmbFZmKjUrJjAmMAw2X31HSH5fNjZffkhHfV82PSxPZzo7Z08tLU9nOzpnTyxxAXASMTEPKSQLlYuLxRwaIhYAAAAAAQA1AlkBSQKcAAMAJrEGZERAGwAAAQEAVwAAAAFfAgEBAAFPAAAAAwADEQMIFyuxBgBEEzUhFTUBFAJZQ0MAAAIAKAGYATgCqAAPABsAObEGZERALgABAAMCAQNpBQECAAACWQUBAgIAYQQBAAIAUREQAQAXFRAbERsJBwAPAQ8GCBYrsQYARBMiJiY1NDY2MzIWFhUUBgYnMjY1NCYjIgYVFBawJT4lJT4lJj0lJT0mHyoqHx4rKwGYJT4lJj0lJT0mJT4lPyseHyoqHx4rAAIANQAAAg4B8AALAA8AOkA3AwEBBAEABQEAZwgBBQUCXwACAiVNAAYGB18JAQcHIwdODAwAAAwPDA8ODQALAAsREREREQoIGys3NSM1MzUzFTMVIxUFNSEV+sXFT8XF/uwB2XyST5OTT5J8T08AAAABADUBkwFJAxIAFgAwQC0LCgICAAEBAwICTAAAAAFhAAEBMk0AAgIDXwQBAwMzA04AAAAWABYVJSYFCRkrEzU2NjU0JiMiBgcnNjYzMhYVFAYHMxU1XGkfGhYmBEALRDQ1R2JYwwGTN0lpLhocGyASKjE0MDduPDoAAAAAAQA1AY0BSgMSACkAREBBGRgCAwQjAQIDBAMCAQIDTAADAAIBAwJpAAQEBWEABQUyTQABAQBhBgEAADUATgEAHRsXFREPDgwIBgApASkHCRYrEyImJzcWFjMyNjU0JiMjNTMyNjU0JiMiByc2NjMyFhYVFAYHFhYVFAYGuzVEDT4IIh8fKi8mGRUkLCYYNxA9DUc0HzomHhcfHyhBAY0zJhIXISEcIxw2Gx4cGTUSKC0VLCQbLAwMMh0mMxkAAAAAAQA1AjsA1wLDABEAJbEGZERAGgoBAQABTAAAAQCFAgEBAXYAAAARABAmAwgXK7EGAEQTPgM3NjMyFhUUBgcOAgc1AxkgHQcKEhAWBQgHJCEDAjsEISolBw0VEQcNCAggGwMAAAEARv9eAdQB8QAWAF5ACg8BAQAVAQMBAkxLsCpQWEAcAgEAABZNAAMDFU0AAQEEYQAEBBVNBgEFBRgFThtAGgABAAQFAQRpAgEAABZNAAMDFU0GAQUFGAVOWUAOAAAAFgAWIxETJBEHBxsrFxEzERQWFjMyNjURMxEjJwYGIyImJxVGVBAtKztDVD8VFTU4HzITogKT/s4jOyNTTwER/g9IJDAcGcsAAAEAJv9fAeMCnAARAClAJgEBAgEBTAMBAQEAXwAAACJNBQQCAgInAk4AAAARABEREREoBggaKxcRLgI1NDY2MyEVIxEjESMRuypEJzNWNAEAKFFeoQHHCTVOLTRWM0P9BgL6/QYAAAAAAQA1ALcAtgE4AAsAH0AcAAEAAAFZAAEBAGECAQABAFEBAAcFAAsBCwMIFis3IiY1NDYzMhYVFAZ1GiYmGhsmJrcmGxomJhobJgAAAAEASf9LAQIAGQAgAHKxBmREQBQYEwICAwQBAQIDAQABA0wXFgIDSkuwDVBYQBwAAwIBA3AAAgEChQABAAABWQABAQBiBAEAAQBSG0AbAAMCA4UAAgEChQABAAABWQABAQBiBAEAAQBSWUAPAQAcGg0MCAYAIAEgBQgWK7EGAEQXIiYnNxYWMzI2NTQmIyIGBwYmNTQ3NxcHNjYzMhYVFAahEysaDhEdDBoZERMHDwkNDwMzIh4IDwcjIjC1CgojBwcWDAoPAwIEDgkGBFIVMQICJRgcMwAAAAEANQGTAMsDCwAIACNAIAABAAADAQBnAAICMk0EAQMDMwNOAAAACAAIEhERBQkZKxMRIzUyNjczEYhTITMKOAGTARgvFRz+iAAAAAACADkBjgFMArQADwAbACtAKAABAAMCAQNpBQECAgBhBAEAADUAThEQAQAXFRAbERsJBwAPAQ8GCRYrEyImJjU0NjYzMhYWFRQGBicyNjU0JiMiBhUUFsIjPycnPyMkPycnPyQeJyceHScnAY4gQTIyQSAgQTIyQSA2MC0tMDAtLTAAAAACADUAKAH9Ac0ABQALADNAMAoHBAEEAQABTAIBAAEBAFcCAQAAAV8FAwQDAQABTwYGAAAGCwYLCQgABQAFEgYIFyslNyczFwchNyczFwcBBpWVY5SU/syVlWSTkyjT0tLT09LS0wAAAAQANQAAAwUCnAADAAwAFwAaAGqxBmREQF8aAQgFEAEGCAJMAAMAAgcDAmcABwUBB1cEAQANAQUIAAVnCwEICQEGAQgGaAAHBwFfDgoMAwEHAU8NDQQEAAAZGA0XDRcWFRQTEhEPDgQMBAwLCggHBgUAAwADEQ8IFyuxBgBEMwEzAQMRIzUyNjczEQE1IzU3MxUzFSMVJzM1cwHUWP4tRFMhMwo5AbS5ukNBQbRwApz9ZAEkARcwFRz+iP7cVjbs6TlWj5IAAAAAAwA1AAAC9wKcAAMADAAjAGmxBmREQF4XAQgFDgEBCAJMGAEFAUsAAwACBwMCZwAHAAYFBwZqBAEACwEFCAAFZwAIAQEIVwAICAFfDAkKAwEIAU8NDQQEAAANIw0jIiEcGhUTBAwEDAsKCAcGBQADAAMRDQgXK7EGAEQzATMBAxEjNTI2NzMRATU2NjU0JiMiBgcnNjYzMhYVFAYHMxVzAdRY/ixDUyEzCjgBGVxpHxoWJgVAC0U0NUdiWMICnP1kASQBFzAVHP6I/tw2SmguGhwbIBMpMTQvOG47OgAAAAAEADUAAAMvAqgAKQAtADgAOwDQsQZkREAYGRgCAwQjAQIDBAMCCQI7AQoAMQEICgVMS7AVUFhANwYBBQAEAwUEaQADAAIJAwJpAAkBBwlXAAEOAQAKAQBpDQEKCwEIBwoIaAAJCQdfEAwPAwcJB08bQD4ABgUEBQYEgAAFAAQDBQRpAAMAAgkDAmkACQEHCVcAAQ4BAAoBAGkNAQoLAQgHCghoAAkJB18QDA8DBwkHT1lAKy4uKioBADo5LjguODc2NTQzMjAvKi0qLSwrHRsWFBEPDgwIBgApASkRCBYrsQYARBMiJic3FhYzMjY1NCYjIzUzMjU0JiMiBgcnNjYzMhYWFRQGBxYWFRQGBgMBMwEhNSM1NzMVMxUjFSczNbs1RA0+CCIfHyovLBMSUyYYHCMIPQ1HNB86Jh4XHx8oQUQB1Vj+KwG1ubpEQEC1cAEjMyYSGCAhHCMcNTkbGhwZEiguFS0kHCsMCzIdJjMZ/t0CnP1kVjbs6TlWj5IAAAABACgAAAIBAfAABgAGswMAATIrISU1JRUFBQIB/icB2f6QAXDVRtVanp4AAAIANQB5AiUBggADAAcAL0AsAAAEAQECAAFnAAIDAwJXAAICA18FAQMCA08EBAAABAcEBwYFAAMAAxEGCBcrEzUhFQU1IRU1AfD+EAHwATNPT7pPTwAAAAABACgAAAIBAfAABgAGswQAATIrMzUlJTUFFSgBcP6QAdlanp5a1UYAAgAo//QB1gKoACAALAA8QDkQDwICAAFMBQECAAQAAgSAAAAAAWEAAQEoTQAEBANhBgEDAykDTiIhAAAoJiEsIiwAIAAgJioHCBgrNzU0NjY3NjY1NCYjIgYGByc2NjMyFhYVFAYGBw4CFRUHIiY1NDYzMhYVFAa2GTMmJDJGNy04HQVSD3lVNGA9JDkgHCIPKRkoJhsbJSa+JSc1LBgXOigwNiEyGhdIVCNIOStGNhUSHCAaIsokHBsmJxoaJgAAAgAy//QC2gKoAEAATgCZQBYkAQkERQEFCRYBAgU9AQcCPgEABwVMS7AhUFhAKwsIAgUDAQIHBQJpAAYGAWEAAQEoTQAJCQRhAAQEK00ABwcAYQoBAAApAE4bQCkABAAJBQQJaQsIAgUDAQIHBQJpAAYGAWEAAQEoTQAHBwBhCgEAACkATllAH0JBAQBJR0FOQk48OjIwKSciIBoYFBILCQBAAUAMCBYrBSIuAjU0PgIzMh4CFRQGBiMiJicGBiMiJiY1NDY2MzIWFxUUFjMyNjY1NC4CIyIOAhUUHgIzMjcVBgYnMjY1NSYmIyIGBhUUFgGOQn1jOjZffUg5dWM9L0clIjoKGD0fI0AoOFkyHj0cGRIfKRUqS2I5OmdPLC9QZjdIQCBEPx01ChcMGTAfKQwyW4BOR31fNilRdUtNXSkgGh0dJUk1TFglCwniFhYnPyMzW0YoLE1nO0BpTCkkRQ4O8Tc2ZwICFDk3KykAAAACACb/9ACnAfgACwAXAC1AKgQBAAABYQABAStNAAMDAmEFAQICKQJODQwBABMRDBcNFwcFAAsBCwYIFisTIiY1NDYzMhYVFAYDIiY1NDYzMhYVFAZmGiYmGhsmJhsaJiYaGyYmAXcmGxomJhobJv59JhobJiYbGiYAAAAAAgAm/3sApwH4AAsAGQAwQC0NAQMCAUwAAgUBAwIDYwQBAAABYQABASsATgwMAQAMGQwZFBIHBQALAQsGCBYrEyImNTQ2MzIWFRQGAzcmJjU0NjMyFhUUBwdmGiYmGhsmJlQvFx8mGhsmBT4BdyYbGiYmGhsm/gR6BCQYGiYmGgwNoQAAAQBM/18BGgKcAAcAJUAiAAEBAF8AAAAiTQACAgNfBAEDAycDTgAAAAcABxEREQUIGSsXETMVIxEzFUzOfX2hAz1K/VdKAAAAAQAPAAABagKcAAMAGUAWAAAAIk0CAQEBIwFOAAAAAwADEQMIFyshATMBARP+/FcBBAKc/WQAAAABACH/XwDvApwABwAlQCIAAQECXwACAiJNAAAAA18EAQMDJwNOAAAABwAHERERBQgZKxc1MxEjNTMRIX19zqFKAqlK/MMAAAABADUBNwHzApwABgAnsQZkREAcBQEBAAFMAAABAIUDAgIBAXYAAAAGAAYREQQIGCuxBgBEExMzEyMDAzW5TLlZhoYBNwFl/psBAv7+AAAAAAEACv+xAYIAAAADACaxBmREQBsAAAEBAFcAAAABXwIBAQABTwAAAAMAAxEDCBcrsQYARBc1IRUKAXhPT08AAAABADUCOwDXAsMADQAfsQZkREAUAAABAIUCAQEBdgAAAA0ADRgDCBcrsQYARBMmJicmJjU0NjMyFhcXkRMqDgoHFhAIEAddAjsQIw4LDwcQFgYJeQACAEz/9ADNApwABQARACxAKQQBAQEAXwAAACJNAAMDAmEFAQICKQJOBwYAAA0LBhEHEQAFAAUSBggXKzcDNTMVAwciJjU0NjMyFhUUBnISWRIbGiYmGhsmJsMBLays/tPPJhobJiYbGiYAAAACACgBvwEFApwAAwAHACRAIQUDBAMBAQBfAgEAACIBTgQEAAAEBwQHBgUAAwADEQYIFysTJzMHIyczB8MOUA7BDlAOAb/d3d3dAAAAAgAmAAACaQKcABsAHwBJQEYOCQIBDAoCAAsBAGcGAQQEIk0PCAICAgNfBwUCAwMlTRANAgsLIwtOAAAfHh0cABsAGxoZGBcWFRQTEREREREREREREQgfKzM3IzczNyM3MzczBzM3MwczByMHMwcjByM3Iwc3MzcjiRl8C3wXfAt8GFIYexhSGHsLfBZ7C3wYUhh7GCR7FnusUaJRrKysrFGiUaysrP2iAAAAAAMAKP+pAioC5gAoADEAOABCQD84KikdHBkYFRIIBQQMAwAHAQEDAkwBAQEBSwAAAwCFBAECAQKGAAMDAWEAAQEpAU4AADMyACgAKCcmFBMFCBYrBTUmJic3Fhc1Jy4CNTQ+Ajc1MxUWFhcHJiYnFRceAxUUBgYHFQM1DgIVFBYXEzY2NTQmJwELVnQZVyJqJC5UNidBTScyQ28cVhNCIwwmT0MpQmw/Mho6KD8uQUNJTj5XTAhSQxpZDu8HCStLOCxCLBgDPz8FPDsZICEE1QMKGipCMz5YLwNLAeXKAhUoIiwxCf6zBD4uNDMOAAAAAAUAJv/0A3kCqAAPABMAHwAvADsAmUuwFVBYQCwMAQQKAQAJBABpAAcACQgHCWoABQUBYQIBAQEoTQ4BCAgDYQ0GCwMDAyMDThtANAwBBAoBAAkEAGkABwAJCAcJagACAiJNAAUFAWEAAQEoTQsBAwMjTQ4BCAgGYQ0BBgYpBk5ZQCsxMCEgFRQQEAEANzUwOzE7KScgLyEvGxkUHxUfEBMQExIRCQcADwEPDwgWKxMiJiY1NDY2MzIWFhUUBgYDATMBAzI2NTQmIyIGFRQWASImJjU0NjYzMhYWFRQGBicyNjU0JiMiBhUUFtwyUzExUzIyUjExUlQB1Fj+LDYsPz8sLT9AAhQyUzExUzIyUjExUjIsPz8sLT8/AT0xUjIzUjExUjMyUjH+wwKc/WQBhz8sLT8/LSw//m0xUzIyUzExUzIyUzFKQCwsPz8sLEAAAAMAJv/0ArcCqAAhAC4AOQB8QBAiFAcDAgQzMh8cFQUFAgJMS7AVUFhAJAAEBAFhAAEBKE0AAgIAYQMGAgAAKU0HAQUFAGEDBgIAACkAThtAIQAEBAFhAAEBKE0AAgIDXwADAyNNBwEFBQBhBgEAACkATllAFzAvAQAvOTA5KSceHRkYDgwAIQEhCAgWKwUiJiY1NDY3JiY1NDYzMhYWFRQGBxc2NjczBgYHFyMnBgYDNjY1NCYjIgYVFBYWAzI2NycGBhUUFhYBB0VlN15NIihnTylQNU4+iA0SA1cEHxuVd1IrdCMxPDUlJTkhJSA1WiK1PEcmPgw0WDdNZRomSidBTRs/Nj9UGpAfRyg2aS2dVy41AasSOigpIiAiGzUm/pgqJ78VRjgmOR4AAAEAKAG/AHgCnAADABlAFgIBAQEAXwAAACIBTgAAAAMAAxEDCBcrEyczBzYOUA4Bv93dAAABADL/XwEJApwADQAZQBYAAAAiTQIBAQEnAU4AAAANAA0WAwgXKxcmJjU0NjczBgYVFBYXvUVGNzdLMT5BTKFi43RmxlhGzHRt42cAAQAj/18A+gKcAA0AGUAWAAAAIk0CAQEBJwFOAAAADQANFgMIFysXNjY1NCYnMxYWFRQGByNMQj0ySzg1RkShZ+Rtc8xGWMZldeNiAAEARAGEAWsCnAAOABxAGQ4NDAsKCQgFBAMCAQwASQAAACIAThYBCBcrEyc3JzcXNTMVNxcHFwcnmS4+ZRJlOWUSZj8uPwGEIlYgNyFqaiE3IFYiVgAAAAABADUAAAIlAfAACwAnQCQDAQEEAQAFAQBnAAICJU0GAQUFIwVOAAAACwALEREREREHCBsrITUjNTM1MxUzFSMVAQXQ0FDQ0NBQ0NBQ0AAAAAEAJv97AKcAdQANACRAIQEBAQABTAAAAQEAWQAAAAFfAgEBAAFPAAAADQANJgMIFysXNyYmNTQ2MzIWFRQHBy0vFx8mGhsmBT6FegQkGBomJhoMDaEAAAABACYA0AFKASEAAwAeQBsAAAEBAFcAAAABXwIBAQABTwAAAAMAAxEDCBcrNzUhFSYBJNBRUQAAAAEAJv/0AKcAdQALABpAFwABAQBhAgEAACkATgEABwUACwELAwgWKxciJjU0NjMyFhUUBmYaJiYaGyYmDCYaGyYmGxomAAAAAAEADwAAAWoCnAADABlAFgAAACJNAgEBASMBTgAAAAMAAxEDCBcrMwEzAQ8BBFf+/AKc/WQAAAAAAQAm/18BHQKcACUAOkA3GwEBAgFMAAIAAQUCAWkABAQDYQADAyJNAAUFAGEGAQAAJwBOAQAkIhUTEhAKCQgHACUBJQcIFisXIiYmNTU0JiM1MjY1NTQ2NjMzFSMiBhUVFAYHFRYWFRUUFjMzFfI4OhQXLy8XFDo4KyohEiskJikSISqhGTwzlis0QzQrljQ7GUcaJpk/NQoBCjY+mScZRwAAAAABAEz/XwCdApwAAwAZQBYAAAAiTQIBAQEnAU4AAAADAAMRAwgXKxcRMxFMUaEDPfzDAAAAAQAi/18BGQKcACUANUAyCQEEAwFMAAMABAADBGkAAQECYQACAiJNAAAABWEGAQUFJwVOAAAAJQAkERYhLSEHCBsrFzUzMjY1NTQ2NzUmJjU1NCYjIzUzMhYWFRUUFjMVIgYVFRQGBiMiKiESKiUkKxIhKis4OhQYLi4YFDo4oUcZJ5k+NgoBCjU/mSYaRxk7NJYrNEM0K5YzPBkAAQAoAMMCAwFDABUAP7EGZERANBMSAgMCCAcCAAECTAADAQADWQACAAEAAgFpAAMDAGEEAQADAFEBABAODAoFAwAVARUFCBYrsQYARCUiJiYjIgYHJzY2MzIWFjMyNjcXBgYBeyRFQR4ZIgVLC0g2Kkc+GhcjBUoLSMMbGxkZFi44GxwaGRYuOAAAAAACAEz/XwDNAgcACwARAE1LsCFQWEAXBAEAAAFhAAEBK00AAgIDXwUBAwMnA04bQBUAAQQBAAIBAGkAAgIDXwUBAwMnA05ZQBMMDAEADBEMEQ8OBwUACwELBggWKxMiJjU0NjMyFhUUBgM1EzMTFYwaJiYaGyYmRxI1EgGGJhobJiYbGib92awBLP7UrAAAAAACACb/qQHTAjsAGwAiACxAKR0cGhcWExIQDwkBCwIBAUwAAAMBAgACYwABASsBTgAAABsAGxEaBAgYKxc1LgI1NDY2NzUzFRYWFwcmJxE2NjcXBgYHFScRBgYVFBbsPVkwMFk9MkFbF00gRiQ1D00ZXz0yLD8/V00IRW9FQ2xGCUZDAkEsHDkI/pAEJBkcLT0FS5oBZgxXTk9ZAAABAEb/9AIsAqgAPgBMQEkXFgIBAzQqAgcGAQEJBzUBCAkETAQBAQUBAAYBAGcABgAJCAYJaQADAwJhAAICKE0ABwcIYQAICCkITj07JSIoERYlJhEZCggfKxcnPgM1NCYnIzUzJiY1NDY2MzIWFwcmJiMiBgYVFBYXMxUjFhYVFAYHNjYzMhYWMzI2NxcGBiMiJiYjIgZlHA4rKx0LDG1WEBxCZjVUbhNTDUovHDwoHxHMtQoINykRHg0eMjYiFzUhGSU+GiU+PCUbQgxDBhoqOyYULxkzIkUnPkohS0AZNCkSLCckRCMzFigSMkoYBwUSEgsOSRAOExMRAAACADUAVAIPAi4AIgAyAEtASBIQCggEAwAZEwcCBAIDIhwaAQQBAgNMEQkCAEobAQFJAAAAAwIAA2kEAQIBAQJZBAECAgFhAAECAVEkIywqIzIkMiAeLAUIFys3JzcmNTQ2Nyc3FzY2MzIWFzcXBxYWFRQGBxcHJwYGIyImJzcyNjY1NCYmIyIGBhUUFhZZJEIvGBdCJEIeRSQkRh1CJEIYFxcYQiRCHUYkJEUehyhAJiZAKCdBJiZBVCNCPUskRh1CJEIYFxcYQiRCHUYkJEYeQiNBFxcXFx0nQScnQCcnQCcnQScAAAAAAQAKAAACSQKcABYAPkA7CwEDBAFMBgEDBwECAQMCaAgBAQkBAAoBAGcFAQQEIk0LAQoKIwpOAAAAFgAWFRQRERESEREREREMCB8rMzUjNTM1IzUzAzMTEzMDMxUjFTMVIxX7lpaWjehnubhn6I2VlZVWM1YzAYr+vQFD/nYzVjNWAAAAAgBM/18AnQKcAAMABwAsQCkEAQEBAF8AAAAiTQACAgNfBQEDAycDTgQEAAAEBwQHBgUAAwADEQYIFysTETMRAxEzEUxRUVEBZgE2/sr9+QE2/soAAgAf/1MB9AKoADUARABUQAw9Lx8eFAQDBwEDAUxLsClQWEAWAAMDAmEAAgIoTQABAQBhBAEAACcAThtAEwABBAEAAQBlAAMDAmEAAgIoA05ZQA8BACMhHBoIBgA1ATUFCBYrBSImJzcWFjMyNjU0JicnJiY1NDY3JiY1NDY2MzIWFwcmJiMiBhUUFhcXFhYVFAYHFhYVFAYGEzY2NTQmJycOAhUUFhcBBUpmElMKNjEsOEAtXjVMRzEdLjVTLUReFFEMOSQlNjcocjZLQTIdIzNWCyI7JiCAGC8gLiitRD0YJywiISY1Fi8bUTkyRRAUPS0sOR05MRggHBweHC8VOhxMNDRNFhY2JjFDIgEuDjEiHi0RRQcaJBgjKhYAAAAAAgA1Ak4BdAK5AAsAFwAzsQZkREAoAwEBAAABWQMBAQEAYQUCBAMAAQBRDQwBABMRDBcNFwcFAAsBCwYIFiuxBgBEEyImNTQ2MzIWFRQGMyImNTQ2MzIWFRQGaxYgIBYXHx+8Fh8fFhcfHwJOIBYWHx8WFiAgFhYfHxYWIAAAAAADADX/9ALpAqgAEwAnAEAAX7EGZERAVD49MjEEBwYBTAABAAMFAQNpAAUABgcFBmkABwoBBAIHBGkJAQIAAAJZCQECAgBhCAEAAgBRKSgVFAEAOzk1My8tKEApQB8dFCcVJwsJABMBEwsIFiuxBgBEBSIuAjU0PgIzMh4CFRQOAicyPgI1NC4CIyIOAhUUHgI3IiY1NDYzMhYXByYjIgYVFBYzMjY3FwYGAY9IfV82Nl99SEh9XzY2X31IO2dOLCxOZzs7Z04sLE5nPVRaX1E2SBNDGjYrNzcrGS0NQhNKDDZffUhIfV82Nl99SEh9XzY+LE5nOztnTiwsTmc7O2dOLGRnWVlkLiQZMUBDQ0IUGRgiLgACADH/UgHfAgcACwAsAJK2KikCBAMBTEuwIVBYQB8AAwAEAAMEgAUBAAABYQABAStNAAQEAmIGAQICJwJOG0uwJ1BYQB0AAwAEAAMEgAABBQEAAwEAaQAEBAJiBgECAicCThtAIgADAAQAAwSAAAEFAQADAQBpAAQCAgRZAAQEAmIGAQIEAlJZWUAVDQwBACYkGhkMLA0sBwUACwELBwgWKwEiJjU0NjMyFhUUBgMiJiY1NDY2Nz4CNTUzFRQGBgcGBhUUFjMyNjY3FwYGASUbJiYbGiYmPTRgPSQ6Hx0hD1YZMyYkMkY3LTgeBFIPeAGGJhsaJiYaGyb9zCNJOCtGNxQTGyEZIiUmNisZFjopMDYhMhoXSFQAAQBM//QCLwKoACwAcUAKJgECAwIBAQICTEuwFVBYQB8AAwACAQMCaQAEBAZhAAYGKE0AAQEAYQUHAgAAKQBOG0AjAAMAAgEDAmkABAQGYQAGBihNAAUFI00AAQEAYQcBAAApAE5ZQBUBACAeGRgVEw4MCwkFAwAsASwICBYrBSMnFjMyNjU0JiMjNTMyNjY1NCYjIgYVESMRND4CMzIWFhUUBgcWFhUUBgYBPA4XFRJEU2JQDAYpRClEOE9IVA8vX088XjYwNDtQRW4MTQNCQ0k+TBYvJCw4SFb+OwHFJE9FKydHMTJJFg9TUUxcKQAAAgAKAAADwAKcAA8AEgBCQD8SAQIBAUwAAgADCAIDZwAIAAYECAZnAAEBAF8AAAAiTQAEBAVfCQcCBQUjBU4AABEQAA8ADxEREREREREKCB0rMwEhFSEVIRUhFSEVITUhBzczEQoB5gHQ/pgBCv72AWj+Ov7laKDjApxRy1HeUZGR4gFAAAAAAAEAGf9TASgCwgAgAJlACgQBAQIDAQABAkxLsBFQWEAiAAUFBGEABAQqTQcBAgIDXwYBAwMlTQABAQBhCAEAACcAThtLsClQWEAgAAQABQMEBWkHAQICA18GAQMDJU0AAQEAYQgBAAAnAE4bQB0ABAAFAwQFaQABCAEAAQBlBwECAgNfBgEDAyUCTllZQBcBABwbGhkWFBMRDQwLCgcFACABIAkIFisXIiYnNRYzMjY1ESM1MzU0NjYzMxUjIgYVFTMVIxEUBgZQDhsODwsgGlRUFDo3NjQgE2dnIDStBARLAyYfAcVDSjM8GUcaJktD/jg5PxoAAAAAAQA1/1MBlQKpADAAMUAuJAEDAgFMAAIAAwECA2kAAQAAAVkAAQEAYQQBAAEAUQEAIB4aGAcFADABMAUGFisXIiY1NDYzMhYVFBQHMD4CNTQmNTQ+AjMyFhUUBiMiJjU0NzAOAhUUFhUUDgKKITQdFRYbAgwPDAQZKDAWITQdFRYcAwwPDAQZKC+tGyMUHh8UBAcEAhAoJnz3fEVWLhAbIxUdHxMJBwIQKSZ89nxGVi0QAAAAAgA1AGECEAGbABUAKwBKQEcMCwIBAAEBAgMiIQIFBBcBBgcETAAAAAMCAANpAAEAAgQBAmkABQcGBVkABAAHBgQHaQAFBQZhAAYFBlEiJSIlIiUiIwgGHisTJzY2MzIWFjMyNjcXBgYjIiYmIyIGByc2NjMyFhYzMjY3FwYGIyImJiMiBoBLDEg3Kkc9GhciBUoLSDUkRUEeGSIFSwtINipHPhoXIwVKC0g1JEVBHhkiAR8WLjgbHBoZFi44GxsZ0xYuOBscGhkWLjgbGxkAAAEANQAAAiUB8AATAKRLsAtQWEAqAAQDAwRwCgEJAAAJcQUBAwYBAgEDAmgHAQEAAAFXBwEBAQBfCAEAAQBPG0uwDFBYQCkABAMDBHAKAQkACYYFAQMGAQIBAwJoBwEBAAABVwcBAQEAXwgBAAEATxtAKAAEAwSFCgEJAAmGBQEDBgECAQMCaAcBAQAAAVcHAQEBAF8IAQABAE9ZWUASAAAAEwATERERERERERERCwYfKzM3IzUzNyM1ITczBzMVIwczFSEHTVVtpUrvASdNY0xlnUvo/uFVeU9rUG1tUGtPeQAAAAIANQAAAg4B+QAGAAoAKEAlBgUEAwIBAAcASgAAAQEAVwAAAAFfAgEBAAFPBwcHCgcKGAMGFyslJTUlFQ0CNSEVAg7+JwHZ/pABcP4nAdlkp0aoW3BwvlBQAAAAAgA1AAACDgH5AAYACgAoQCUGBQQDAgEABwBKAAABAQBXAAAAAV8CAQEAAU8HBwcKBwoYAwYXKzc1JSU1BRUBNSEVNQFw/pAB2f4nAdlkWnBwW6hG/vVQUAAAAAACADX/twH8Ar8AAwAHAAi1BgQCAAIyKwUDExMHNycHARnk5OPjjIyNSQGEAYT+fO/v7+8AAQA1/18CFgKcAAsAN0A0CAICAgEBTAMBAQEBAgJLAAAAAQIAAWcAAgMDAlcAAgIDXwQBAwIDTwAAAAsACxIRFAUGGSsXNRMDNSEVIRMDIRU19vYB4f6E9fUBfKFRAU4BTVFR/rP+slEAAAAAAQA1ANECJQEgAAMAHkAbAAABAQBXAAAAAV8CAQEAAU8AAAADAAMRAwYXKzc1IRU1AfDRT08AAAABAA8AAAJHAp0AAwAXQBQAAAEAhQIBAQF2AAAAAwADEQMGFyszATMBDwHUZP4sAp39YwAAAQA1AL8AtgFAAAsAH0AcAAEAAAFZAAEBAGECAQABAFEBAAcFAAsBCwMGFis3IiY1NDYzMhYVFAZ2HiMmGxomJr8oGBsmJhoaJwAAAAEANf9fAhECnQAIADBALQUBAwABTAACAQKFBAEDAAOGAAEAAAFXAAEBAF8AAAEATwAAAAgACBIREQUGGSsFAyM1MxMTMwMBF3hqomd7WJehATJQ/voCwvzCAAAAAwA1AGgC0AGWABcAIwAvAE1ASi0bFQkEBAUBTAIBAQcBBQQBBWkKBgkDBAAABFkKBgkDBAQAYQMIAgAEAFElJBkYAQArKSQvJS8fHRgjGSMTEQ0LBwUAFwEXCwYWKzciJjU0NjMyFhc2NjMyFhUUBiMiJicGBicyNjcmJiMiBhUUFiEyNjU0JiMiBgcWFtVHWVxKNlIgIFE2SlxZRzdUIiJUNCA4Ihs3JSUxLwF3JC8xJSQ3GyM2aFVDQVU2IyM2VUFDVTklJTlMIiogKigiHy0tHyIoKiAqIgAAAAEAMgAAAn0CqAApADJALygYEwMEAAQBTAAEBAFhAAEBFE0CAQAAA18GBQIDAxUDTgAAACkAKSgRGCgRBwcbKzM1MzUmJjU0PgIzMh4CFRQGBxUzFSM1PgI1NCYmIyIGBhUUFhYXFTKXQ1QtUWo9PWtQLlNEl+wvSio8ZD08ZDwqSi9RMSaHUj1rUS4uUWs9UocmMVGtDT1YMj1kPDxkPTJYPQ2tAAAAAAIANf/0AjkB+AAZACIAREBBIhwCBAUXFhADAwICTAABAAUEAQVpAAQAAgMEAmcAAwAAA1kAAwMAYQYBAAMAUQEAIB4bGhQSDw4LCQAZARkHBhYrBSIuAjU0PgIzMhYWFSEVFhYzMjY3FwYGAyE1JiYjIgYHATcuW0suJURfOkd1Rv5mHk4sM1gfISNq1gEwHk4sLE4eDCJDZUIsWEgsRXRHqhsfKiMKLTYBI4YcHx8cAAAAAAIANf/0AhICqAAfAC8AQ0BADQEFAQFMAAMAAgEDAmkAAQAFBAEFaQcBBAAABFkHAQQEAGEGAQAEAFEhIAEAKScgLyEvFBIREAsJAB8BHwgGFisFIi4CNTQ+AjMyFhcuAgc1Mh4EFRQGFQ4CJzI2NjU0JiYjIgYGFRQWFgEjK1VFKSlFVSsfTRgUUnBDHlBYU0MoAQNHajokRCwsRCQkRC0tRAweP2JDRGE/HhgeQEEVAlIEFTFYi2YHEAhecjJJJ1JAQFEnJ1FAQFInAAIANQAAAsICqAACAAUAH0AcBQECAUoAAQEAXwIBAAAVAE4AAAQDAAIAAgMHFiszAQElIQM1AUYBR/3wAZLJAqj9WE4BpAAAAAEANf9fAhQCnAAHACZAIwQDAgECAYYAAAICAFcAAAACXwACAAJPAAAABwAHERERBQYZKxcRIREjESERNQHfUv7EoQM9/MMC7P0UAAABABQAAAInAfAAFAArQCgFAgIAAAFfAAEBFk0AAwMEYQcGAgQEFQROAAAAFAAUFCEjERERCAccKzMRIzUhFSMRFBYzMxUjIiYmNREjEWhUAhNUDyQhMy8zE8YBnlJS/u0nGkoTNjMBIv5iAAACADUCPAFpAsQACgAVADGxBmREQCYRBgIBAAFMAgEAAQCFBQMEAwEBdgsLAAALFQsVDw0ACgAKIgYIFyuxBgBEEzc2MzIWFRQGBwczNzYzMhYVFAYHBzVgChIQFgQHUUxgChIPFwQHUQI8ew0WEAcOBkd7DRcPBw4GRwAAAQA1Aj8BfgKpABwAObEGZERALgAEAQAEWQUBAwABAAMBaQAEBABhAgYCAAQAUQEAFxURDw0LCQgHBQAcARwHCBYrsQYARAEiJicmJiMiByM2NjMyFhYzMjY3NjYzMhYVFAYGAR0QIBQPGw8lBUEJOSgcKCMVDxEHBhAHDhEaLAI/CwoIDik1MxUWDAsLCBMMDyIZAAEAKQDQAbcBHwADAB5AGwAAAQEAVwAAAAFfAgEBAAFPAAAAAwADEQMIFys3NSEVKQGO0E9PAAAAAQApANAC9wEfAAMAHkAbAAABAQBXAAAAAV8CAQEAAU8AAAADAAMRAwgXKzc1IRUpAs7QT08AAAACADUBJAMbApwADAAUAENAQAsIAwMCBQFMCggJBAMFAgUChgYBAgAFBQBXBgECAAAFXwcBBQAFTw0NAAANFA0UExIREA8OAAwADBIREhELBhorAREzExMzESMRAyMDESERIzUhFSMRAYlsXV1sQ2JIYv7fdgEvdgEkAXj+5AEc/ogBF/7pARf+6QE8PDz+xAACADX/9AGNAqgAHAAmADtAOB0ZEgcGBQQHAgMaAQACAkwAAQADAgEDaQACAAACWQACAgBhBAEAAgBRAQAkIhcVDAoAHAEcBQYWKwUiJjU1BzU3NTQ2MzIWFRQGBgcVFBYzMjY3FwYGAzY2NTQmIyIGFQEFTEJCQkNOP0MsVD4nHBosEyUXR2M4NB0YHRoMUFggMlkz5VJbUD47YFYuZDcjFxA6FSEBZCdhNygjJzUAAAEAFAAAAjMCnQANACxAKQoJCAcEAwIBCAEAAUwAAAAiTQABAQJgAwECAiMCTgAAAA0ADRUVBAgYKzMRBzU3ETMRNxUHFSEVblpaXrS0AWcBDjZHNQFJ/vBsR2z1UQAAAAEADwAAAN4CnAAUAC5AKw4NDAsIBwYFCAIBAUwAAQEiTQACAgBiAwEAACMATgEAExEKCQAUARQECBYrMyImJjU1BzU3ETMRNxUHFRQWMzMVujAzEzU1VEZGECQSFDUzlR9GIAFE/u4qRyq4JxpKAAADACb/9AICAfsAGwAmADEARkBDExECAgEvLh0UBgUDAgUEAwMAAwNMEgEBSgACAgFhAAEBK00FAQMDAGEEAQAAKQBOKCcBACcxKDEhHw8NABsBGwYIFisFIiYnByc3JiY1ND4CMzIWFzcXBxYWFRQOAic3JiYjIgYGFRQWFzI2NjU0JicDFhYBFChPIComLBccKUVVKyVIHykmKRshKUVVq9gTLhckRC0LiiRELA4N2xUzDBkbMSE1H1Q2Q2I/HhUXLyExH1k7Q2I/Hp78EQ8nUUAeMmgnUUAjOBb/ABUUAAMAMv/0AqUCqAAZACIALABDQEASERADAgErKhsTBgUDAgUEAwMAAwNMAAICAWEAAQEoTQUBAwMAYQQBAAApAE4kIwEAIywkLB4cDgwAGQEZBggWKwUiJicHJzcmJjU0NjYzMhYXNxcHFhYVFAYGJQEmIyIGBhUUFzI2NjU0JicBFgFrPWcnOSY8JCdNjGA8ZSc1JzgmKE2M/u4BQDpVPGM62T1jOhcU/r86DCYiQiFGLXlGZZ1ZJCI/IEMueklknFm1AXY4PXZXY6c+d1U1VSD+iDwAAgBMAAACGgKcAA4AGQAvQCwAAQAFBAEFZwAEAAIDBAJnAAAAIk0GAQMDIwNOAAAZFxEPAA4ADiYhEQcIGSszETMVMzIWFhUUBgYjIxU1MzI2NjU0JiYjI0xUf0pxQEBxSn+IKUEnJ0EpiAKcjB1PS0tOHaP0DCouLisOAAMAJv/0A1EB+AAvADgAQgCWQA4WERADAQItJyYDBgUCTEuwHVBYQCUIAQELAQUGAQVpCQECAgNhBAEDAytNDQoCBgYAYQcMAgAAKQBOG0AwCAEBCwEFBgEFaQkBAgIDYQQBAwMrTQAGBgBhBwwCAAApTQ0BCgoAYQcMAgAAKQBOWUAjOjkBAD49OUI6QjY0MTArKSQiHx4aGBUTDgwIBwAvAS8OCBYrFyImJjU0NjYzNTQmJiMiBgcnNjYzMhc2NjMyHgIHIR4CMzI2NxcGBiMiJicGBhMhLgIjIgYGAzI2NTUiBhUUFtEvTi5ZmF4PLzItOQhRFWw9gishXTc8WTsbBP6CAzJGHyk5ElEcZEVFZR4ZaLEBJAEjPywlQiryUElyhzMMIkAtPEYfGxc2KCkkGDs+UCYqL09kNT5IHRsWGCs4Ni4rOQEwI0ApHD7+4FJJECkzIywAAgAm//QCBQKoACMALwBQQE0bGhgDAgMREA8OBAECCwEEBQNMGQEDSgABAAUEAQVpAAICA2EAAwMoTQcBBAQAYQYBAAApAE4lJAEAKykkLyUvFhUUEwkHACMBIwgIFisFIiYmNTQ2NjMyFhcmJicHJzcmJiM1MhYXNxcHHgIVFA4CJzI2NTQmIyIGFRQWARFHajo4Yj5CVxcEJiBJJEIbRSo4YykuJCgkLhYXN19HQ09PQ0JPTww/aT5DZjo1KEVfH0kkQg4MTRQZLiQoIGByOzxxWjRHV0VFV1dFRVcAAAACAEb/XwIQAp0AEgAeAD9APBEDAgQFAUwAAAAiTQAFBQFhAAEBK00HAQQEAmEAAgIpTQYBAwMnA04UEwAAGhgTHhQeABIAEiYjEQgIGSsXETMVNjYzMhYWFRQGBiMiJicVNzI2NTQmIyIGFRQWRlQXUDo5YTs7YTk6UBeLQE1NQEBNTaEDPvsnMD1zU1F0PTAn7N1iWFliYllYYgABADUAJwHbAc4ACwAGswQAATIrNyc3JzcXNxcHFwcnbjmamjmamjmZmTmaJzqZmjqamjqamTqaAAMANQAOAiUB4wALAA8AGwCSS7AjUFhAIAACBwEDBQIDZwYBAAABYQABASVNAAUFBGEIAQQEIwROG0uwJ1BYQB0AAgcBAwUCA2cABQgBBAUEZQYBAAABYQABASUAThtAIwABBgEAAgEAaQACBwEDBQIDZwAFBAQFWQAFBQRhCAEEBQRRWVlAGxEQDAwBABcVEBsRGwwPDA8ODQcFAAsBCwkIFisBIiY1NDYzMhYVFAYFNSEVByImNTQ2MzIWFRQGAS0bJiYbGyUl/u0B8PgbJiYbGyUlAWIlGxsmJhsbJZJRUcImGxomJhobJgAAAgAy//QD9gKoABoAKgCsS7AVUFhACgsBAwkYAQAGAkwbQAoLAQMJGAEIBgJMWUuwFVBYQC0ABAAFBgQFZwAJCQFhAgEBAShNAAMDAWECAQEBKE0LCAIGBgBhBwoCAAApAE4bQDMABAAFBgQFZwAJCQFhAAEBKE0AAwMCXwACAiJNAAYGB18ABwcjTQsBCAgAYQoBAAApAE5ZQB8cGwEAJCIbKhwqFxYVFBMSERAPDg0MCQcAGgEaDAgWKwUiJiY1NDY2MzIWFzUhFSEVIRUhFSEVITUGBicyNjY1NCYmIyIGBhUUFhYBa2CMTU2MYERuKAGx/pkBCf73AWf+TyhuRDxjOz9kNzxjOjpjDFmdZWabWCwnSFHLUd9RSykuUTx2V152OD13V1Z3PQAAAwAm//QDhgH5ACYALwA/AFFATg0BBgckHh0DBAMCTAAGAAMEBgNnCQEHBwFhAgEBAStNCwgCBAQAYQUKAgAAKQBOMTABADk3MD8xPy0rKCciIBsZFhURDwsJACYBJgwIFisFIi4CNTQ+AjMyFhc2NjMyHgIHIR4CMzI2NxcGBiMiJicGBhMhLgIjIgYGAzI2NjU0JiYjIgYGFRQWFgEUK1VFKSlFVSs3aiIgZj08WjsbBP6CAjNGHio4ElEcY0ZEZR4iarsBJAEiPy0lQSv1JEQsLEQkJEQtLUQMHj9iQ0RhQB4xNDA1L1BkNT5IHRsWGCs4Ni4zMQEwJEApHT7+6CdRQEFRJydRQUBRJwAAAP//AAoAAAJoA2MCJgAPAAAABwFWAJcAAP//AAoAAAJoA1UCJgAPAAABBwCrAF8ArAAIsQIBsKywNSsAAP//AAoAAAJoA08CJgAPAAABBwCSAGQAlgAIsQICsJawNSsAAP//AAoAAAJoA0YCJgAPAAABBwBHAL0APQAIsQICsD2wNSsAAP//AAoAAAJoA2ACJgAPAAAABwFfAL8AAP//AAoAAAJoA2ACJgAPAAAABwFNAP8AAP//AAoAAAJoAz0CJgAPAAABBwBbAHoAoQAIsQIBsKGwNSsAAP//ACb/9AHbApwCJgApAAAABgFjfQAAAP//ACb/9AHbAsMCJgApAAAABwFeAJsAAP//ACb/9AHbArcCJgApAAAABgFVZQAAAP//ACb/9AHbAqkCJgApAAAABgFvYgAAAP//ACb/9AHbArkCJgApAAAABgFYZwAAAP//ACb/9AHbAwkCJgApAAAABwFoAJoAAP//ACb/9AHbAsMCJgApAAAABwFMANgAAP//ADL/SwJqAqgCJgARAAAABwFUAQMAAP//ACb/SwHTAfgCJgArAAAABwFUALUAAP//AEwAAAIRA2ACJgATAAAABwFfALYAAP//AEwAAAIRA2ACJgATAAAABwFNAPYAAP//AEwAAAIRA2MCJgATAAAABwFWAI4AAP//AEwAAAIRA08CJgATAAABBwCSAFsAlgAIsQECsJawNSsAAP//ACb/9AICAsMCJgAtAAAABwFeAK0AAP//ACb/9AICAsMCJgAtAAAABwFMAOoAAP//ACb/9AICArcCJgAtAAAABgFVdwAAAP//ACb/9AICArkCJgAtAAAABgFYeQAAAP//AEIAAAFcA2ACJgAXAAAABgFfVQAAAP//AEIAAAFcA2ACJgAXAAAABwFNAJUAAP//AC0AAAFwA2MCJgAXAAAABgFWLQAAAP//AC8AAAFuA08CJgAXAAABBwCS//oAlgAIsQECsJawNSsAAP//ABoAAADGAsMCJgFiAAAABgFeGgAAAP//AC0AAAD5AsMCJgFiAAAABgFMVwAAAP///+QAAAEnArcCJgFiAAAABgFV5AAAAP///+YAAAElArkCJgFiAAAABgFY5gAAAP//AEwAAAJlA1UCJgAcAAABBwCrAJAArAAIsQEBsKywNSsAAP//ADL/9AKlA2ACJgAdAAAABwFfAPIAAP//ADL/9AKlA2ACJgAdAAAABwFNATIAAP//ADL/9AKlA2MCJgAdAAAABwFW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AAEECQAAAGIAAAADAAEECQABACoAYgADAAEECQACAA4AjAADAAEECQADAE4AmgADAAEECQAEADoA6AADAAEECQAFAEYBIgADAAEECQAGADgBaAADAAEECQAIACIBoAADAAEECQAJAHoBwgADAAEECQALAEICPAADAAEECQAMAC4CfgADAAEECQANASICrAADAAEECQAOADYDzgBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAyADAAIABCAHIAYQBpAGwAbABlACAASQBuAHMAdABpAHQAdQB0AGUAIABvAGYAIABBAG0AZQByAGkAYwBhACwAIABJAG4AYwAuAEEAdABrAGkAbgBzAG8AbgAgAEgAeQBwAGUAcgBsAGUAZwBpAGIAbABlAFIAZQBnAHUAbABhAHIAMQAuADAAMAA2ADsATgBPAE4ARQA7AEEAdABrAGkAbgBzAG8AbgBIAHkAcABlAHIAbABlAGcAaQBiAGwAZQAtAFIAZQBnAHUAbABhAHIAQQB0AGsAaQBuAHMAbwBuACAASAB5AHAAZQByAGwAZQBnAGkAYgBsAGUAIABSAGUAZwB1AGwAYQByAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAwADYAOwAgAHQAdABmAGEAdQB0AG8AaABpAG4AdAAgACgAdgAxAC4AOAAuADMAKQBBAHQAawBpAG4AcwBvAG4ASAB5AHAAZQByAGwAZQBnAGkAYgBsAGUALQBSAGUAZwB1AGwAYQByAEIAcgBhAGkAbABsAGUAIABJAG4AcwB0AGkAdAB1AHQAZQBFAGwAbABpAG8AdAB0ACAAUwBjAG8AdAB0ACwAIABNAGUAZwBhAG4AIABFAGkAcwB3AGUAcgB0AGgALAAgAEwAaQBuAHUAcwAgAEIAbwBtAGEAbgAsACAAVABoAGUAbwBkAG8AcgBlACAAUABlAHQAcgBvAHMAawB5AGgAdAB0AHAAcwA6AC8ALwB3AHcAdwAuAEIAcgBhAGkAbABsAGUASQBuAHMAdABpAHQAdQB0AGUALgBvAHIAZwAvAGgAdAB0AHAAOgAvAC8AaABlAGwAbABvAGEAcABwAGwAaQBlAGQALgBjAG8AbQBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuACAAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABhAHYAYQBpAGwAYQBiAGwAZQAgAHcAaQB0AGgAIABhACAARgBBAFEAIABhAHQAOgAgAGgAdAB0AHAAcwA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAGgAdAB0AHAAcwA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAAAAAgAAAAAAAP+yADkAAAAAAAAAAAAAAAAAAAAAAAAAAAFxAAABAgEDAAMBBAATABQAFQAWABcAGAAZABoAGwAcACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0A2ADhANsA3ADdAOAAtgC3AMQAtAC1AMUAggDCAIcAqwDGAL4AvwC8AJ0AqQCkAIoA2gCDAJMBBQEGAI0BBwCIAMMA3gEIAJ4AqgD1APQA9gAfACAAIQAiACMAHQAeAD4APwBAAEEAQgBDAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASAF4AXwBgAGEAowCEAIUAvQCWAOgAhgCOAIsAogCJAJAApgCcAKcAjwCUAJUAuQCZAO8BCQEKAKUAkgELAQwAmAENAJoAmwDfANkAsgCzAIwBDgDiAOMAoQCRAO0AoADqAO4A8AC4ALAAsQDHAK4AYgBjAK0AyQEPARAAagBrAG0AbABuAGkAZABvAMsAZQDIAMoAcQBwAHIAcwDPAMwAzQDOAHUAdAB2AHcAZgDTANAA0QCvAGcA1gDUANUAaADrAHgAegB5AHsAfQB8AH8AfgCAAIEA7AC6AOQA5QC7AOYA5wDpAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwA/QD+AS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIA+AD5AUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBAQFTAVQBVQFWAVcA/wEAAPsA/AFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwANcBcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+BE5VTEwCQ1IHdW5pMDBBMAd1bmkwMEIyB3VuaTAwQjMHdW5pMDNCQwd1bmkwMEI5B3VuaTIyMTUHdW5pMjIxOQd1bmkwM0E5CWVzdGltYXRlZAd1bmkwMzk0B3VuaTIxMTMHQW1hY3JvbgdhbWFjcm9uB3plcm8udGYGb25lLnRmBnR3by50Zgh0aHJlZS50Zgdmb3VyLnRmB2ZpdmUudGYGc2l4LnRmCHNldmVuLnRmCGVpZ2h0LnRmB25pbmUudGYGQWJyZXZlBmFicmV2ZQdBb2dvbmVrB2FvZ29uZWsHRW1hY3JvbgdlbWFjcm9uCkVkb3RhY2NlbnQKZWRvdGFjY2VudAdFb2dvbmVrB2VvZ29uZWsGRWNhcm9uBmVjYXJvbg1PaHVuZ2FydW1sYXV0DW9odW5nYXJ1bWxhdXQHSW1hY3JvbgdpbWFjcm9uB0lvZ29uZWsHaW9nb25lawpDZG90YWNjZW50CmNkb3RhY2NlbnQGU2FjdXRlBnNhY3V0ZQdVbWFjcm9uB3VtYWNyb24FVXJpbmcFdXJpbmcNVWh1bmdhcnVtbGF1dA11aHVuZ2FydW1sYXV0B1VvZ29uZWsHdW9nb25lawZOYWN1dGUGbmFjdXRlBk5jYXJvbgZuY2Fyb24GWmFjdXRlBnphY3V0ZQpaZG90YWNjZW50Cnpkb3RhY2NlbnQESGJhcgRoYmFyCkdkb3RhY2NlbnQKZ2RvdGFjY2VudAd1bmkwMTIzB3VuaTAxM0IHdW5pMDEzQwZUY2Fyb24GbGNhcm9uBkxjYXJvbgZ0Y2Fyb24HdW5pMDE0NQd1bmkwMTQ2BlJhY3V0ZQZyYWN1dGUGUmNhcm9uBnJjYXJvbgZEY3JvYXQGRGNhcm9uBmRjYXJvbgd1bmkwMTM2B3VuaTAxMzcHdW5pMDEyMgd1bmkwMjE4B3VuaTAxNjIHdW5pMDIxQQlhY3V0ZWNvbWIOYWN1dGVjb21iLmNh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/64Aw//kAMT/5ADF/+QAxv/kAMf/5ADI/+QAyf/kAOb/7QD0/+0A9f/tAPb/7QED/64BBP/kAQX/rgEG/+QBGv/tAUj/7QFq/+0AEgAPABwAJgATACf/2gBCABMAvAAcAL0AHAC+ABwAvwAcAMAAHADBABwAwgAcAOb/2gD1/9oA9wATAQMAHAEFABwBKAATASoAEwBbAA//vQAR/+QAFf/kABj/2gAd/+QAH//kACIAJgAkABMAJQATACcAEwAp/9oAK//RACz/0QAt/9EAL//RADX/7QA2/+0AN//RADn/0QA7/+0Alv+iALL/0QC1/9oAtv/RALr/5AC7/9EAvP+9AL3/vQC+/70Av/+9AMD/vQDB/70Awv+9AMP/2gDE/9oAxf/aAMb/2gDH/9oAyP/aAMn/2gDK/+QAy//RAND/0QDR/9EA0v/RANP/0QDd/+QA3v/kAN//5ADg/+QA4f/kAOYAEwDn/+0A6P/RAOn/0QDq/9EA6//RAOz/0QD0/+0A9QATAQP/vQEE/9oBBf+9AQb/2gEI/9EBCv/RAQz/0QEO/9EBFf/kARb/0QEX/+QBGP/RARr/7QEk/+0BJv/tAS3/5AEu/9EBL//kATD/0QEx/9EBNAAmATn/7QE//9EBQf/RAUT/5AFF/+QBRv/RAUj/7QFKACYBSwAmAWr/7QBLAA//0QAR/+0AFf/tABj/5AAd/+0AH//tACIAHAAkABMAKf/kACv/6QAs/+kALf/pAC//5AA3/+kAOf/pALL/6QC1/+QAtv/pALr/7QC7/+kAvP/RAL3/0QC+/9EAv//RAMD/0QDB/9EAwv/RAMP/5ADE/+QAxf/kAMb/5ADH/+QAyP/kAMn/5ADK/+0Ay//pAND/6QDR/+kA0v/pANP/6QDd/+0A3v/tAN//7QDg/+0A4f/tAOj/6QDp/+kA6v/pAOv/6QDs/+kBA//RAQT/5AEF/9EBBv/kAQj/6QEK/+kBDP/pAQ7/6QEV/+0BFv/pARf/7QEY/+kBLf/tAS7/5AEv/+0BMP/kATH/5AE0ABwBP//pAUH/6QFE/+0BRf/tAUb/6QFKABwBSwAcAC0AEf/kABX/5AAd/+QAH//kACn/7QAv/+0APf/kAD7/7QBB/+0Atf/tALr/5ADD/+0AxP/tAMX/7QDG/+0Ax//tAMj/7QDJ/+0Ayv/kAN3/5ADe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AQYBBwEIAQkBCgELAQwBDQEOAREBEwEVARYBFwEYARoBHgEgASIBJAEmAScBKAEpASoBNAE1ATcBOQE6ATwBPgE/AUABQQFFAUYBSAFKAUsBagFsAW4AAgBbAA8ADwAEABEAEQALABIAEgADABMAEwACABcAFwAGABoAGgAWAB0AHQADACAAIAASACIAIgAQACMAIwAKACcAJwARACgAKAAPACsAKwAJAC0ALQABAC4ALgAVADkAOQAXADsAOwAHADwAPAAOAD0APQAFAD4APgANAEEAQQANAEIAQgAMAEoASgATAEsASwAIAE0ATQATAE4ATgAIAFIAUgAIAIMAgwAIAIUAhQAIAJYAlgACALAAsAAWALUAtQABALYAtgADALoAugACALsAuwABALwAwgAEAMoAygALAMsAywAJAMwAzwACANAA0wABANQA1wAGAN0A4QADAOIA5QAKAOYA5gARAO0A8AAFAPEA8gANAPQA9AAHAPUA9QARAPYA9gAPAPcA9wAMAPgA+AADAQMBAwAEAQUBBQAEAQcBBwACAQgBCAABAQkBCQACAQoBCgABAQsBCwACAQwBDAABAQ0BDQACAQ4BDgABAREBEQAGARMBEwAGARUBFQALARYBFgAJARcBFwALARgBGAAJARoBGgAHAR4BHgAFASABIAAFASIBIgAFAScBJwAPASgBKAAMASkBKQAPASoBKgAMATQBNAAQATUBNQAUATcBNwAOAToBOgASATwBPAASAT4BPgADAT8BPwAVAUABQAADAUEBQQAUAUUBRQALAUYBRgAJAUgBSAAHAUoBSwAQAWoBagAHAWwBbAAOAW4BbgAOAAIAUgAPAA8ABAARABEAAgAVABUAAgAdAB0AAgAfAB8AAgAiACIADQAnACcADgAoACgADwApACkAAwArAC0AAQAvAC8ADAAxADEABgA2ADYACAA3ADcAAQA5ADkAAQA7ADsABwA8ADwACwA9AD0ABQA+AD4ACgBBAEEACgBCAEIACQCyALIAAQC1ALUAAwC2ALYAAQC6ALoAAgC7ALsAAQC8AMIABADDAMkAAwDKAMoAAgDLAMsAAQDQANMAAQDYANsABgDdAOEAAgDmAOYADgDnAOcACADoAOwAAQDtAPAABQDxAPIACgD0APQABwD1APUADgD2APYADwD3APcACQEDAQMABAEEAQQAAwEFAQUABAEGAQYAAwEIAQgAAQEKAQoAAQEMAQwAAQEOAQ4AAQESARIABgEUARQABgEVARUAAgEWARYAAQEXARcAAgEYARgAAQEaARoABwEcARwABQEeAR4ABQEgASAABQEiASIABQEkASQACAEmASYACAEoASgACQEqASoACQEtAS0AAgEuAS4ADAEvAS8AAgEwATEADAE0ATQADQE3ATcACwE5ATkACAE/AT8AAQFBAUEAAQFEAUUAAgFGAUYAAQFIAUgABwFKAUsADQFiAWIABgFqAWoABwFsAWwACwFuAW4ACwAEAAAAAQAIAAEADAA0AAQAtgEwAAIABgFMAU8AAAFRAVsABAFeAWEADwFjAWQAEwFmAWkAFQFvAXAAGQACABUADwAPAAAAEQATAAEAFQAXAAQAGQAaAAcAHAAdAAkAIAAjAAsAJwApAA8AKwAtABIALwAwABUAMwA3ABcAOgA9ABwAQQBCACAAvAD4ACIBAwETAF8BFQEhAHABIwErAH0BLQE+AIYBQAFLAJgBYgFiAKQBagFqAKUBbAFuAKYAGwAAC0IAAAtIAAALTgAAC1QAAAtaAAEAbgAAC2AAAgqEAAALWgAAC2AAAgqKAAALZgAAC2wAAAtyAAALeAAAC34AAAuEAAALigAAC5AAAAuWAAAMPAADAHQAAwB0AAALnAAAC6IAAAuoAAALrgABAAACmwABAJ0AAACpBwYAAAcMBxIF7AAACXwAAAVKAAAJOgAABzwAAAdOB1QJagAACIwAAAgUAAAIIAAAB6IAAAeoB64JUgAABVAAAAjUCNoI4AAACOwAAAg+AAAFVgdsB3IHeAVcAAAJFgAACZoAAAfSAAAJpgAACLwAAAgUCBoIIAgmCZoAAAfSAAAHPAAACGIAAAcYAAAHHgckBfgAAAmIAAAJQAlGCUwAAAdCAAAJiAdgCJ4AAAiYAAAFYgAAB64AAAleAAAFaAAACMIIyAjOAAAFbgAABXQAAAj4AAAISgAABXoHhAeKB5AFgAAACSIAAAnEAAAIbgAACuAJ1gjmAAAFhggCCAgIDgWMAAAG3AAABZIAAAhuAAAFmAAABwwHEgWeAAAHDAcSBaQAAAcMBxIFqgAABwwHEgWwAAAHDAcSBbYAAAcMBxIFvAAABwwHEgXCAAAHHgckBcgAAAceByQFzgAABx4HJAXUAAAHHgckBdoAAAceByQF4AAABx4HJAXmAAAHHgckBewAAAXyAAAF+AAABf4AAAYEAAAHTgdUCFAAAAdOB1QGCgAAB04HVAYQAAAHTgdUBtAAAAmIB2AGFgAACYgHYAYcAAAJiAdgBiIAAAmIB2AGKAAAB6gHrgYuAAAHqAeuBjQAAAeoB64GOgAAB6gHrgZAAAAJuAm+BkYAAAm4Cb4GTAAACbgJvgZSAAAJuAm+BlgAAAg+AAAGXgdsB3IHeAZkB2wHcgd4BmoHbAdyB3gGcAdsB3IHeAZ2B2wHcgd4BnwIGgggCCYGgggaCCAIJgaICBoIIAgmBo4IGgggCCYHzAAAB9IAAAaUAAAISgAABpoHhAeKB5AGoAeEB4oHkAamB4QHigeQBqwHhAeKB5AGsgeEB4oHkAa4CAIICAgOBr4IAggICA4GxAgCCAgIDgbKCAIICAgOBtAAAAbcAAAG1gAABtwAAAbiAAAH0gAABugAAAhuAAAG7gAAB9IAAAdIAAAIYgAABvQAAAhuAAAJKAAACS4AAAb6AAAHDAcSBwAAAAceByQHBgAABwwHEgcYAAAHHgckByoAAAdOB1QHMAAACYgHYAhcAAAHTgdUBzYAAAmIB2AHPAAAB04HVAdCAAAJiAdgB0gAAAdOB1QHWgAACYgHYAdmB2wHcgd4B34HhAeKB5AHlgAAB6gHrgecAAAJuAm+B6IAAAeoB64HtAAACXwAAAe6AAAJiAAAB8AAAAl8AAAHxgAACYgAAAfMAAAH0gAAB9gAAAhuAAAH3ggaCCAIJgfkCAIICAgOB+oIGgggCCYH8AgCCAgIDgf2CBoIIAgmB/wIAggICA4IFAgaCCAIJggsAAAIPgAACDIAAAhKAAAIOAAACD4AAAhEAAAISgAACFAAAAhiAAAIVgAACG4AAAhcAAAIYgAACGgAAAhuAAAIdAAACIwAAAh6AAAIjAAACIAAAAiYAAAIhgAACIwAAAiSAAAImAAACJ4AAAikAAAI1AjaCKoAAAjCCMgIsAAACLYAAAi8AAAIwgjICM4AAAjUCNoI4AAACuAJ1gjmAAAI7AAACPIAAAj4AAAI/gAACQQAAAkWAAAJCgAACSIAAAkQAAAJFgAACRwAAAkiAAAJKAAACS4AAAk0AAAJOgAACUAJRglMAAAJUgAACVgAAAleAAAJZAAACWoAAAlw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");
|
|
19511
|
+
|
|
19512
|
+
// src/font.ts
|
|
19513
|
+
var BUILTIN_FONT = "Atkinson";
|
|
19514
|
+
function withBuiltinFont(fonts) {
|
|
19515
|
+
return BUILTIN_FONT in fonts ? fonts : { ...fonts, [BUILTIN_FONT]: AtkinsonHyperlegible_Regular_default };
|
|
19516
|
+
}
|
|
19517
|
+
|
|
19233
19518
|
// src/cli.ts
|
|
19234
19519
|
var HELP = `kerf ${VERSION}: the KerfScript laser cutting language
|
|
19235
19520
|
|
|
@@ -19242,7 +19527,8 @@ Options:
|
|
|
19242
19527
|
-o, --out <file> output file (.svg, .dxf or .json); default <file>.svg
|
|
19243
19528
|
-D name=value set a parameter (value is KerfScript: 40, "Oak", true, [1,2])
|
|
19244
19529
|
-p, --params <file> JSON file of parameter values
|
|
19245
|
-
--font <file.ttf> font for text(); repeat for more fonts (name = file name)
|
|
19530
|
+
--font <file.ttf> font for text(); repeat for more fonts (name = file name).
|
|
19531
|
+
Built in: ${BUILTIN_FONT}
|
|
19246
19532
|
--kerf <mm> override kerf compensation for all parts
|
|
19247
19533
|
--sheet <W>x<H> sheet size for packing, in mm
|
|
19248
19534
|
--gap <mm> space between packed parts
|
|
@@ -19257,8 +19543,8 @@ function fail(msg) {
|
|
|
19257
19543
|
process.stderr.write(msg + "\n");
|
|
19258
19544
|
process.exit(1);
|
|
19259
19545
|
}
|
|
19260
|
-
function parseValue(
|
|
19261
|
-
const { program } = parse(`__v = ${
|
|
19546
|
+
function parseValue(text2) {
|
|
19547
|
+
const { program } = parse(`__v = ${text2};`);
|
|
19262
19548
|
const ev = new Evaluator();
|
|
19263
19549
|
const res = ev.run(program);
|
|
19264
19550
|
return res.globals.get("__v").value;
|
|
@@ -19332,7 +19618,7 @@ function main(argv) {
|
|
|
19332
19618
|
const result = render(source, {
|
|
19333
19619
|
...opts,
|
|
19334
19620
|
params,
|
|
19335
|
-
fonts:
|
|
19621
|
+
fonts: withBuiltinFont(fonts),
|
|
19336
19622
|
resolve: resolveLib
|
|
19337
19623
|
});
|
|
19338
19624
|
for (const e of result.echoes) process.stderr.write(`ECHO: ${e}
|