hart-estate-widget 0.0.66 → 0.0.69
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/README.md +3 -0
- package/build/assets/css/index.css +2 -0
- package/build/assets/img/floor-dark.jpg +0 -0
- package/build/assets/img/floor-white.jpg +0 -0
- package/build/assets/img/grass.jpg +0 -0
- package/build/bundle.js +2 -0
- package/build/components/Application.js +2 -135
- package/build/components/Buttons/FullScreenButton.js +2 -50
- package/build/components/Buttons/TabButton.js +2 -24
- package/build/components/Instructions.js +2 -54
- package/build/components/Loader.js +2 -22
- package/build/components/ModelTab.js +2 -213
- package/build/components/PanoramaTab.js +2 -620
- package/build/components/RotationTab/DefaultView.js +2 -124
- package/build/components/RotationTab/ThreesixtyView.js +2 -45
- package/build/components/RotationTab/index.js +2 -194
- package/build/components/Widget.js +2 -110
- package/build/config/defaultConfig.js +2 -32
- package/build/enums/deviceOrientationStatuses.js +2 -11
- package/build/enums/deviceWidth.js +2 -21
- package/build/enums/imageExtentions.js +2 -16
- package/build/enums/rotationModes.js +2 -11
- package/build/index.css +1 -1
- package/build/index.js +2 -75
- package/build/locale/index.js +2 -71
- package/build/store/apiStore.js +2 -231
- package/build/store/deviceStore.js +2 -60
- package/build/store/fullScreenStore.js +2 -159
- package/build/store/houseStore.js +2 -952
- package/build/store/index.js +2 -124
- package/build/store/modelStore.js +2 -338
- package/build/threesixty/events.js +2 -220
- package/build/threesixty/index.js +2 -264
- package/build/utils/csg/csg-lib.js +2 -472
- package/build/utils/csg/csg-worker.js +2 -84
- package/build/utils/csg/three-csg.js +2 -277
- package/build/utils/helpers.js +2 -12
- package/build/utils/modelHelpers.js +2 -161
- package/build/utils/panoramaHelpers.js +2 -117
- package/package.json +17 -5
- package/build/assets/css/app.css +0 -1
- package/build/assets/css/app.css.map +0 -1
- package/build/assets/img/floor-dark.png +0 -0
- package/build/assets/img/floor-white.png +0 -0
- package/build/assets/img/grass.png +0 -0
@@ -1,472 +1,2 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.Vertex = exports.Vector = exports.Polygon = exports.Plane = exports.CSG = void 0;
|
7
|
-
|
8
|
-
var _react = _interopRequireDefault(require("react"));
|
9
|
-
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
11
|
-
|
12
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
13
|
-
|
14
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
15
|
-
|
16
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
17
|
-
|
18
|
-
var CSG = /*#__PURE__*/function () {
|
19
|
-
function CSG() {
|
20
|
-
_classCallCheck(this, CSG);
|
21
|
-
|
22
|
-
this.polygons = [];
|
23
|
-
}
|
24
|
-
|
25
|
-
_createClass(CSG, [{
|
26
|
-
key: "clone",
|
27
|
-
value: function clone() {
|
28
|
-
var csg = new CSG();
|
29
|
-
csg.polygons = this.polygons.map(function (p) {
|
30
|
-
return p.clone();
|
31
|
-
});
|
32
|
-
return csg;
|
33
|
-
}
|
34
|
-
}, {
|
35
|
-
key: "toPolygons",
|
36
|
-
value: function toPolygons() {
|
37
|
-
return this.polygons;
|
38
|
-
}
|
39
|
-
}, {
|
40
|
-
key: "union",
|
41
|
-
value: function union(csg) {
|
42
|
-
var a = new Node(this.clone().polygons);
|
43
|
-
var b = new Node(csg.clone().polygons);
|
44
|
-
a.clipTo(b);
|
45
|
-
b.clipTo(a);
|
46
|
-
b.invert();
|
47
|
-
b.clipTo(a);
|
48
|
-
b.invert();
|
49
|
-
a.build(b.allPolygons());
|
50
|
-
return CSG.fromPolygons(a.allPolygons());
|
51
|
-
}
|
52
|
-
}, {
|
53
|
-
key: "subtract",
|
54
|
-
value: function subtract(csg) {
|
55
|
-
var a = new Node(this.clone().polygons);
|
56
|
-
var b = new Node(csg.clone().polygons);
|
57
|
-
a.invert();
|
58
|
-
a.clipTo(b);
|
59
|
-
b.clipTo(a);
|
60
|
-
b.invert();
|
61
|
-
b.clipTo(a);
|
62
|
-
b.invert();
|
63
|
-
a.build(b.allPolygons());
|
64
|
-
a.invert();
|
65
|
-
return CSG.fromPolygons(a.allPolygons());
|
66
|
-
}
|
67
|
-
}, {
|
68
|
-
key: "intersect",
|
69
|
-
value: function intersect(csg) {
|
70
|
-
var a = new Node(this.clone().polygons);
|
71
|
-
var b = new Node(csg.clone().polygons);
|
72
|
-
a.invert();
|
73
|
-
b.clipTo(a);
|
74
|
-
b.invert();
|
75
|
-
a.clipTo(b);
|
76
|
-
b.clipTo(a);
|
77
|
-
a.build(b.allPolygons());
|
78
|
-
a.invert();
|
79
|
-
return CSG.fromPolygons(a.allPolygons());
|
80
|
-
} // Return a new CSG solid with solid and empty space switched. This solid is
|
81
|
-
// not modified.
|
82
|
-
|
83
|
-
}, {
|
84
|
-
key: "inverse",
|
85
|
-
value: function inverse() {
|
86
|
-
var csg = this.clone();
|
87
|
-
csg.polygons.forEach(function (p) {
|
88
|
-
return p.flip();
|
89
|
-
});
|
90
|
-
return csg;
|
91
|
-
}
|
92
|
-
}]);
|
93
|
-
|
94
|
-
return CSG;
|
95
|
-
}();
|
96
|
-
|
97
|
-
exports.CSG = CSG;
|
98
|
-
|
99
|
-
CSG.fromPolygons = function (polygons) {
|
100
|
-
var csg = new CSG();
|
101
|
-
csg.polygons = polygons;
|
102
|
-
return csg;
|
103
|
-
};
|
104
|
-
|
105
|
-
var Vector = /*#__PURE__*/function () {
|
106
|
-
function Vector() {
|
107
|
-
var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
108
|
-
var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
109
|
-
var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
110
|
-
|
111
|
-
_classCallCheck(this, Vector);
|
112
|
-
|
113
|
-
this.x = x;
|
114
|
-
this.y = y;
|
115
|
-
this.z = z;
|
116
|
-
}
|
117
|
-
|
118
|
-
_createClass(Vector, [{
|
119
|
-
key: "copy",
|
120
|
-
value: function copy(v) {
|
121
|
-
this.x = v.x;
|
122
|
-
this.y = v.y;
|
123
|
-
this.z = v.z;
|
124
|
-
return this;
|
125
|
-
}
|
126
|
-
}, {
|
127
|
-
key: "clone",
|
128
|
-
value: function clone() {
|
129
|
-
return new Vector(this.x, this.y, this.z);
|
130
|
-
}
|
131
|
-
}, {
|
132
|
-
key: "negate",
|
133
|
-
value: function negate() {
|
134
|
-
this.x *= -1;
|
135
|
-
this.y *= -1;
|
136
|
-
this.z *= -1;
|
137
|
-
return this;
|
138
|
-
}
|
139
|
-
}, {
|
140
|
-
key: "add",
|
141
|
-
value: function add(a) {
|
142
|
-
this.x += a.x;
|
143
|
-
this.y += a.y;
|
144
|
-
this.z += a.z;
|
145
|
-
return this;
|
146
|
-
}
|
147
|
-
}, {
|
148
|
-
key: "sub",
|
149
|
-
value: function sub(a) {
|
150
|
-
this.x -= a.x;
|
151
|
-
this.y -= a.y;
|
152
|
-
this.z -= a.z;
|
153
|
-
return this;
|
154
|
-
}
|
155
|
-
}, {
|
156
|
-
key: "times",
|
157
|
-
value: function times(a) {
|
158
|
-
this.x *= a;
|
159
|
-
this.y *= a;
|
160
|
-
this.z *= a;
|
161
|
-
return this;
|
162
|
-
}
|
163
|
-
}, {
|
164
|
-
key: "dividedBy",
|
165
|
-
value: function dividedBy(a) {
|
166
|
-
this.x /= a;
|
167
|
-
this.y /= a;
|
168
|
-
this.z /= a;
|
169
|
-
return this;
|
170
|
-
}
|
171
|
-
}, {
|
172
|
-
key: "lerp",
|
173
|
-
value: function lerp(a, t) {
|
174
|
-
return this.add(tv0.copy(a).sub(this).times(t));
|
175
|
-
}
|
176
|
-
}, {
|
177
|
-
key: "unit",
|
178
|
-
value: function unit() {
|
179
|
-
return this.dividedBy(this.length());
|
180
|
-
}
|
181
|
-
}, {
|
182
|
-
key: "length",
|
183
|
-
value: function length() {
|
184
|
-
return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2) + Math.pow(this.z, 2));
|
185
|
-
}
|
186
|
-
}, {
|
187
|
-
key: "normalize",
|
188
|
-
value: function normalize() {
|
189
|
-
return this.unit();
|
190
|
-
}
|
191
|
-
}, {
|
192
|
-
key: "cross",
|
193
|
-
value: function cross(b) {
|
194
|
-
var a = this;
|
195
|
-
var ax = a.x,
|
196
|
-
ay = a.y,
|
197
|
-
az = a.z;
|
198
|
-
var bx = b.x,
|
199
|
-
by = b.y,
|
200
|
-
bz = b.z;
|
201
|
-
this.x = ay * bz - az * by;
|
202
|
-
this.y = az * bx - ax * bz;
|
203
|
-
this.z = ax * by - ay * bx;
|
204
|
-
return this;
|
205
|
-
}
|
206
|
-
}, {
|
207
|
-
key: "dot",
|
208
|
-
value: function dot(b) {
|
209
|
-
return this.x * b.x + this.y * b.y + this.z * b.z;
|
210
|
-
}
|
211
|
-
}]);
|
212
|
-
|
213
|
-
return Vector;
|
214
|
-
}();
|
215
|
-
|
216
|
-
exports.Vector = Vector;
|
217
|
-
var tv0 = new Vector();
|
218
|
-
var tv1 = new Vector();
|
219
|
-
|
220
|
-
var Vertex = /*#__PURE__*/function () {
|
221
|
-
function Vertex(pos, normal, uv, color) {
|
222
|
-
_classCallCheck(this, Vertex);
|
223
|
-
|
224
|
-
this.pos = new Vector().copy(pos);
|
225
|
-
this.normal = new Vector().copy(normal);
|
226
|
-
uv && (this.uv = new Vector().copy(uv)) && (this.uv.z = 0);
|
227
|
-
color && (this.color = new Vector().copy(color));
|
228
|
-
}
|
229
|
-
|
230
|
-
_createClass(Vertex, [{
|
231
|
-
key: "clone",
|
232
|
-
value: function clone() {
|
233
|
-
return new Vertex(this.pos, this.normal, this.uv, this.color);
|
234
|
-
}
|
235
|
-
}, {
|
236
|
-
key: "flip",
|
237
|
-
value: function flip() {
|
238
|
-
this.normal.negate();
|
239
|
-
}
|
240
|
-
}, {
|
241
|
-
key: "interpolate",
|
242
|
-
value: function interpolate(other, t) {
|
243
|
-
return new Vertex(this.pos.clone().lerp(other.pos, t), this.normal.clone().lerp(other.normal, t), this.uv && other.uv && this.uv.clone().lerp(other.uv, t), this.color && other.color && this.color.clone().lerp(other.color, t));
|
244
|
-
}
|
245
|
-
}]);
|
246
|
-
|
247
|
-
return Vertex;
|
248
|
-
}();
|
249
|
-
|
250
|
-
exports.Vertex = Vertex;
|
251
|
-
|
252
|
-
var Plane = /*#__PURE__*/function () {
|
253
|
-
function Plane(normal, w) {
|
254
|
-
_classCallCheck(this, Plane);
|
255
|
-
|
256
|
-
this.normal = normal;
|
257
|
-
this.w = w;
|
258
|
-
}
|
259
|
-
|
260
|
-
_createClass(Plane, [{
|
261
|
-
key: "clone",
|
262
|
-
value: function clone() {
|
263
|
-
return new Plane(this.normal.clone(), this.w);
|
264
|
-
}
|
265
|
-
}, {
|
266
|
-
key: "flip",
|
267
|
-
value: function flip() {
|
268
|
-
this.normal.negate();
|
269
|
-
this.w = -this.w;
|
270
|
-
}
|
271
|
-
}, {
|
272
|
-
key: "splitPolygon",
|
273
|
-
value: function splitPolygon(polygon, coplanarFront, coplanarBack, front, back) {
|
274
|
-
var COPLANAR = 0;
|
275
|
-
var FRONT = 1;
|
276
|
-
var BACK = 2;
|
277
|
-
var SPANNING = 3;
|
278
|
-
var polygonType = 0;
|
279
|
-
var types = [];
|
280
|
-
|
281
|
-
for (var i = 0; i < polygon.vertices.length; i++) {
|
282
|
-
var t = this.normal.dot(polygon.vertices[i].pos) - this.w;
|
283
|
-
var type = t < -Plane.EPSILON ? BACK : t > Plane.EPSILON ? FRONT : COPLANAR;
|
284
|
-
polygonType |= type;
|
285
|
-
types.push(type);
|
286
|
-
}
|
287
|
-
|
288
|
-
switch (polygonType) {
|
289
|
-
case COPLANAR:
|
290
|
-
(this.normal.dot(polygon.plane.normal) > 0 ? coplanarFront : coplanarBack).push(polygon);
|
291
|
-
break;
|
292
|
-
|
293
|
-
case FRONT:
|
294
|
-
front.push(polygon);
|
295
|
-
break;
|
296
|
-
|
297
|
-
case BACK:
|
298
|
-
back.push(polygon);
|
299
|
-
break;
|
300
|
-
|
301
|
-
case SPANNING:
|
302
|
-
var f = [];
|
303
|
-
var b = [];
|
304
|
-
|
305
|
-
for (var _i = 0; _i < polygon.vertices.length; _i++) {
|
306
|
-
var j = (_i + 1) % polygon.vertices.length;
|
307
|
-
var ti = types[_i],
|
308
|
-
tj = types[j];
|
309
|
-
var vi = polygon.vertices[_i],
|
310
|
-
vj = polygon.vertices[j];
|
311
|
-
if (ti != BACK) f.push(vi);
|
312
|
-
if (ti != FRONT) b.push(ti != BACK ? vi.clone() : vi);
|
313
|
-
|
314
|
-
if ((ti | tj) == SPANNING) {
|
315
|
-
var _t = (this.w - this.normal.dot(vi.pos)) / this.normal.dot(tv0.copy(vj.pos).sub(vi.pos));
|
316
|
-
|
317
|
-
var v = vi.interpolate(vj, _t);
|
318
|
-
f.push(v);
|
319
|
-
b.push(v.clone());
|
320
|
-
}
|
321
|
-
}
|
322
|
-
|
323
|
-
if (f.length >= 3) front.push(new Polygon(f, polygon.shared));
|
324
|
-
if (b.length >= 3) back.push(new Polygon(b, polygon.shared));
|
325
|
-
break;
|
326
|
-
}
|
327
|
-
}
|
328
|
-
}]);
|
329
|
-
|
330
|
-
return Plane;
|
331
|
-
}();
|
332
|
-
|
333
|
-
exports.Plane = Plane;
|
334
|
-
Plane.EPSILON = 1e-5;
|
335
|
-
|
336
|
-
Plane.fromPoints = function (a, b, c) {
|
337
|
-
var n = tv0.copy(b).sub(a).cross(tv1.copy(c).sub(a)).normalize();
|
338
|
-
return new Plane(n.clone(), n.dot(a));
|
339
|
-
};
|
340
|
-
|
341
|
-
var Polygon = /*#__PURE__*/function () {
|
342
|
-
function Polygon(vertices, shared) {
|
343
|
-
_classCallCheck(this, Polygon);
|
344
|
-
|
345
|
-
this.vertices = vertices;
|
346
|
-
this.shared = shared;
|
347
|
-
this.plane = Plane.fromPoints(vertices[0].pos, vertices[1].pos, vertices[2].pos);
|
348
|
-
}
|
349
|
-
|
350
|
-
_createClass(Polygon, [{
|
351
|
-
key: "clone",
|
352
|
-
value: function clone() {
|
353
|
-
return new Polygon(this.vertices.map(function (v) {
|
354
|
-
return v.clone();
|
355
|
-
}), this.shared);
|
356
|
-
}
|
357
|
-
}, {
|
358
|
-
key: "flip",
|
359
|
-
value: function flip() {
|
360
|
-
this.vertices.reverse().forEach(function (v) {
|
361
|
-
return v.flip();
|
362
|
-
});
|
363
|
-
this.plane.flip();
|
364
|
-
}
|
365
|
-
}]);
|
366
|
-
|
367
|
-
return Polygon;
|
368
|
-
}();
|
369
|
-
|
370
|
-
exports.Polygon = Polygon;
|
371
|
-
|
372
|
-
var Node = /*#__PURE__*/function () {
|
373
|
-
function Node(polygons) {
|
374
|
-
_classCallCheck(this, Node);
|
375
|
-
|
376
|
-
this.plane = null;
|
377
|
-
this.front = null;
|
378
|
-
this.back = null;
|
379
|
-
this.polygons = [];
|
380
|
-
if (polygons) this.build(polygons);
|
381
|
-
}
|
382
|
-
|
383
|
-
_createClass(Node, [{
|
384
|
-
key: "clone",
|
385
|
-
value: function clone() {
|
386
|
-
var node = new Node();
|
387
|
-
node.plane = this.plane && this.plane.clone();
|
388
|
-
node.front = this.front && this.front.clone();
|
389
|
-
node.back = this.back && this.back.clone();
|
390
|
-
node.polygons = this.polygons.map(function (p) {
|
391
|
-
return p.clone();
|
392
|
-
});
|
393
|
-
return node;
|
394
|
-
}
|
395
|
-
}, {
|
396
|
-
key: "invert",
|
397
|
-
value: function invert() {
|
398
|
-
for (var i = 0; i < this.polygons.length; i++) {
|
399
|
-
this.polygons[i].flip();
|
400
|
-
}
|
401
|
-
|
402
|
-
this.plane && this.plane.flip();
|
403
|
-
this.front && this.front.invert();
|
404
|
-
this.back && this.back.invert();
|
405
|
-
var temp = this.front;
|
406
|
-
this.front = this.back;
|
407
|
-
this.back = temp;
|
408
|
-
}
|
409
|
-
}, {
|
410
|
-
key: "clipPolygons",
|
411
|
-
value: function clipPolygons(polygons) {
|
412
|
-
if (!this.plane) return polygons.slice();
|
413
|
-
var front = [],
|
414
|
-
back = [];
|
415
|
-
|
416
|
-
for (var i = 0; i < polygons.length; i++) {
|
417
|
-
this.plane.splitPolygon(polygons[i], front, back, front, back);
|
418
|
-
}
|
419
|
-
|
420
|
-
if (this.front) front = this.front.clipPolygons(front);
|
421
|
-
if (this.back) back = this.back.clipPolygons(back);else back = [];
|
422
|
-
return front.concat(back);
|
423
|
-
}
|
424
|
-
}, {
|
425
|
-
key: "clipTo",
|
426
|
-
value: function clipTo(bsp) {
|
427
|
-
this.polygons = bsp.clipPolygons(this.polygons);
|
428
|
-
if (this.front) this.front.clipTo(bsp);
|
429
|
-
if (this.back) this.back.clipTo(bsp);
|
430
|
-
}
|
431
|
-
}, {
|
432
|
-
key: "allPolygons",
|
433
|
-
value: function allPolygons() {
|
434
|
-
var polygons = this.polygons.slice();
|
435
|
-
if (this.front) polygons = polygons.concat(this.front.allPolygons());
|
436
|
-
if (this.back) polygons = polygons.concat(this.back.allPolygons());
|
437
|
-
return polygons;
|
438
|
-
}
|
439
|
-
}, {
|
440
|
-
key: "build",
|
441
|
-
value: function build(polygons) {
|
442
|
-
if (!polygons.length) return;
|
443
|
-
if (!this.plane) this.plane = polygons[0].plane.clone();
|
444
|
-
var front = [],
|
445
|
-
back = [];
|
446
|
-
|
447
|
-
for (var i = 0; i < polygons.length; i++) {
|
448
|
-
this.plane.splitPolygon(polygons[i], this.polygons, this.polygons, front, back);
|
449
|
-
}
|
450
|
-
|
451
|
-
if (front.length) {
|
452
|
-
if (!this.front) this.front = new Node();
|
453
|
-
this.front.build(front);
|
454
|
-
}
|
455
|
-
|
456
|
-
if (back.length) {
|
457
|
-
if (!this.back) this.back = new Node();
|
458
|
-
this.back.build(back);
|
459
|
-
}
|
460
|
-
}
|
461
|
-
}]);
|
462
|
-
|
463
|
-
return Node;
|
464
|
-
}();
|
465
|
-
|
466
|
-
CSG.fromJSON = function (json) {
|
467
|
-
return CSG.fromPolygons(json.polygons.map(function (p) {
|
468
|
-
return new Polygon(p.vertices.map(function (v) {
|
469
|
-
return new Vertex(v.pos, v.normal, v.uv);
|
470
|
-
}), p.shared);
|
471
|
-
}));
|
472
|
-
};
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Vertex=exports.Vector=exports.Polygon=exports.Plane=exports.CSG=void 0;var _react=_interopRequireDefault(require("react"));function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _defineProperties(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function _createClass(t,e,n){return e&&_defineProperties(t.prototype,e),n&&_defineProperties(t,n),Object.defineProperty(t,"prototype",{writable:!1}),t}var CSG=function(){function n(){_classCallCheck(this,n),this.polygons=[]}return _createClass(n,[{key:"clone",value:function(){var t=new n;return t.polygons=this.polygons.map(function(t){return t.clone()}),t}},{key:"toPolygons",value:function(){return this.polygons}},{key:"union",value:function(t){var e=new Node(this.clone().polygons),t=new Node(t.clone().polygons);return e.clipTo(t),t.clipTo(e),t.invert(),t.clipTo(e),t.invert(),e.build(t.allPolygons()),n.fromPolygons(e.allPolygons())}},{key:"subtract",value:function(t){var e=new Node(this.clone().polygons),t=new Node(t.clone().polygons);return e.invert(),e.clipTo(t),t.clipTo(e),t.invert(),t.clipTo(e),t.invert(),e.build(t.allPolygons()),e.invert(),n.fromPolygons(e.allPolygons())}},{key:"intersect",value:function(t){var e=new Node(this.clone().polygons),t=new Node(t.clone().polygons);return e.invert(),t.clipTo(e),t.invert(),e.clipTo(t),t.clipTo(e),e.build(t.allPolygons()),e.invert(),n.fromPolygons(e.allPolygons())}},{key:"inverse",value:function(){var t=this.clone();return t.polygons.forEach(function(t){return t.flip()}),t}}]),n}(),Vector=((exports.CSG=CSG).fromPolygons=function(t){var e=new CSG;return e.polygons=t,e},function(){function o(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:0,e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0,n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:0;_classCallCheck(this,o),this.x=t,this.y=e,this.z=n}return _createClass(o,[{key:"copy",value:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}},{key:"clone",value:function(){return new o(this.x,this.y,this.z)}},{key:"negate",value:function(){return this.x*=-1,this.y*=-1,this.z*=-1,this}},{key:"add",value:function(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}},{key:"sub",value:function(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}},{key:"times",value:function(t){return this.x*=t,this.y*=t,this.z*=t,this}},{key:"dividedBy",value:function(t){return this.x/=t,this.y/=t,this.z/=t,this}},{key:"lerp",value:function(t,e){return this.add(tv0.copy(t).sub(this).times(e))}},{key:"unit",value:function(){return this.dividedBy(this.length())}},{key:"length",value:function(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2)+Math.pow(this.z,2))}},{key:"normalize",value:function(){return this.unit()}},{key:"cross",value:function(t){var e=this.x,n=this.y,o=this.z,i=t.x,s=t.y,t=t.z;return this.x=n*t-o*s,this.y=o*i-e*t,this.z=e*s-n*i,this}},{key:"dot",value:function(t){return this.x*t.x+this.y*t.y+this.z*t.z}}]),o}()),tv0=new(exports.Vector=Vector),tv1=new Vector,Vertex=function(){function i(t,e,n,o){_classCallCheck(this,i),this.pos=(new Vector).copy(t),this.normal=(new Vector).copy(e),n&&(this.uv=(new Vector).copy(n))&&(this.uv.z=0),o&&(this.color=(new Vector).copy(o))}return _createClass(i,[{key:"clone",value:function(){return new i(this.pos,this.normal,this.uv,this.color)}},{key:"flip",value:function(){this.normal.negate()}},{key:"interpolate",value:function(t,e){return new i(this.pos.clone().lerp(t.pos,e),this.normal.clone().lerp(t.normal,e),this.uv&&t.uv&&this.uv.clone().lerp(t.uv,e),this.color&&t.color&&this.color.clone().lerp(t.color,e))}}]),i}(),Plane=(exports.Vertex=Vertex,function(){function g(t,e){_classCallCheck(this,g),this.normal=t,this.w=e}return _createClass(g,[{key:"clone",value:function(){return new g(this.normal.clone(),this.w)}},{key:"flip",value:function(){this.normal.negate(),this.w=-this.w}},{key:"splitPolygon",value:function(t,e,n,o,i){for(var s=0,l=[],r=0;r<t.vertices.length;r++){var c=this.normal.dot(t.vertices[r].pos)-this.w,c=c<-g.EPSILON?2:g.EPSILON<c?1:0;s|=c,l.push(c)}switch(s){case 0:(0<this.normal.dot(t.plane.normal)?e:n).push(t);break;case 1:o.push(t);break;case 2:i.push(t);break;case 3:for(var a=[],h=[],u=0;u<t.vertices.length;u++){var p=(u+1)%t.vertices.length,y=l[u],f=l[p],v=t.vertices[u],p=t.vertices[p];2!=y&&a.push(v),1!=y&&h.push(2!=y?v.clone():v),3==(y|f)&&(y=(this.w-this.normal.dot(v.pos))/this.normal.dot(tv0.copy(p.pos).sub(v.pos)),f=v.interpolate(p,y),a.push(f),h.push(f.clone()))}3<=a.length&&o.push(new Polygon(a,t.shared)),3<=h.length&&i.push(new Polygon(h,t.shared))}}}]),g}()),Polygon=((exports.Plane=Plane).EPSILON=1e-5,Plane.fromPoints=function(t,e,n){e=tv0.copy(e).sub(t).cross(tv1.copy(n).sub(t)).normalize();return new Plane(e.clone(),e.dot(t))},function(){function n(t,e){_classCallCheck(this,n),this.vertices=t,this.shared=e,this.plane=Plane.fromPoints(t[0].pos,t[1].pos,t[2].pos)}return _createClass(n,[{key:"clone",value:function(){return new n(this.vertices.map(function(t){return t.clone()}),this.shared)}},{key:"flip",value:function(){this.vertices.reverse().forEach(function(t){return t.flip()}),this.plane.flip()}}]),n}()),Node=(exports.Polygon=Polygon,function(){function i(t){_classCallCheck(this,i),this.plane=null,this.front=null,this.back=null,this.polygons=[],t&&this.build(t)}return _createClass(i,[{key:"clone",value:function(){var t=new i;return t.plane=this.plane&&this.plane.clone(),t.front=this.front&&this.front.clone(),t.back=this.back&&this.back.clone(),t.polygons=this.polygons.map(function(t){return t.clone()}),t}},{key:"invert",value:function(){for(var t=0;t<this.polygons.length;t++)this.polygons[t].flip();this.plane&&this.plane.flip(),this.front&&this.front.invert(),this.back&&this.back.invert();var e=this.front;this.front=this.back,this.back=e}},{key:"clipPolygons",value:function(t){if(!this.plane)return t.slice();for(var e=[],n=[],o=0;o<t.length;o++)this.plane.splitPolygon(t[o],e,n,e,n);return this.front&&(e=this.front.clipPolygons(e)),n=this.back?this.back.clipPolygons(n):[],e.concat(n)}},{key:"clipTo",value:function(t){this.polygons=t.clipPolygons(this.polygons),this.front&&this.front.clipTo(t),this.back&&this.back.clipTo(t)}},{key:"allPolygons",value:function(){var t=this.polygons.slice();return this.front&&(t=t.concat(this.front.allPolygons())),t=this.back?t.concat(this.back.allPolygons()):t}},{key:"build",value:function(t){if(t.length){this.plane||(this.plane=t[0].plane.clone());for(var e=[],n=[],o=0;o<t.length;o++)this.plane.splitPolygon(t[o],this.polygons,this.polygons,e,n);e.length&&(this.front||(this.front=new i),this.front.build(e)),n.length&&(this.back||(this.back=new i),this.back.build(n))}}}]),i}());CSG.fromJSON=function(t){return CSG.fromPolygons(t.polygons.map(function(t){return new Polygon(t.vertices.map(function(t){return new Vertex(t.pos,t.normal,t.uv)}),t.shared)}))};
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL2NzZy9jc2ctbGliLmpzIl0sIm5hbWVzIjpbIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiQ1NHIiwiX2NsYXNzQ2FsbENoZWNrIiwidGhpcyIsInBvbHlnb25zIiwiY3NnIiwibWFwIiwicCIsImNsb25lIiwiYSIsIk5vZGUiLCJiIiwiY2xpcFRvIiwiaW52ZXJ0IiwiYnVpbGQiLCJhbGxQb2x5Z29ucyIsImZyb21Qb2x5Z29ucyIsImZvckVhY2giLCJmbGlwIiwiVmVjdG9yIiwieCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsInkiLCJ6IiwidiIsInQiLCJhZGQiLCJ0djAiLCJjb3B5Iiwic3ViIiwidGltZXMiLCJkaXZpZGVkQnkiLCJzcXJ0IiwiTWF0aCIsInBvdyIsInVuaXQiLCJheCIsImF5IiwiYXoiLCJieCIsImJ5IiwiYnoiLCJ0djEiLCJWZXJ0ZXgiLCJwb3MiLCJub3JtYWwiLCJ1diIsImNvbG9yIiwibmVnYXRlIiwib3RoZXIiLCJsZXJwIiwiUGxhbmUiLCJ3IiwicG9seWdvbiIsImNvcGxhbmFyRnJvbnQiLCJjb3BsYW5hckJhY2siLCJmcm9udCIsImJhY2siLCJwb2x5Z29uVHlwZSIsInR5cGVzIiwiaSIsInZlcnRpY2VzIiwiZG90IiwidHlwZSIsIkVQU0lMT04iLCJwdXNoIiwicGxhbmUiLCJmIiwiaiIsInRpIiwidGoiLCJ2aSIsInZqIiwiUG9seWdvbiIsInNoYXJlZCIsImZyb21Qb2ludHMiLCJjIiwibiIsImNyb3NzIiwibm9ybWFsaXplIiwibm9kZSIsIkNPUExBTkFSIiwiRlJPTlQiLCJ0ZW1wIiwic2xpY2UiLCJzcGxpdFBvbHlnb24iLCJjbGlwUG9seWdvbnMiLCJTUEFOTklORyIsImNvbmNhdCIsImJzcCIsIkJBQ0siLCJpbnRlcnBvbGF0ZSIsImZyb21KU09OIiwianNvbiJdLCJtYXBwaW5ncyI6Im1KQUFBLElBQUFBLE9BQUFDLHVCQUFBQyxRQUFBLFUscWdC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Yi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmNsYXNzIENTRyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucG9seWdvbnMgPSBbXTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGxldCBjc2cgPSBuZXcgQ1NHKCk7XG4gICAgICAgIGNzZy5wb2x5Z29ucyA9IHRoaXMucG9seWdvbnMubWFwKHA9PnAuY2xvbmUoKSk7XG4gICAgICAgIHJldHVybiBjc2c7XG4gICAgfVxuXG4gICAgdG9Qb2x5Z29ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9seWdvbnM7XG4gICAgfVxuXG4gICAgdW5pb24oY3NnKSB7XG4gICAgICAgIGxldCBhID0gbmV3IE5vZGUodGhpcy5jbG9uZSgpLnBvbHlnb25zKTtcbiAgICAgICAgbGV0IGIgPSBuZXcgTm9kZShjc2cuY2xvbmUoKS5wb2x5Z29ucyk7XG4gICAgICAgIGEuY2xpcFRvKGIpO1xuICAgICAgICBiLmNsaXBUbyhhKTtcbiAgICAgICAgYi5pbnZlcnQoKTtcbiAgICAgICAgYi5jbGlwVG8oYSk7XG4gICAgICAgIGIuaW52ZXJ0KCk7XG4gICAgICAgIGEuYnVpbGQoYi5hbGxQb2x5Z29ucygpKTtcbiAgICAgICAgcmV0dXJuIENTRy5mcm9tUG9seWdvbnMoYS5hbGxQb2x5Z29ucygpKTtcbiAgICB9XG5cbiAgICBzdWJ0cmFjdChjc2cpIHtcbiAgICAgICAgbGV0IGEgPSBuZXcgTm9kZSh0aGlzLmNsb25lKCkucG9seWdvbnMpO1xuICAgICAgICBsZXQgYiA9IG5ldyBOb2RlKGNzZy5jbG9uZSgpLnBvbHlnb25zKTtcbiAgICAgICAgYS5pbnZlcnQoKTtcbiAgICAgICAgYS5jbGlwVG8oYik7XG4gICAgICAgIGIuY2xpcFRvKGEpO1xuICAgICAgICBiLmludmVydCgpO1xuICAgICAgICBiLmNsaXBUbyhhKTtcbiAgICAgICAgYi5pbnZlcnQoKTtcbiAgICAgICAgYS5idWlsZChiLmFsbFBvbHlnb25zKCkpO1xuICAgICAgICBhLmludmVydCgpO1xuICAgICAgICByZXR1cm4gQ1NHLmZyb21Qb2x5Z29ucyhhLmFsbFBvbHlnb25zKCkpO1xuICAgIH1cblxuICAgIGludGVyc2VjdChjc2cpIHtcbiAgICAgICAgbGV0IGEgPSBuZXcgTm9kZSh0aGlzLmNsb25lKCkucG9seWdvbnMpO1xuICAgICAgICBsZXQgYiA9IG5ldyBOb2RlKGNzZy5jbG9uZSgpLnBvbHlnb25zKTtcbiAgICAgICAgYS5pbnZlcnQoKTtcbiAgICAgICAgYi5jbGlwVG8oYSk7XG4gICAgICAgIGIuaW52ZXJ0KCk7XG4gICAgICAgIGEuY2xpcFRvKGIpO1xuICAgICAgICBiLmNsaXBUbyhhKTtcbiAgICAgICAgYS5idWlsZChiLmFsbFBvbHlnb25zKCkpO1xuICAgICAgICBhLmludmVydCgpO1xuICAgICAgICByZXR1cm4gQ1NHLmZyb21Qb2x5Z29ucyhhLmFsbFBvbHlnb25zKCkpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhIG5ldyBDU0cgc29saWQgd2l0aCBzb2xpZCBhbmQgZW1wdHkgc3BhY2Ugc3dpdGNoZWQuIFRoaXMgc29saWQgaXNcbiAgICAvLyBub3QgbW9kaWZpZWQuXG4gICAgaW52ZXJzZSgpIHtcbiAgICAgICAgbGV0IGNzZyA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgY3NnLnBvbHlnb25zLmZvckVhY2gocD0+cC5mbGlwKCkpO1xuICAgICAgICByZXR1cm4gY3NnO1xuICAgIH1cbn1cblxuQ1NHLmZyb21Qb2x5Z29ucz1mdW5jdGlvbihwb2x5Z29ucykge1xuICAgIGxldCBjc2cgPSBuZXcgQ1NHKCk7XG4gICAgY3NnLnBvbHlnb25zID0gcG9seWdvbnM7XG4gICAgcmV0dXJuIGNzZztcbn07XG5cbmNsYXNzIFZlY3RvciB7XG4gICAgY29uc3RydWN0b3IoeD0wLCB5PTAsIHo9MCkge1xuICAgICAgICB0aGlzLng9eDtcbiAgICAgICAgdGhpcy55PXk7XG4gICAgICAgIHRoaXMuej16O1xuICAgIH1cbiAgICBjb3B5KHYpe1xuICAgICAgICB0aGlzLng9di54O1xuICAgICAgICB0aGlzLnk9di55O1xuICAgICAgICB0aGlzLno9di56O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KTtcbiAgICB9XG4gICAgbmVnYXRlKCkge1xuICAgICAgICB0aGlzLngqPS0xO1xuICAgICAgICB0aGlzLnkqPS0xO1xuICAgICAgICB0aGlzLnoqPS0xO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYWRkKGEpIHtcbiAgICAgICAgdGhpcy54Kz1hLng7XG4gICAgICAgIHRoaXMueSs9YS55O1xuICAgICAgICB0aGlzLnorPWEuejtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN1YihhKSB7XG4gICAgICAgIHRoaXMueC09YS54O1xuICAgICAgICB0aGlzLnktPWEueTtcbiAgICAgICAgdGhpcy56LT1hLno7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aW1lcyhhKSB7XG4gICAgICAgIHRoaXMueCo9YTtcbiAgICAgICAgdGhpcy55Kj1hO1xuICAgICAgICB0aGlzLnoqPWE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkaXZpZGVkQnkoYSkge1xuICAgICAgICB0aGlzLngvPWE7XG4gICAgICAgIHRoaXMueS89YTtcbiAgICAgICAgdGhpcy56Lz1hO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbGVycChhLCB0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZCh0djAuY29weShhKS5zdWIodGhpcykudGltZXModCkpO1xuICAgIH1cbiAgICB1bml0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXZpZGVkQnkodGhpcy5sZW5ndGgoKSk7XG4gICAgfVxuICAgIGxlbmd0aCgpe1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KCh0aGlzLngqKjIpKyh0aGlzLnkqKjIpKyh0aGlzLnoqKjIpKTtcbiAgICB9XG4gICAgbm9ybWFsaXplKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnVuaXQoKTtcbiAgICB9XG4gICAgY3Jvc3MoYikge1xuICAgICAgICBsZXQgYSA9IHRoaXM7XG5cdFx0Y29uc3QgYXggPSBhLngsIGF5ID0gYS55LCBheiA9IGEuejtcblx0XHRjb25zdCBieCA9IGIueCwgYnkgPSBiLnksIGJ6ID0gYi56O1xuXG5cdFx0dGhpcy54ID0gYXkgKiBieiAtIGF6ICogYnk7XG5cdFx0dGhpcy55ID0gYXogKiBieCAtIGF4ICogYno7XG5cdFx0dGhpcy56ID0gYXggKiBieSAtIGF5ICogYng7XG5cblx0XHRyZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZG90KGIpe1xuICAgICAgICByZXR1cm4gKHRoaXMueCpiLngpKyh0aGlzLnkqYi55KSsodGhpcy56KmIueik7XG4gICAgfVxufVxuXG5sZXQgdHYwPW5ldyBWZWN0b3IoKTtcbmxldCB0djE9bmV3IFZlY3RvcigpO1xuXG5jbGFzcyBWZXJ0ZXgge1xuXG4gICAgY29uc3RydWN0b3IocG9zLCBub3JtYWwsIHV2LCBjb2xvcikge1xuICAgICAgICB0aGlzLnBvcyA9IG5ldyBWZWN0b3IoKS5jb3B5KHBvcyk7XG4gICAgICAgIHRoaXMubm9ybWFsID0gbmV3IFZlY3RvcigpLmNvcHkobm9ybWFsKTtcbiAgICAgICAgdXYgJiYgKHRoaXMudXYgPSBuZXcgVmVjdG9yKCkuY29weSh1dikpICYmICh0aGlzLnV2Lno9MCk7XG4gICAgICAgIGNvbG9yICYmICh0aGlzLmNvbG9yID0gbmV3IFZlY3RvcigpLmNvcHkoY29sb3IpKTtcbiAgICB9XG5cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXgodGhpcy5wb3MsdGhpcy5ub3JtYWwsdGhpcy51dix0aGlzLmNvbG9yKTtcbiAgICB9XG5cbiAgICBmbGlwKCkge1xuICAgICAgICB0aGlzLm5vcm1hbC5uZWdhdGUoKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShvdGhlciwgdCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlcnRleCh0aGlzLnBvcy5jbG9uZSgpLmxlcnAob3RoZXIucG9zLCB0KSx0aGlzLm5vcm1hbC5jbG9uZSgpLmxlcnAob3RoZXIubm9ybWFsLCB0KSx0aGlzLnV2JiZvdGhlci51diYmdGhpcy51di5jbG9uZSgpLmxlcnAob3RoZXIudXYsIHQpLCB0aGlzLmNvbG9yJiZvdGhlci5jb2xvciYmdGhpcy5jb2xvci5jbG9uZSgpLmxlcnAob3RoZXIuY29sb3IsdCkpO1xuICAgIH1cbn1cblxuY2xhc3MgUGxhbmUge1xuICAgIGNvbnN0cnVjdG9yKG5vcm1hbCwgdykge1xuICAgICAgICB0aGlzLm5vcm1hbCA9IG5vcm1hbDtcbiAgICAgICAgdGhpcy53ID0gdztcbiAgICB9XG5cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGFuZSh0aGlzLm5vcm1hbC5jbG9uZSgpLHRoaXMudyk7XG4gICAgfVxuXG4gICAgZmxpcCgpIHtcbiAgICAgICAgdGhpcy5ub3JtYWwubmVnYXRlKCk7XG4gICAgICAgIHRoaXMudyA9IC10aGlzLnc7XG4gICAgfVxuXG4gICAgc3BsaXRQb2x5Z29uKHBvbHlnb24sIGNvcGxhbmFyRnJvbnQsIGNvcGxhbmFyQmFjaywgZnJvbnQsIGJhY2spIHtcbiAgICAgICAgY29uc3QgQ09QTEFOQVIgPSAwO1xuICAgICAgICBjb25zdCBGUk9OVCA9IDE7XG4gICAgICAgIGNvbnN0IEJBQ0sgPSAyO1xuICAgICAgICBjb25zdCBTUEFOTklORyA9IDM7XG5cbiAgICAgICAgbGV0IHBvbHlnb25UeXBlID0gMDtcbiAgICAgICAgbGV0IHR5cGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbi52ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHQgPSB0aGlzLm5vcm1hbC5kb3QocG9seWdvbi52ZXJ0aWNlc1tpXS5wb3MpIC0gdGhpcy53O1xuICAgICAgICAgICAgbGV0IHR5cGUgPSAodCA8IC1QbGFuZS5FUFNJTE9OKSA/IEJBQ0sgOiAodCA+IFBsYW5lLkVQU0lMT04pID8gRlJPTlQgOiBDT1BMQU5BUjtcbiAgICAgICAgICAgIHBvbHlnb25UeXBlIHw9IHR5cGU7XG4gICAgICAgICAgICB0eXBlcy5wdXNoKHR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChwb2x5Z29uVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBDT1BMQU5BUjpcbiAgICAgICAgICAgICAgICAodGhpcy5ub3JtYWwuZG90KHBvbHlnb24ucGxhbmUubm9ybWFsKSA+IDAgPyBjb3BsYW5hckZyb250IDogY29wbGFuYXJCYWNrKS5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGUk9OVDpcbiAgICAgICAgICAgICAgICBmcm9udC5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBCQUNLOlxuICAgICAgICAgICAgICAgIGJhY2sucHVzaChwb2x5Z29uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU1BBTk5JTkc6XG4gICAgICAgICAgICAgICAgbGV0IGYgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYiA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbi52ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IChpICsgMSkgJSBwb2x5Z29uLnZlcnRpY2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpID0gdHlwZXNbaV1cbiAgICAgICAgICAgICAgICAgICAgLCB0aiA9IHR5cGVzW2pdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmkgPSBwb2x5Z29uLnZlcnRpY2VzW2ldXG4gICAgICAgICAgICAgICAgICAgICwgdmogPSBwb2x5Z29uLnZlcnRpY2VzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGkgIT0gQkFDSylcbiAgICAgICAgICAgICAgICAgICAgICAgIGYucHVzaCh2aSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aSAhPSBGUk9OVClcbiAgICAgICAgICAgICAgICAgICAgICAgIGIucHVzaCh0aSAhPSBCQUNLID8gdmkuY2xvbmUoKSA6IHZpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aSB8IHRqKSA9PSBTUEFOTklORykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSAodGhpcy53IC0gdGhpcy5ub3JtYWwuZG90KHZpLnBvcykpIC8gdGhpcy5ub3JtYWwuZG90KHR2MC5jb3B5KHZqLnBvcykuc3ViKHZpLnBvcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB2aS5pbnRlcnBvbGF0ZSh2aiwgdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgICAgICBiLnB1c2godi5jbG9uZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZi5sZW5ndGggPj0gMylcbiAgICAgICAgICAgICAgICAgICAgZnJvbnQucHVzaChuZXcgUG9seWdvbihmLHBvbHlnb24uc2hhcmVkKSk7XG4gICAgICAgICAgICAgICAgaWYgKGIubGVuZ3RoID49IDMpXG4gICAgICAgICAgICAgICAgICAgIGJhY2sucHVzaChuZXcgUG9seWdvbihiLHBvbHlnb24uc2hhcmVkKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuUGxhbmUuRVBTSUxPTiA9IDFlLTU7XG5cblBsYW5lLmZyb21Qb2ludHMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgbGV0IG4gPSB0djAuY29weShiKS5zdWIoYSkuY3Jvc3ModHYxLmNvcHkoYykuc3ViKGEpKS5ub3JtYWxpemUoKTtcbiAgICByZXR1cm4gbmV3IFBsYW5lKG4uY2xvbmUoKSxuLmRvdChhKSk7XG59O1xuXG5jbGFzcyBQb2x5Z29uIHtcbiAgICBjb25zdHJ1Y3Rvcih2ZXJ0aWNlcywgc2hhcmVkKSB7XG4gICAgICAgIHRoaXMudmVydGljZXMgPSB2ZXJ0aWNlcztcbiAgICAgICAgdGhpcy5zaGFyZWQgPSBzaGFyZWQ7XG4gICAgICAgIHRoaXMucGxhbmUgPSBQbGFuZS5mcm9tUG9pbnRzKHZlcnRpY2VzWzBdLnBvcywgdmVydGljZXNbMV0ucG9zLCB2ZXJ0aWNlc1syXS5wb3MpO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uKHRoaXMudmVydGljZXMubWFwKHY9PnYuY2xvbmUoKSksdGhpcy5zaGFyZWQpO1xuICAgIH1cbiAgICBmbGlwKCkge1xuICAgICAgICB0aGlzLnZlcnRpY2VzLnJldmVyc2UoKS5mb3JFYWNoKHY9PnYuZmxpcCgpKTtcbiAgICAgICAgdGhpcy5wbGFuZS5mbGlwKCk7XG4gICAgfVxufVxuXG5jbGFzcyBOb2RlIHtcbiAgICBjb25zdHJ1Y3Rvcihwb2x5Z29ucykge1xuICAgICAgICB0aGlzLnBsYW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy5mcm9udCA9IG51bGw7XG4gICAgICAgIHRoaXMuYmFjayA9IG51bGw7XG4gICAgICAgIHRoaXMucG9seWdvbnMgPSBbXTtcbiAgICAgICAgaWYgKHBvbHlnb25zKVxuICAgICAgICAgICAgdGhpcy5idWlsZChwb2x5Z29ucyk7XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICBsZXQgbm9kZSA9IG5ldyBOb2RlKCk7XG4gICAgICAgIG5vZGUucGxhbmUgPSB0aGlzLnBsYW5lICYmIHRoaXMucGxhbmUuY2xvbmUoKTtcbiAgICAgICAgbm9kZS5mcm9udCA9IHRoaXMuZnJvbnQgJiYgdGhpcy5mcm9udC5jbG9uZSgpO1xuICAgICAgICBub2RlLmJhY2sgPSB0aGlzLmJhY2sgJiYgdGhpcy5iYWNrLmNsb25lKCk7XG4gICAgICAgIG5vZGUucG9seWdvbnMgPSB0aGlzLnBvbHlnb25zLm1hcChwPT5wLmNsb25lKCkpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBpbnZlcnQoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wb2x5Z29ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMucG9seWdvbnNbaV0uZmxpcCgpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5wbGFuZSAmJiB0aGlzLnBsYW5lLmZsaXAoKTtcbiAgICAgICAgdGhpcy5mcm9udCAmJiB0aGlzLmZyb250LmludmVydCgpO1xuICAgICAgICB0aGlzLmJhY2sgJiYgdGhpcy5iYWNrLmludmVydCgpO1xuICAgICAgICBsZXQgdGVtcCA9IHRoaXMuZnJvbnQ7XG4gICAgICAgIHRoaXMuZnJvbnQgPSB0aGlzLmJhY2s7XG4gICAgICAgIHRoaXMuYmFjayA9IHRlbXA7XG4gICAgfVxuXG4gICAgY2xpcFBvbHlnb25zKHBvbHlnb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5wbGFuZSlcbiAgICAgICAgICAgIHJldHVybiBwb2x5Z29ucy5zbGljZSgpO1xuICAgICAgICBsZXQgZnJvbnQgPSBbXVxuICAgICAgICAgICwgYmFjayA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnBsYW5lLnNwbGl0UG9seWdvbihwb2x5Z29uc1tpXSwgZnJvbnQsIGJhY2ssIGZyb250LCBiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mcm9udClcbiAgICAgICAgICAgIGZyb250ID0gdGhpcy5mcm9udC5jbGlwUG9seWdvbnMoZnJvbnQpO1xuICAgICAgICBpZiAodGhpcy5iYWNrKVxuICAgICAgICAgICAgYmFjayA9IHRoaXMuYmFjay5jbGlwUG9seWdvbnMoYmFjayk7XG4gICAgICAgIGVsc2UgXG4gICAgICAgICAgICBiYWNrID0gW107XG4gICAgICAgIHJldHVybiBmcm9udC5jb25jYXQoYmFjayk7XG4gICAgfVxuXG4gICAgY2xpcFRvKGJzcCkge1xuICAgICAgICB0aGlzLnBvbHlnb25zID0gYnNwLmNsaXBQb2x5Z29ucyh0aGlzLnBvbHlnb25zKTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbnQpXG4gICAgICAgICAgICB0aGlzLmZyb250LmNsaXBUbyhic3ApO1xuICAgICAgICBpZiAodGhpcy5iYWNrKVxuICAgICAgICAgICAgdGhpcy5iYWNrLmNsaXBUbyhic3ApO1xuICAgIH1cblxuICAgIGFsbFBvbHlnb25zKCkge1xuICAgICAgICBsZXQgcG9seWdvbnMgPSB0aGlzLnBvbHlnb25zLnNsaWNlKCk7XG4gICAgICAgIGlmICh0aGlzLmZyb250KVxuICAgICAgICAgICAgcG9seWdvbnMgPSBwb2x5Z29ucy5jb25jYXQodGhpcy5mcm9udC5hbGxQb2x5Z29ucygpKTtcbiAgICAgICAgaWYgKHRoaXMuYmFjaylcbiAgICAgICAgICAgIHBvbHlnb25zID0gcG9seWdvbnMuY29uY2F0KHRoaXMuYmFjay5hbGxQb2x5Z29ucygpKTtcbiAgICAgICAgcmV0dXJuIHBvbHlnb25zO1xuICAgIH1cblxuICAgIGJ1aWxkKHBvbHlnb25zKSB7XG4gICAgICAgIGlmICghcG9seWdvbnMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMucGxhbmUpXG4gICAgICAgICAgICB0aGlzLnBsYW5lID0gcG9seWdvbnNbMF0ucGxhbmUuY2xvbmUoKTtcbiAgICAgICAgbGV0IGZyb250ID0gW11cbiAgICAgICAgICAsIGJhY2sgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5wbGFuZS5zcGxpdFBvbHlnb24ocG9seWdvbnNbaV0sIHRoaXMucG9seWdvbnMsIHRoaXMucG9seWdvbnMsIGZyb250LCBiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnJvbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZnJvbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5mcm9udCA9IG5ldyBOb2RlKCk7XG4gICAgICAgICAgICB0aGlzLmZyb250LmJ1aWxkKGZyb250KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYWNrKVxuICAgICAgICAgICAgICAgIHRoaXMuYmFjayA9IG5ldyBOb2RlKCk7XG4gICAgICAgICAgICB0aGlzLmJhY2suYnVpbGQoYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkNTRy5mcm9tSlNPTj1mdW5jdGlvbihqc29uKXtcbiAgICByZXR1cm4gQ1NHLmZyb21Qb2x5Z29ucyhqc29uLnBvbHlnb25zLm1hcChwPT5uZXcgUG9seWdvbihwLnZlcnRpY2VzLm1hcCh2PT4gbmV3IFZlcnRleCh2LnBvcyx2Lm5vcm1hbCx2LnV2KSkscC5zaGFyZWQpKSk7XG59O1xuXG5leHBvcnQgeyBDU0csIFZlcnRleCwgVmVjdG9yLCBQb2x5Z29uLCBQbGFuZSB9O1xuIl19
|
@@ -1,84 +1,2 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
var _react = _interopRequireDefault(require("react"));
|
4
|
-
|
5
|
-
var _csgLib = require("./csg-lib.js");
|
6
|
-
|
7
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
8
|
-
|
9
|
-
var gWorkersStarted = false;
|
10
|
-
var gWorker;
|
11
|
-
var gWorkerUrl;
|
12
|
-
var taskId = 0;
|
13
|
-
var tasks = {};
|
14
|
-
|
15
|
-
var spawnWorker = function spawnWorker() {
|
16
|
-
var worker = new Worker(gWorkerUrl);
|
17
|
-
|
18
|
-
worker.onmessage = function (e) {
|
19
|
-
var rslt = JSON.parse(e.data);
|
20
|
-
var task = tasks[rslt.taskId];
|
21
|
-
delete tasks[rslt.taskId];
|
22
|
-
task.resolve(_csgLib.CSG.fromJSON(rslt.result)); //console.log('Message received from worker');
|
23
|
-
|
24
|
-
gWorker.busy = false;
|
25
|
-
};
|
26
|
-
|
27
|
-
return gWorker = {
|
28
|
-
worker: worker,
|
29
|
-
busy: false
|
30
|
-
};
|
31
|
-
};
|
32
|
-
|
33
|
-
var getWorker = function getWorker() {
|
34
|
-
if (!gWorkersStarted) {
|
35
|
-
gWorkersStarted = true;
|
36
|
-
return fetch('../csg-lib.js').then(function (response) {
|
37
|
-
return response.text().then(function (text) {
|
38
|
-
text = text.slice(0, text.lastIndexOf('export'));
|
39
|
-
var code = text + "\n self.onmessage=(message)=>{\n let task = JSON.parse(message.data)\n //console.log(\"Got task:\"+task.op+' '+task.taskId)\n postMessage(JSON.stringify({\n taskId:task.taskId,\n result : CSG.fromJSON(task.a)[task.op](CSG.fromJSON(task.b))\n }))\n }\n console.log('CSG worker started!')";
|
40
|
-
var blob = new Blob([code], {
|
41
|
-
type: 'application/javascript'
|
42
|
-
});
|
43
|
-
gWorkerUrl = URL.createObjectURL(blob);
|
44
|
-
}).then(function () {
|
45
|
-
return spawnWorker();
|
46
|
-
});
|
47
|
-
});
|
48
|
-
}
|
49
|
-
|
50
|
-
if (gWorker && !gWorker.busy) {
|
51
|
-
gWorker.busy = true;
|
52
|
-
return {
|
53
|
-
then: function then(fn) {
|
54
|
-
return fn(gWorker);
|
55
|
-
}
|
56
|
-
};
|
57
|
-
}
|
58
|
-
|
59
|
-
return {
|
60
|
-
then: function then() {
|
61
|
-
return this;
|
62
|
-
}
|
63
|
-
};
|
64
|
-
};
|
65
|
-
|
66
|
-
_csgLib.CSG.doAsync = function (a, op, b) {
|
67
|
-
return getWorker().then(function (worker) {
|
68
|
-
var task = {
|
69
|
-
a: a,
|
70
|
-
op: op,
|
71
|
-
b: b,
|
72
|
-
taskId: taskId
|
73
|
-
};
|
74
|
-
tasks[taskId] = task;
|
75
|
-
taskId++;
|
76
|
-
task.result = new Promise(function (resolve, reject) {
|
77
|
-
task.resolve = resolve; //console.log("posting to worker:")
|
78
|
-
|
79
|
-
worker.busy = true;
|
80
|
-
worker.worker.postMessage(JSON.stringify(task));
|
81
|
-
});
|
82
|
-
return task.result;
|
83
|
-
});
|
84
|
-
};
|
1
|
+
"use strict";var _react=_interopRequireDefault(require("react")),_csgLib=require("./csg-lib.js");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}var gWorker,gWorkerUrl,gWorkersStarted=!1,taskId=0,tasks={},spawnWorker=function(){var e=new Worker(gWorkerUrl);return e.onmessage=function(e){var e=JSON.parse(e.data),r=tasks[e.taskId];delete tasks[e.taskId],r.resolve(_csgLib.CSG.fromJSON(e.result)),gWorker.busy=!1},gWorker={worker:e,busy:!1}},getWorker=function(){return gWorkersStarted?gWorker&&!gWorker.busy?(gWorker.busy=!0,{then:function(e){return e(gWorker)}}):{then:function(){return this}}:(gWorkersStarted=!0,fetch("../csg-lib.js").then(function(e){return e.text().then(function(e){e=e.slice(0,e.lastIndexOf("export"));e=new Blob([e+"\n self.onmessage=(message)=>{\n let task = JSON.parse(message.data)\n //console.log(\"Got task:\"+task.op+' '+task.taskId)\n postMessage(JSON.stringify({\n taskId:task.taskId,\n result : CSG.fromJSON(task.a)[task.op](CSG.fromJSON(task.b))\n }))\n }\n console.log('CSG worker started!')"],{type:"application/javascript"});gWorkerUrl=URL.createObjectURL(e)}).then(function(){return spawnWorker()})}))};_csgLib.CSG.doAsync=function(e,r,n){return getWorker().then(function(t){var s={a:e,op:r,b:n,taskId:taskId};return tasks[taskId]=s,taskId++,s.result=new Promise(function(e,r){s.resolve=e,t.busy=!0,t.worker.postMessage(JSON.stringify(s))}),s.result})};
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL2NzZy9jc2ctd29ya2VyLmpzIl0sIm5hbWVzIjpbIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NzZ0xpYiIsImdXb3JrZXIiLCJnV29ya2VyVXJsIiwiZ1dvcmtlcnNTdGFydGVkIiwidGFza0lkIiwiV29ya2VyIiwidGFza3MiLCJvbm1lc3NhZ2UiLCJlIiwicnNsdCIsIkpTT04iLCJwYXJzZSIsImRhdGEiLCJzcGF3bldvcmtlciIsInRhc2siLCJyZXNvbHZlIiwiQ1NHIiwiZnJvbUpTT04iLCJyZXN1bHQiLCJidXN5IiwiZm4iLCJ0aGVuIiwidGhpcyIsInJlc3BvbnNlIiwid29ya2VyIiwidGV4dCIsInNsaWNlIiwibGFzdEluZGV4T2YiLCJibG9iIiwiY29kZSIsIkJsb2IiLCJ0eXBlIiwiY3JlYXRlT2JqZWN0VVJMIiwiZG9Bc3luYyIsImEiLCJvcCIsImIiLCJnZXRXb3JrZXIiLCJQcm9taXNlIiwicmVqZWN0IiwicG9zdE1lc3NhZ2UiLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiJhQUFBLElBQUFBLE9BQUFDLHVCQUFBQyxRQUFBLFVBQ0FDLFFBQUFELFFBQUEsZ0Isd0VBRUEsSUFGQUUsUUFJSUMsV0FGQUMsaUJBQWtCLEVBSWxCQyxPQUFTLEVBSlRELE1BQUFBLEdBQ0FGLFlBQUosV0FDSUMsSUFBQUEsRUFBSixJQUFBRyxPQUFBSCxZQVVPLE9BUEhJLEVBQUtDLFVBQVQsU0FBQUMsR0FLTyxJQUFJQyxFQUFPQyxLQUFLQyxNQUFNSCxFQUFFSSxNQUozQkMsRUFBWVAsTUFBQUcsRUFBWkksZUFDWVAsTUFBT0QsRUFBSkQsUUFNWlUsRUFBS0MsUUFBUUMsUUFBQUEsSUFBSUMsU0FBU1IsRUFBS1MsU0FIL0JqQixRQUFXUyxNQUFLQyxHQUVUTCxRQUFVLENBQUNGLE9BQUFBLEVBQWxCZSxNQUFBLElBR0FsQixVQUFRa0IsV0FOWCxPQUFBaEIsZ0JBdUNJRixVQUFlQSxRQUFma0IsTUFFQWxCLFFBQU9rQixNQUFBLEVBQW9CQyxDQUFBQSxLQUFHbkIsU0FBQUEsR0FBVixPQUFBbUIsRUFBQW5CLFlBQXBCLENBQ0hvQixLQUFBLFdBQUEsT0FBQUMsUUE3QkduQixpQkFBa0IsRUFMZkYsTUFBVSxpQkFBQW9CLEtBQUEsU0FBQUUsR0FBQ0MsT0FBREQsRUFBQUUsT0FBQUosS0FBQSxTQUFBSSxHQUFhQSxFQUFBQSxFQUFBQyxNQUFBLEVBQUFELEVBQUFFLFlBQUEsV0FtQkxDLEVBQVVDLElBQURDLEtBQU8sQ0FuQnpDTCxFQUFBLDZjQW1CeUMsQ0FDbkJNLEtBQUEsMkJBRVY3QixXQUFpQjhCLElBQUFBLGdCQUFqQkosS0FmSlAsS0FBQSxXQURKLE9BQUFSLG9CQWtDUkcsUUFBQUEsSUFBSWlCLFFBSm9CLFNBQU9DLEVBQUFDLEVBQVBDLEdBQWEsT0FBQUMsWUFBQWhCLEtBQUEsU0FBQUcsR0FEakMsSUFBQVYsRUFBQSxDQUFBb0IsRUFBQUEsRUFBQUMsR0FBQUEsRUFBQUMsRUFBQUEsRUFBQWhDLE9BQUFBLFFBT3FCQSxPQXZDekJFLE1BQUFGLFFBQUFVLEVBeUNRVixTQUpSWSxFQUFJaUIsT0FBUSxJQUFBSyxRQUFBLFNBQUdILEVBQU9JLEdBQ1hGLEVBQUFBLFFBQWlCdEIsRUFDWFMsRUFBQUwsTUFBQSxFQUFBSyxFQUFBQSxPQUFBZ0IsWUFBQTlCLEtBQUErQixVQUFBM0IsTUFBUVYsRUFBQUEiLCJmaWxlIjoidXRpbHMvY3NnL2NzZy13b3JrZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ1NHIH0gZnJvbSAnLi9jc2ctbGliLmpzJztcblxubGV0IGdXb3JrZXJzU3RhcnRlZCA9IGZhbHNlO1xubGV0IGdXb3JrZXI7XG5sZXQgZ1dvcmtlclVybDtcblxubGV0IHRhc2tJZCA9IDA7XG5sZXQgdGFza3M9e307XG5sZXQgc3Bhd25Xb3JrZXI9KCk9PntcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKGdXb3JrZXJVcmwpO1xuXG4gICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICBsZXQgcnNsdCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICBsZXQgdGFzayA9IHRhc2tzW3JzbHQudGFza0lkXTtcbiAgICAgICBkZWxldGUgdGFza3NbcnNsdC50YXNrSWRdO1xuICAgICAgIHRhc2sucmVzb2x2ZShDU0cuZnJvbUpTT04ocnNsdC5yZXN1bHQpKTtcbiAgICAgICAvL2NvbnNvbGUubG9nKCdNZXNzYWdlIHJlY2VpdmVkIGZyb20gd29ya2VyJyk7XG4gICAgICAgZ1dvcmtlci5idXN5ID0gZmFsc2U7XG4gICAgfTtcbiAgICByZXR1cm4gZ1dvcmtlciA9IHt3b3JrZXIsYnVzeTpmYWxzZX07XG59O1xuXG5sZXQgZ2V0V29ya2VyPSgpPT57XG4gICAgaWYoIWdXb3JrZXJzU3RhcnRlZCl7XG4gICAgICAgIGdXb3JrZXJzU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBmZXRjaCgnLi4vY3NnLWxpYi5qcycpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCkudGhlbihmdW5jdGlvbih0ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgdGV4dC5sYXN0SW5kZXhPZignZXhwb3J0JykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0ZXh0ICsgYFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm9ubWVzc2FnZT0obWVzc2FnZSk9PntcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhc2sgPSBKU09OLnBhcnNlKG1lc3NhZ2UuZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkdvdCB0YXNrOlwiK3Rhc2sub3ArJyAnK3Rhc2sudGFza0lkKVxuICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrSWQ6dGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgOiBDU0cuZnJvbUpTT04odGFzay5hKVt0YXNrLm9wXShDU0cuZnJvbUpTT04odGFzay5iKSlcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDU0cgd29ya2VyIHN0YXJ0ZWQhJylgO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY29kZV0se1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBnV29ya2VyVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuXG4gICAgICAgICAgICB9KS50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwYXduV29ya2VyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmKGdXb3JrZXIgJiYgKCFnV29ya2VyLmJ1c3kpKXtcbiAgICAgICAgZ1dvcmtlci5idXN5ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4ge3RoZW46KGZuKT0+e3JldHVybiBmbihnV29ya2VyKTt9fTtcbiAgICB9XG4gICAgcmV0dXJue1xuICAgICAgICB0aGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fVxuICAgIH07XG59O1xuXG5DU0cuZG9Bc3luYz0oYSxvcCxiKT0+e1xuICAgIHJldHVybiBnZXRXb3JrZXIoKS50aGVuKCh3b3JrZXIpPT57XG4gICAgICAgIGxldCB0YXNrPXthLG9wLGIsdGFza0lkfTtcbiAgICAgICAgdGFza3NbdGFza0lkXT10YXNrO1xuICAgICAgICB0YXNrSWQrKztcbiAgICAgICAgdGFzay5yZXN1bHQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57XG4gICAgICAgICAgICB0YXNrLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInBvc3RpbmcgdG8gd29ya2VyOlwiKVxuICAgICAgICAgICAgd29ya2VyLmJ1c3kgPSB0cnVlO1xuICAgICAgICAgICAgd29ya2VyLndvcmtlci5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeSh0YXNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGFzay5yZXN1bHQ7ICAgICAgICBcbiAgICB9KTtcbn07XG4iXX0=
|