Commit f6971834 authored by suhuiguang's avatar suhuiguang

1.20200716北京演示解决问题,marker选中不了

parent 9b7432a9
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -48596,16 +48596,16 @@ var _slicedToArray = function() { ...@@ -48596,16 +48596,16 @@ var _slicedToArray = function() {
var r = [], var r = [],
o = !0, o = !0,
n = !1, n = !1,
i = void 0; a = void 0;
try { try {
for (var a, l = e[Symbol.iterator](); !(o = (a = l.next()).done) && (r.push(a.value), !t || r.length !== t); o = !0); for (var i, l = e[Symbol.iterator](); !(o = (i = l.next()).done) && (r.push(i.value), !t || r.length !== t); o = !0);
} catch (e) { } catch (e) {
n = !0, i = e n = !0, a = e
} finally { } finally {
try { try {
!o && l.return && l.return() !o && l.return && l.return()
} finally { } finally {
if (n) throw i if (n) throw a
} }
} }
return r return r
...@@ -48774,9 +48774,9 @@ var _slicedToArray = function() { ...@@ -48774,9 +48774,9 @@ var _slicedToArray = function() {
var r = e.x, var r = e.x,
o = void 0 === r ? 0 : r, o = void 0 === r ? 0 : r,
n = e.y, n = e.y,
i = void 0 === n ? 0 : n, a = void 0 === n ? 0 : n,
a = e.z; i = e.z;
return [o, i, void 0 === a ? 0 : a] return [o, a, void 0 === i ? 0 : i]
} }
if (_tools2.default.isString(e)) { if (_tools2.default.isString(e)) {
for (var l = e.split(/,| /), s = 0; s < l.length; s++) { for (var l = e.split(/,| /), s = 0; s < l.length; s++) {
...@@ -48799,10 +48799,10 @@ var _slicedToArray = function() { ...@@ -48799,10 +48799,10 @@ var _slicedToArray = function() {
} }
if (_tools2.default.isObject(e)) { if (_tools2.default.isObject(e)) {
var n = e.x, var n = e.x,
i = void 0 === n ? 0 : n, a = void 0 === n ? 0 : n,
a = e.y, i = e.y,
l = void 0 === a ? 0 : a; l = void 0 === i ? 0 : i;
return new THREE.Vector2(i, l) return new THREE.Vector2(a, l)
} }
if (_tools2.default.isString(e)) { if (_tools2.default.isString(e)) {
for (var s = e.split(/,| /), u = 0; u < s.length; u++) { for (var s = e.split(/,| /), u = 0; u < s.length; u++) {
...@@ -48825,13 +48825,13 @@ var _slicedToArray = function() { ...@@ -48825,13 +48825,13 @@ var _slicedToArray = function() {
return new THREE.Vector3(r, o, n) return new THREE.Vector3(r, o, n)
} }
if (_tools2.default.isObject(e)) { if (_tools2.default.isObject(e)) {
var i = e.x, var a = e.x,
a = void 0 === i ? 0 : i, i = void 0 === a ? 0 : a,
l = e.y, l = e.y,
s = void 0 === l ? 0 : l, s = void 0 === l ? 0 : l,
u = e.z, u = e.z,
c = void 0 === u ? 0 : u; c = void 0 === u ? 0 : u;
return new THREE.Vector3(a, s, c) return new THREE.Vector3(i, s, c)
} }
if (_tools2.default.isString(e)) { if (_tools2.default.isString(e)) {
for (var f = e.split(/,| /), d = 0; d < f.length; d++) { for (var f = e.split(/,| /), d = 0; d < f.length; d++) {
...@@ -48853,10 +48853,10 @@ var _slicedToArray = function() { ...@@ -48853,10 +48853,10 @@ var _slicedToArray = function() {
var r = e.x, var r = e.x,
o = void 0 === r ? 1 : r, o = void 0 === r ? 1 : r,
n = e.y, n = e.y,
i = void 0 === n ? 1 : n, a = void 0 === n ? 1 : n,
a = e.z, i = e.z,
l = void 0 === a ? 1 : a; l = void 0 === i ? 1 : i;
return new THREE.Vector3(o, i, l) return new THREE.Vector3(o, a, l)
} }
return R3DTools.parseVector3(e, t) return R3DTools.parseVector3(e, t)
} }
...@@ -48877,15 +48877,15 @@ var _slicedToArray = function() { ...@@ -48877,15 +48877,15 @@ var _slicedToArray = function() {
return n.setFromQuaternion(e), n return n.setFromQuaternion(e), n
} }
if (_tools2.default.isObject(e)) { if (_tools2.default.isObject(e)) {
var i = e.x, var a = e.x,
a = void 0 === i ? 0 : i, i = void 0 === a ? 0 : a,
l = e.y, l = e.y,
s = void 0 === l ? 0 : l, s = void 0 === l ? 0 : l,
u = e.z, u = e.z,
c = void 0 === u ? 0 : u, c = void 0 === u ? 0 : u,
f = e.order, f = e.order,
d = void 0 === f ? "XYZ" : f; d = void 0 === f ? "XYZ" : f;
return new THREE.Euler(a, s, c, d) return new THREE.Euler(i, s, c, d)
} }
if (_tools2.default.isString(e)) { if (_tools2.default.isString(e)) {
for (var h = e.split(/,| /), p = 0; p < h.length; p++) { for (var h = e.split(/,| /), p = 0; p < h.length; p++) {
...@@ -48930,11 +48930,11 @@ var _slicedToArray = function() { ...@@ -48930,11 +48930,11 @@ var _slicedToArray = function() {
var r = _slicedToArray(e, 3), var r = _slicedToArray(e, 3),
o = r[0], o = r[0],
n = void 0 === o ? 0 : o, n = void 0 === o ? 0 : o,
i = r[1], a = r[1],
a = void 0 === i ? 0 : i, i = void 0 === a ? 0 : a,
l = r[2], l = r[2],
s = void 0 === l ? 0 : l; s = void 0 === l ? 0 : l;
return n > 1 && (n /= 255), a > 1 && (a /= 255), s > 1 && (s /= 255), new THREE.Color(n, a, s) return n > 1 && (n /= 255), i > 1 && (i /= 255), s > 1 && (s /= 255), new THREE.Color(n, i, s)
} }
if (_tools2.default.isObject(e)) { if (_tools2.default.isObject(e)) {
var u = e.x, var u = e.x,
...@@ -48987,11 +48987,11 @@ var _slicedToArray = function() { ...@@ -48987,11 +48987,11 @@ var _slicedToArray = function() {
var r = e || {}, var r = e || {},
o = r.width, o = r.width,
n = void 0 === o ? 1 : o, n = void 0 === o ? 1 : o,
i = r.height, a = r.height,
a = void 0 === i ? 1 : i, i = void 0 === a ? 1 : a,
l = r.size; l = r.size;
// 修正大小值 // 修正大小值
l ? _tools2.default.isNumber(l) && (t = [l, l]) : t = [n, a] l ? _tools2.default.isNumber(l) && (t = [l, l]) : t = [n, i]
} else t = [1, 1]; } else t = [1, 1];
return t return t
}, },
...@@ -49280,10 +49280,10 @@ var _slicedToArray = function() { ...@@ -49280,10 +49280,10 @@ var _slicedToArray = function() {
* @param {Number} spaceY * @param {Number} spaceY
*/ */
helixPoints: function() { helixPoints: function() {
for (var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : -250, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 520, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 10, o = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 15, n = [], i = 0, a = e; i <= t; i += r, a += o) { for (var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : -250, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 520, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 10, o = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 15, n = [], a = 0, i = e; a <= t; a += r, i += o) {
var l = Math.cos(2 * i * Math.PI / 360) * t, var l = Math.cos(2 * a * Math.PI / 360) * t,
s = Math.sin(2 * i * Math.PI / 360) * t; s = Math.sin(2 * a * Math.PI / 360) * t;
n.push([l, a, s]) n.push([l, i, s])
} }
return n return n
}, },
...@@ -49296,8 +49296,8 @@ var _slicedToArray = function() { ...@@ -49296,8 +49296,8 @@ var _slicedToArray = function() {
circlePoints: function() { circlePoints: function() {
for (var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 100, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 10, r = (arguments.length > 2 && void 0 !== arguments[2] && arguments[2], []), o = 0; o <= 360; o += t) { for (var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 100, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 10, r = (arguments.length > 2 && void 0 !== arguments[2] && arguments[2], []), o = 0; o <= 360; o += t) {
var n = Math.cos(2 * o * Math.PI / 360) * e, var n = Math.cos(2 * o * Math.PI / 360) * e,
i = Math.sin(2 * o * Math.PI / 360) * e; a = Math.sin(2 * o * Math.PI / 360) * e;
r.push([n, 0, i]) r.push([n, 0, a])
} }
return r return r
}, },
...@@ -49313,19 +49313,19 @@ var _slicedToArray = function() { ...@@ -49313,19 +49313,19 @@ var _slicedToArray = function() {
r = (arguments.length > 2 && void 0 !== arguments[2] && arguments[2], this.parseNumber3(e)), r = (arguments.length > 2 && void 0 !== arguments[2] && arguments[2], this.parseNumber3(e)),
o = _slicedToArray(r, 3), o = _slicedToArray(r, 3),
n = o[0], n = o[0],
i = o[1], a = o[1],
a = o[2], i = o[2],
l = this.parseNumber3(t), l = this.parseNumber3(t),
s = _slicedToArray(l, 3), s = _slicedToArray(l, 3),
u = s[0], u = s[0],
c = s[1], c = s[1],
f = s[2]; f = s[2];
return [ return [
[n, i, a], [n, a, i],
[u, i, a], [u, a, i],
[u, c, f], [u, c, f],
[n, i, f], [n, a, f],
[n, i, a] [n, a, i]
] ]
}, },
/** /**
...@@ -49347,8 +49347,8 @@ var _slicedToArray = function() { ...@@ -49347,8 +49347,8 @@ var _slicedToArray = function() {
], r = 2, o = 0; o < e; o++) { ], r = 2, o = 0; o < e; o++) {
var n = t[t.length - 1]; var n = t[t.length - 1];
r = this.getRandomType(r); r = this.getRandomType(r);
var i = (2 * Math.random() + 1) * (Math.random() > .5 ? 1 : -1); var a = (2 * Math.random() + 1) * (Math.random() > .5 ? 1 : -1);
t.push([0 === r ? n[0] + i : n[0], 1 === r ? n[1] + i : n[1], 2 === r ? n[2] + i : n[2]]) t.push([0 === r ? n[0] + a : n[0], 1 === r ? n[1] + a : n[1], 2 === r ? n[2] + a : n[2]])
} }
return t return t
}, },
...@@ -49368,17 +49368,17 @@ var _slicedToArray = function() { ...@@ -49368,17 +49368,17 @@ var _slicedToArray = function() {
// 计算向量夹角 // 计算向量夹角
var o = 270 * e.angleTo(t) / Math.PI / 10 || 0, var o = 270 * e.angleTo(t) / Math.PI / 10 || 0,
n = 50 * o, n = 50 * o,
i = o * o * 120, a = o * o * 120,
a = new THREE.Vector3(0, 0, 0), i = new THREE.Vector3(0, 0, 0),
l = new THREE.Ray(a, l = new THREE.Ray(i,
// 计算v1,v2 的中点 // 计算v1,v2 的中点
function(e, t) { function(e, t) {
return e.add(t).divideScalar(2) return e.add(t).divideScalar(2)
}(e.clone(), t.clone())), }(e.clone(), t.clone())),
s = new THREE.Vector3, s = new THREE.Vector3,
u = l.at(1, s).distanceTo(a), u = l.at(1, s).distanceTo(i),
c = new THREE.Vector3, c = new THREE.Vector3,
f = l.at(i / u, c), f = l.at(a / u, c),
d = r(e.clone(), f, n), d = r(e.clone(), f, n),
h = r(t.clone(), f, n); h = r(t.clone(), f, n);
return new THREE.CubicBezierCurve3(e, d, h, t) return new THREE.CubicBezierCurve3(e, d, h, t)
...@@ -49415,9 +49415,9 @@ var _slicedToArray = function() { ...@@ -49415,9 +49415,9 @@ var _slicedToArray = function() {
*/ */
getPoiScale: function(e, t, r, o) { getPoiScale: function(e, t, r, o) {
var n = e || o.target, var n = e || o.target,
i = r.position.distanceTo(n), a = r.position.distanceTo(n),
a = Math.tan(r.fov / 2 * THREE.Math.DEG2RAD) * i, i = Math.tan(r.fov / 2 * THREE.Math.DEG2RAD) * a,
l = 2 * a / window.innerHeight; l = 2 * i / window.innerHeight;
return [t.w * l, t.h * l, 1] return [t.w * l, t.h * l, 1]
}, },
/** /**
...@@ -49429,21 +49429,21 @@ var _slicedToArray = function() { ...@@ -49429,21 +49429,21 @@ var _slicedToArray = function() {
unprojectPan: function(e, t, r) { unprojectPan: function(e, t, r) {
var o = r.domElement === document ? r.domElement.body : r.domElement, var o = r.domElement === document ? r.domElement.body : r.domElement,
n = new THREE.Vector3(0, 0, 0).setFromMatrixColumn(r.object.matrix, 0), n = new THREE.Vector3(0, 0, 0).setFromMatrixColumn(r.object.matrix, 0),
i = new THREE.Vector3(0, 0, 0).setFromMatrixColumn(r.object.matrix, 1), a = new THREE.Vector3(0, 0, 0).setFromMatrixColumn(r.object.matrix, 1),
a = e.dot(n), i = e.dot(n),
l = e.dot(i), l = e.dot(a),
s = e.clone(); s = e.clone();
if (s.sub(n.multiplyScalar(a)), l = s.length(), r.object instanceof THREE.PerspectiveCamera) { if (s.sub(n.multiplyScalar(i)), l = s.length(), r.object instanceof THREE.PerspectiveCamera) {
// perspective // perspective
var u = r.object.position, var u = r.object.position,
c = new THREE.Vector3(0, 0, 0); c = new THREE.Vector3(0, 0, 0);
c.copy(u).sub(r.target); c.copy(u).sub(r.target);
var f = c.length(); var f = c.length();
f *= Math.tan(r.object.fov / 2 * Math.PI / 180); f *= Math.tan(r.object.fov / 2 * Math.PI / 180);
return [a * o.clientHeight / (2 * f), l * o.clientHeight / (2 * f) * (t ? -1 : 1)] return [i * o.clientHeight / (2 * f), l * o.clientHeight / (2 * f) * (t ? -1 : 1)]
} }
if (r.object instanceof THREE.OrthographicCamera) { if (r.object instanceof THREE.OrthographicCamera) {
return [a * o.clientWidth * r.object.zoom / (r.object.right - r.object.left), l * o.clientHeight * r.object.zoom / (r.object.top - r.object.bottom)] return [i * o.clientWidth * r.object.zoom / (r.object.right - r.object.left), l * o.clientHeight * r.object.zoom / (r.object.top - r.object.bottom)]
} }
// camera neither orthographic nor perspective // camera neither orthographic nor perspective
console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.") console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.")
...@@ -49458,15 +49458,15 @@ var _slicedToArray = function() { ...@@ -49458,15 +49458,15 @@ var _slicedToArray = function() {
var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 1, var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 1,
o = this.parseVector3(e), o = this.parseVector3(e),
n = this.parseVector3(t), n = this.parseVector3(t),
i = Math.abs(n.x - o.x), a = Math.abs(n.x - o.x),
a = Math.abs(n.z - o.z); i = Math.abs(n.z - o.z);
i < 1 && (i = 1), a < 1 && (a = 1); a < 1 && (a = 1), i < 1 && (i = 1);
// 计算间隔 // 计算间隔
var l = Math.sqrt(i * a / r); var l = Math.sqrt(a * i / r);
l = Math.floor(100 * l) / 100; l = Math.floor(100 * l) / 100;
// 计算循环最大次数 // 计算循环最大次数
var s = Math.floor(i / l), var s = Math.floor(a / l),
u = Math.floor(a / l), u = Math.floor(i / l),
c = [], c = [],
f = [o.x, o.y, o.z], f = [o.x, o.y, o.z],
d = [n.x, n.y, n.z]; d = [n.x, n.y, n.z];
...@@ -49487,11 +49487,11 @@ var _slicedToArray = function() { ...@@ -49487,11 +49487,11 @@ var _slicedToArray = function() {
* @param {Array<THREE.Vector3>} poly * @param {Array<THREE.Vector3>} poly
*/ */
pointInPolygon: function(e, t) { pointInPolygon: function(e, t) {
for (var r = e.x, o = e.z, n = !1, i = 0, a = t.length - 1; i < t.length; a = i++) { for (var r = e.x, o = e.z, n = !1, a = 0, i = t.length - 1; a < t.length; i = a++) {
var l = t[i].x, var l = t[a].x,
s = t[i].z, s = t[a].z,
u = t[a].x, u = t[i].x,
c = t[a].z; c = t[i].z;
s > o != c > o && r < (u - l) * (o - s) / (c - s) + l && (n = !n) s > o != c > o && r < (u - l) * (o - s) / (c - s) + l && (n = !n)
} }
return n return n
...@@ -49522,10 +49522,10 @@ var _slicedToArray = function() { ...@@ -49522,10 +49522,10 @@ var _slicedToArray = function() {
return [r + "posx.jpg", r + "negx.jpg", r + "posy.jpg", r + "negy.jpg", r + "posz.jpg", r + "negz.jpg"] return [r + "posx.jpg", r + "negx.jpg", r + "posy.jpg", r + "negy.jpg", r + "posz.jpg", r + "negz.jpg"]
} }
if (e) { if (e) {
for (var o = ["posx", "negx", "posy", "negy", "posz", "negz"], n = [], i = 0; i < o.length; i++) { for (var o = ["posx", "negx", "posy", "negy", "posz", "negz"], n = [], a = 0; a < o.length; a++) {
var a = o[i], var i = o[a],
l = e[a]; l = e[i];
if (!l) return console.error("set sky box failed, due to '" + a + "' key is missing"), null; if (!l) return console.error("set sky box failed, due to '" + i + "' key is missing"), null;
n.push(l) n.push(l)
} }
return n return n
...@@ -49553,13 +49553,69 @@ var _slicedToArray = function() { ...@@ -49553,13 +49553,69 @@ var _slicedToArray = function() {
else if (t.width && t.height) { else if (t.width && t.height) {
var n = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"); var n = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
n.width = t.width, n.height = t.height; n.width = t.width, n.height = t.height;
var i = n.getContext("2d"); var a = n.getContext("2d");
i.drawImage(t, 0, 0, t.width, t.height); a.drawImage(t, 0, 0, t.width, t.height);
var a = n.toDataURL(); var i = n.toDataURL();
a = a.replace("image/png", "image/octet-stream"), this.saveFile(e, a) i = i.replace("image/png", "image/octet-stream"), this.saveFile(e, i)
} else r.href = t; } else r.href = t;
r.click(), document.body.removeChild(r) r.click(), document.body.removeChild(r)
} }
},
/**
* 忽略深度检测 material.depthTest=false,此时优先级最高,将在最外层
* 检测object的 material,如果:
* 1. material 是数组,只要数组中任何一个 mat.depthTest 为 false 则整体为 false
* 2. material 是单个 mat,直接判断 material.depthTest
* @param {THREE.Object3D} node
* @return {Boolean} 是否检测深度, true 则需要检测
*/
checkMaterialDepth: function(e) {
var t = e.material;
if (!t) return !1;
// 默认检测深度
var r = !0;
if (_tools2.default.isArray(t))
// 只要数组中只要有一个 mat.depthTest 为 false 则整体为 false,代表不检测深度
for (var o = 0, n = t.length; o < n; o++) {
var a = t[o];
if (a && !a.depthTest) {
r = !1;
break
}
} else r = t.depthTest;
return r
},
/**
* 检测材质的可见性, 只要 visible 为 false,则为false,此时无需判断 opacity
* 当材质为数组时,所有的材质均满足 visible=false 或 opacity=0 时,才不可见
* 当为单材质时,material.visible=false 或 material.opacity=0 表示不可见
*
* opacity 的检测,只有在 material.transparent 为true的时候,才有效
* @param {THREE.Object3D} node
* @return {Boolean} 材质是否可见, true: 可见,false 不可见
*/
checkMaterialVisible: function(e) {
var t = e.material;
// 无材质
if (!t) return !1;
return _tools2.default.isArray(t) ? t.some(function(e) {
var t = !1;
return e && (t = !!e.visible && (!e.transparent || e.opacity > 0)), t
}) : !!t.visible && (!t.transparent || t.opacity > 0)
},
/**
* 纹理启用特效
* @param {THREE.Material | Array<THREE.Material>} material
*/
useMaterialEffects: function(e) {
var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 16;
e && (this.isArray(e) ? e.forEach(function(r) {
r.needsUpdate = !0,
// 设置纹理各向异性 最低效果
e.map && (e.map.anisotropy = t, e.map.version > 0 && (e.map.needsUpdate = !0))
}) : (e.needsUpdate = !0,
// 设置纹理各向异性 最低效果
e.map && (e.map.anisotropy = t, e.map.version > 0 && (e.map.needsUpdate = !0))))
} }
}); });
exports.default = R3DTools, module.exports = exports.default; exports.default = R3DTools, module.exports = exports.default;
...@@ -49875,6 +49931,25 @@ var _extends = Object.assign || function(e) { ...@@ -49875,6 +49931,25 @@ var _extends = Object.assign || function(e) {
return e return e
}, },
/** /**
* 转码url 中的 name,如果 name 中包含 +、空格、?、%、#、&、= 特殊符号,则需要进行转码,否则将会被解析为 url 内容
*
* @param {string} url
* @return {string} new url
* @example
* encodeUrl('http://localhost:3000/a/b/cc#rr.jpg'); // http://localhost:3000/a/b/cc%23rr.jpg
*/
encodeName: function(e) {
if (e) {
var r = e.lastIndexOf("/");
if (r > -1) {
var t = e.substr(0, r + 1),
n = e.substr(r + 1);
return t + this.encodeUrl(n)
}
}
return e
},
/**
* 给定的key 是否存在于对象中,如果 keys 是数组,只要有一个 key 存在,即返回true * 给定的key 是否存在于对象中,如果 keys 是数组,只要有一个 key 存在,即返回true
* 如果给定的 obj 不存在,即返回 false * 如果给定的 obj 不存在,即返回 false
* @param {Object} obj * @param {Object} obj
...@@ -59,7 +59,7 @@ const defaultConfig = simpleConfig(config); ...@@ -59,7 +59,7 @@ const defaultConfig = simpleConfig(config);
defaultConfig.plugins.push( defaultConfig.plugins.push(
new HtmlInlineCodePlugin([ new HtmlInlineCodePlugin([
{ inject: 'body', begin: true, tag: 'script', attr: { src: '/extra/convertor3d/graphmod.js' } }, { inject: 'body', begin: true, tag: 'script', attr: { src: '/extra/convertor3d/graphmod.js' } },
{ inject: 'body', begin: false, tag: 'script', attr: { src: '/extra/convertor3d/worker.b4c7202d2c49d6cbf2a3.js' } } { inject: 'body', begin: false, tag: 'script', attr: { src: '/extra/convertor3d/worker.e1906a3436c9762655d1.js' } }
]) ])
); );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment