textmode.js 0.1.6-beta.3 → 0.1.6-beta.4
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/dist/textmode.esm.js +566 -649
- package/dist/textmode.esm.min.js +340 -423
- package/dist/textmode.umd.js +13 -13
- package/dist/textmode.umd.min.js +13 -13
- package/dist/types/rendering/webgl/Framebuffer.d.ts +11 -0
- package/dist/types/rendering/webgl/Renderer.d.ts +12 -0
- package/dist/types/rendering/webgl/StateCache.d.ts +6 -0
- package/package.json +1 -1
package/dist/textmode.esm.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
class
|
|
1
|
+
var AA = Object.defineProperty;
|
|
2
|
+
var eA = (n, A, e) => A in n ? AA(n, A, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[A] = e;
|
|
3
|
+
var o = (n, A, e) => eA(n, typeof A != "symbol" ? A + "" : A, e);
|
|
4
|
+
class m extends Error {
|
|
5
5
|
constructor(e, t, r = {}) {
|
|
6
|
-
const i =
|
|
6
|
+
const i = m.createFormattedMessage(e, r);
|
|
7
7
|
super(i);
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
o(this, "originalError");
|
|
9
|
+
o(this, "context");
|
|
10
10
|
this.name = "TextmodeError", this.originalError = t, this.context = r;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
@@ -19,9 +19,9 @@ class p extends Error {
|
|
|
19
19
|
|
|
20
20
|
📋 Context:`;
|
|
21
21
|
for (const [i, s] of Object.entries(t)) {
|
|
22
|
-
const
|
|
22
|
+
const a = m.formatValue(s);
|
|
23
23
|
r += `
|
|
24
|
-
- ${i}: ${
|
|
24
|
+
- ${i}: ${a}`;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
return r += `
|
|
@@ -38,24 +38,24 @@ class p extends Error {
|
|
|
38
38
|
if (typeof e == "string") return `"${e}"`;
|
|
39
39
|
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
40
40
|
if (Array.isArray(e))
|
|
41
|
-
return e.length === 0 ? "[]" : e.length <= 5 ? `[${e.map((t) =>
|
|
41
|
+
return e.length === 0 ? "[]" : e.length <= 5 ? `[${e.map((t) => m.formatValue(t)).join(", ")}]` : `[${e.slice(0, 3).map((t) => m.formatValue(t)).join(", ")}, ... +${e.length - 3} more]`;
|
|
42
42
|
if (typeof e == "object") {
|
|
43
43
|
const t = Object.keys(e);
|
|
44
|
-
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((s) => `${s}: ${
|
|
44
|
+
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((s) => `${s}: ${m.formatValue(e[s])}`).join(", ")} }` : `{ ${t.slice(0, 2).map((i) => `${i}: ${m.formatValue(e[i])}`).join(", ")}, ... +${t.length - 2} more }`;
|
|
45
45
|
}
|
|
46
46
|
return String(e);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
var
|
|
50
|
-
const
|
|
49
|
+
var tA = /* @__PURE__ */ ((n) => (n[n.SILENT = 0] = "SILENT", n[n.WARNING = 1] = "WARNING", n[n.ERROR = 2] = "ERROR", n[n.THROW = 3] = "THROW", n))(tA || {});
|
|
50
|
+
const y = class y {
|
|
51
51
|
constructor() {
|
|
52
|
-
|
|
52
|
+
o(this, "_options", {
|
|
53
53
|
globalLevel: 3
|
|
54
54
|
/* THROW */
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
static getInstance() {
|
|
58
|
-
return
|
|
58
|
+
return y._instance || (y._instance = new y()), y._instance;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Handle an error based on the configured settings
|
|
@@ -71,15 +71,15 @@ const b = class b {
|
|
|
71
71
|
return console.group(
|
|
72
72
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
73
73
|
"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"
|
|
74
|
-
), console.warn(
|
|
74
|
+
), console.warn(m.createFormattedMessage(A, e)), console.groupEnd(), !1;
|
|
75
75
|
case 2:
|
|
76
76
|
return console.group(
|
|
77
77
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
78
78
|
"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"
|
|
79
|
-
), console.error(
|
|
79
|
+
), console.error(m.createFormattedMessage(A, e)), console.groupEnd(), !1;
|
|
80
80
|
case 3:
|
|
81
81
|
default:
|
|
82
|
-
const i = new
|
|
82
|
+
const i = new m(A, t, e);
|
|
83
83
|
throw console.group(
|
|
84
84
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
85
85
|
"color: #d32f2f; font-weight: bold; background: #ffcdd2; padding: 2px 6px; border-radius: 3px;"
|
|
@@ -103,19 +103,30 @@ const b = class b {
|
|
|
103
103
|
this._options.globalLevel = A;
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
|
-
|
|
107
|
-
let k =
|
|
108
|
-
const
|
|
109
|
-
|
|
106
|
+
o(y, "_instance", null);
|
|
107
|
+
let k = y;
|
|
108
|
+
const d = k.getInstance(), Z = /* @__PURE__ */ new WeakMap(), rA = /* @__PURE__ */ new WeakMap();
|
|
109
|
+
function U(n, A) {
|
|
110
|
+
Z.set(n, A);
|
|
111
|
+
}
|
|
112
|
+
function $(n) {
|
|
113
|
+
return Z.get(n);
|
|
114
|
+
}
|
|
115
|
+
function M(n, A) {
|
|
116
|
+
rA.set(n, A);
|
|
117
|
+
}
|
|
118
|
+
const S = class S {
|
|
110
119
|
constructor(A, e, t = e, r = {}) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
120
|
+
o(this, "gl");
|
|
121
|
+
o(this, "_framebuffer");
|
|
122
|
+
o(this, "_texture");
|
|
123
|
+
o(this, "_width");
|
|
124
|
+
o(this, "_height");
|
|
125
|
+
o(this, "options");
|
|
126
|
+
o(this, "previousState", null);
|
|
127
|
+
o(this, "_pixels", null);
|
|
128
|
+
// Tracks the last upload origin; no longer required for rendering since we flip at upload time
|
|
129
|
+
o(this, "_isFromCanvasSource", !1);
|
|
119
130
|
this.gl = A, this._width = e, this._height = t, this.options = {
|
|
120
131
|
filter: "nearest",
|
|
121
132
|
wrap: "clamp",
|
|
@@ -124,6 +135,20 @@ class aA {
|
|
|
124
135
|
...r
|
|
125
136
|
}, this._texture = this.createTexture(), this._framebuffer = A.createFramebuffer(), this.attachTexture();
|
|
126
137
|
}
|
|
138
|
+
getMaxTextureUnits() {
|
|
139
|
+
let A = S.maxTextureUnitsMap.get(this.gl);
|
|
140
|
+
return A === void 0 && (A = this.gl.getParameter(this.gl.MAX_TEXTURE_IMAGE_UNITS), S.maxTextureUnitsMap.set(this.gl, A)), A;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Unbind the provided texture from any texture unit where it is currently bound.
|
|
144
|
+
* This prevents framebuffer-texture feedback loops when rendering to this framebuffer.
|
|
145
|
+
*/
|
|
146
|
+
unbindTextureAcrossUnits(A) {
|
|
147
|
+
const e = this.gl, t = e.getParameter(e.ACTIVE_TEXTURE), r = this.getMaxTextureUnits();
|
|
148
|
+
for (let i = 0; i < r; i++)
|
|
149
|
+
e.activeTexture(e.TEXTURE0 + i), e.getParameter(e.TEXTURE_BINDING_2D) === A && e.bindTexture(e.TEXTURE_2D, null);
|
|
150
|
+
e.activeTexture(t);
|
|
151
|
+
}
|
|
127
152
|
createTexture() {
|
|
128
153
|
const { gl: A } = this, e = A.createTexture();
|
|
129
154
|
A.bindTexture(A.TEXTURE_2D, e);
|
|
@@ -143,14 +168,18 @@ class aA {
|
|
|
143
168
|
*/
|
|
144
169
|
update(A) {
|
|
145
170
|
const { gl: e } = this;
|
|
146
|
-
A instanceof HTMLVideoElement && A.readyState < 2
|
|
171
|
+
if (A instanceof HTMLVideoElement && A.readyState < 2)
|
|
172
|
+
return;
|
|
173
|
+
e.bindTexture(e.TEXTURE_2D, this._texture);
|
|
174
|
+
const t = e.getParameter(e.UNPACK_FLIP_Y_WEBGL);
|
|
175
|
+
e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, 1), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, A), e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, t ? 1 : 0), e.bindTexture(e.TEXTURE_2D, null), this._isFromCanvasSource = !1;
|
|
147
176
|
}
|
|
148
177
|
/**
|
|
149
178
|
* Update the framebuffer texture with pixel data
|
|
150
179
|
*/
|
|
151
180
|
updatePixels(A, e, t) {
|
|
152
181
|
const { gl: r } = this;
|
|
153
|
-
r.bindTexture(r.TEXTURE_2D, this._texture), r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e, t, 0, r.RGBA, r.UNSIGNED_BYTE, A), r.bindTexture(r.TEXTURE_2D, null);
|
|
182
|
+
r.bindTexture(r.TEXTURE_2D, this._texture), r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e, t, 0, r.RGBA, r.UNSIGNED_BYTE, A), r.bindTexture(r.TEXTURE_2D, null), this._isFromCanvasSource = !1;
|
|
154
183
|
}
|
|
155
184
|
/**
|
|
156
185
|
* Resize the framebuffer
|
|
@@ -167,7 +196,7 @@ class aA {
|
|
|
167
196
|
this.previousState = {
|
|
168
197
|
framebuffer: A.getParameter(A.FRAMEBUFFER_BINDING),
|
|
169
198
|
viewport: A.getParameter(A.VIEWPORT)
|
|
170
|
-
}, A.bindFramebuffer(A.FRAMEBUFFER, this._framebuffer), A.viewport(0, 0, this._width, this._height);
|
|
199
|
+
}, A.bindFramebuffer(A.FRAMEBUFFER, this._framebuffer), A.viewport(0, 0, this._width, this._height), this.unbindTextureAcrossUnits(this._texture), M(A, !0), U(A, [0, 0, this._width, this._height]), this._isFromCanvasSource = !1;
|
|
171
200
|
}
|
|
172
201
|
/**
|
|
173
202
|
* End rendering to this framebuffer and restore previous state
|
|
@@ -175,7 +204,7 @@ class aA {
|
|
|
175
204
|
end() {
|
|
176
205
|
if (!this.previousState) return;
|
|
177
206
|
const { gl: A } = this;
|
|
178
|
-
A.bindFramebuffer(A.FRAMEBUFFER, this.previousState.framebuffer), A.viewport(...this.previousState.viewport), this.previousState = null;
|
|
207
|
+
A.bindFramebuffer(A.FRAMEBUFFER, this.previousState.framebuffer), A.viewport(...this.previousState.viewport), M(A, !!this.previousState.framebuffer), U(A, this.previousState.viewport), this.previousState = null;
|
|
179
208
|
}
|
|
180
209
|
/**
|
|
181
210
|
* Load pixel data from the framebuffer into the pixels array
|
|
@@ -189,16 +218,16 @@ class aA {
|
|
|
189
218
|
get(A, e, t, r) {
|
|
190
219
|
const { gl: i } = this;
|
|
191
220
|
if (A === void 0 && e === void 0) {
|
|
192
|
-
const s = new Uint8Array(this._width * this._height * 4),
|
|
193
|
-
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(0, 0, this._width, this._height, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER,
|
|
221
|
+
const s = new Uint8Array(this._width * this._height * 4), a = i.getParameter(i.FRAMEBUFFER_BINDING);
|
|
222
|
+
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(0, 0, this._width, this._height, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER, a), s;
|
|
194
223
|
} else if (t === void 0 && r === void 0) {
|
|
195
224
|
(A < 0 || e < 0 || A >= this._width || e >= this._height) && (console.warn("The x and y values passed to Framebuffer.get are outside of its range and will be clamped."), A = Math.max(0, Math.min(A, this._width - 1)), e = Math.max(0, Math.min(e, this._height - 1)));
|
|
196
|
-
const s = new Uint8Array(4),
|
|
197
|
-
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, 1, 1, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER,
|
|
225
|
+
const s = new Uint8Array(4), a = i.getParameter(i.FRAMEBUFFER_BINDING);
|
|
226
|
+
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, 1, 1, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER, a), [s[0], s[1], s[2], s[3]];
|
|
198
227
|
} else {
|
|
199
228
|
A = Math.max(0, Math.min(A, this._width - 1)), e = Math.max(0, Math.min(e, this._height - 1)), t = Math.max(1, Math.min(t, this._width - A)), r = Math.max(1, Math.min(r, this._height - e));
|
|
200
|
-
const s = new Uint8Array(t * r * 4),
|
|
201
|
-
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, t, r, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER,
|
|
229
|
+
const s = new Uint8Array(t * r * 4), a = i.getParameter(i.FRAMEBUFFER_BINDING);
|
|
230
|
+
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, t, r, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER, a), s;
|
|
202
231
|
}
|
|
203
232
|
}
|
|
204
233
|
/**
|
|
@@ -224,254 +253,21 @@ class aA {
|
|
|
224
253
|
get pixels() {
|
|
225
254
|
return this._pixels;
|
|
226
255
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
a(this, "gl");
|
|
231
|
-
a(this, "x");
|
|
232
|
-
a(this, "y");
|
|
233
|
-
this.gl = A, this.x = e, this.y = t;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
class y {
|
|
237
|
-
constructor(A, e, t, r, i) {
|
|
238
|
-
/** The WebGL rendering context */
|
|
239
|
-
a(this, "gl");
|
|
240
|
-
/** The vertex buffer containing position and texture coordinates */
|
|
241
|
-
a(this, "vertexBuffer");
|
|
242
|
-
/** The number of vertices in this geometry (always 6 for two triangles) */
|
|
243
|
-
a(this, "vertexCount", 6);
|
|
244
|
-
/** Bytes per vertex: depends on position format (vec2 vs vec3) */
|
|
245
|
-
a(this, "bytesPerVertex");
|
|
246
|
-
this.gl = A, this.bytesPerVertex = 16;
|
|
247
|
-
const s = A.getParameter(A.VIEWPORT), o = s[2], g = s[3], B = A.getParameter(A.FRAMEBUFFER_BINDING) !== null, E = e / o * 2 - 1, h = (e + r) / o * 2 - 1;
|
|
248
|
-
let l, c;
|
|
249
|
-
B ? (l = t / g * 2 - 1, c = (t + i) / g * 2 - 1) : (l = 1 - t / g * 2, c = 1 - (t + i) / g * 2);
|
|
250
|
-
let d, u, m, D;
|
|
251
|
-
d = E, m = h, u = l, D = c;
|
|
252
|
-
const C = this.generateVertices(d, u, m, D);
|
|
253
|
-
this.vertexBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.vertexBuffer), A.bufferData(A.ARRAY_BUFFER, C, A.STATIC_DRAW);
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Generate vertex data for the rectangle with texture coordinates
|
|
257
|
-
* @private
|
|
258
|
-
*/
|
|
259
|
-
generateVertices(A, e, t, r) {
|
|
260
|
-
return new Float32Array([
|
|
261
|
-
A,
|
|
262
|
-
r,
|
|
263
|
-
0,
|
|
264
|
-
1,
|
|
265
|
-
// bottom-left
|
|
266
|
-
t,
|
|
267
|
-
r,
|
|
268
|
-
1,
|
|
269
|
-
1,
|
|
270
|
-
// bottom-right
|
|
271
|
-
A,
|
|
272
|
-
e,
|
|
273
|
-
0,
|
|
274
|
-
0,
|
|
275
|
-
// top-left
|
|
276
|
-
A,
|
|
277
|
-
e,
|
|
278
|
-
0,
|
|
279
|
-
0,
|
|
280
|
-
// top-left
|
|
281
|
-
t,
|
|
282
|
-
r,
|
|
283
|
-
1,
|
|
284
|
-
1,
|
|
285
|
-
// bottom-right
|
|
286
|
-
t,
|
|
287
|
-
e,
|
|
288
|
-
1,
|
|
289
|
-
0
|
|
290
|
-
// top-right
|
|
291
|
-
]);
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Render the rectangle using position and texture coordinate attributes
|
|
295
|
-
*/
|
|
296
|
-
render() {
|
|
297
|
-
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
298
|
-
const A = this.gl.getParameter(this.gl.CURRENT_PROGRAM);
|
|
299
|
-
let e = this.gl.getAttribLocation(A, "a_position"), t = this.gl.getAttribLocation(A, "a_texCoord");
|
|
300
|
-
this.gl.enableVertexAttribArray(e), this.gl.vertexAttribPointer(e, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 0), this.gl.enableVertexAttribArray(t), this.gl.vertexAttribPointer(t, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.vertexCount), this.gl.disableVertexAttribArray(e), this.gl.disableVertexAttribArray(t);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
class nA extends K {
|
|
304
|
-
constructor(e, t, r, i, s) {
|
|
305
|
-
super(e, t, r);
|
|
306
|
-
a(this, "width");
|
|
307
|
-
a(this, "height");
|
|
308
|
-
this.width = i, this.height = s;
|
|
256
|
+
/** True if the last content update came from a canvas/video or raw pixels (top-left origin). False if rendered via FBO (bottom-left). */
|
|
257
|
+
get isFromCanvasSource() {
|
|
258
|
+
return this._isFromCanvasSource;
|
|
309
259
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Render the stroke rectangle as four separate Rectangle instances for each edge.
|
|
318
|
-
* This approach ensures clean corners with proper overlap and leverages existing geometry.
|
|
319
|
-
* @param weight The stroke thickness in pixels
|
|
320
|
-
*/
|
|
321
|
-
renderStroke(e) {
|
|
322
|
-
if (e <= 0) return;
|
|
323
|
-
const t = new y(this.gl, this.x, this.y, this.width, e), r = new y(this.gl, this.x + this.width - e, this.y, e, this.height), i = new y(this.gl, this.x, this.y + this.height - e, this.width, e), s = new y(this.gl, this.x, this.y, e, this.height);
|
|
324
|
-
t.render(), r.render(), i.render(), s.render();
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
class gA {
|
|
328
|
-
constructor(A, e, t, r, i, s) {
|
|
329
|
-
/** The WebGL rendering context */
|
|
330
|
-
a(this, "gl");
|
|
331
|
-
/** The vertex buffer containing position and texture coordinates */
|
|
332
|
-
a(this, "vertexBuffer");
|
|
333
|
-
/** The number of vertices in this geometry (always 6 for two triangles) */
|
|
334
|
-
a(this, "vertexCount", 6);
|
|
335
|
-
/** Bytes per vertex: vec2+vec2 = 16 bytes */
|
|
336
|
-
a(this, "bytesPerVertex");
|
|
337
|
-
this.gl = A, this.bytesPerVertex = 16;
|
|
338
|
-
const o = A.getParameter(A.VIEWPORT), g = o[2], B = o[3], E = A.getParameter(A.FRAMEBUFFER_BINDING) !== null, h = r - e, l = i - t, c = Math.sqrt(h * h + l * l);
|
|
339
|
-
if (c === 0) {
|
|
340
|
-
const rA = this.generateVertices(0, 0, 0, 0);
|
|
341
|
-
this.vertexBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.vertexBuffer), A.bufferData(A.ARRAY_BUFFER, rA, A.STATIC_DRAW);
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
const d = h / c, m = -(l / c), D = d, C = s / 2, P = e + m * C, F = t + D * C, v = e - m * C, _ = t - D * C, R = r + m * C, T = i + D * C, j = r - m * C, X = i - D * C, Z = P / g * 2 - 1, q = v / g * 2 - 1, AA = R / g * 2 - 1, eA = j / g * 2 - 1;
|
|
345
|
-
let G, M, U, Y;
|
|
346
|
-
E ? (G = F / B * 2 - 1, M = _ / B * 2 - 1, U = T / B * 2 - 1, Y = X / B * 2 - 1) : (G = 1 - F / B * 2, M = 1 - _ / B * 2, U = 1 - T / B * 2, Y = 1 - X / B * 2);
|
|
347
|
-
const tA = this.generateLineVertices(
|
|
348
|
-
Z,
|
|
349
|
-
G,
|
|
350
|
-
q,
|
|
351
|
-
M,
|
|
352
|
-
AA,
|
|
353
|
-
U,
|
|
354
|
-
eA,
|
|
355
|
-
Y
|
|
356
|
-
);
|
|
357
|
-
this.vertexBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.vertexBuffer), A.bufferData(A.ARRAY_BUFFER, tA, A.STATIC_DRAW);
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Generate vertex data for a rectangle representing the line with texture coordinates
|
|
361
|
-
* @private
|
|
362
|
-
*/
|
|
363
|
-
generateVertices(A, e, t, r) {
|
|
364
|
-
return new Float32Array([
|
|
365
|
-
A,
|
|
366
|
-
r,
|
|
367
|
-
0,
|
|
368
|
-
1,
|
|
369
|
-
// bottom-left
|
|
370
|
-
t,
|
|
371
|
-
r,
|
|
372
|
-
1,
|
|
373
|
-
1,
|
|
374
|
-
// bottom-right
|
|
375
|
-
A,
|
|
376
|
-
e,
|
|
377
|
-
0,
|
|
378
|
-
0,
|
|
379
|
-
// top-left
|
|
380
|
-
A,
|
|
381
|
-
e,
|
|
382
|
-
0,
|
|
383
|
-
0,
|
|
384
|
-
// top-left
|
|
385
|
-
t,
|
|
386
|
-
r,
|
|
387
|
-
1,
|
|
388
|
-
1,
|
|
389
|
-
// bottom-right
|
|
390
|
-
t,
|
|
391
|
-
e,
|
|
392
|
-
1,
|
|
393
|
-
0
|
|
394
|
-
// top-right
|
|
395
|
-
]);
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* Generate vertex data for the line rectangle with texture coordinates
|
|
399
|
-
* Uses the four corners calculated based on line direction and thickness
|
|
400
|
-
* @private
|
|
401
|
-
*/
|
|
402
|
-
generateLineVertices(A, e, t, r, i, s, o, g) {
|
|
403
|
-
return new Float32Array([
|
|
404
|
-
A,
|
|
405
|
-
e,
|
|
406
|
-
0,
|
|
407
|
-
0,
|
|
408
|
-
// corner1 (start + perpendicular)
|
|
409
|
-
t,
|
|
410
|
-
r,
|
|
411
|
-
0,
|
|
412
|
-
1,
|
|
413
|
-
// corner2 (start - perpendicular)
|
|
414
|
-
i,
|
|
415
|
-
s,
|
|
416
|
-
1,
|
|
417
|
-
0,
|
|
418
|
-
// corner3 (end + perpendicular)
|
|
419
|
-
t,
|
|
420
|
-
r,
|
|
421
|
-
0,
|
|
422
|
-
1,
|
|
423
|
-
// corner2 (start - perpendicular)
|
|
424
|
-
o,
|
|
425
|
-
g,
|
|
426
|
-
1,
|
|
427
|
-
1,
|
|
428
|
-
// corner4 (end - perpendicular)
|
|
429
|
-
i,
|
|
430
|
-
s,
|
|
431
|
-
1,
|
|
432
|
-
0
|
|
433
|
-
// corner3 (end + perpendicular)
|
|
434
|
-
]);
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* Render the line using position and texture coordinate attributes
|
|
438
|
-
*/
|
|
439
|
-
render() {
|
|
440
|
-
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
441
|
-
const A = this.gl.getParameter(this.gl.CURRENT_PROGRAM);
|
|
442
|
-
let e = this.gl.getAttribLocation(A, "a_position"), t = this.gl.getAttribLocation(A, "a_texCoord");
|
|
443
|
-
this.gl.enableVertexAttribArray(e), this.gl.vertexAttribPointer(e, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 0), this.gl.enableVertexAttribArray(t), this.gl.vertexAttribPointer(t, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.vertexCount), this.gl.disableVertexAttribArray(e), this.gl.disableVertexAttribArray(t);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
class BA extends K {
|
|
447
|
-
constructor(e, t, r, i, s) {
|
|
448
|
-
super(e, t, r);
|
|
449
|
-
a(this, "x2");
|
|
450
|
-
a(this, "y2");
|
|
451
|
-
this.x2 = i, this.y2 = s;
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Lines don't support fill rendering - this method does nothing.
|
|
455
|
-
* Lines are rendered only with stroke properties.
|
|
456
|
-
*/
|
|
457
|
-
renderFill() {
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Render the line with the specified stroke weight.
|
|
461
|
-
* @param weight The stroke thickness in pixels
|
|
462
|
-
*/
|
|
463
|
-
renderStroke(e) {
|
|
464
|
-
if (e <= 0) return;
|
|
465
|
-
new gA(this.gl, this.x, this.y, this.x2, this.y2, e).render();
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
class w {
|
|
260
|
+
};
|
|
261
|
+
/** Cache for MAX_TEXTURE_IMAGE_UNITS per-context */
|
|
262
|
+
o(S, "maxTextureUnitsMap", /* @__PURE__ */ new WeakMap());
|
|
263
|
+
let O = S;
|
|
264
|
+
class _ {
|
|
469
265
|
constructor(A, e, t) {
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
266
|
+
o(this, "gl");
|
|
267
|
+
o(this, "program");
|
|
268
|
+
o(this, "uniformLocations", /* @__PURE__ */ new Map());
|
|
269
|
+
o(this, "attributeLocations", /* @__PURE__ */ new Map());
|
|
270
|
+
o(this, "textureUnitCounter", 0);
|
|
475
271
|
this.gl = A, this.program = this.createProgram(e, t), this.cacheLocations();
|
|
476
272
|
}
|
|
477
273
|
createProgram(A, e) {
|
|
@@ -612,32 +408,39 @@ class w {
|
|
|
612
408
|
this.textureUnitCounter = 0;
|
|
613
409
|
}
|
|
614
410
|
}
|
|
615
|
-
var
|
|
616
|
-
class
|
|
411
|
+
var w = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;uniform float u_rotation;uniform vec2 u_center;uniform float u_aspectRatio;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){v_uv=a_texCoord;vec2 pos=a_position;pos-=u_center;pos.x*=u_aspectRatio;pos=rotate2D(-u_rotation)*pos;pos.x/=u_aspectRatio;pos+=u_center;gl_Position=vec4(pos,0.0,1.0);}", iA = "precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}", sA = "precision lowp float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}";
|
|
412
|
+
class aA {
|
|
617
413
|
constructor(A) {
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
414
|
+
o(this, "gl");
|
|
415
|
+
o(this, "imageShader");
|
|
416
|
+
o(this, "solidColorShader");
|
|
417
|
+
o(this, "currentShader", null);
|
|
418
|
+
// Cached attrib locations for current program
|
|
419
|
+
o(this, "attribCache");
|
|
622
420
|
// Fill state management - default: white fill enabled
|
|
623
|
-
|
|
624
|
-
|
|
421
|
+
o(this, "currentFillColor", [1, 1, 1, 1]);
|
|
422
|
+
o(this, "fillMode", !0);
|
|
625
423
|
// Stroke state management - default: black stroke enabled, weight 1
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
424
|
+
o(this, "currentStrokeColor", [0, 0, 0, 1]);
|
|
425
|
+
o(this, "currentStrokeWeight", 1);
|
|
426
|
+
o(this, "strokeMode", !0);
|
|
629
427
|
// Transformation state management
|
|
630
|
-
|
|
428
|
+
o(this, "currentRotation", 0);
|
|
631
429
|
// in degrees
|
|
632
430
|
// State stack for push/pop functionality
|
|
633
|
-
|
|
634
|
-
|
|
431
|
+
o(this, "stateStack", []);
|
|
432
|
+
// ----- Immediate-mode helpers that use a single static VBO (no per-call allocation) -----
|
|
433
|
+
o(this, "unitBuffer", null);
|
|
434
|
+
o(this, "bytesPerVertex", 16);
|
|
435
|
+
// vec2 + vec2
|
|
436
|
+
o(this, "scratchFramebuffer", null);
|
|
437
|
+
this.gl = A, this.imageShader = new _(this.gl, w, iA), this.solidColorShader = new _(this.gl, w, sA), this.attribCache = /* @__PURE__ */ new Map(), this.gl.enable(this.gl.BLEND), this.gl.blendEquation(this.gl.FUNC_ADD), this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA), U(this.gl, [0, 0, this.gl.canvas.width, this.gl.canvas.height]), M(this.gl, !1);
|
|
635
438
|
}
|
|
636
439
|
/**
|
|
637
440
|
* Set the current shader
|
|
638
441
|
*/
|
|
639
442
|
shader(A) {
|
|
640
|
-
this.currentShader = A, A.use();
|
|
443
|
+
this.currentShader !== A && (this.currentShader = A, A.use());
|
|
641
444
|
}
|
|
642
445
|
/**
|
|
643
446
|
* Sets the fill color for subsequent rendering operations
|
|
@@ -729,13 +532,13 @@ class lA {
|
|
|
729
532
|
* across frames and be managed by push/pop or explicit calls.
|
|
730
533
|
*/
|
|
731
534
|
reset() {
|
|
732
|
-
this.currentShader = null, this.stateStack = [], this.currentRotation = 0
|
|
535
|
+
this.currentShader = null, this.stateStack = [], this.currentRotation = 0;
|
|
733
536
|
}
|
|
734
537
|
createShader(A, e) {
|
|
735
|
-
return new
|
|
538
|
+
return new _(this.gl, A, e);
|
|
736
539
|
}
|
|
737
540
|
createFilterShader(A) {
|
|
738
|
-
return new
|
|
541
|
+
return new _(this.gl, w, A);
|
|
739
542
|
}
|
|
740
543
|
/**
|
|
741
544
|
* Set a uniform value for the current shader
|
|
@@ -747,18 +550,22 @@ class lA {
|
|
|
747
550
|
* Draw a rectangle with the current fill and/or stroke settings
|
|
748
551
|
*/
|
|
749
552
|
rect(A, e, t, r) {
|
|
750
|
-
const i = new nA(this.gl, A, e, t, r);
|
|
751
553
|
if (this.currentShader !== null) {
|
|
752
554
|
if (this.currentRotation !== 0) {
|
|
753
|
-
const { centerX:
|
|
754
|
-
this.setUniform("u_rotation",
|
|
555
|
+
const { centerX: l, centerY: c, radians: f, aspectRatio: u } = this.calculateRotationParams(A, e, t, r);
|
|
556
|
+
this.setUniform("u_rotation", f), this.setUniform("u_center", [l, c]), this.setUniform("u_aspectRatio", u);
|
|
755
557
|
} else
|
|
756
558
|
this.setUniform("u_rotation", 0), this.setUniform("u_center", [0, 0]), this.setUniform("u_aspectRatio", 1);
|
|
757
|
-
|
|
559
|
+
this.drawRectImmediate(A, e, t, r), this.currentShader = null;
|
|
758
560
|
return;
|
|
759
561
|
}
|
|
760
|
-
const s = this.solidColorShader,
|
|
761
|
-
|
|
562
|
+
const s = this.solidColorShader, a = this.currentRotation !== 0;
|
|
563
|
+
let g = 0, B = 0, E = 0, h = 1;
|
|
564
|
+
if (a) {
|
|
565
|
+
const l = this.calculateRotationParams(A, e, t, r);
|
|
566
|
+
g = l.centerX, B = l.centerY, E = l.radians, h = l.aspectRatio;
|
|
567
|
+
}
|
|
568
|
+
this.fillMode && (this.shader(s), this.setUniform("u_color", this.currentFillColor), a && (this.setUniform("u_rotation", E), this.setUniform("u_center", [g, B]), this.setUniform("u_aspectRatio", h)), this.drawRectImmediate(A, e, t, r)), this.strokeMode && this.currentStrokeWeight > 0 && (this.shader(s), this.setUniform("u_color", this.currentStrokeColor), a && (this.setUniform("u_rotation", E), this.setUniform("u_center", [g, B]), this.setUniform("u_aspectRatio", h)), this.drawRectStrokeImmediate(A, e, t, r, this.currentStrokeWeight));
|
|
762
569
|
}
|
|
763
570
|
/**
|
|
764
571
|
* Draw a line from (x1, y1) to (x2, y2) with the current stroke settings.
|
|
@@ -769,35 +576,38 @@ class lA {
|
|
|
769
576
|
* @param y2 Y-coordinate of the line end point
|
|
770
577
|
*/
|
|
771
578
|
line(A, e, t, r) {
|
|
772
|
-
if (!this.strokeMode) return;
|
|
773
|
-
const i = new BA(this.gl, A, e, t, r);
|
|
774
579
|
if (this.currentShader !== null) {
|
|
580
|
+
const C = (A + t) / 2, P = (e + r) / 2, p = Math.abs(t - A) || 1, D = Math.abs(r - e) || 1;
|
|
775
581
|
if (this.currentRotation !== 0) {
|
|
776
|
-
const
|
|
777
|
-
this.setUniform("u_rotation",
|
|
582
|
+
const { centerX: x, centerY: I, radians: b, aspectRatio: v } = this.calculateRotationParams(C - p / 2, P - D / 2, p, D);
|
|
583
|
+
this.setUniform("u_rotation", b), this.setUniform("u_center", [x, I]), this.setUniform("u_aspectRatio", v);
|
|
778
584
|
} else
|
|
779
585
|
this.setUniform("u_rotation", 0), this.setUniform("u_center", [0, 0]), this.setUniform("u_aspectRatio", 1);
|
|
780
|
-
|
|
586
|
+
const R = this.currentStrokeWeight > 0 ? this.currentStrokeWeight : 1;
|
|
587
|
+
this.drawLineImmediate(A, e, t, r, R), this.currentShader = null;
|
|
781
588
|
return;
|
|
782
589
|
}
|
|
783
|
-
|
|
784
|
-
|
|
590
|
+
if (!this.strokeMode || this.currentStrokeWeight <= 0) return;
|
|
591
|
+
const s = this.solidColorShader, a = (A + t) / 2, g = (e + r) / 2, B = Math.abs(t - A) || 1, E = Math.abs(r - e) || 1, h = this.currentRotation !== 0;
|
|
592
|
+
let l = 0, c = 0, f = 0, u = 1;
|
|
593
|
+
if (h) {
|
|
594
|
+
const C = this.calculateRotationParams(a - B / 2, g - E / 2, B, E);
|
|
595
|
+
l = C.centerX, c = C.centerY, f = C.radians, u = C.aspectRatio;
|
|
596
|
+
}
|
|
597
|
+
this.shader(s), this.setUniform("u_color", this.currentStrokeColor), h && (this.setUniform("u_rotation", f), this.setUniform("u_center", [l, c]), this.setUniform("u_aspectRatio", u)), this.drawLineImmediate(A, e, t, r, this.currentStrokeWeight);
|
|
785
598
|
}
|
|
786
599
|
/**
|
|
787
600
|
* Calculate rotation parameters for built-in shaders (NDC coordinates)
|
|
788
601
|
*/
|
|
789
602
|
calculateRotationParams(A, e, t, r) {
|
|
790
|
-
const i = this.gl.
|
|
791
|
-
|
|
792
|
-
B ? c = h / o * 2 - 1 : c = 1 - h / o * 2;
|
|
793
|
-
const d = this.currentRotation * Math.PI / 180;
|
|
794
|
-
return { centerX: l, centerY: c, radians: d, aspectRatio: g };
|
|
603
|
+
const i = $(this.gl) || [0, 0, this.gl.canvas.width, this.gl.canvas.height], s = i[2], a = i[3], g = s / a, B = A + t / 2, E = e + r / 2, h = B / s * 2 - 1, l = 1 - E / a * 2, c = this.currentRotation * Math.PI / 180;
|
|
604
|
+
return { centerX: h, centerY: l, radians: c, aspectRatio: g };
|
|
795
605
|
}
|
|
796
606
|
/**
|
|
797
607
|
* Create a new framebuffer
|
|
798
608
|
*/
|
|
799
609
|
createFramebuffer(A, e, t = {}) {
|
|
800
|
-
return new
|
|
610
|
+
return new O(this.gl, A, e, t);
|
|
801
611
|
}
|
|
802
612
|
/**
|
|
803
613
|
* Fill the current framebuffer with a solid color
|
|
@@ -815,7 +625,7 @@ class lA {
|
|
|
815
625
|
* Ensure viewport matches canvas dimensions
|
|
816
626
|
*/
|
|
817
627
|
resetViewport() {
|
|
818
|
-
this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height);
|
|
628
|
+
this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height), U(this.gl, [0, 0, this.gl.canvas.width, this.gl.canvas.height]), M(this.gl, !1);
|
|
819
629
|
}
|
|
820
630
|
/**
|
|
821
631
|
* Get the WebGL context
|
|
@@ -828,25 +638,132 @@ class lA {
|
|
|
828
638
|
* This method is idempotent and safe to call multiple times.
|
|
829
639
|
*/
|
|
830
640
|
dispose() {
|
|
831
|
-
this.imageShader.dispose(), this.solidColorShader.dispose(), this.imageShader = null, this.solidColorShader = null, this.currentShader = null, this.stateStack = [];
|
|
641
|
+
this.scratchFramebuffer && (this.scratchFramebuffer.dispose(), this.scratchFramebuffer = null), this.imageShader.dispose(), this.solidColorShader.dispose(), this.imageShader = null, this.solidColorShader = null, this.currentShader = null, this.stateStack = [];
|
|
832
642
|
}
|
|
833
643
|
/**
|
|
834
644
|
* Render a framebuffer at a specific position with optional scaling
|
|
835
645
|
*/
|
|
836
646
|
image(A, e, t, r, i) {
|
|
647
|
+
const s = this.gl, a = r ?? A.width, g = i ?? A.height, B = s.getParameter(s.FRAMEBUFFER_BINDING);
|
|
648
|
+
if (B && A.framebuffer === B) {
|
|
649
|
+
(!this.scratchFramebuffer || this.scratchFramebuffer.width !== a || this.scratchFramebuffer.height !== g) && (this.scratchFramebuffer && this.scratchFramebuffer.dispose(), this.scratchFramebuffer = this.createFramebuffer(a, g)), this.scratchFramebuffer.begin(), this.clear(0, 0, 0, 0), this.shader(this.imageShader), this.setUniform("u_texture", A.texture), this.setUniform("u_rotation", 0), this.setUniform("u_center", [0, 0]), this.setUniform("u_aspectRatio", 1), this.drawRectImmediate(0, 0, a, g), this.scratchFramebuffer.end(), this.shader(this.imageShader);
|
|
650
|
+
const h = this.currentRotation !== 0 ? this.calculateRotationParams(e, t, a, g) : { centerX: 0, centerY: 0, radians: 0, aspectRatio: 1 };
|
|
651
|
+
this.setUniform("u_texture", this.scratchFramebuffer.texture), this.setUniform("u_rotation", h.radians), this.setUniform("u_center", [h.centerX, h.centerY]), this.setUniform("u_aspectRatio", h.aspectRatio), this.drawRectImmediate(e, t, a, g), s.bindTexture(s.TEXTURE_2D, null), this.currentShader = null;
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
837
654
|
this.shader(this.imageShader), this.setUniform("u_texture", A.texture);
|
|
838
|
-
const { centerX:
|
|
655
|
+
const E = this.currentRotation !== 0 ? this.calculateRotationParams(e, t, a, g) : { centerX: 0, centerY: 0, radians: 0, aspectRatio: 1 };
|
|
656
|
+
this.setUniform("u_rotation", E.radians), this.setUniform("u_center", [E.centerX, E.centerY]), this.setUniform("u_aspectRatio", E.aspectRatio), this.drawRectImmediate(e, t, a, g), s.bindTexture(s.TEXTURE_2D, null), this.currentShader = null;
|
|
657
|
+
}
|
|
658
|
+
ensureUnitBuffer() {
|
|
659
|
+
if (this.unitBuffer) return;
|
|
660
|
+
const A = this.gl;
|
|
661
|
+
this.unitBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.unitBuffer);
|
|
662
|
+
}
|
|
663
|
+
enableAttribs() {
|
|
664
|
+
const A = this.gl, e = A.getParameter(A.CURRENT_PROGRAM);
|
|
665
|
+
let t = this.attribCache.get(e);
|
|
666
|
+
return t || (t = {
|
|
667
|
+
a_position: A.getAttribLocation(e, "a_position"),
|
|
668
|
+
a_texCoord: A.getAttribLocation(e, "a_texCoord")
|
|
669
|
+
}, this.attribCache.set(e, t)), A.enableVertexAttribArray(t.a_position), A.vertexAttribPointer(t.a_position, 2, A.FLOAT, !1, this.bytesPerVertex, 0), A.enableVertexAttribArray(t.a_texCoord), A.vertexAttribPointer(t.a_texCoord, 2, A.FLOAT, !1, this.bytesPerVertex, 8), { positionLoc: t.a_position, texLoc: t.a_texCoord };
|
|
670
|
+
}
|
|
671
|
+
disableAttribs(A, e) {
|
|
672
|
+
const t = this.gl;
|
|
673
|
+
t.disableVertexAttribArray(A), t.disableVertexAttribArray(e);
|
|
674
|
+
}
|
|
675
|
+
uploadQuadNDC(A, e, t, r) {
|
|
676
|
+
const i = this.gl;
|
|
677
|
+
this.ensureUnitBuffer(), i.bindBuffer(i.ARRAY_BUFFER, this.unitBuffer);
|
|
678
|
+
const s = 0, a = 0, g = 1, B = 1, E = new Float32Array([
|
|
679
|
+
A,
|
|
680
|
+
r,
|
|
681
|
+
0,
|
|
682
|
+
s,
|
|
683
|
+
// bottom-left
|
|
684
|
+
t,
|
|
685
|
+
r,
|
|
686
|
+
1,
|
|
687
|
+
a,
|
|
688
|
+
// bottom-right
|
|
689
|
+
A,
|
|
839
690
|
e,
|
|
691
|
+
0,
|
|
692
|
+
g,
|
|
693
|
+
// top-left
|
|
694
|
+
A,
|
|
695
|
+
e,
|
|
696
|
+
0,
|
|
697
|
+
g,
|
|
698
|
+
// top-left
|
|
840
699
|
t,
|
|
841
|
-
r
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
700
|
+
r,
|
|
701
|
+
1,
|
|
702
|
+
a,
|
|
703
|
+
// bottom-right
|
|
704
|
+
t,
|
|
705
|
+
e,
|
|
706
|
+
1,
|
|
707
|
+
B
|
|
708
|
+
// top-right
|
|
709
|
+
]);
|
|
710
|
+
i.bufferData(i.ARRAY_BUFFER, E, i.DYNAMIC_DRAW);
|
|
711
|
+
}
|
|
712
|
+
toNDC(A, e) {
|
|
713
|
+
const t = this.gl, r = $(t) || [0, 0, t.canvas.width, t.canvas.height], i = r[2], s = r[3], a = A / i * 2 - 1, g = 1 - e / s * 2;
|
|
714
|
+
return { nx: a, ny: g };
|
|
715
|
+
}
|
|
716
|
+
drawRectImmediate(A, e, t, r) {
|
|
717
|
+
const i = this.toNDC(A, e), s = this.toNDC(A + t, e + r);
|
|
718
|
+
this.uploadQuadNDC(i.nx, i.ny, s.nx, s.ny);
|
|
719
|
+
const a = this.enableAttribs();
|
|
720
|
+
this.gl.drawArrays(this.gl.TRIANGLES, 0, 6), this.disableAttribs(a.positionLoc, a.texLoc);
|
|
721
|
+
}
|
|
722
|
+
drawRectStrokeImmediate(A, e, t, r, i) {
|
|
723
|
+
this.drawRectImmediate(A, e, t, i), this.drawRectImmediate(A + t - i, e, i, r), this.drawRectImmediate(A, e + r - i, t, i), this.drawRectImmediate(A, e, i, r);
|
|
724
|
+
}
|
|
725
|
+
drawLineImmediate(A, e, t, r, i) {
|
|
726
|
+
const s = t - A, a = r - e, g = Math.hypot(s, a);
|
|
727
|
+
if (g === 0) {
|
|
728
|
+
this.drawRectImmediate(A - i / 2, e - i / 2, i, i);
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
const B = s / g, h = -(a / g), l = B, c = i / 2, f = A + h * c, u = e + l * c, C = A - h * c, P = e - l * c, p = t + h * c, D = r + l * c, R = t - h * c, x = r - l * c, I = this.toNDC(f, u), b = this.toNDC(C, P), v = this.toNDC(p, D), W = this.toNDC(R, x), F = this.gl;
|
|
732
|
+
this.ensureUnitBuffer(), F.bindBuffer(F.ARRAY_BUFFER, this.unitBuffer);
|
|
733
|
+
const q = new Float32Array([
|
|
734
|
+
I.nx,
|
|
735
|
+
I.ny,
|
|
736
|
+
0,
|
|
737
|
+
0,
|
|
738
|
+
b.nx,
|
|
739
|
+
b.ny,
|
|
740
|
+
0,
|
|
741
|
+
1,
|
|
742
|
+
v.nx,
|
|
743
|
+
v.ny,
|
|
744
|
+
1,
|
|
745
|
+
0,
|
|
746
|
+
b.nx,
|
|
747
|
+
b.ny,
|
|
748
|
+
0,
|
|
749
|
+
1,
|
|
750
|
+
W.nx,
|
|
751
|
+
W.ny,
|
|
752
|
+
1,
|
|
753
|
+
1,
|
|
754
|
+
v.nx,
|
|
755
|
+
v.ny,
|
|
756
|
+
1,
|
|
757
|
+
0
|
|
758
|
+
]);
|
|
759
|
+
F.bufferData(F.ARRAY_BUFFER, q, F.DYNAMIC_DRAW);
|
|
760
|
+
const X = this.enableAttribs();
|
|
761
|
+
F.drawArrays(F.TRIANGLES, 0, 6), this.disableAttribs(X.positionLoc, X.texLoc);
|
|
845
762
|
}
|
|
846
763
|
}
|
|
847
764
|
var Q = {};
|
|
848
765
|
Q.parse = function(n) {
|
|
849
|
-
var A = function(i, s,
|
|
766
|
+
var A = function(i, s, a, g) {
|
|
850
767
|
var B = Q.T, E = {
|
|
851
768
|
cmap: B.cmap,
|
|
852
769
|
head: B.head,
|
|
@@ -855,12 +772,12 @@ Q.parse = function(n) {
|
|
|
855
772
|
hmtx: B.hmtx,
|
|
856
773
|
loca: B.loca,
|
|
857
774
|
glyf: B.glyf
|
|
858
|
-
}, h = { _data: i, _index: s, _offset:
|
|
775
|
+
}, h = { _data: i, _index: s, _offset: a };
|
|
859
776
|
for (var l in E) {
|
|
860
|
-
var c = Q.findTable(i, l,
|
|
777
|
+
var c = Q.findTable(i, l, a);
|
|
861
778
|
if (c) {
|
|
862
|
-
var
|
|
863
|
-
u == null && (u = E[l].parseTab(i,
|
|
779
|
+
var f = c[0], u = g[f];
|
|
780
|
+
u == null && (u = E[l].parseTab(i, f, c[1], h)), h[l] = g[f] = u;
|
|
864
781
|
}
|
|
865
782
|
}
|
|
866
783
|
return h;
|
|
@@ -869,10 +786,10 @@ Q.parse = function(n) {
|
|
|
869
786
|
};
|
|
870
787
|
Q.findTable = function(n, A, e) {
|
|
871
788
|
for (var t = Q.B, r = t.readUshort(n, e + 4), i = e + 12, s = 0; s < r; s++) {
|
|
872
|
-
var
|
|
789
|
+
var a = t.readASCII(n, i, 4);
|
|
873
790
|
t.readUint(n, i + 4);
|
|
874
791
|
var g = t.readUint(n, i + 8), B = t.readUint(n, i + 12);
|
|
875
|
-
if (
|
|
792
|
+
if (a == A) return [g, B];
|
|
876
793
|
i += 16;
|
|
877
794
|
}
|
|
878
795
|
return null;
|
|
@@ -916,31 +833,31 @@ Q.T.cmap = {
|
|
|
916
833
|
n = new Uint8Array(n.buffer, A, e), A = 0;
|
|
917
834
|
var r = Q.B, i = r.readUshort, s = Q.T.cmap;
|
|
918
835
|
i(n, A), A += 2;
|
|
919
|
-
var
|
|
836
|
+
var a = i(n, A);
|
|
920
837
|
A += 2;
|
|
921
|
-
for (var g = [], B = 0; B <
|
|
838
|
+
for (var g = [], B = 0; B < a; B++) {
|
|
922
839
|
var E = i(n, A);
|
|
923
840
|
A += 2;
|
|
924
841
|
var h = i(n, A);
|
|
925
842
|
A += 2;
|
|
926
843
|
var l = r.readUint(n, A);
|
|
927
844
|
A += 4;
|
|
928
|
-
var c = "p" + E + "e" + h,
|
|
929
|
-
if (
|
|
930
|
-
|
|
845
|
+
var c = "p" + E + "e" + h, f = g.indexOf(l);
|
|
846
|
+
if (f == -1) {
|
|
847
|
+
f = t.tables.length;
|
|
931
848
|
var u = {};
|
|
932
849
|
g.push(l);
|
|
933
|
-
var
|
|
934
|
-
|
|
850
|
+
var C = u.format = i(n, l);
|
|
851
|
+
C == 4 ? u = s.parse4(n, l, u) : C == 12 && (u = s.parse12(n, l, u)), t.tables.push(u);
|
|
935
852
|
}
|
|
936
|
-
t.ids[c] != null && console.log("multiple tables for one platform+encoding: " + c), t.ids[c] =
|
|
853
|
+
t.ids[c] != null && console.log("multiple tables for one platform+encoding: " + c), t.ids[c] = f;
|
|
937
854
|
}
|
|
938
855
|
return t;
|
|
939
856
|
},
|
|
940
857
|
parse4: function(n, A, e) {
|
|
941
858
|
var t = Q.B, r = t.readUshort, i = t.readUshorts, s = A;
|
|
942
859
|
A += 2;
|
|
943
|
-
var
|
|
860
|
+
var a = r(n, A);
|
|
944
861
|
A += 2, r(n, A), A += 2;
|
|
945
862
|
var g = r(n, A);
|
|
946
863
|
A += 2;
|
|
@@ -948,15 +865,15 @@ Q.T.cmap = {
|
|
|
948
865
|
e.searchRange = r(n, A), A += 2, e.entrySelector = r(n, A), A += 2, e.rangeShift = r(n, A), A += 2, e.endCount = i(n, A, B), A += B * 2, A += 2, e.startCount = i(n, A, B), A += B * 2, e.idDelta = [];
|
|
949
866
|
for (var E = 0; E < B; E++)
|
|
950
867
|
e.idDelta.push(t.readShort(n, A)), A += 2;
|
|
951
|
-
return e.idRangeOffset = i(n, A, B), A += B * 2, e.glyphIdArray = i(n, A, s +
|
|
868
|
+
return e.idRangeOffset = i(n, A, B), A += B * 2, e.glyphIdArray = i(n, A, s + a - A >> 1), e;
|
|
952
869
|
},
|
|
953
870
|
parse12: function(n, A, e) {
|
|
954
871
|
var t = Q.B, r = t.readUint;
|
|
955
872
|
A += 4, r(n, A), A += 4, r(n, A), A += 4;
|
|
956
873
|
var i = r(n, A) * 3;
|
|
957
874
|
A += 4;
|
|
958
|
-
for (var s = e.groups = new Uint32Array(i),
|
|
959
|
-
s[
|
|
875
|
+
for (var s = e.groups = new Uint32Array(i), a = 0; a < i; a += 3)
|
|
876
|
+
s[a] = r(n, A + (a << 2)), s[a + 1] = r(n, A + (a << 2) + 4), s[a + 2] = r(n, A + (a << 2) + 8);
|
|
960
877
|
return e;
|
|
961
878
|
}
|
|
962
879
|
};
|
|
@@ -988,17 +905,17 @@ Q.T.hhea = {
|
|
|
988
905
|
"metricDataFormat",
|
|
989
906
|
"numberOfHMetrics"
|
|
990
907
|
], s = 0; s < i.length; s++) {
|
|
991
|
-
var
|
|
992
|
-
r[
|
|
908
|
+
var a = i[s], g = a == "advanceWidthMax" || a == "numberOfHMetrics" ? t.readUshort : t.readShort;
|
|
909
|
+
r[a] = g(n, A + s * 2);
|
|
993
910
|
}
|
|
994
911
|
return r;
|
|
995
912
|
}
|
|
996
913
|
};
|
|
997
914
|
Q.T.hmtx = {
|
|
998
915
|
parseTab: function(n, A, e, t) {
|
|
999
|
-
for (var r = Q.B, i = [], s = [],
|
|
916
|
+
for (var r = Q.B, i = [], s = [], a = t.maxp.numGlyphs, g = t.hhea.numberOfHMetrics, B = 0, E = 0, h = 0; h < g; )
|
|
1000
917
|
B = r.readUshort(n, A + (h << 2)), E = r.readShort(n, A + (h << 2) + 2), i.push(B), s.push(E), h++;
|
|
1001
|
-
for (; h <
|
|
918
|
+
for (; h < a; )
|
|
1002
919
|
i.push(B), s.push(E), h++;
|
|
1003
920
|
return { aWidth: i, lsBearing: s };
|
|
1004
921
|
}
|
|
@@ -1011,9 +928,9 @@ Q.T.maxp = {
|
|
|
1011
928
|
};
|
|
1012
929
|
Q.T.loca = {
|
|
1013
930
|
parseTab: function(n, A, e, t) {
|
|
1014
|
-
var r = Q.B, i = [], s = t.head.indexToLocFormat,
|
|
1015
|
-
if (s == 0) for (var g = 0; g <
|
|
1016
|
-
if (s == 1) for (var g = 0; g <
|
|
931
|
+
var r = Q.B, i = [], s = t.head.indexToLocFormat, a = t.maxp.numGlyphs + 1;
|
|
932
|
+
if (s == 0) for (var g = 0; g < a; g++) i.push(r.readUshort(n, A + (g << 1)) << 1);
|
|
933
|
+
if (s == 1) for (var g = 0; g < a; g++) i.push(r.readUint(n, A + (g << 2)));
|
|
1017
934
|
return i;
|
|
1018
935
|
}
|
|
1019
936
|
};
|
|
@@ -1029,43 +946,43 @@ Q.T.glyf = {
|
|
|
1029
946
|
if (s.noc = e.readShort(t, i), i += 2, s.xMin = e.readShort(t, i), i += 2, s.yMin = e.readShort(t, i), i += 2, s.xMax = e.readShort(t, i), i += 2, s.yMax = e.readShort(t, i), i += 2, s.xMin >= s.xMax || s.yMin >= s.yMax) return null;
|
|
1030
947
|
if (s.noc > 0) {
|
|
1031
948
|
s.endPts = [];
|
|
1032
|
-
for (var
|
|
949
|
+
for (var a = 0; a < s.noc; a++)
|
|
1033
950
|
s.endPts.push(e.readUshort(t, i)), i += 2;
|
|
1034
951
|
var g = e.readUshort(t, i);
|
|
1035
952
|
if (i += 2, t.length - i < g) return null;
|
|
1036
953
|
i += g;
|
|
1037
954
|
var B = s.endPts[s.noc - 1] + 1;
|
|
1038
955
|
s.flags = [];
|
|
1039
|
-
for (var
|
|
956
|
+
for (var a = 0; a < B; a++) {
|
|
1040
957
|
var E = t[i];
|
|
1041
958
|
if (i++, s.flags.push(E), E & 8) {
|
|
1042
959
|
var h = t[i];
|
|
1043
960
|
i++;
|
|
1044
961
|
for (var l = 0; l < h; l++)
|
|
1045
|
-
s.flags.push(E),
|
|
962
|
+
s.flags.push(E), a++;
|
|
1046
963
|
}
|
|
1047
964
|
}
|
|
1048
965
|
s.xs = [];
|
|
1049
|
-
for (var
|
|
1050
|
-
var c = (s.flags[
|
|
1051
|
-
c ? (s.xs.push(
|
|
966
|
+
for (var a = 0; a < B; a++) {
|
|
967
|
+
var c = (s.flags[a] & 2) != 0, f = (s.flags[a] & 16) != 0;
|
|
968
|
+
c ? (s.xs.push(f ? t[i] : -t[i]), i++) : f ? s.xs.push(0) : (s.xs.push(e.readShort(t, i)), i += 2);
|
|
1052
969
|
}
|
|
1053
970
|
s.ys = [];
|
|
1054
|
-
for (var
|
|
1055
|
-
var c = (s.flags[
|
|
1056
|
-
c ? (s.ys.push(
|
|
971
|
+
for (var a = 0; a < B; a++) {
|
|
972
|
+
var c = (s.flags[a] & 4) != 0, f = (s.flags[a] & 32) != 0;
|
|
973
|
+
c ? (s.ys.push(f ? t[i] : -t[i]), i++) : f ? s.ys.push(0) : (s.ys.push(e.readShort(t, i)), i += 2);
|
|
1057
974
|
}
|
|
1058
|
-
for (var u = 0,
|
|
1059
|
-
u += s.xs[
|
|
975
|
+
for (var u = 0, C = 0, a = 0; a < B; a++)
|
|
976
|
+
u += s.xs[a], C += s.ys[a], s.xs[a] = u, s.ys[a] = C;
|
|
1060
977
|
} else
|
|
1061
978
|
s.parts = [];
|
|
1062
979
|
return s;
|
|
1063
980
|
}
|
|
1064
981
|
};
|
|
1065
982
|
typeof module < "u" && module.exports ? module.exports = Q : typeof window < "u" && (window.Typr = Q);
|
|
1066
|
-
const QA = `data:font/truetype;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMs+QEyQAAAEoAAAAYGNtYXAg7yVJAAAFjAAACSBnbHlmuHLTdAAAErQAAGi0aGVhZFvXdUwAAACsAAAANmhoZWELAQUCAAAA5AAAACRobXR4BACDgAAAAYgAAAQEbG9jYQAy54AAAA6sAAAECG1heHABIgCCAAABCAAAACBuYW1lVs/OSgAAe2gAAAOicG9zdABpADQAAH8MAAAAIAABAAAAAQAAzOWHqV8PPPUAAAQAAAAAAHxiGCcAAAAAfGIYJwAAAAAEAAQAAAAACAACAAEAAAAAAAEAAAQAAAAAAAQAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAEBAAEAAAEBAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAZAABQAEAgACAAAAAAACAAIAAAACAAAzAMwAAAAABAAAAAAAAACAAACLAABw4wAAAAAAAAAAWUFMLgBAACAmawQAAAAAAAQAAAAAAAFRAAAAAAMABAAAAAAgAAAEAAAABAAAAAQAAAAEAAGABAABAAQAAIAEAACABAAAgAQAAIAEAAGABAABAAQAAQAEAACABAABAAQAAIAEAACABAABAAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAAGABAAAgAQAAIAEAAGABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABgAQAAQAEAACABAAAAAQAAgAEAACABAAAgAQAAIAEAACABAACAAQAAAAEAAIABAABgAQAAgAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAAABAAAAAQAAAAEAAIABAADAAQAAAAEAAAABAAAgAQAAYAEAAAABAAAAAQAAIAEAAAA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AIAAAACA/YAAgAAAAIAAAP8AAoABAAAA/4AAAP+A/4AAgAAAAIAAAP8AA4AAAP8AAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAP+AAAD/gAAAAAAAAP8AAAAAgAAAAAAAAP+AAAD/gAAAAAAAAwCAAIAEAAQAABcAHQAjAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAACAAAAAgAAA/4AAAACAAAD9AAAA/4AAAACAAAD/gAAAAIAAgAAAAIAAAACAAAD/AAAAAQAAAP+AAAAEAAAA/4AAAP8AAAD/gAAAAIAAAP8AAAD/gAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAP+AAAD/gAAAAQD+gP8AAAAAgAAAAIAAAAABAYACgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAP6AAAAAAAABAQAAgAMABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/oAAAP+AAAD/gAAAAIAAAACAAAABgAAAAIAAAAAAAAEBAACAAwAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAAAgAAAAIAAAAGAAAAAgAAAAAAABQCAAYADgAQAAAMABwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAIAAAP+AAYAAgAAA/4D/AAEAAAABAAAA/wAAAP8AAAD/AAAAAQD/gACAAAD/gAGAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP+AAAAAAAABAQAAgAOAAwAACwAAAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAD/gAAA/wAAAAEAAwAAAP8AAAD/gAAA/wAAAAEAAAAAgAAAAAAAAQCAAAACAAGAAAcAAAEBAQEBAQEBAQABAAAA/4AAAP8AAAAAgAGAAAD/AAAA/4AAAACAAAAAAAABAIABgAOAAgAAAwAAAQEBAQCAAwAAAP0AAgAAAP+AAAAAAAABAQAAgAIAAYAAAwAAAQEBAQEAAQAAAP8AAYAAAP8AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAwCAAIADgAQAAAsAEQAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAD/gAAAAIAAgAAAAIAAAACAAAD/gAAA/4AAAAEAAAAEAAAA/4AAAP2AAAD/gAAAAIAAAAKAAAAAAP8AAAAAgAAAAID/AP+AAAD/AAAAAYAAAAABAIAAgAOABAAADQAAAQEBAQEBAQEBAQEBAQEBgAEAAAABAAAA/QAAAAEAAAD/AAAAAIAAAACABAAAAP0AAAD/gAAAAIAAAAGAAAAAgAAAAIAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAAAIAAAACAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAA/wAAAAEAAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/wAAAAEAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAA/4AAAACAAAAAAAABAIAAgAOABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAP+AAAABAAAAAQAAAP8AAAD+AAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAAEAAAD9gAAAAQAAAAGAAAAAgAAAAAEAgACAA4AEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP4AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/gAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAP+AAAABAAAAAAAAAgCAAIADgAQAABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAYAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAoAAAP6A/wAAAAEAAAEAgACAA4AEAAAPAAABAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AEAAAA/oAAAP+AAAD+gAAAAYAAAACAAAABAAAA/4AAAAAAAAMAgACAA4AEAAATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAACAAAD/gAAAAIAAgAAAAQAAAP8AAAABAAAABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAA/wAAAAEA/oD/AAAAAQAAAAACAIAAgAOABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD+gAAA/4AAAACAAIAAAAEAAAAEAAAA/4AAAP0AAAABAAAAAIAAAAGAAAAAAP6AAAABgAACAQABAAIAA4AAAwAHAAABAQEBAQEBAQEAAQAAAP8AAAABAAAA/wADgAAA/wAAAP+AAAD/AAAAAAIAgACAAgADgAADAAsAAAEBAQEBAQEBAQEBAQEAAQAAAP8AAAABAAAA/4AAAP8AAAAAgAOAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAABAQAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQKAAQAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAACAIABgAOAAwAAAwAHAAABAQEBAQEBAQCAAwAAAP0AAAADAAAA/QADAAAA/4AAAP+AAAD/gAAAAAEAgACAAwAEAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAIAgACAA4AEAAATABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP8AAAD/AAAAAIAAgAEAAAD/AAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAA/4AAAACAAAD+AAAA/wAAAAACAIAAgAOABAAAEQAVAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP6AAAAAgAAA/wAAAAGAAAD+AAAA/4AAAACAAgAAgAAA/4AEAAAA/4AAAP6AAAABAAAAAIAAAP2AAAD/gAAAAIAAAAKAAAD+AAAA/4AAAAAAAAIAgACAA4AEAAAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAAAIAAAACAAAD/AAAA/wAAAP8AAAAAgAAAAIAAAAAAAQAAAAQAAAD/gAAA/4AAAP2AAAABAAAA/wAAAAKAAAAAgAAA/4D/AAAAAQAAAwCAAIADgAQAAAsADwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAAAIAAAP+AAAD9gAEAAAABAAAA/wAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAADAP8AAAABAP6A/wAAAAEAAAAAAQCAAIADgAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAQAAAAEAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAACAIAAgAOABAAACwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAEAAAAAgAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAADAP2AAAAAgAAAAYAAAACAAAEAgACAA4AEAAAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/wAAAAEAAAABAAAA/4AAAP4AAAD/gAAAAIAEAAAA/4AAAP+AAAAAgAAA/wAAAP+AAAD/AAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAABAIAAgAOABAAACQAAAQEBAQEBAQEBAQCAAwAAAP4AAAABAAAA/wAAAP8ABAAAAP+AAAD/AAAA/4AAAP6AAAAAAQCAAIADgAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/4AAAAGAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAQAAAACAAAD+gAAA/4AAAACAAAACgAAAAAEAgACAA4AEAAALAAABAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP8AAAD/AAAA/wAEAAAA/gAAAAIAAAD8gAAAAQAAAP8AAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIADAAAA/wAAAAEAAAD9AAAAAQAAAP8ABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAAAAQCAAIAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAMAAAD/gAAA/4AAAP4AAAD/gAAAAQAAAAEAAAD+gAQAAAD/gAAA/YAAAP+AAAAAgAAAAQAAAP8AAAACgAAAAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAAEAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAQAAAD/AAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAAAAAQCAAIADgAQAAAUAAAEBAQEBAQCAAQAAAAIAAAD9AAQAAAD9AAAA/4AAAAABAIAAgAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8ABAAAAP+AAAD/gAAAAIAAAACAAAD8gAAAAgAAAP+AAAAAgAAA/gAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAEAAAA/4AAAP+AAAD/gAAAAYAAAPyAAAABAAAAAIAAAACAAAD+AAAAAAAAAgCAAIADgAQAAAsADwAAAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAD9gAAAAoAAAgCAAIADgAQAAAkADQAAAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP6AAAD/AAEAAAABAAAABAAAAP+AAAD+gAAA/4AAAP8AAAADAP6AAAABgAAAAAIAgACABAAEAAAPABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAD/gAAAAIAAAAQAAAD/gAAA/gAAAP8AAAAAgAAA/4AAAACAAAACgAAAAAD9gAAAAIAAAACAAAABgAACAIAAgAOABAAAEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AAQAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAwD/AAAAAQAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/oAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAAAAAAAQCAAIADgAQAAAcAAAEBAQEBAQEBAIADAAAA/wAAAP8AAAD/AAQAAAD/gAAA/QAAAAMAAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAP+ABAAAAP0AAAADAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIADgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAD/gAAA/wAAAP+AAAD/gAQAAAD+AAAAAgAAAP4AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAIAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAQAAAP8AAAD/gAAA/4AAAP+AAAD/AAQAAAD+AAAAAIAAAP+AAAACAAAA/IAAAACAAAAAgAAA/4AAAP+AAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/AAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP8AAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAA/wAAAAEAAAAAgAAAAIAAAACAAAAAAAABAIAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAACAAAAAAAABAIAAgAOABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/gAAA/4AAAAIAAAD9AAAAAIAAAACAAAAAgAAAAIAAAP4ABAAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/wAAAAEAAAD+AAQAAAD/gAAA/YAAAP+AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/gAAAAEAAAD/AAQAAAD8gAAAAIAAAAKAAAAAAAABAIACAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAEAAAMAAAEBAQEAgAMAAAD9AAEAAAD/gAAAAAAAAQEAAoACgAQAAAkAAAEBAQEBAQEBAQEBAAEAAAAAgAAA/4AAAP+AAAD/gAQAAAD/gAAA/wAAAACAAAAAgAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQACgAAA/4AAAP+AAAD/AAAAAQAAAP6AAAD/gAAAAIADAAAA/YAAAACAAAABgAAA/oAAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/gAAA/YABAAAAAQAAAAQAAAD/AAAA/4AAAP6AAAD/gAAAAgD+gAAAAYAAAAABAIAAgAOAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAAAQAAAP+AAAD+AAAA/4AAAACAAwAAAP+AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAoABAAAA/YAAAP+AAAAAgAAAAYD/AAAAAQAAAAQAAAD8gAAAAIAAAAGAAAAAgAAA/4D+gAAAAYAAAAACAIAAgAOAAwAADQARAAABAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/gAAAAGAAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP8AAAD/gAAA/4AAAACAAAABgAAAAAD/gAAAAIAAAAABAQAAgAOAA4AACwAAAQEBAQEBAQEBAQEBAYACAAAA/oAAAAEAAAD/AAAA/wAAAACAA4AAAP+AAAD/AAAA/4AAAP8AAAACgAAAAAAAAgCAAIADgAOAAA8AEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAABgAAA/oAAAP+AAAAAgACAAAABAAAAA4AAAP+AAAD+AAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAAP8AAAABAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/AAAA/wAAAP8ABAAAAP8AAAD/gAAA/gAAAAIAAAD+AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP+AAAD/gAAA/YAAAAACAIAAgAOABAAAAwAPAAABAQEBAQEBAQEBAQEBAQEBAoABAAAA/wAAAAEAAAD/gAAA/gAAAP+AAAABAAAAAQAEAAAA/4AAAP+AAAD+AAAA/4AAAACAAAABAAAA/wAAAAABAIAAgAOAA4AAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAQAAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AA4AAAP8AAAAAgAAA/4AAAP8AAAD/gAAA/4AAAACAAAAAgAAA/wAAAAAAAAEBgACAAwAEAAAHAAABAQEBAQEBAQGAAQAAAACAAAD/AAAA/4AEAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIAEAAMAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAMAAAD/gAAAAIAAAP+AAAD+AAAAAYAAAP+AAAAAgAAA/oAAAAIAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAABAAAAAIAAAP8AAAD/gAAA/4AAAP8AAwAAAP+AAAAAgAAA/4AAAP4AAAABgAAA/4AAAP8AAAAAAAACAIAAgAOAAwAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP6AAAD/gAAAAIAAAAGAAAAAAP6AAAABgAACAIAAgAOAAwAACQANAAABAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAA/oAAAP8AAQAAAAEAAAADAAAA/4AAAP+AAAD/gAAA/wAAAAIA/4AAAACAAAAAAgCAAIAEAAMAAA0AEQAAAQEBAQEBAQEBAQEBAQEBAQEBAQACgAAAAIAAAP+AAAD/AAAA/oAAAP+AAAAAgACAAAABAAAAAwAAAP6AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAA/4AAAACAAAAAAQEAAIADgAMAAAkAAAEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP+AAAD/AAMAAAD/gAAA/wAAAAEAAAD+AAAAAAEAgACABAADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP6AAAABgAAAAIAAAP+AAAD9AAAAAgAAAP6AAAD/gAAAAIADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAP8AAAAAgAAAAQAAAP+AAAD+gAAA/4AAAP+AAAAAgAOAAAD/gAAA/4AAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAQAAAP+AAAD/gAAA/oAAAP+AAwAAAP4AAAAAgAAAAYAAAP2AAAAAgAAA/4AAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+AAwAAAP6AAAABgAAA/oAAAP+AAAD/gAAAAIAAAACAAAAAAAABAIAAgAQAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/4AAAP8AAAD/gAAA/wAAAP+AAwAAAP6AAAAAgAAA/4AAAAGAAAD+AAAA/4AAAACAAAD/gAAAAIAAAAAAAAEAgACAA4ADAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP8AAAD/AAAAAIAAAACAAAD/gAAA/4ADAAAA/4AAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAAGAAAD+gAAA/4ADAAAA/wAAAAEAAAD+AAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP+AAAD/gAAA/4AAAAGAAAD9AAAAAIAAAACAAAAAgAAA/oADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAA/wAAAP+AAAAAgAAAAQAAAP6AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAAABAYAAgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPyAAAAAAAABAQAAgAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAGAAAAAgAAAAIAAAP+AAAD/gAAA/oAAAAEAAAAAgAAA/4AAAP8ABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAAAAEAgAGAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAACAAAD/gAAA/wAAAP8AAAD/gAAAAIADAAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAYAAAAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAAA/wAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAABAAAAAQAAAACAAAAAgAAAAAAAAQIAAAAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD8AAAAAAAAAgCAAIADgAQAABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP8AAAABAAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAA/wAAAACAAAAAgAGAAIAAAP+ABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAAAAAAAP+AAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAAAgAAA/wAAAAEAAAD/AAAA/wAAAP8AAAABAAAA/wAAAACAAAD/gAQAAAD+gAAAAYAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABACAAIAEAAQAABcAGwAfACMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP4AAAABgAAAAIAAAACAAAD/gAAA/YAAAAIAAAD+gAAA/4AAAP+AAAAAgAEAAAAAgAAAAQAAgAAA/4D9AACAAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAACAAAAAgAAAAQAAAP8A/4AAAACAAQAAAP+AAAD+gAAA/4AAAAAEAIAAgAQAA4AAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAQIAAAAEAAQAAAkAAAEBAQEBAQEBAQEDgACAAAD+AAAAAIAAAACAAAAAgAQAAAD8AAAAAQAAAAEAAAABAAAAAAgAAAAABAAEAAADAAcACwAPABMAFwAbAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAA/wACAAEAAAD/AP8AAQAAAP8AAgABAAAA/wD9AAEAAAD/AAIAAQAAAP8A/wABAAAA/wACAAEAAAD/AAQAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQIAAAADAAQAAAMAAAEBAQECAAEAAAD/AAQAAAD8AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP6AAAD/gAAA/oAAAAABAgAAAAQAAgAAAwAAAQEBAQIAAgAAAP4AAgAAAP4AAAAAAAAEAIAAAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+ABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAAABAAAAPwAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAoABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAD/gAOAAAD+AAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAA/wAAAAEAAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAAAEAAAA/gAAAP+AAAD/gAAA/4AAAP+ABAAAAPwAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIAEAAOAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAOAAAD/gAAAAIAAAP8AAAABAAAA/oAAAAGAAAD9AAAAAIAAAP+AAAABAAAA/wAAAAGAAAD+gAAAAAAAAQAAAAACAAQAAAkAAAEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD+AAQAAAD/AAAA/wAAAP8AAAD/AAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQKAAYAAAP8AAAD/AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAEAAAA/wAAAP+AAAD/gAAA/wAAAP8AAAABgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD8AAAAAIAAAACAAAAAgAIAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgAAAAAEAAQAAAMABwAAAQEBAQEBAQEAAAIAAAD+AAIAAgAAAP4ABAAAAP4AAAAAAAAA/gAAAAAEAAACAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8ABAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAABAIAAAAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQECAAEAAAD/AAEAAQAAAP8A/wABAAAA/wABAAEAAAD/AAQAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAEDAAAABAAEAAADAAABAQEBAwABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD9AAAA/wAEAAAA/wAAAP0AAAAAAQAAAAABAAQAAAMAAAEBAQEAAAEAAAD/AAQAAAD8AAAAAAAAAwCAAIADAAOAAAMABwALAAABAQEBAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AAQAAgAAA/4ADgAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAAABAYABgAQABAAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAAEAAAD+gAAA/4AAAP+ABAAAAP8AAAD/gAAA/wAAAACAAAAAgAAAAAAAAQAAAYACgAQAAAsAAAEBAQEBAQEBAQEBAQGAAQAAAP+AAAD/gAAA/oAAAAEAAAAAgAQAAAD+gAAA/4AAAP+AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAwABAAAA/AAAAAEAAAABAAAAAQAEAAAA/AAAAAKAAAAAgAAAAIAAAAABAIAAgAMABAAACwAAAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP0AAAD/gAAAAIAAAAEAAAAAgAAAAAAAAQAAAAAEAAQAAAUAAAEBAQEBAQAAAQAAAAMAAAD8AAQAAAD9AAAA/wAAAAACAIAAgAMAAoAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQABgAAAAIAAAP+AAAD+gAAAAQAAAP8A/4AAgAAA/4ACgAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAMABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAABAAAA/wAAAAEA/oAAgAAA/4AEAAAA/QAAAP+AAAAAgAAAAQAAAACAAAD/gAAA/wAAAAABAIAAgAQABAAADQAAAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP+AAAD9gAAA/4AAAACAAAABAAAAAIAAAAACAAAAAAQABAAAAwAHAAABAQEBAQEBAQAABAAAAPwAAQAAAAIAAAAEAAAA/AAAAAMA/gAAAAIAAAEAgACABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAD/gAAA/oAAAP+AAAAAgAAAAQAEAAAA/4AAAP+AAAD/gAAA/oAAAP+AAAAAgAAAAQAAAACAAAAAAQAAAAACgAKAAAsAAAEBAQEBAQEBAQEBAQAAAYAAAACAAAAAgAAA/wAAAP+AAAD/AAKAAAD/gAAA/4AAAP6AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD/AAAA/QAEAAAA/AAAAAMAAAAAAQCAAIAEAAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAABAAAA/wAAAP+AAAD+gAAA/4AAAACAAAABAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAAEAAAAAgAAAAAEBgAAABAACgAALAAABAQEBAQEBAQEBAQECgAGAAAD/AAAA/4AAAP8AAAAAgAAAAIACgAAA/wAAAP+AAAD/AAAAAYAAAACAAAAAAAABAAAAAAQABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAPwABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAABAAADAAABAQEBAAAEAAAA/AABAAAA/wAAAAAAAAEAAAAABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQEDgACAAAD8AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAEAAAA/AAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAQAAAgAEAAQAAAMAAAEBAQEAAAQAAAD8AAQAAAD+AAAAAAAAAgCAAIACAAOAAAMABwAAAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAAEAIAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAABAAAAPyAAAADAP+AAAAAgP8A/4AAAACA/wD/gAAAAIAAAQAAAAAEAAQAAAUAAAEBAQEBAQMAAQAAAPwAAAADAAQAAAD8AAAAAQAAAAACAIAAgAQABAAAAwAHAAABAQEBAQEBAQCAA4AAAPyAAYAAAACAAAAEAAAA/IAAAAIA/4AAAACAAAMAgACABAAEAAADAAcACwAAAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgP4A/4AAAACAAAAABAAAAIAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD8AAAABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAYAgACABAAEAAADAAcACwAPABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/oAAAACAAAD+gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAID/AP+AAAAAgAAA/4AAAACAAAEAgACAAQADgAADAAABAQEBAIAAgAAA/4ADgAAA/QAAAAAAAAUAgACABAAEAAADAAcACwAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/YAAAACAAAABgAAAAIAAAAQAAAD8gAAAAwD/gAAAAIAAAP+AAAAAgP4A/4AAAACAAAD/gAAAAIAAAAABAAADAAQABAAAAwAAAQEBAQAABAAAAPwABAAAAP8AAAAAAAAHAIAAgAQABAAAAwAHAAsADwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAABgAAAAIAAAP2AAAAAgAAAAYAAAACAAAD9gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAIAAAP+AAAAAgP8A/4AAAACAAAD/gAAAAIAAAAAEAAAAAAQAAgAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8AAgAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQAAAAAEAAQAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAQAAAD/gAAA/4AAAP+AAAD9gAAAAAEBAAAAAgAEAAADAAABAQEBAQABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQECgAGAAAD8AAAAAIAAAACAAAAAgAAAAQAEAAAA/AAAAAGAAAABAAAAAIAAAACAAAAAAAABAAABAAQAAgAAAwAAAQEBAQAABAAAAPwAAgAAAP8AAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAgACAAAA/AAAAACAAAAAgAAAAIAAAACABAAAAPwAAAACAAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEDAAEAAAD8AAAAAQAAAAEAAAABAAIAAAD+AAAAAIAAAACAAAAAgAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAIAAAAAgAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/4AAAP4AAAAAAAADAAAAAAQABAAAGwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAIAAYAAAACAAAD/gAAA/4AAAP+AAAD/gP4AAIAAAACAAAAAgAAAAIAAAP6AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAQAAAP+AAAD+gAAAAIAAAACAAAAAgAAA/oAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAIAAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAGAAAABAAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAAAAAAEAAAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAYAAAP6AAgABgAAA/oD9gAGAAAD+gAIAAYAAAP6ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAP6AAAAAAQIAAgAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD+AAAAAAAABACAAIAEAAQAAAMABwAjACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8A/gAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4ABgACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAAAAA/wAAAP+AAAD/gAAAAIAAAACAAAABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAGAAAD/gAAAAAQAAAAABAAEAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ADgACAAAD/gPyAAIAAAP+AA4AAgAAA/4AEAAAA/4AAAACAAAD/gAAA/QAAAP+AAAAAgAAA/4AAAAABAAAAAAIAAgAAAwAAAQEBAQAAAgAAAP4AAgAAAP4AAAAAAAAEAAAAAAIABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAQABAAAA/wD/AAEAAAD/AAEAAQAAAP8ABAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAQCAAQADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAAGAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAOAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAAAABAQABAAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAACAAAD+gAAAAYAAAP+AAAABAAAAAIAAAAAAAAEBAAEABAADgAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQIAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAP6AAAABgAAA/4ADgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAOAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAAAAQAAAP+AAAAAAAABAQAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAA/4AAAP6AAAD/gAAAAIAAAACABAAAAP8AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAAAACAIAAgAOAA4AAAwAJAAABAQEBAQEBAQEBAIADAAAA/QAAgAAAAgAAAP8AAAADgAAA/QAAAAKA/gAAAAEAAAABAAAAAAIAgACABAAEAAAbACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAD/gAAAAIAAAACAAAAAgAAA/4AAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4D/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAEAAAIABAADAAADAAABAQEBAAAEAAAA/AADAAAA/wAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/gAEAAAA/gAAAP+AAAD/gAAA/4AAAP+AAAAAAAABAAACAAIABAAAAwAAAQEBAQAAAgAAAP4ABAAAAP4AAAAAAAACAQAAgAOAA4AAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP8AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAACAAAAAgAAA/wAAAACAAIAAAACAAAADgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgP+AAAAAgAADAAAAAAQABAAACwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAGAAAD/gAAA/4AAAP+AAAD/gAAAAIACgAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgACAAIAAAP+AAAD+gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAAAYAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAA/oAAAP6AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgCAAIADgAQAAA8AHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAABAAAAAIAAAP+AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAgAAA/4AAAP8AAAD/AAAA/4AAAACABAAAAP+AAAAAgAAA/wAAAP+AAAAAgAAA/4AAAAEAAAD+gAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAABAAAAAAQAA4AACwAAAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD8AAAAAIAAAACAA4AAAP+AAAD/gAAA/YAAAAKAAAAAgAAAAAAAAQAAAAACAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAAAAAQIAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDgACAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQCAAIAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/oAAAAEAAAD/AAAAAYAAAACAAAAAgAAAAIAAAAAAACAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AUwBXAFsAXwBjAGcAawBvAHMAdwB7AH8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gPyAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/YAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D8gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gP2AAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/IAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAQAAAAAEAAQAAAsAAAEBAQEBAQEBAQEBAQAABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/oAEAAAA/oAAAP8AAAD/gAAA/4AAAP+AAAAAAAABAAABgAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAAAAAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP2AAAACAAAAAIAAAACAAAAAAAABAYAAAAQAAoAABQAAAQEBAQEBAYACgAAA/oAAAP8AAoAAAP8AAAD+gAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAAACgAAAAIAAAACAAAAAgAAA/AAEAAAA/wAAAP8AAAD/AAAA/wAAAAACAAAAAAQABAAAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAAAEAAAAEAAAA/4AAAP+AAAD/gAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAgAAAAIAAAP8A/wAAAAEAAAEBgAGABAAEAAAFAAABAQEBAQEBgAEAAAABgAAA/YAEAAAA/oAAAP8AAAAAAQAAAAACgAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD+AAAAAoAAAACAAAAAgAAAAAAAAQGAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQGAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAQAAAACAAAAAAAABAAABgAQABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAgAAAP2AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAABgAQAAoAAAwAAAQEBAQAABAAAAPwAAoAAAP8AAAAAAAABAYAAAAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPwAAAAAAAABAYAAAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAKAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD+AAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD9gAAAAgAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAgAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQAAAYACgAKAAAMAAAEBAQEAAAKAAAD9gAKAAAD/AAAAAAAAAQGAAAACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD9gAAAAAAAAQAAAYAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAABAAAAAIAAAAEAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAYACgAAA/AAAAACAAAAAgAAAAIAEAAAA/AAAAAEAAAABAAAAAQAAAAABAAAAAAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAA/oAAAAEAAAABAAAAAIAAAACABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAQAAAAEAAAD+gAAA/wAAAP+AAAD/gAAA/4AEAAAA/wAAAP8AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAABAAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAACgAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAABAAAAAIAAAAAAAAEAAAAABAAEAAAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQAAAAACgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD9gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAQAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAKAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAYACgAQAAAMAAAEBAQEBgAEAAAD/AAQAAAD9gAAAAAAAAQGAAYAEAAKAAAMAAAEBAQEBgAKAAAD9gAKAAAD/AAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAABAAAAAAQABAAAIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQGAAYACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD/AAAAAAAAAQAAAAAEAAKAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAAAAEAAAGAAoAEAAAFAAABAQEBAQEBgAEAAAD9gAAAAYAEAAAA/YAAAAEAAAAAAQAAAAACgAKAAAUAAAEBAQEBAQAAAoAAAP8AAAD+gAKAAAD9gAAAAYAAAAABAAAAAAQABAAAHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAQAAAACAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEBgAEAAAABgAAA/oAAAP8AAAD+gAAAAYAEAAAA/oAAAP8AAAD+gAAAAYAAAAEAAAAAAAABAAAAAAQAAoAABwAAAQEBAQEBAQEAAAQAAAD+gAAA/wAAAP6AAoAAAP8AAAD+gAAAAYAAAAAAAAEBgAAABAAEAAAHAAABAQEBAQEBAQGAAQAAAAGAAAD+gAAA/wAEAAAA/oAAAP8AAAD+gAAAAAAAAQAAAAACgAQAAAcAAAEBAQEBAQEBAYABAAAA/wAAAP6AAAABgAQAAAD8AAAAAYAAAAEAAAAAAAABAAABgAQABAAABwAAAQEBAQEBAQEBgAEAAAABgAAA/AAAAAGABAAAAP6AAAD/AAAAAQAAAAAAAAQBAAEAAwADAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAYABAAAA/wD/gACAAAD/gAGAAIAAAP+A/wABAAAA/wADAAAA/4AAAAAAAAD/AAAAAQAAAP8AAAAAAAAA/4AAAAACAIAAgAOAA4AACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADgAAA/4AAAP4AAAD/gAAAAIAAAAIAAAD/gP8AAAABAAACAAAAAAQABAAAEwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAgAAA/4AAAACAAAABAAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAAAIAAAAAgAAA/4D/gAAA/wAAAP+AAAAAgAAAAQAAAACAABAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP+AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4AEAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAQAAAAAAQABAAAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D8gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAwCAAIADgAQAABcAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAAEAAAD/AAAAAIAAAP+AAAABAAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAP+AAAAAgAAA/4AAAACAAAAEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAYAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAAAQCAAIADgAOAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP+AAAD/AAAA/4AAAP+AAAAAgAOAAAD/gAAA/wAAAP+AAAD/AAAAAQAAAACAAAABAAAAAAAAAgCAAIADgAOAAAMACQAAAQEBAQEBAQEBAQCAAwAAAP0AAYAAAP8AAAACAAAAA4AAAP0AAAACgP8AAAD/AAAAAgAAAAABAIAAgAOAA4AAAwAAAQEBAQCAAwAAAP0AA4AAAP0AAAAAAAACAIAAgAOAA4AAAwALAAABAQEBAQEBAQEBAQEAgAMAAAD9AACAAAACAAAA/4AAAP8AAAADgAAA/QAAAAKA/gAAAAIAAAD/AAAAAQAAAQAAAAAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAAAAgAAAACAAAAAAAABAQABAAMAAwAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAP+AAAD/AAAA/4AAAACAAwAAAP+AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAQAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAACAAAD/gAAA/4AAAAEAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+AAAAAIAAAAGAAAAAgAAA/gAAAAGAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgAAA/4AAAACA/4D/gAAAAIAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+gAAAAYAAAP4AAAAAgAAAAYAAAACAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgP+A/4AAAACAAAD/gAAAAIAABgCAAIAEAAQAABMAFwAbAB8AIwAnAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAAAAEAAAAAgAAAAAAAgAAA/oAAgAAA/4ACAACAAAD/gP4AAIAAAP+AAgAAgAAA/4AEAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAAAIAAAACAAAAAgAAA/4D/gAAAAIABAAAA/4AAAACAAAD/gAAA/oAAAP+AAAAAgAAA/4AAAAACAQAAgAOABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP+AAAD/gAAAAIAAAP+AAAD/gAAA/4AAAACAAAD/gAAAAQAAAP8A/4AAgAAA/4AEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAQABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYACgAAA/4AAAP+AAAD/gAAAAIAAAP+AAAD+gAAAAQAAAP8AAAABAAAAAIAAAP8A/wAAgAAA/4AEAAAA/gAAAAEAAAD/gAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAIAAAACAAAD+gAAA/wAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABAAAAAIAAAACAAAAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP+AAAAAgAAAAQAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAABAAAAAIAAAP+ABAAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABgAAA/4AAAACAAAAAAAABAIAAgAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACABAAAAP+AAAAAgAAA/4AAAP6AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAABgAAAAAAAAQCAAIAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAQAAAsAAAEBAQEBAQEBAQEBAQIAAYAAAP8AAAD/gAAA/wAAAACAAAAAgAQAAAD/AAAA/gAAAP+AAAABAAAAAIAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQGAAoAAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AAAP8AAAAAgAAAAIAEAAAA/QAAAP+AAAABAAAAAIAAAAEAAAD+AAAA/4AAAAEAAAAAgAAAAAAAAAAYASYAAQAAAAAAAAAIAAAAAQAAAAAAAQAIAAgAAQAAAAAAAgAHABAAAQAAAAAAAwAIABcAAQAAAAAABAAQAB8AAQAAAAAABQALAC8AAQAAAAAABgAIADoAAQAAAAAACQAJAEIAAQAAAAAACgA6AEsAAQAAAAAADQARAIUAAQAAAAAADgAyAJYAAQAAAAAAEwAMAMgAAwABBAkAAAAQANQAAwABBAkAAQAQAOQAAwABBAkAAgAOAPQAAwABBAkAAwAQAQIAAwABBAkABAAgARIAAwABBAkABQAWATIAAwABBAkABgAQAUgAAwABBAkACQASAVgAAwABBAkACgB0AWoAAwABBAkADQAiAd4AAwABBAkADgBkAgAAAwABBAkAEwAYAmQoYykgMjAyMlVyc2FGb250UmVndWxhclVyc2FGb250VXJzYUZvbnQgUmVndWxhclZlcnNpb24gMS4wVXJzYUZvbnRVcnNhRnJhbmtBbiBvcGVuIGxpY2VuY2UgZ2VuZXJhbCBwdXJwb3NlIHRleHRtb2RlIGZvbnQgYnkgVXJzYUZyYW5rQ0MwIDEuMCBVbml2ZXJzYWxodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wL0hlbGxvIFdvcmxkIQAoAGMAKQAgADIAMAAyADIAVQByAHMAYQBGAG8AbgB0AFIAZQBnAHUAbABhAHIAVQByAHMAYQBGAG8AbgB0AFUAcgBzAGEARgBvAG4AdAAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAFUAcgBzAGEARgBvAG4AdABVAHIAcwBhAEYAcgBhAG4AawBBAG4AIABvAHAAZQBuACAAbABpAGMAZQBuAGMAZQAgAGcAZQBuAGUAcgBhAGwAIABwAHUAcgBwAG8AcwBlACAAdABlAHgAdABtAG8AZABlACAAZgBvAG4AdAAgAGIAeQAgAFUAcgBzAGEARgByAGEAbgBrAEMAQwAwACAAMQAuADAAIABVAG4AaQB2AGUAcgBzAGEAbABoAHQAdABwAHMAOgAvAC8AYwByAGUAYQB0AGkAdgBlAGMAbwBtAG0AbwBuAHMALgBvAHIAZwAvAHAAdQBiAGwAaQBjAGQAbwBtAGEAaQBuAC8AegBlAHIAbwAvADEALgAwAC8ASABlAGwAbABvACAAVwBvAHIAbABkACEAAAADAAAAAAAAAGYAMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\r
|
|
983
|
+
const oA = `data:font/truetype;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMs+QEyQAAAEoAAAAYGNtYXAg7yVJAAAFjAAACSBnbHlmuHLTdAAAErQAAGi0aGVhZFvXdUwAAACsAAAANmhoZWELAQUCAAAA5AAAACRobXR4BACDgAAAAYgAAAQEbG9jYQAy54AAAA6sAAAECG1heHABIgCCAAABCAAAACBuYW1lVs/OSgAAe2gAAAOicG9zdABpADQAAH8MAAAAIAABAAAAAQAAzOWHqV8PPPUAAAQAAAAAAHxiGCcAAAAAfGIYJwAAAAAEAAQAAAAACAACAAEAAAAAAAEAAAQAAAAAAAQAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAEBAAEAAAEBAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAZAABQAEAgACAAAAAAACAAIAAAACAAAzAMwAAAAABAAAAAAAAACAAACLAABw4wAAAAAAAAAAWUFMLgBAACAmawQAAAAAAAQAAAAAAAFRAAAAAAMABAAAAAAgAAAEAAAABAAAAAQAAAAEAAGABAABAAQAAIAEAACABAAAgAQAAIAEAAGABAABAAQAAQAEAACABAABAAQAAIAEAACABAABAAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAAGABAAAgAQAAIAEAAGABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABgAQAAQAEAACABAAAAAQAAgAEAACABAAAgAQAAIAEAACABAACAAQAAAAEAAIABAABgAQAAgAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAAABAAAAAQAAAAEAAIABAADAAQAAAAEAAAABAAAgAQAAYAEAAAABAAAAAQAAIAEAAAA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AIAAAACA/YAAgAAAAIAAAP8AAoABAAAA/4AAAP+A/4AAgAAAAIAAAP8AA4AAAP8AAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAP+AAAD/gAAAAAAAAP8AAAAAgAAAAAAAAP+AAAD/gAAAAAAAAwCAAIAEAAQAABcAHQAjAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAACAAAAAgAAA/4AAAACAAAD9AAAA/4AAAACAAAD/gAAAAIAAgAAAAIAAAACAAAD/AAAAAQAAAP+AAAAEAAAA/4AAAP8AAAD/gAAAAIAAAP8AAAD/gAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAP+AAAD/gAAAAQD+gP8AAAAAgAAAAIAAAAABAYACgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAP6AAAAAAAABAQAAgAMABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/oAAAP+AAAD/gAAAAIAAAACAAAABgAAAAIAAAAAAAAEBAACAAwAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAAAgAAAAIAAAAGAAAAAgAAAAAAABQCAAYADgAQAAAMABwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAIAAAP+AAYAAgAAA/4D/AAEAAAABAAAA/wAAAP8AAAD/AAAAAQD/gACAAAD/gAGAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP+AAAAAAAABAQAAgAOAAwAACwAAAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAD/gAAA/wAAAAEAAwAAAP8AAAD/gAAA/wAAAAEAAAAAgAAAAAAAAQCAAAACAAGAAAcAAAEBAQEBAQEBAQABAAAA/4AAAP8AAAAAgAGAAAD/AAAA/4AAAACAAAAAAAABAIABgAOAAgAAAwAAAQEBAQCAAwAAAP0AAgAAAP+AAAAAAAABAQAAgAIAAYAAAwAAAQEBAQEAAQAAAP8AAYAAAP8AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAwCAAIADgAQAAAsAEQAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAD/gAAAAIAAgAAAAIAAAACAAAD/gAAA/4AAAAEAAAAEAAAA/4AAAP2AAAD/gAAAAIAAAAKAAAAAAP8AAAAAgAAAAID/AP+AAAD/AAAAAYAAAAABAIAAgAOABAAADQAAAQEBAQEBAQEBAQEBAQEBgAEAAAABAAAA/QAAAAEAAAD/AAAAAIAAAACABAAAAP0AAAD/gAAAAIAAAAGAAAAAgAAAAIAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAAAIAAAACAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAA/wAAAAEAAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/wAAAAEAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAA/4AAAACAAAAAAAABAIAAgAOABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAP+AAAABAAAAAQAAAP8AAAD+AAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAAEAAAD9gAAAAQAAAAGAAAAAgAAAAAEAgACAA4AEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP4AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/gAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAP+AAAABAAAAAAAAAgCAAIADgAQAABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAYAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAoAAAP6A/wAAAAEAAAEAgACAA4AEAAAPAAABAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AEAAAA/oAAAP+AAAD+gAAAAYAAAACAAAABAAAA/4AAAAAAAAMAgACAA4AEAAATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAACAAAD/gAAAAIAAgAAAAQAAAP8AAAABAAAABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAA/wAAAAEA/oD/AAAAAQAAAAACAIAAgAOABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD+gAAA/4AAAACAAIAAAAEAAAAEAAAA/4AAAP0AAAABAAAAAIAAAAGAAAAAAP6AAAABgAACAQABAAIAA4AAAwAHAAABAQEBAQEBAQEAAQAAAP8AAAABAAAA/wADgAAA/wAAAP+AAAD/AAAAAAIAgACAAgADgAADAAsAAAEBAQEBAQEBAQEBAQEAAQAAAP8AAAABAAAA/4AAAP8AAAAAgAOAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAABAQAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQKAAQAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAACAIABgAOAAwAAAwAHAAABAQEBAQEBAQCAAwAAAP0AAAADAAAA/QADAAAA/4AAAP+AAAD/gAAAAAEAgACAAwAEAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAIAgACAA4AEAAATABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP8AAAD/AAAAAIAAgAEAAAD/AAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAA/4AAAACAAAD+AAAA/wAAAAACAIAAgAOABAAAEQAVAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP6AAAAAgAAA/wAAAAGAAAD+AAAA/4AAAACAAgAAgAAA/4AEAAAA/4AAAP6AAAABAAAAAIAAAP2AAAD/gAAAAIAAAAKAAAD+AAAA/4AAAAAAAAIAgACAA4AEAAAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAAAIAAAACAAAD/AAAA/wAAAP8AAAAAgAAAAIAAAAAAAQAAAAQAAAD/gAAA/4AAAP2AAAABAAAA/wAAAAKAAAAAgAAA/4D/AAAAAQAAAwCAAIADgAQAAAsADwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAAAIAAAP+AAAD9gAEAAAABAAAA/wAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAADAP8AAAABAP6A/wAAAAEAAAAAAQCAAIADgAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAQAAAAEAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAACAIAAgAOABAAACwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAEAAAAAgAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAADAP2AAAAAgAAAAYAAAACAAAEAgACAA4AEAAAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/wAAAAEAAAABAAAA/4AAAP4AAAD/gAAAAIAEAAAA/4AAAP+AAAAAgAAA/wAAAP+AAAD/AAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAABAIAAgAOABAAACQAAAQEBAQEBAQEBAQCAAwAAAP4AAAABAAAA/wAAAP8ABAAAAP+AAAD/AAAA/4AAAP6AAAAAAQCAAIADgAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/4AAAAGAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAQAAAACAAAD+gAAA/4AAAACAAAACgAAAAAEAgACAA4AEAAALAAABAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP8AAAD/AAAA/wAEAAAA/gAAAAIAAAD8gAAAAQAAAP8AAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIADAAAA/wAAAAEAAAD9AAAAAQAAAP8ABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAAAAQCAAIAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAMAAAD/gAAA/4AAAP4AAAD/gAAAAQAAAAEAAAD+gAQAAAD/gAAA/YAAAP+AAAAAgAAAAQAAAP8AAAACgAAAAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAAEAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAQAAAD/AAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAAAAAQCAAIADgAQAAAUAAAEBAQEBAQCAAQAAAAIAAAD9AAQAAAD9AAAA/4AAAAABAIAAgAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8ABAAAAP+AAAD/gAAAAIAAAACAAAD8gAAAAgAAAP+AAAAAgAAA/gAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAEAAAA/4AAAP+AAAD/gAAAAYAAAPyAAAABAAAAAIAAAACAAAD+AAAAAAAAAgCAAIADgAQAAAsADwAAAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAD9gAAAAoAAAgCAAIADgAQAAAkADQAAAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP6AAAD/AAEAAAABAAAABAAAAP+AAAD+gAAA/4AAAP8AAAADAP6AAAABgAAAAAIAgACABAAEAAAPABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAD/gAAAAIAAAAQAAAD/gAAA/gAAAP8AAAAAgAAA/4AAAACAAAACgAAAAAD9gAAAAIAAAACAAAABgAACAIAAgAOABAAAEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AAQAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAwD/AAAAAQAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/oAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAAAAAAAQCAAIADgAQAAAcAAAEBAQEBAQEBAIADAAAA/wAAAP8AAAD/AAQAAAD/gAAA/QAAAAMAAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAP+ABAAAAP0AAAADAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIADgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAD/gAAA/wAAAP+AAAD/gAQAAAD+AAAAAgAAAP4AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAIAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAQAAAP8AAAD/gAAA/4AAAP+AAAD/AAQAAAD+AAAAAIAAAP+AAAACAAAA/IAAAACAAAAAgAAA/4AAAP+AAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/AAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP8AAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAA/wAAAAEAAAAAgAAAAIAAAACAAAAAAAABAIAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAACAAAAAAAABAIAAgAOABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/gAAA/4AAAAIAAAD9AAAAAIAAAACAAAAAgAAAAIAAAP4ABAAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/wAAAAEAAAD+AAQAAAD/gAAA/YAAAP+AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/gAAAAEAAAD/AAQAAAD8gAAAAIAAAAKAAAAAAAABAIACAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAEAAAMAAAEBAQEAgAMAAAD9AAEAAAD/gAAAAAAAAQEAAoACgAQAAAkAAAEBAQEBAQEBAQEBAAEAAAAAgAAA/4AAAP+AAAD/gAQAAAD/gAAA/wAAAACAAAAAgAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQACgAAA/4AAAP+AAAD/AAAAAQAAAP6AAAD/gAAAAIADAAAA/YAAAACAAAABgAAA/oAAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/gAAA/YABAAAAAQAAAAQAAAD/AAAA/4AAAP6AAAD/gAAAAgD+gAAAAYAAAAABAIAAgAOAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAAAQAAAP+AAAD+AAAA/4AAAACAAwAAAP+AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAoABAAAA/YAAAP+AAAAAgAAAAYD/AAAAAQAAAAQAAAD8gAAAAIAAAAGAAAAAgAAA/4D+gAAAAYAAAAACAIAAgAOAAwAADQARAAABAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/gAAAAGAAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP8AAAD/gAAA/4AAAACAAAABgAAAAAD/gAAAAIAAAAABAQAAgAOAA4AACwAAAQEBAQEBAQEBAQEBAYACAAAA/oAAAAEAAAD/AAAA/wAAAACAA4AAAP+AAAD/AAAA/4AAAP8AAAACgAAAAAAAAgCAAIADgAOAAA8AEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAABgAAA/oAAAP+AAAAAgACAAAABAAAAA4AAAP+AAAD+AAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAAP8AAAABAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/AAAA/wAAAP8ABAAAAP8AAAD/gAAA/gAAAAIAAAD+AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP+AAAD/gAAA/YAAAAACAIAAgAOABAAAAwAPAAABAQEBAQEBAQEBAQEBAQEBAoABAAAA/wAAAAEAAAD/gAAA/gAAAP+AAAABAAAAAQAEAAAA/4AAAP+AAAD+AAAA/4AAAACAAAABAAAA/wAAAAABAIAAgAOAA4AAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAQAAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AA4AAAP8AAAAAgAAA/4AAAP8AAAD/gAAA/4AAAACAAAAAgAAA/wAAAAAAAAEBgACAAwAEAAAHAAABAQEBAQEBAQGAAQAAAACAAAD/AAAA/4AEAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIAEAAMAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAMAAAD/gAAAAIAAAP+AAAD+AAAAAYAAAP+AAAAAgAAA/oAAAAIAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAABAAAAAIAAAP8AAAD/gAAA/4AAAP8AAwAAAP+AAAAAgAAA/4AAAP4AAAABgAAA/4AAAP8AAAAAAAACAIAAgAOAAwAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP6AAAD/gAAAAIAAAAGAAAAAAP6AAAABgAACAIAAgAOAAwAACQANAAABAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAA/oAAAP8AAQAAAAEAAAADAAAA/4AAAP+AAAD/gAAA/wAAAAIA/4AAAACAAAAAAgCAAIAEAAMAAA0AEQAAAQEBAQEBAQEBAQEBAQEBAQEBAQACgAAAAIAAAP+AAAD/AAAA/oAAAP+AAAAAgACAAAABAAAAAwAAAP6AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAA/4AAAACAAAAAAQEAAIADgAMAAAkAAAEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP+AAAD/AAMAAAD/gAAA/wAAAAEAAAD+AAAAAAEAgACABAADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP6AAAABgAAAAIAAAP+AAAD9AAAAAgAAAP6AAAD/gAAAAIADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAP8AAAAAgAAAAQAAAP+AAAD+gAAA/4AAAP+AAAAAgAOAAAD/gAAA/4AAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAQAAAP+AAAD/gAAA/oAAAP+AAwAAAP4AAAAAgAAAAYAAAP2AAAAAgAAA/4AAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+AAwAAAP6AAAABgAAA/oAAAP+AAAD/gAAAAIAAAACAAAAAAAABAIAAgAQAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/4AAAP8AAAD/gAAA/wAAAP+AAwAAAP6AAAAAgAAA/4AAAAGAAAD+AAAA/4AAAACAAAD/gAAAAIAAAAAAAAEAgACAA4ADAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP8AAAD/AAAAAIAAAACAAAD/gAAA/4ADAAAA/4AAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAAGAAAD+gAAA/4ADAAAA/wAAAAEAAAD+AAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP+AAAD/gAAA/4AAAAGAAAD9AAAAAIAAAACAAAAAgAAA/oADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAA/wAAAP+AAAAAgAAAAQAAAP6AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAAABAYAAgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPyAAAAAAAABAQAAgAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAGAAAAAgAAAAIAAAP+AAAD/gAAA/oAAAAEAAAAAgAAA/4AAAP8ABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAAAAEAgAGAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAACAAAD/gAAA/wAAAP8AAAD/gAAAAIADAAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAYAAAAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAAA/wAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAABAAAAAQAAAACAAAAAgAAAAAAAAQIAAAAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD8AAAAAAAAAgCAAIADgAQAABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP8AAAABAAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAA/wAAAACAAAAAgAGAAIAAAP+ABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAAAAAAAP+AAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAAAgAAA/wAAAAEAAAD/AAAA/wAAAP8AAAABAAAA/wAAAACAAAD/gAQAAAD+gAAAAYAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABACAAIAEAAQAABcAGwAfACMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP4AAAABgAAAAIAAAACAAAD/gAAA/YAAAAIAAAD+gAAA/4AAAP+AAAAAgAEAAAAAgAAAAQAAgAAA/4D9AACAAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAACAAAAAgAAAAQAAAP8A/4AAAACAAQAAAP+AAAD+gAAA/4AAAAAEAIAAgAQAA4AAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAQIAAAAEAAQAAAkAAAEBAQEBAQEBAQEDgACAAAD+AAAAAIAAAACAAAAAgAQAAAD8AAAAAQAAAAEAAAABAAAAAAgAAAAABAAEAAADAAcACwAPABMAFwAbAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAA/wACAAEAAAD/AP8AAQAAAP8AAgABAAAA/wD9AAEAAAD/AAIAAQAAAP8A/wABAAAA/wACAAEAAAD/AAQAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQIAAAADAAQAAAMAAAEBAQECAAEAAAD/AAQAAAD8AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP6AAAD/gAAA/oAAAAABAgAAAAQAAgAAAwAAAQEBAQIAAgAAAP4AAgAAAP4AAAAAAAAEAIAAAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+ABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAAABAAAAPwAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAoABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAD/gAOAAAD+AAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAA/wAAAAEAAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAAAEAAAA/gAAAP+AAAD/gAAA/4AAAP+ABAAAAPwAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIAEAAOAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAOAAAD/gAAAAIAAAP8AAAABAAAA/oAAAAGAAAD9AAAAAIAAAP+AAAABAAAA/wAAAAGAAAD+gAAAAAAAAQAAAAACAAQAAAkAAAEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD+AAQAAAD/AAAA/wAAAP8AAAD/AAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQKAAYAAAP8AAAD/AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAEAAAA/wAAAP+AAAD/gAAA/wAAAP8AAAABgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD8AAAAAIAAAACAAAAAgAIAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgAAAAAEAAQAAAMABwAAAQEBAQEBAQEAAAIAAAD+AAIAAgAAAP4ABAAAAP4AAAAAAAAA/gAAAAAEAAACAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8ABAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAABAIAAAAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQECAAEAAAD/AAEAAQAAAP8A/wABAAAA/wABAAEAAAD/AAQAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAEDAAAABAAEAAADAAABAQEBAwABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD9AAAA/wAEAAAA/wAAAP0AAAAAAQAAAAABAAQAAAMAAAEBAQEAAAEAAAD/AAQAAAD8AAAAAAAAAwCAAIADAAOAAAMABwALAAABAQEBAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AAQAAgAAA/4ADgAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAAABAYABgAQABAAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAAEAAAD+gAAA/4AAAP+ABAAAAP8AAAD/gAAA/wAAAACAAAAAgAAAAAAAAQAAAYACgAQAAAsAAAEBAQEBAQEBAQEBAQGAAQAAAP+AAAD/gAAA/oAAAAEAAAAAgAQAAAD+gAAA/4AAAP+AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAwABAAAA/AAAAAEAAAABAAAAAQAEAAAA/AAAAAKAAAAAgAAAAIAAAAABAIAAgAMABAAACwAAAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP0AAAD/gAAAAIAAAAEAAAAAgAAAAAAAAQAAAAAEAAQAAAUAAAEBAQEBAQAAAQAAAAMAAAD8AAQAAAD9AAAA/wAAAAACAIAAgAMAAoAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQABgAAAAIAAAP+AAAD+gAAAAQAAAP8A/4AAgAAA/4ACgAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAMABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAABAAAA/wAAAAEA/oAAgAAA/4AEAAAA/QAAAP+AAAAAgAAAAQAAAACAAAD/gAAA/wAAAAABAIAAgAQABAAADQAAAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP+AAAD9gAAA/4AAAACAAAABAAAAAIAAAAACAAAAAAQABAAAAwAHAAABAQEBAQEBAQAABAAAAPwAAQAAAAIAAAAEAAAA/AAAAAMA/gAAAAIAAAEAgACABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAD/gAAA/oAAAP+AAAAAgAAAAQAEAAAA/4AAAP+AAAD/gAAA/oAAAP+AAAAAgAAAAQAAAACAAAAAAQAAAAACgAKAAAsAAAEBAQEBAQEBAQEBAQAAAYAAAACAAAAAgAAA/wAAAP+AAAD/AAKAAAD/gAAA/4AAAP6AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD/AAAA/QAEAAAA/AAAAAMAAAAAAQCAAIAEAAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAABAAAA/wAAAP+AAAD+gAAA/4AAAACAAAABAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAAEAAAAAgAAAAAEBgAAABAACgAALAAABAQEBAQEBAQEBAQECgAGAAAD/AAAA/4AAAP8AAAAAgAAAAIACgAAA/wAAAP+AAAD/AAAAAYAAAACAAAAAAAABAAAAAAQABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAPwABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAABAAADAAABAQEBAAAEAAAA/AABAAAA/wAAAAAAAAEAAAAABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQEDgACAAAD8AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAEAAAA/AAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAQAAAgAEAAQAAAMAAAEBAQEAAAQAAAD8AAQAAAD+AAAAAAAAAgCAAIACAAOAAAMABwAAAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAAEAIAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAABAAAAPyAAAADAP+AAAAAgP8A/4AAAACA/wD/gAAAAIAAAQAAAAAEAAQAAAUAAAEBAQEBAQMAAQAAAPwAAAADAAQAAAD8AAAAAQAAAAACAIAAgAQABAAAAwAHAAABAQEBAQEBAQCAA4AAAPyAAYAAAACAAAAEAAAA/IAAAAIA/4AAAACAAAMAgACABAAEAAADAAcACwAAAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgP4A/4AAAACAAAAABAAAAIAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD8AAAABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAYAgACABAAEAAADAAcACwAPABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/oAAAACAAAD+gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAID/AP+AAAAAgAAA/4AAAACAAAEAgACAAQADgAADAAABAQEBAIAAgAAA/4ADgAAA/QAAAAAAAAUAgACABAAEAAADAAcACwAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/YAAAACAAAABgAAAAIAAAAQAAAD8gAAAAwD/gAAAAIAAAP+AAAAAgP4A/4AAAACAAAD/gAAAAIAAAAABAAADAAQABAAAAwAAAQEBAQAABAAAAPwABAAAAP8AAAAAAAAHAIAAgAQABAAAAwAHAAsADwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAABgAAAAIAAAP2AAAAAgAAAAYAAAACAAAD9gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAIAAAP+AAAAAgP8A/4AAAACAAAD/gAAAAIAAAAAEAAAAAAQAAgAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8AAgAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQAAAAAEAAQAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAQAAAD/gAAA/4AAAP+AAAD9gAAAAAEBAAAAAgAEAAADAAABAQEBAQABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQECgAGAAAD8AAAAAIAAAACAAAAAgAAAAQAEAAAA/AAAAAGAAAABAAAAAIAAAACAAAAAAAABAAABAAQAAgAAAwAAAQEBAQAABAAAAPwAAgAAAP8AAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAgACAAAA/AAAAACAAAAAgAAAAIAAAACABAAAAPwAAAACAAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEDAAEAAAD8AAAAAQAAAAEAAAABAAIAAAD+AAAAAIAAAACAAAAAgAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAIAAAAAgAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/4AAAP4AAAAAAAADAAAAAAQABAAAGwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAIAAYAAAACAAAD/gAAA/4AAAP+AAAD/gP4AAIAAAACAAAAAgAAAAIAAAP6AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAQAAAP+AAAD+gAAAAIAAAACAAAAAgAAA/oAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAIAAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAGAAAABAAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAAAAAAEAAAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAYAAAP6AAgABgAAA/oD9gAGAAAD+gAIAAYAAAP6ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAP6AAAAAAQIAAgAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD+AAAAAAAABACAAIAEAAQAAAMABwAjACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8A/gAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4ABgACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAAAAA/wAAAP+AAAD/gAAAAIAAAACAAAABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAGAAAD/gAAAAAQAAAAABAAEAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ADgACAAAD/gPyAAIAAAP+AA4AAgAAA/4AEAAAA/4AAAACAAAD/gAAA/QAAAP+AAAAAgAAA/4AAAAABAAAAAAIAAgAAAwAAAQEBAQAAAgAAAP4AAgAAAP4AAAAAAAAEAAAAAAIABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAQABAAAA/wD/AAEAAAD/AAEAAQAAAP8ABAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAQCAAQADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAAGAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAOAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAAAABAQABAAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAACAAAD+gAAAAYAAAP+AAAABAAAAAIAAAAAAAAEBAAEABAADgAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQIAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAP6AAAABgAAA/4ADgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAOAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAAAAQAAAP+AAAAAAAABAQAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAA/4AAAP6AAAD/gAAAAIAAAACABAAAAP8AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAAAACAIAAgAOAA4AAAwAJAAABAQEBAQEBAQEBAIADAAAA/QAAgAAAAgAAAP8AAAADgAAA/QAAAAKA/gAAAAEAAAABAAAAAAIAgACABAAEAAAbACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAD/gAAAAIAAAACAAAAAgAAA/4AAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4D/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAEAAAIABAADAAADAAABAQEBAAAEAAAA/AADAAAA/wAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/gAEAAAA/gAAAP+AAAD/gAAA/4AAAP+AAAAAAAABAAACAAIABAAAAwAAAQEBAQAAAgAAAP4ABAAAAP4AAAAAAAACAQAAgAOAA4AAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP8AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAACAAAAAgAAA/wAAAACAAIAAAACAAAADgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgP+AAAAAgAADAAAAAAQABAAACwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAGAAAD/gAAA/4AAAP+AAAD/gAAAAIACgAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgACAAIAAAP+AAAD+gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAAAYAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAA/oAAAP6AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgCAAIADgAQAAA8AHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAABAAAAAIAAAP+AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAgAAA/4AAAP8AAAD/AAAA/4AAAACABAAAAP+AAAAAgAAA/wAAAP+AAAAAgAAA/4AAAAEAAAD+gAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAABAAAAAAQAA4AACwAAAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD8AAAAAIAAAACAA4AAAP+AAAD/gAAA/YAAAAKAAAAAgAAAAAAAAQAAAAACAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAAAAAQIAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDgACAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQCAAIAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/oAAAAEAAAD/AAAAAYAAAACAAAAAgAAAAIAAAAAAACAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AUwBXAFsAXwBjAGcAawBvAHMAdwB7AH8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gPyAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/YAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D8gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gP2AAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/IAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAQAAAAAEAAQAAAsAAAEBAQEBAQEBAQEBAQAABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/oAEAAAA/oAAAP8AAAD/gAAA/4AAAP+AAAAAAAABAAABgAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAAAAAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP2AAAACAAAAAIAAAACAAAAAAAABAYAAAAQAAoAABQAAAQEBAQEBAYACgAAA/oAAAP8AAoAAAP8AAAD+gAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAAACgAAAAIAAAACAAAAAgAAA/AAEAAAA/wAAAP8AAAD/AAAA/wAAAAACAAAAAAQABAAAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAAAEAAAAEAAAA/4AAAP+AAAD/gAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAgAAAAIAAAP8A/wAAAAEAAAEBgAGABAAEAAAFAAABAQEBAQEBgAEAAAABgAAA/YAEAAAA/oAAAP8AAAAAAQAAAAACgAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD+AAAAAoAAAACAAAAAgAAAAAAAAQGAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQGAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAQAAAACAAAAAAAABAAABgAQABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAgAAAP2AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAABgAQAAoAAAwAAAQEBAQAABAAAAPwAAoAAAP8AAAAAAAABAYAAAAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPwAAAAAAAABAYAAAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAKAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD+AAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD9gAAAAgAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAgAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQAAAYACgAKAAAMAAAEBAQEAAAKAAAD9gAKAAAD/AAAAAAAAAQGAAAACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD9gAAAAAAAAQAAAYAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAABAAAAAIAAAAEAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAYACgAAA/AAAAACAAAAAgAAAAIAEAAAA/AAAAAEAAAABAAAAAQAAAAABAAAAAAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAA/oAAAAEAAAABAAAAAIAAAACABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAQAAAAEAAAD+gAAA/wAAAP+AAAD/gAAA/4AEAAAA/wAAAP8AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAABAAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAACgAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAABAAAAAIAAAAAAAAEAAAAABAAEAAAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQAAAAACgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD9gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAQAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAKAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAYACgAQAAAMAAAEBAQEBgAEAAAD/AAQAAAD9gAAAAAAAAQGAAYAEAAKAAAMAAAEBAQEBgAKAAAD9gAKAAAD/AAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAABAAAAAAQABAAAIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQGAAYACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD/AAAAAAAAAQAAAAAEAAKAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAAAAEAAAGAAoAEAAAFAAABAQEBAQEBgAEAAAD9gAAAAYAEAAAA/YAAAAEAAAAAAQAAAAACgAKAAAUAAAEBAQEBAQAAAoAAAP8AAAD+gAKAAAD9gAAAAYAAAAABAAAAAAQABAAAHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAQAAAACAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEBgAEAAAABgAAA/oAAAP8AAAD+gAAAAYAEAAAA/oAAAP8AAAD+gAAAAYAAAAEAAAAAAAABAAAAAAQAAoAABwAAAQEBAQEBAQEAAAQAAAD+gAAA/wAAAP6AAoAAAP8AAAD+gAAAAYAAAAAAAAEBgAAABAAEAAAHAAABAQEBAQEBAQGAAQAAAAGAAAD+gAAA/wAEAAAA/oAAAP8AAAD+gAAAAAAAAQAAAAACgAQAAAcAAAEBAQEBAQEBAYABAAAA/wAAAP6AAAABgAQAAAD8AAAAAYAAAAEAAAAAAAABAAABgAQABAAABwAAAQEBAQEBAQEBgAEAAAABgAAA/AAAAAGABAAAAP6AAAD/AAAAAQAAAAAAAAQBAAEAAwADAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAYABAAAA/wD/gACAAAD/gAGAAIAAAP+A/wABAAAA/wADAAAA/4AAAAAAAAD/AAAAAQAAAP8AAAAAAAAA/4AAAAACAIAAgAOAA4AACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADgAAA/4AAAP4AAAD/gAAAAIAAAAIAAAD/gP8AAAABAAACAAAAAAQABAAAEwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAgAAA/4AAAACAAAABAAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAAAIAAAAAgAAA/4D/gAAA/wAAAP+AAAAAgAAAAQAAAACAABAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP+AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4AEAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAQAAAAAAQABAAAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D8gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAwCAAIADgAQAABcAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAAEAAAD/AAAAAIAAAP+AAAABAAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAP+AAAAAgAAA/4AAAACAAAAEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAYAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAAAQCAAIADgAOAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP+AAAD/AAAA/4AAAP+AAAAAgAOAAAD/gAAA/wAAAP+AAAD/AAAAAQAAAACAAAABAAAAAAAAAgCAAIADgAOAAAMACQAAAQEBAQEBAQEBAQCAAwAAAP0AAYAAAP8AAAACAAAAA4AAAP0AAAACgP8AAAD/AAAAAgAAAAABAIAAgAOAA4AAAwAAAQEBAQCAAwAAAP0AA4AAAP0AAAAAAAACAIAAgAOAA4AAAwALAAABAQEBAQEBAQEBAQEAgAMAAAD9AACAAAACAAAA/4AAAP8AAAADgAAA/QAAAAKA/gAAAAIAAAD/AAAAAQAAAQAAAAAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAAAAgAAAACAAAAAAAABAQABAAMAAwAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAP+AAAD/AAAA/4AAAACAAwAAAP+AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAQAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAACAAAD/gAAA/4AAAAEAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+AAAAAIAAAAGAAAAAgAAA/gAAAAGAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgAAA/4AAAACA/4D/gAAAAIAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+gAAAAYAAAP4AAAAAgAAAAYAAAACAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgP+A/4AAAACAAAD/gAAAAIAABgCAAIAEAAQAABMAFwAbAB8AIwAnAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAAAAEAAAAAgAAAAAAAgAAA/oAAgAAA/4ACAACAAAD/gP4AAIAAAP+AAgAAgAAA/4AEAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAAAIAAAACAAAAAgAAA/4D/gAAAAIABAAAA/4AAAACAAAD/gAAA/oAAAP+AAAAAgAAA/4AAAAACAQAAgAOABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP+AAAD/gAAAAIAAAP+AAAD/gAAA/4AAAACAAAD/gAAAAQAAAP8A/4AAgAAA/4AEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAQABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYACgAAA/4AAAP+AAAD/gAAAAIAAAP+AAAD+gAAAAQAAAP8AAAABAAAAAIAAAP8A/wAAgAAA/4AEAAAA/gAAAAEAAAD/gAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAIAAAACAAAD+gAAA/wAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABAAAAAIAAAACAAAAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP+AAAAAgAAAAQAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAABAAAAAIAAAP+ABAAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABgAAA/4AAAACAAAAAAAABAIAAgAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACABAAAAP+AAAAAgAAA/4AAAP6AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAABgAAAAAAAAQCAAIAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAQAAAsAAAEBAQEBAQEBAQEBAQIAAYAAAP8AAAD/gAAA/wAAAACAAAAAgAQAAAD/AAAA/gAAAP+AAAABAAAAAIAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQGAAoAAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AAAP8AAAAAgAAAAIAEAAAA/QAAAP+AAAABAAAAAIAAAAEAAAD+AAAA/4AAAAEAAAAAgAAAAAAAAAAYASYAAQAAAAAAAAAIAAAAAQAAAAAAAQAIAAgAAQAAAAAAAgAHABAAAQAAAAAAAwAIABcAAQAAAAAABAAQAB8AAQAAAAAABQALAC8AAQAAAAAABgAIADoAAQAAAAAACQAJAEIAAQAAAAAACgA6AEsAAQAAAAAADQARAIUAAQAAAAAADgAyAJYAAQAAAAAAEwAMAMgAAwABBAkAAAAQANQAAwABBAkAAQAQAOQAAwABBAkAAgAOAPQAAwABBAkAAwAQAQIAAwABBAkABAAgARIAAwABBAkABQAWATIAAwABBAkABgAQAUgAAwABBAkACQASAVgAAwABBAkACgB0AWoAAwABBAkADQAiAd4AAwABBAkADgBkAgAAAwABBAkAEwAYAmQoYykgMjAyMlVyc2FGb250UmVndWxhclVyc2FGb250VXJzYUZvbnQgUmVndWxhclZlcnNpb24gMS4wVXJzYUZvbnRVcnNhRnJhbmtBbiBvcGVuIGxpY2VuY2UgZ2VuZXJhbCBwdXJwb3NlIHRleHRtb2RlIGZvbnQgYnkgVXJzYUZyYW5rQ0MwIDEuMCBVbml2ZXJzYWxodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wL0hlbGxvIFdvcmxkIQAoAGMAKQAgADIAMAAyADIAVQByAHMAYQBGAG8AbgB0AFIAZQBnAHUAbABhAHIAVQByAHMAYQBGAG8AbgB0AFUAcgBzAGEARgBvAG4AdAAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAFUAcgBzAGEARgBvAG4AdABVAHIAcwBhAEYAcgBhAG4AawBBAG4AIABvAHAAZQBuACAAbABpAGMAZQBuAGMAZQAgAGcAZQBuAGUAcgBhAGwAIABwAHUAcgBwAG8AcwBlACAAdABlAHgAdABtAG8AZABlACAAZgBvAG4AdAAgAGIAeQAgAFUAcgBzAGEARgByAGEAbgBrAEMAQwAwACAAMQAuADAAIABVAG4AaQB2AGUAcgBzAGEAbABoAHQAdABwAHMAOgAvAC8AYwByAGUAYQB0AGkAdgBlAGMAbwBtAG0AbwBuAHMALgBvAHIAZwAvAHAAdQBiAGwAaQBjAGQAbwBtAGEAaQBuAC8AegBlAHIAbwAvADEALgAwAC8ASABlAGwAbABvACAAVwBvAHIAbABkACEAAAADAAAAAAAAAGYAMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\r
|
|
1067
984
|
`;
|
|
1068
|
-
class
|
|
985
|
+
class nA {
|
|
1069
986
|
/**
|
|
1070
987
|
* Extracts all available characters from a font's cmap tables.
|
|
1071
988
|
* @param font The parsed font object from Typr
|
|
@@ -1116,9 +1033,9 @@ class cA {
|
|
|
1116
1033
|
return e;
|
|
1117
1034
|
for (let t = 0; t < A.groups.length; t += 3) {
|
|
1118
1035
|
const r = A.groups[t], i = A.groups[t + 1], s = A.groups[t + 2];
|
|
1119
|
-
for (let
|
|
1120
|
-
if (s + (
|
|
1121
|
-
const B = String.fromCodePoint(
|
|
1036
|
+
for (let a = r; a <= i; a++)
|
|
1037
|
+
if (s + (a - r) > 0) {
|
|
1038
|
+
const B = String.fromCodePoint(a);
|
|
1122
1039
|
e.push(B);
|
|
1123
1040
|
}
|
|
1124
1041
|
}
|
|
@@ -1162,15 +1079,15 @@ class cA {
|
|
|
1162
1079
|
return !(e >= 0 && e <= 31 && e !== 9 && e !== 10 && e !== 13 || e >= 127 && e <= 159);
|
|
1163
1080
|
}
|
|
1164
1081
|
}
|
|
1165
|
-
class
|
|
1082
|
+
class gA {
|
|
1166
1083
|
/**
|
|
1167
1084
|
* Creates a new TextureAtlasCreation instance.
|
|
1168
1085
|
* @param renderer The WebGL renderer instance
|
|
1169
1086
|
*/
|
|
1170
1087
|
constructor(A) {
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1088
|
+
o(this, "_textureCanvas");
|
|
1089
|
+
o(this, "_textureContext");
|
|
1090
|
+
o(this, "_renderer");
|
|
1174
1091
|
this._renderer = A, this._textureCanvas = document.createElement("canvas"), this._textureContext = this._textureCanvas.getContext("2d", { willReadFrequently: !0, alpha: !1 });
|
|
1175
1092
|
}
|
|
1176
1093
|
/**
|
|
@@ -1182,13 +1099,13 @@ class uA {
|
|
|
1182
1099
|
* @returns Object containing framebuffer, columns, and rows
|
|
1183
1100
|
*/
|
|
1184
1101
|
createTextureAtlas(A, e, t, r) {
|
|
1185
|
-
const i = A.length, s = Math.ceil(Math.sqrt(i)),
|
|
1102
|
+
const i = A.length, s = Math.ceil(Math.sqrt(i)), a = Math.ceil(i / s), g = e.width * s, B = e.height * a;
|
|
1186
1103
|
this._setupCanvas(g, B, t, r), this._renderCharactersToCanvas(A, e, s, t), this._applyBlackWhiteThreshold();
|
|
1187
1104
|
const E = this._renderer.createFramebuffer(g, B, { filter: "nearest" });
|
|
1188
1105
|
return E.update(this._textureCanvas), {
|
|
1189
1106
|
framebuffer: E,
|
|
1190
1107
|
columns: s,
|
|
1191
|
-
rows:
|
|
1108
|
+
rows: a
|
|
1192
1109
|
};
|
|
1193
1110
|
}
|
|
1194
1111
|
/**
|
|
@@ -1212,7 +1129,7 @@ class uA {
|
|
|
1212
1129
|
*/
|
|
1213
1130
|
_renderCharactersToCanvas(A, e, t, r) {
|
|
1214
1131
|
for (let i = 0; i < A.length; i++) {
|
|
1215
|
-
const s = i % t,
|
|
1132
|
+
const s = i % t, a = Math.floor(i / t), g = s * e.width + e.width * 0.5, B = a * e.height + e.height * 0.5, E = Math.round(g - e.width * 0.5), h = Math.round(B - r * 0.5);
|
|
1216
1133
|
this._textureContext.fillText(A[i].character, E, h);
|
|
1217
1134
|
}
|
|
1218
1135
|
}
|
|
@@ -1225,19 +1142,19 @@ class uA {
|
|
|
1225
1142
|
_applyBlackWhiteThreshold(A = 128) {
|
|
1226
1143
|
const e = this._textureContext.getImageData(0, 0, this._textureCanvas.width, this._textureCanvas.height), t = e.data;
|
|
1227
1144
|
for (let r = 0; r < t.length; r += 4) {
|
|
1228
|
-
const i = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2], s = A + 32,
|
|
1229
|
-
t[r] =
|
|
1145
|
+
const i = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2], s = A + 32, a = i > s ? 255 : 0;
|
|
1146
|
+
t[r] = a, t[r + 1] = a, t[r + 2] = a;
|
|
1230
1147
|
}
|
|
1231
1148
|
this._textureContext.putImageData(e, 0, 0);
|
|
1232
1149
|
}
|
|
1233
1150
|
}
|
|
1234
|
-
class
|
|
1151
|
+
class BA {
|
|
1235
1152
|
/**
|
|
1236
1153
|
* Creates a new MetricsCalculation instance.
|
|
1237
1154
|
*/
|
|
1238
1155
|
constructor() {
|
|
1239
|
-
|
|
1240
|
-
|
|
1156
|
+
o(this, "_tempCanvas");
|
|
1157
|
+
o(this, "_tempContext");
|
|
1241
1158
|
this._tempCanvas = document.createElement("canvas"), this._tempContext = this._tempCanvas.getContext("2d");
|
|
1242
1159
|
}
|
|
1243
1160
|
/**
|
|
@@ -1252,7 +1169,7 @@ class dA {
|
|
|
1252
1169
|
this._tempContext.font = `${e}px ${t}`;
|
|
1253
1170
|
let r = 0, i = 0;
|
|
1254
1171
|
for (const s of A) {
|
|
1255
|
-
const
|
|
1172
|
+
const a = this._tempContext.measureText(s), g = a.width, B = a.actualBoundingBoxAscent + a.actualBoundingBoxDescent;
|
|
1256
1173
|
g > 0 && (r = Math.max(r, g), i = Math.max(i, B));
|
|
1257
1174
|
}
|
|
1258
1175
|
return {
|
|
@@ -1261,7 +1178,7 @@ class dA {
|
|
|
1261
1178
|
};
|
|
1262
1179
|
}
|
|
1263
1180
|
}
|
|
1264
|
-
class
|
|
1181
|
+
class EA {
|
|
1265
1182
|
/**
|
|
1266
1183
|
* Creates TextmodeCharacter objects with unique color assignments.
|
|
1267
1184
|
* @param characters Array of character strings
|
|
@@ -1271,16 +1188,16 @@ class fA {
|
|
|
1271
1188
|
createCharacterObjects(A, e) {
|
|
1272
1189
|
return A.map((t, r) => {
|
|
1273
1190
|
const i = t.codePointAt(0) || 0, s = this._generateCharacterColor(r);
|
|
1274
|
-
let
|
|
1191
|
+
let a = 0;
|
|
1275
1192
|
if (e.hmtx && e.hmtx.aWidth) {
|
|
1276
1193
|
const g = this._getGlyphIndex(e, i);
|
|
1277
|
-
g > 0 && e.hmtx.aWidth[g] !== void 0 && (
|
|
1194
|
+
g > 0 && e.hmtx.aWidth[g] !== void 0 && (a = e.hmtx.aWidth[g]);
|
|
1278
1195
|
}
|
|
1279
1196
|
return {
|
|
1280
1197
|
character: t,
|
|
1281
1198
|
unicode: i,
|
|
1282
1199
|
color: s,
|
|
1283
|
-
advanceWidth:
|
|
1200
|
+
advanceWidth: a
|
|
1284
1201
|
};
|
|
1285
1202
|
});
|
|
1286
1203
|
}
|
|
@@ -1303,9 +1220,9 @@ class fA {
|
|
|
1303
1220
|
{
|
|
1304
1221
|
const s = r.idRangeOffset[i] / 2 + (e - r.startCount[i]) - (r.startCount.length - i);
|
|
1305
1222
|
if (s >= 0 && s < r.glyphIdArray.length) {
|
|
1306
|
-
const
|
|
1307
|
-
if (
|
|
1308
|
-
return
|
|
1223
|
+
const a = r.glyphIdArray[s];
|
|
1224
|
+
if (a !== 0)
|
|
1225
|
+
return a + r.idDelta[i] & 65535;
|
|
1309
1226
|
}
|
|
1310
1227
|
}
|
|
1311
1228
|
}
|
|
@@ -1328,7 +1245,7 @@ class fA {
|
|
|
1328
1245
|
* @returns RGB color as a tuple [r, g, b], or [0, 0, 0] if not found
|
|
1329
1246
|
*/
|
|
1330
1247
|
getCharacterColor(A, e) {
|
|
1331
|
-
if (!
|
|
1248
|
+
if (!d.validate(
|
|
1332
1249
|
typeof A == "string" && A.length === 1,
|
|
1333
1250
|
"Character must be a single character string.",
|
|
1334
1251
|
{ method: "getCharacterColor", providedValue: A }
|
|
@@ -1344,14 +1261,14 @@ class fA {
|
|
|
1344
1261
|
* @returns Array of RGB colors for each character
|
|
1345
1262
|
*/
|
|
1346
1263
|
getCharacterColors(A, e) {
|
|
1347
|
-
return
|
|
1264
|
+
return d.validate(
|
|
1348
1265
|
typeof A == "string" && A.length > 0,
|
|
1349
1266
|
"Characters must be a string with at least one character.",
|
|
1350
1267
|
{ method: "getCharacterColors", providedValue: A }
|
|
1351
1268
|
) ? A.split("").map((t) => this.getCharacterColor(t, e) || [0, 0, 0]) : [[0, 0, 0]];
|
|
1352
1269
|
}
|
|
1353
1270
|
}
|
|
1354
|
-
class
|
|
1271
|
+
class hA {
|
|
1355
1272
|
/**
|
|
1356
1273
|
* Creates a new TextmodeFont instance.
|
|
1357
1274
|
* @param renderer Renderer instance for texture creation
|
|
@@ -1359,21 +1276,21 @@ class CA {
|
|
|
1359
1276
|
* @ignore
|
|
1360
1277
|
*/
|
|
1361
1278
|
constructor(A, e = 16) {
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1279
|
+
o(this, "_font");
|
|
1280
|
+
o(this, "_characters", []);
|
|
1281
|
+
o(this, "_fontFramebuffer");
|
|
1282
|
+
o(this, "_fontSize", 16);
|
|
1283
|
+
o(this, "_textureColumns", 0);
|
|
1284
|
+
o(this, "_textureRows", 0);
|
|
1285
|
+
o(this, "_maxGlyphDimensions", { width: 0, height: 0 });
|
|
1286
|
+
o(this, "_fontFace");
|
|
1287
|
+
o(this, "_fontFamilyName", "UrsaFont");
|
|
1371
1288
|
// Component classes
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
this._fontSize = e, this._characterExtractor = new
|
|
1289
|
+
o(this, "_characterExtractor");
|
|
1290
|
+
o(this, "_textureAtlas");
|
|
1291
|
+
o(this, "_metricsCalculator");
|
|
1292
|
+
o(this, "_characterColorMapper");
|
|
1293
|
+
this._fontSize = e, this._characterExtractor = new nA(), this._textureAtlas = new gA(A), this._metricsCalculator = new BA(), this._characterColorMapper = new EA();
|
|
1377
1294
|
}
|
|
1378
1295
|
/**
|
|
1379
1296
|
* Initializes the font manager by loading the font and creating the texture atlas.
|
|
@@ -1386,10 +1303,10 @@ class CA {
|
|
|
1386
1303
|
if (A) {
|
|
1387
1304
|
const t = await fetch(A);
|
|
1388
1305
|
if (!t.ok)
|
|
1389
|
-
throw new
|
|
1306
|
+
throw new m(`Failed to load font file: ${t.status} ${t.statusText}`);
|
|
1390
1307
|
e = await t.arrayBuffer();
|
|
1391
1308
|
} else
|
|
1392
|
-
e = await (await fetch(
|
|
1309
|
+
e = await (await fetch(oA)).arrayBuffer();
|
|
1393
1310
|
await this._loadFontFace(e), this._font = Q.parse(e)[0], await this._initializeFont();
|
|
1394
1311
|
}
|
|
1395
1312
|
/**
|
|
@@ -1422,7 +1339,7 @@ class CA {
|
|
|
1422
1339
|
try {
|
|
1423
1340
|
const e = await fetch(A);
|
|
1424
1341
|
if (!e.ok)
|
|
1425
|
-
throw new
|
|
1342
|
+
throw new m(`Failed to load font file: ${e.status} ${e.statusText}`);
|
|
1426
1343
|
const t = await e.arrayBuffer();
|
|
1427
1344
|
await this._loadFontFace(t);
|
|
1428
1345
|
const r = Q.parse(t);
|
|
@@ -1430,7 +1347,7 @@ class CA {
|
|
|
1430
1347
|
throw new Error("Failed to parse font file");
|
|
1431
1348
|
this._font = r[0], await this._initializeFont();
|
|
1432
1349
|
} catch (e) {
|
|
1433
|
-
throw new
|
|
1350
|
+
throw new m(`Failed to load font: ${e instanceof Error ? e.message : "Unknown error"}`, e);
|
|
1434
1351
|
}
|
|
1435
1352
|
}
|
|
1436
1353
|
/**
|
|
@@ -1527,7 +1444,7 @@ class CA {
|
|
|
1527
1444
|
return this._font;
|
|
1528
1445
|
}
|
|
1529
1446
|
}
|
|
1530
|
-
class
|
|
1447
|
+
class lA {
|
|
1531
1448
|
/**
|
|
1532
1449
|
* Create a new grid instance.
|
|
1533
1450
|
* @param canvas The canvas element used to determine the grid dimensions.
|
|
@@ -1537,25 +1454,25 @@ class mA {
|
|
|
1537
1454
|
*/
|
|
1538
1455
|
constructor(A, e, t) {
|
|
1539
1456
|
/** The number of columns in the grid. */
|
|
1540
|
-
|
|
1457
|
+
o(this, "_cols");
|
|
1541
1458
|
/** The number of rows in the grid. */
|
|
1542
|
-
|
|
1459
|
+
o(this, "_rows");
|
|
1543
1460
|
/** The total width of the grid in pixels. */
|
|
1544
|
-
|
|
1461
|
+
o(this, "_width");
|
|
1545
1462
|
/** The total height of the grid in pixels. */
|
|
1546
|
-
|
|
1463
|
+
o(this, "_height");
|
|
1547
1464
|
/** The offset to the outer canvas on the x-axis when centering the grid. */
|
|
1548
|
-
|
|
1465
|
+
o(this, "_offsetX");
|
|
1549
1466
|
/** The offset to the outer canvas on the y-axis when centering the grid. */
|
|
1550
|
-
|
|
1467
|
+
o(this, "_offsetY");
|
|
1551
1468
|
/** Whether the grid dimensions are fixed, or responsive based on the canvas dimensions. */
|
|
1552
|
-
|
|
1469
|
+
o(this, "_fixedDimensions", !1);
|
|
1553
1470
|
/** The canvas element used to determine the grid dimensions. */
|
|
1554
|
-
|
|
1471
|
+
o(this, "_canvas");
|
|
1555
1472
|
/** The width of each cell in the grid. */
|
|
1556
|
-
|
|
1473
|
+
o(this, "_cellWidth");
|
|
1557
1474
|
/** The height of each cell in the grid. */
|
|
1558
|
-
|
|
1475
|
+
o(this, "_cellHeight");
|
|
1559
1476
|
this._canvas = A, this._cellWidth = e, this._cellHeight = t, this.reset();
|
|
1560
1477
|
}
|
|
1561
1478
|
/**
|
|
@@ -1662,13 +1579,13 @@ class mA {
|
|
|
1662
1579
|
return this._offsetY;
|
|
1663
1580
|
}
|
|
1664
1581
|
}
|
|
1665
|
-
class
|
|
1582
|
+
class QA {
|
|
1666
1583
|
constructor(A, e = !1, t = {}) {
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1584
|
+
o(this, "_canvas");
|
|
1585
|
+
o(this, "captureSource");
|
|
1586
|
+
o(this, "_isStandalone");
|
|
1587
|
+
o(this, "resizeObserver");
|
|
1588
|
+
o(this, "onTransformChange");
|
|
1672
1589
|
this.captureSource = A, this._isStandalone = e, this._canvas = this.createCanvas(t.width, t.height), e && this.setupTransformObserver();
|
|
1673
1590
|
}
|
|
1674
1591
|
createCanvas(A, e) {
|
|
@@ -1678,12 +1595,12 @@ class DA {
|
|
|
1678
1595
|
t.width = A || 800, t.height = e || 600, document.body.appendChild(t);
|
|
1679
1596
|
else {
|
|
1680
1597
|
const i = this.captureSource.getBoundingClientRect();
|
|
1681
|
-
let s = Math.round(i.width),
|
|
1598
|
+
let s = Math.round(i.width), a = Math.round(i.height);
|
|
1682
1599
|
if (this.captureSource instanceof HTMLVideoElement) {
|
|
1683
1600
|
const E = this.captureSource;
|
|
1684
|
-
(s === 0 ||
|
|
1601
|
+
(s === 0 || a === 0) && E.videoWidth > 0 && E.videoHeight > 0 && (s = E.videoWidth, a = E.videoHeight);
|
|
1685
1602
|
}
|
|
1686
|
-
t.width = s, t.height =
|
|
1603
|
+
t.width = s, t.height = a, t.style.position = "absolute", t.style.pointerEvents = "none";
|
|
1687
1604
|
const g = window.getComputedStyle(this.captureSource);
|
|
1688
1605
|
let B = parseInt(g.zIndex || "0", 10);
|
|
1689
1606
|
isNaN(B) && (B = 0), t.style.zIndex = (B + 1).toString(), this.positionOverlayCanvas(t), (r = this.captureSource.parentNode) == null || r.insertBefore(t, this.captureSource.nextSibling);
|
|
@@ -1726,7 +1643,7 @@ class DA {
|
|
|
1726
1643
|
powerPreference: "high-performance"
|
|
1727
1644
|
}, e = this._canvas.getContext("webgl2", A) || this._canvas.getContext("webgl", A);
|
|
1728
1645
|
if (!e)
|
|
1729
|
-
throw new
|
|
1646
|
+
throw new m("WebGL context could not be created. Ensure your browser supports WebGL.");
|
|
1730
1647
|
return e;
|
|
1731
1648
|
}
|
|
1732
1649
|
/**
|
|
@@ -1779,7 +1696,7 @@ class DA {
|
|
|
1779
1696
|
return this._canvas.height;
|
|
1780
1697
|
}
|
|
1781
1698
|
}
|
|
1782
|
-
class
|
|
1699
|
+
class T {
|
|
1783
1700
|
/**
|
|
1784
1701
|
* Creates a new TextmodeConverter instance.
|
|
1785
1702
|
* @param renderer Renderer instance for texture creation
|
|
@@ -1789,15 +1706,15 @@ class x {
|
|
|
1789
1706
|
* @ignore
|
|
1790
1707
|
*/
|
|
1791
1708
|
constructor(A, e, t, r = {}) {
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1709
|
+
o(this, "renderer");
|
|
1710
|
+
o(this, "fontManager");
|
|
1711
|
+
o(this, "grid");
|
|
1712
|
+
o(this, "_characterFramebuffer");
|
|
1713
|
+
o(this, "_primaryColorFramebuffer");
|
|
1714
|
+
o(this, "_secondaryColorFramebuffer");
|
|
1715
|
+
o(this, "_rotationFramebuffer");
|
|
1716
|
+
o(this, "_transformFramebuffer");
|
|
1717
|
+
o(this, "_options");
|
|
1801
1718
|
this.renderer = A, this.fontManager = e, this.grid = t, this._options = r, this._characterFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._primaryColorFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._rotationFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._transformFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
1802
1719
|
}
|
|
1803
1720
|
/**
|
|
@@ -1858,7 +1775,7 @@ class x {
|
|
|
1858
1775
|
return this._options;
|
|
1859
1776
|
}
|
|
1860
1777
|
}
|
|
1861
|
-
class
|
|
1778
|
+
class cA {
|
|
1862
1779
|
/**
|
|
1863
1780
|
* Create a new color palette instance.
|
|
1864
1781
|
* @param renderer The renderer instance.
|
|
@@ -1866,9 +1783,9 @@ class pA {
|
|
|
1866
1783
|
*/
|
|
1867
1784
|
constructor(A, e) {
|
|
1868
1785
|
/** The framebuffer used to store the color palette. */
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1786
|
+
o(this, "_framebuffer");
|
|
1787
|
+
o(this, "_renderer");
|
|
1788
|
+
o(this, "_colors");
|
|
1872
1789
|
this._renderer = A, this._colors = e;
|
|
1873
1790
|
const t = Math.max(this._colors.length, 1);
|
|
1874
1791
|
this._framebuffer = this._renderer.createFramebuffer(t, 1), this._updateFramebuffer();
|
|
@@ -1913,18 +1830,18 @@ class pA {
|
|
|
1913
1830
|
return this._framebuffer.texture;
|
|
1914
1831
|
}
|
|
1915
1832
|
}
|
|
1916
|
-
class z extends
|
|
1833
|
+
class z extends T {
|
|
1917
1834
|
constructor(e, t, r, i = {}) {
|
|
1918
1835
|
super(e, t, r, i);
|
|
1919
|
-
|
|
1920
|
-
this.palette = new
|
|
1836
|
+
o(this, "palette");
|
|
1837
|
+
this.palette = new cA(this.renderer, this.fontManager.getCharacterColors(" .:-=+*%@#"));
|
|
1921
1838
|
}
|
|
1922
1839
|
/**
|
|
1923
1840
|
* Sets the characters used for mapping.
|
|
1924
1841
|
* @param characters The characters to use for mapping, usually ordered from darkest to brightest.
|
|
1925
1842
|
*/
|
|
1926
1843
|
characters(e) {
|
|
1927
|
-
|
|
1844
|
+
d.validate(
|
|
1928
1845
|
this.fontManager.hasAllCharacters(e),
|
|
1929
1846
|
"One or more characters do not exist in the current font.",
|
|
1930
1847
|
{ method: "characters", providedValue: e }
|
|
@@ -1939,25 +1856,25 @@ class z extends x {
|
|
|
1939
1856
|
* @param a Alpha component (0-255).
|
|
1940
1857
|
*/
|
|
1941
1858
|
characterColor(e, t, r, i = 255) {
|
|
1942
|
-
let s,
|
|
1859
|
+
let s, a, g, B;
|
|
1943
1860
|
if (typeof e == "string") {
|
|
1944
1861
|
const E = this.parseHexColor(e);
|
|
1945
1862
|
if (!E) {
|
|
1946
|
-
|
|
1863
|
+
d.validate(
|
|
1947
1864
|
!1,
|
|
1948
1865
|
"Invalid hex color format. Use '#FF0000', '#F00', 'FF0000', or 'F00'.",
|
|
1949
1866
|
{ method: "characterColor", providedValue: e }
|
|
1950
1867
|
);
|
|
1951
1868
|
return;
|
|
1952
1869
|
}
|
|
1953
|
-
[s,
|
|
1954
|
-
} else if (s = e,
|
|
1955
|
-
[s,
|
|
1870
|
+
[s, a, g, B] = E;
|
|
1871
|
+
} else if (s = e, a = t !== void 0 ? t : e, g = r !== void 0 ? r : e, B = i, !d.validate(
|
|
1872
|
+
[s, a, g, B].every((E) => E >= 0 && E <= 255),
|
|
1956
1873
|
"Character color values must be between 0 and 255",
|
|
1957
|
-
{ method: "characterColor", providedValues: { r: s, g:
|
|
1874
|
+
{ method: "characterColor", providedValues: { r: s, g: a, b: g, a: B } }
|
|
1958
1875
|
))
|
|
1959
1876
|
return;
|
|
1960
|
-
this._options.characterColor = [s / 255,
|
|
1877
|
+
this._options.characterColor = [s / 255, a / 255, g / 255, B / 255];
|
|
1961
1878
|
}
|
|
1962
1879
|
/**
|
|
1963
1880
|
* Sets the character color mode.
|
|
@@ -1966,7 +1883,7 @@ class z extends x {
|
|
|
1966
1883
|
* @param mode The color mode to use for characters.
|
|
1967
1884
|
*/
|
|
1968
1885
|
characterColorMode(e) {
|
|
1969
|
-
|
|
1886
|
+
d.validate(
|
|
1970
1887
|
["sampled", "fixed"].includes(e),
|
|
1971
1888
|
"Invalid character color mode. Must be 'sampled' or 'fixed'.",
|
|
1972
1889
|
{ method: "characterColorMode", providedValue: e }
|
|
@@ -1981,25 +1898,25 @@ class z extends x {
|
|
|
1981
1898
|
* @param a Alpha component (0-255).
|
|
1982
1899
|
*/
|
|
1983
1900
|
cellColor(e, t, r, i = 255) {
|
|
1984
|
-
let s,
|
|
1901
|
+
let s, a, g, B;
|
|
1985
1902
|
if (typeof e == "string") {
|
|
1986
1903
|
const E = this.parseHexColor(e);
|
|
1987
1904
|
if (!E) {
|
|
1988
|
-
|
|
1905
|
+
d.validate(
|
|
1989
1906
|
!1,
|
|
1990
1907
|
"Invalid hex color format. Use '#FF0000', '#F00', 'FF0000', or 'F00'.",
|
|
1991
1908
|
{ method: "cellColor", providedValue: e }
|
|
1992
1909
|
);
|
|
1993
1910
|
return;
|
|
1994
1911
|
}
|
|
1995
|
-
[s,
|
|
1996
|
-
} else if (s = e,
|
|
1997
|
-
[s,
|
|
1912
|
+
[s, a, g, B] = E;
|
|
1913
|
+
} else if (s = e, a = t !== void 0 ? t : e, g = r !== void 0 ? r : e, B = i, !d.validate(
|
|
1914
|
+
[s, a, g, B].every((E) => E >= 0 && E <= 255),
|
|
1998
1915
|
"Cell color values must be between 0 and 255",
|
|
1999
|
-
{ method: "cellColor", providedValues: { r: s, g:
|
|
1916
|
+
{ method: "cellColor", providedValues: { r: s, g: a, b: g, a: B } }
|
|
2000
1917
|
))
|
|
2001
1918
|
return;
|
|
2002
|
-
this._options.cellColor = [s / 255,
|
|
1919
|
+
this._options.cellColor = [s / 255, a / 255, g / 255, B / 255];
|
|
2003
1920
|
}
|
|
2004
1921
|
/**
|
|
2005
1922
|
* Sets the cell color mode.
|
|
@@ -2008,7 +1925,7 @@ class z extends x {
|
|
|
2008
1925
|
* @param mode The color mode to use for background cells.
|
|
2009
1926
|
*/
|
|
2010
1927
|
cellColorMode(e) {
|
|
2011
|
-
|
|
1928
|
+
d.validate(
|
|
2012
1929
|
["sampled", "fixed"].includes(e),
|
|
2013
1930
|
"Invalid cell color mode. Must be 'sampled' or 'fixed'.",
|
|
2014
1931
|
{ method: "cellColorMode", providedValue: e }
|
|
@@ -2019,7 +1936,7 @@ class z extends x {
|
|
|
2019
1936
|
* @param invert If `true`, the character color becomes the cell color and vice versa.
|
|
2020
1937
|
*/
|
|
2021
1938
|
invert(e) {
|
|
2022
|
-
|
|
1939
|
+
d.validate(
|
|
2023
1940
|
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
2024
1941
|
"Invert must be a boolean value or an integer (0 for false, any other number for true).",
|
|
2025
1942
|
{ method: "invert", providedValue: e }
|
|
@@ -2030,7 +1947,7 @@ class z extends x {
|
|
|
2030
1947
|
* @param angle The rotation angle in degrees.
|
|
2031
1948
|
*/
|
|
2032
1949
|
rotation(e) {
|
|
2033
|
-
if (!
|
|
1950
|
+
if (!d.validate(
|
|
2034
1951
|
typeof e == "number",
|
|
2035
1952
|
"Rotation angle must be a number.",
|
|
2036
1953
|
{ method: "rotation", providedValue: e }
|
|
@@ -2045,7 +1962,7 @@ class z extends x {
|
|
|
2045
1962
|
* @param flip If `true`, characters are flipped horizontally. If `false`, no flip is applied.
|
|
2046
1963
|
*/
|
|
2047
1964
|
flipHorizontally(e) {
|
|
2048
|
-
|
|
1965
|
+
d.validate(
|
|
2049
1966
|
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
2050
1967
|
"Flip horizontally must be a boolean value or an integer (0 for false, any other number for true).",
|
|
2051
1968
|
{ method: "flipHorizontally", providedValue: e }
|
|
@@ -2056,7 +1973,7 @@ class z extends x {
|
|
|
2056
1973
|
* @param flip If `true`, characters are flipped vertically. If `false`, no flip is applied.
|
|
2057
1974
|
*/
|
|
2058
1975
|
flipVertically(e) {
|
|
2059
|
-
|
|
1976
|
+
d.validate(
|
|
2060
1977
|
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
2061
1978
|
"Flip vertically must be a boolean value or an integer (0 for false, any other number for true).",
|
|
2062
1979
|
{ method: "flipVertically", providedValue: e }
|
|
@@ -2075,8 +1992,8 @@ class z extends x {
|
|
|
2075
1992
|
return [t, r, i, 255];
|
|
2076
1993
|
}
|
|
2077
1994
|
}
|
|
2078
|
-
var
|
|
2079
|
-
const
|
|
1995
|
+
var uA = "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;vec4 color=texture2D(u_sketchTexture,cellCenter);float brightness=dot(color.rgb,vec3(0.299,0.587,0.114));float brightnessValue=brightness*255.0;if(brightnessValue>=u_brightnessRange.x&&brightnessValue<=u_brightnessRange.y){gl_FragColor=color;}else{gl_FragColor=vec4(0.0);}}", dA = "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_fillColor;uniform bool u_useFixedColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){if(u_useFixedColor){gl_FragColor=u_fillColor;}else{gl_FragColor=sampleColor;}}else{gl_FragColor=vec4(0.0);}}", fA = "precision lowp float;uniform sampler2D u_sampleTexture;uniform bool u_invert;uniform bool u_flipHorizontally;uniform bool u_flipVertically;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){float invertValue=u_invert ? 1.0 : 0.0;float flipHValue=u_flipHorizontally ? 1.0 : 0.0;float flipVValue=u_flipVertically ? 1.0 : 0.0;gl_FragColor=vec4(invertValue,flipHValue,flipVValue,1.0);}else{gl_FragColor=vec4(0.0);}}", CA = "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_rotationColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){gl_FragColor=u_rotationColor;}else{gl_FragColor=vec4(0.0);}}", mA = "precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec4 color=texture2D(u_colorSampleFramebuffer,v_uv);if(color.a==0.0){gl_FragColor=vec4(0.0);return;}float brightness=dot(color.rgb,vec3(0.299,0.587,0.114))*255.0;vec2 range=u_brightnessRange;if(brightness<range.x||brightness>range.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-range.x)/(range.y-range.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);vec3 charColor=texture2D(u_charPaletteTexture,vec2((idx+0.5)/u_charPaletteSize.x,0.0)).rgb;gl_FragColor=vec4(charColor,1.0);}";
|
|
1996
|
+
const DA = {
|
|
2080
1997
|
/** Enable/disable the renderer */
|
|
2081
1998
|
enabled: !0,
|
|
2082
1999
|
/** Characters used for brightness mapping (from darkest to brightest) */
|
|
@@ -2111,14 +2028,14 @@ class V extends z {
|
|
|
2111
2028
|
* @ignore
|
|
2112
2029
|
*/
|
|
2113
2030
|
constructor(e, t, r) {
|
|
2114
|
-
super(e, t, r, { ...
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
this.sampleShader = new
|
|
2031
|
+
super(e, t, r, { ...DA });
|
|
2032
|
+
o(this, "sampleShader");
|
|
2033
|
+
o(this, "colorFillShader");
|
|
2034
|
+
o(this, "charMappingShader");
|
|
2035
|
+
o(this, "transformFillShader");
|
|
2036
|
+
o(this, "rotationFillShader");
|
|
2037
|
+
o(this, "sampleFramebuffer");
|
|
2038
|
+
this.sampleShader = new _(e.context, w, uA), this.colorFillShader = new _(e.context, w, dA), this.transformFillShader = new _(e.context, w, fA), this.rotationFillShader = new _(e.context, w, CA), this.charMappingShader = new _(e.context, w, mA), this.sampleFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
2122
2039
|
}
|
|
2123
2040
|
convert(e) {
|
|
2124
2041
|
this.sampleFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.sampleShader), this.renderer.setUniform("u_sketchTexture", e), this.renderer.setUniform("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.renderer.setUniform("u_brightnessRange", this._options.brightnessRange), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this.sampleFramebuffer.end(), this._primaryColorFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.colorFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_fillColor", this._options.characterColor), this.renderer.setUniform("u_useFixedColor", this._options.characterColorMode === "fixed"), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._primaryColorFramebuffer.end(), this._secondaryColorFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.colorFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_fillColor", this._options.cellColor), this.renderer.setUniform("u_useFixedColor", this._options.cellColorMode === "fixed"), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer.end(), this._transformFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.transformFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_invert", this._options.invert), this.renderer.setUniform("u_flipHorizontally", this._options.flipHorizontally), this.renderer.setUniform("u_flipVertically", this._options.flipVertically), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._transformFramebuffer.end(), this._rotationFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.rotationFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_rotationColor", this._options.rotation), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._rotationFramebuffer.end(), this._characterFramebuffer.begin(), this.renderer.clear(0, 0, 0, 0), this.renderer.shader(this.charMappingShader), this.renderer.setUniform("u_colorSampleFramebuffer", this.sampleFramebuffer.texture), this.renderer.setUniform("u_charPaletteTexture", this.palette.texture), this.renderer.setUniform("u_charPaletteSize", [this.palette.colors.length, 1]), this.renderer.setUniform("u_brightnessRange", this._options.brightnessRange), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._characterFramebuffer.end();
|
|
@@ -2134,21 +2051,21 @@ class V extends z {
|
|
|
2134
2051
|
* @param range Array of two numbers `[min, max]`, where `min` is darkest and `max` is brightest.
|
|
2135
2052
|
*/
|
|
2136
2053
|
brightnessRange(e) {
|
|
2137
|
-
|
|
2054
|
+
d.validate(
|
|
2138
2055
|
Array.isArray(e) && e.length === 2 && e.every((t) => typeof t == "number" && t >= 0 && t <= 255),
|
|
2139
2056
|
"Brightness range must be an array of two numbers between 0 and 255.",
|
|
2140
2057
|
{ method: "brightnessRange", providedValue: e }
|
|
2141
2058
|
) && (this._options.brightnessRange = e);
|
|
2142
2059
|
}
|
|
2143
2060
|
}
|
|
2144
|
-
const
|
|
2061
|
+
const MA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
2145
2062
|
__proto__: null,
|
|
2146
2063
|
TextmodeBrightnessConverter: V,
|
|
2147
|
-
TextmodeConverter:
|
|
2064
|
+
TextmodeConverter: T,
|
|
2148
2065
|
TextmodeFeatureConverter: z
|
|
2149
2066
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
2150
|
-
var
|
|
2151
|
-
class
|
|
2067
|
+
var pA = "precision mediump float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){vec2 adjustedCoord=gl_FragCoord.xy/u_gridPixelDimensions;vec2 gridCoord=adjustedCoord*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 charIndexTexCoord=(cellCoord+0.5)/u_gridCellDimensions;vec4 primaryColor=texture2D(u_primaryColorTexture,charIndexTexCoord);vec4 secondaryColor=texture2D(u_secondaryColorTexture,charIndexTexCoord);vec4 transformColor=texture2D(u_transformTexture,charIndexTexCoord);bool isInverted=transformColor.r>0.5;bool flipHorizontal=transformColor.g>0.5;bool flipVertical=transformColor.b>0.5;vec4 encodedIndexVec=texture2D(u_asciiCharacterTexture,charIndexTexCoord);if(encodedIndexVec.a<0.01){gl_FragColor=(u_backgroundMode==0)? vec4(0.0):texture2D(u_captureTexture,gl_FragCoord.xy/u_captureDimensions);return;}int charIndex=int(encodedIndexVec.r*255.0+0.5)+int(encodedIndexVec.g*255.0+0.5)*256;int charCol=int(mod(float(charIndex),u_charsetDimensions.x));int charRow=charIndex/int(u_charsetDimensions.x);float flippedRow=(u_charsetDimensions.y-1.0)-float(charRow);vec2 charCoord=vec2(float(charCol),flippedRow)/u_charsetDimensions;vec4 rotationColor=texture2D(u_rotationTexture,charIndexTexCoord);float scaledAngle=rotationColor.r*255.0+rotationColor.g;float rotationAngle=(scaledAngle*360.0/255.0)*0.017453292;vec2 fractionalPart=fract(gridCoord)-0.5;if(flipHorizontal)fractionalPart.x=-fractionalPart.x;if(flipVertical)fractionalPart.y=-fractionalPart.y;fractionalPart=rotate2D(rotationAngle)*fractionalPart+0.5;vec2 cellSize=1.0/u_charsetDimensions;vec2 texCoord=charCoord+fractionalPart*cellSize;vec2 cellMax=charCoord+cellSize;if(any(lessThan(texCoord,charCoord))||any(greaterThan(texCoord,cellMax))){gl_FragColor=isInverted ? primaryColor : secondaryColor;return;}vec4 charTexel=texture2D(u_characterTexture,texCoord);if(isInverted)charTexel.rgb=1.0-charTexel.rgb;gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}";
|
|
2068
|
+
class PA {
|
|
2152
2069
|
/**
|
|
2153
2070
|
* Creates an instance of TextmodeConversionPipeline.
|
|
2154
2071
|
* @param renderer The renderer to use for the pipeline.
|
|
@@ -2157,20 +2074,20 @@ class FA {
|
|
|
2157
2074
|
* @ignore
|
|
2158
2075
|
*/
|
|
2159
2076
|
constructor(A, e, t) {
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
this.renderer = A, this.font = e, this.grid = t, this._asciiShader = this.renderer.createShader(
|
|
2077
|
+
o(this, "renderer");
|
|
2078
|
+
o(this, "font");
|
|
2079
|
+
o(this, "grid");
|
|
2080
|
+
o(this, "converters");
|
|
2081
|
+
o(this, "_resultFramebuffer");
|
|
2082
|
+
o(this, "_asciiShader");
|
|
2083
|
+
o(this, "_characterFramebuffer");
|
|
2084
|
+
o(this, "_primaryColorFramebuffer");
|
|
2085
|
+
o(this, "_secondaryColorFramebuffer");
|
|
2086
|
+
o(this, "_rotationFramebuffer");
|
|
2087
|
+
o(this, "_transformFramebuffer");
|
|
2088
|
+
this.renderer = A, this.font = e, this.grid = t, this._asciiShader = this.renderer.createShader(w, pA), this.converters = [
|
|
2172
2089
|
{ name: "brightness", converter: new V(A, e, t) },
|
|
2173
|
-
{ name: "custom", converter: new
|
|
2090
|
+
{ name: "custom", converter: new T(A, e, t) }
|
|
2174
2091
|
], this._characterFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._primaryColorFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._secondaryColorFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._rotationFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._transformFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._resultFramebuffer = this.renderer.createFramebuffer(this.grid.width, this.grid.height);
|
|
2175
2092
|
}
|
|
2176
2093
|
/**
|
|
@@ -2199,15 +2116,15 @@ class FA {
|
|
|
2199
2116
|
* @returns The requested `TextmodeConverter` instance.
|
|
2200
2117
|
*/
|
|
2201
2118
|
get(A) {
|
|
2202
|
-
if (!
|
|
2119
|
+
if (!d.validate(
|
|
2203
2120
|
typeof A == "string" && A.length > 0,
|
|
2204
2121
|
"Converter name must be a non-empty string.",
|
|
2205
2122
|
{ method: "converter", providedValue: A }
|
|
2206
2123
|
))
|
|
2207
2124
|
return;
|
|
2208
2125
|
const e = this.converters.find((r) => r.name === A), t = e == null ? void 0 : e.converter;
|
|
2209
|
-
if (
|
|
2210
|
-
t instanceof
|
|
2126
|
+
if (d.validate(
|
|
2127
|
+
t instanceof T,
|
|
2211
2128
|
`Converter "${A}" is not a valid TextmodeConverter.`,
|
|
2212
2129
|
{ method: "converter", providedValue: A, converterInstance: t }
|
|
2213
2130
|
))
|
|
@@ -2220,33 +2137,33 @@ class FA {
|
|
|
2220
2137
|
* @returns The newly created {@link TextmodeConverter} instance or `void` if the addition failed.
|
|
2221
2138
|
*/
|
|
2222
2139
|
add(A, e) {
|
|
2223
|
-
if (!
|
|
2140
|
+
if (!d.validate(
|
|
2224
2141
|
typeof A == "string" && A.length > 0,
|
|
2225
2142
|
"Converter name must be a non-empty string.",
|
|
2226
2143
|
{ method: "add", providedValue: A }
|
|
2227
|
-
) || !
|
|
2144
|
+
) || !d.validate(
|
|
2228
2145
|
e === "brightness" || e === "custom",
|
|
2229
2146
|
`Converter type must be either "brightness" or "custom". Provided: ${e}`,
|
|
2230
2147
|
{ method: "add", providedValue: e }
|
|
2231
2148
|
))
|
|
2232
2149
|
return;
|
|
2233
2150
|
let t;
|
|
2234
|
-
return e === "brightness" ? t = new V(this.renderer, this.font, this.grid) : t = new
|
|
2151
|
+
return e === "brightness" ? t = new V(this.renderer, this.font, this.grid) : t = new T(this.renderer, this.font, this.grid), this.converters.push({ name: A, converter: t }), t;
|
|
2235
2152
|
}
|
|
2236
2153
|
/**
|
|
2237
2154
|
* Removes a converter from the pipeline by name or instance.
|
|
2238
2155
|
* @param nameOrInstance The unique name of the converter or the converter instance to remove.
|
|
2239
2156
|
*/
|
|
2240
2157
|
remove(A) {
|
|
2241
|
-
if (!
|
|
2242
|
-
typeof A == "string" || A instanceof
|
|
2158
|
+
if (!d.validate(
|
|
2159
|
+
typeof A == "string" || A instanceof T,
|
|
2243
2160
|
"Parameter must be either a string (converter name) or a TextmodeConverter instance.",
|
|
2244
2161
|
{ method: "remove", providedValue: A }
|
|
2245
2162
|
))
|
|
2246
2163
|
return;
|
|
2247
2164
|
let e = -1;
|
|
2248
2165
|
if (typeof A == "string") {
|
|
2249
|
-
if (!
|
|
2166
|
+
if (!d.validate(
|
|
2250
2167
|
A.length > 0,
|
|
2251
2168
|
"Converter name must be a non-empty string.",
|
|
2252
2169
|
{ method: "remove", providedValue: A }
|
|
@@ -2255,7 +2172,7 @@ class FA {
|
|
|
2255
2172
|
e = this.converters.findIndex((t) => t.name === A);
|
|
2256
2173
|
} else
|
|
2257
2174
|
e = this.converters.findIndex((t) => t.converter === A);
|
|
2258
|
-
|
|
2175
|
+
d.validate(
|
|
2259
2176
|
e !== -1,
|
|
2260
2177
|
typeof A == "string" ? `Converter with name "${A}" not found in pipeline.` : "Converter instance not found in pipeline.",
|
|
2261
2178
|
{ method: "remove", providedValue: A, convertersCount: this.converters.length }
|
|
@@ -2334,13 +2251,13 @@ class L {
|
|
|
2334
2251
|
* @returns Object containing all pixel data arrays
|
|
2335
2252
|
*/
|
|
2336
2253
|
extractFramebufferData(A) {
|
|
2337
|
-
const e = A.get("brightness"), t = e == null ? void 0 : e.characterFramebuffer, r = e == null ? void 0 : e.primaryColorFramebuffer, i = e == null ? void 0 : e.secondaryColorFramebuffer, s = e == null ? void 0 : e.transformFramebuffer,
|
|
2338
|
-
return t == null || t.loadPixels(), r == null || r.loadPixels(), i == null || i.loadPixels(), s == null || s.loadPixels(),
|
|
2254
|
+
const e = A.get("brightness"), t = e == null ? void 0 : e.characterFramebuffer, r = e == null ? void 0 : e.primaryColorFramebuffer, i = e == null ? void 0 : e.secondaryColorFramebuffer, s = e == null ? void 0 : e.transformFramebuffer, a = e == null ? void 0 : e.rotationFramebuffer;
|
|
2255
|
+
return t == null || t.loadPixels(), r == null || r.loadPixels(), i == null || i.loadPixels(), s == null || s.loadPixels(), a == null || a.loadPixels(), {
|
|
2339
2256
|
characterPixels: (t == null ? void 0 : t.pixels) || new Uint8Array(0),
|
|
2340
2257
|
primaryColorPixels: (r == null ? void 0 : r.pixels) || new Uint8Array(0),
|
|
2341
2258
|
secondaryColorPixels: (i == null ? void 0 : i.pixels) || new Uint8Array(0),
|
|
2342
2259
|
transformPixels: (s == null ? void 0 : s.pixels) || new Uint8Array(0),
|
|
2343
|
-
rotationPixels: (
|
|
2260
|
+
rotationPixels: (a == null ? void 0 : a.pixels) || new Uint8Array(0)
|
|
2344
2261
|
};
|
|
2345
2262
|
}
|
|
2346
2263
|
/**
|
|
@@ -2426,7 +2343,7 @@ class H {
|
|
|
2426
2343
|
return `'textmode-export'-${this.generateTimestamp()}`;
|
|
2427
2344
|
}
|
|
2428
2345
|
}
|
|
2429
|
-
class
|
|
2346
|
+
class _A extends L {
|
|
2430
2347
|
/**
|
|
2431
2348
|
* Extracts transform data from transform pixels
|
|
2432
2349
|
* @param transformPixels Transform framebuffer pixels
|
|
@@ -2435,9 +2352,9 @@ class yA extends L {
|
|
|
2435
2352
|
* @returns Transform data object
|
|
2436
2353
|
*/
|
|
2437
2354
|
extractTransformData(A, e, t) {
|
|
2438
|
-
const r = A[t], i = A[t + 1], s = A[t + 2],
|
|
2355
|
+
const r = A[t], i = A[t + 1], s = A[t + 2], a = r === 255, g = i === 255, B = s === 255, E = e[t], h = e[t + 1], l = E + h / 255, c = Math.round(l * 360 / 255 * 100) / 100;
|
|
2439
2356
|
return {
|
|
2440
|
-
isInverted:
|
|
2357
|
+
isInverted: a,
|
|
2441
2358
|
flipHorizontal: g,
|
|
2442
2359
|
flipVertical: B,
|
|
2443
2360
|
rotation: c
|
|
@@ -2470,15 +2387,15 @@ class yA extends L {
|
|
|
2470
2387
|
let r = 0;
|
|
2471
2388
|
for (let i = 0; i < e.rows; i++)
|
|
2472
2389
|
for (let s = 0; s < e.cols; s++) {
|
|
2473
|
-
const
|
|
2390
|
+
const a = r * 4, g = this.getCharacterIndex(
|
|
2474
2391
|
A.characterPixels,
|
|
2475
|
-
|
|
2392
|
+
a
|
|
2476
2393
|
);
|
|
2477
|
-
let B = this.pixelsToRGBA(A.primaryColorPixels,
|
|
2394
|
+
let B = this.pixelsToRGBA(A.primaryColorPixels, a), E = this.pixelsToRGBA(A.secondaryColorPixels, a);
|
|
2478
2395
|
const h = this.extractTransformData(
|
|
2479
2396
|
A.transformPixels,
|
|
2480
2397
|
A.rotationPixels,
|
|
2481
|
-
|
|
2398
|
+
a
|
|
2482
2399
|
);
|
|
2483
2400
|
if (h.isInverted) {
|
|
2484
2401
|
const c = B;
|
|
@@ -2496,7 +2413,7 @@ class yA extends L {
|
|
|
2496
2413
|
return t;
|
|
2497
2414
|
}
|
|
2498
2415
|
}
|
|
2499
|
-
class
|
|
2416
|
+
class wA {
|
|
2500
2417
|
/**
|
|
2501
2418
|
* Gets the glyph index for a given Unicode code point in a Typr.js font
|
|
2502
2419
|
* @param fontData The Typr.js font data
|
|
@@ -2515,9 +2432,9 @@ class TA {
|
|
|
2515
2432
|
{
|
|
2516
2433
|
const s = r.idRangeOffset[i] / 2 + (e - r.startCount[i]) - (r.startCount.length - i);
|
|
2517
2434
|
if (s >= 0 && s < r.glyphIdArray.length) {
|
|
2518
|
-
const
|
|
2519
|
-
if (
|
|
2520
|
-
return
|
|
2435
|
+
const a = r.glyphIdArray[s];
|
|
2436
|
+
if (a !== 0)
|
|
2437
|
+
return a + r.idDelta[i] & 65535;
|
|
2521
2438
|
}
|
|
2522
2439
|
}
|
|
2523
2440
|
}
|
|
@@ -2567,29 +2484,29 @@ class TA {
|
|
|
2567
2484
|
*/
|
|
2568
2485
|
glyphToSVGPath(A, e, t, r) {
|
|
2569
2486
|
if (!A || !A.xs) return "";
|
|
2570
|
-
const { xs: i, ys: s, endPts:
|
|
2571
|
-
if (!i || !s || !
|
|
2487
|
+
const { xs: i, ys: s, endPts: a, flags: g } = A;
|
|
2488
|
+
if (!i || !s || !a || !g) return "";
|
|
2572
2489
|
let B = "", E = 0;
|
|
2573
|
-
for (let h = 0; h <
|
|
2574
|
-
const l =
|
|
2490
|
+
for (let h = 0; h < a.length; h++) {
|
|
2491
|
+
const l = a[h];
|
|
2575
2492
|
if (!(l < E)) {
|
|
2576
2493
|
if (l >= E) {
|
|
2577
|
-
const c = e + i[E] * r,
|
|
2578
|
-
B += `M${c.toFixed(2)},${
|
|
2494
|
+
const c = e + i[E] * r, f = t - s[E] * r;
|
|
2495
|
+
B += `M${c.toFixed(2)},${f.toFixed(2)}`;
|
|
2579
2496
|
let u = E + 1;
|
|
2580
2497
|
for (; u <= l; )
|
|
2581
2498
|
if ((g[u] & 1) !== 0) {
|
|
2582
|
-
const
|
|
2583
|
-
B += `L${
|
|
2499
|
+
const P = e + i[u] * r, p = t - s[u] * r;
|
|
2500
|
+
B += `L${P.toFixed(2)},${p.toFixed(2)}`, u++;
|
|
2584
2501
|
} else {
|
|
2585
|
-
const
|
|
2586
|
-
let
|
|
2587
|
-
if ((g[
|
|
2588
|
-
const
|
|
2589
|
-
B += `Q${
|
|
2502
|
+
const P = e + i[u] * r, p = t - s[u] * r;
|
|
2503
|
+
let D = u + 1 > l ? E : u + 1;
|
|
2504
|
+
if ((g[D] & 1) !== 0) {
|
|
2505
|
+
const x = e + i[D] * r, I = t - s[D] * r;
|
|
2506
|
+
B += `Q${P.toFixed(2)},${p.toFixed(2)} ${x.toFixed(2)},${I.toFixed(2)}`, u = D + 1;
|
|
2590
2507
|
} else {
|
|
2591
|
-
const
|
|
2592
|
-
B += `Q${
|
|
2508
|
+
const x = e + i[D] * r, I = t - s[D] * r, b = (P + x) / 2, v = (p + I) / 2;
|
|
2509
|
+
B += `Q${P.toFixed(2)},${p.toFixed(2)} ${b.toFixed(2)},${v.toFixed(2)}`, u = D;
|
|
2593
2510
|
}
|
|
2594
2511
|
}
|
|
2595
2512
|
B += "Z";
|
|
@@ -2610,14 +2527,14 @@ class TA {
|
|
|
2610
2527
|
*/
|
|
2611
2528
|
generateCharacterPath(A, e, t, r, i) {
|
|
2612
2529
|
try {
|
|
2613
|
-
const s = A.codePointAt(0) || 0,
|
|
2614
|
-
if (
|
|
2530
|
+
const s = A.codePointAt(0) || 0, a = this.getGlyphIndex(e, s);
|
|
2531
|
+
if (a === 0)
|
|
2615
2532
|
return this.createEmptyPath();
|
|
2616
2533
|
let g = null;
|
|
2617
2534
|
try {
|
|
2618
|
-
e.glyf && e.glyf[
|
|
2535
|
+
e.glyf && e.glyf[a] !== null ? g = e.glyf[a] : Q && Q.T && Q.T.glyf && Q.T.glyf._parseGlyf && (g = Q.T.glyf._parseGlyf(e, a), e.glyf && g && (e.glyf[a] = g));
|
|
2619
2536
|
} catch (B) {
|
|
2620
|
-
console.warn(`Failed to parse glyph ${
|
|
2537
|
+
console.warn(`Failed to parse glyph ${a}:`, B);
|
|
2621
2538
|
}
|
|
2622
2539
|
return g ? this.createGlyphPath(e, g, t, r, i) : this.createEmptyPath();
|
|
2623
2540
|
} catch (s) {
|
|
@@ -2636,19 +2553,19 @@ class TA {
|
|
|
2636
2553
|
* @param advanceWidth Character advance width
|
|
2637
2554
|
* @returns SVG path data string or null if generation fails
|
|
2638
2555
|
*/
|
|
2639
|
-
generatePositionedCharacterPath(A, e, t, r, i, s,
|
|
2556
|
+
generatePositionedCharacterPath(A, e, t, r, i, s, a, g) {
|
|
2640
2557
|
try {
|
|
2641
|
-
const B =
|
|
2642
|
-
return this.generateCharacterPath(A, e, h, l,
|
|
2558
|
+
const B = a / e.head.unitsPerEm, E = g * B, h = t + (i - E) / 2, l = r + (s + a * 0.7) / 2;
|
|
2559
|
+
return this.generateCharacterPath(A, e, h, l, a).toSVG() || null;
|
|
2643
2560
|
} catch (B) {
|
|
2644
2561
|
return console.warn(`Failed to generate positioned character path for "${A}":`, B), null;
|
|
2645
2562
|
}
|
|
2646
2563
|
}
|
|
2647
2564
|
}
|
|
2648
|
-
class
|
|
2565
|
+
class IA {
|
|
2649
2566
|
constructor() {
|
|
2650
|
-
|
|
2651
|
-
this.pathGenerator = new
|
|
2567
|
+
o(this, "pathGenerator");
|
|
2568
|
+
this.pathGenerator = new wA();
|
|
2652
2569
|
}
|
|
2653
2570
|
/**
|
|
2654
2571
|
* Generates the SVG header with metadata
|
|
@@ -2700,12 +2617,12 @@ class SA {
|
|
|
2700
2617
|
* @returns Transform attribute string or empty string
|
|
2701
2618
|
*/
|
|
2702
2619
|
generateTransformAttribute(A, e) {
|
|
2703
|
-
const { transform: t, position: r } = A, i = r.cellX + e.cellWidth / 2, s = r.cellY + e.cellHeight / 2,
|
|
2620
|
+
const { transform: t, position: r } = A, i = r.cellX + e.cellWidth / 2, s = r.cellY + e.cellHeight / 2, a = [];
|
|
2704
2621
|
if (t.flipHorizontal || t.flipVertical) {
|
|
2705
2622
|
const g = t.flipHorizontal ? -1 : 1, B = t.flipVertical ? -1 : 1;
|
|
2706
|
-
|
|
2623
|
+
a.push(`translate(${i} ${s})`), a.push(`scale(${g} ${B})`), a.push(`translate(${-i} ${-s})`);
|
|
2707
2624
|
}
|
|
2708
|
-
return t.rotation &&
|
|
2625
|
+
return t.rotation && a.push(`rotate(${t.rotation} ${i} ${s})`), a.length ? ` transform="${a.join(" ")}"` : "";
|
|
2709
2626
|
}
|
|
2710
2627
|
/**
|
|
2711
2628
|
* Generates background rectangle for a cell
|
|
@@ -2746,10 +2663,10 @@ class SA {
|
|
|
2746
2663
|
);
|
|
2747
2664
|
if (!s)
|
|
2748
2665
|
return "";
|
|
2749
|
-
const
|
|
2666
|
+
const a = this.rgbaToColorString(A.primaryColor);
|
|
2750
2667
|
return r.drawMode === "stroke" ? `
|
|
2751
|
-
<path id="${`path-${A.charIndex}-${A.position.cellX}-${A.position.cellY}`.replace(/\./g, "-")}" d="${s}" stroke="${
|
|
2752
|
-
<path d="${s}" fill="${
|
|
2668
|
+
<path id="${`path-${A.charIndex}-${A.position.cellX}-${A.position.cellY}`.replace(/\./g, "-")}" d="${s}" stroke="${a}" stroke-width="${r.strokeWidth}" fill="none" />` : `
|
|
2669
|
+
<path d="${s}" fill="${a}" />`;
|
|
2753
2670
|
}
|
|
2754
2671
|
/**
|
|
2755
2672
|
* Generates complete SVG content for a single cell
|
|
@@ -2762,10 +2679,10 @@ class SA {
|
|
|
2762
2679
|
generateCellContent(A, e, t, r) {
|
|
2763
2680
|
let i = "";
|
|
2764
2681
|
i += this.generateCellBackground(A, e, r);
|
|
2765
|
-
const s = this.generateTransformAttribute(A, e),
|
|
2766
|
-
return
|
|
2767
|
-
<g${s}>`, i +=
|
|
2768
|
-
</g>`) : i +=
|
|
2682
|
+
const s = this.generateTransformAttribute(A, e), a = this.generateCharacterPath(A, e, t, r);
|
|
2683
|
+
return a && (s ? (i += `
|
|
2684
|
+
<g${s}>`, i += a, i += `
|
|
2685
|
+
</g>`) : i += a), i;
|
|
2769
2686
|
}
|
|
2770
2687
|
/**
|
|
2771
2688
|
* Generates the complete SVG content from cell data
|
|
@@ -2793,7 +2710,7 @@ class SA {
|
|
|
2793
2710
|
`).replace(/[ \t]+$/gm, "");
|
|
2794
2711
|
}
|
|
2795
2712
|
}
|
|
2796
|
-
class
|
|
2713
|
+
class bA extends H {
|
|
2797
2714
|
/**
|
|
2798
2715
|
* Creates a downloadable blob from SVG content
|
|
2799
2716
|
* @param svgContent The SVG content string
|
|
@@ -2823,12 +2740,12 @@ class RA extends H {
|
|
|
2823
2740
|
this.downloadSVG(A, e || this.generateDefaultFilename());
|
|
2824
2741
|
}
|
|
2825
2742
|
}
|
|
2826
|
-
class
|
|
2743
|
+
class J {
|
|
2827
2744
|
constructor() {
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
this.dataExtractor = new
|
|
2745
|
+
o(this, "dataExtractor");
|
|
2746
|
+
o(this, "contentGenerator");
|
|
2747
|
+
o(this, "fileHandler");
|
|
2748
|
+
this.dataExtractor = new _A(), this.contentGenerator = new IA(), this.fileHandler = new bA();
|
|
2832
2749
|
}
|
|
2833
2750
|
/**
|
|
2834
2751
|
* Applies default values to SVG export options
|
|
@@ -2875,7 +2792,7 @@ class W {
|
|
|
2875
2792
|
}
|
|
2876
2793
|
}
|
|
2877
2794
|
}
|
|
2878
|
-
class
|
|
2795
|
+
class vA extends L {
|
|
2879
2796
|
/**
|
|
2880
2797
|
* Extracts character data for TXT generation
|
|
2881
2798
|
* @param framebufferData Framebuffer pixel data
|
|
@@ -2885,7 +2802,7 @@ class GA extends L {
|
|
|
2885
2802
|
* @returns 2D array of characters (rows x columns)
|
|
2886
2803
|
*/
|
|
2887
2804
|
extractCharacterGrid(A, e, t, r = " ") {
|
|
2888
|
-
var
|
|
2805
|
+
var a;
|
|
2889
2806
|
const i = [];
|
|
2890
2807
|
let s = 0;
|
|
2891
2808
|
for (let g = 0; g < e.rows; g++) {
|
|
@@ -2894,7 +2811,7 @@ class GA extends L {
|
|
|
2894
2811
|
const h = s * 4, l = this.getCharacterIndex(
|
|
2895
2812
|
A.characterPixels,
|
|
2896
2813
|
h
|
|
2897
|
-
), c = ((
|
|
2814
|
+
), c = ((a = t.characters[l]) == null ? void 0 : a.character) || r;
|
|
2898
2815
|
B.push(c), s++;
|
|
2899
2816
|
}
|
|
2900
2817
|
i.push(B);
|
|
@@ -2902,7 +2819,7 @@ class GA extends L {
|
|
|
2902
2819
|
return i;
|
|
2903
2820
|
}
|
|
2904
2821
|
}
|
|
2905
|
-
class
|
|
2822
|
+
class xA {
|
|
2906
2823
|
/**
|
|
2907
2824
|
* Generates TXT content from a 2D character array
|
|
2908
2825
|
* @param characterGrid 2D array of characters (rows x columns)
|
|
@@ -2921,7 +2838,7 @@ class MA {
|
|
|
2921
2838
|
return t.join(r);
|
|
2922
2839
|
}
|
|
2923
2840
|
}
|
|
2924
|
-
class
|
|
2841
|
+
class FA extends H {
|
|
2925
2842
|
/**
|
|
2926
2843
|
* Saves TXT content as a downloadable file
|
|
2927
2844
|
* @param content The TXT content to save
|
|
@@ -2945,12 +2862,12 @@ class UA extends H {
|
|
|
2945
2862
|
return e === ".txt" || e.length <= 4 ? this.generateDefaultFilename() : e;
|
|
2946
2863
|
}
|
|
2947
2864
|
}
|
|
2948
|
-
class
|
|
2865
|
+
class K {
|
|
2949
2866
|
constructor() {
|
|
2950
|
-
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
this.dataExtractor = new
|
|
2867
|
+
o(this, "dataExtractor");
|
|
2868
|
+
o(this, "contentGenerator");
|
|
2869
|
+
o(this, "fileHandler");
|
|
2870
|
+
this.dataExtractor = new vA(), this.contentGenerator = new xA(), this.fileHandler = new FA();
|
|
2954
2871
|
}
|
|
2955
2872
|
/**
|
|
2956
2873
|
* Applies default values to TXT export options
|
|
@@ -2996,7 +2913,7 @@ class $ {
|
|
|
2996
2913
|
}
|
|
2997
2914
|
}
|
|
2998
2915
|
}
|
|
2999
|
-
class
|
|
2916
|
+
class yA extends L {
|
|
3000
2917
|
/**
|
|
3001
2918
|
* Captures the current state of the textmode canvas as image data
|
|
3002
2919
|
* @param canvas The canvas data containing the rendered textmode graphics
|
|
@@ -3008,8 +2925,8 @@ class YA extends L {
|
|
|
3008
2925
|
const r = A.canvas;
|
|
3009
2926
|
if (e === 1 && t === "transparent")
|
|
3010
2927
|
return r;
|
|
3011
|
-
const i = document.createElement("canvas"), s = i.getContext("2d"),
|
|
3012
|
-
return i.width =
|
|
2928
|
+
const i = document.createElement("canvas"), s = i.getContext("2d"), a = Math.round(r.width * e), g = Math.round(r.height * e);
|
|
2929
|
+
return i.width = a, i.height = g, t !== "transparent" && (s.fillStyle = t, s.fillRect(0, 0, a, g)), s.imageSmoothingEnabled = !1, s.drawImage(
|
|
3013
2930
|
r,
|
|
3014
2931
|
0,
|
|
3015
2932
|
0,
|
|
@@ -3017,12 +2934,12 @@ class YA extends L {
|
|
|
3017
2934
|
r.height,
|
|
3018
2935
|
0,
|
|
3019
2936
|
0,
|
|
3020
|
-
|
|
2937
|
+
a,
|
|
3021
2938
|
g
|
|
3022
2939
|
), i;
|
|
3023
2940
|
}
|
|
3024
2941
|
}
|
|
3025
|
-
class
|
|
2942
|
+
class TA {
|
|
3026
2943
|
/**
|
|
3027
2944
|
* Generates image data from canvas
|
|
3028
2945
|
* @param canvas The canvas containing the image data
|
|
@@ -3041,8 +2958,8 @@ class OA {
|
|
|
3041
2958
|
*/
|
|
3042
2959
|
async generateImageBlob(A, e) {
|
|
3043
2960
|
return new Promise((t, r) => {
|
|
3044
|
-
const i = this.getMimeType(e.format), s = (
|
|
3045
|
-
|
|
2961
|
+
const i = this.getMimeType(e.format), s = (a) => {
|
|
2962
|
+
a ? t(a) : r(new Error(`Failed to generate ${e.format.toUpperCase()} blob`));
|
|
3046
2963
|
};
|
|
3047
2964
|
e.format === "png" ? A.toBlob(s, i) : A.toBlob(s, i, e.quality);
|
|
3048
2965
|
});
|
|
@@ -3065,16 +2982,16 @@ class OA {
|
|
|
3065
2982
|
}
|
|
3066
2983
|
}
|
|
3067
2984
|
}
|
|
3068
|
-
const
|
|
2985
|
+
const j = {
|
|
3069
2986
|
png: "image/png",
|
|
3070
2987
|
jpg: "image/jpeg",
|
|
3071
2988
|
webp: "image/webp"
|
|
3072
|
-
},
|
|
2989
|
+
}, Y = {
|
|
3073
2990
|
png: ".png",
|
|
3074
2991
|
jpg: ".jpg",
|
|
3075
2992
|
webp: ".webp"
|
|
3076
2993
|
};
|
|
3077
|
-
class
|
|
2994
|
+
class SA extends H {
|
|
3078
2995
|
/**
|
|
3079
2996
|
* Saves image content as a downloadable file
|
|
3080
2997
|
* @param content The image content (data URL or blob)
|
|
@@ -3083,7 +3000,7 @@ class kA extends H {
|
|
|
3083
3000
|
*/
|
|
3084
3001
|
saveImage(A, e, t) {
|
|
3085
3002
|
try {
|
|
3086
|
-
const r =
|
|
3003
|
+
const r = Y[t];
|
|
3087
3004
|
typeof A == "string" ? this.saveImageFromDataURL(A, this.sanitizeFilename(e) + r) : this.saveImageFromBlob(A, this.sanitizeFilename(e) + r);
|
|
3088
3005
|
} catch (r) {
|
|
3089
3006
|
throw console.error(`Failed to save ${t.toUpperCase()} image:`, r), new Error(`Image save failed: ${r instanceof Error ? r.message : "Unknown error"}`);
|
|
@@ -3118,7 +3035,7 @@ class kA extends H {
|
|
|
3118
3035
|
* @returns True if the format is supported for saving
|
|
3119
3036
|
*/
|
|
3120
3037
|
validateSaveSupport(A) {
|
|
3121
|
-
return A in
|
|
3038
|
+
return A in j && A in Y;
|
|
3122
3039
|
}
|
|
3123
3040
|
/**
|
|
3124
3041
|
* Gets the MIME type for the specified image format
|
|
@@ -3126,7 +3043,7 @@ class kA extends H {
|
|
|
3126
3043
|
* @returns The MIME type string
|
|
3127
3044
|
*/
|
|
3128
3045
|
getMimeType(A) {
|
|
3129
|
-
return
|
|
3046
|
+
return j[A];
|
|
3130
3047
|
}
|
|
3131
3048
|
/**
|
|
3132
3049
|
* Gets the file extension for the specified image format
|
|
@@ -3134,15 +3051,15 @@ class kA extends H {
|
|
|
3134
3051
|
* @returns The file extension (including the dot)
|
|
3135
3052
|
*/
|
|
3136
3053
|
getFileExtension(A) {
|
|
3137
|
-
return
|
|
3054
|
+
return Y[A];
|
|
3138
3055
|
}
|
|
3139
3056
|
}
|
|
3140
|
-
class
|
|
3057
|
+
class RA {
|
|
3141
3058
|
constructor() {
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
this.dataExtractor = new
|
|
3059
|
+
o(this, "dataExtractor");
|
|
3060
|
+
o(this, "contentGenerator");
|
|
3061
|
+
o(this, "fileHandler");
|
|
3062
|
+
this.dataExtractor = new yA(), this.contentGenerator = new TA(), this.fileHandler = new SA();
|
|
3146
3063
|
}
|
|
3147
3064
|
/**
|
|
3148
3065
|
* Applies default values to image export options
|
|
@@ -3225,41 +3142,41 @@ class VA {
|
|
|
3225
3142
|
}
|
|
3226
3143
|
}
|
|
3227
3144
|
}
|
|
3228
|
-
class
|
|
3145
|
+
class G {
|
|
3229
3146
|
constructor(A = null, e = {}) {
|
|
3230
3147
|
/** The element to capture content from (optional for standalone mode) */
|
|
3231
|
-
|
|
3148
|
+
o(this, "captureSource");
|
|
3232
3149
|
/** Our WebGL overlay canvas manager */
|
|
3233
|
-
|
|
3150
|
+
o(this, "textmodeCanvas");
|
|
3234
3151
|
/** Core WebGL renderer */
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
3152
|
+
o(this, "_renderer");
|
|
3153
|
+
o(this, "_canvasFramebuffer");
|
|
3154
|
+
o(this, "_font");
|
|
3155
|
+
o(this, "_grid");
|
|
3156
|
+
o(this, "resizeObserver");
|
|
3240
3157
|
// Auto-rendering properties
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3158
|
+
o(this, "_mode");
|
|
3159
|
+
o(this, "_frameRateLimit");
|
|
3160
|
+
o(this, "animationFrameId", null);
|
|
3161
|
+
o(this, "lastFrameTime", 0);
|
|
3162
|
+
o(this, "frameInterval");
|
|
3163
|
+
o(this, "_isLooping", !0);
|
|
3164
|
+
o(this, "_frameRate", 0);
|
|
3165
|
+
o(this, "lastRenderTime", 0);
|
|
3166
|
+
o(this, "_frameCount", 0);
|
|
3250
3167
|
// Frame rate measurement smoothing
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
|
|
3168
|
+
o(this, "frameTimeHistory", []);
|
|
3169
|
+
o(this, "frameTimeHistorySize", 10);
|
|
3170
|
+
o(this, "_pipeline");
|
|
3171
|
+
o(this, "_isDisposed", !1);
|
|
3255
3172
|
// Standalone canvas properties
|
|
3256
|
-
|
|
3257
|
-
|
|
3173
|
+
o(this, "_standalone", !1);
|
|
3174
|
+
o(this, "_drawCallback", () => {
|
|
3258
3175
|
});
|
|
3259
|
-
|
|
3176
|
+
o(this, "_resizedCallback", () => {
|
|
3260
3177
|
});
|
|
3261
|
-
|
|
3262
|
-
|
|
3178
|
+
o(this, "_windowResizeListener", null);
|
|
3179
|
+
o(this, "_printDebug", !1);
|
|
3263
3180
|
this.captureSource = A, this._standalone = A === null, this._mode = e.renderMode ?? "auto", this._frameRateLimit = e.frameRate ?? 60, this.frameInterval = 1e3 / this._frameRateLimit;
|
|
3264
3181
|
}
|
|
3265
3182
|
/**
|
|
@@ -3269,12 +3186,12 @@ class S {
|
|
|
3269
3186
|
* @ignore
|
|
3270
3187
|
*/
|
|
3271
3188
|
static async create(A = null, e = {}) {
|
|
3272
|
-
const t = new
|
|
3273
|
-
t.textmodeCanvas = new
|
|
3189
|
+
const t = new G(A, e), r = t._standalone ? e : void 0;
|
|
3190
|
+
t.textmodeCanvas = new QA(t.captureSource, t._standalone, r), t._renderer = new aA(t.textmodeCanvas.getWebGLContext());
|
|
3274
3191
|
let i, s;
|
|
3275
|
-
t._standalone ? (i = e.width || 800, s = e.height || 600) : (i = t.textmodeCanvas.width || 800, s = t.textmodeCanvas.height || 600), t._canvasFramebuffer = t._renderer.createFramebuffer(i, s), t._font = new
|
|
3276
|
-
const
|
|
3277
|
-
return t._grid = new
|
|
3192
|
+
t._standalone ? (i = e.width || 800, s = e.height || 600) : (i = t.textmodeCanvas.width || 800, s = t.textmodeCanvas.height || 600), t._canvasFramebuffer = t._renderer.createFramebuffer(i, s), t._font = new hA(t._renderer, e.fontSize ?? 16), await t._font.initialize(e.fontSource);
|
|
3193
|
+
const a = t._font.maxGlyphDimensions;
|
|
3194
|
+
return t._grid = new lA(t.textmodeCanvas.canvas, a.width, a.height), t._pipeline = new PA(t._renderer, t._font, t._grid), t.setupEventListeners(), t.startAutoRendering(), t;
|
|
3278
3195
|
}
|
|
3279
3196
|
setupEventListeners() {
|
|
3280
3197
|
this._windowResizeListener = () => {
|
|
@@ -3322,7 +3239,7 @@ class S {
|
|
|
3322
3239
|
* ```
|
|
3323
3240
|
*/
|
|
3324
3241
|
toString(A = {}) {
|
|
3325
|
-
return new
|
|
3242
|
+
return new K().generateTXT(this, A);
|
|
3326
3243
|
}
|
|
3327
3244
|
/**
|
|
3328
3245
|
* Export the current textmode rendering to a TXT file.
|
|
@@ -3347,7 +3264,7 @@ class S {
|
|
|
3347
3264
|
* ```
|
|
3348
3265
|
*/
|
|
3349
3266
|
saveStrings(A = {}) {
|
|
3350
|
-
new
|
|
3267
|
+
new K().saveTXT(this, A);
|
|
3351
3268
|
}
|
|
3352
3269
|
/**
|
|
3353
3270
|
* Generate the current textmode rendering as an SVG string.
|
|
@@ -3376,7 +3293,7 @@ class S {
|
|
|
3376
3293
|
* ```
|
|
3377
3294
|
*/
|
|
3378
3295
|
toSVG(A = {}) {
|
|
3379
|
-
return new
|
|
3296
|
+
return new J().generateSVG(this, A);
|
|
3380
3297
|
}
|
|
3381
3298
|
/**
|
|
3382
3299
|
* Export the current textmode rendering to an SVG file.
|
|
@@ -3400,7 +3317,7 @@ class S {
|
|
|
3400
3317
|
* ```
|
|
3401
3318
|
*/
|
|
3402
3319
|
saveSVG(A = {}) {
|
|
3403
|
-
new
|
|
3320
|
+
new J().saveSVG(this, A);
|
|
3404
3321
|
}
|
|
3405
3322
|
/**
|
|
3406
3323
|
* Export the current textmode rendering to an image file.
|
|
@@ -3431,7 +3348,7 @@ class S {
|
|
|
3431
3348
|
* ```
|
|
3432
3349
|
*/
|
|
3433
3350
|
async saveCanvas(A, e = "png", t = {}) {
|
|
3434
|
-
await new
|
|
3351
|
+
await new RA().saveImage(this.textmodeCanvas, {
|
|
3435
3352
|
...t,
|
|
3436
3353
|
filename: A,
|
|
3437
3354
|
format: e
|
|
@@ -3693,7 +3610,7 @@ class S {
|
|
|
3693
3610
|
* ```
|
|
3694
3611
|
*/
|
|
3695
3612
|
redraw(A = 1) {
|
|
3696
|
-
if (
|
|
3613
|
+
if (d.validate(
|
|
3697
3614
|
typeof A == "number" && A > 0 && Number.isInteger(A),
|
|
3698
3615
|
"Redraw count must be a positive integer.",
|
|
3699
3616
|
{ method: "redraw", providedValue: A }
|
|
@@ -3749,7 +3666,7 @@ class S {
|
|
|
3749
3666
|
* ```
|
|
3750
3667
|
*/
|
|
3751
3668
|
fontSize(A) {
|
|
3752
|
-
|
|
3669
|
+
d.validate(
|
|
3753
3670
|
typeof A == "number" && A > 0,
|
|
3754
3671
|
"Font size must be a positive number greater than 0.",
|
|
3755
3672
|
{ method: "fontSize", providedValue: A }
|
|
@@ -4403,10 +4320,10 @@ class N {
|
|
|
4403
4320
|
*/
|
|
4404
4321
|
static async create(A, e = {}) {
|
|
4405
4322
|
if (A instanceof HTMLCanvasElement || A instanceof HTMLVideoElement)
|
|
4406
|
-
return
|
|
4323
|
+
return G.create(A, e);
|
|
4407
4324
|
{
|
|
4408
4325
|
const t = A || {};
|
|
4409
|
-
return
|
|
4326
|
+
return G.create(null, t);
|
|
4410
4327
|
}
|
|
4411
4328
|
}
|
|
4412
4329
|
/**
|
|
@@ -4420,7 +4337,7 @@ class N {
|
|
|
4420
4337
|
* ```
|
|
4421
4338
|
*/
|
|
4422
4339
|
static setErrorLevel(A) {
|
|
4423
|
-
|
|
4340
|
+
d.setGlobalLevel(A);
|
|
4424
4341
|
}
|
|
4425
4342
|
/**
|
|
4426
4343
|
* Returns the current version of the `textmode.js` library.
|
|
@@ -4431,27 +4348,27 @@ class N {
|
|
|
4431
4348
|
* ```
|
|
4432
4349
|
*/
|
|
4433
4350
|
static get version() {
|
|
4434
|
-
return "0.1.6-beta.
|
|
4351
|
+
return "0.1.6-beta.4";
|
|
4435
4352
|
}
|
|
4436
4353
|
constructor() {
|
|
4437
4354
|
throw new Error("Textmode is a static class and cannot be instantiated.");
|
|
4438
4355
|
}
|
|
4439
4356
|
}
|
|
4440
|
-
const
|
|
4357
|
+
const GA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
4441
4358
|
__proto__: null
|
|
4442
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
4359
|
+
}, Symbol.toStringTag, { value: "Module" })), YA = N.create, kA = N.setErrorLevel, OA = N.version;
|
|
4443
4360
|
export {
|
|
4444
|
-
|
|
4445
|
-
|
|
4446
|
-
|
|
4447
|
-
|
|
4448
|
-
|
|
4449
|
-
|
|
4450
|
-
|
|
4451
|
-
|
|
4361
|
+
QA as TextmodeCanvas,
|
|
4362
|
+
PA as TextmodeConversionPipeline,
|
|
4363
|
+
tA as TextmodeErrorLevel,
|
|
4364
|
+
hA as TextmodeFont,
|
|
4365
|
+
lA as TextmodeGrid,
|
|
4366
|
+
G as Textmodifier,
|
|
4367
|
+
MA as converters,
|
|
4368
|
+
YA as create,
|
|
4452
4369
|
N as default,
|
|
4453
|
-
|
|
4454
|
-
|
|
4370
|
+
GA as export,
|
|
4371
|
+
kA as setErrorLevel,
|
|
4455
4372
|
N as textmode,
|
|
4456
|
-
|
|
4373
|
+
OA as version
|
|
4457
4374
|
};
|