@esotericsoftware/spine-webgl 4.0.11 → 4.0.15
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/AssetManager.d.ts +33 -33
- package/dist/AssetManager.js +37 -37
- package/dist/Camera.d.ts +49 -49
- package/dist/Camera.js +80 -80
- package/dist/CameraController.d.ts +34 -0
- package/dist/CameraController.js +96 -0
- package/dist/GLTexture.d.ts +46 -46
- package/dist/GLTexture.js +102 -102
- package/dist/Input.d.ts +56 -54
- package/dist/Input.js +211 -214
- package/dist/LoadingScreen.d.ts +43 -43
- package/dist/LoadingScreen.js +114 -114
- package/dist/Matrix4.d.ts +68 -68
- package/dist/Matrix4.js +321 -321
- package/dist/Mesh.d.ts +88 -88
- package/dist/Mesh.js +193 -193
- package/dist/PolygonBatcher.d.ts +53 -53
- package/dist/PolygonBatcher.js +121 -119
- package/dist/SceneRenderer.d.ts +73 -73
- package/dist/SceneRenderer.js +476 -476
- package/dist/Shader.d.ts +75 -75
- package/dist/Shader.js +262 -262
- package/dist/ShapeRenderer.d.ts +69 -69
- package/dist/ShapeRenderer.js +338 -338
- package/dist/SkeletonDebugRenderer.d.ts +60 -60
- package/dist/SkeletonDebugRenderer.js +222 -222
- package/dist/SkeletonRenderer.d.ts +49 -49
- package/dist/SkeletonRenderer.js +295 -295
- package/dist/SpineCanvas.d.ts +73 -73
- package/dist/SpineCanvas.js +82 -82
- package/dist/Vector3.d.ts +47 -47
- package/dist/Vector3.js +103 -103
- package/dist/WebGL.d.ts +44 -43
- package/dist/WebGL.js +96 -96
- package/dist/iife/spine-webgl.js +195 -112
- package/dist/iife/spine-webgl.js.map +3 -3
- package/dist/iife/spine-webgl.min.js +26 -26
- package/dist/index.d.ts +18 -17
- package/dist/index.js +19 -18
- package/package.json +34 -34
package/dist/SceneRenderer.js
CHANGED
|
@@ -1,477 +1,477 @@
|
|
|
1
|
-
/******************************************************************************
|
|
2
|
-
* Spine Runtimes License Agreement
|
|
3
|
-
* Last updated January 1, 2020. Replaces all prior versions.
|
|
4
|
-
*
|
|
5
|
-
* Copyright (c) 2013-2020, Esoteric Software LLC
|
|
6
|
-
*
|
|
7
|
-
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
-
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
-
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
-
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
-
*
|
|
12
|
-
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
13
|
-
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
-
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
-
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
-
* include this license and copyright notice.
|
|
17
|
-
*
|
|
18
|
-
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
-
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
-
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
-
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
-
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
-
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
-
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
-
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
-
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
-
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
-
*****************************************************************************/
|
|
29
|
-
import { Color, MathUtils } from "@esotericsoftware/spine-core";
|
|
30
|
-
import { OrthoCamera } from "./Camera";
|
|
31
|
-
import { PolygonBatcher } from "./PolygonBatcher";
|
|
32
|
-
import { Shader } from "./Shader";
|
|
33
|
-
import { ShapeRenderer } from "./ShapeRenderer";
|
|
34
|
-
import { SkeletonDebugRenderer } from "./SkeletonDebugRenderer";
|
|
35
|
-
import { SkeletonRenderer } from "./SkeletonRenderer";
|
|
36
|
-
import { ManagedWebGLRenderingContext } from "./WebGL";
|
|
37
|
-
;
|
|
38
|
-
const quad = [
|
|
39
|
-
0, 0, 1, 1, 1, 1, 0, 0,
|
|
40
|
-
0, 0, 1, 1, 1, 1, 0, 0,
|
|
41
|
-
0, 0, 1, 1, 1, 1, 0, 0,
|
|
42
|
-
0, 0, 1, 1, 1, 1, 0, 0,
|
|
43
|
-
];
|
|
44
|
-
const QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
|
|
45
|
-
const WHITE = new Color(1, 1, 1, 1);
|
|
46
|
-
export class SceneRenderer {
|
|
47
|
-
constructor(canvas, context, twoColorTint = true) {
|
|
48
|
-
this.twoColorTint = false;
|
|
49
|
-
this.canvas = canvas;
|
|
50
|
-
this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context);
|
|
51
|
-
this.twoColorTint = twoColorTint;
|
|
52
|
-
this.camera = new OrthoCamera(canvas.width, canvas.height);
|
|
53
|
-
this.batcherShader = twoColorTint ? Shader.newTwoColoredTextured(this.context) : Shader.newColoredTextured(this.context);
|
|
54
|
-
this.batcher = new PolygonBatcher(this.context, twoColorTint);
|
|
55
|
-
this.shapesShader = Shader.newColored(this.context);
|
|
56
|
-
this.shapes = new ShapeRenderer(this.context);
|
|
57
|
-
this.skeletonRenderer = new SkeletonRenderer(this.context, twoColorTint);
|
|
58
|
-
this.skeletonDebugRenderer = new SkeletonDebugRenderer(this.context);
|
|
59
|
-
}
|
|
60
|
-
begin() {
|
|
61
|
-
this.camera.update();
|
|
62
|
-
this.enableRenderer(this.batcher);
|
|
63
|
-
}
|
|
64
|
-
drawSkeleton(skeleton, premultipliedAlpha = false, slotRangeStart = -1, slotRangeEnd = -1) {
|
|
65
|
-
this.enableRenderer(this.batcher);
|
|
66
|
-
this.skeletonRenderer.premultipliedAlpha = premultipliedAlpha;
|
|
67
|
-
this.skeletonRenderer.draw(this.batcher, skeleton, slotRangeStart, slotRangeEnd);
|
|
68
|
-
}
|
|
69
|
-
drawSkeletonDebug(skeleton, premultipliedAlpha = false, ignoredBones = null) {
|
|
70
|
-
this.enableRenderer(this.shapes);
|
|
71
|
-
this.skeletonDebugRenderer.premultipliedAlpha = premultipliedAlpha;
|
|
72
|
-
this.skeletonDebugRenderer.draw(this.shapes, skeleton, ignoredBones);
|
|
73
|
-
}
|
|
74
|
-
drawTexture(texture, x, y, width, height, color = null) {
|
|
75
|
-
this.enableRenderer(this.batcher);
|
|
76
|
-
if (color === null)
|
|
77
|
-
color = WHITE;
|
|
78
|
-
var i = 0;
|
|
79
|
-
quad[i++] = x;
|
|
80
|
-
quad[i++] = y;
|
|
81
|
-
quad[i++] = color.r;
|
|
82
|
-
quad[i++] = color.g;
|
|
83
|
-
quad[i++] = color.b;
|
|
84
|
-
quad[i++] = color.a;
|
|
85
|
-
quad[i++] = 0;
|
|
86
|
-
quad[i++] = 1;
|
|
87
|
-
if (this.twoColorTint) {
|
|
88
|
-
quad[i++] = 0;
|
|
89
|
-
quad[i++] = 0;
|
|
90
|
-
quad[i++] = 0;
|
|
91
|
-
quad[i++] = 0;
|
|
92
|
-
}
|
|
93
|
-
quad[i++] = x + width;
|
|
94
|
-
quad[i++] = y;
|
|
95
|
-
quad[i++] = color.r;
|
|
96
|
-
quad[i++] = color.g;
|
|
97
|
-
quad[i++] = color.b;
|
|
98
|
-
quad[i++] = color.a;
|
|
99
|
-
quad[i++] = 1;
|
|
100
|
-
quad[i++] = 1;
|
|
101
|
-
if (this.twoColorTint) {
|
|
102
|
-
quad[i++] = 0;
|
|
103
|
-
quad[i++] = 0;
|
|
104
|
-
quad[i++] = 0;
|
|
105
|
-
quad[i++] = 0;
|
|
106
|
-
}
|
|
107
|
-
quad[i++] = x + width;
|
|
108
|
-
quad[i++] = y + height;
|
|
109
|
-
quad[i++] = color.r;
|
|
110
|
-
quad[i++] = color.g;
|
|
111
|
-
quad[i++] = color.b;
|
|
112
|
-
quad[i++] = color.a;
|
|
113
|
-
quad[i++] = 1;
|
|
114
|
-
quad[i++] = 0;
|
|
115
|
-
if (this.twoColorTint) {
|
|
116
|
-
quad[i++] = 0;
|
|
117
|
-
quad[i++] = 0;
|
|
118
|
-
quad[i++] = 0;
|
|
119
|
-
quad[i++] = 0;
|
|
120
|
-
}
|
|
121
|
-
quad[i++] = x;
|
|
122
|
-
quad[i++] = y + height;
|
|
123
|
-
quad[i++] = color.r;
|
|
124
|
-
quad[i++] = color.g;
|
|
125
|
-
quad[i++] = color.b;
|
|
126
|
-
quad[i++] = color.a;
|
|
127
|
-
quad[i++] = 0;
|
|
128
|
-
quad[i++] = 0;
|
|
129
|
-
if (this.twoColorTint) {
|
|
130
|
-
quad[i++] = 0;
|
|
131
|
-
quad[i++] = 0;
|
|
132
|
-
quad[i++] = 0;
|
|
133
|
-
quad[i] = 0;
|
|
134
|
-
}
|
|
135
|
-
this.batcher.draw(texture, quad, QUAD_TRIANGLES);
|
|
136
|
-
}
|
|
137
|
-
drawTextureUV(texture, x, y, width, height, u, v, u2, v2, color = null) {
|
|
138
|
-
this.enableRenderer(this.batcher);
|
|
139
|
-
if (color === null)
|
|
140
|
-
color = WHITE;
|
|
141
|
-
var i = 0;
|
|
142
|
-
quad[i++] = x;
|
|
143
|
-
quad[i++] = y;
|
|
144
|
-
quad[i++] = color.r;
|
|
145
|
-
quad[i++] = color.g;
|
|
146
|
-
quad[i++] = color.b;
|
|
147
|
-
quad[i++] = color.a;
|
|
148
|
-
quad[i++] = u;
|
|
149
|
-
quad[i++] = v;
|
|
150
|
-
if (this.twoColorTint) {
|
|
151
|
-
quad[i++] = 0;
|
|
152
|
-
quad[i++] = 0;
|
|
153
|
-
quad[i++] = 0;
|
|
154
|
-
quad[i++] = 0;
|
|
155
|
-
}
|
|
156
|
-
quad[i++] = x + width;
|
|
157
|
-
quad[i++] = y;
|
|
158
|
-
quad[i++] = color.r;
|
|
159
|
-
quad[i++] = color.g;
|
|
160
|
-
quad[i++] = color.b;
|
|
161
|
-
quad[i++] = color.a;
|
|
162
|
-
quad[i++] = u2;
|
|
163
|
-
quad[i++] = v;
|
|
164
|
-
if (this.twoColorTint) {
|
|
165
|
-
quad[i++] = 0;
|
|
166
|
-
quad[i++] = 0;
|
|
167
|
-
quad[i++] = 0;
|
|
168
|
-
quad[i++] = 0;
|
|
169
|
-
}
|
|
170
|
-
quad[i++] = x + width;
|
|
171
|
-
quad[i++] = y + height;
|
|
172
|
-
quad[i++] = color.r;
|
|
173
|
-
quad[i++] = color.g;
|
|
174
|
-
quad[i++] = color.b;
|
|
175
|
-
quad[i++] = color.a;
|
|
176
|
-
quad[i++] = u2;
|
|
177
|
-
quad[i++] = v2;
|
|
178
|
-
if (this.twoColorTint) {
|
|
179
|
-
quad[i++] = 0;
|
|
180
|
-
quad[i++] = 0;
|
|
181
|
-
quad[i++] = 0;
|
|
182
|
-
quad[i++] = 0;
|
|
183
|
-
}
|
|
184
|
-
quad[i++] = x;
|
|
185
|
-
quad[i++] = y + height;
|
|
186
|
-
quad[i++] = color.r;
|
|
187
|
-
quad[i++] = color.g;
|
|
188
|
-
quad[i++] = color.b;
|
|
189
|
-
quad[i++] = color.a;
|
|
190
|
-
quad[i++] = u;
|
|
191
|
-
quad[i++] = v2;
|
|
192
|
-
if (this.twoColorTint) {
|
|
193
|
-
quad[i++] = 0;
|
|
194
|
-
quad[i++] = 0;
|
|
195
|
-
quad[i++] = 0;
|
|
196
|
-
quad[i] = 0;
|
|
197
|
-
}
|
|
198
|
-
this.batcher.draw(texture, quad, QUAD_TRIANGLES);
|
|
199
|
-
}
|
|
200
|
-
drawTextureRotated(texture, x, y, width, height, pivotX, pivotY, angle, color = null) {
|
|
201
|
-
this.enableRenderer(this.batcher);
|
|
202
|
-
if (color === null)
|
|
203
|
-
color = WHITE;
|
|
204
|
-
// bottom left and top right corner points relative to origin
|
|
205
|
-
let worldOriginX = x + pivotX;
|
|
206
|
-
let worldOriginY = y + pivotY;
|
|
207
|
-
let fx = -pivotX;
|
|
208
|
-
let fy = -pivotY;
|
|
209
|
-
let fx2 = width - pivotX;
|
|
210
|
-
let fy2 = height - pivotY;
|
|
211
|
-
// construct corner points, start from top left and go counter clockwise
|
|
212
|
-
let p1x = fx;
|
|
213
|
-
let p1y = fy;
|
|
214
|
-
let p2x = fx;
|
|
215
|
-
let p2y = fy2;
|
|
216
|
-
let p3x = fx2;
|
|
217
|
-
let p3y = fy2;
|
|
218
|
-
let p4x = fx2;
|
|
219
|
-
let p4y = fy;
|
|
220
|
-
let x1 = 0;
|
|
221
|
-
let y1 = 0;
|
|
222
|
-
let x2 = 0;
|
|
223
|
-
let y2 = 0;
|
|
224
|
-
let x3 = 0;
|
|
225
|
-
let y3 = 0;
|
|
226
|
-
let x4 = 0;
|
|
227
|
-
let y4 = 0;
|
|
228
|
-
// rotate
|
|
229
|
-
if (angle != 0) {
|
|
230
|
-
let cos = MathUtils.cosDeg(angle);
|
|
231
|
-
let sin = MathUtils.sinDeg(angle);
|
|
232
|
-
x1 = cos * p1x - sin * p1y;
|
|
233
|
-
y1 = sin * p1x + cos * p1y;
|
|
234
|
-
x4 = cos * p2x - sin * p2y;
|
|
235
|
-
y4 = sin * p2x + cos * p2y;
|
|
236
|
-
x3 = cos * p3x - sin * p3y;
|
|
237
|
-
y3 = sin * p3x + cos * p3y;
|
|
238
|
-
x2 = x3 + (x1 - x4);
|
|
239
|
-
y2 = y3 + (y1 - y4);
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
x1 = p1x;
|
|
243
|
-
y1 = p1y;
|
|
244
|
-
x4 = p2x;
|
|
245
|
-
y4 = p2y;
|
|
246
|
-
x3 = p3x;
|
|
247
|
-
y3 = p3y;
|
|
248
|
-
x2 = p4x;
|
|
249
|
-
y2 = p4y;
|
|
250
|
-
}
|
|
251
|
-
x1 += worldOriginX;
|
|
252
|
-
y1 += worldOriginY;
|
|
253
|
-
x2 += worldOriginX;
|
|
254
|
-
y2 += worldOriginY;
|
|
255
|
-
x3 += worldOriginX;
|
|
256
|
-
y3 += worldOriginY;
|
|
257
|
-
x4 += worldOriginX;
|
|
258
|
-
y4 += worldOriginY;
|
|
259
|
-
var i = 0;
|
|
260
|
-
quad[i++] = x1;
|
|
261
|
-
quad[i++] = y1;
|
|
262
|
-
quad[i++] = color.r;
|
|
263
|
-
quad[i++] = color.g;
|
|
264
|
-
quad[i++] = color.b;
|
|
265
|
-
quad[i++] = color.a;
|
|
266
|
-
quad[i++] = 0;
|
|
267
|
-
quad[i++] = 1;
|
|
268
|
-
if (this.twoColorTint) {
|
|
269
|
-
quad[i++] = 0;
|
|
270
|
-
quad[i++] = 0;
|
|
271
|
-
quad[i++] = 0;
|
|
272
|
-
quad[i++] = 0;
|
|
273
|
-
}
|
|
274
|
-
quad[i++] = x2;
|
|
275
|
-
quad[i++] = y2;
|
|
276
|
-
quad[i++] = color.r;
|
|
277
|
-
quad[i++] = color.g;
|
|
278
|
-
quad[i++] = color.b;
|
|
279
|
-
quad[i++] = color.a;
|
|
280
|
-
quad[i++] = 1;
|
|
281
|
-
quad[i++] = 1;
|
|
282
|
-
if (this.twoColorTint) {
|
|
283
|
-
quad[i++] = 0;
|
|
284
|
-
quad[i++] = 0;
|
|
285
|
-
quad[i++] = 0;
|
|
286
|
-
quad[i++] = 0;
|
|
287
|
-
}
|
|
288
|
-
quad[i++] = x3;
|
|
289
|
-
quad[i++] = y3;
|
|
290
|
-
quad[i++] = color.r;
|
|
291
|
-
quad[i++] = color.g;
|
|
292
|
-
quad[i++] = color.b;
|
|
293
|
-
quad[i++] = color.a;
|
|
294
|
-
quad[i++] = 1;
|
|
295
|
-
quad[i++] = 0;
|
|
296
|
-
if (this.twoColorTint) {
|
|
297
|
-
quad[i++] = 0;
|
|
298
|
-
quad[i++] = 0;
|
|
299
|
-
quad[i++] = 0;
|
|
300
|
-
quad[i++] = 0;
|
|
301
|
-
}
|
|
302
|
-
quad[i++] = x4;
|
|
303
|
-
quad[i++] = y4;
|
|
304
|
-
quad[i++] = color.r;
|
|
305
|
-
quad[i++] = color.g;
|
|
306
|
-
quad[i++] = color.b;
|
|
307
|
-
quad[i++] = color.a;
|
|
308
|
-
quad[i++] = 0;
|
|
309
|
-
quad[i++] = 0;
|
|
310
|
-
if (this.twoColorTint) {
|
|
311
|
-
quad[i++] = 0;
|
|
312
|
-
quad[i++] = 0;
|
|
313
|
-
quad[i++] = 0;
|
|
314
|
-
quad[i] = 0;
|
|
315
|
-
}
|
|
316
|
-
this.batcher.draw(texture, quad, QUAD_TRIANGLES);
|
|
317
|
-
}
|
|
318
|
-
drawRegion(region, x, y, width, height, color = null) {
|
|
319
|
-
this.enableRenderer(this.batcher);
|
|
320
|
-
if (color === null)
|
|
321
|
-
color = WHITE;
|
|
322
|
-
var i = 0;
|
|
323
|
-
quad[i++] = x;
|
|
324
|
-
quad[i++] = y;
|
|
325
|
-
quad[i++] = color.r;
|
|
326
|
-
quad[i++] = color.g;
|
|
327
|
-
quad[i++] = color.b;
|
|
328
|
-
quad[i++] = color.a;
|
|
329
|
-
quad[i++] = region.u;
|
|
330
|
-
quad[i++] = region.v2;
|
|
331
|
-
if (this.twoColorTint) {
|
|
332
|
-
quad[i++] = 0;
|
|
333
|
-
quad[i++] = 0;
|
|
334
|
-
quad[i++] = 0;
|
|
335
|
-
quad[i++] = 0;
|
|
336
|
-
}
|
|
337
|
-
quad[i++] = x + width;
|
|
338
|
-
quad[i++] = y;
|
|
339
|
-
quad[i++] = color.r;
|
|
340
|
-
quad[i++] = color.g;
|
|
341
|
-
quad[i++] = color.b;
|
|
342
|
-
quad[i++] = color.a;
|
|
343
|
-
quad[i++] = region.u2;
|
|
344
|
-
quad[i++] = region.v2;
|
|
345
|
-
if (this.twoColorTint) {
|
|
346
|
-
quad[i++] = 0;
|
|
347
|
-
quad[i++] = 0;
|
|
348
|
-
quad[i++] = 0;
|
|
349
|
-
quad[i++] = 0;
|
|
350
|
-
}
|
|
351
|
-
quad[i++] = x + width;
|
|
352
|
-
quad[i++] = y + height;
|
|
353
|
-
quad[i++] = color.r;
|
|
354
|
-
quad[i++] = color.g;
|
|
355
|
-
quad[i++] = color.b;
|
|
356
|
-
quad[i++] = color.a;
|
|
357
|
-
quad[i++] = region.u2;
|
|
358
|
-
quad[i++] = region.v;
|
|
359
|
-
if (this.twoColorTint) {
|
|
360
|
-
quad[i++] = 0;
|
|
361
|
-
quad[i++] = 0;
|
|
362
|
-
quad[i++] = 0;
|
|
363
|
-
quad[i++] = 0;
|
|
364
|
-
}
|
|
365
|
-
quad[i++] = x;
|
|
366
|
-
quad[i++] = y + height;
|
|
367
|
-
quad[i++] = color.r;
|
|
368
|
-
quad[i++] = color.g;
|
|
369
|
-
quad[i++] = color.b;
|
|
370
|
-
quad[i++] = color.a;
|
|
371
|
-
quad[i++] = region.u;
|
|
372
|
-
quad[i++] = region.v;
|
|
373
|
-
if (this.twoColorTint) {
|
|
374
|
-
quad[i++] = 0;
|
|
375
|
-
quad[i++] = 0;
|
|
376
|
-
quad[i++] = 0;
|
|
377
|
-
quad[i] = 0;
|
|
378
|
-
}
|
|
379
|
-
this.batcher.draw(region.page.texture, quad, QUAD_TRIANGLES);
|
|
380
|
-
}
|
|
381
|
-
line(x, y, x2, y2, color = null, color2 = null) {
|
|
382
|
-
this.enableRenderer(this.shapes);
|
|
383
|
-
this.shapes.line(x, y, x2, y2, color);
|
|
384
|
-
}
|
|
385
|
-
triangle(filled, x, y, x2, y2, x3, y3, color = null, color2 = null, color3 = null) {
|
|
386
|
-
this.enableRenderer(this.shapes);
|
|
387
|
-
this.shapes.triangle(filled, x, y, x2, y2, x3, y3, color, color2, color3);
|
|
388
|
-
}
|
|
389
|
-
quad(filled, x, y, x2, y2, x3, y3, x4, y4, color = null, color2 = null, color3 = null, color4 = null) {
|
|
390
|
-
this.enableRenderer(this.shapes);
|
|
391
|
-
this.shapes.quad(filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4);
|
|
392
|
-
}
|
|
393
|
-
rect(filled, x, y, width, height, color = null) {
|
|
394
|
-
this.enableRenderer(this.shapes);
|
|
395
|
-
this.shapes.rect(filled, x, y, width, height, color);
|
|
396
|
-
}
|
|
397
|
-
rectLine(filled, x1, y1, x2, y2, width, color = null) {
|
|
398
|
-
this.enableRenderer(this.shapes);
|
|
399
|
-
this.shapes.rectLine(filled, x1, y1, x2, y2, width, color);
|
|
400
|
-
}
|
|
401
|
-
polygon(polygonVertices, offset, count, color = null) {
|
|
402
|
-
this.enableRenderer(this.shapes);
|
|
403
|
-
this.shapes.polygon(polygonVertices, offset, count, color);
|
|
404
|
-
}
|
|
405
|
-
circle(filled, x, y, radius, color = null, segments = 0) {
|
|
406
|
-
this.enableRenderer(this.shapes);
|
|
407
|
-
this.shapes.circle(filled, x, y, radius, color, segments);
|
|
408
|
-
}
|
|
409
|
-
curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color = null) {
|
|
410
|
-
this.enableRenderer(this.shapes);
|
|
411
|
-
this.shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color);
|
|
412
|
-
}
|
|
413
|
-
end() {
|
|
414
|
-
if (this.activeRenderer === this.batcher)
|
|
415
|
-
this.batcher.end();
|
|
416
|
-
else if (this.activeRenderer === this.shapes)
|
|
417
|
-
this.shapes.end();
|
|
418
|
-
this.activeRenderer = null;
|
|
419
|
-
}
|
|
420
|
-
resize(resizeMode) {
|
|
421
|
-
let canvas = this.canvas;
|
|
422
|
-
var dpr = window.devicePixelRatio || 1;
|
|
423
|
-
var w = Math.round(canvas.clientWidth * dpr);
|
|
424
|
-
var h = Math.round(canvas.clientHeight * dpr);
|
|
425
|
-
if (canvas.width != w || canvas.height != h) {
|
|
426
|
-
canvas.width = w;
|
|
427
|
-
canvas.height = h;
|
|
428
|
-
}
|
|
429
|
-
this.context.gl.viewport(0, 0, canvas.width, canvas.height);
|
|
430
|
-
// Nothing to do for stretch, we simply apply the viewport size of the camera.
|
|
431
|
-
if (resizeMode === ResizeMode.Expand)
|
|
432
|
-
this.camera.setViewport(w, h);
|
|
433
|
-
else if (resizeMode === ResizeMode.Fit) {
|
|
434
|
-
let sourceWidth = canvas.width, sourceHeight = canvas.height;
|
|
435
|
-
let targetWidth = this.camera.viewportWidth, targetHeight = this.camera.viewportHeight;
|
|
436
|
-
let targetRatio = targetHeight / targetWidth;
|
|
437
|
-
let sourceRatio = sourceHeight / sourceWidth;
|
|
438
|
-
let scale = targetRatio < sourceRatio ? targetWidth / sourceWidth : targetHeight / sourceHeight;
|
|
439
|
-
this.camera.setViewport(sourceWidth * scale, sourceHeight * scale);
|
|
440
|
-
}
|
|
441
|
-
this.camera.update();
|
|
442
|
-
}
|
|
443
|
-
enableRenderer(renderer) {
|
|
444
|
-
if (this.activeRenderer === renderer)
|
|
445
|
-
return;
|
|
446
|
-
this.end();
|
|
447
|
-
if (renderer instanceof PolygonBatcher) {
|
|
448
|
-
this.batcherShader.bind();
|
|
449
|
-
this.batcherShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values);
|
|
450
|
-
this.batcherShader.setUniformi("u_texture", 0);
|
|
451
|
-
this.batcher.begin(this.batcherShader);
|
|
452
|
-
this.activeRenderer = this.batcher;
|
|
453
|
-
}
|
|
454
|
-
else if (renderer instanceof ShapeRenderer) {
|
|
455
|
-
this.shapesShader.bind();
|
|
456
|
-
this.shapesShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values);
|
|
457
|
-
this.shapes.begin(this.shapesShader);
|
|
458
|
-
this.activeRenderer = this.shapes;
|
|
459
|
-
}
|
|
460
|
-
else
|
|
461
|
-
this.activeRenderer = this.skeletonDebugRenderer;
|
|
462
|
-
}
|
|
463
|
-
dispose() {
|
|
464
|
-
this.batcher.dispose();
|
|
465
|
-
this.batcherShader.dispose();
|
|
466
|
-
this.shapes.dispose();
|
|
467
|
-
this.shapesShader.dispose();
|
|
468
|
-
this.skeletonDebugRenderer.dispose();
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
export var ResizeMode;
|
|
472
|
-
(function (ResizeMode) {
|
|
473
|
-
ResizeMode[ResizeMode["Stretch"] = 0] = "Stretch";
|
|
474
|
-
ResizeMode[ResizeMode["Expand"] = 1] = "Expand";
|
|
475
|
-
ResizeMode[ResizeMode["Fit"] = 2] = "Fit";
|
|
476
|
-
})(ResizeMode || (ResizeMode = {}));
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated January 1, 2020. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2020, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
13
|
+
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
+
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
import { Color, MathUtils } from "@esotericsoftware/spine-core";
|
|
30
|
+
import { OrthoCamera } from "./Camera";
|
|
31
|
+
import { PolygonBatcher } from "./PolygonBatcher";
|
|
32
|
+
import { Shader } from "./Shader";
|
|
33
|
+
import { ShapeRenderer } from "./ShapeRenderer";
|
|
34
|
+
import { SkeletonDebugRenderer } from "./SkeletonDebugRenderer";
|
|
35
|
+
import { SkeletonRenderer } from "./SkeletonRenderer";
|
|
36
|
+
import { ManagedWebGLRenderingContext } from "./WebGL";
|
|
37
|
+
;
|
|
38
|
+
const quad = [
|
|
39
|
+
0, 0, 1, 1, 1, 1, 0, 0,
|
|
40
|
+
0, 0, 1, 1, 1, 1, 0, 0,
|
|
41
|
+
0, 0, 1, 1, 1, 1, 0, 0,
|
|
42
|
+
0, 0, 1, 1, 1, 1, 0, 0,
|
|
43
|
+
];
|
|
44
|
+
const QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
|
|
45
|
+
const WHITE = new Color(1, 1, 1, 1);
|
|
46
|
+
export class SceneRenderer {
|
|
47
|
+
constructor(canvas, context, twoColorTint = true) {
|
|
48
|
+
this.twoColorTint = false;
|
|
49
|
+
this.canvas = canvas;
|
|
50
|
+
this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context);
|
|
51
|
+
this.twoColorTint = twoColorTint;
|
|
52
|
+
this.camera = new OrthoCamera(canvas.width, canvas.height);
|
|
53
|
+
this.batcherShader = twoColorTint ? Shader.newTwoColoredTextured(this.context) : Shader.newColoredTextured(this.context);
|
|
54
|
+
this.batcher = new PolygonBatcher(this.context, twoColorTint);
|
|
55
|
+
this.shapesShader = Shader.newColored(this.context);
|
|
56
|
+
this.shapes = new ShapeRenderer(this.context);
|
|
57
|
+
this.skeletonRenderer = new SkeletonRenderer(this.context, twoColorTint);
|
|
58
|
+
this.skeletonDebugRenderer = new SkeletonDebugRenderer(this.context);
|
|
59
|
+
}
|
|
60
|
+
begin() {
|
|
61
|
+
this.camera.update();
|
|
62
|
+
this.enableRenderer(this.batcher);
|
|
63
|
+
}
|
|
64
|
+
drawSkeleton(skeleton, premultipliedAlpha = false, slotRangeStart = -1, slotRangeEnd = -1) {
|
|
65
|
+
this.enableRenderer(this.batcher);
|
|
66
|
+
this.skeletonRenderer.premultipliedAlpha = premultipliedAlpha;
|
|
67
|
+
this.skeletonRenderer.draw(this.batcher, skeleton, slotRangeStart, slotRangeEnd);
|
|
68
|
+
}
|
|
69
|
+
drawSkeletonDebug(skeleton, premultipliedAlpha = false, ignoredBones = null) {
|
|
70
|
+
this.enableRenderer(this.shapes);
|
|
71
|
+
this.skeletonDebugRenderer.premultipliedAlpha = premultipliedAlpha;
|
|
72
|
+
this.skeletonDebugRenderer.draw(this.shapes, skeleton, ignoredBones);
|
|
73
|
+
}
|
|
74
|
+
drawTexture(texture, x, y, width, height, color = null) {
|
|
75
|
+
this.enableRenderer(this.batcher);
|
|
76
|
+
if (color === null)
|
|
77
|
+
color = WHITE;
|
|
78
|
+
var i = 0;
|
|
79
|
+
quad[i++] = x;
|
|
80
|
+
quad[i++] = y;
|
|
81
|
+
quad[i++] = color.r;
|
|
82
|
+
quad[i++] = color.g;
|
|
83
|
+
quad[i++] = color.b;
|
|
84
|
+
quad[i++] = color.a;
|
|
85
|
+
quad[i++] = 0;
|
|
86
|
+
quad[i++] = 1;
|
|
87
|
+
if (this.twoColorTint) {
|
|
88
|
+
quad[i++] = 0;
|
|
89
|
+
quad[i++] = 0;
|
|
90
|
+
quad[i++] = 0;
|
|
91
|
+
quad[i++] = 0;
|
|
92
|
+
}
|
|
93
|
+
quad[i++] = x + width;
|
|
94
|
+
quad[i++] = y;
|
|
95
|
+
quad[i++] = color.r;
|
|
96
|
+
quad[i++] = color.g;
|
|
97
|
+
quad[i++] = color.b;
|
|
98
|
+
quad[i++] = color.a;
|
|
99
|
+
quad[i++] = 1;
|
|
100
|
+
quad[i++] = 1;
|
|
101
|
+
if (this.twoColorTint) {
|
|
102
|
+
quad[i++] = 0;
|
|
103
|
+
quad[i++] = 0;
|
|
104
|
+
quad[i++] = 0;
|
|
105
|
+
quad[i++] = 0;
|
|
106
|
+
}
|
|
107
|
+
quad[i++] = x + width;
|
|
108
|
+
quad[i++] = y + height;
|
|
109
|
+
quad[i++] = color.r;
|
|
110
|
+
quad[i++] = color.g;
|
|
111
|
+
quad[i++] = color.b;
|
|
112
|
+
quad[i++] = color.a;
|
|
113
|
+
quad[i++] = 1;
|
|
114
|
+
quad[i++] = 0;
|
|
115
|
+
if (this.twoColorTint) {
|
|
116
|
+
quad[i++] = 0;
|
|
117
|
+
quad[i++] = 0;
|
|
118
|
+
quad[i++] = 0;
|
|
119
|
+
quad[i++] = 0;
|
|
120
|
+
}
|
|
121
|
+
quad[i++] = x;
|
|
122
|
+
quad[i++] = y + height;
|
|
123
|
+
quad[i++] = color.r;
|
|
124
|
+
quad[i++] = color.g;
|
|
125
|
+
quad[i++] = color.b;
|
|
126
|
+
quad[i++] = color.a;
|
|
127
|
+
quad[i++] = 0;
|
|
128
|
+
quad[i++] = 0;
|
|
129
|
+
if (this.twoColorTint) {
|
|
130
|
+
quad[i++] = 0;
|
|
131
|
+
quad[i++] = 0;
|
|
132
|
+
quad[i++] = 0;
|
|
133
|
+
quad[i] = 0;
|
|
134
|
+
}
|
|
135
|
+
this.batcher.draw(texture, quad, QUAD_TRIANGLES);
|
|
136
|
+
}
|
|
137
|
+
drawTextureUV(texture, x, y, width, height, u, v, u2, v2, color = null) {
|
|
138
|
+
this.enableRenderer(this.batcher);
|
|
139
|
+
if (color === null)
|
|
140
|
+
color = WHITE;
|
|
141
|
+
var i = 0;
|
|
142
|
+
quad[i++] = x;
|
|
143
|
+
quad[i++] = y;
|
|
144
|
+
quad[i++] = color.r;
|
|
145
|
+
quad[i++] = color.g;
|
|
146
|
+
quad[i++] = color.b;
|
|
147
|
+
quad[i++] = color.a;
|
|
148
|
+
quad[i++] = u;
|
|
149
|
+
quad[i++] = v;
|
|
150
|
+
if (this.twoColorTint) {
|
|
151
|
+
quad[i++] = 0;
|
|
152
|
+
quad[i++] = 0;
|
|
153
|
+
quad[i++] = 0;
|
|
154
|
+
quad[i++] = 0;
|
|
155
|
+
}
|
|
156
|
+
quad[i++] = x + width;
|
|
157
|
+
quad[i++] = y;
|
|
158
|
+
quad[i++] = color.r;
|
|
159
|
+
quad[i++] = color.g;
|
|
160
|
+
quad[i++] = color.b;
|
|
161
|
+
quad[i++] = color.a;
|
|
162
|
+
quad[i++] = u2;
|
|
163
|
+
quad[i++] = v;
|
|
164
|
+
if (this.twoColorTint) {
|
|
165
|
+
quad[i++] = 0;
|
|
166
|
+
quad[i++] = 0;
|
|
167
|
+
quad[i++] = 0;
|
|
168
|
+
quad[i++] = 0;
|
|
169
|
+
}
|
|
170
|
+
quad[i++] = x + width;
|
|
171
|
+
quad[i++] = y + height;
|
|
172
|
+
quad[i++] = color.r;
|
|
173
|
+
quad[i++] = color.g;
|
|
174
|
+
quad[i++] = color.b;
|
|
175
|
+
quad[i++] = color.a;
|
|
176
|
+
quad[i++] = u2;
|
|
177
|
+
quad[i++] = v2;
|
|
178
|
+
if (this.twoColorTint) {
|
|
179
|
+
quad[i++] = 0;
|
|
180
|
+
quad[i++] = 0;
|
|
181
|
+
quad[i++] = 0;
|
|
182
|
+
quad[i++] = 0;
|
|
183
|
+
}
|
|
184
|
+
quad[i++] = x;
|
|
185
|
+
quad[i++] = y + height;
|
|
186
|
+
quad[i++] = color.r;
|
|
187
|
+
quad[i++] = color.g;
|
|
188
|
+
quad[i++] = color.b;
|
|
189
|
+
quad[i++] = color.a;
|
|
190
|
+
quad[i++] = u;
|
|
191
|
+
quad[i++] = v2;
|
|
192
|
+
if (this.twoColorTint) {
|
|
193
|
+
quad[i++] = 0;
|
|
194
|
+
quad[i++] = 0;
|
|
195
|
+
quad[i++] = 0;
|
|
196
|
+
quad[i] = 0;
|
|
197
|
+
}
|
|
198
|
+
this.batcher.draw(texture, quad, QUAD_TRIANGLES);
|
|
199
|
+
}
|
|
200
|
+
drawTextureRotated(texture, x, y, width, height, pivotX, pivotY, angle, color = null) {
|
|
201
|
+
this.enableRenderer(this.batcher);
|
|
202
|
+
if (color === null)
|
|
203
|
+
color = WHITE;
|
|
204
|
+
// bottom left and top right corner points relative to origin
|
|
205
|
+
let worldOriginX = x + pivotX;
|
|
206
|
+
let worldOriginY = y + pivotY;
|
|
207
|
+
let fx = -pivotX;
|
|
208
|
+
let fy = -pivotY;
|
|
209
|
+
let fx2 = width - pivotX;
|
|
210
|
+
let fy2 = height - pivotY;
|
|
211
|
+
// construct corner points, start from top left and go counter clockwise
|
|
212
|
+
let p1x = fx;
|
|
213
|
+
let p1y = fy;
|
|
214
|
+
let p2x = fx;
|
|
215
|
+
let p2y = fy2;
|
|
216
|
+
let p3x = fx2;
|
|
217
|
+
let p3y = fy2;
|
|
218
|
+
let p4x = fx2;
|
|
219
|
+
let p4y = fy;
|
|
220
|
+
let x1 = 0;
|
|
221
|
+
let y1 = 0;
|
|
222
|
+
let x2 = 0;
|
|
223
|
+
let y2 = 0;
|
|
224
|
+
let x3 = 0;
|
|
225
|
+
let y3 = 0;
|
|
226
|
+
let x4 = 0;
|
|
227
|
+
let y4 = 0;
|
|
228
|
+
// rotate
|
|
229
|
+
if (angle != 0) {
|
|
230
|
+
let cos = MathUtils.cosDeg(angle);
|
|
231
|
+
let sin = MathUtils.sinDeg(angle);
|
|
232
|
+
x1 = cos * p1x - sin * p1y;
|
|
233
|
+
y1 = sin * p1x + cos * p1y;
|
|
234
|
+
x4 = cos * p2x - sin * p2y;
|
|
235
|
+
y4 = sin * p2x + cos * p2y;
|
|
236
|
+
x3 = cos * p3x - sin * p3y;
|
|
237
|
+
y3 = sin * p3x + cos * p3y;
|
|
238
|
+
x2 = x3 + (x1 - x4);
|
|
239
|
+
y2 = y3 + (y1 - y4);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
x1 = p1x;
|
|
243
|
+
y1 = p1y;
|
|
244
|
+
x4 = p2x;
|
|
245
|
+
y4 = p2y;
|
|
246
|
+
x3 = p3x;
|
|
247
|
+
y3 = p3y;
|
|
248
|
+
x2 = p4x;
|
|
249
|
+
y2 = p4y;
|
|
250
|
+
}
|
|
251
|
+
x1 += worldOriginX;
|
|
252
|
+
y1 += worldOriginY;
|
|
253
|
+
x2 += worldOriginX;
|
|
254
|
+
y2 += worldOriginY;
|
|
255
|
+
x3 += worldOriginX;
|
|
256
|
+
y3 += worldOriginY;
|
|
257
|
+
x4 += worldOriginX;
|
|
258
|
+
y4 += worldOriginY;
|
|
259
|
+
var i = 0;
|
|
260
|
+
quad[i++] = x1;
|
|
261
|
+
quad[i++] = y1;
|
|
262
|
+
quad[i++] = color.r;
|
|
263
|
+
quad[i++] = color.g;
|
|
264
|
+
quad[i++] = color.b;
|
|
265
|
+
quad[i++] = color.a;
|
|
266
|
+
quad[i++] = 0;
|
|
267
|
+
quad[i++] = 1;
|
|
268
|
+
if (this.twoColorTint) {
|
|
269
|
+
quad[i++] = 0;
|
|
270
|
+
quad[i++] = 0;
|
|
271
|
+
quad[i++] = 0;
|
|
272
|
+
quad[i++] = 0;
|
|
273
|
+
}
|
|
274
|
+
quad[i++] = x2;
|
|
275
|
+
quad[i++] = y2;
|
|
276
|
+
quad[i++] = color.r;
|
|
277
|
+
quad[i++] = color.g;
|
|
278
|
+
quad[i++] = color.b;
|
|
279
|
+
quad[i++] = color.a;
|
|
280
|
+
quad[i++] = 1;
|
|
281
|
+
quad[i++] = 1;
|
|
282
|
+
if (this.twoColorTint) {
|
|
283
|
+
quad[i++] = 0;
|
|
284
|
+
quad[i++] = 0;
|
|
285
|
+
quad[i++] = 0;
|
|
286
|
+
quad[i++] = 0;
|
|
287
|
+
}
|
|
288
|
+
quad[i++] = x3;
|
|
289
|
+
quad[i++] = y3;
|
|
290
|
+
quad[i++] = color.r;
|
|
291
|
+
quad[i++] = color.g;
|
|
292
|
+
quad[i++] = color.b;
|
|
293
|
+
quad[i++] = color.a;
|
|
294
|
+
quad[i++] = 1;
|
|
295
|
+
quad[i++] = 0;
|
|
296
|
+
if (this.twoColorTint) {
|
|
297
|
+
quad[i++] = 0;
|
|
298
|
+
quad[i++] = 0;
|
|
299
|
+
quad[i++] = 0;
|
|
300
|
+
quad[i++] = 0;
|
|
301
|
+
}
|
|
302
|
+
quad[i++] = x4;
|
|
303
|
+
quad[i++] = y4;
|
|
304
|
+
quad[i++] = color.r;
|
|
305
|
+
quad[i++] = color.g;
|
|
306
|
+
quad[i++] = color.b;
|
|
307
|
+
quad[i++] = color.a;
|
|
308
|
+
quad[i++] = 0;
|
|
309
|
+
quad[i++] = 0;
|
|
310
|
+
if (this.twoColorTint) {
|
|
311
|
+
quad[i++] = 0;
|
|
312
|
+
quad[i++] = 0;
|
|
313
|
+
quad[i++] = 0;
|
|
314
|
+
quad[i] = 0;
|
|
315
|
+
}
|
|
316
|
+
this.batcher.draw(texture, quad, QUAD_TRIANGLES);
|
|
317
|
+
}
|
|
318
|
+
drawRegion(region, x, y, width, height, color = null) {
|
|
319
|
+
this.enableRenderer(this.batcher);
|
|
320
|
+
if (color === null)
|
|
321
|
+
color = WHITE;
|
|
322
|
+
var i = 0;
|
|
323
|
+
quad[i++] = x;
|
|
324
|
+
quad[i++] = y;
|
|
325
|
+
quad[i++] = color.r;
|
|
326
|
+
quad[i++] = color.g;
|
|
327
|
+
quad[i++] = color.b;
|
|
328
|
+
quad[i++] = color.a;
|
|
329
|
+
quad[i++] = region.u;
|
|
330
|
+
quad[i++] = region.v2;
|
|
331
|
+
if (this.twoColorTint) {
|
|
332
|
+
quad[i++] = 0;
|
|
333
|
+
quad[i++] = 0;
|
|
334
|
+
quad[i++] = 0;
|
|
335
|
+
quad[i++] = 0;
|
|
336
|
+
}
|
|
337
|
+
quad[i++] = x + width;
|
|
338
|
+
quad[i++] = y;
|
|
339
|
+
quad[i++] = color.r;
|
|
340
|
+
quad[i++] = color.g;
|
|
341
|
+
quad[i++] = color.b;
|
|
342
|
+
quad[i++] = color.a;
|
|
343
|
+
quad[i++] = region.u2;
|
|
344
|
+
quad[i++] = region.v2;
|
|
345
|
+
if (this.twoColorTint) {
|
|
346
|
+
quad[i++] = 0;
|
|
347
|
+
quad[i++] = 0;
|
|
348
|
+
quad[i++] = 0;
|
|
349
|
+
quad[i++] = 0;
|
|
350
|
+
}
|
|
351
|
+
quad[i++] = x + width;
|
|
352
|
+
quad[i++] = y + height;
|
|
353
|
+
quad[i++] = color.r;
|
|
354
|
+
quad[i++] = color.g;
|
|
355
|
+
quad[i++] = color.b;
|
|
356
|
+
quad[i++] = color.a;
|
|
357
|
+
quad[i++] = region.u2;
|
|
358
|
+
quad[i++] = region.v;
|
|
359
|
+
if (this.twoColorTint) {
|
|
360
|
+
quad[i++] = 0;
|
|
361
|
+
quad[i++] = 0;
|
|
362
|
+
quad[i++] = 0;
|
|
363
|
+
quad[i++] = 0;
|
|
364
|
+
}
|
|
365
|
+
quad[i++] = x;
|
|
366
|
+
quad[i++] = y + height;
|
|
367
|
+
quad[i++] = color.r;
|
|
368
|
+
quad[i++] = color.g;
|
|
369
|
+
quad[i++] = color.b;
|
|
370
|
+
quad[i++] = color.a;
|
|
371
|
+
quad[i++] = region.u;
|
|
372
|
+
quad[i++] = region.v;
|
|
373
|
+
if (this.twoColorTint) {
|
|
374
|
+
quad[i++] = 0;
|
|
375
|
+
quad[i++] = 0;
|
|
376
|
+
quad[i++] = 0;
|
|
377
|
+
quad[i] = 0;
|
|
378
|
+
}
|
|
379
|
+
this.batcher.draw(region.page.texture, quad, QUAD_TRIANGLES);
|
|
380
|
+
}
|
|
381
|
+
line(x, y, x2, y2, color = null, color2 = null) {
|
|
382
|
+
this.enableRenderer(this.shapes);
|
|
383
|
+
this.shapes.line(x, y, x2, y2, color);
|
|
384
|
+
}
|
|
385
|
+
triangle(filled, x, y, x2, y2, x3, y3, color = null, color2 = null, color3 = null) {
|
|
386
|
+
this.enableRenderer(this.shapes);
|
|
387
|
+
this.shapes.triangle(filled, x, y, x2, y2, x3, y3, color, color2, color3);
|
|
388
|
+
}
|
|
389
|
+
quad(filled, x, y, x2, y2, x3, y3, x4, y4, color = null, color2 = null, color3 = null, color4 = null) {
|
|
390
|
+
this.enableRenderer(this.shapes);
|
|
391
|
+
this.shapes.quad(filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4);
|
|
392
|
+
}
|
|
393
|
+
rect(filled, x, y, width, height, color = null) {
|
|
394
|
+
this.enableRenderer(this.shapes);
|
|
395
|
+
this.shapes.rect(filled, x, y, width, height, color);
|
|
396
|
+
}
|
|
397
|
+
rectLine(filled, x1, y1, x2, y2, width, color = null) {
|
|
398
|
+
this.enableRenderer(this.shapes);
|
|
399
|
+
this.shapes.rectLine(filled, x1, y1, x2, y2, width, color);
|
|
400
|
+
}
|
|
401
|
+
polygon(polygonVertices, offset, count, color = null) {
|
|
402
|
+
this.enableRenderer(this.shapes);
|
|
403
|
+
this.shapes.polygon(polygonVertices, offset, count, color);
|
|
404
|
+
}
|
|
405
|
+
circle(filled, x, y, radius, color = null, segments = 0) {
|
|
406
|
+
this.enableRenderer(this.shapes);
|
|
407
|
+
this.shapes.circle(filled, x, y, radius, color, segments);
|
|
408
|
+
}
|
|
409
|
+
curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color = null) {
|
|
410
|
+
this.enableRenderer(this.shapes);
|
|
411
|
+
this.shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color);
|
|
412
|
+
}
|
|
413
|
+
end() {
|
|
414
|
+
if (this.activeRenderer === this.batcher)
|
|
415
|
+
this.batcher.end();
|
|
416
|
+
else if (this.activeRenderer === this.shapes)
|
|
417
|
+
this.shapes.end();
|
|
418
|
+
this.activeRenderer = null;
|
|
419
|
+
}
|
|
420
|
+
resize(resizeMode) {
|
|
421
|
+
let canvas = this.canvas;
|
|
422
|
+
var dpr = window.devicePixelRatio || 1;
|
|
423
|
+
var w = Math.round(canvas.clientWidth * dpr);
|
|
424
|
+
var h = Math.round(canvas.clientHeight * dpr);
|
|
425
|
+
if (canvas.width != w || canvas.height != h) {
|
|
426
|
+
canvas.width = w;
|
|
427
|
+
canvas.height = h;
|
|
428
|
+
}
|
|
429
|
+
this.context.gl.viewport(0, 0, canvas.width, canvas.height);
|
|
430
|
+
// Nothing to do for stretch, we simply apply the viewport size of the camera.
|
|
431
|
+
if (resizeMode === ResizeMode.Expand)
|
|
432
|
+
this.camera.setViewport(w, h);
|
|
433
|
+
else if (resizeMode === ResizeMode.Fit) {
|
|
434
|
+
let sourceWidth = canvas.width, sourceHeight = canvas.height;
|
|
435
|
+
let targetWidth = this.camera.viewportWidth, targetHeight = this.camera.viewportHeight;
|
|
436
|
+
let targetRatio = targetHeight / targetWidth;
|
|
437
|
+
let sourceRatio = sourceHeight / sourceWidth;
|
|
438
|
+
let scale = targetRatio < sourceRatio ? targetWidth / sourceWidth : targetHeight / sourceHeight;
|
|
439
|
+
this.camera.setViewport(sourceWidth * scale, sourceHeight * scale);
|
|
440
|
+
}
|
|
441
|
+
this.camera.update();
|
|
442
|
+
}
|
|
443
|
+
enableRenderer(renderer) {
|
|
444
|
+
if (this.activeRenderer === renderer)
|
|
445
|
+
return;
|
|
446
|
+
this.end();
|
|
447
|
+
if (renderer instanceof PolygonBatcher) {
|
|
448
|
+
this.batcherShader.bind();
|
|
449
|
+
this.batcherShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values);
|
|
450
|
+
this.batcherShader.setUniformi("u_texture", 0);
|
|
451
|
+
this.batcher.begin(this.batcherShader);
|
|
452
|
+
this.activeRenderer = this.batcher;
|
|
453
|
+
}
|
|
454
|
+
else if (renderer instanceof ShapeRenderer) {
|
|
455
|
+
this.shapesShader.bind();
|
|
456
|
+
this.shapesShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values);
|
|
457
|
+
this.shapes.begin(this.shapesShader);
|
|
458
|
+
this.activeRenderer = this.shapes;
|
|
459
|
+
}
|
|
460
|
+
else
|
|
461
|
+
this.activeRenderer = this.skeletonDebugRenderer;
|
|
462
|
+
}
|
|
463
|
+
dispose() {
|
|
464
|
+
this.batcher.dispose();
|
|
465
|
+
this.batcherShader.dispose();
|
|
466
|
+
this.shapes.dispose();
|
|
467
|
+
this.shapesShader.dispose();
|
|
468
|
+
this.skeletonDebugRenderer.dispose();
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
export var ResizeMode;
|
|
472
|
+
(function (ResizeMode) {
|
|
473
|
+
ResizeMode[ResizeMode["Stretch"] = 0] = "Stretch";
|
|
474
|
+
ResizeMode[ResizeMode["Expand"] = 1] = "Expand";
|
|
475
|
+
ResizeMode[ResizeMode["Fit"] = 2] = "Fit";
|
|
476
|
+
})(ResizeMode || (ResizeMode = {}));
|
|
477
477
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NlbmVSZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TY2VuZVJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsS0FBSyxFQUF3QixTQUFTLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFDMUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZELENBQUM7QUFFRCxNQUFNLElBQUksR0FBRztJQUNaLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3RCLENBQUM7QUFDRixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFcEMsTUFBTSxPQUFPLGFBQWE7SUFhekIsWUFBYSxNQUF5QixFQUFFLE9BQTZELEVBQUUsZUFBd0IsSUFBSTtRQVIzSCxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQVM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sWUFBWSw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JILElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekgsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELEtBQUs7UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUFZLENBQUUsUUFBa0IsRUFBRSxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDbkcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxpQkFBaUIsQ0FBRSxRQUFrQixFQUFFLGtCQUFrQixHQUFHLEtBQUssRUFBRSxlQUE4QixJQUFJO1FBQ3BHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUNuRSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxXQUFXLENBQUUsT0FBa0IsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsUUFBZSxJQUFJO1FBQ3hHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksSUFB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QUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxrQkFBa0IsQ0FBRSxPQUFrQixFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLEtBQWEsRUFBRSxRQUFlLElBQUk7UUFDOUosSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUFFLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbEMsNkRBQTZEO1FBQzdELElBQUksWUFBWSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDOUIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUM5QixJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNqQixJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNqQixJQUFJLEdBQUcsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLElBQUksR0FBRyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFMUIsd0VBQXdFO1FBQ3hFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUViLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVYLFNBQVM7UUFDVCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDZixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFbEMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUMzQixFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBRTNCLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDM0IsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUUzQixFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzNCLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFFM0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNwQixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ3BCO2FBQU07WUFDTixFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ1QsRUFBRSxHQUFHLEdBQUcsQ0FBQztZQUVULEVBQUUsR0FBRyxHQUFHLENBQUM7WUFDVCxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBRVQsRUFBRSxHQUFHLEdBQUcsQ0FBQztZQUNULEVBQUUsR0FBRyxHQUFHLENBQUM7WUFFVCxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ1QsRUFBRSxHQUFHLEdBQUcsQ0FBQztTQUNUO1FBRUQsRUFBRSxJQUFJLFlBQVksQ0FBQztRQUNuQixFQUFFLElBQUksWUFBWSxDQUFDO1FBQ25CLEVBQUUsSUFBSSxZQUFZLENBQUM7UUFDbkIsRUFBRSxJQUFJLFlBQVksQ0FBQztRQUNuQixFQUFFLElBQUksWUFBWSxDQUFDO1FBQ25CLEVBQUUsSUFBSSxZQUFZLENBQUM7UUFDbkIsRUFBRSxJQUFJLFlBQVksQ0FBQztRQUNuQixFQUFFLElBQUksWUFBWSxDQUFDO1FBRW5CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELFVBQVUsQ0FBRSxNQUEwQixFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxRQUFlLElBQUk7UUFDL0csSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUFFLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDdkIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENB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
|